mirror of
https://github.com/mozilla/pdf.js.git
synced 2026-08-04 05:17:24 +02:00
Compare commits
545 Commits
| Author | SHA1 | Date | |
|---|---|---|---|
|
|
b4ba666b0c | ||
|
|
4c4e8feafd | ||
|
|
f21fe34747 | ||
|
|
ba7bf7b26c | ||
|
|
1da36fb6bf | ||
|
|
92d027eaeb | ||
|
|
5375bff642 | ||
|
|
b1f51818ae | ||
|
|
ae976b924b | ||
|
|
ec691130e6 | ||
|
|
88716313d6 | ||
|
|
82624a5e50 | ||
|
|
7590ad5312 | ||
|
|
923d48ead4 | ||
|
|
1f9fbc764e | ||
|
|
f7f30dd844 | ||
|
|
d2ebbd10de | ||
|
|
09ad726a3f | ||
|
|
d0779c411e | ||
|
|
89852881b8 | ||
|
|
eb8f6af8cc | ||
|
|
f73978083d | ||
|
|
5dc1d0c5d5 | ||
|
|
2475c4ec91 | ||
|
|
08f6769390 | ||
|
|
7862875438 | ||
|
|
cba911df86 | ||
|
|
cec8d2eed6 | ||
|
|
491792f0e2 | ||
|
|
664526ee65 | ||
|
|
7fc7072f9c | ||
|
|
bb1a948397 | ||
|
|
4b4c784a85 | ||
|
|
0f999e27b5 | ||
|
|
af38789499 | ||
|
|
0d5df9d96e | ||
|
|
8960eddfc1 | ||
|
|
ee59db5018 | ||
|
|
ce4ff55faa | ||
|
|
40f6492997 | ||
|
|
613e004b2e | ||
|
|
734b21e61e | ||
|
|
b4d028132b | ||
|
|
a80897dc9a | ||
|
|
0163438e1a | ||
|
|
f70f55d743 | ||
|
|
9e02ceed09 | ||
|
|
803c9d7d21 | ||
|
|
73707b62e9 | ||
|
|
1813ab0774 | ||
|
|
aa812b531a | ||
|
|
61acf93172 | ||
|
|
822d3ea809 | ||
|
|
3a19a20d50 | ||
|
|
4d9007e6f9 | ||
|
|
7f5fd4eba4 | ||
|
|
0365cbde02 | ||
|
|
f704f2ef02 | ||
|
|
01ba4c476d | ||
|
|
0299cdcab9 | ||
|
|
8c3e1014f4 | ||
|
|
14afb8669f | ||
|
|
14fc73bf05 | ||
|
|
257f4c2a5e | ||
|
|
93958e4ff6 | ||
|
|
bc6b5b0f44 | ||
|
|
ac51b29777 | ||
|
|
3736000aee | ||
|
|
8d1afad39b | ||
|
|
c9eaf13ae4 | ||
|
|
1ce8e8a320 | ||
|
|
f38e8b659e | ||
|
|
4b924df453 | ||
|
|
2f873ef13a | ||
|
|
4a11934d1e | ||
|
|
31d49e18de | ||
|
|
5d93c1bdff | ||
|
|
e7acffcef3 | ||
|
|
1609bd87c5 | ||
|
|
a03ec7e8c5 | ||
|
|
63a0f285b8 | ||
|
|
5406d3159b | ||
|
|
2ea8820d92 | ||
|
|
526b69651f | ||
|
|
ce59339829 | ||
|
|
fd612d86bd | ||
|
|
a0f100c4a8 | ||
|
|
010da074af | ||
|
|
f7578565ef | ||
|
|
f38ea2d4cc | ||
|
|
1012c3e500 | ||
|
|
d246a6c495 | ||
|
|
150fbba6e0 | ||
|
|
e2d602122d | ||
|
|
62d211ee8d | ||
|
|
a97d0aa682 | ||
|
|
6963b0ef4f | ||
|
|
b75ca17e85 | ||
|
|
dd41cd487d | ||
|
|
503632a382 | ||
|
|
83844f1261 | ||
|
|
432d5c57a4 | ||
|
|
a9672298fc | ||
|
|
60340d9f28 | ||
|
|
a7b7cec2e7 | ||
|
|
1ee8705093 | ||
|
|
f195bec9b2 | ||
|
|
ac75b10be1 | ||
|
|
27cf9e24f3 | ||
|
|
05e100c76e | ||
|
|
b0f73a321a | ||
|
|
586c3095d8 | ||
|
|
be87eab392 | ||
|
|
a97939b0d7 | ||
|
|
da713dfdd0 | ||
|
|
675e9219b5 | ||
|
|
fe0b880926 | ||
|
|
01642ed10c | ||
|
|
63329559d3 | ||
|
|
47969a5953 | ||
|
|
e58091a769 | ||
|
|
890f2add63 | ||
|
|
388168a2b8 | ||
|
|
c474a97932 | ||
|
|
ed81227557 | ||
|
|
4ea07c2431 | ||
|
|
27a8002f7e | ||
|
|
6c18df5768 | ||
|
|
0c8f67059e | ||
|
|
f988c56394 | ||
|
|
1b48daa461 | ||
|
|
2bdd9e3d9c | ||
|
|
34268e38fc | ||
|
|
876ec4bd96 | ||
|
|
f0bbfa6f9e | ||
|
|
69e26ad319 | ||
|
|
cfb92313fa | ||
|
|
569bae5900 | ||
|
|
6509517da3 | ||
|
|
f97e61a7a2 | ||
|
|
028c02f539 | ||
|
|
d314788368 | ||
|
|
1a1090a0ae | ||
|
|
559ab148a9 | ||
|
|
997dabf5a9 | ||
|
|
67ed457bb8 | ||
|
|
de3eecca11 | ||
|
|
09a45ad2af | ||
|
|
d5661f801f | ||
|
|
778aa450d9 | ||
|
|
cd03276d60 | ||
|
|
547236bcd5 | ||
|
|
ee56dc7719 | ||
|
|
850020a84e | ||
|
|
50601d0341 | ||
|
|
154e82871a | ||
|
|
a3a0d5d9a0 | ||
|
|
299624a2d3 | ||
|
|
5266f13ea4 | ||
|
|
02027ba381 | ||
|
|
ee6d5f2102 | ||
|
|
e6c7ab5425 | ||
|
|
c7dc7d7dd0 | ||
|
|
eddd70a2ca | ||
|
|
d504000012 | ||
|
|
b83274803c | ||
|
|
fd77b3ea9f | ||
|
|
4f7f3baed4 | ||
|
|
8c3941a0d5 | ||
|
|
0a3ed983be | ||
|
|
be89d6475d | ||
|
|
f12c6f64ad | ||
|
|
e624336b2e | ||
|
|
6fbd2227db | ||
|
|
344736bcad | ||
|
|
b2cf8527c6 | ||
|
|
47f2b22842 | ||
|
|
922d57631b | ||
|
|
0f060e1e64 | ||
|
|
dd7e3731d1 | ||
|
|
9720182511 | ||
|
|
eb58ccc100 | ||
|
|
f554d0c9c8 | ||
|
|
9a7335d26b | ||
|
|
16290afa3b | ||
|
|
d473678201 | ||
|
|
f472cb081c | ||
|
|
6d7bca521b | ||
|
|
6e18a52b86 | ||
|
|
244fb9e822 | ||
|
|
2ea9c26d77 | ||
|
|
e909f1f64f | ||
|
|
5f09f797ab | ||
|
|
01454570a7 | ||
|
|
e39b23904c | ||
|
|
914545dea3 | ||
|
|
a3a7247366 | ||
|
|
a18b581f00 | ||
|
|
82c6046e1d | ||
|
|
c661ba1408 | ||
|
|
ff075a9c67 | ||
|
|
4c0dcff572 | ||
|
|
f62702068a | ||
|
|
2cf7d30763 | ||
|
|
d12d215302 | ||
|
|
127470d994 | ||
|
|
e5c0130b80 | ||
|
|
accfa9a162 | ||
|
|
8070e9dce1 | ||
|
|
0b613612ed | ||
|
|
dae773d74a | ||
|
|
b19cc7c746 | ||
|
|
850dccbc17 | ||
|
|
7505eeaeb4 | ||
|
|
ac25471588 | ||
|
|
125f692589 | ||
|
|
a36e5acb30 | ||
|
|
5e3272c929 | ||
|
|
e6a80f4893 | ||
|
|
ae179be764 | ||
|
|
ebaa98b854 | ||
|
|
174fd47973 | ||
|
|
cbdea64c8a | ||
|
|
abae23d6aa | ||
|
|
3435fb0da0 | ||
|
|
5b26d8d413 | ||
|
|
54af145989 | ||
|
|
612fa34760 | ||
|
|
c46720d893 | ||
|
|
199d738917 | ||
|
|
c4574a5470 | ||
|
|
bd845483ac | ||
|
|
4e43e7f1af | ||
|
|
f0822e527e | ||
|
|
8bc2fe68e5 | ||
|
|
d13c28a044 | ||
|
|
f0b5fc3b73 | ||
|
|
d29293622e | ||
|
|
0d5a7d8adc | ||
|
|
18f9aa91b6 | ||
|
|
67d591f413 | ||
|
|
6689097a0a | ||
|
|
98ccc87fdc | ||
|
|
f0818c1860 | ||
|
|
bf924ff31b | ||
|
|
f03e18f336 | ||
|
|
d008aba0b1 | ||
|
|
cde4f9a7ed | ||
|
|
a4ed5b39f4 | ||
|
|
e148b154cd | ||
|
|
0c97aa7555 | ||
|
|
c188012280 | ||
|
|
330cc4f2f4 | ||
|
|
139d5a2951 | ||
|
|
ac101f0381 | ||
|
|
d62118073b | ||
|
|
86dad16df3 | ||
|
|
4fd232a124 | ||
|
|
2bbf32d83d | ||
|
|
36835d919d | ||
|
|
cb70c93e8a | ||
|
|
c79b005db7 | ||
|
|
9c46f48f88 | ||
|
|
be90aa4f46 | ||
|
|
20e0d6de08 | ||
|
|
046e68d140 | ||
|
|
2bc64ec330 | ||
|
|
5b100c4509 | ||
|
|
cca78c1d32 | ||
|
|
32f3906960 | ||
|
|
e414f74375 | ||
|
|
70c52132af | ||
|
|
0c076f5f0b | ||
|
|
14f4cce29d | ||
|
|
0cc1718b02 | ||
|
|
ab90210aa4 | ||
|
|
44ae5b0e9a | ||
|
|
394a08f8b0 | ||
|
|
4952e4d5eb | ||
|
|
95604a3401 | ||
|
|
f373fbfa5b | ||
|
|
34629bd2cf | ||
|
|
12691fdf50 | ||
|
|
a1f1a56080 | ||
|
|
a0061817e6 | ||
|
|
6f2dcd3955 | ||
|
|
f7a4abf9a7 | ||
|
|
d5dafc3fb3 | ||
|
|
15969fbe19 | ||
|
|
0aee1d5382 | ||
|
|
d9999dcedd | ||
|
|
d66bd324fa | ||
|
|
fa207b4ce8 | ||
|
|
43c29379de | ||
|
|
9710372a1b | ||
|
|
89836b76f0 | ||
|
|
ea43bb43fb | ||
|
|
f9aacb1ba1 | ||
|
|
614349086b | ||
|
|
3a3047efc8 | ||
|
|
4d3b747a17 | ||
|
|
9d4f06129c | ||
|
|
2578f6bff6 | ||
|
|
bb9c4af462 | ||
|
|
2ce10c68d5 | ||
|
|
6b0777d55f | ||
|
|
642f4d1b7a | ||
|
|
07b1c625e1 | ||
|
|
b9609d0365 | ||
|
|
25eae30e4e | ||
|
|
649fb9c970 | ||
|
|
3ccc3ec65c | ||
|
|
d142fd2451 | ||
|
|
1651e57e61 | ||
|
|
e4846726ee | ||
|
|
f2f3a7fdce | ||
|
|
a20c46eca0 | ||
|
|
6353acefe5 | ||
|
|
b7b3a4c454 | ||
|
|
8bdd159699 | ||
|
|
195226e3a6 | ||
|
|
d8526132f5 | ||
|
|
82324408cd | ||
|
|
86ffd68c05 | ||
|
|
5d81fe5098 | ||
|
|
a1953e7c3c | ||
|
|
beb332a245 | ||
|
|
10844326c7 | ||
|
|
7f9c54a259 | ||
|
|
eee03693a0 | ||
|
|
7414f6ed5a | ||
|
|
5964e88be1 | ||
|
|
6718c2924c | ||
|
|
44e637a064 | ||
|
|
15d93e1f34 | ||
|
|
8a2c112c20 | ||
|
|
f07a106529 | ||
|
|
04eeeec4a4 | ||
|
|
078b96229d | ||
|
|
e6539f6516 | ||
|
|
7a9abfb2dc | ||
|
|
048331b09a | ||
|
|
56843f9b42 | ||
|
|
7818ab1b9d | ||
|
|
d8ea2afe47 | ||
|
|
4117b75a10 | ||
|
|
813d1949ba | ||
|
|
a1acf4fc9f | ||
|
|
9ca13c9a23 | ||
|
|
09c9f7f2fe | ||
|
|
d71fe9025d | ||
|
|
d537f5ba4b | ||
|
|
b6469341c1 | ||
|
|
7ac6dff4b7 | ||
|
|
22871eef23 | ||
|
|
7f7e63333d | ||
|
|
1ddf6449ac | ||
|
|
28a7606c14 | ||
|
|
623e6d9476 | ||
|
|
9c9b465fd2 | ||
|
|
8ebc2382e3 | ||
|
|
38daede697 | ||
|
|
86b901fcde | ||
|
|
1d8e952062 | ||
|
|
018ba66228 | ||
|
|
a911ce22e5 | ||
|
|
a46ee2b647 | ||
|
|
bd6541864b | ||
|
|
124228e318 | ||
|
|
bff30726fa | ||
|
|
34516bcec3 | ||
|
|
bade1f3190 | ||
|
|
00e1aabe93 | ||
|
|
dfa673290b | ||
|
|
59df671552 | ||
|
|
87361aa094 | ||
|
|
786019eb0d | ||
|
|
e20c810dd4 | ||
|
|
07d4c1018a | ||
|
|
e74be44919 | ||
|
|
b4b0a3fa04 | ||
|
|
a443a635a1 | ||
|
|
3956ac1b39 | ||
|
|
9d9fb06d7f | ||
|
|
187c22126a | ||
|
|
ece1e2ed0c | ||
|
|
2ed018ec2d | ||
|
|
eae42379f2 | ||
|
|
d28030f838 | ||
|
|
cbefb334fd | ||
|
|
5432642250 | ||
|
|
f0dc2166ab | ||
|
|
9ed97a859f | ||
|
|
8bc13d502b | ||
|
|
36eae2c978 | ||
|
|
bc99fc0678 | ||
|
|
fdeed2af5e | ||
|
|
082ad21387 | ||
|
|
6cdd3c19fd | ||
|
|
6c0ad865c6 | ||
|
|
7f7b38b424 | ||
|
|
7d3ec9da1e | ||
|
|
67e6ff0090 | ||
|
|
2550b91be9 | ||
|
|
d9e4cc5f65 | ||
|
|
f781ac33da | ||
|
|
3a09329113 | ||
|
|
0ea67ed96f | ||
|
|
92bd2dbb38 | ||
|
|
26b4206d87 | ||
|
|
6bfefa53da | ||
|
|
66c22b1fc5 | ||
|
|
8560125056 | ||
|
|
ed1b2f91be | ||
|
|
bfcafbc004 | ||
|
|
2dc73ad2a7 | ||
|
|
feec28583d | ||
|
|
1373aa4a48 | ||
|
|
e1c930adfe | ||
|
|
d305b542df | ||
|
|
86a18bd5fe | ||
|
|
68a5ec1403 | ||
|
|
827ddf6e09 | ||
|
|
01948aff23 | ||
|
|
c88f0bba04 | ||
|
|
55c8516944 | ||
|
|
e75a7cfd62 | ||
|
|
5f8f6b1e40 | ||
|
|
ec1e94423b | ||
|
|
5873e1cbc0 | ||
|
|
ffa7ac7a91 | ||
|
|
ca34359e1f | ||
|
|
35d275d3b1 | ||
|
|
4781194b37 | ||
|
|
069b757998 | ||
|
|
131d6b7d38 | ||
|
|
63db4bb777 | ||
|
|
53d0856ee9 | ||
|
|
3b628d59fb | ||
|
|
2466a76ba4 | ||
|
|
587abf0ef4 | ||
|
|
f3f5acc418 | ||
|
|
ac64bcfa2b | ||
|
|
d1926fb179 | ||
|
|
a543d0a2e0 | ||
|
|
ce08a803c4 | ||
|
|
a13f2aa793 | ||
|
|
fe5eb0f779 | ||
|
|
5ca6026d80 | ||
|
|
cb53dbecb9 | ||
|
|
c541d24ac3 | ||
|
|
29ad297626 | ||
|
|
8a80f1b8b7 | ||
|
|
7f5b42140d | ||
|
|
9e5cbcef50 | ||
|
|
cf8677154b | ||
|
|
3602db7456 | ||
|
|
5140371ebe | ||
|
|
380c4c8139 | ||
|
|
ea139e7df1 | ||
|
|
473b53fe3c | ||
|
|
ea4fe68c01 | ||
|
|
ecd43bc8e1 | ||
|
|
879437247b | ||
|
|
f93faae01c | ||
|
|
7b54ec0a8d | ||
|
|
fadd201c09 | ||
|
|
5f83408099 | ||
|
|
52a44a68be | ||
|
|
7a7e4fd382 | ||
|
|
82098f175b | ||
|
|
ff88446d01 | ||
|
|
4a01dd669a | ||
|
|
4112c2953b | ||
|
|
984fcd4bae | ||
|
|
9c0b56ac07 | ||
|
|
f86b5abb05 | ||
|
|
b8ad7c8d0f | ||
|
|
d9eea18876 | ||
|
|
bfc33678da | ||
|
|
43dd2781a0 | ||
|
|
0eca809589 | ||
|
|
f12c463452 | ||
|
|
81f15c3437 | ||
|
|
f4d6b4ef85 | ||
|
|
0b3b101dbc | ||
|
|
a5333f2a92 | ||
|
|
ae30748956 | ||
|
|
2348365874 | ||
|
|
08b704d4b1 | ||
|
|
a7d32f4518 | ||
|
|
9c437e6ab4 | ||
|
|
4ed78beb38 | ||
|
|
e34e11cf78 | ||
|
|
c8fb1be7b6 | ||
|
|
9ab6b743ea | ||
|
|
173e083c71 | ||
|
|
88c52a1523 | ||
|
|
959ce38f5b | ||
|
|
a66782615e | ||
|
|
091f459d2e | ||
|
|
23ea0810d9 | ||
|
|
b9e3a6b5d0 | ||
|
|
7f15bd6591 | ||
|
|
dc3696f23c | ||
|
|
0cc139fdfc | ||
|
|
d619ff3207 | ||
|
|
f45a1b4df5 | ||
|
|
dc602ae543 | ||
|
|
d36d3ab893 | ||
|
|
e4a3e91444 | ||
|
|
936a472f05 | ||
|
|
9071f451a5 | ||
|
|
890edc9265 | ||
|
|
b168293c17 | ||
|
|
4db9e45b8c | ||
|
|
5907d87774 | ||
|
|
836a08084e | ||
|
|
1a7821ab13 | ||
|
|
19046a6949 | ||
|
|
e9a946ec0b | ||
|
|
744c1e6d7a | ||
|
|
e9ee61f67c | ||
|
|
27b345a61e | ||
|
|
a8cf37f6bc | ||
|
|
b43ef1c746 | ||
|
|
065ea625dd | ||
|
|
4e6b7be4d7 | ||
|
|
69e8d6900f | ||
|
|
a6321e7201 | ||
|
|
5fbab91f71 | ||
|
|
94fdea15f4 | ||
|
|
04237100a5 | ||
|
|
345089de1f | ||
|
|
add30f3ca0 | ||
|
|
06439a95c3 | ||
|
|
327822c21f | ||
|
|
af2380060a | ||
|
|
0e1660700a | ||
|
|
5d28cf5e88 | ||
|
|
eef4ea620e | ||
|
|
145feeaa3f | ||
|
|
6701ccd86b | ||
|
|
ce45d5a443 | ||
|
|
8e6e35473f |
31
.gitattributes
vendored
31
.gitattributes
vendored
@ -1,23 +1,24 @@
|
||||
# Force Unix line endings for most file formats (except binary files)
|
||||
*.js text eol=lf
|
||||
*.jsm text eol=lf
|
||||
*.css text eol=lf
|
||||
*.html text eol=lf
|
||||
*.md text eol=lf
|
||||
*.ftl text eol=lf
|
||||
*.yml text eol=lf
|
||||
*.json text eol=lf
|
||||
*.config text eol=lf
|
||||
*.inc text eol=lf
|
||||
*.manifest text eol=lf
|
||||
*.rdf text eol=lf
|
||||
*.jade text eol=lf
|
||||
*.coffee text eol=lf
|
||||
*.css text eol=lf
|
||||
*.example text eol=lf
|
||||
*.ftl text eol=lf
|
||||
*.html text eol=lf
|
||||
*.js text eol=lf
|
||||
*.json text eol=lf
|
||||
*.link text eol=lf
|
||||
*.md text eol=lf
|
||||
*.mjs text eol=lf
|
||||
*.mts text eol=lf
|
||||
*.njk text eol=lf
|
||||
*.py text eol=lf
|
||||
*.svg text eol=lf
|
||||
*.ts text eol=lf
|
||||
*.txt text eol=lf
|
||||
*.yml text eol=lf
|
||||
|
||||
# PDF files shall not modify CRLF line endings
|
||||
*.pdf -crlf
|
||||
|
||||
# Linguist language overrides
|
||||
*.js linguist-language=JavaScript
|
||||
*.jsm linguist-language=JavaScript
|
||||
*.inc linguist-language=XML
|
||||
|
||||
8
.github/fluent_linter_requirements.txt
vendored
8
.github/fluent_linter_requirements.txt
vendored
@ -1 +1,7 @@
|
||||
moz-fluent-linter==0.4.*
|
||||
# The requirements below can be regenerated with the following one-liner:
|
||||
# `python3 -m venv venv; source venv/bin/activate; pip install -q moz-fluent-linter; pip freeze; deactivate; rm -rf venv`
|
||||
fluent.syntax==0.19.0
|
||||
moz-fluent-linter==0.4.10
|
||||
PyYAML==6.0.3
|
||||
six==1.17.0
|
||||
typing_extensions==4.16.0
|
||||
|
||||
4
.github/font_tests_requirements.txt
vendored
4
.github/font_tests_requirements.txt
vendored
@ -1 +1,3 @@
|
||||
fonttools==4.*
|
||||
# The requirements below can be regenerated with the following one-liner:
|
||||
# `python3 -m venv venv; source venv/bin/activate; pip install -q fonttools; pip freeze; deactivate; rm -rf venv`
|
||||
fonttools==4.63.0
|
||||
|
||||
10
.github/workflows/ci.yml
vendored
10
.github/workflows/ci.yml
vendored
@ -16,13 +16,13 @@ jobs:
|
||||
|
||||
steps:
|
||||
- name: Checkout repository
|
||||
uses: actions/checkout@de0fac2e4500dabe0009e67214ff5f5447ce83dd # v6.0.2
|
||||
uses: actions/checkout@3d3c42e5aac5ba805825da76410c181273ba90b1 # v7.0.1
|
||||
with:
|
||||
fetch-depth: 0
|
||||
persist-credentials: false
|
||||
|
||||
- name: Use Node.js ${{ matrix.node-version }}
|
||||
uses: actions/setup-node@48b55a011bda9f5d6aeb4c2d9c7362e8dae4041e # v6.4.0
|
||||
uses: actions/setup-node@820762786026740c76f36085b0efc47a31fe5020 # v7.0.0
|
||||
with:
|
||||
node-version: ${{ matrix.node-version }}
|
||||
cache: 'npm'
|
||||
@ -31,7 +31,7 @@ jobs:
|
||||
run: npm ci
|
||||
|
||||
- name: Restore cached PDF files
|
||||
uses: actions/cache/restore@27d5ce7f107fe9357f9df03efb73ab90386fccae # v5.0.5
|
||||
uses: actions/cache/restore@55cc8345863c7cc4c66a329aec7e433d2d1c52a9 # v6.1.0
|
||||
with:
|
||||
path: test/pdfs/*.pdf
|
||||
key: cached-pdf-files-${{ hashFiles('test/pdfs/*.pdf') }}
|
||||
@ -46,14 +46,14 @@ jobs:
|
||||
run: npx gulp unittestcli --coverage --coverage-output build/coverage/unitcli
|
||||
|
||||
- name: Save cached PDF files
|
||||
uses: actions/cache/save@27d5ce7f107fe9357f9df03efb73ab90386fccae # v5.0.5
|
||||
uses: actions/cache/save@55cc8345863c7cc4c66a329aec7e433d2d1c52a9 # v6.1.0
|
||||
with:
|
||||
path: test/pdfs/*.pdf
|
||||
key: cached-pdf-files-${{ hashFiles('test/pdfs/*.pdf') }}
|
||||
enableCrossOsArchive: true
|
||||
|
||||
- name: Upload results to Codecov
|
||||
uses: codecov/codecov-action@e79a6962e0d4c0c17b229090214935d2e33f8354 # v6.0.1
|
||||
uses: codecov/codecov-action@fb8b3582c8e4def4969c97caa2f19720cb33a72f # v7.0.0
|
||||
with:
|
||||
token: ${{ secrets.CODECOV_TOKEN }}
|
||||
fail_ci_if_error: true
|
||||
|
||||
8
.github/workflows/codeql.yml
vendored
8
.github/workflows/codeql.yml
vendored
@ -18,19 +18,19 @@ jobs:
|
||||
|
||||
steps:
|
||||
- name: Checkout repository
|
||||
uses: actions/checkout@de0fac2e4500dabe0009e67214ff5f5447ce83dd # v6.0.2
|
||||
uses: actions/checkout@3d3c42e5aac5ba805825da76410c181273ba90b1 # v7.0.1
|
||||
with:
|
||||
fetch-depth: 0
|
||||
persist-credentials: false
|
||||
|
||||
- name: Initialize CodeQL
|
||||
uses: github/codeql-action/init@9e0d7b8d25671d64c341c19c0152d693099fb5ba # v4.35.5
|
||||
uses: github/codeql-action/init@e0647621c2984b5ed2f768cb892365bf2a616ad1 # v4.37.2
|
||||
with:
|
||||
languages: ${{ matrix.language }}
|
||||
queries: security-and-quality
|
||||
|
||||
- name: Autobuild CodeQL
|
||||
uses: github/codeql-action/autobuild@9e0d7b8d25671d64c341c19c0152d693099fb5ba # v4.35.5
|
||||
uses: github/codeql-action/autobuild@e0647621c2984b5ed2f768cb892365bf2a616ad1 # v4.37.2
|
||||
|
||||
- name: Perform CodeQL analysis
|
||||
uses: github/codeql-action/analyze@9e0d7b8d25671d64c341c19c0152d693099fb5ba # v4.35.5
|
||||
uses: github/codeql-action/analyze@e0647621c2984b5ed2f768cb892365bf2a616ad1 # v4.37.2
|
||||
|
||||
101
.github/workflows/coverage_browser_tests.yml
vendored
Normal file
101
.github/workflows/coverage_browser_tests.yml
vendored
Normal file
@ -0,0 +1,101 @@
|
||||
name: Coverage (Browser tests)
|
||||
on:
|
||||
push:
|
||||
paths:
|
||||
- 'gulpfile.mjs'
|
||||
- 'external/**'
|
||||
- 'package-lock.json'
|
||||
- 'src/**'
|
||||
- 'test/images/**'
|
||||
- 'test/pdfs/**'
|
||||
- 'test/resources/**'
|
||||
- 'test/*.css'
|
||||
- 'test/driver.js'
|
||||
- 'test/test.mjs'
|
||||
- 'test/test_manifest.json'
|
||||
- 'test/test_slave.html'
|
||||
- 'web/**'
|
||||
- '.github/workflows/coverage_browser_tests.yml'
|
||||
branches:
|
||||
- master
|
||||
pull_request:
|
||||
paths:
|
||||
- 'gulpfile.mjs'
|
||||
- 'external/**'
|
||||
- 'package-lock.json'
|
||||
- 'src/**'
|
||||
- 'test/images/**'
|
||||
- 'test/pdfs/**'
|
||||
- 'test/resources/**'
|
||||
- 'test/*.css'
|
||||
- 'test/driver.js'
|
||||
- 'test/test.mjs'
|
||||
- 'test/test_manifest.json'
|
||||
- 'test/test_slave.html'
|
||||
- 'web/**'
|
||||
- '.github/workflows/coverage_browser_tests.yml'
|
||||
branches:
|
||||
- master
|
||||
workflow_dispatch:
|
||||
permissions:
|
||||
contents: read
|
||||
|
||||
jobs:
|
||||
test:
|
||||
name: ${{ matrix.os }} / firefox
|
||||
|
||||
strategy:
|
||||
fail-fast: false
|
||||
matrix:
|
||||
node-version: [lts/*]
|
||||
os: [ubuntu-latest]
|
||||
|
||||
runs-on: ${{ matrix.os }}
|
||||
environment: code-coverage
|
||||
|
||||
steps:
|
||||
- name: Checkout repository
|
||||
uses: actions/checkout@3d3c42e5aac5ba805825da76410c181273ba90b1 # v7.0.1
|
||||
with:
|
||||
fetch-depth: 0
|
||||
persist-credentials: false
|
||||
|
||||
- name: Use Node.js ${{ matrix.node-version }}
|
||||
uses: actions/setup-node@820762786026740c76f36085b0efc47a31fe5020 # v7.0.0
|
||||
with:
|
||||
node-version: ${{ matrix.node-version }}
|
||||
cache: 'npm'
|
||||
|
||||
- name: Install dependencies
|
||||
run: npm ci
|
||||
|
||||
- name: Restore cached PDF files
|
||||
uses: actions/cache/restore@55cc8345863c7cc4c66a329aec7e433d2d1c52a9 # v6.1.0
|
||||
with:
|
||||
path: test/pdfs/*.pdf
|
||||
key: cached-pdf-files-${{ hashFiles('test/pdfs/*.pdf') }}
|
||||
restore-keys: |
|
||||
cached-pdf-files-
|
||||
enableCrossOsArchive: true
|
||||
|
||||
- name: Run browser tests with code coverage
|
||||
run: npx gulp botbrowsertest --headless -j$(nproc) --coverage --coverage-output build/coverage/browser --noChrome
|
||||
|
||||
- name: Save cached PDF files
|
||||
uses: actions/cache/save@55cc8345863c7cc4c66a329aec7e433d2d1c52a9 # v6.1.0
|
||||
with:
|
||||
path: test/pdfs/*.pdf
|
||||
key: cached-pdf-files-${{ hashFiles('test/pdfs/*.pdf') }}
|
||||
enableCrossOsArchive: true
|
||||
|
||||
- name: Upload results to Codecov
|
||||
uses: codecov/codecov-action@fb8b3582c8e4def4969c97caa2f19720cb33a72f # v7.0.0
|
||||
with:
|
||||
token: ${{ secrets.CODECOV_TOKEN }}
|
||||
fail_ci_if_error: true
|
||||
files: ./build/coverage/browser/lcov.info
|
||||
flags: browsertest
|
||||
name: codecov-umbrella
|
||||
disable_search: true
|
||||
disable_telem: true
|
||||
verbose: true
|
||||
6
.github/workflows/fluent_linter.yml
vendored
6
.github/workflows/fluent_linter.yml
vendored
@ -4,6 +4,7 @@ on:
|
||||
paths:
|
||||
- 'l10n/en-US/**.ftl'
|
||||
- '.github/fluent_linter_config.yml'
|
||||
- '.github/fluent_linter_requirements.txt'
|
||||
- '.github/workflows/fluent_linter.yml'
|
||||
branches:
|
||||
- master
|
||||
@ -11,6 +12,7 @@ on:
|
||||
paths:
|
||||
- 'l10n/en-US/**.ftl'
|
||||
- '.github/fluent_linter_config.yml'
|
||||
- '.github/fluent_linter_requirements.txt'
|
||||
- '.github/workflows/fluent_linter.yml'
|
||||
branches:
|
||||
- master
|
||||
@ -25,12 +27,12 @@ jobs:
|
||||
|
||||
steps:
|
||||
- name: Checkout repository
|
||||
uses: actions/checkout@de0fac2e4500dabe0009e67214ff5f5447ce83dd # v6.0.2
|
||||
uses: actions/checkout@3d3c42e5aac5ba805825da76410c181273ba90b1 # v7.0.1
|
||||
with:
|
||||
persist-credentials: false
|
||||
|
||||
- name: Use Python 3.14
|
||||
uses: actions/setup-python@a309ff8b426b58ec0e2a45f0f869d46889d02405 # v6.2.0
|
||||
uses: actions/setup-python@5fda3b95a4ea91299a34e894583c3862153e4b97 # v7.0.0
|
||||
with:
|
||||
python-version: '3.14'
|
||||
cache: 'pip'
|
||||
|
||||
14
.github/workflows/font_tests.yml
vendored
14
.github/workflows/font_tests.yml
vendored
@ -3,18 +3,24 @@ on:
|
||||
push:
|
||||
paths:
|
||||
- 'gulpfile.mjs'
|
||||
- 'external/**'
|
||||
- 'package-lock.json'
|
||||
- 'src/**'
|
||||
- 'test/test.mjs'
|
||||
- 'test/font/**'
|
||||
- '.github/font_tests_requirements.txt'
|
||||
- '.github/workflows/font_tests.yml'
|
||||
branches:
|
||||
- master
|
||||
pull_request:
|
||||
paths:
|
||||
- 'gulpfile.mjs'
|
||||
- 'external/**'
|
||||
- 'package-lock.json'
|
||||
- 'src/**'
|
||||
- 'test/test.mjs'
|
||||
- 'test/font/**'
|
||||
- '.github/font_tests_requirements.txt'
|
||||
- '.github/workflows/font_tests.yml'
|
||||
branches:
|
||||
- master
|
||||
@ -43,13 +49,13 @@ jobs:
|
||||
|
||||
steps:
|
||||
- name: Checkout repository
|
||||
uses: actions/checkout@de0fac2e4500dabe0009e67214ff5f5447ce83dd # v6.0.2
|
||||
uses: actions/checkout@3d3c42e5aac5ba805825da76410c181273ba90b1 # v7.0.1
|
||||
with:
|
||||
fetch-depth: 0
|
||||
persist-credentials: false
|
||||
|
||||
- name: Use Node.js ${{ matrix.node-version }}
|
||||
uses: actions/setup-node@48b55a011bda9f5d6aeb4c2d9c7362e8dae4041e # v6.4.0
|
||||
uses: actions/setup-node@820762786026740c76f36085b0efc47a31fe5020 # v7.0.0
|
||||
with:
|
||||
node-version: ${{ matrix.node-version }}
|
||||
cache: 'npm'
|
||||
@ -58,7 +64,7 @@ jobs:
|
||||
run: npm ci
|
||||
|
||||
- name: Use Python 3.14
|
||||
uses: actions/setup-python@a309ff8b426b58ec0e2a45f0f869d46889d02405 # v6.0.2
|
||||
uses: actions/setup-python@5fda3b95a4ea91299a34e894583c3862153e4b97 # v7.0.0
|
||||
with:
|
||||
python-version: '3.14'
|
||||
cache: 'pip'
|
||||
@ -71,7 +77,7 @@ jobs:
|
||||
run: npx gulp fonttest --headless --coverage --coverage-output build/coverage/font ${{ matrix.skip }}
|
||||
|
||||
- name: Upload results to Codecov
|
||||
uses: codecov/codecov-action@e79a6962e0d4c0c17b229090214935d2e33f8354 # v6.0.1
|
||||
uses: codecov/codecov-action@fb8b3582c8e4def4969c97caa2f19720cb33a72f # v7.0.0
|
||||
with:
|
||||
token: ${{ secrets.CODECOV_TOKEN }}
|
||||
fail_ci_if_error: true
|
||||
|
||||
16
.github/workflows/integration_tests.yml
vendored
16
.github/workflows/integration_tests.yml
vendored
@ -3,7 +3,8 @@ on:
|
||||
push:
|
||||
paths:
|
||||
- 'gulpfile.mjs'
|
||||
- 'external/builder/**'
|
||||
- 'external/**'
|
||||
- 'package-lock.json'
|
||||
- 'src/**'
|
||||
- 'test/test.mjs'
|
||||
- 'test/integration/**'
|
||||
@ -14,7 +15,8 @@ on:
|
||||
pull_request:
|
||||
paths:
|
||||
- 'gulpfile.mjs'
|
||||
- 'external/builder/**'
|
||||
- 'external/**'
|
||||
- 'package-lock.json'
|
||||
- 'src/**'
|
||||
- 'test/test.mjs'
|
||||
- 'test/integration/**'
|
||||
@ -47,13 +49,13 @@ jobs:
|
||||
|
||||
steps:
|
||||
- name: Checkout repository
|
||||
uses: actions/checkout@de0fac2e4500dabe0009e67214ff5f5447ce83dd # v6.0.2
|
||||
uses: actions/checkout@3d3c42e5aac5ba805825da76410c181273ba90b1 # v7.0.1
|
||||
with:
|
||||
fetch-depth: 0
|
||||
persist-credentials: false
|
||||
|
||||
- name: Use Node.js ${{ matrix.node-version }}
|
||||
uses: actions/setup-node@48b55a011bda9f5d6aeb4c2d9c7362e8dae4041e # v6.4.0
|
||||
uses: actions/setup-node@820762786026740c76f36085b0efc47a31fe5020 # v7.0.0
|
||||
with:
|
||||
node-version: ${{ matrix.node-version }}
|
||||
cache: 'npm'
|
||||
@ -62,7 +64,7 @@ jobs:
|
||||
run: npm ci
|
||||
|
||||
- name: Restore cached PDF files
|
||||
uses: actions/cache/restore@27d5ce7f107fe9357f9df03efb73ab90386fccae # v5.0.5
|
||||
uses: actions/cache/restore@55cc8345863c7cc4c66a329aec7e433d2d1c52a9 # v6.1.0
|
||||
with:
|
||||
path: test/pdfs/*.pdf
|
||||
key: cached-pdf-files-${{ hashFiles('test/pdfs/*.pdf') }}
|
||||
@ -87,14 +89,14 @@ jobs:
|
||||
run: xvfb-run -a --server-args="-screen 0, 1920x1080x24" npx gulp integrationtest --coverage --coverage-output build/coverage/integration ${{ matrix.skip }}
|
||||
|
||||
- name: Save cached PDF files
|
||||
uses: actions/cache/save@27d5ce7f107fe9357f9df03efb73ab90386fccae # v5.0.5
|
||||
uses: actions/cache/save@55cc8345863c7cc4c66a329aec7e433d2d1c52a9 # v6.1.0
|
||||
with:
|
||||
path: test/pdfs/*.pdf
|
||||
key: cached-pdf-files-${{ hashFiles('test/pdfs/*.pdf') }}
|
||||
enableCrossOsArchive: true
|
||||
|
||||
- name: Upload results to Codecov
|
||||
uses: codecov/codecov-action@e79a6962e0d4c0c17b229090214935d2e33f8354 # v6.0.1
|
||||
uses: codecov/codecov-action@fb8b3582c8e4def4969c97caa2f19720cb33a72f # v7.0.0
|
||||
with:
|
||||
token: ${{ secrets.CODECOV_TOKEN }}
|
||||
fail_ci_if_error: true
|
||||
|
||||
4
.github/workflows/lint.yml
vendored
4
.github/workflows/lint.yml
vendored
@ -15,13 +15,13 @@ jobs:
|
||||
|
||||
steps:
|
||||
- name: Checkout repository
|
||||
uses: actions/checkout@de0fac2e4500dabe0009e67214ff5f5447ce83dd # v6.0.2
|
||||
uses: actions/checkout@3d3c42e5aac5ba805825da76410c181273ba90b1 # v7.0.1
|
||||
with:
|
||||
fetch-depth: 0
|
||||
persist-credentials: false
|
||||
|
||||
- name: Use Node.js ${{ matrix.node-version }}
|
||||
uses: actions/setup-node@48b55a011bda9f5d6aeb4c2d9c7362e8dae4041e # v6.4.0
|
||||
uses: actions/setup-node@820762786026740c76f36085b0efc47a31fe5020 # v7.0.0
|
||||
with:
|
||||
node-version: ${{ matrix.node-version }}
|
||||
cache: 'npm'
|
||||
|
||||
2
.github/workflows/notify-pdf-sync.yml
vendored
2
.github/workflows/notify-pdf-sync.yml
vendored
@ -16,7 +16,7 @@ jobs:
|
||||
|
||||
steps:
|
||||
- name: Checkout repository
|
||||
uses: actions/checkout@de0fac2e4500dabe0009e67214ff5f5447ce83dd # v6.0.2
|
||||
uses: actions/checkout@3d3c42e5aac5ba805825da76410c181273ba90b1 # v7.0.1
|
||||
with:
|
||||
fetch-depth: 1
|
||||
persist-credentials: false
|
||||
|
||||
4
.github/workflows/prefs_tests.yml
vendored
4
.github/workflows/prefs_tests.yml
vendored
@ -15,13 +15,13 @@ jobs:
|
||||
|
||||
steps:
|
||||
- name: Checkout repository
|
||||
uses: actions/checkout@de0fac2e4500dabe0009e67214ff5f5447ce83dd # v6.0.2
|
||||
uses: actions/checkout@3d3c42e5aac5ba805825da76410c181273ba90b1 # v7.0.1
|
||||
with:
|
||||
fetch-depth: 0
|
||||
persist-credentials: false
|
||||
|
||||
- name: Use Node.js ${{ matrix.node-version }}
|
||||
uses: actions/setup-node@48b55a011bda9f5d6aeb4c2d9c7362e8dae4041e # v6.4.0
|
||||
uses: actions/setup-node@820762786026740c76f36085b0efc47a31fe5020 # v7.0.0
|
||||
with:
|
||||
node-version: ${{ matrix.node-version }}
|
||||
cache: 'npm'
|
||||
|
||||
185
.github/workflows/publish_coverage_index.yml
vendored
Normal file
185
.github/workflows/publish_coverage_index.yml
vendored
Normal file
@ -0,0 +1,185 @@
|
||||
name: Publish per-test coverage index
|
||||
# Builds the per-test coverage index (which ref test exercises which source
|
||||
# line/function) and publishes it to the gh-pages branch of mozilla/pdf.js.refs,
|
||||
# where it's served at:
|
||||
# https://mozilla.github.io/pdf.js.refs/per-test-index.json
|
||||
# The index can then be queried with `npx gulp coverage_search`.
|
||||
#
|
||||
# This only runs when something is merged into master (push event); the build is
|
||||
# heavy (a full browser test run), so it's deliberately kept off pull requests.
|
||||
on:
|
||||
push:
|
||||
paths:
|
||||
- 'gulpfile.mjs'
|
||||
- 'external/**'
|
||||
- 'package-lock.json'
|
||||
- 'src/**'
|
||||
- 'test/images/**'
|
||||
- 'test/pdfs/**'
|
||||
- 'test/resources/**'
|
||||
- 'test/*.css'
|
||||
- 'test/driver.js'
|
||||
- 'test/test.mjs'
|
||||
- 'test/test_manifest.json'
|
||||
- 'test/test_slave.html'
|
||||
- 'web/**'
|
||||
- '.github/workflows/publish_coverage_index.yml'
|
||||
branches:
|
||||
- master
|
||||
workflow_dispatch:
|
||||
concurrency:
|
||||
group: publish-coverage-index-${{ github.ref }}
|
||||
cancel-in-progress: true
|
||||
permissions:
|
||||
contents: read
|
||||
|
||||
jobs:
|
||||
publish:
|
||||
if: github.ref == 'refs/heads/master'
|
||||
|
||||
runs-on: ubuntu-latest
|
||||
environment: sync_pdfs
|
||||
|
||||
strategy:
|
||||
matrix:
|
||||
node-version: [lts/*]
|
||||
|
||||
steps:
|
||||
- name: Checkout repository
|
||||
uses: actions/checkout@3d3c42e5aac5ba805825da76410c181273ba90b1 # v7.0.1
|
||||
with:
|
||||
fetch-depth: 1
|
||||
persist-credentials: false
|
||||
|
||||
- name: Use Node.js ${{ matrix.node-version }}
|
||||
uses: actions/setup-node@820762786026740c76f36085b0efc47a31fe5020 # v7.0.0
|
||||
with:
|
||||
node-version: ${{ matrix.node-version }}
|
||||
cache: 'npm'
|
||||
|
||||
- name: Install dependencies
|
||||
run: npm ci
|
||||
|
||||
- name: Restore cached PDF files
|
||||
uses: actions/cache/restore@55cc8345863c7cc4c66a329aec7e433d2d1c52a9 # v6.1.0
|
||||
with:
|
||||
path: test/pdfs/*.pdf
|
||||
key: cached-pdf-files-${{ hashFiles('test/pdfs/*.pdf') }}
|
||||
restore-keys: |
|
||||
cached-pdf-files-
|
||||
enableCrossOsArchive: true
|
||||
|
||||
- name: Build the per-test coverage index
|
||||
run: npx gulp botbrowsertest --headless -j$(nproc) --coverage-per-test --coverage-output build/coverage/browser --noChrome
|
||||
|
||||
- name: Save cached PDF files
|
||||
uses: actions/cache/save@55cc8345863c7cc4c66a329aec7e433d2d1c52a9 # v6.1.0
|
||||
with:
|
||||
path: test/pdfs/*.pdf
|
||||
key: cached-pdf-files-${{ hashFiles('test/pdfs/*.pdf') }}
|
||||
enableCrossOsArchive: true
|
||||
|
||||
- name: Check current master
|
||||
id: current-master
|
||||
run: |
|
||||
set -euo pipefail
|
||||
git fetch --no-tags --depth=1 origin master:refs/remotes/origin/master
|
||||
current_master="$(git rev-parse refs/remotes/origin/master)"
|
||||
if [ "$GITHUB_SHA" = "$current_master" ]; then
|
||||
echo "current=true" >> "$GITHUB_OUTPUT"
|
||||
else
|
||||
echo "::notice::Skipping publish because ${GITHUB_SHA} is no longer origin/master (${current_master})"
|
||||
echo "current=false" >> "$GITHUB_OUTPUT"
|
||||
fi
|
||||
|
||||
- name: Generate app token for pdf.js.refs
|
||||
if: steps.current-master.outputs.current == 'true'
|
||||
id: refs-token
|
||||
uses: actions/create-github-app-token@bcd2ba49218906704ab6c1aa796996da409d3eb1 # v3.2.0
|
||||
with:
|
||||
client-id: ${{ secrets.CLIENT_ID }}
|
||||
private-key: ${{ secrets.APP_PRIVATE_KEY }}
|
||||
owner: mozilla
|
||||
repositories: pdf.js.refs
|
||||
# Least privilege: the token only needs to push to gh-pages.
|
||||
permission-contents: write
|
||||
|
||||
- name: Publish per-test coverage index
|
||||
if: steps.current-master.outputs.current == 'true'
|
||||
env:
|
||||
GH_TOKEN: ${{ steps.refs-token.outputs.token }}
|
||||
INDEX_FILE: build/coverage/browser/per-test-index.json
|
||||
run: |
|
||||
set -euo pipefail
|
||||
if [ ! -f "$INDEX_FILE" ]; then
|
||||
# A successful per-test run always writes the index; test.mjs only
|
||||
# skips it when no per-test coverage was collected at all, so a
|
||||
# missing file here means a broken build, not "nothing to publish".
|
||||
echo "::error::Per-test coverage index not found at $INDEX_FILE"
|
||||
exit 1
|
||||
fi
|
||||
repo_url="https://github.com/mozilla/pdf.js.refs.git"
|
||||
# Authenticate with a short-lived header rather than embedding the
|
||||
# token in the remote URL, so it never persists in .git/config.
|
||||
auth_header="Authorization: basic $(printf 'x-access-token:%s' "$GH_TOKEN" | base64 | tr -d '\n')"
|
||||
git_refs() { git -c http.extraheader="$auth_header" "$@"; }
|
||||
stage_index() {
|
||||
cp "$GITHUB_WORKSPACE/$INDEX_FILE" per-test-index.json
|
||||
git add per-test-index.json
|
||||
}
|
||||
commit_index() {
|
||||
git \
|
||||
-c user.name="github-actions[bot]" \
|
||||
-c user.email="41898282+github-actions[bot]@users.noreply.github.com" \
|
||||
commit -q -m "Update per-test coverage index for ${GITHUB_SHA}"
|
||||
}
|
||||
work="$(mktemp -d)"
|
||||
# Does gh-pages already exist? Probe explicitly so a transient network
|
||||
# error isn't mistaken for "first run" (the orphan path below discards
|
||||
# whatever else the branch holds).
|
||||
ls_status=0
|
||||
git_refs ls-remote --exit-code --heads "$repo_url" gh-pages >/dev/null 2>&1 || ls_status=$?
|
||||
case "$ls_status" in
|
||||
0)
|
||||
# Reuse gh-pages, keeping any other files it holds.
|
||||
git_refs clone --depth=1 --branch gh-pages "$repo_url" "$work"
|
||||
cd "$work"
|
||||
;;
|
||||
2)
|
||||
# First run: start a fresh orphan branch without cloning history.
|
||||
git init -q "$work"
|
||||
cd "$work"
|
||||
git remote add origin "$repo_url"
|
||||
git checkout -q --orphan gh-pages
|
||||
;;
|
||||
*)
|
||||
echo "::error::Could not query gh-pages on pdf.js.refs (git ls-remote exit ${ls_status})"
|
||||
exit 1
|
||||
;;
|
||||
esac
|
||||
stage_index
|
||||
if git diff --cached --quiet; then
|
||||
echo "No changes to publish"
|
||||
exit 0
|
||||
fi
|
||||
commit_index
|
||||
# Retry against a concurrent update to gh-pages: re-sync onto the new
|
||||
# tip, re-apply our index (latest build wins), and push again.
|
||||
for attempt in 1 2 3; do
|
||||
if git_refs push origin gh-pages; then
|
||||
exit 0
|
||||
fi
|
||||
if [ "$attempt" -eq 3 ]; then
|
||||
echo "::error::Failed to push the per-test coverage index after ${attempt} attempts"
|
||||
exit 1
|
||||
fi
|
||||
echo "gh-pages advanced during the run; re-syncing and retrying (attempt ${attempt})"
|
||||
git_refs fetch --depth=1 origin gh-pages
|
||||
git reset --hard FETCH_HEAD
|
||||
stage_index
|
||||
if git diff --cached --quiet; then
|
||||
echo "No changes after re-sync"
|
||||
exit 0
|
||||
fi
|
||||
commit_index
|
||||
done
|
||||
4
.github/workflows/publish_release.yml
vendored
4
.github/workflows/publish_release.yml
vendored
@ -17,13 +17,13 @@ jobs:
|
||||
|
||||
steps:
|
||||
- name: Checkout repository
|
||||
uses: actions/checkout@de0fac2e4500dabe0009e67214ff5f5447ce83dd # v6.0.2
|
||||
uses: actions/checkout@3d3c42e5aac5ba805825da76410c181273ba90b1 # v7.0.1
|
||||
with:
|
||||
fetch-depth: 0
|
||||
persist-credentials: false
|
||||
|
||||
- name: Use Node.js ${{ matrix.node-version }}
|
||||
uses: actions/setup-node@48b55a011bda9f5d6aeb4c2d9c7362e8dae4041e # v6.4.0
|
||||
uses: actions/setup-node@820762786026740c76f36085b0efc47a31fe5020 # v7.0.0
|
||||
with:
|
||||
node-version: ${{ matrix.node-version }}
|
||||
cache: 'npm'
|
||||
|
||||
10
.github/workflows/publish_website.yml
vendored
10
.github/workflows/publish_website.yml
vendored
@ -6,6 +6,12 @@ on:
|
||||
permissions:
|
||||
contents: read
|
||||
|
||||
# Allow only one concurrent deployment, without cancelling in-progress runs, so
|
||||
# that an in-flight Pages deployment is allowed to finish before the next starts.
|
||||
concurrency:
|
||||
group: "pages"
|
||||
cancel-in-progress: false
|
||||
|
||||
jobs:
|
||||
build:
|
||||
name: Build
|
||||
@ -17,13 +23,13 @@ jobs:
|
||||
|
||||
steps:
|
||||
- name: Checkout repository
|
||||
uses: actions/checkout@de0fac2e4500dabe0009e67214ff5f5447ce83dd # v6.0.2
|
||||
uses: actions/checkout@3d3c42e5aac5ba805825da76410c181273ba90b1 # v7.0.1
|
||||
with:
|
||||
fetch-depth: 0
|
||||
persist-credentials: false
|
||||
|
||||
- name: Use Node.js ${{ matrix.node-version }}
|
||||
uses: actions/setup-node@48b55a011bda9f5d6aeb4c2d9c7362e8dae4041e # v6.4.0
|
||||
uses: actions/setup-node@820762786026740c76f36085b0efc47a31fe5020 # v7.0.0
|
||||
with:
|
||||
node-version: ${{ matrix.node-version }}
|
||||
cache: 'npm'
|
||||
|
||||
4
.github/workflows/types_tests.yml
vendored
4
.github/workflows/types_tests.yml
vendored
@ -15,13 +15,13 @@ jobs:
|
||||
|
||||
steps:
|
||||
- name: Checkout repository
|
||||
uses: actions/checkout@de0fac2e4500dabe0009e67214ff5f5447ce83dd # v6.0.2
|
||||
uses: actions/checkout@3d3c42e5aac5ba805825da76410c181273ba90b1 # v7.0.1
|
||||
with:
|
||||
fetch-depth: 0
|
||||
persist-credentials: false
|
||||
|
||||
- name: Use Node.js ${{ matrix.node-version }}
|
||||
uses: actions/setup-node@48b55a011bda9f5d6aeb4c2d9c7362e8dae4041e # v6.4.0
|
||||
uses: actions/setup-node@820762786026740c76f36085b0efc47a31fe5020 # v7.0.0
|
||||
with:
|
||||
node-version: ${{ matrix.node-version }}
|
||||
cache: 'npm'
|
||||
|
||||
16
.github/workflows/unit_tests.yml
vendored
16
.github/workflows/unit_tests.yml
vendored
@ -3,7 +3,8 @@ on:
|
||||
push:
|
||||
paths:
|
||||
- 'gulpfile.mjs'
|
||||
- 'external/builder/**'
|
||||
- 'external/**'
|
||||
- 'package-lock.json'
|
||||
- 'src/**'
|
||||
- 'test/test.mjs'
|
||||
- 'test/unit/**'
|
||||
@ -14,7 +15,8 @@ on:
|
||||
pull_request:
|
||||
paths:
|
||||
- 'gulpfile.mjs'
|
||||
- 'external/builder/**'
|
||||
- 'external/**'
|
||||
- 'package-lock.json'
|
||||
- 'src/**'
|
||||
- 'test/test.mjs'
|
||||
- 'test/unit/**'
|
||||
@ -47,13 +49,13 @@ jobs:
|
||||
|
||||
steps:
|
||||
- name: Checkout repository
|
||||
uses: actions/checkout@de0fac2e4500dabe0009e67214ff5f5447ce83dd # v6.0.2
|
||||
uses: actions/checkout@3d3c42e5aac5ba805825da76410c181273ba90b1 # v7.0.1
|
||||
with:
|
||||
fetch-depth: 0
|
||||
persist-credentials: false
|
||||
|
||||
- name: Use Node.js ${{ matrix.node-version }}
|
||||
uses: actions/setup-node@48b55a011bda9f5d6aeb4c2d9c7362e8dae4041e # v6.4.0
|
||||
uses: actions/setup-node@820762786026740c76f36085b0efc47a31fe5020 # v7.0.0
|
||||
with:
|
||||
node-version: ${{ matrix.node-version }}
|
||||
cache: 'npm'
|
||||
@ -62,7 +64,7 @@ jobs:
|
||||
run: npm ci
|
||||
|
||||
- name: Restore cached PDF files
|
||||
uses: actions/cache/restore@27d5ce7f107fe9357f9df03efb73ab90386fccae # v5.0.5
|
||||
uses: actions/cache/restore@55cc8345863c7cc4c66a329aec7e433d2d1c52a9 # v6.1.0
|
||||
with:
|
||||
path: test/pdfs/*.pdf
|
||||
key: cached-pdf-files-${{ hashFiles('test/pdfs/*.pdf') }}
|
||||
@ -74,14 +76,14 @@ jobs:
|
||||
run: npx gulp unittest --headless --coverage --coverage-output build/coverage/unit ${{ matrix.skip }}
|
||||
|
||||
- name: Save cached PDF files
|
||||
uses: actions/cache/save@27d5ce7f107fe9357f9df03efb73ab90386fccae # v5.0.5
|
||||
uses: actions/cache/save@55cc8345863c7cc4c66a329aec7e433d2d1c52a9 # v6.1.0
|
||||
with:
|
||||
path: test/pdfs/*.pdf
|
||||
key: cached-pdf-files-${{ hashFiles('test/pdfs/*.pdf') }}
|
||||
enableCrossOsArchive: true
|
||||
|
||||
- name: Upload results to Codecov
|
||||
uses: codecov/codecov-action@e79a6962e0d4c0c17b229090214935d2e33f8354 # v6.0.1
|
||||
uses: codecov/codecov-action@fb8b3582c8e4def4969c97caa2f19720cb33a72f # v7.0.0
|
||||
with:
|
||||
token: ${{ secrets.CODECOV_TOKEN }}
|
||||
fail_ci_if_error: true
|
||||
|
||||
4
.github/workflows/update_locales.yml
vendored
4
.github/workflows/update_locales.yml
vendored
@ -23,13 +23,13 @@ jobs:
|
||||
private-key: ${{ secrets.APP_PRIVATE_KEY }}
|
||||
|
||||
- name: Checkout repository
|
||||
uses: actions/checkout@de0fac2e4500dabe0009e67214ff5f5447ce83dd # v6.0.2
|
||||
uses: actions/checkout@3d3c42e5aac5ba805825da76410c181273ba90b1 # v7.0.1
|
||||
with:
|
||||
token: ${{ steps.app-token.outputs.token }}
|
||||
persist-credentials: false
|
||||
|
||||
- name: Use Node.js LTS
|
||||
uses: actions/setup-node@48b55a011bda9f5d6aeb4c2d9c7362e8dae4041e # v6.4.0
|
||||
uses: actions/setup-node@820762786026740c76f36085b0efc47a31fe5020 # v7.0.0
|
||||
with:
|
||||
node-version: lts/*
|
||||
cache: 'npm'
|
||||
|
||||
@ -1,9 +1,13 @@
|
||||
{
|
||||
"chrome": {
|
||||
"skipDownload": false
|
||||
"skipDownload": true,
|
||||
"version": "stable"
|
||||
},
|
||||
"chrome-headless-shell": {
|
||||
"skipDownload": true
|
||||
},
|
||||
"firefox": {
|
||||
"skipDownload": false,
|
||||
"skipDownload": true,
|
||||
"version": "nightly"
|
||||
}
|
||||
}
|
||||
|
||||
84
README.md
84
README.md
@ -46,7 +46,7 @@ directory `build/chromium`.
|
||||
|
||||
### PDF debugger
|
||||
|
||||
Browser the internal structure of a PDF document with https://mozilla.github.io/pdf.js/internal-viewer/web/debugger.html
|
||||
Browse the internal structure of a PDF document with https://mozilla.github.io/pdf.js/internal-viewer/web/debugger.html
|
||||
|
||||
## Getting the Code
|
||||
|
||||
@ -91,6 +91,88 @@ This will generate `pdf.js` and `pdf.worker.js` in the `build/generic/build/` di
|
||||
Both scripts are needed but only `pdf.js` needs to be included since `pdf.worker.js` will
|
||||
be loaded by `pdf.js`. The PDF.js files are large and should be minified for production.
|
||||
|
||||
## Code coverage
|
||||
|
||||
We track how much of the code is exercised by the test suite on
|
||||
[Codecov](https://codecov.io/gh/mozilla/pdf.js) (see the badge at the top of this
|
||||
file).
|
||||
|
||||
### How it is collected
|
||||
|
||||
When coverage is enabled, the build instruments the bundled code with
|
||||
[`babel-plugin-istanbul`](https://github.com/istanbuljs/babel-plugin-istanbul),
|
||||
which adds counters that record every line, branch and function that runs:
|
||||
|
||||
+ For browser-based tests (unit, integration and reference tests) the
|
||||
instrumented code runs in the browser, fills a global `window.__coverage__`
|
||||
object, and the test runner collects it from each browser session, merges the
|
||||
results, and writes the report.
|
||||
+ For the Node-based unit tests (`unittestcli`) the raw data is written to
|
||||
`build/tmp/unittestcli-coverage.json` and turned into a report afterwards.
|
||||
|
||||
### Collecting coverage locally
|
||||
|
||||
Add the `--coverage` flag to any of the test tasks, for example:
|
||||
|
||||
$ npx gulp unittest --coverage # browser unit tests
|
||||
$ npx gulp unittestcli --coverage # Node unit tests
|
||||
$ npx gulp integrationtest --coverage # Puppeteer integration tests
|
||||
$ npx gulp botbrowsertest --coverage # reference tests
|
||||
|
||||
The following options control the output:
|
||||
|
||||
| Option | Description | Default |
|
||||
| --- | --- | --- |
|
||||
| `--coverage` | Enable coverage collection. | off |
|
||||
| `--coverage-output <dir>` | Directory where the report is written. | `build/coverage` |
|
||||
| `--coverage-formats <list>` | Comma-separated list of formats: `info`, `html`, `json`, `text`, `cobertura`, `clover`. | `info` |
|
||||
| `--coverage-per-test` | Also build a per-test index (see below). | off |
|
||||
|
||||
By default the report is written to `build/coverage` in the `info` format, i.e.
|
||||
an [LCOV](https://github.com/linux-test-project/lcov) `lcov.info` file (the same
|
||||
format that is uploaded to Codecov). Use `--coverage-formats html` to get a
|
||||
browsable HTML report instead, or pass several formats at once, e.g.
|
||||
`--coverage-formats info,html`.
|
||||
|
||||
### Finding which tests cover a given line
|
||||
|
||||
`coverage_search` lists the ref tests that exercised a specific source line or
|
||||
function. It uses the per-test index (`per-test-index.json`) that is rebuilt on
|
||||
every push to `master` and published to the
|
||||
[`pdf.js.refs`](https://github.com/mozilla/pdf.js.refs/tree/gh-pages)
|
||||
repository. The index is downloaded on demand, cached locally, and only
|
||||
re-downloaded when it has changed, so no local coverage build is required:
|
||||
|
||||
$ npx gulp coverage_search --code="canvas.js::205"
|
||||
$ npx gulp coverage_search --code="canvas.js::drawImageAtIntegerCoords"
|
||||
|
||||
To run — or regenerate the reference images for — only the ref tests that touch
|
||||
a given line or function, pass the same `--code` option to a browser test or
|
||||
`makeref` task:
|
||||
|
||||
$ npx gulp browsertest --code="canvas.js::205"
|
||||
$ npx gulp makeref --code="canvas.js::205"
|
||||
|
||||
Pass `--no-download` to reuse the locally cached index without contacting the
|
||||
network. The index can also be built and queried locally (the CI job that
|
||||
publishes it builds it the same way):
|
||||
|
||||
$ npx gulp botbrowsertest --coverage-per-test
|
||||
$ npx gulp coverage_search --code="canvas.js::205" \
|
||||
--index=build/coverage/per-test-index.json --no-download
|
||||
|
||||
### Continuous integration
|
||||
|
||||
On every push and pull request three GitHub Actions workflows collect coverage
|
||||
and upload it to Codecov, each tagged with its own Codecov *flag* so the test
|
||||
types can be told apart:
|
||||
|
||||
| Workflow | Task | Codecov flag |
|
||||
| --- | --- | --- |
|
||||
| `unit_tests.yml` | `unittest` | `unittest` |
|
||||
| `integration_tests.yml` | `integrationtest` | `integrationtest` |
|
||||
| `coverage_browser_tests.yml` | `botbrowsertest` | `browsertest` |
|
||||
|
||||
## Using PDF.js in a web application
|
||||
|
||||
To use PDF.js in a web application you can choose to use a pre-built version of the library
|
||||
|
||||
@ -178,6 +178,11 @@ export default [
|
||||
"unicorn/prefer-dom-node-remove": "error",
|
||||
"unicorn/prefer-import-meta-properties": "error",
|
||||
"unicorn/prefer-includes": "error",
|
||||
"unicorn/logical-assignment-operators": [
|
||||
"error",
|
||||
"always",
|
||||
{ enforceForIfStatements: true },
|
||||
],
|
||||
"unicorn/prefer-logical-operator-over-ternary": "error",
|
||||
"unicorn/prefer-modern-dom-apis": "error",
|
||||
"unicorn/prefer-modern-math-apis": "error",
|
||||
|
||||
@ -192,7 +192,7 @@ function renderDefaultZoomValue(shortDescription) {
|
||||
document.getElementById("settings-boxes").append(wrapper);
|
||||
|
||||
function renderPreference(value) {
|
||||
value = value || "auto";
|
||||
value ||= "auto";
|
||||
select.value = value;
|
||||
var customOption = select.querySelector("option.custom-zoom");
|
||||
if (select.selectedIndex === -1 && value) {
|
||||
|
||||
@ -150,7 +150,7 @@ limitations under the License.
|
||||
*/
|
||||
function didUpdateSinceLastCheck() {
|
||||
var chromeVersion = /Chrome\/(\d+)\./.exec(navigator.userAgent);
|
||||
chromeVersion = chromeVersion && chromeVersion[1];
|
||||
chromeVersion &&= chromeVersion[1];
|
||||
if (!chromeVersion || localStorage.telemetryLastVersion === chromeVersion) {
|
||||
return false;
|
||||
}
|
||||
|
||||
@ -319,6 +319,16 @@ function babelPluginStripSrcPath() {
|
||||
};
|
||||
}
|
||||
|
||||
function babelPluginAddHeaderComment(babel, { header }) {
|
||||
return {
|
||||
visitor: {
|
||||
Program(path) {
|
||||
path.addComment("leading", header);
|
||||
},
|
||||
},
|
||||
};
|
||||
}
|
||||
|
||||
function preprocessPDFJSCode(ctx, content) {
|
||||
return transformSync(content, {
|
||||
configFile: false,
|
||||
@ -327,6 +337,7 @@ function preprocessPDFJSCode(ctx, content) {
|
||||
}
|
||||
|
||||
export {
|
||||
babelPluginAddHeaderComment,
|
||||
babelPluginPDFJSPreprocessor,
|
||||
babelPluginStripSrcPath,
|
||||
preprocessPDFJSCode,
|
||||
|
||||
23
external/builder/builder.mjs
vendored
23
external/builder/builder.mjs
vendored
@ -73,10 +73,7 @@ function preprocess(inFilename, outFilename, defines) {
|
||||
const out = [];
|
||||
let i = 0;
|
||||
function readLine() {
|
||||
if (i < totalLines) {
|
||||
return lines[i++];
|
||||
}
|
||||
return null;
|
||||
return i < totalLines ? lines[i++] : null;
|
||||
}
|
||||
const writeLine =
|
||||
typeof outFilename === "function"
|
||||
@ -113,16 +110,9 @@ function preprocess(inFilename, outFilename, defines) {
|
||||
const realPath = fs.realpathSync(inFilename);
|
||||
const dir = path.dirname(realPath);
|
||||
try {
|
||||
let fullpath;
|
||||
if (file.indexOf("$ROOT/") === 0) {
|
||||
fullpath = path.join(
|
||||
__dirname,
|
||||
"../..",
|
||||
file.substring("$ROOT/".length)
|
||||
);
|
||||
} else {
|
||||
fullpath = path.join(dir, file);
|
||||
}
|
||||
const fullpath = file.startsWith("$ROOT/")
|
||||
? path.join(__dirname, "../..", file.substring("$ROOT/".length))
|
||||
: path.join(dir, file);
|
||||
preprocess(fullpath, writeLine, defines);
|
||||
} catch (e) {
|
||||
if (e.code === "ENOENT") {
|
||||
@ -134,10 +124,7 @@ function preprocess(inFilename, outFilename, defines) {
|
||||
function expand(line) {
|
||||
line = line.replaceAll(/__\w+__/g, function (variable) {
|
||||
variable = variable.substring(2, variable.length - 2);
|
||||
if (variable in defines) {
|
||||
return defines[variable];
|
||||
}
|
||||
return "";
|
||||
return variable in defines ? defines[variable] : "";
|
||||
});
|
||||
writeLine(line);
|
||||
}
|
||||
|
||||
159
external/ccov/coverage_search.mjs
vendored
159
external/ccov/coverage_search.mjs
vendored
@ -20,26 +20,46 @@ import path from "path";
|
||||
const __dirname = import.meta.dirname;
|
||||
const PROJECT_ROOT = path.join(__dirname, "../..");
|
||||
|
||||
const { values } = parseArgs({
|
||||
// The per-test coverage index (which ref test exercises which source
|
||||
// line/function) is rebuilt on every push to master and published to the
|
||||
// gh-pages branch of the pdf.js.refs repository.
|
||||
const PER_TEST_INDEX_URL =
|
||||
"https://raw.githubusercontent.com/mozilla/pdf.js.refs/gh-pages/per-test-index.json";
|
||||
|
||||
let values;
|
||||
try {
|
||||
({ values } = parseArgs({
|
||||
args: process.argv.slice(2),
|
||||
options: {
|
||||
code: { type: "string" },
|
||||
"coverage-dir": { type: "string", default: "build/coverage" },
|
||||
index: { type: "string", default: "build/per-test-index.json" },
|
||||
"no-download": { type: "boolean", default: false },
|
||||
help: { type: "boolean", short: "h", default: false },
|
||||
},
|
||||
});
|
||||
}));
|
||||
} catch (error) {
|
||||
// parseArgs is strict, so an unknown/renamed option (e.g. the removed
|
||||
// --coverage-dir) would otherwise abort with an uncaught stack trace.
|
||||
console.error(`Error: ${error.message}`);
|
||||
console.error("Run with --help to see the available options.");
|
||||
process.exit(1);
|
||||
}
|
||||
|
||||
if (values.help || !values.code) {
|
||||
console.log(
|
||||
"Usage: coverage_search.mjs --code=<file>::<line|function> [--coverage-dir=<path>]\n\n" +
|
||||
"Usage: coverage_search.mjs --code=<file>::<line|function> [--index=<path>] [--no-download]\n\n" +
|
||||
" --code Source file and line number or function name to search for.\n" +
|
||||
" Examples:\n" +
|
||||
" --code=canvas.js::205\n" +
|
||||
" --code=canvas.js::drawImageAtIntegerCoords\n" +
|
||||
" --coverage-dir Coverage directory containing per-test-index.json [build/coverage]\n\n" +
|
||||
" --index Where to cache or read the per-test index.\n" +
|
||||
" [build/per-test-index.json]\n" +
|
||||
" --no-download Don't contact the network; use the cached index as-is.\n\n" +
|
||||
"Prints to stdout the IDs of tests whose coverage includes the given line or\n" +
|
||||
"function (one ID per line).\n" +
|
||||
"Run browsertest with --coverage-per-test first to generate the index."
|
||||
"function (one ID per line).\n\n" +
|
||||
"The index is downloaded from the pdf.js.refs repository and cached locally;\n" +
|
||||
"it is only re-downloaded when the published file has changed.\n" +
|
||||
`Source: ${PER_TEST_INDEX_URL}`
|
||||
);
|
||||
process.exit(values.help ? 0 : 1);
|
||||
}
|
||||
@ -58,18 +78,129 @@ const isLine = /^\d+$/.test(location);
|
||||
const lineNum = isLine ? parseInt(location, 10) : null;
|
||||
const funcName = isLine ? null : location;
|
||||
|
||||
const coverageDir = path.isAbsolute(values["coverage-dir"])
|
||||
? values["coverage-dir"]
|
||||
: path.join(PROJECT_ROOT, values["coverage-dir"]);
|
||||
const indexPath = path.isAbsolute(values.index)
|
||||
? values.index
|
||||
: path.join(PROJECT_ROOT, values.index);
|
||||
// The ETag of the cached copy is stored alongside it, so the next run can ask
|
||||
// the server (via If-None-Match) to only re-send the file when it has changed.
|
||||
const etagPath = `${indexPath}.etag`;
|
||||
|
||||
// Refreshes the locally cached index from the published copy, downloading it
|
||||
// only when it has changed since the last run. When the network is unavailable
|
||||
// a previously cached copy is reused if present.
|
||||
async function refreshIndex() {
|
||||
if (values["no-download"]) {
|
||||
return; // Freshness check disabled; the read below validates existence.
|
||||
}
|
||||
|
||||
const hasCached = fs.existsSync(indexPath);
|
||||
|
||||
// On any download failure, fall back to a previously cached copy when one
|
||||
// exists; otherwise there's nothing to search, so fail.
|
||||
const fallbackOrFail = reason => {
|
||||
if (hasCached) {
|
||||
console.error(
|
||||
`Warning: couldn't refresh per-test index (${reason}); using the cached copy.`
|
||||
);
|
||||
return;
|
||||
}
|
||||
console.error(`Error: couldn't download per-test index (${reason}).`);
|
||||
process.exit(1);
|
||||
};
|
||||
|
||||
const headers = new Headers();
|
||||
if (hasCached && fs.existsSync(etagPath)) {
|
||||
const etag = fs.readFileSync(etagPath, "utf8").trim();
|
||||
// Only forward a syntactically valid HTTP ETag (RFC 7232), so the cached
|
||||
// file's contents can't be used to inject arbitrary data into the request.
|
||||
if (/^(?:W\/)?"[\x21\x23-\x7e]*"$/.test(etag)) {
|
||||
headers.set("If-None-Match", etag);
|
||||
}
|
||||
}
|
||||
|
||||
let response;
|
||||
try {
|
||||
console.log(`Fetching per-test index from ${PER_TEST_INDEX_URL} ...`);
|
||||
response = await fetch(PER_TEST_INDEX_URL, { headers });
|
||||
} catch (error) {
|
||||
fallbackOrFail(error.message);
|
||||
return;
|
||||
}
|
||||
|
||||
if (response.status === 304) {
|
||||
console.log("Per-test index is up to date.");
|
||||
return;
|
||||
}
|
||||
if (!response.ok) {
|
||||
fallbackOrFail(`HTTP ${response.status}`);
|
||||
return;
|
||||
}
|
||||
|
||||
let text;
|
||||
try {
|
||||
text = await response.text();
|
||||
} catch (error) {
|
||||
fallbackOrFail(error.message);
|
||||
return;
|
||||
}
|
||||
|
||||
// Parse the payload before caching it, and cache the re-serialized result
|
||||
// rather than the raw response body: only well-formed JSON produced by our
|
||||
// own JSON.stringify is ever written to disk.
|
||||
let serialized;
|
||||
try {
|
||||
serialized = JSON.stringify(JSON.parse(text));
|
||||
} catch {
|
||||
fallbackOrFail("the downloaded index is not valid JSON");
|
||||
return;
|
||||
}
|
||||
|
||||
// Write to a temporary file and rename it into place.
|
||||
try {
|
||||
fs.mkdirSync(path.dirname(indexPath), { recursive: true });
|
||||
const tmpPath = `${indexPath}.${process.pid}.tmp`;
|
||||
fs.writeFileSync(tmpPath, serialized);
|
||||
fs.renameSync(tmpPath, indexPath);
|
||||
|
||||
const etag = response.headers.get("etag");
|
||||
if (etag) {
|
||||
fs.writeFileSync(etagPath, etag);
|
||||
} else {
|
||||
fs.rmSync(etagPath, { force: true });
|
||||
}
|
||||
} catch (error) {
|
||||
// A write failure (disk full, read-only dir, ...) shouldn't be fatal when
|
||||
// a usable cached copy already exists.
|
||||
fallbackOrFail(error.message);
|
||||
return;
|
||||
}
|
||||
console.log(`Per-test index updated (${serialized.length} bytes).`);
|
||||
}
|
||||
|
||||
await refreshIndex();
|
||||
|
||||
const indexPath = path.join(coverageDir, "per-test-index.json");
|
||||
if (!fs.existsSync(indexPath)) {
|
||||
console.error(`Error: index file not found: ${indexPath}`);
|
||||
console.error("Run browsertest with --coverage-per-test first.");
|
||||
console.error(`Error: per-test index not found: ${indexPath}`);
|
||||
console.error(
|
||||
"Build it locally (gulp botbrowsertest --coverage-per-test) or omit " +
|
||||
"--no-download to fetch it from the pdf.js.refs repository."
|
||||
);
|
||||
process.exit(1);
|
||||
}
|
||||
|
||||
const { ids, files } = JSON.parse(fs.readFileSync(indexPath, "utf8"));
|
||||
let ids, files;
|
||||
try {
|
||||
({ ids, files } = JSON.parse(fs.readFileSync(indexPath, "utf8")));
|
||||
} catch (error) {
|
||||
console.error(
|
||||
`Error: couldn't read per-test index at ${indexPath}: ${error.message}`
|
||||
);
|
||||
console.error(
|
||||
"The cached index may be corrupt; delete it and re-run without " +
|
||||
"--no-download to refetch it."
|
||||
);
|
||||
process.exit(1);
|
||||
}
|
||||
|
||||
// Find the file entry whose path matches fileName.
|
||||
let fileEntry = null;
|
||||
|
||||
2
external/cmapscompress/compress.mjs
vendored
2
external/cmapscompress/compress.mjs
vendored
@ -386,7 +386,7 @@ function writeNumber(n) {
|
||||
if (buffer > 0) {
|
||||
s = writeByte((buffer & 0x7f) | (s.length > 0 ? 0x80 : 0)) + s;
|
||||
}
|
||||
while (s.indexOf("80") === 0) {
|
||||
while (s.startsWith("80")) {
|
||||
s = s.substring(2);
|
||||
}
|
||||
return s;
|
||||
|
||||
45
external/qcms/qcms.js
vendored
45
external/qcms/qcms.js
vendored
@ -1,5 +1,5 @@
|
||||
/* THIS FILE IS GENERATED - DO NOT EDIT */
|
||||
import { copy_result, copy_rgb, make_cssRGB } from './qcms_utils.js';
|
||||
import { copy_result } from './qcms_utils.js';
|
||||
|
||||
|
||||
/**
|
||||
@ -25,16 +25,20 @@ export const Intent = Object.freeze({
|
||||
});
|
||||
|
||||
/**
|
||||
* Converts `src` and hands the result to `copy_result`, laid out as RGB, or as
|
||||
* RGBA with an opaque alpha when `add_alpha` is set.
|
||||
*
|
||||
* # Safety
|
||||
*
|
||||
* This function is called directly from JavaScript.
|
||||
* @param {number} transformer
|
||||
* @param {Uint8Array} src
|
||||
* @param {boolean} add_alpha
|
||||
*/
|
||||
export function qcms_convert_array(transformer, src) {
|
||||
export function qcms_convert_array(transformer, src, add_alpha) {
|
||||
const ptr0 = passArray8ToWasm0(src, wasm.__wbindgen_malloc);
|
||||
const len0 = WASM_VECTOR_LEN;
|
||||
wasm.qcms_convert_array(transformer, ptr0, len0);
|
||||
wasm.qcms_convert_array(transformer, ptr0, len0, add_alpha);
|
||||
}
|
||||
|
||||
/**
|
||||
@ -46,10 +50,11 @@ export function qcms_convert_array(transformer, src) {
|
||||
* @param {number} src2
|
||||
* @param {number} src3
|
||||
* @param {number} src4
|
||||
* @param {boolean} css
|
||||
* @returns {number}
|
||||
*/
|
||||
export function qcms_convert_four(transformer, src1, src2, src3, src4, css) {
|
||||
wasm.qcms_convert_four(transformer, src1, src2, src3, src4, css);
|
||||
export function qcms_convert_four(transformer, src1, src2, src3, src4) {
|
||||
const ret = wasm.qcms_convert_four(transformer, src1, src2, src3, src4);
|
||||
return ret >>> 0;
|
||||
}
|
||||
|
||||
/**
|
||||
@ -58,10 +63,11 @@ export function qcms_convert_four(transformer, src1, src2, src3, src4, css) {
|
||||
* This function is called directly from JavaScript.
|
||||
* @param {number} transformer
|
||||
* @param {number} src
|
||||
* @param {boolean} css
|
||||
* @returns {number}
|
||||
*/
|
||||
export function qcms_convert_one(transformer, src, css) {
|
||||
wasm.qcms_convert_one(transformer, src, css);
|
||||
export function qcms_convert_one(transformer, src) {
|
||||
const ret = wasm.qcms_convert_one(transformer, src);
|
||||
return ret >>> 0;
|
||||
}
|
||||
|
||||
/**
|
||||
@ -72,10 +78,11 @@ export function qcms_convert_one(transformer, src, css) {
|
||||
* @param {number} src1
|
||||
* @param {number} src2
|
||||
* @param {number} src3
|
||||
* @param {boolean} css
|
||||
* @returns {number}
|
||||
*/
|
||||
export function qcms_convert_three(transformer, src1, src2, src3, css) {
|
||||
wasm.qcms_convert_three(transformer, src1, src2, src3, css);
|
||||
export function qcms_convert_three(transformer, src1, src2, src3) {
|
||||
const ret = wasm.qcms_convert_three(transformer, src1, src2, src3);
|
||||
return ret >>> 0;
|
||||
}
|
||||
|
||||
/**
|
||||
@ -106,18 +113,12 @@ export function qcms_transformer_from_memory(mem, in_type, intent) {
|
||||
function __wbg_get_imports() {
|
||||
const import0 = {
|
||||
__proto__: null,
|
||||
__wbg___wbindgen_throw_6b64449b9b9ed33c: function(arg0, arg1) {
|
||||
__wbg___wbindgen_throw_344f42d3211c4765: function(arg0, arg1) {
|
||||
throw new Error(getStringFromWasm0(arg0, arg1));
|
||||
},
|
||||
__wbg_copy_result_0d15f3bf9d9012ae: function(arg0, arg1) {
|
||||
copy_result(arg0 >>> 0, arg1 >>> 0);
|
||||
},
|
||||
__wbg_copy_rgb_0106d9d9464fce43: function(arg0) {
|
||||
copy_rgb(arg0 >>> 0);
|
||||
},
|
||||
__wbg_make_cssRGB_8e24b34f71f5363e: function(arg0) {
|
||||
make_cssRGB(arg0 >>> 0);
|
||||
},
|
||||
__wbindgen_init_externref_table: function() {
|
||||
const table = wasm.__wbindgen_externrefs;
|
||||
const offset = table.grow(4);
|
||||
@ -135,8 +136,7 @@ function __wbg_get_imports() {
|
||||
}
|
||||
|
||||
function getStringFromWasm0(ptr, len) {
|
||||
ptr = ptr >>> 0;
|
||||
return decodeText(ptr, len);
|
||||
return decodeText(ptr >>> 0, len);
|
||||
}
|
||||
|
||||
let cachedUint8ArrayMemory0 = null;
|
||||
@ -170,8 +170,9 @@ function decodeText(ptr, len) {
|
||||
|
||||
let WASM_VECTOR_LEN = 0;
|
||||
|
||||
let wasmModule, wasm;
|
||||
let wasmModule, wasmInstance, wasm;
|
||||
function __wbg_finalize_init(instance, module) {
|
||||
wasmInstance = instance;
|
||||
wasm = instance.exports;
|
||||
wasmModule = module;
|
||||
cachedUint8ArrayMemory0 = null;
|
||||
|
||||
BIN
external/qcms/qcms_bg.wasm
vendored
BIN
external/qcms/qcms_bg.wasm
vendored
Binary file not shown.
68
external/qcms/qcms_utils.js
vendored
68
external/qcms/qcms_utils.js
vendored
@ -13,22 +13,28 @@
|
||||
* limitations under the License.
|
||||
*/
|
||||
|
||||
// Alpha lives in the high byte of a pixel on a little-endian host and in the
|
||||
// low byte on a big-endian one.
|
||||
const ALPHA_MASK =
|
||||
new Uint8Array(new Uint32Array([1]).buffer)[0] === 1 ? 0xff000000 : 0x000000ff;
|
||||
const RGB_MASK = ~ALPHA_MASK;
|
||||
|
||||
class QCMS {
|
||||
static #memoryArray = null;
|
||||
|
||||
static _memory = null;
|
||||
|
||||
static _mustAddAlpha = false;
|
||||
|
||||
// Where the next `qcms_convert_array` result should land.
|
||||
static _destBuffer = null;
|
||||
|
||||
static _destOffset = 0;
|
||||
|
||||
static _destLength = 0;
|
||||
|
||||
static _cssColor = "";
|
||||
|
||||
static _makeHexColor = null;
|
||||
// Set when the destination is RGBA and its alpha channel already holds
|
||||
// something worth keeping, which is the case whenever the image has an
|
||||
// /SMask: `fillOpacity` has run by then. The Wasm side does not know about
|
||||
// that, so it always fills alpha in, and the bytes are merged here instead of
|
||||
// copied wholesale.
|
||||
static _keepAlpha = false;
|
||||
|
||||
static get _memoryArray() {
|
||||
const array = this.#memoryArray;
|
||||
@ -42,43 +48,31 @@ class QCMS {
|
||||
function copy_result(ptr, len) {
|
||||
// This function is called from the wasm module (it's an external
|
||||
// "C" function). Its goal is to copy the result from the wasm memory
|
||||
// to the destination buffer without any intermediate copies.
|
||||
const { _mustAddAlpha, _destBuffer, _destOffset, _destLength, _memoryArray } =
|
||||
QCMS;
|
||||
if (len === _destLength) {
|
||||
// to the destination buffer without any intermediate copies. The wasm side
|
||||
// has already laid the result out the way the caller asked for it, so this is
|
||||
// one bulk copy unless the destination's alpha has to survive.
|
||||
const { _destBuffer, _destOffset, _keepAlpha, _memoryArray } = QCMS;
|
||||
if (!_keepAlpha) {
|
||||
_destBuffer.set(_memoryArray.subarray(ptr, ptr + len), _destOffset);
|
||||
return;
|
||||
}
|
||||
if (_mustAddAlpha) {
|
||||
for (let i = ptr, ii = ptr + len, j = _destOffset; i < ii; i += 3, j += 4) {
|
||||
_destBuffer[j] = _memoryArray[i];
|
||||
_destBuffer[j + 1] = _memoryArray[i + 1];
|
||||
_destBuffer[j + 2] = _memoryArray[i + 2];
|
||||
_destBuffer[j + 3] = 255;
|
||||
const count = len >> 2;
|
||||
const destStart = _destBuffer.byteOffset + _destOffset;
|
||||
if (((destStart | ptr) & 3) === 0) {
|
||||
// Both sides are pixel-aligned, so RGB can be merged a whole pixel at a
|
||||
// time. `len` is a multiple of 4 here: the wasm side wrote RGBA.
|
||||
const dest32 = new Uint32Array(_destBuffer.buffer, destStart, count);
|
||||
const src32 = new Uint32Array(QCMS._memory.buffer, ptr, count);
|
||||
for (let i = 0; i < count; i++) {
|
||||
dest32[i] = (dest32[i] & ALPHA_MASK) | (src32[i] & RGB_MASK);
|
||||
}
|
||||
} else {
|
||||
for (let i = ptr, ii = ptr + len, j = _destOffset; i < ii; i += 3, j += 4) {
|
||||
return;
|
||||
}
|
||||
for (let i = ptr, ii = ptr + len, j = _destOffset; i < ii; i += 4, j += 4) {
|
||||
_destBuffer[j] = _memoryArray[i];
|
||||
_destBuffer[j + 1] = _memoryArray[i + 1];
|
||||
_destBuffer[j + 2] = _memoryArray[i + 2];
|
||||
}
|
||||
}
|
||||
}
|
||||
|
||||
function copy_rgb(ptr) {
|
||||
const { _destBuffer, _destOffset, _memoryArray } = QCMS;
|
||||
_destBuffer[_destOffset] = _memoryArray[ptr];
|
||||
_destBuffer[_destOffset + 1] = _memoryArray[ptr + 1];
|
||||
_destBuffer[_destOffset + 2] = _memoryArray[ptr + 2];
|
||||
}
|
||||
|
||||
function make_cssRGB(ptr) {
|
||||
const { _memoryArray } = QCMS;
|
||||
QCMS._cssColor = QCMS._makeHexColor(
|
||||
_memoryArray[ptr],
|
||||
_memoryArray[ptr + 1],
|
||||
_memoryArray[ptr + 2]
|
||||
);
|
||||
}
|
||||
|
||||
export { copy_result, copy_rgb, make_cssRGB, QCMS };
|
||||
export { copy_result, QCMS };
|
||||
|
||||
20
external/quickjs/quickjs-eval.js
vendored
20
external/quickjs/quickjs-eval.js
vendored
@ -2,15 +2,15 @@
|
||||
async function QuickJS(moduleArg={}){var moduleRtn;var e=moduleArg,aa=import.meta.url,h="",m;try{h=(new URL(".",aa)).href}catch{}m=async a=>{a=await fetch(a,{credentials:"same-origin"});if(a.ok)return a.arrayBuffer();throw Error(a.status+" : "+a.url);};var q=console.error.bind(console),r,t=!1,u,v,w,x=!1;function y(){var a=z.buffer;A=new Int8Array(a);new Int16Array(a);B=new Uint8Array(a);new Uint16Array(a);C=new Int32Array(a);D=new Uint32Array(a);new Float32Array(a);new Float64Array(a);new BigInt64Array(a);new BigUint64Array(a)}
|
||||
function E(a){e.onAbort?.(a);a=`Aborted(${a})`;q(a);t=!0;a=new WebAssembly.RuntimeError(a+". Build with -sASSERTIONS for more info.");w?.(a);throw a;}var F;async function ba(a){if(!r)try{var b=await m(a);return new Uint8Array(b)}catch{}if(a==F&&r)a=new Uint8Array(r);else throw"both async and sync fetching of the wasm failed";return a}async function ca(a,b){try{var c=await ba(a);return await WebAssembly.instantiate(c,b)}catch(d){q(`failed to asynchronously prepare wasm: ${d}`),E(d)}}
|
||||
async function da(a){var b=F;if(!r)try{var c=fetch(b,{credentials:"same-origin"});return await WebAssembly.instantiateStreaming(c,a)}catch(d){q(`wasm streaming compile failed: ${d}`),q("falling back to ArrayBuffer instantiation")}return ca(b,a)}class G{name="ExitStatus";constructor(a){this.message=`Program terminated with exit(${a})`;this.status=a}}
|
||||
var C,A,D,B,H=a=>{for(;0<a.length;)a.shift()(e)},I=[],J=[],ea=()=>{var a=e.preRun.shift();J.push(a)},K=!0,L=0,fa=[0,31,60,91,121,152,182,213,244,274,305,335],ha=[0,31,59,90,120,151,181,212,243,273,304,334],M={},N=a=>{if(!(a instanceof G||"unwind"==a))throw a;},O=a=>{u=a;K||0<L||(e.onExit?.(a),t=!0);throw new G(a);},ia=a=>{if(!t)try{a()}catch(b){N(b)}finally{if(!(K||0<L))try{u=a=u,O(a)}catch(b){N(b)}}},P=(a,b,c)=>{var d=B;if(0<c){c=b+c-1;for(var g=0;g<a.length;++g){var f=a.codePointAt(g);if(127>=f){if(b>=
|
||||
c)break;d[b++]=f}else if(2047>=f){if(b+1>=c)break;d[b++]=192|f>>6;d[b++]=128|f&63}else if(65535>=f){if(b+2>=c)break;d[b++]=224|f>>12;d[b++]=128|f>>6&63;d[b++]=128|f&63}else{if(b+3>=c)break;d[b++]=240|f>>18;d[b++]=128|f>>12&63;d[b++]=128|f>>6&63;d[b++]=128|f&63;g++}}d[b]=0}},ja=new TextDecoder,Q=a=>{if(a){for(var b=a,c=B,d=b+void 0;c[b]&&!(b>=d);)++b;a=ja.decode(B.subarray(a,b))}else a="";return a},R=a=>{for(var b=0,c=0;c<a.length;++c){var d=a.charCodeAt(c);127>=d?b++:2047>=d?b+=2:55296<=d&&57343>=
|
||||
d?(b+=4,++c):b+=3}return b},T=a=>{var b=R(a)+1,c=S(b);c&&P(a,c,b);return c};function U(){}var la=(a,b,c,d)=>{var g={string:k=>{var n=0;if(null!==k&&void 0!==k&&0!==k){n=R(k)+1;var X=V(n);P(k,X,n);n=X}return n},array:k=>{var n=V(k.length);A.set(k,n);return n}};a=e["_"+a];var f=[],p=0;if(d)for(var l=0;l<d.length;l++){var Y=g[c[l]];Y?(0===p&&(p=W()),f[l]=Y(d[l])):f[l]=d[l]}c=a(...f);return c=function(k){0!==p&&ka(p);return"string"===b?Q(k):"boolean"===b?!!k:k}(c)};
|
||||
U=(a,b,c)=>{a=Q(a);b=null!==b?JSON.parse(Q(b)):[];try{const d=e.externalCall(a,b);return d?T(d):null}catch(d){return e.HEAPU8[c]=1,T(d.message)}};e.noExitRuntime&&(K=e.noExitRuntime);e.printErr&&(q=e.printErr);e.wasmBinary&&(r=e.wasmBinary);if(e.preInit)for("function"==typeof e.preInit&&(e.preInit=[e.preInit]);0<e.preInit.length;)e.preInit.shift()();e.ccall=la;e.cwrap=(a,b,c,d)=>{var g=!c||c.every(f=>"number"===f||"boolean"===f);return"string"!==b&&g&&!d?e["_"+a]:(...f)=>la(a,b,c,f,d)};
|
||||
var C,A,D,B,H=a=>{for(;a.length>0;)a.shift()(e)},I=[],J=[],ea=()=>{var a=e.preRun.shift();J.push(a)},K=!0,L=0,fa=[0,31,60,91,121,152,182,213,244,274,305,335],ha=[0,31,59,90,120,151,181,212,243,273,304,334],M={},N=a=>{if(!(a instanceof G||a=="unwind"))throw a;},O=a=>{u=a;K||L>0||(e.onExit?.(a),t=!0);throw new G(a);},ia=a=>{if(!t)try{a()}catch(b){N(b)}finally{if(!(K||L>0))try{u=a=u,O(a)}catch(b){N(b)}}},P=(a,b,c)=>{var d=B;if(c>0){c=b+c-1;for(var g=0;g<a.length;++g){var f=a.codePointAt(g);if(f<=127){if(b>=
|
||||
c)break;d[b++]=f}else if(f<=2047){if(b+1>=c)break;d[b++]=192|f>>6;d[b++]=128|f&63}else if(f<=65535){if(b+2>=c)break;d[b++]=224|f>>12;d[b++]=128|f>>6&63;d[b++]=128|f&63}else{if(b+3>=c)break;d[b++]=240|f>>18;d[b++]=128|f>>12&63;d[b++]=128|f>>6&63;d[b++]=128|f&63;g++}}d[b]=0}},ja=new TextDecoder,Q=a=>{if(a){for(var b=a,c=B,d=b+void 0;c[b]&&!(b>=d);)++b;a=ja.decode(B.subarray(a,b))}else a="";return a},R=a=>{for(var b=0,c=0;c<a.length;++c){var d=a.charCodeAt(c);d<=127?b++:d<=2047?b+=2:d>=55296&&d<=57343?
|
||||
(b+=4,++c):b+=3}return b},T=a=>{var b=R(a)+1,c=S(b);c&&P(a,c,b);return c};function U(){}var la=(a,b,c,d)=>{var g={string:k=>{var n=0;if(k!==null&&k!==void 0&&k!==0){n=R(k)+1;var X=V(n);P(k,X,n);n=X}return n},array:k=>{var n=V(k.length);A.set(k,n);return n}};a=e["_"+a];var f=[],p=0;if(d)for(var l=0;l<d.length;l++){var Y=g[c[l]];Y?(p===0&&(p=W()),f[l]=Y(d[l])):f[l]=d[l]}c=a(...f);return c=function(k){p!==0&&ka(p);return b==="string"?Q(k):b==="boolean"?!!k:k}(c)};
|
||||
U=(a,b,c)=>{a=Q(a);b=b!==null?JSON.parse(Q(b)):[];try{let d=e.externalCall(a,b);return d?T(d):null}catch(d){return e.HEAPU8[c]=1,T(d.message)}};e.noExitRuntime&&(K=e.noExitRuntime);e.printErr&&(q=e.printErr);e.wasmBinary&&(r=e.wasmBinary);if(e.preInit)for(typeof e.preInit=="function"&&(e.preInit=[e.preInit]);e.preInit.length>0;)e.preInit.shift()();e.ccall=la;e.cwrap=(a,b,c,d)=>{var g=!c||c.every(f=>f==="number"||f==="boolean");return b!=="string"&&g&&!d?e["_"+a]:(...f)=>la(a,b,c,f,d)};
|
||||
e.stringToNewUTF8=T;
|
||||
var S,ma,ka,V,W,z,na={e:()=>E(""),a:()=>{K=!1;L=0},b:function(a,b){a=-9007199254740992>a||9007199254740992<a?NaN:Number(a);a=new Date(1E3*a);C[b>>2]=a.getSeconds();C[b+4>>2]=a.getMinutes();C[b+8>>2]=a.getHours();C[b+12>>2]=a.getDate();C[b+16>>2]=a.getMonth();C[b+20>>2]=a.getFullYear()-1900;C[b+24>>2]=a.getDay();var c=a.getFullYear();C[b+28>>2]=(0!==c%4||0===c%100&&0!==c%400?ha:fa)[a.getMonth()]+a.getDate()-1|0;C[b+36>>2]=-(60*a.getTimezoneOffset());c=(new Date(a.getFullYear(),6,1)).getTimezoneOffset();
|
||||
var d=(new Date(a.getFullYear(),0,1)).getTimezoneOffset();C[b+32>>2]=(c!=d&&a.getTimezoneOffset()==Math.min(d,c))|0},i:(a,b)=>{M[a]&&(clearTimeout(M[a].id),delete M[a]);if(!b)return 0;var c=setTimeout(()=>{delete M[a];ia(()=>ma(a,performance.now()))},b);M[a]={id:c,A:b};return 0},c:(a,b,c,d)=>{var g=(new Date).getFullYear(),f=(new Date(g,0,1)).getTimezoneOffset();g=(new Date(g,6,1)).getTimezoneOffset();D[a>>2]=60*Math.max(f,g);C[b>>2]=Number(f!=g);b=p=>{var l=Math.abs(p);return`UTC${0<=p?"-":"+"}${String(Math.floor(l/
|
||||
60)).padStart(2,"0")}${String(l%60).padStart(2,"0")}`};a=b(f);b=b(g);g<f?(P(a,c,17),P(b,d,17)):(P(a,d,17),P(b,c,17))},g:U,f:function(a,b){a=Q(a);let c;try{c=window.JSON.parse(a)}catch(d){c=a}0!==b?window.alert(a):window.console.log("DUMP",c)},d:()=>Date.now(),j:a=>{var b=B.length;a>>>=0;if(2147483648<a)return!1;for(var c=1;4>=c;c*=2){var d=b*(1+.2/c);d=Math.min(d,a+100663296);a:{d=(Math.min(2147483648,65536*Math.ceil(Math.max(a,d)/65536))-z.buffer.byteLength+65535)/65536|0;try{z.grow(d);y();var g=
|
||||
1;break a}catch(f){}g=void 0}if(g)return!0}return!1},m:function(a){a=Q(a);window.console.log(a)},h:function(a){a=Q(a);return Date.parse(a)},l:function(a,b,c,d){a=Q(a);b=Q(b);c=Q(c);c=`Quickjs -- ${a}: ${b}\n${c}`;0!==d?window.alert(c):window.console.error(c)},k:O},Z;
|
||||
Z=await (async function(){function a(c){c=Z=c.exports;e._evalInSandbox=c.p;e._nukeSandbox=c.q;e._init=c.r;e._commFun=c.s;e._dumpMemoryUse=c.t;S=c.u;e._free=c.v;ma=c.w;ka=c.x;V=c.y;W=c.z;z=c.n;y();return Z}var b={a:na};if(e.instantiateWasm)return new Promise(c=>{e.instantiateWasm(b,(d,g)=>{c(a(d,g))})});F??=e.locateFile?e.locateFile?e.locateFile("quickjs-eval.wasm",h):h+"quickjs-eval.wasm":(new URL("quickjs-eval.wasm",import.meta.url)).href;return a((await da(b)).instance)}());
|
||||
(function(){function a(){e.calledRun=!0;if(!t){x=!0;Z.o();v?.(e);e.onRuntimeInitialized?.();if(e.postRun)for("function"==typeof e.postRun&&(e.postRun=[e.postRun]);e.postRun.length;){var b=e.postRun.shift();I.push(b)}H(I)}}if(e.preRun)for("function"==typeof e.preRun&&(e.preRun=[e.preRun]);e.preRun.length;)ea();H(J);e.setStatus?(e.setStatus("Running..."),setTimeout(()=>{setTimeout(()=>e.setStatus(""),1);a()},1)):a()})();x?moduleRtn=e:moduleRtn=new Promise((a,b)=>{v=a;w=b});
|
||||
var S,ma,ka,V,W,z,na={e:()=>E(""),a:()=>{K=!1;L=0},b:function(a,b){a=a<-9007199254740992||a>9007199254740992?NaN:Number(a);a=new Date(a*1E3);C[b>>2]=a.getSeconds();C[b+4>>2]=a.getMinutes();C[b+8>>2]=a.getHours();C[b+12>>2]=a.getDate();C[b+16>>2]=a.getMonth();C[b+20>>2]=a.getFullYear()-1900;C[b+24>>2]=a.getDay();var c=a.getFullYear();C[b+28>>2]=(c%4!==0||c%100===0&&c%400!==0?ha:fa)[a.getMonth()]+a.getDate()-1|0;C[b+36>>2]=-(a.getTimezoneOffset()*60);c=(new Date(a.getFullYear(),6,1)).getTimezoneOffset();
|
||||
var d=(new Date(a.getFullYear(),0,1)).getTimezoneOffset();C[b+32>>2]=(c!=d&&a.getTimezoneOffset()==Math.min(d,c))|0},i:(a,b)=>{M[a]&&(clearTimeout(M[a].id),delete M[a]);if(!b)return 0;var c=setTimeout(()=>{delete M[a];ia(()=>ma(a,performance.now()))},b);M[a]={id:c,A:b};return 0},c:(a,b,c,d)=>{var g=(new Date).getFullYear(),f=(new Date(g,0,1)).getTimezoneOffset();g=(new Date(g,6,1)).getTimezoneOffset();D[a>>2]=Math.max(f,g)*60;C[b>>2]=Number(f!=g);b=p=>{var l=Math.abs(p);return`UTC${p>=0?"-":"+"}${String(Math.floor(l/
|
||||
60)).padStart(2,"0")}${String(l%60).padStart(2,"0")}`};a=b(f);b=b(g);g<f?(P(a,c,17),P(b,d,17)):(P(a,d,17),P(b,c,17))},g:U,f:function(a,b){a=Q(a);try{var c=window.JSON.parse(a)}catch(d){c=a}b!==0?window.alert(a):window.console.log("DUMP",c)},d:()=>Date.now(),j:a=>{var b=B.length;a>>>=0;if(a>2147483648)return!1;for(var c=1;c<=4;c*=2){var d=b*(1+.2/c);d=Math.min(d,a+100663296);a:{d=(Math.min(2147483648,Math.ceil(Math.max(a,d)/65536)*65536)-z.buffer.byteLength+65535)/65536|0;try{z.grow(d);y();var g=1;
|
||||
break a}catch(f){}g=void 0}if(g)return!0}return!1},m:function(a){a=Q(a);window.console.log(a)},h:function(a){a=Q(a);return Date.parse(a)},l:function(a,b,c,d){a=Q(a);b=Q(b);c=Q(c);c=`Quickjs -- ${a}: ${b}\n${c}`;d!==0?window.alert(c):window.console.error(c)},k:O},Z;
|
||||
Z=await (async function(){function a(c){c=Z=c.exports;e._evalInSandbox=c.p;e._nukeSandbox=c.q;e._init=c.r;e._commFun=c.s;e._dumpMemoryUse=c.t;S=c.u;e._free=c.v;ma=c.w;ka=c.x;V=c.y;W=c.z;z=c.n;y();return Z}var b={a:na};if(e.instantiateWasm)return new Promise(c=>{e.instantiateWasm(b,(d,g)=>{c(a(d,g))})});F??=e.locateFile?e.locateFile?e.locateFile("quickjs-eval.wasm",h):h+"quickjs-eval.wasm":(new URL("quickjs-eval.wasm",import.meta.url)).href;return function(c){return a(c.instance)}(await da(b))}());
|
||||
(function(){function a(){e.calledRun=!0;if(!t){x=!0;Z.o();v?.(e);e.onRuntimeInitialized?.();if(e.postRun)for(typeof e.postRun=="function"&&(e.postRun=[e.postRun]);e.postRun.length;){var b=e.postRun.shift();I.push(b)}H(I)}}if(e.preRun)for(typeof e.preRun=="function"&&(e.preRun=[e.preRun]);e.preRun.length;)ea();H(J);e.setStatus?(e.setStatus("Running..."),setTimeout(()=>{setTimeout(()=>e.setStatus(""),1);a()},1)):a()})();x?moduleRtn=e:moduleRtn=new Promise((a,b)=>{v=a;w=b});
|
||||
;return moduleRtn}export default QuickJS;
|
||||
|
||||
BIN
external/quickjs/quickjs-eval.wasm
vendored
BIN
external/quickjs/quickjs-eval.wasm
vendored
Binary file not shown.
330
gulpfile.mjs
330
gulpfile.mjs
@ -13,7 +13,9 @@
|
||||
* limitations under the License.
|
||||
*/
|
||||
|
||||
import * as babel from "@babel/core";
|
||||
import {
|
||||
babelPluginAddHeaderComment,
|
||||
babelPluginPDFJSPreprocessor,
|
||||
babelPluginStripSrcPath,
|
||||
preprocessPDFJSCode,
|
||||
@ -24,7 +26,6 @@ import {
|
||||
} from "./external/ccov/coverage_format.mjs";
|
||||
import { exec, execSync, spawn, spawnSync } from "child_process";
|
||||
import autoprefixer from "autoprefixer";
|
||||
import babel from "@babel/core";
|
||||
import { buildPrefsSchema } from "./external/chromium/prefs.mjs";
|
||||
import crypto from "crypto";
|
||||
import { finished } from "stream/promises";
|
||||
@ -104,11 +105,11 @@ const AUTOPREFIXER_CONFIG = {
|
||||
// Default Babel targets used for generic, components, minified-pre
|
||||
const BABEL_TARGETS = ENV_TARGETS.join(", ");
|
||||
|
||||
const BABEL_PRESET_ENV_OPTS = Object.freeze({
|
||||
corejs: "3.49.0",
|
||||
const BABEL_COREJS_OPTS = Object.freeze({
|
||||
method: "usage-global",
|
||||
version: "3.49.0",
|
||||
exclude: ["web.structured-clone"],
|
||||
shippedProposals: true,
|
||||
useBuiltIns: "usage",
|
||||
});
|
||||
|
||||
const DEFINES = Object.freeze({
|
||||
@ -225,6 +226,8 @@ function createWebpackAlias(defines) {
|
||||
"web-print_service": "",
|
||||
"web-secondary_toolbar": "web/secondary_toolbar.js",
|
||||
"web-signature_manager": "web/signature_manager.js",
|
||||
"web-digital_signature_properties_manager":
|
||||
"web/digital_signature_properties_manager.js",
|
||||
"web-toolbar": "web/toolbar.js",
|
||||
"web-views_manager": "web/views_manager.js",
|
||||
};
|
||||
@ -325,9 +328,7 @@ function createWebpackConfig(
|
||||
/node_modules[\\/]core-js/,
|
||||
];
|
||||
|
||||
const babelPresets = skipBabel
|
||||
? undefined
|
||||
: [["@babel/preset-env", BABEL_PRESET_ENV_OPTS]];
|
||||
const babelPresets = skipBabel ? undefined : ["@babel/preset-env"];
|
||||
const babelPlugins = [
|
||||
[
|
||||
babelPluginPDFJSPreprocessor,
|
||||
@ -337,6 +338,9 @@ function createWebpackConfig(
|
||||
},
|
||||
],
|
||||
];
|
||||
if (!skipBabel) {
|
||||
babelPlugins.push(["babel-plugin-polyfill-corejs3", BABEL_COREJS_OPTS]);
|
||||
}
|
||||
if (bundleDefines.COVERAGE) {
|
||||
babelPlugins.push("babel-plugin-istanbul");
|
||||
}
|
||||
@ -789,36 +793,18 @@ function runTests(testsName, { bot = false } = {}) {
|
||||
args.push("--coveragePerTest");
|
||||
}
|
||||
|
||||
const codeArg = testsName === "browser" ? getArgValue("--code") : null;
|
||||
if (codeArg) {
|
||||
const coverageDir =
|
||||
getArgValue("--coverage-output") || BUILD_DIR + "coverage";
|
||||
const result = spawnSync(
|
||||
"node",
|
||||
[
|
||||
path.join(__dirname, "external/ccov/coverage_search.mjs"),
|
||||
`--code=${codeArg}`,
|
||||
`--coverage-dir=${coverageDir}`,
|
||||
],
|
||||
{ encoding: "utf8" }
|
||||
);
|
||||
if (result.status !== 0) {
|
||||
reject(new Error(result.stderr?.trim() || "coverage_search failed"));
|
||||
if (testsName === "browser") {
|
||||
let shouldRun;
|
||||
try {
|
||||
shouldRun = applyCodeTestFilter(args);
|
||||
} catch (error) {
|
||||
reject(error);
|
||||
return;
|
||||
}
|
||||
const testIds = result.stdout.trim().split("\n").filter(Boolean);
|
||||
if (testIds.length === 0) {
|
||||
console.log(`\n### No tests found covering "${codeArg}"`);
|
||||
if (!shouldRun) {
|
||||
resolve();
|
||||
return;
|
||||
}
|
||||
console.log(
|
||||
`\n### Found ${testIds.length} test(s) covering "${codeArg}":\n` +
|
||||
testIds.map(id => ` ${id}`).join("\n")
|
||||
);
|
||||
for (const id of testIds) {
|
||||
args.push(`-t=${id}`);
|
||||
}
|
||||
}
|
||||
|
||||
const testProcess = startNode(args, { cwd: TEST_DIR, stdio: "inherit" });
|
||||
@ -884,6 +870,136 @@ function collectArgs(options, args) {
|
||||
}
|
||||
}
|
||||
|
||||
// Builds the coverage_search command line. By default the published index is
|
||||
// downloaded; an explicit --index=<path> selects a local index instead, used
|
||||
// read-only so it's never overwritten by the published copy.
|
||||
function getCoverageSearchArgs(codeArg) {
|
||||
const searchArgs = [
|
||||
path.join(__dirname, "external/ccov/coverage_search.mjs"),
|
||||
`--code=${codeArg}`,
|
||||
];
|
||||
const indexArg = getArgValue("--index");
|
||||
if (indexArg === "") {
|
||||
// An explicit but empty value (e.g. an unset shell variable expanding to
|
||||
// `--index=`) almost certainly isn't intended; fail loudly rather than
|
||||
// silently falling back to the downloaded index.
|
||||
throw new Error("--index was given without a value");
|
||||
}
|
||||
if (indexArg) {
|
||||
searchArgs.push(`--index=${indexArg}`, "--no-download");
|
||||
} else if (process.argv.includes("--no-download")) {
|
||||
searchArgs.push("--no-download");
|
||||
}
|
||||
return searchArgs;
|
||||
}
|
||||
|
||||
// Returns the set of test IDs defined in the local ref-test manifest, or null
|
||||
// when it can't be read. Used to drop coverage-derived IDs that don't exist on
|
||||
// this branch (e.g. a test renamed since the published index was built), which
|
||||
// would otherwise make test.mjs reject the entire run.
|
||||
function readManifestTestIds() {
|
||||
try {
|
||||
const manifestFile = process.env.PDF_TEST || "test_manifest.json";
|
||||
const manifest = JSON.parse(
|
||||
fs.readFileSync(path.join(__dirname, TEST_DIR, manifestFile), "utf8")
|
||||
);
|
||||
return new Set(manifest.map(entry => entry.id));
|
||||
} catch {
|
||||
return null;
|
||||
}
|
||||
}
|
||||
|
||||
// For a --code=<file>::<line|function> argument, runs coverage_search to find
|
||||
// the ref tests that exercise that location and returns their IDs (an empty
|
||||
// array when none match locally). Returns null when --code wasn't given; throws
|
||||
// when the search itself fails.
|
||||
function resolveCodeTestIds() {
|
||||
const codeArg = getArgValue("--code");
|
||||
if (!codeArg) {
|
||||
return null;
|
||||
}
|
||||
// Inherit stderr so the index download progress is visible; stdout is
|
||||
// captured because it carries the matching test IDs.
|
||||
const result = spawnSync("node", getCoverageSearchArgs(codeArg), {
|
||||
encoding: "utf8",
|
||||
stdio: ["ignore", "pipe", "inherit"],
|
||||
});
|
||||
if (result.status !== 0) {
|
||||
// status is null when the child couldn't be spawned or was killed by a
|
||||
// signal; surface the real cause instead of a generic message.
|
||||
throw new Error(
|
||||
result.error
|
||||
? `coverage_search failed: ${result.error.message}`
|
||||
: `coverage_search failed (exit code ${result.status})`
|
||||
);
|
||||
}
|
||||
let testIds = result.stdout.trim().split("\n").filter(Boolean);
|
||||
|
||||
// The published index is built from master, so some covering tests may not
|
||||
// exist on this branch. Drop them (with a note) rather than letting test.mjs
|
||||
// reject the whole run — and silently exit 0 — on the first unknown ID.
|
||||
const knownIds = readManifestTestIds();
|
||||
if (knownIds) {
|
||||
const missing = testIds.filter(id => !knownIds.has(id));
|
||||
if (missing.length) {
|
||||
console.log(
|
||||
`\n### Ignoring ${missing.length} covered test(s) not in the manifest:\n` +
|
||||
missing.map(id => ` ${id}`).join("\n")
|
||||
);
|
||||
testIds = testIds.filter(id => knownIds.has(id));
|
||||
}
|
||||
}
|
||||
|
||||
if (testIds.length === 0) {
|
||||
console.log(`\n### No tests found covering "${codeArg}"`);
|
||||
} else {
|
||||
console.log(
|
||||
`\n### Found ${testIds.length} test(s) covering "${codeArg}":\n` +
|
||||
testIds.map(id => ` ${id}`).join("\n")
|
||||
);
|
||||
}
|
||||
return testIds;
|
||||
}
|
||||
|
||||
function appendTestFilters(args, testIds) {
|
||||
const existingIds = new Set();
|
||||
|
||||
// collectArgs always normalizes filters to the space-separated
|
||||
// `-t <id>` / `--testfilter <id>` form, so that's the only shape to read.
|
||||
for (let i = 0; i < args.length; i++) {
|
||||
if (args[i] === "-t" || args[i] === "--testfilter") {
|
||||
if (i + 1 < args.length) {
|
||||
existingIds.add(args[++i]);
|
||||
}
|
||||
}
|
||||
}
|
||||
for (const id of testIds) {
|
||||
if (!existingIds.has(id)) {
|
||||
// Pass the id as a separate argument: node's parseArgs parses the short
|
||||
// form `-t=<id>` as the literal value "=<id>", which matches no test and
|
||||
// aborts the run with "Unrecognized test IDs".
|
||||
args.push("-t", id);
|
||||
existingIds.add(id);
|
||||
}
|
||||
}
|
||||
}
|
||||
|
||||
// Applies the --code coverage filter to `args`. Returns false when the run
|
||||
// should be skipped (--code was given but resolved to no runnable tests), and
|
||||
// true otherwise (no --code, or matching tests were appended). Throws when the
|
||||
// coverage search itself fails.
|
||||
function applyCodeTestFilter(args) {
|
||||
const codeTestIds = resolveCodeTestIds();
|
||||
if (codeTestIds === null) {
|
||||
return true; // No --code argument; run normally.
|
||||
}
|
||||
if (codeTestIds.length === 0) {
|
||||
return false; // Nothing (runnable) covers the requested location.
|
||||
}
|
||||
appendTestFilters(args, codeTestIds);
|
||||
return true;
|
||||
}
|
||||
|
||||
function makeRef(done, bot) {
|
||||
console.log("\n### Creating reference images");
|
||||
|
||||
@ -932,6 +1048,18 @@ function makeRef(done, bot) {
|
||||
args
|
||||
);
|
||||
|
||||
let shouldRun;
|
||||
try {
|
||||
shouldRun = applyCodeTestFilter(args);
|
||||
} catch (error) {
|
||||
done(error);
|
||||
return;
|
||||
}
|
||||
if (!shouldRun) {
|
||||
done();
|
||||
return;
|
||||
}
|
||||
|
||||
const testProcess = startNode(args, { cwd: TEST_DIR, stdio: "inherit" });
|
||||
testProcess.on("close", function (code) {
|
||||
if (code !== 0) {
|
||||
@ -942,34 +1070,33 @@ function makeRef(done, bot) {
|
||||
});
|
||||
}
|
||||
|
||||
// Queries the per-test coverage index built by --coverage-per-test and prints
|
||||
// the IDs of tests that exercised a given source file location. Run with
|
||||
// --code=<file>::<line|function>, e.g. --code=canvas.js::205
|
||||
// Prints the IDs of tests that exercised a given source file location, using
|
||||
// the per-test coverage index published to the pdf.js.refs repository. The
|
||||
// index is downloaded on demand, cached locally, and only re-downloaded when
|
||||
// it has changed. Run with --code=<file>::<line|function>, e.g.
|
||||
// --code=canvas.js::205 (add --no-download to reuse the cached index offline).
|
||||
gulp.task("coverage_search", function (done) {
|
||||
const codeArg = getArgValue("--code");
|
||||
if (!codeArg) {
|
||||
done(new Error('Missing --code argument, e.g. --code="canvas.js::205"'));
|
||||
return;
|
||||
}
|
||||
const coverageDir =
|
||||
getArgValue("--coverage-output") || BUILD_DIR + "coverage";
|
||||
const result = spawnSync(
|
||||
"node",
|
||||
[
|
||||
path.join(__dirname, "external/ccov/coverage_search.mjs"),
|
||||
`--code=${codeArg}`,
|
||||
`--coverage-dir=${coverageDir}`,
|
||||
],
|
||||
{ encoding: "utf8", stdio: ["ignore", "pipe", "pipe"] }
|
||||
);
|
||||
if (result.stderr) {
|
||||
process.stderr.write(result.stderr);
|
||||
}
|
||||
if (result.stdout) {
|
||||
process.stdout.write(result.stdout);
|
||||
let searchArgs;
|
||||
try {
|
||||
searchArgs = getCoverageSearchArgs(codeArg);
|
||||
} catch (error) {
|
||||
done(error);
|
||||
return;
|
||||
}
|
||||
const result = spawnSync("node", searchArgs, { stdio: "inherit" });
|
||||
if (result.status !== 0) {
|
||||
done(new Error("coverage_search failed"));
|
||||
done(
|
||||
new Error(
|
||||
result.error
|
||||
? `coverage_search failed: ${result.error.message}`
|
||||
: `coverage_search failed (exit code ${result.status})`
|
||||
)
|
||||
);
|
||||
return;
|
||||
}
|
||||
done();
|
||||
@ -1030,10 +1157,7 @@ function createBuildNumber(done) {
|
||||
const version = config.versionPrefix + buildNumber;
|
||||
|
||||
exec('git log --format="%h" -n 1', function (err2, stdout2, stderr2) {
|
||||
let buildCommit = "";
|
||||
if (!err2) {
|
||||
buildCommit = stdout2.replace("\n", "");
|
||||
}
|
||||
const buildCommit = !err2 ? stdout2.replace("\n", "") : "";
|
||||
|
||||
createStringSource(
|
||||
"version.json",
|
||||
@ -1686,9 +1810,9 @@ function buildLibHelper(bundleDefines, inputStream, outputDir) {
|
||||
const licenseHeader = fs
|
||||
.readFileSync("./src/license_header.js")
|
||||
.toString()
|
||||
.split("\n")
|
||||
.slice(1, -2)
|
||||
.map(line => line.replace(/^\s*\*\s?/, ""));
|
||||
.trim()
|
||||
.replace(/^\/\*/, "")
|
||||
.replace(/\*\/$/, "");
|
||||
|
||||
const ctx = {
|
||||
rootPath: __dirname,
|
||||
@ -1728,6 +1852,9 @@ function buildLibHelper(bundleDefines, inputStream, outputDir) {
|
||||
[babelPluginPDFJSPreprocessor, ctx],
|
||||
[babelPluginStripSrcPath],
|
||||
];
|
||||
if (!skipBabel) {
|
||||
plugins.push(["babel-plugin-polyfill-corejs3", BABEL_COREJS_OPTS]);
|
||||
}
|
||||
if (enableCoverage) {
|
||||
plugins.push([
|
||||
"babel-plugin-istanbul",
|
||||
@ -1737,28 +1864,16 @@ function buildLibHelper(bundleDefines, inputStream, outputDir) {
|
||||
},
|
||||
]);
|
||||
}
|
||||
plugins.push([
|
||||
"add-header-comment",
|
||||
{
|
||||
header: licenseHeader,
|
||||
},
|
||||
]);
|
||||
plugins.push([babelPluginAddHeaderComment, { header: licenseHeader }]);
|
||||
|
||||
const result = babel.transform(file.contents.toString(), {
|
||||
const result = babel.transformSync(file.contents.toString(), {
|
||||
...(enableCoverage && {
|
||||
filename: file.path,
|
||||
babelrc: false,
|
||||
configFile: false,
|
||||
}),
|
||||
sourceType: "module",
|
||||
presets: skipBabel
|
||||
? undefined
|
||||
: [
|
||||
[
|
||||
"@babel/preset-env",
|
||||
{ ...BABEL_PRESET_ENV_OPTS, loose: false, modules: false },
|
||||
],
|
||||
],
|
||||
presets: skipBabel ? undefined : ["@babel/preset-env"],
|
||||
plugins,
|
||||
targets: BABEL_TARGETS,
|
||||
sourceMaps: enableSourceMaps,
|
||||
@ -2399,6 +2514,71 @@ gulp.task("lint-chmod", function (done) {
|
||||
done();
|
||||
});
|
||||
|
||||
gulp.task("lint-bom", async function () {
|
||||
console.log("\n### Checking for UTF-8 byte order marks");
|
||||
|
||||
// Cover untracked-but-not-ignored files too, so a BOM in a freshly created
|
||||
// file is caught before `git add`.
|
||||
const files = execSync("git ls-files -coz --exclude-standard", {
|
||||
encoding: "utf8",
|
||||
maxBuffer: 1 << 28,
|
||||
})
|
||||
.split("\0")
|
||||
.filter(Boolean);
|
||||
|
||||
// Only the first three bytes matter: a leading EF BB BF is a UTF-8 BOM.
|
||||
async function hasBOM(file) {
|
||||
let handle;
|
||||
try {
|
||||
handle = await fs.promises.open(file, "r");
|
||||
} catch {
|
||||
return false; // Directory, broken symlink, removed file, etc.
|
||||
}
|
||||
try {
|
||||
const { bytesRead, buffer } = await handle.read(Buffer.alloc(3), 0, 3, 0);
|
||||
return (
|
||||
bytesRead === 3 &&
|
||||
buffer[0] === 0xef &&
|
||||
buffer[1] === 0xbb &&
|
||||
buffer[2] === 0xbf
|
||||
);
|
||||
} finally {
|
||||
await handle.close();
|
||||
}
|
||||
}
|
||||
|
||||
// Don't exhaust file descriptors.
|
||||
const offenders = [];
|
||||
for (let i = 0; i < files.length; i += 256) {
|
||||
const chunk = files.slice(i, i + 256);
|
||||
const flags = await Promise.all(chunk.map(hasBOM));
|
||||
chunk.forEach((file, j) => flags[j] && offenders.push(file));
|
||||
}
|
||||
offenders.sort();
|
||||
|
||||
if (offenders.length === 0) {
|
||||
console.log("files checked, no errors found");
|
||||
return;
|
||||
}
|
||||
|
||||
if (!process.argv.includes("--fix")) {
|
||||
for (const file of offenders) {
|
||||
console.log(` Unexpected byte order mark: ${file}`);
|
||||
}
|
||||
throw new Error("BOM check failed (run `gulp lint-bom --fix` to clear).");
|
||||
}
|
||||
|
||||
// Strip the BOM on disk and let the user stage the change.
|
||||
await Promise.all(
|
||||
offenders.map(async file => {
|
||||
const content = await fs.promises.readFile(file);
|
||||
await fs.promises.writeFile(file, content.subarray(3));
|
||||
console.log(` removed byte order mark: ${file}`);
|
||||
})
|
||||
);
|
||||
console.log(`done: ${offenders.length} file(s) updated`);
|
||||
});
|
||||
|
||||
gulp.task("lint", function (done) {
|
||||
console.log("\n### Linting JS/CSS/JSON/SVG/HTML files");
|
||||
|
||||
@ -2463,7 +2643,7 @@ gulp.task("lint", function (done) {
|
||||
return;
|
||||
}
|
||||
|
||||
gulp.series("lint-licenses", "lint-chmod")(done);
|
||||
gulp.series("lint-licenses", "lint-chmod", "lint-bom")(done);
|
||||
});
|
||||
});
|
||||
|
||||
|
||||
@ -153,6 +153,19 @@ pdfjs-document-properties-linearized = العرض السريع عبر الوِب
|
||||
pdfjs-document-properties-linearized-yes = نعم
|
||||
pdfjs-document-properties-linearized-no = لا
|
||||
pdfjs-document-properties-close-button = أغلق
|
||||
pdfjs-digital-signature-properties-view-certificate = اعرض الشهادة
|
||||
# Shown beneath an invalid signature card to explain why verification
|
||||
# failed. The text comes from NSS (e.g. "Signature integrity has been
|
||||
# compromised", "PKCS#7 signature could not be parsed") and is not
|
||||
# itself localized — it is the underlying error message produced by
|
||||
# the verification backend.
|
||||
# Variables:
|
||||
# $reason (String) - error message describing why the signature
|
||||
# could not be verified.
|
||||
pdfjs-digital-signature-properties-reason = السبب: { $reason }
|
||||
# Variables:
|
||||
# $dateObj (Date) - the signing time from the /Sig dict's /M entry.
|
||||
pdfjs-digital-signature-properties-timestamp = الطابع الزمني: { DATETIME($dateObj, dateStyle: "short", timeStyle: "medium") }
|
||||
|
||||
## Print
|
||||
|
||||
@ -764,6 +777,49 @@ pdfjs-views-manager-waiting-for-file = يرفع ملف…
|
||||
pdfjs-toggle-views-manager-button1 =
|
||||
.title = أدِر الصفحات
|
||||
|
||||
## Digital signature properties (signature verification panel)
|
||||
|
||||
pdfjs-digital-signature-properties-button =
|
||||
.title = خصائص التوقيع الرقمي
|
||||
.aria-label = خصائص التوقيع الرقمي
|
||||
pdfjs-digital-signature-properties-button-label = خصائص التوقيع الرقمي
|
||||
|
||||
## Banner shown above the signature list summarising the overall
|
||||
## verification state of the document. Each variant is selected by the
|
||||
## viewer based on the worst per-signature status; one signature is
|
||||
## enough to lower the banner.
|
||||
##
|
||||
## Variables:
|
||||
## $count (Number) - number of signatures at the worst level.
|
||||
|
||||
pdfjs-digital-signature-properties-banner-verified = وقِّع المستند بتوقيع رقمي صالح
|
||||
|
||||
## Per-signature status row. Only three distinct strings are needed:
|
||||
## the signature crypto either verified (the cert chain may still be
|
||||
## untrusted/expired/revoked, but that's surfaced on the cert row
|
||||
## below), or it failed, or its sub-format isn't supported.
|
||||
|
||||
pdfjs-digital-signature-properties-status-verified = الحالة: تحققَ من التوقيع
|
||||
pdfjs-digital-signature-properties-status-invalid = الحالة: التوقيع غير صالح
|
||||
pdfjs-digital-signature-properties-status-unknown = الحالة: تعذّر التحقق (غير مدعوم)
|
||||
|
||||
## Per-signature certificate row. The variants with an issuer / date in
|
||||
## parentheses embed fully-localized context — no English fall-through.
|
||||
##
|
||||
## Variables:
|
||||
## $issuer (String) - issuer or subject common name from the cert.
|
||||
## $dateObj (Date) - notAfter date for the expired-with-date form.
|
||||
|
||||
pdfjs-digital-signature-properties-certificate-trusted = الشهادة: موثوقة ({ $issuer })
|
||||
pdfjs-digital-signature-properties-certificate-unknown = الشهادة: غير متوفرة
|
||||
pdfjs-digital-signature-properties-certificate-untrusted = الشهادة: غير موثوقة
|
||||
pdfjs-digital-signature-properties-certificate-untrusted-unknown-issuer = الشهادة: جهة إصدار مجهولة ({ $issuer })
|
||||
pdfjs-digital-signature-properties-certificate-untrusted-self-signed = الشهادة: موقعّة ذاتيًا ({ $issuer })
|
||||
pdfjs-digital-signature-properties-certificate-untrusted-untrusted-issuer = الشهادة: جهة إصدار مجهولة ({ $issuer })
|
||||
pdfjs-digital-signature-properties-certificate-expired = الشهادة: منتهية الصلاحية
|
||||
pdfjs-digital-signature-properties-certificate-expired-with-date = الشهادة: منتهية الصلاحية ({ DATETIME($dateObj, dateStyle: "medium") })
|
||||
pdfjs-digital-signature-properties-certificate-revoked = الشهادة: مُلغاة
|
||||
|
||||
## Main menu for adding/removing signatures
|
||||
|
||||
pdfjs-editor-delete-signature-button1 =
|
||||
|
||||
@ -153,6 +153,28 @@ pdfjs-document-properties-linearized = Хуткі прагляд у Інтэрн
|
||||
pdfjs-document-properties-linearized-yes = Так
|
||||
pdfjs-document-properties-linearized-no = Не
|
||||
pdfjs-document-properties-close-button = Закрыць
|
||||
pdfjs-digital-signature-properties-view-certificate = Паказаць сертыфікат
|
||||
# Shown beneath an invalid signature card to explain why verification
|
||||
# failed. The text comes from NSS (e.g. "Signature integrity has been
|
||||
# compromised", "PKCS#7 signature could not be parsed") and is not
|
||||
# itself localized — it is the underlying error message produced by
|
||||
# the verification backend.
|
||||
# Variables:
|
||||
# $reason (String) - error message describing why the signature
|
||||
# could not be verified.
|
||||
pdfjs-digital-signature-properties-reason = Прычына: { $reason }
|
||||
# Variables:
|
||||
# $dateObj (Date) - the signing time from the /Sig dict's /M entry.
|
||||
pdfjs-digital-signature-properties-timestamp = Адзнака часу: { DATETIME($dateObj, dateStyle: "short", timeStyle: "medium") }
|
||||
# Variables:
|
||||
# $count (Number) - number of nested sub-signatures (one per earlier
|
||||
# incremental revision of the document).
|
||||
pdfjs-digital-signature-properties-sub-signatures =
|
||||
{ $count ->
|
||||
[one] Дадатковы подпіс ({ $count })
|
||||
[few] Дадатковыя подпісы ({ $count })
|
||||
*[many] Дадатковыя подпісы ({ $count })
|
||||
}
|
||||
|
||||
## Print
|
||||
|
||||
@ -740,6 +762,79 @@ pdfjs-views-manager-waiting-for-file = Зацягваецца файл…
|
||||
pdfjs-toggle-views-manager-button1 =
|
||||
.title = Кіраванне старонкамі
|
||||
|
||||
## Digital signature properties (signature verification panel)
|
||||
|
||||
pdfjs-digital-signature-properties-button =
|
||||
.title = Уласцівасці лічбавага подпісу
|
||||
.aria-label = Уласцівасці лічбавага подпісу
|
||||
pdfjs-digital-signature-properties-button-label = Уласцівасці лічбавага подпісу
|
||||
|
||||
## Banner shown above the signature list summarising the overall
|
||||
## verification state of the document. Each variant is selected by the
|
||||
## viewer based on the worst per-signature status; one signature is
|
||||
## enough to lower the banner.
|
||||
##
|
||||
## Variables:
|
||||
## $count (Number) - number of signatures at the worst level.
|
||||
|
||||
pdfjs-digital-signature-properties-banner-verified = Дакумент быў падпісаны сапраўдным лічбавым подпісам
|
||||
pdfjs-digital-signature-properties-banner-unknown =
|
||||
{ $count ->
|
||||
[one] Дакумент падпісаны, але { $count } лічбавы подпіс не ўдалося праверыць
|
||||
[few] Дакумент падпісаны, але { $count } лічбавыя подпісы не ўдалося праверыць
|
||||
*[many] Дакумент падпісаны, але { $count } лічбавых подпісаў не ўдалося праверыць
|
||||
}
|
||||
pdfjs-digital-signature-properties-banner-untrusted =
|
||||
{ $count ->
|
||||
[one] Дакумент падпісаны { $count } недавераным сертыфікатам
|
||||
[few] Дакумент падпісаны { $count } недаверанымі сертыфікатамі
|
||||
*[many] Дакумент падпісаны { $count } недаверанымі сертыфікатамі
|
||||
}
|
||||
pdfjs-digital-signature-properties-banner-expired =
|
||||
{ $count ->
|
||||
[one] Дакумент падпісаны { $count } пратэрмінаваным сертыфікатам
|
||||
[few] Дакумент падпісаны { $count } пратэрмінаванымі сертыфікатамі
|
||||
*[many] Дакумент падпісаны { $count } пратэрмінаванымі сертыфікатамі
|
||||
}
|
||||
pdfjs-digital-signature-properties-banner-invalid =
|
||||
{ $count ->
|
||||
[one] Дакумент мае { $count } нядзейсны лічбавы подпіс
|
||||
[few] Дакумент мае { $count } нядзейсныя лічбавыя подпісы
|
||||
*[many] Дакумент мае { $count } нядзейсных лічбавых подпісаў
|
||||
}
|
||||
pdfjs-digital-signature-properties-banner-revoked =
|
||||
{ $count ->
|
||||
[one] Дакумент падпісаны { $count } адкліканым сертыфікатам
|
||||
[few] Дакумент падпісаны { $count } адкліканымі сертыфікатамі
|
||||
*[many] Дакумент падпісаны { $count } адкліканымі сертыфікатамі
|
||||
}
|
||||
|
||||
## Per-signature status row. Only three distinct strings are needed:
|
||||
## the signature crypto either verified (the cert chain may still be
|
||||
## untrusted/expired/revoked, but that's surfaced on the cert row
|
||||
## below), or it failed, or its sub-format isn't supported.
|
||||
|
||||
pdfjs-digital-signature-properties-status-verified = Статус: Подпіс правераны
|
||||
pdfjs-digital-signature-properties-status-invalid = Статус: Подпіс нядзейсны
|
||||
pdfjs-digital-signature-properties-status-unknown = Статус: Немагчыма праверыць (не падтрымліваецца)
|
||||
|
||||
## Per-signature certificate row. The variants with an issuer / date in
|
||||
## parentheses embed fully-localized context — no English fall-through.
|
||||
##
|
||||
## Variables:
|
||||
## $issuer (String) - issuer or subject common name from the cert.
|
||||
## $dateObj (Date) - notAfter date for the expired-with-date form.
|
||||
|
||||
pdfjs-digital-signature-properties-certificate-trusted = Сертыфікат: Давераны ({ $issuer })
|
||||
pdfjs-digital-signature-properties-certificate-unknown = Сертыфікат: Недаступны
|
||||
pdfjs-digital-signature-properties-certificate-untrusted = Сертыфікат: Недавераны
|
||||
pdfjs-digital-signature-properties-certificate-untrusted-unknown-issuer = Сертыфікат: Невядомы выдавец ({ $issuer })
|
||||
pdfjs-digital-signature-properties-certificate-untrusted-self-signed = Сертыфікат: Самападпісаны ({ $issuer })
|
||||
pdfjs-digital-signature-properties-certificate-untrusted-untrusted-issuer = Сертыфікат: Недавераны выдавец ({ $issuer })
|
||||
pdfjs-digital-signature-properties-certificate-expired = Сертыфікат: Пратэрмінаваны
|
||||
pdfjs-digital-signature-properties-certificate-expired-with-date = Сертыфікат: Пратэрмінаваны ({ DATETIME($dateObj, dateStyle: "medium") })
|
||||
pdfjs-digital-signature-properties-certificate-revoked = Сертыфікат: Адкліканы
|
||||
|
||||
## Main menu for adding/removing signatures
|
||||
|
||||
pdfjs-editor-delete-signature-button1 =
|
||||
|
||||
@ -386,3 +386,16 @@ pdfjs-editor-new-alt-text-not-now-button = Не сега
|
||||
## Image alt-text settings
|
||||
|
||||
pdfjs-editor-alt-text-settings-delete-model-button = Изтриване
|
||||
|
||||
## Controls
|
||||
|
||||
pdfjs-editor-add-signature-image-upload-error-description = Проверете мрежовата си връзка или опитайте с друго изображение.
|
||||
|
||||
## Per-signature certificate row. The variants with an issuer / date in
|
||||
## parentheses embed fully-localized context — no English fall-through.
|
||||
##
|
||||
## Variables:
|
||||
## $issuer (String) - issuer or subject common name from the cert.
|
||||
## $dateObj (Date) - notAfter date for the expired-with-date form.
|
||||
|
||||
pdfjs-digital-signature-properties-certificate-expired = Сертификат: с изтекъл срок на валидност
|
||||
|
||||
@ -5,18 +5,194 @@
|
||||
|
||||
## Main toolbar buttons (tooltips and alt text for images)
|
||||
|
||||
pdfjs-previous-button =
|
||||
.title = بلگه دیندایی
|
||||
pdfjs-previous-button-label = دیندایی
|
||||
pdfjs-next-button =
|
||||
.title = بلگه نیایی
|
||||
pdfjs-next-button-label = بئڌی
|
||||
# .title: Tooltip for the pageNumber input.
|
||||
pdfjs-page-input =
|
||||
.title = بلگه
|
||||
# Variables:
|
||||
# $pagesCount (Number) - the total number of pages in the document
|
||||
# This string follows an input field with the number of the page currently displayed.
|
||||
pdfjs-of-pages = ز { $pagesCount }
|
||||
# Variables:
|
||||
# $pageNumber (Number) - the currently visible page
|
||||
# $pagesCount (Number) - the total number of pages in the document
|
||||
pdfjs-page-of-pages = ({ $pageNumber } ز { $pagesCount })
|
||||
pdfjs-zoom-out-button =
|
||||
.title = کۊچیر نمایی
|
||||
pdfjs-zoom-out-button-label = کۊچیر نمایی
|
||||
pdfjs-zoom-in-button =
|
||||
.title = گپ نمایی
|
||||
pdfjs-zoom-in-button-label = گپ نمایی
|
||||
pdfjs-zoom-select =
|
||||
.title = زۊم کردن
|
||||
pdfjs-open-file-button =
|
||||
.title = گۊشیڌن فایل
|
||||
pdfjs-open-file-button-label = گۊشیڌن
|
||||
pdfjs-print-button =
|
||||
.title = چاپ
|
||||
pdfjs-print-button-label = چاپ
|
||||
pdfjs-save-button =
|
||||
.title = زفت
|
||||
pdfjs-save-button-label = زفت
|
||||
# Used in Firefox for Android as a tooltip for the download button (“download” is a verb).
|
||||
pdfjs-download-button =
|
||||
.title = دانلود
|
||||
# Used in Firefox for Android as a label for the download button (“download” is a verb).
|
||||
# Length of the translation matters since we are in a mobile context, with limited screen estate.
|
||||
pdfjs-download-button-label = دانلود
|
||||
pdfjs-bookmark-button-label = بلگه هیم سکویی
|
||||
|
||||
## Secondary toolbar and context menu
|
||||
|
||||
pdfjs-tools-button =
|
||||
.title = ٱوزارا
|
||||
pdfjs-tools-button-label = ٱوزارا
|
||||
pdfjs-first-page-button =
|
||||
.title = رئڌن و بلگه نیایی
|
||||
pdfjs-first-page-button-label = رئڌن و بلگه نیایی
|
||||
pdfjs-last-page-button =
|
||||
.title = رئڌن و بلگه دیندایی
|
||||
pdfjs-last-page-button-label = رئڌن و بلگه دیندایی
|
||||
pdfjs-page-rotate-cw-button =
|
||||
.title = لر خردن ساعتگرد
|
||||
pdfjs-page-rotate-cw-button-label = لر خردن ساعتگرد
|
||||
pdfjs-page-rotate-ccw-button =
|
||||
.title = لر خردن پاد ساعتگرد
|
||||
pdfjs-page-rotate-ccw-button-label = لر خردن پاد ساعتگرد
|
||||
pdfjs-cursor-text-select-tool-button =
|
||||
.title = فعال کردن ٱوزار پسند هؽل
|
||||
pdfjs-cursor-text-select-tool-button-label = ٱوزار پسند هؽل
|
||||
pdfjs-cursor-hand-tool-button =
|
||||
.title = فعال کردن ٱوزار دست
|
||||
pdfjs-cursor-hand-tool-button-label = ٱوزار دست
|
||||
pdfjs-scroll-page-button =
|
||||
.title = و کار گرؽڌن اسکرۊل بلگه
|
||||
pdfjs-scroll-page-button-label = اسکرۊل بلگه
|
||||
pdfjs-scroll-vertical-button =
|
||||
.title = و کار گرؽڌن اسکرۊل عمۊدی
|
||||
pdfjs-scroll-vertical-button-label = اسکرۊل عمۊدی
|
||||
pdfjs-scroll-horizontal-button =
|
||||
.title = و کار گرؽڌن اسکرۊل اوفوقی
|
||||
pdfjs-scroll-horizontal-button-label = اسکرۊل اوفوقی
|
||||
pdfjs-scroll-wrapped-button =
|
||||
.title = و کار گرؽڌن اسکرۊل پؽچسته
|
||||
pdfjs-scroll-wrapped-button-label = اسکرۊل پؽچسته
|
||||
|
||||
## Document properties dialog
|
||||
|
||||
pdfjs-document-properties-button =
|
||||
.title = خۊسۊسیات سند…
|
||||
pdfjs-document-properties-button-label = خۊسۊسیات سند…
|
||||
pdfjs-document-properties-file-name = نوم فایل:
|
||||
pdfjs-document-properties-file-size = هندا فایل:
|
||||
pdfjs-document-properties-title = عونوان:
|
||||
pdfjs-document-properties-author = هؽل کوݩ:
|
||||
pdfjs-document-properties-subject = سرتال:
|
||||
pdfjs-document-properties-creation-date = تاریخ وورکل وابیڌن:
|
||||
pdfjs-document-properties-modification-date = تاریخ آلشتکاری:
|
||||
# Variables:
|
||||
# $dateObj (Date) - the creation/modification date and time of the PDF file
|
||||
pdfjs-document-properties-date-time-string = { DATETIME($dateObj, dateStyle: "short", timeStyle: "medium") }
|
||||
pdfjs-document-properties-creator = وورکل کون:
|
||||
pdfjs-document-properties-producer = وورکل کون PDF:
|
||||
pdfjs-document-properties-version = نوسخه PDF:
|
||||
pdfjs-document-properties-page-count = تئداد بلگه یل:
|
||||
pdfjs-document-properties-page-size = هندا بلگه:
|
||||
pdfjs-document-properties-page-size-unit-inches = اینچ
|
||||
pdfjs-document-properties-page-size-unit-millimeters = میلی متر
|
||||
pdfjs-document-properties-page-size-orientation-portrait = portrait
|
||||
pdfjs-document-properties-page-size-orientation-landscape = landscape
|
||||
pdfjs-document-properties-page-size-name-a-three = A3
|
||||
pdfjs-document-properties-page-size-name-a-four = A4
|
||||
pdfjs-document-properties-page-size-name-letter = نامه
|
||||
pdfjs-document-properties-page-size-name-legal = هۊقۊقی
|
||||
|
||||
## Variables:
|
||||
## $width (Number) - the width of the (current) page
|
||||
## $height (Number) - the height of the (current) page
|
||||
## $unit (String) - the unit of measurement of the (current) page
|
||||
## $name (String) - the name of the (current) page
|
||||
## $orientation (String) - the orientation of the (current) page
|
||||
|
||||
pdfjs-document-properties-page-size-dimension-string = { $width } × { $height } { $unit } ({ $orientation })
|
||||
pdfjs-document-properties-page-size-dimension-name-string = { $width } × { $height } { $unit } ({ $name }, { $orientation })
|
||||
|
||||
##
|
||||
|
||||
# The linearization status of the document; usually called "Fast Web View" in
|
||||
# English locales of Adobe software.
|
||||
pdfjs-document-properties-linearized = نیشتن زل وب:
|
||||
pdfjs-document-properties-linearized-yes = هری
|
||||
pdfjs-document-properties-linearized-no = ن
|
||||
pdfjs-document-properties-close-button = بستن
|
||||
|
||||
## Print
|
||||
|
||||
pdfjs-print-progress-message = ٱماڌه کردن سند سی چاپ کردن…
|
||||
# Variables:
|
||||
# $progress (Number) - percent value
|
||||
pdfjs-print-progress-percent = { $progress }%
|
||||
pdfjs-print-progress-close-button = لقو
|
||||
|
||||
## Tooltips and alt text for side panel toolbar buttons
|
||||
|
||||
pdfjs-toggle-sidebar-button =
|
||||
.title = آلشت هالت نوار کلی
|
||||
pdfjs-toggle-sidebar-button-label = آلشت هالت نوار کلی
|
||||
pdfjs-document-outline-button-label = تئر سند
|
||||
pdfjs-attachments-button =
|
||||
.title = نشووݩ داڌن پیوستا
|
||||
pdfjs-attachments-button-label = پیوستا
|
||||
pdfjs-layers-button-label = لایه یل
|
||||
pdfjs-thumbs-button =
|
||||
.title = نشووݩ داڌن شؽواتا کۊچیر
|
||||
pdfjs-thumbs-button-label = شؽواتا کۊچیر
|
||||
pdfjs-findbar-button =
|
||||
.title = جوستن من سند
|
||||
pdfjs-findbar-button-label = جوستن
|
||||
pdfjs-additional-layers = لایه یل ازافه
|
||||
|
||||
## Thumbnails panel item (tooltip and alt text for images)
|
||||
|
||||
# Variables:
|
||||
# $page (Number) - the page number
|
||||
pdfjs-thumb-page-title =
|
||||
.title = بلگه { $page }
|
||||
|
||||
## Find panel button title and messages
|
||||
|
||||
pdfjs-find-previous-button-label = دیندایی
|
||||
pdfjs-find-next-button-label = بئڌی
|
||||
pdfjs-find-highlight-checkbox = هایلایت کردن پوی
|
||||
|
||||
## Predefined zoom values
|
||||
|
||||
pdfjs-page-scale-width = پئنا بلگه
|
||||
pdfjs-page-scale-fit = هندا کردن بلگه
|
||||
pdfjs-page-scale-auto = زۊم کردن خوتکار
|
||||
pdfjs-page-scale-actual = هندا واقعی
|
||||
# Variables:
|
||||
# $scale (Number) - percent value for page scale
|
||||
pdfjs-page-scale-percent = { $scale }%
|
||||
|
||||
## PDF page
|
||||
|
||||
# Variables:
|
||||
# $page (Number) - the page number
|
||||
pdfjs-page-landmark =
|
||||
.aria-label = بلگه { $page }
|
||||
|
||||
## Annotations
|
||||
|
||||
# Variables:
|
||||
# $dateObj (Date) - the modification date and time of the annotation
|
||||
pdfjs-annotation-date-time-string = { DATETIME($dateObj, dateStyle: "short", timeStyle: "medium") }
|
||||
|
||||
## Password
|
||||
|
||||
pdfjs-password-ok-button = خا
|
||||
@ -24,6 +200,12 @@ pdfjs-password-cancel-button = لقو
|
||||
|
||||
## Editing
|
||||
|
||||
pdfjs-editor-free-text-button =
|
||||
.title = هؽل
|
||||
pdfjs-editor-free-text-button-label = هؽل
|
||||
pdfjs-editor-ink-button =
|
||||
.title = کشیڌن
|
||||
pdfjs-editor-ink-button-label = کشیڌن
|
||||
pdfjs-editor-stamp-button =
|
||||
.title = ٱووردن یا آلشت شؽواتا
|
||||
pdfjs-editor-stamp-button-label = ٱووردن یا آلشت شؽواتا
|
||||
@ -35,6 +217,14 @@ pdfjs-editor-stamp-editor =
|
||||
|
||||
##
|
||||
|
||||
# Editor Parameters
|
||||
pdfjs-editor-free-text-color-input = رنگ
|
||||
pdfjs-editor-free-text-size-input = هندا
|
||||
pdfjs-editor-ink-color-input = رنگ
|
||||
pdfjs-editor-ink-thickness-input = کۊلۊفتی
|
||||
pdfjs-editor-ink-opacity-input = کر بیڌن
|
||||
# This refers to the thickness of the line used for free highlighting (not bound to text)
|
||||
pdfjs-editor-free-highlight-thickness-input = کۊلۊفتی
|
||||
# .default-content is used as a placeholder in an empty text editor.
|
||||
pdfjs-free-text2 =
|
||||
.aria-label = آلشتگر هؽل
|
||||
@ -44,15 +234,55 @@ pdfjs-editor-comments-sidebar-no-comments-link = قلوه دووسته بۊین
|
||||
## Alt-text dialog
|
||||
|
||||
pdfjs-editor-alt-text-cancel-button = لقو
|
||||
pdfjs-editor-alt-text-save-button = زفت
|
||||
|
||||
## Color picker
|
||||
|
||||
pdfjs-editor-colorpicker-yellow =
|
||||
.title = هیل
|
||||
pdfjs-editor-colorpicker-green =
|
||||
.title = ساوز
|
||||
pdfjs-editor-colorpicker-blue =
|
||||
.title = کوۊ
|
||||
pdfjs-editor-colorpicker-pink =
|
||||
.title = آل
|
||||
pdfjs-editor-colorpicker-red =
|
||||
.title = سوئر
|
||||
|
||||
## Show all highlights
|
||||
## This is a toggle button to show/hide all the highlights.
|
||||
|
||||
pdfjs-editor-highlight-show-all-button-label = نشووݩ داڌن پوی
|
||||
pdfjs-editor-highlight-show-all-button =
|
||||
.title = نشووݩ داڌن پوی
|
||||
|
||||
## New alt-text dialog
|
||||
## Group note for entire feature: Alternative text (alt text) helps when people can't see the image. This feature includes a tool to create alt text automatically using an AI model that works locally on the user's device to preserve privacy.
|
||||
|
||||
pdfjs-editor-new-alt-text-disclaimer-learn-more-url = قلوه دووسته بۊین
|
||||
pdfjs-editor-new-alt-text-not-now-button = سکو ن
|
||||
pdfjs-editor-new-alt-text-error-close-button = بستن
|
||||
|
||||
## "Annotations removed" bar
|
||||
|
||||
pdfjs-editor-undo-bar-undo-button-label = وورگندن
|
||||
pdfjs-editor-undo-bar-close-button =
|
||||
.title = بستن
|
||||
pdfjs-editor-undo-bar-close-button-label = بستن
|
||||
|
||||
## Tab panels
|
||||
|
||||
pdfjs-editor-add-signature-draw-thickness-range-label = کۊلۊفتی
|
||||
|
||||
## Controls
|
||||
|
||||
pdfjs-editor-add-signature-error-close-button = بستن
|
||||
|
||||
## Dialog buttons
|
||||
|
||||
pdfjs-editor-add-signature-cancel-button = لقو
|
||||
pdfjs-editor-add-signature-add-button = ٱووردن
|
||||
pdfjs-editor-edit-signature-update-button = ورۊ رسۊوی
|
||||
|
||||
## Comment popup
|
||||
|
||||
@ -64,4 +294,32 @@ pdfjs-editor-edit-comment-popup-button =
|
||||
|
||||
# An existing comment is edited
|
||||
pdfjs-editor-edit-comment-dialog-title-when-editing = آلشت منشڌ
|
||||
pdfjs-editor-edit-comment-dialog-save-button-when-editing = ورۊ رسۊوی
|
||||
pdfjs-editor-edit-comment-dialog-save-button-when-adding = ٱووردن
|
||||
pdfjs-editor-edit-comment-dialog-text-input =
|
||||
.placeholder = ناهاڌن پا هؽل کردن…
|
||||
pdfjs-editor-edit-comment-dialog-cancel-button = لقو
|
||||
|
||||
## The view manager is a sidebar displaying different views:
|
||||
## - thumbnails;
|
||||
## - outline;
|
||||
## - attachments;
|
||||
## - layers.
|
||||
## The thumbnails view is used to edit the pdf: remove/insert pages, ...
|
||||
|
||||
pdfjs-views-manager-sidebar =
|
||||
.aria-label = نوار کلی
|
||||
pdfjs-views-manager-layers-option-label = لایه یل
|
||||
pdfjs-views-manager-pages-status-action-button-label = دؽوۉداری
|
||||
pdfjs-views-manager-pages-status-copy-button-label = لف گیری
|
||||
pdfjs-views-manager-pages-status-cut-button-label = بۊریڌن
|
||||
pdfjs-views-manager-pages-status-delete-button-label = پاک کردن
|
||||
pdfjs-views-manager-status-undo-button-label = وورگندن
|
||||
pdfjs-views-manager-status-done-button-label = ٱنجوم وابی
|
||||
pdfjs-views-manager-status-close-button =
|
||||
.title = بستن
|
||||
pdfjs-views-manager-status-close-button-label = بستن
|
||||
pdfjs-views-manager-paste-button-label = جا وندن
|
||||
# Badge used to promote a new feature in the UI, keep it as short as possible.
|
||||
# It's spelled uppercase for English, but it can be translated as usual.
|
||||
pdfjs-new-badge-content = نۊ
|
||||
|
||||
@ -153,6 +153,29 @@ pdfjs-document-properties-linearized = Rychlé zobrazování z webu:
|
||||
pdfjs-document-properties-linearized-yes = Ano
|
||||
pdfjs-document-properties-linearized-no = Ne
|
||||
pdfjs-document-properties-close-button = Zavřít
|
||||
pdfjs-digital-signature-properties-view-certificate = Zobrazit certifikát
|
||||
# Shown beneath an invalid signature card to explain why verification
|
||||
# failed. The text comes from NSS (e.g. "Signature integrity has been
|
||||
# compromised", "PKCS#7 signature could not be parsed") and is not
|
||||
# itself localized — it is the underlying error message produced by
|
||||
# the verification backend.
|
||||
# Variables:
|
||||
# $reason (String) - error message describing why the signature
|
||||
# could not be verified.
|
||||
pdfjs-digital-signature-properties-reason = Důvod: { $reason }
|
||||
# Variables:
|
||||
# $dateObj (Date) - the signing time from the /Sig dict's /M entry.
|
||||
pdfjs-digital-signature-properties-timestamp = Časové razítko: { DATETIME($dateObj, dateStyle: "short", timeStyle: "medium") }
|
||||
# Variables:
|
||||
# $count (Number) - number of nested sub-signatures (one per earlier
|
||||
# incremental revision of the document).
|
||||
pdfjs-digital-signature-properties-sub-signatures =
|
||||
{ $count ->
|
||||
[one] Podpis ({ $count })
|
||||
[few] Podpisy ({ $count })
|
||||
[many] Podpisy ({ $count })
|
||||
*[other] Podpisy ({ $count })
|
||||
}
|
||||
|
||||
## Print
|
||||
|
||||
@ -748,6 +771,84 @@ pdfjs-views-manager-waiting-for-file = Nahrávání souboru…
|
||||
pdfjs-toggle-views-manager-button1 =
|
||||
.title = Spravovat strany
|
||||
|
||||
## Digital signature properties (signature verification panel)
|
||||
|
||||
pdfjs-digital-signature-properties-button =
|
||||
.title = Vlastnosti digitálního podpisu
|
||||
.aria-label = Vlastnosti digitálního podpisu
|
||||
pdfjs-digital-signature-properties-button-label = Vlastnosti digitálního podpisu
|
||||
|
||||
## Banner shown above the signature list summarising the overall
|
||||
## verification state of the document. Each variant is selected by the
|
||||
## viewer based on the worst per-signature status; one signature is
|
||||
## enough to lower the banner.
|
||||
##
|
||||
## Variables:
|
||||
## $count (Number) - number of signatures at the worst level.
|
||||
|
||||
pdfjs-digital-signature-properties-banner-verified = Dokument byl podepsán platným digitálním podpisem
|
||||
pdfjs-digital-signature-properties-banner-unknown =
|
||||
{ $count ->
|
||||
[one] Dokument je podepsán, ale { $count } elektronický podpis se nepodařilo ověřit
|
||||
[few] Dokument je podepsán, ale { $count } elektronické podpisy se nepodařilo ověřit
|
||||
[many] Dokument je podepsán, ale { $count } elektronických podpisů se nepodařilo ověřit
|
||||
*[other] Dokument je podepsán, ale { $count } elektronických podpisů se nepodařilo ověřit
|
||||
}
|
||||
pdfjs-digital-signature-properties-banner-untrusted =
|
||||
{ $count ->
|
||||
[one] Dokument podepsaný { $count } certifikátem, který není důvěryhodný
|
||||
[few] Dokument podepsaný { $count } certifikáty, které nejsou důvěryhodné
|
||||
[many] Dokument podepsaný { $count } certifikáty, které nejsou důvěryhodné
|
||||
*[other] Dokument podepsaný { $count } certifikáty, které nejsou důvěryhodné
|
||||
}
|
||||
pdfjs-digital-signature-properties-banner-expired =
|
||||
{ $count ->
|
||||
[one] Dokument je podepsaný { $count } prošlým certifikátem
|
||||
[few] Dokument je podepsaný { $count } prošlými certifikáty
|
||||
[many] Dokument je podepsaný { $count } prošlými certifikáty
|
||||
*[other] Dokument je podepsaný { $count } prošlými certifikáty
|
||||
}
|
||||
pdfjs-digital-signature-properties-banner-invalid =
|
||||
{ $count ->
|
||||
[one] Dokument má { $count } neplatný elektronický podpis
|
||||
[few] Dokument má { $count } neplatné elektronické podpisy
|
||||
[many] Dokument má { $count } neplatných elektronických podpisů
|
||||
*[other] Dokument má { $count } neplatných elektronických podpisů
|
||||
}
|
||||
pdfjs-digital-signature-properties-banner-revoked =
|
||||
{ $count ->
|
||||
[one] Dokument je podepsaný { $count } zneplatněným certifikátem
|
||||
[few] Dokument je podepsaný { $count } zneplatněnými certifikáty
|
||||
[many] Dokument je podepsaný { $count } zneplatněnými certifikáty
|
||||
*[other] Dokument je podepsaný { $count } zneplatněnými certifikáty
|
||||
}
|
||||
|
||||
## Per-signature status row. Only three distinct strings are needed:
|
||||
## the signature crypto either verified (the cert chain may still be
|
||||
## untrusted/expired/revoked, but that's surfaced on the cert row
|
||||
## below), or it failed, or its sub-format isn't supported.
|
||||
|
||||
pdfjs-digital-signature-properties-status-verified = Stav: Podpis ověřen
|
||||
pdfjs-digital-signature-properties-status-invalid = Stav: Podpis je neplatný
|
||||
pdfjs-digital-signature-properties-status-unknown = Stav: Nelze ověřit (nepodporováno)
|
||||
|
||||
## Per-signature certificate row. The variants with an issuer / date in
|
||||
## parentheses embed fully-localized context — no English fall-through.
|
||||
##
|
||||
## Variables:
|
||||
## $issuer (String) - issuer or subject common name from the cert.
|
||||
## $dateObj (Date) - notAfter date for the expired-with-date form.
|
||||
|
||||
pdfjs-digital-signature-properties-certificate-trusted = Certifikát: Důvěryhodný ({ $issuer })
|
||||
pdfjs-digital-signature-properties-certificate-unknown = Certifikát: nedostupný
|
||||
pdfjs-digital-signature-properties-certificate-untrusted = Certifikát: nedůvěryhodný
|
||||
pdfjs-digital-signature-properties-certificate-untrusted-unknown-issuer = Certifikát: Neznámý vydavatel ({ $issuer })
|
||||
pdfjs-digital-signature-properties-certificate-untrusted-self-signed = Certifikát: Self-signed ({ $issuer })
|
||||
pdfjs-digital-signature-properties-certificate-untrusted-untrusted-issuer = Certifikát: Nedůvěryhodný vydavatel ({ $issuer })
|
||||
pdfjs-digital-signature-properties-certificate-expired = Certifikát: vypršel
|
||||
pdfjs-digital-signature-properties-certificate-expired-with-date = Certifikát: Vypršel ({ DATETIME($dateObj, dateStyle: "medium") })
|
||||
pdfjs-digital-signature-properties-certificate-revoked = Certifikát: zneplatněn
|
||||
|
||||
## Main menu for adding/removing signatures
|
||||
|
||||
pdfjs-editor-delete-signature-button1 =
|
||||
|
||||
@ -153,6 +153,31 @@ pdfjs-document-properties-linearized = Golwg Gwe Cyflym:
|
||||
pdfjs-document-properties-linearized-yes = Iawn
|
||||
pdfjs-document-properties-linearized-no = Na
|
||||
pdfjs-document-properties-close-button = Cau
|
||||
pdfjs-digital-signature-properties-view-certificate = Gweld tystysgrif
|
||||
# Shown beneath an invalid signature card to explain why verification
|
||||
# failed. The text comes from NSS (e.g. "Signature integrity has been
|
||||
# compromised", "PKCS#7 signature could not be parsed") and is not
|
||||
# itself localized — it is the underlying error message produced by
|
||||
# the verification backend.
|
||||
# Variables:
|
||||
# $reason (String) - error message describing why the signature
|
||||
# could not be verified.
|
||||
pdfjs-digital-signature-properties-reason = Rheswm: { $reason }
|
||||
# Variables:
|
||||
# $dateObj (Date) - the signing time from the /Sig dict's /M entry.
|
||||
pdfjs-digital-signature-properties-timestamp = Stamp amser: { DATETIME($dateObj, dateStyle: "short", timeStyle: "medium") }
|
||||
# Variables:
|
||||
# $count (Number) - number of nested sub-signatures (one per earlier
|
||||
# incremental revision of the document).
|
||||
pdfjs-digital-signature-properties-sub-signatures =
|
||||
{ $count ->
|
||||
[zero] Is-lofnodion ( { $count } )
|
||||
[one] Is-lofnodion ( { $count } )
|
||||
[two] Is-lofnodion ( { $count } )
|
||||
[few] Is-lofnodion ( { $count } )
|
||||
[many] Is-lofnodion ( { $count } )
|
||||
*[other] Is-lofnodion ( { $count } )
|
||||
}
|
||||
|
||||
## Print
|
||||
|
||||
@ -764,6 +789,94 @@ pdfjs-views-manager-waiting-for-file = Yn llwytho ffeil i fyny…
|
||||
pdfjs-toggle-views-manager-button1 =
|
||||
.title = Rheoli tudalennau
|
||||
|
||||
## Digital signature properties (signature verification panel)
|
||||
|
||||
pdfjs-digital-signature-properties-button =
|
||||
.title = Priodweddau llofnod digidol
|
||||
.aria-label = Priodweddau llofnod digidol
|
||||
pdfjs-digital-signature-properties-button-label = Priodweddau llofnod digidol
|
||||
|
||||
## Banner shown above the signature list summarising the overall
|
||||
## verification state of the document. Each variant is selected by the
|
||||
## viewer based on the worst per-signature status; one signature is
|
||||
## enough to lower the banner.
|
||||
##
|
||||
## Variables:
|
||||
## $count (Number) - number of signatures at the worst level.
|
||||
|
||||
pdfjs-digital-signature-properties-banner-verified = Llofnodwyd y ddogfen gyda llofnod digidol dilys
|
||||
pdfjs-digital-signature-properties-banner-unknown =
|
||||
{ $count ->
|
||||
[zero] Llofnodwyd y ddogfen ond doedd dim modd dilysu { $count } llofnod digidol
|
||||
[one] Llofnodwyd y ddogfen ond doedd dim modd dilysu { $count } llofnod digidol
|
||||
[two] Llofnodwyd y ddogfen ond doedd dim modd dilysu { $count } llofnod digidol
|
||||
[few] Llofnodwyd y ddogfen ond doedd dim modd dilysu { $count } llofnod digidol
|
||||
[many] Llofnodwyd y ddogfen ond doedd dim modd dilysu { $count } llofnod digidol
|
||||
*[other] Llofnodwyd y ddogfen ond doedd dim modd dilysu { $count } llofnod digidol
|
||||
}
|
||||
pdfjs-digital-signature-properties-banner-untrusted =
|
||||
{ $count ->
|
||||
[zero] Dogfen wedi'i llofnodi â { $count } thystysgrif does dim modd ymddiried ynddyn nhw
|
||||
[one] Dogfen wedi'i llofnodi â { $count } thystysgrif does dim modd ymddiried ynddi
|
||||
[two] Dogfen wedi'i llofnodi â { $count } thystysgrifau does dim modd ymddiried ynddyn nhw
|
||||
[few] Dogfen wedi'i llofnodi â { $count } thystysgrifau does dim modd ymddiried ynddyn nhw
|
||||
[many] Dogfen wedi'i llofnodi â { $count } thystysgrifau does dim modd ymddiried ynddyn nhw
|
||||
*[other] Dogfen wedi'i llofnodi â { $count } thystysgrifau does dim modd ymddiried ynddyn nhw
|
||||
}
|
||||
pdfjs-digital-signature-properties-banner-expired =
|
||||
{ $count ->
|
||||
[zero] Dogfen wedi'i llofnodi gyda { $count } tystysgrifau sydd wedi dod i ben
|
||||
[one] Dogfen wedi'i llofnodi gydag { $count } dystysgrif sydd wedi dod i ben
|
||||
[two] Dogfen wedi'i llofnodi gyda { $count } dystysgrif sydd wedi dod i ben
|
||||
[few] Dogfen wedi'i llofnodi gyda { $count } tystysgrif sydd wedi dod i ben
|
||||
[many] Dogfen wedi'i llofnodi gyda { $count } thystysgrif sydd wedi dod i ben
|
||||
*[other] Dogfen wedi'i llofnodi gyda { $count } tystysgrif sydd wedi dod i ben
|
||||
}
|
||||
pdfjs-digital-signature-properties-banner-invalid =
|
||||
{ $count ->
|
||||
[zero] Mae gan y ddogfen { $count } llofnodion digidol annilys
|
||||
[one] Mae gan y ddogfen { $count } llofnod digidol annilys
|
||||
[two] Mae gan y ddogfen { $count } llofnod digidol annilys
|
||||
[few] Mae gan y ddogfen { $count } llofnod digidol annilys
|
||||
[many] Mae gan y ddogfen { $count } llofnod digidol annilys
|
||||
*[other] Mae gan y ddogfen { $count } llofnod digidol annilys
|
||||
}
|
||||
pdfjs-digital-signature-properties-banner-revoked =
|
||||
{ $count ->
|
||||
[zero] Dogfen wedi'i llofnodi gyda { $count } tystysgrifau wedi'u dirymu
|
||||
[one] Dogfen wedi'i llofnodi gyda { $count } tystysgrif wedi'u dirymu
|
||||
[two] Dogfen wedi'i llofnodi gyda { $count } tystysgrif wedi'u dirymu
|
||||
[few] Dogfen wedi'i llofnodi gyda { $count } tystysgrif wedi'u dirymu
|
||||
[many] Dogfen wedi'i llofnodi gyda { $count } thystysgrif wedi'u dirymu
|
||||
*[other] Dogfen wedi'i llofnodi gyda { $count } tystysgrif wedi'u dirymu
|
||||
}
|
||||
|
||||
## Per-signature status row. Only three distinct strings are needed:
|
||||
## the signature crypto either verified (the cert chain may still be
|
||||
## untrusted/expired/revoked, but that's surfaced on the cert row
|
||||
## below), or it failed, or its sub-format isn't supported.
|
||||
|
||||
pdfjs-digital-signature-properties-status-verified = Statws: Llofnod wedi'i ddilysu
|
||||
pdfjs-digital-signature-properties-status-invalid = Statws: Llofnod annilys
|
||||
pdfjs-digital-signature-properties-status-unknown = Statws: Methu dilysu (heb ei gefnogi)
|
||||
|
||||
## Per-signature certificate row. The variants with an issuer / date in
|
||||
## parentheses embed fully-localized context — no English fall-through.
|
||||
##
|
||||
## Variables:
|
||||
## $issuer (String) - issuer or subject common name from the cert.
|
||||
## $dateObj (Date) - notAfter date for the expired-with-date form.
|
||||
|
||||
pdfjs-digital-signature-properties-certificate-trusted = Tystysgrif: Wedi ymddiried ( { $issuer })
|
||||
pdfjs-digital-signature-properties-certificate-unknown = Tystysgrif: Ddim ar gael
|
||||
pdfjs-digital-signature-properties-certificate-untrusted = Tystysgrif: Dim ymddiriedaeth
|
||||
pdfjs-digital-signature-properties-certificate-untrusted-unknown-issuer = Tystysgrif: Cyhoeddwr anhysbys ( { $issuer })
|
||||
pdfjs-digital-signature-properties-certificate-untrusted-self-signed = Tystysgrif: Hunan-lofnod ( { $issuer })
|
||||
pdfjs-digital-signature-properties-certificate-untrusted-untrusted-issuer = Tystysgrif: Cyhoeddwr heb ymddiriedaeth ( { $issuer })
|
||||
pdfjs-digital-signature-properties-certificate-expired = Tystysgrif: Wedi dod i ben
|
||||
pdfjs-digital-signature-properties-certificate-expired-with-date = Tystysgrif: Wedi dod i ben ({ DATETIME($dateObj, dateStyle: "medium") })
|
||||
pdfjs-digital-signature-properties-certificate-revoked = Tystysgrif: Wedi'i ddirymu
|
||||
|
||||
## Main menu for adding/removing signatures
|
||||
|
||||
pdfjs-editor-delete-signature-button1 =
|
||||
|
||||
@ -660,7 +660,10 @@ pdfjs-views-manager-view-selector-button =
|
||||
pdfjs-views-manager-view-selector-button-label = Visninger
|
||||
pdfjs-views-manager-pages-title = Sider
|
||||
pdfjs-views-manager-attachments-title = Vedhæftede filer
|
||||
pdfjs-views-manager-layers-title1 = Lag
|
||||
.title = Lag (dobbeltklik for at nulstille alle lag til standard-tilstanden)
|
||||
pdfjs-views-manager-pages-option-label = Sider
|
||||
pdfjs-views-manager-outlines-option-label = Dokument-disposition
|
||||
pdfjs-views-manager-attachments-option-label = Vedhæftede filer
|
||||
pdfjs-views-manager-layers-option-label = Lag
|
||||
pdfjs-views-manager-add-file-button =
|
||||
@ -678,6 +681,7 @@ pdfjs-views-manager-pages-status-action-button-label = Håndter
|
||||
pdfjs-views-manager-pages-status-copy-button-label = Kopier
|
||||
pdfjs-views-manager-pages-status-cut-button-label = Klip
|
||||
pdfjs-views-manager-pages-status-delete-button-label = Slet
|
||||
pdfjs-views-manager-pages-status-export-selected-button-label = Eksporter valgte…
|
||||
# Variables:
|
||||
# $count (Number) - the number of selected pages to be cut.
|
||||
pdfjs-views-manager-status-undo-cut-label =
|
||||
@ -699,6 +703,8 @@ pdfjs-views-manager-pages-status-undo-delete-label =
|
||||
[one] 1 side slettet
|
||||
*[other] { $count } sider slettet
|
||||
}
|
||||
pdfjs-views-manager-pages-status-waiting-ready-label = Gør din fil klar…
|
||||
pdfjs-views-manager-pages-status-waiting-uploading-label = Uploader fil…
|
||||
pdfjs-views-manager-status-undo-button-label = Fortryd
|
||||
pdfjs-views-manager-status-done-button-label = Færdig
|
||||
pdfjs-views-manager-status-close-button =
|
||||
@ -711,6 +717,10 @@ pdfjs-views-manager-paste-button-before =
|
||||
# $page (Number) - the page number after which the paste button is.
|
||||
pdfjs-views-manager-paste-button-after =
|
||||
.title = Indsæt efter side { $page }
|
||||
# Badge used to promote a new feature in the UI, keep it as short as possible.
|
||||
# It's spelled uppercase for English, but it can be translated as usual.
|
||||
pdfjs-new-badge-content = NY
|
||||
pdfjs-views-manager-waiting-for-file = Uploader fil…
|
||||
pdfjs-toggle-views-manager-button1 =
|
||||
.title = Håndter sider
|
||||
|
||||
|
||||
@ -67,8 +67,8 @@ pdfjs-page-rotate-cw-button =
|
||||
.title = Im Uhrzeigersinn drehen
|
||||
pdfjs-page-rotate-cw-button-label = Im Uhrzeigersinn drehen
|
||||
pdfjs-page-rotate-ccw-button =
|
||||
.title = Gegen Uhrzeigersinn drehen
|
||||
pdfjs-page-rotate-ccw-button-label = Gegen Uhrzeigersinn drehen
|
||||
.title = Gegen den Uhrzeigersinn drehen
|
||||
pdfjs-page-rotate-ccw-button-label = Gegen den Uhrzeigersinn drehen
|
||||
pdfjs-cursor-text-select-tool-button =
|
||||
.title = Textauswahl-Werkzeug aktivieren
|
||||
pdfjs-cursor-text-select-tool-button-label = Textauswahl-Werkzeug
|
||||
@ -153,6 +153,27 @@ pdfjs-document-properties-linearized = Schnelle Webanzeige:
|
||||
pdfjs-document-properties-linearized-yes = Ja
|
||||
pdfjs-document-properties-linearized-no = Nein
|
||||
pdfjs-document-properties-close-button = Schließen
|
||||
pdfjs-digital-signature-properties-view-certificate = Zertifikat ansehen
|
||||
# Shown beneath an invalid signature card to explain why verification
|
||||
# failed. The text comes from NSS (e.g. "Signature integrity has been
|
||||
# compromised", "PKCS#7 signature could not be parsed") and is not
|
||||
# itself localized — it is the underlying error message produced by
|
||||
# the verification backend.
|
||||
# Variables:
|
||||
# $reason (String) - error message describing why the signature
|
||||
# could not be verified.
|
||||
pdfjs-digital-signature-properties-reason = Grund: { $reason }
|
||||
# Variables:
|
||||
# $dateObj (Date) - the signing time from the /Sig dict's /M entry.
|
||||
pdfjs-digital-signature-properties-timestamp = Zeitstempel: { DATETIME($dateObj, dateStyle: "short", timeStyle: "medium") }
|
||||
# Variables:
|
||||
# $count (Number) - number of nested sub-signatures (one per earlier
|
||||
# incremental revision of the document).
|
||||
pdfjs-digital-signature-properties-sub-signatures =
|
||||
{ $count ->
|
||||
[one] ({ $count }) Untersignatur
|
||||
*[other] ({ $count }) Untersignaturen
|
||||
}
|
||||
|
||||
## Print
|
||||
|
||||
@ -278,7 +299,7 @@ pdfjs-rendering-error = Beim Darstellen der Seite trat ein Fehler auf.
|
||||
# (32000-1:2008 Table 169 – Annotation types).
|
||||
# Some common types are e.g.: "Check", "Text", "Comment", "Note"
|
||||
pdfjs-text-annotation-type =
|
||||
.alt = [Anlage: { $type }]
|
||||
.alt = [{ $type } Anmerkung]
|
||||
# Variables:
|
||||
# $dateObj (Date) - the modification date and time of the annotation
|
||||
pdfjs-annotation-date-time-string = { DATETIME($dateObj, dateStyle: "short", timeStyle: "medium") }
|
||||
@ -605,7 +626,7 @@ pdfjs-editor-add-signature-save-checkbox = Unterschrift speichern
|
||||
pdfjs-editor-add-signature-save-warning-message = Sie haben die Grenze von 5 gespeicherten Unterschriften erreicht. Entfernen Sie eine, um weitere zu speichern.
|
||||
pdfjs-editor-add-signature-image-upload-error-title = Grafik konnte nicht hochgeladen werden
|
||||
pdfjs-editor-add-signature-image-upload-error-description = Überprüfen Sie Ihre Netzwerkverbindung, oder versuchen Sie es mit einer anderen Grafik.
|
||||
pdfjs-editor-add-signature-image-no-data-error-title = Kann Grafik nicht in eine Signatur umwandeln
|
||||
pdfjs-editor-add-signature-image-no-data-error-title = Kann Grafik nicht in eine Unterschrift umwandeln
|
||||
pdfjs-editor-add-signature-image-no-data-error-description = Bitte versuchen Sie, eine andere Grafik hochzuladen.
|
||||
pdfjs-editor-add-signature-error-close-button = Schließen
|
||||
|
||||
@ -709,9 +730,9 @@ pdfjs-views-manager-pages-status-undo-delete-label =
|
||||
}
|
||||
pdfjs-views-manager-pages-status-waiting-ready-label = Ihre Datei wird vorbereitet…
|
||||
pdfjs-views-manager-pages-status-waiting-uploading-label = Datei wird hochgeladen…
|
||||
pdfjs-views-manager-status-warning-cut-label = Ausschneiden war nicht möglich. Aktualisieren Sie die Seite und versuchen Sie es erneut.
|
||||
pdfjs-views-manager-status-warning-cut-label = Ausschneiden nicht möglich. Aktualisieren Sie die Seite und versuchen Sie es erneut.
|
||||
pdfjs-views-manager-status-warning-copy-label = Kopieren nicht möglich. Aktualisieren Sie die Seite und versuchen Sie es erneut.
|
||||
pdfjs-views-manager-status-warning-delete-label = Löschen war nicht möglich. Aktualisieren Sie die Seite und versuchen Sie es erneut.
|
||||
pdfjs-views-manager-status-warning-delete-label = Löschen nicht möglich. Aktualisieren Sie die Seite und versuchen Sie es erneut.
|
||||
pdfjs-views-manager-status-warning-save-label = Speichern nicht möglich. Aktualisieren Sie die Seite und versuchen Sie es erneut.
|
||||
pdfjs-views-manager-status-undo-button-label = Rückgängig
|
||||
pdfjs-views-manager-status-done-button-label = Fertig
|
||||
@ -732,11 +753,79 @@ pdfjs-views-manager-waiting-for-file = Datei wird hochgeladen…
|
||||
pdfjs-toggle-views-manager-button1 =
|
||||
.title = Seiten verwalten
|
||||
|
||||
## Digital signature properties (signature verification panel)
|
||||
|
||||
pdfjs-digital-signature-properties-button =
|
||||
.title = Eigenschaften digitaler Signatur
|
||||
.aria-label = Eigenschaften digitaler Signatur
|
||||
pdfjs-digital-signature-properties-button-label = Eigenschaften digitaler Signatur
|
||||
|
||||
## Banner shown above the signature list summarising the overall
|
||||
## verification state of the document. Each variant is selected by the
|
||||
## viewer based on the worst per-signature status; one signature is
|
||||
## enough to lower the banner.
|
||||
##
|
||||
## Variables:
|
||||
## $count (Number) - number of signatures at the worst level.
|
||||
|
||||
pdfjs-digital-signature-properties-banner-verified = Dokument wurde mit einer gültigen digitalen Signatur signiert
|
||||
pdfjs-digital-signature-properties-banner-unknown =
|
||||
{ $count ->
|
||||
[one] Dokument signiert, aber { $count } digitale Signatur konnte nicht verifiziert werden
|
||||
*[other] Dokument signiert, aber { $count } digitale Signaturen konnten nicht verifiziert werden
|
||||
}
|
||||
pdfjs-digital-signature-properties-banner-untrusted =
|
||||
{ $count ->
|
||||
[one] Dokument mit { $count } Zertifikat signiert, das nicht vertrauenswürdig ist
|
||||
*[other] Dokument mit { $count } Zertifikaten signiert, die nicht vertrauenswürdig sind
|
||||
}
|
||||
pdfjs-digital-signature-properties-banner-expired =
|
||||
{ $count ->
|
||||
[one] Dokument mit { $count } abgelaufenen Zertifikat signiert
|
||||
*[other] Dokument mit { $count } abgelaufenen Zertifikaten signiert
|
||||
}
|
||||
pdfjs-digital-signature-properties-banner-invalid =
|
||||
{ $count ->
|
||||
[one] Dokument hat { $count } ungültige digitale Signatur
|
||||
*[other] Dokument hat { $count } ungültige digitale Signaturen
|
||||
}
|
||||
pdfjs-digital-signature-properties-banner-revoked =
|
||||
{ $count ->
|
||||
[one] Dokument mit { $count } gesperrten Zertifikat signiert
|
||||
*[other] Dokument mit { $count } gesperrten Zertifikaten signiert
|
||||
}
|
||||
|
||||
## Per-signature status row. Only three distinct strings are needed:
|
||||
## the signature crypto either verified (the cert chain may still be
|
||||
## untrusted/expired/revoked, but that's surfaced on the cert row
|
||||
## below), or it failed, or its sub-format isn't supported.
|
||||
|
||||
pdfjs-digital-signature-properties-status-verified = Status: Signatur überprüft
|
||||
pdfjs-digital-signature-properties-status-invalid = Status: Signatur ungültig
|
||||
pdfjs-digital-signature-properties-status-unknown = Status: Verifizieren nicht möglich (nicht unterstützt)
|
||||
|
||||
## Per-signature certificate row. The variants with an issuer / date in
|
||||
## parentheses embed fully-localized context — no English fall-through.
|
||||
##
|
||||
## Variables:
|
||||
## $issuer (String) - issuer or subject common name from the cert.
|
||||
## $dateObj (Date) - notAfter date for the expired-with-date form.
|
||||
|
||||
pdfjs-digital-signature-properties-certificate-trusted = Zertifikat: Vertrauenswürdig ({ $issuer })
|
||||
pdfjs-digital-signature-properties-certificate-unknown = Zertifikat: Nicht verfügbar
|
||||
pdfjs-digital-signature-properties-certificate-untrusted = Zertifikat: Nicht vertrauenswürdig
|
||||
pdfjs-digital-signature-properties-certificate-untrusted-unknown-issuer = Zertifikat: Unbekannter Aussteller ({ $issuer })
|
||||
pdfjs-digital-signature-properties-certificate-untrusted-self-signed = Zertifikat: Selbstsigniert ({ $issuer })
|
||||
pdfjs-digital-signature-properties-certificate-untrusted-untrusted-issuer = Zertifikat: Nicht vertrauenswürdiger Aussteller ({ $issuer })
|
||||
pdfjs-digital-signature-properties-certificate-expired = Zertifikat: Abgelaufen
|
||||
pdfjs-digital-signature-properties-certificate-expired-with-date = Zertifikat: Abgelaufen ({ DATETIME($dateObj, dateStyle: "medium") })
|
||||
pdfjs-digital-signature-properties-certificate-revoked = Zertifikat: Widerrufen
|
||||
|
||||
## Main menu for adding/removing signatures
|
||||
|
||||
pdfjs-editor-delete-signature-button1 =
|
||||
.title = Gespeicherte Signatur entfernen
|
||||
pdfjs-editor-delete-signature-button-label1 = Gespeicherte Signatur entfernen
|
||||
.title = Gespeicherte Unterschrift entfernen
|
||||
pdfjs-editor-delete-signature-button-label1 = Gespeicherte Unterschrift entfernen
|
||||
|
||||
## Editor toolbar
|
||||
|
||||
|
||||
@ -153,6 +153,29 @@ pdfjs-document-properties-linearized = Fast Web View:
|
||||
pdfjs-document-properties-linearized-yes = Jo
|
||||
pdfjs-document-properties-linearized-no = Ně
|
||||
pdfjs-document-properties-close-button = Zacyniś
|
||||
pdfjs-digital-signature-properties-view-certificate = Certifikat pokazaś
|
||||
# Shown beneath an invalid signature card to explain why verification
|
||||
# failed. The text comes from NSS (e.g. "Signature integrity has been
|
||||
# compromised", "PKCS#7 signature could not be parsed") and is not
|
||||
# itself localized — it is the underlying error message produced by
|
||||
# the verification backend.
|
||||
# Variables:
|
||||
# $reason (String) - error message describing why the signature
|
||||
# could not be verified.
|
||||
pdfjs-digital-signature-properties-reason = Pśicyna: { $reason }
|
||||
# Variables:
|
||||
# $dateObj (Date) - the signing time from the /Sig dict's /M entry.
|
||||
pdfjs-digital-signature-properties-timestamp = Casowy kołk: { DATETIME($dateObj, dateStyle: "short", timeStyle: "medium") }
|
||||
# Variables:
|
||||
# $count (Number) - number of nested sub-signatures (one per earlier
|
||||
# incremental revision of the document).
|
||||
pdfjs-digital-signature-properties-sub-signatures =
|
||||
{ $count ->
|
||||
[one] { $count } pódsignatura
|
||||
[two] { $count } pódsignaturje
|
||||
[few] { $count } pódsignatury
|
||||
*[other] { $count } pódsignaturow
|
||||
}
|
||||
|
||||
## Print
|
||||
|
||||
@ -748,6 +771,84 @@ pdfjs-views-manager-waiting-for-file = Dataja se nagrawa…
|
||||
pdfjs-toggle-views-manager-button1 =
|
||||
.title = Boki zastojaś
|
||||
|
||||
## Digital signature properties (signature verification panel)
|
||||
|
||||
pdfjs-digital-signature-properties-button =
|
||||
.title = Kakosći digitalneje signatury
|
||||
.aria-label = Kakosći digitalneje signatury
|
||||
pdfjs-digital-signature-properties-button-label = Kakosći digitalneje signatury
|
||||
|
||||
## Banner shown above the signature list summarising the overall
|
||||
## verification state of the document. Each variant is selected by the
|
||||
## viewer based on the worst per-signature status; one signature is
|
||||
## enough to lower the banner.
|
||||
##
|
||||
## Variables:
|
||||
## $count (Number) - number of signatures at the worst level.
|
||||
|
||||
pdfjs-digital-signature-properties-banner-verified = Dokument jo se signěrował z płaśiweju digitalneju signaturu
|
||||
pdfjs-digital-signature-properties-banner-unknown =
|
||||
{ $count ->
|
||||
[one] Dokument jo se signěrował, ale { $count } digitalna signatura njedajo se wobkšuśiś
|
||||
[two] Dokument jo se signěrował, ale { $count } digitalnej signaturje njedajotej se wobkšuśiś
|
||||
[few] Dokument jo se signěrował, ale { $count } digitalne signatury njedaju se wobkšuśiś
|
||||
*[other] Dokument jo se signěrował, ale { $count } digitalnych signaturow njedajo se wobkšuśiś
|
||||
}
|
||||
pdfjs-digital-signature-properties-banner-untrusted =
|
||||
{ $count ->
|
||||
[one] Dokument jo z { $count } certifikatom signěrowany, kótaryž njejo dowěry gódny
|
||||
[two] Dokument jo z { $count } certifikatoma signěrowany, kótarejž njejstej dowěry gódnej
|
||||
[few] Dokument jo z { $count } certifikatami signěrowany, kótarež njejsu dowěry gódne
|
||||
*[other] Dokument jo z { $count } certifikatami signěrowany, kótarež njejsu dowěry gódne
|
||||
}
|
||||
pdfjs-digital-signature-properties-banner-expired =
|
||||
{ $count ->
|
||||
[one] Dokument jo z { $count } spadnjonym certifikatom signěrowany
|
||||
[two] Dokument jo z { $count } spadnjonyma certifikatoma signěrowany
|
||||
[few] Dokument jo z { $count } spadnjonymi certifikatami signěrowany
|
||||
*[other] Dokument jo z { $count } spadnjonymi certifikatami signěrowany
|
||||
}
|
||||
pdfjs-digital-signature-properties-banner-invalid =
|
||||
{ $count ->
|
||||
[one] Dokument ma { $count } njepłaśiwu digitalnu signaturu
|
||||
[two] Dokument ma { $count } njepłaśiwej digitalnej signaturje
|
||||
[few] Dokument ma { $count } njepłaśiwe digitalne signatury
|
||||
*[other] Dokument ma { $count } njepłaśiwych digitalnych signaturow
|
||||
}
|
||||
pdfjs-digital-signature-properties-banner-revoked =
|
||||
{ $count ->
|
||||
[one] Dokument jo z { $count } wótwołanym certifikatom signěrowany
|
||||
[two] Dokument jo z { $count } wótwołanyma certifikatoma signěrowany
|
||||
[few] Dokument jo z { $count } wótwołanymi certifikatami signěrowany
|
||||
*[other] Dokument jo z { $count } wótwołanymi certifikatami signěrowany
|
||||
}
|
||||
|
||||
## Per-signature status row. Only three distinct strings are needed:
|
||||
## the signature crypto either verified (the cert chain may still be
|
||||
## untrusted/expired/revoked, but that's surfaced on the cert row
|
||||
## below), or it failed, or its sub-format isn't supported.
|
||||
|
||||
pdfjs-digital-signature-properties-status-verified = Status: Signatura jo wobkšuśona
|
||||
pdfjs-digital-signature-properties-status-invalid = Status: Signatura jo njepłaśiwa
|
||||
pdfjs-digital-signature-properties-status-unknown = Status: Njedajo se wobkšuśiś (njepódpěra se)
|
||||
|
||||
## Per-signature certificate row. The variants with an issuer / date in
|
||||
## parentheses embed fully-localized context — no English fall-through.
|
||||
##
|
||||
## Variables:
|
||||
## $issuer (String) - issuer or subject common name from the cert.
|
||||
## $dateObj (Date) - notAfter date for the expired-with-date form.
|
||||
|
||||
pdfjs-digital-signature-properties-certificate-trusted = Certifikat: Dowěry gódny ({ $issuer })
|
||||
pdfjs-digital-signature-properties-certificate-unknown = Certifikat: Nic k dispoziciji
|
||||
pdfjs-digital-signature-properties-certificate-untrusted = Certifikat: Dowěry njegódny
|
||||
pdfjs-digital-signature-properties-certificate-untrusted-unknown-issuer = Certifikat: Njeznaty wudawaŕ ({ $issuer })
|
||||
pdfjs-digital-signature-properties-certificate-untrusted-self-signed = Certifikat: Samsigněrowany ({ $issuer })
|
||||
pdfjs-digital-signature-properties-certificate-untrusted-untrusted-issuer = Certifikat: Dowěry njegódny wudawaŕ ({ $issuer })
|
||||
pdfjs-digital-signature-properties-certificate-expired = Certifikat: Spadnjony
|
||||
pdfjs-digital-signature-properties-certificate-expired-with-date = Certifikat: Spadnjony ({ DATETIME($dateObj, dateStyle: "medium") })
|
||||
pdfjs-digital-signature-properties-certificate-revoked = Certifikat: Wótwołany
|
||||
|
||||
## Main menu for adding/removing signatures
|
||||
|
||||
pdfjs-editor-delete-signature-button1 =
|
||||
|
||||
@ -153,6 +153,27 @@ pdfjs-document-properties-linearized = Ταχεία προβολή ιστού:
|
||||
pdfjs-document-properties-linearized-yes = Ναι
|
||||
pdfjs-document-properties-linearized-no = Όχι
|
||||
pdfjs-document-properties-close-button = Κλείσιμο
|
||||
pdfjs-digital-signature-properties-view-certificate = Προβολή πιστοποιητικού
|
||||
# Shown beneath an invalid signature card to explain why verification
|
||||
# failed. The text comes from NSS (e.g. "Signature integrity has been
|
||||
# compromised", "PKCS#7 signature could not be parsed") and is not
|
||||
# itself localized — it is the underlying error message produced by
|
||||
# the verification backend.
|
||||
# Variables:
|
||||
# $reason (String) - error message describing why the signature
|
||||
# could not be verified.
|
||||
pdfjs-digital-signature-properties-reason = Αιτία: { $reason }
|
||||
# Variables:
|
||||
# $dateObj (Date) - the signing time from the /Sig dict's /M entry.
|
||||
pdfjs-digital-signature-properties-timestamp = Χρονοσήμανση: { DATETIME($dateObj, dateStyle: "short", timeStyle: "medium") }
|
||||
# Variables:
|
||||
# $count (Number) - number of nested sub-signatures (one per earlier
|
||||
# incremental revision of the document).
|
||||
pdfjs-digital-signature-properties-sub-signatures =
|
||||
{ $count ->
|
||||
[one] Δευτερεύουσα υπογραφή ({ $count })
|
||||
*[other] Δευτερεύουσες υπογραφές ({ $count })
|
||||
}
|
||||
|
||||
## Print
|
||||
|
||||
@ -732,6 +753,74 @@ pdfjs-views-manager-waiting-for-file = Μεταφόρτωση αρχείου…
|
||||
pdfjs-toggle-views-manager-button1 =
|
||||
.title = Διαχείριση σελίδων
|
||||
|
||||
## Digital signature properties (signature verification panel)
|
||||
|
||||
pdfjs-digital-signature-properties-button =
|
||||
.title = Ιδιότητες ψηφιακής υπογραφής
|
||||
.aria-label = Ιδιότητες ψηφιακής υπογραφής
|
||||
pdfjs-digital-signature-properties-button-label = Ιδιότητες ψηφιακής υπογραφής
|
||||
|
||||
## Banner shown above the signature list summarising the overall
|
||||
## verification state of the document. Each variant is selected by the
|
||||
## viewer based on the worst per-signature status; one signature is
|
||||
## enough to lower the banner.
|
||||
##
|
||||
## Variables:
|
||||
## $count (Number) - number of signatures at the worst level.
|
||||
|
||||
pdfjs-digital-signature-properties-banner-verified = Το έγγραφο έχει υπογραφεί με έγκυρη ψηφιακή υπογραφή
|
||||
pdfjs-digital-signature-properties-banner-unknown =
|
||||
{ $count ->
|
||||
[one] Το έγγραφο έχει υπογραφεί, αλλά δεν ήταν δυνατή η επαλήθευση { $count } ψηφιακής υπογραφής
|
||||
*[other] Το έγγραφο έχει υπογραφεί, αλλά δεν ήταν δυνατή η επαλήθευση { $count } ψηφιακών υπογραφών
|
||||
}
|
||||
pdfjs-digital-signature-properties-banner-untrusted =
|
||||
{ $count ->
|
||||
[one] Το έγγραφο έχει υπογραφεί με { $count } πιστοποιητικό που δεν είναι αξιόπιστο
|
||||
*[other] Το έγγραφο έχει υπογραφεί με { $count } πιστοποιητικά που δεν είναι αξιόπιστα
|
||||
}
|
||||
pdfjs-digital-signature-properties-banner-expired =
|
||||
{ $count ->
|
||||
[one] Το έγγραφο έχει υπογραφεί με { $count } ληγμένο πιστοποιητικό
|
||||
*[other] Το έγγραφο έχει υπογραφεί με { $count } ληγμένα πιστοποιητικά
|
||||
}
|
||||
pdfjs-digital-signature-properties-banner-invalid =
|
||||
{ $count ->
|
||||
[one] Το έγγραφο διαθέτει { $count } μη έγκυρη ψηφιακή υπογραφή
|
||||
*[other] Το έγγραφο διαθέτει { $count } μη έγκυρες ψηφιακές υπογραφές
|
||||
}
|
||||
pdfjs-digital-signature-properties-banner-revoked =
|
||||
{ $count ->
|
||||
[one] Το έγγραφο έχει υπογραφεί με { $count } ανακληθέν πιστοποιητικό
|
||||
*[other] Το έγγραφο έχει υπογραφεί με { $count } ανακληθέντα πιστοποιητικά
|
||||
}
|
||||
|
||||
## Per-signature status row. Only three distinct strings are needed:
|
||||
## the signature crypto either verified (the cert chain may still be
|
||||
## untrusted/expired/revoked, but that's surfaced on the cert row
|
||||
## below), or it failed, or its sub-format isn't supported.
|
||||
|
||||
pdfjs-digital-signature-properties-status-verified = Κατάσταση: Επαληθευμένη υπογραφή
|
||||
pdfjs-digital-signature-properties-status-invalid = Κατάσταση: Μη έγκυρη υπογραφή
|
||||
pdfjs-digital-signature-properties-status-unknown = Κατάσταση: Αδυναμία επαλήθευσης (δεν υποστηρίζεται)
|
||||
|
||||
## Per-signature certificate row. The variants with an issuer / date in
|
||||
## parentheses embed fully-localized context — no English fall-through.
|
||||
##
|
||||
## Variables:
|
||||
## $issuer (String) - issuer or subject common name from the cert.
|
||||
## $dateObj (Date) - notAfter date for the expired-with-date form.
|
||||
|
||||
pdfjs-digital-signature-properties-certificate-trusted = Πιστοποιητικό: Έμπιστο ({ $issuer })
|
||||
pdfjs-digital-signature-properties-certificate-unknown = Πιστοποιητικό: Μη διαθέσιμο
|
||||
pdfjs-digital-signature-properties-certificate-untrusted = Πιστοποιητικό: Μη αξιόπιστο
|
||||
pdfjs-digital-signature-properties-certificate-untrusted-unknown-issuer = Πιστοποιητικό: Άγνωστος εκδότης ({ $issuer })
|
||||
pdfjs-digital-signature-properties-certificate-untrusted-self-signed = Πιστοποιητικό: Αυτοϋπογεγραμμένο ({ $issuer })
|
||||
pdfjs-digital-signature-properties-certificate-untrusted-untrusted-issuer = Πιστοποιητικό: Μη αξιόπιστος εκδότης ({ $issuer })
|
||||
pdfjs-digital-signature-properties-certificate-expired = Πιστοποιητικό: Έχει λήξει
|
||||
pdfjs-digital-signature-properties-certificate-expired-with-date = Πιστοποιητικό: Έχει λήξει ({ DATETIME($dateObj, dateStyle: "medium") })
|
||||
pdfjs-digital-signature-properties-certificate-revoked = Πιστοποιητικό: Έχει ανακληθεί
|
||||
|
||||
## Main menu for adding/removing signatures
|
||||
|
||||
pdfjs-editor-delete-signature-button1 =
|
||||
|
||||
@ -153,6 +153,27 @@ pdfjs-document-properties-linearized = Fast Web View:
|
||||
pdfjs-document-properties-linearized-yes = Yes
|
||||
pdfjs-document-properties-linearized-no = No
|
||||
pdfjs-document-properties-close-button = Close
|
||||
pdfjs-digital-signature-properties-view-certificate = View certificate
|
||||
# Shown beneath an invalid signature card to explain why verification
|
||||
# failed. The text comes from NSS (e.g. "Signature integrity has been
|
||||
# compromised", "PKCS#7 signature could not be parsed") and is not
|
||||
# itself localized — it is the underlying error message produced by
|
||||
# the verification backend.
|
||||
# Variables:
|
||||
# $reason (String) - error message describing why the signature
|
||||
# could not be verified.
|
||||
pdfjs-digital-signature-properties-reason = Reason: { $reason }
|
||||
# Variables:
|
||||
# $dateObj (Date) - the signing time from the /Sig dict's /M entry.
|
||||
pdfjs-digital-signature-properties-timestamp = Timestamp: { DATETIME($dateObj, dateStyle: "short", timeStyle: "medium") }
|
||||
# Variables:
|
||||
# $count (Number) - number of nested sub-signatures (one per earlier
|
||||
# incremental revision of the document).
|
||||
pdfjs-digital-signature-properties-sub-signatures =
|
||||
{ $count ->
|
||||
[one] Sub-signature ({ $count })
|
||||
*[other] Sub-signatures ({ $count })
|
||||
}
|
||||
|
||||
## Print
|
||||
|
||||
@ -732,6 +753,74 @@ pdfjs-views-manager-waiting-for-file = Uploading file…
|
||||
pdfjs-toggle-views-manager-button1 =
|
||||
.title = Manage pages
|
||||
|
||||
## Digital signature properties (signature verification panel)
|
||||
|
||||
pdfjs-digital-signature-properties-button =
|
||||
.title = Digital signature properties
|
||||
.aria-label = Digital signature properties
|
||||
pdfjs-digital-signature-properties-button-label = Digital signature properties
|
||||
|
||||
## Banner shown above the signature list summarising the overall
|
||||
## verification state of the document. Each variant is selected by the
|
||||
## viewer based on the worst per-signature status; one signature is
|
||||
## enough to lower the banner.
|
||||
##
|
||||
## Variables:
|
||||
## $count (Number) - number of signatures at the worst level.
|
||||
|
||||
pdfjs-digital-signature-properties-banner-verified = Document was signed with a valid digital signature
|
||||
pdfjs-digital-signature-properties-banner-unknown =
|
||||
{ $count ->
|
||||
[one] Document signed but { $count } digital signature could not be verified
|
||||
*[other] Document signed but { $count } digital signatures could not be verified
|
||||
}
|
||||
pdfjs-digital-signature-properties-banner-untrusted =
|
||||
{ $count ->
|
||||
[one] Document signed with { $count } certificate that is not trusted
|
||||
*[other] Document signed with { $count } certificates that are not trusted
|
||||
}
|
||||
pdfjs-digital-signature-properties-banner-expired =
|
||||
{ $count ->
|
||||
[one] Document signed with { $count } expired certificate
|
||||
*[other] Document signed with { $count } expired certificates
|
||||
}
|
||||
pdfjs-digital-signature-properties-banner-invalid =
|
||||
{ $count ->
|
||||
[one] Document has { $count } invalid digital signature
|
||||
*[other] Document has { $count } invalid digital signatures
|
||||
}
|
||||
pdfjs-digital-signature-properties-banner-revoked =
|
||||
{ $count ->
|
||||
[one] Document signed with { $count } revoked certificate
|
||||
*[other] Document signed with { $count } revoked certificates
|
||||
}
|
||||
|
||||
## Per-signature status row. Only three distinct strings are needed:
|
||||
## the signature crypto either verified (the cert chain may still be
|
||||
## untrusted/expired/revoked, but that's surfaced on the cert row
|
||||
## below), or it failed, or its sub-format isn't supported.
|
||||
|
||||
pdfjs-digital-signature-properties-status-verified = Status: Signature verified
|
||||
pdfjs-digital-signature-properties-status-invalid = Status: Signature invalid
|
||||
pdfjs-digital-signature-properties-status-unknown = Status: Unable to verify (unsupported)
|
||||
|
||||
## Per-signature certificate row. The variants with an issuer / date in
|
||||
## parentheses embed fully-localized context — no English fall-through.
|
||||
##
|
||||
## Variables:
|
||||
## $issuer (String) - issuer or subject common name from the cert.
|
||||
## $dateObj (Date) - notAfter date for the expired-with-date form.
|
||||
|
||||
pdfjs-digital-signature-properties-certificate-trusted = Certificate: Trusted ({ $issuer })
|
||||
pdfjs-digital-signature-properties-certificate-unknown = Certificate: Unavailable
|
||||
pdfjs-digital-signature-properties-certificate-untrusted = Certificate: Untrusted
|
||||
pdfjs-digital-signature-properties-certificate-untrusted-unknown-issuer = Certificate: Unknown issuer ({ $issuer })
|
||||
pdfjs-digital-signature-properties-certificate-untrusted-self-signed = Certificate: Self-signed ({ $issuer })
|
||||
pdfjs-digital-signature-properties-certificate-untrusted-untrusted-issuer = Certificate: Untrusted issuer ({ $issuer })
|
||||
pdfjs-digital-signature-properties-certificate-expired = Certificate: Expired
|
||||
pdfjs-digital-signature-properties-certificate-expired-with-date = Certificate: Expired ({ DATETIME($dateObj, dateStyle: "medium") })
|
||||
pdfjs-digital-signature-properties-certificate-revoked = Certificate: Revoked
|
||||
|
||||
## Main menu for adding/removing signatures
|
||||
|
||||
pdfjs-editor-delete-signature-button1 =
|
||||
|
||||
@ -785,3 +785,96 @@ pdfjs-views-manager-paste-button-after =
|
||||
pdfjs-new-badge-content = NEW
|
||||
|
||||
pdfjs-views-manager-waiting-for-file = Uploading file…
|
||||
|
||||
## Digital signature properties (signature verification panel)
|
||||
|
||||
pdfjs-digital-signature-properties-button =
|
||||
.title = Digital signature properties
|
||||
.aria-label = Digital signature properties
|
||||
pdfjs-digital-signature-properties-button-label = Digital signature properties
|
||||
|
||||
## Banner shown above the signature list summarising the overall
|
||||
## verification state of the document. Each variant is selected by the
|
||||
## viewer based on the worst per-signature status; one signature is
|
||||
## enough to lower the banner.
|
||||
##
|
||||
## Variables:
|
||||
## $count (Number) - number of signatures at the worst level.
|
||||
|
||||
pdfjs-digital-signature-properties-banner-verified = Document was signed with a valid digital signature
|
||||
pdfjs-digital-signature-properties-banner-unknown =
|
||||
{ $count ->
|
||||
[one] Document signed but { $count } digital signature could not be verified
|
||||
*[other] Document signed but { $count } digital signatures could not be verified
|
||||
}
|
||||
pdfjs-digital-signature-properties-banner-untrusted =
|
||||
{ $count ->
|
||||
[one] Document signed with { $count } certificate that is not trusted
|
||||
*[other] Document signed with { $count } certificates that are not trusted
|
||||
}
|
||||
pdfjs-digital-signature-properties-banner-expired =
|
||||
{ $count ->
|
||||
[one] Document signed with { $count } expired certificate
|
||||
*[other] Document signed with { $count } expired certificates
|
||||
}
|
||||
pdfjs-digital-signature-properties-banner-invalid =
|
||||
{ $count ->
|
||||
[one] Document has { $count } invalid digital signature
|
||||
*[other] Document has { $count } invalid digital signatures
|
||||
}
|
||||
pdfjs-digital-signature-properties-banner-revoked =
|
||||
{ $count ->
|
||||
[one] Document signed with { $count } revoked certificate
|
||||
*[other] Document signed with { $count } revoked certificates
|
||||
}
|
||||
|
||||
## Per-signature status row. Only three distinct strings are needed:
|
||||
## the signature crypto either verified (the cert chain may still be
|
||||
## untrusted/expired/revoked, but that's surfaced on the cert row
|
||||
## below), or it failed, or its sub-format isn't supported.
|
||||
|
||||
pdfjs-digital-signature-properties-status-verified = Status: Signature verified
|
||||
pdfjs-digital-signature-properties-status-invalid = Status: Signature invalid
|
||||
pdfjs-digital-signature-properties-status-unknown = Status: Unable to verify (unsupported)
|
||||
|
||||
## Per-signature certificate row. The variants with an issuer / date in
|
||||
## parentheses embed fully-localized context — no English fall-through.
|
||||
##
|
||||
## Variables:
|
||||
## $issuer (String) - issuer or subject common name from the cert.
|
||||
## $dateObj (Date) - notAfter date for the expired-with-date form.
|
||||
|
||||
pdfjs-digital-signature-properties-certificate-trusted = Certificate: Trusted ({ $issuer })
|
||||
pdfjs-digital-signature-properties-certificate-unknown = Certificate: Unavailable
|
||||
pdfjs-digital-signature-properties-certificate-untrusted = Certificate: Untrusted
|
||||
pdfjs-digital-signature-properties-certificate-untrusted-unknown-issuer = Certificate: Unknown issuer ({ $issuer })
|
||||
pdfjs-digital-signature-properties-certificate-untrusted-self-signed = Certificate: Self-signed ({ $issuer })
|
||||
pdfjs-digital-signature-properties-certificate-untrusted-untrusted-issuer = Certificate: Untrusted issuer ({ $issuer })
|
||||
pdfjs-digital-signature-properties-certificate-expired = Certificate: Expired
|
||||
pdfjs-digital-signature-properties-certificate-expired-with-date = Certificate: Expired ({ DATETIME($dateObj, dateStyle: "medium") })
|
||||
pdfjs-digital-signature-properties-certificate-revoked = Certificate: Revoked
|
||||
|
||||
##
|
||||
|
||||
pdfjs-digital-signature-properties-view-certificate = View certificate
|
||||
|
||||
# Shown beneath an invalid signature card to explain why verification
|
||||
# failed. The text comes from NSS (e.g. "Signature integrity has been
|
||||
# compromised", "PKCS#7 signature could not be parsed") and is not
|
||||
# itself localized — it is the underlying error message produced by
|
||||
# the verification backend.
|
||||
# Variables:
|
||||
# $reason (String) - error message describing why the signature
|
||||
# could not be verified.
|
||||
pdfjs-digital-signature-properties-reason = Reason: { $reason }
|
||||
# Variables:
|
||||
# $dateObj (Date) - the signing time from the /Sig dict's /M entry.
|
||||
pdfjs-digital-signature-properties-timestamp = Timestamp: { DATETIME($dateObj, dateStyle: "short", timeStyle: "medium") }
|
||||
# Variables:
|
||||
# $count (Number) - number of nested sub-signatures (one per earlier
|
||||
# incremental revision of the document).
|
||||
pdfjs-digital-signature-properties-sub-signatures =
|
||||
{ $count ->
|
||||
[one] Sub-signature ({ $count })
|
||||
*[other] Sub-signatures ({ $count })
|
||||
}
|
||||
|
||||
@ -153,6 +153,27 @@ pdfjs-document-properties-linearized = Rapida tekstaĵa vido:
|
||||
pdfjs-document-properties-linearized-yes = Jes
|
||||
pdfjs-document-properties-linearized-no = Ne
|
||||
pdfjs-document-properties-close-button = Fermi
|
||||
pdfjs-digital-signature-properties-view-certificate = Vidi atestilon
|
||||
# Shown beneath an invalid signature card to explain why verification
|
||||
# failed. The text comes from NSS (e.g. "Signature integrity has been
|
||||
# compromised", "PKCS#7 signature could not be parsed") and is not
|
||||
# itself localized — it is the underlying error message produced by
|
||||
# the verification backend.
|
||||
# Variables:
|
||||
# $reason (String) - error message describing why the signature
|
||||
# could not be verified.
|
||||
pdfjs-digital-signature-properties-reason = Kialo: { $reason }
|
||||
# Variables:
|
||||
# $dateObj (Date) - the signing time from the /Sig dict's /M entry.
|
||||
pdfjs-digital-signature-properties-timestamp = Tempindiko: { DATETIME($dateObj, dateStyle: "short", timeStyle: "medium") }
|
||||
# Variables:
|
||||
# $count (Number) - number of nested sub-signatures (one per earlier
|
||||
# incremental revision of the document).
|
||||
pdfjs-digital-signature-properties-sub-signatures =
|
||||
{ $count ->
|
||||
[one] Duaranga subskribo ({ $count })
|
||||
*[other] Duarangaj subskriboj ({ $count })
|
||||
}
|
||||
|
||||
## Print
|
||||
|
||||
@ -732,6 +753,74 @@ pdfjs-views-manager-waiting-for-file = Dosiero alŝutata…
|
||||
pdfjs-toggle-views-manager-button1 =
|
||||
.title = Administri paĝojn
|
||||
|
||||
## Digital signature properties (signature verification panel)
|
||||
|
||||
pdfjs-digital-signature-properties-button =
|
||||
.title = Atributoj de cifereca subskribo
|
||||
.aria-label = Atributoj de cifereca subskribo
|
||||
pdfjs-digital-signature-properties-button-label = Atributoj de cifereca subskribo
|
||||
|
||||
## Banner shown above the signature list summarising the overall
|
||||
## verification state of the document. Each variant is selected by the
|
||||
## viewer based on the worst per-signature status; one signature is
|
||||
## enough to lower the banner.
|
||||
##
|
||||
## Variables:
|
||||
## $count (Number) - number of signatures at the worst level.
|
||||
|
||||
pdfjs-digital-signature-properties-banner-verified = La dokumento estis subskribita de valida cifereca subskribo
|
||||
pdfjs-digital-signature-properties-banner-unknown =
|
||||
{ $count ->
|
||||
[one] Dokumento subskribita, tamen { $count } cifereca subskribo ne povis esti kontrolita
|
||||
*[other] Dokumento subskribita, tamen { $count } ciferecaj subskriboj ne povis esti kontrolita
|
||||
}
|
||||
pdfjs-digital-signature-properties-banner-untrusted =
|
||||
{ $count ->
|
||||
[one] Dokumento subskribita de { $count } nefidata atestilo
|
||||
*[other] Dokumento subskribita de { $count } nefidataj atestiloj
|
||||
}
|
||||
pdfjs-digital-signature-properties-banner-expired =
|
||||
{ $count ->
|
||||
[one] Dokumento subskribita de { $count } senvalidiĝinta atestilo
|
||||
*[other] Dokumento subskribita de { $count } senvalidiĝintaj atestiloj
|
||||
}
|
||||
pdfjs-digital-signature-properties-banner-invalid =
|
||||
{ $count ->
|
||||
[one] La dokumento havas { $count } nevalidan ciferecan subskribon
|
||||
*[other] La dokumento havas { $count } nevalidajn ciferecajn subskribojn
|
||||
}
|
||||
pdfjs-digital-signature-properties-banner-revoked =
|
||||
{ $count ->
|
||||
[one] Dokumento subskribita de { $count } senvalidigita atestilo
|
||||
*[other] Dokumento subskribita de { $count } senvalidigitaj atestiloj
|
||||
}
|
||||
|
||||
## Per-signature status row. Only three distinct strings are needed:
|
||||
## the signature crypto either verified (the cert chain may still be
|
||||
## untrusted/expired/revoked, but that's surfaced on the cert row
|
||||
## below), or it failed, or its sub-format isn't supported.
|
||||
|
||||
pdfjs-digital-signature-properties-status-verified = Stato: Subskribo kontrolita
|
||||
pdfjs-digital-signature-properties-status-invalid = Stato: Subskribo nevalida
|
||||
pdfjs-digital-signature-properties-status-unknown = Stato: Ne eblas kontroli (nesubtenata)
|
||||
|
||||
## Per-signature certificate row. The variants with an issuer / date in
|
||||
## parentheses embed fully-localized context — no English fall-through.
|
||||
##
|
||||
## Variables:
|
||||
## $issuer (String) - issuer or subject common name from the cert.
|
||||
## $dateObj (Date) - notAfter date for the expired-with-date form.
|
||||
|
||||
pdfjs-digital-signature-properties-certificate-trusted = Atestilo: Fidata ({ $issuer })
|
||||
pdfjs-digital-signature-properties-certificate-unknown = Atestilo: Nedisponebla
|
||||
pdfjs-digital-signature-properties-certificate-untrusted = Atestilo: Ne fidata
|
||||
pdfjs-digital-signature-properties-certificate-untrusted-unknown-issuer = Atestilo: Nekonata eldoninto ({ $issuer })
|
||||
pdfjs-digital-signature-properties-certificate-untrusted-self-signed = Atestilo: Memsubskribita ({ $issuer })
|
||||
pdfjs-digital-signature-properties-certificate-untrusted-untrusted-issuer = Atestilo: Nefidata eldoninto ({ $issuer })
|
||||
pdfjs-digital-signature-properties-certificate-expired = Atestilo: Senvalidiĝinta
|
||||
pdfjs-digital-signature-properties-certificate-expired-with-date = Atestilo: Senvalidiĝinta ({ DATETIME($dateObj, dateStyle: "medium") })
|
||||
pdfjs-digital-signature-properties-certificate-revoked = Atestilo: Senvalidigita
|
||||
|
||||
## Main menu for adding/removing signatures
|
||||
|
||||
pdfjs-editor-delete-signature-button1 =
|
||||
|
||||
@ -153,6 +153,27 @@ pdfjs-document-properties-linearized = Vista rápida de la Web:
|
||||
pdfjs-document-properties-linearized-yes = Sí
|
||||
pdfjs-document-properties-linearized-no = No
|
||||
pdfjs-document-properties-close-button = Cerrar
|
||||
pdfjs-digital-signature-properties-view-certificate = Ver certificado
|
||||
# Shown beneath an invalid signature card to explain why verification
|
||||
# failed. The text comes from NSS (e.g. "Signature integrity has been
|
||||
# compromised", "PKCS#7 signature could not be parsed") and is not
|
||||
# itself localized — it is the underlying error message produced by
|
||||
# the verification backend.
|
||||
# Variables:
|
||||
# $reason (String) - error message describing why the signature
|
||||
# could not be verified.
|
||||
pdfjs-digital-signature-properties-reason = Razón: { $reason }
|
||||
# Variables:
|
||||
# $dateObj (Date) - the signing time from the /Sig dict's /M entry.
|
||||
pdfjs-digital-signature-properties-timestamp = Fecha: { DATETIME($dateObj, dateStyle: "short", timeStyle: "medium") }
|
||||
# Variables:
|
||||
# $count (Number) - number of nested sub-signatures (one per earlier
|
||||
# incremental revision of the document).
|
||||
pdfjs-digital-signature-properties-sub-signatures =
|
||||
{ $count ->
|
||||
[one] Subfirma ({ $count })
|
||||
*[other] Subfirmas ({ $count })
|
||||
}
|
||||
|
||||
## Print
|
||||
|
||||
@ -732,6 +753,74 @@ pdfjs-views-manager-waiting-for-file = Subiendo archivo…
|
||||
pdfjs-toggle-views-manager-button1 =
|
||||
.title = Administrar páginas
|
||||
|
||||
## Digital signature properties (signature verification panel)
|
||||
|
||||
pdfjs-digital-signature-properties-button =
|
||||
.title = Propiedades de firma digital
|
||||
.aria-label = Propiedades de firma digital
|
||||
pdfjs-digital-signature-properties-button-label = Propiedades de firma digital
|
||||
|
||||
## Banner shown above the signature list summarising the overall
|
||||
## verification state of the document. Each variant is selected by the
|
||||
## viewer based on the worst per-signature status; one signature is
|
||||
## enough to lower the banner.
|
||||
##
|
||||
## Variables:
|
||||
## $count (Number) - number of signatures at the worst level.
|
||||
|
||||
pdfjs-digital-signature-properties-banner-verified = El documento fue firmado con una firma digital válida
|
||||
pdfjs-digital-signature-properties-banner-unknown =
|
||||
{ $count ->
|
||||
[one] Documento firmado pero { $count } firma digital no pudo ser verificada
|
||||
*[other] Documento firmado pero { $count } firmas digitales no pudieron ser verificadas
|
||||
}
|
||||
pdfjs-digital-signature-properties-banner-untrusted =
|
||||
{ $count ->
|
||||
[one] Documento firmado con { $count } certificado que no es confiable
|
||||
*[other] Documento firmado con { $count } certificados que no son confiables
|
||||
}
|
||||
pdfjs-digital-signature-properties-banner-expired =
|
||||
{ $count ->
|
||||
[one] Documento firmado con { $count } certificado expirado
|
||||
*[other] Documento firmado con { $count } certificado expirado
|
||||
}
|
||||
pdfjs-digital-signature-properties-banner-invalid =
|
||||
{ $count ->
|
||||
[one] El documento tiene { $count } firmas digital inválida
|
||||
*[other] El documento tiene { $count } firmas digitales inválidas
|
||||
}
|
||||
pdfjs-digital-signature-properties-banner-revoked =
|
||||
{ $count ->
|
||||
[one] Documento firmado con { $count } certificado revocado
|
||||
*[other] Documento firmado con { $count } certificados revocados
|
||||
}
|
||||
|
||||
## Per-signature status row. Only three distinct strings are needed:
|
||||
## the signature crypto either verified (the cert chain may still be
|
||||
## untrusted/expired/revoked, but that's surfaced on the cert row
|
||||
## below), or it failed, or its sub-format isn't supported.
|
||||
|
||||
pdfjs-digital-signature-properties-status-verified = Estado: Firma verificada
|
||||
pdfjs-digital-signature-properties-status-invalid = Estado: Firma inválida
|
||||
pdfjs-digital-signature-properties-status-unknown = Estado: No se puede verificar (no soportada)
|
||||
|
||||
## Per-signature certificate row. The variants with an issuer / date in
|
||||
## parentheses embed fully-localized context — no English fall-through.
|
||||
##
|
||||
## Variables:
|
||||
## $issuer (String) - issuer or subject common name from the cert.
|
||||
## $dateObj (Date) - notAfter date for the expired-with-date form.
|
||||
|
||||
pdfjs-digital-signature-properties-certificate-trusted = Certificado: Confiable ({ $issuer })
|
||||
pdfjs-digital-signature-properties-certificate-unknown = Certificado: No disponible
|
||||
pdfjs-digital-signature-properties-certificate-untrusted = Certificado: No confiable
|
||||
pdfjs-digital-signature-properties-certificate-untrusted-unknown-issuer = Certificado: Emisor desconocido ({ $issuer })
|
||||
pdfjs-digital-signature-properties-certificate-untrusted-self-signed = Certificado: Autofirmado ({ $issuer })
|
||||
pdfjs-digital-signature-properties-certificate-untrusted-untrusted-issuer = Certificado: Emisor no confiable ({ $issuer })
|
||||
pdfjs-digital-signature-properties-certificate-expired = Certificado: Vencido
|
||||
pdfjs-digital-signature-properties-certificate-expired-with-date = Certificado: Vencido ({ DATETIME($dateObj, dateStyle: "medium") })
|
||||
pdfjs-digital-signature-properties-certificate-revoked = Certificado: Revocado
|
||||
|
||||
## Main menu for adding/removing signatures
|
||||
|
||||
pdfjs-editor-delete-signature-button1 =
|
||||
|
||||
@ -153,6 +153,27 @@ pdfjs-document-properties-linearized = Vista rápida en Web:
|
||||
pdfjs-document-properties-linearized-yes = Sí
|
||||
pdfjs-document-properties-linearized-no = No
|
||||
pdfjs-document-properties-close-button = Cerrar
|
||||
pdfjs-digital-signature-properties-view-certificate = Ver certificado
|
||||
# Shown beneath an invalid signature card to explain why verification
|
||||
# failed. The text comes from NSS (e.g. "Signature integrity has been
|
||||
# compromised", "PKCS#7 signature could not be parsed") and is not
|
||||
# itself localized — it is the underlying error message produced by
|
||||
# the verification backend.
|
||||
# Variables:
|
||||
# $reason (String) - error message describing why the signature
|
||||
# could not be verified.
|
||||
pdfjs-digital-signature-properties-reason = Motivo: { $reason }
|
||||
# Variables:
|
||||
# $dateObj (Date) - the signing time from the /Sig dict's /M entry.
|
||||
pdfjs-digital-signature-properties-timestamp = Marca de tiempo: { DATETIME($dateObj, dateStyle: "short", timeStyle: "medium") }
|
||||
# Variables:
|
||||
# $count (Number) - number of nested sub-signatures (one per earlier
|
||||
# incremental revision of the document).
|
||||
pdfjs-digital-signature-properties-sub-signatures =
|
||||
{ $count ->
|
||||
[one] Subfirma ({ $count })
|
||||
*[other] Subfirmas ({ $count })
|
||||
}
|
||||
|
||||
## Print
|
||||
|
||||
@ -732,6 +753,74 @@ pdfjs-views-manager-waiting-for-file = Subiendo archivo…
|
||||
pdfjs-toggle-views-manager-button1 =
|
||||
.title = Gestionar páginas
|
||||
|
||||
## Digital signature properties (signature verification panel)
|
||||
|
||||
pdfjs-digital-signature-properties-button =
|
||||
.title = Propiedades de firma digital
|
||||
.aria-label = Propiedades de firma digital
|
||||
pdfjs-digital-signature-properties-button-label = Propiedades de firma digital
|
||||
|
||||
## Banner shown above the signature list summarising the overall
|
||||
## verification state of the document. Each variant is selected by the
|
||||
## viewer based on the worst per-signature status; one signature is
|
||||
## enough to lower the banner.
|
||||
##
|
||||
## Variables:
|
||||
## $count (Number) - number of signatures at the worst level.
|
||||
|
||||
pdfjs-digital-signature-properties-banner-verified = El documento fue firmado con una firma digital válida
|
||||
pdfjs-digital-signature-properties-banner-unknown =
|
||||
{ $count ->
|
||||
[one] Documento firmado, pero no se pudo verificar la firma digital
|
||||
*[other] Documento firmado, pero no se pudieron verificar las { $count } firmas digitales
|
||||
}
|
||||
pdfjs-digital-signature-properties-banner-untrusted =
|
||||
{ $count ->
|
||||
[one] Documento firmado con { $count } certificado que no es de confianza
|
||||
*[other] Documento firmado con { $count } certificados que no son de confianza
|
||||
}
|
||||
pdfjs-digital-signature-properties-banner-expired =
|
||||
{ $count ->
|
||||
[one] Documento firmado con { $count } certificado expirado
|
||||
*[other] Documento firmado con { $count } certificados expirados
|
||||
}
|
||||
pdfjs-digital-signature-properties-banner-invalid =
|
||||
{ $count ->
|
||||
[one] El documento tiene { $count } firma digital no válida
|
||||
*[other] El documento tiene { $count } firmas digitales no válidas
|
||||
}
|
||||
pdfjs-digital-signature-properties-banner-revoked =
|
||||
{ $count ->
|
||||
[one] Documento firmado con { $count } certificado revocado
|
||||
*[other] Documento firmado con { $count } certificados revocados
|
||||
}
|
||||
|
||||
## Per-signature status row. Only three distinct strings are needed:
|
||||
## the signature crypto either verified (the cert chain may still be
|
||||
## untrusted/expired/revoked, but that's surfaced on the cert row
|
||||
## below), or it failed, or its sub-format isn't supported.
|
||||
|
||||
pdfjs-digital-signature-properties-status-verified = Estado: Firma verificada
|
||||
pdfjs-digital-signature-properties-status-invalid = Estado: Firma inválida
|
||||
pdfjs-digital-signature-properties-status-unknown = Estado: No se puede verificar (no compatible)
|
||||
|
||||
## Per-signature certificate row. The variants with an issuer / date in
|
||||
## parentheses embed fully-localized context — no English fall-through.
|
||||
##
|
||||
## Variables:
|
||||
## $issuer (String) - issuer or subject common name from the cert.
|
||||
## $dateObj (Date) - notAfter date for the expired-with-date form.
|
||||
|
||||
pdfjs-digital-signature-properties-certificate-trusted = Certificado: Confiable ({ $issuer })
|
||||
pdfjs-digital-signature-properties-certificate-unknown = Certificado: No disponible
|
||||
pdfjs-digital-signature-properties-certificate-untrusted = Certificado: No confiable
|
||||
pdfjs-digital-signature-properties-certificate-untrusted-unknown-issuer = Certificado: Emisor desconocido ({ $issuer })
|
||||
pdfjs-digital-signature-properties-certificate-untrusted-self-signed = Certificado: Autofirmado ({ $issuer })
|
||||
pdfjs-digital-signature-properties-certificate-untrusted-untrusted-issuer = Certificado: Emisor no confiable ({ $issuer })
|
||||
pdfjs-digital-signature-properties-certificate-expired = Certificado: Expirado
|
||||
pdfjs-digital-signature-properties-certificate-expired-with-date = Certificado: Expirado ({ DATETIME($dateObj, dateStyle: "medium") })
|
||||
pdfjs-digital-signature-properties-certificate-revoked = Certificado: Revocado
|
||||
|
||||
## Main menu for adding/removing signatures
|
||||
|
||||
pdfjs-editor-delete-signature-button1 =
|
||||
|
||||
@ -153,6 +153,7 @@ pdfjs-document-properties-linearized = Vista rápida de la web:
|
||||
pdfjs-document-properties-linearized-yes = Sí
|
||||
pdfjs-document-properties-linearized-no = No
|
||||
pdfjs-document-properties-close-button = Cerrar
|
||||
pdfjs-digital-signature-properties-view-certificate = Ver certificado
|
||||
|
||||
## Print
|
||||
|
||||
@ -161,8 +162,8 @@ pdfjs-print-progress-message = Preparando documento para impresión…
|
||||
# $progress (Number) - percent value
|
||||
pdfjs-print-progress-percent = { $progress }%
|
||||
pdfjs-print-progress-close-button = Cancelar
|
||||
pdfjs-printing-not-supported = Advertencia: La impresión no esta completamente soportada por este navegador.
|
||||
pdfjs-printing-not-ready = Advertencia: El PDF no cargo completamente para impresión.
|
||||
pdfjs-printing-not-supported = Advertencia: La impresión no está completamente soportada por este navegador.
|
||||
pdfjs-printing-not-ready = Advertencia: El PDF no cargó completamente para impresión.
|
||||
|
||||
## Tooltips and alt text for side panel toolbar buttons
|
||||
|
||||
@ -265,7 +266,7 @@ pdfjs-page-landmark =
|
||||
## Loading indicator messages
|
||||
|
||||
pdfjs-loading-error = Un error ocurrió al cargar el PDF.
|
||||
pdfjs-invalid-file-error = Archivo PDF invalido o dañado.
|
||||
pdfjs-invalid-file-error = Archivo PDF inválido o dañado.
|
||||
pdfjs-missing-file-error = Archivo PDF no encontrado.
|
||||
pdfjs-unexpected-response-error = Respuesta inesperada del servidor.
|
||||
pdfjs-rendering-error = Un error ocurrió al renderizar la página.
|
||||
@ -360,7 +361,7 @@ pdfjs-editor-remove-signature-button =
|
||||
pdfjs-editor-free-text-color-input = Color
|
||||
pdfjs-editor-free-text-size-input = Tamaño
|
||||
pdfjs-editor-ink-color-input = Color
|
||||
pdfjs-editor-ink-thickness-input = Grossor
|
||||
pdfjs-editor-ink-thickness-input = Grosor
|
||||
pdfjs-editor-ink-opacity-input = Opacidad
|
||||
pdfjs-editor-stamp-add-image-button =
|
||||
.title = Agregar imagen
|
||||
@ -580,7 +581,7 @@ pdfjs-editor-add-signature-type-input =
|
||||
.aria-label = Escribe tu firma
|
||||
.placeholder = Escribe tu firma
|
||||
pdfjs-editor-add-signature-draw-placeholder = Dibuja tu firma
|
||||
pdfjs-editor-add-signature-draw-thickness-range-label = Grossor
|
||||
pdfjs-editor-add-signature-draw-thickness-range-label = Grosor
|
||||
# Variables:
|
||||
# $thickness (Number) - the thickness (in pixels) of the line used to draw a signature.
|
||||
pdfjs-editor-add-signature-draw-thickness-range =
|
||||
@ -697,15 +698,15 @@ pdfjs-views-manager-status-undo-cut-label =
|
||||
# $count (Number) - the number of selected pages to be copied.
|
||||
pdfjs-views-manager-pages-status-undo-copy-label =
|
||||
{ $count ->
|
||||
[one] 1 pagina copiada
|
||||
*[other] { $count } paginas copiadas
|
||||
[one] 1 página copiada
|
||||
*[other] { $count } páginas copiadas
|
||||
}
|
||||
# Variables:
|
||||
# $count (Number) - the number of selected pages to be deleted.
|
||||
pdfjs-views-manager-pages-status-undo-delete-label =
|
||||
{ $count ->
|
||||
[one] 1 pagina eliminada
|
||||
*[other] { $count } paginas eliminadas
|
||||
[one] 1 página eliminada
|
||||
*[other] { $count } páginas eliminadas
|
||||
}
|
||||
pdfjs-views-manager-pages-status-waiting-ready-label = Preparando tu archivo…
|
||||
pdfjs-views-manager-pages-status-waiting-uploading-label = Subiendo archivo…
|
||||
|
||||
@ -153,6 +153,27 @@ pdfjs-document-properties-linearized = Webeko ikuspegi bizkorra:
|
||||
pdfjs-document-properties-linearized-yes = Bai
|
||||
pdfjs-document-properties-linearized-no = Ez
|
||||
pdfjs-document-properties-close-button = Itxi
|
||||
pdfjs-digital-signature-properties-view-certificate = Ikusi ziurtagiria
|
||||
# Shown beneath an invalid signature card to explain why verification
|
||||
# failed. The text comes from NSS (e.g. "Signature integrity has been
|
||||
# compromised", "PKCS#7 signature could not be parsed") and is not
|
||||
# itself localized — it is the underlying error message produced by
|
||||
# the verification backend.
|
||||
# Variables:
|
||||
# $reason (String) - error message describing why the signature
|
||||
# could not be verified.
|
||||
pdfjs-digital-signature-properties-reason = Arrazoia: { $reason }
|
||||
# Variables:
|
||||
# $dateObj (Date) - the signing time from the /Sig dict's /M entry.
|
||||
pdfjs-digital-signature-properties-timestamp = Denbora-marka: { DATETIME($dateObj, dateStyle: "short", timeStyle: "medium") }
|
||||
# Variables:
|
||||
# $count (Number) - number of nested sub-signatures (one per earlier
|
||||
# incremental revision of the document).
|
||||
pdfjs-digital-signature-properties-sub-signatures =
|
||||
{ $count ->
|
||||
[one] Azpi-sinadura ({ $count })
|
||||
*[other] Azpi-sinadurak ({ $count })
|
||||
}
|
||||
|
||||
## Print
|
||||
|
||||
@ -401,11 +422,11 @@ pdfjs-editor-comments-sidebar-no-comments-link = Argibide gehiago
|
||||
|
||||
## Alt-text dialog
|
||||
|
||||
pdfjs-editor-alt-text-button-label = Testu alternatiboa
|
||||
pdfjs-editor-alt-text-button-label = Ordezko testua
|
||||
pdfjs-editor-alt-text-edit-button =
|
||||
.aria-label = Editatu testu alternatiboa
|
||||
.aria-label = Editatu ordezko testua
|
||||
pdfjs-editor-alt-text-dialog-label = Aukeratu aukera
|
||||
pdfjs-editor-alt-text-dialog-description = Testu alternatiboak laguntzen du jendeak ezin duenean irudia ikusi edo ez denean kargatzen.
|
||||
pdfjs-editor-alt-text-dialog-description = Ordezko testuak laguntzen du jendeak ezin duenean irudia ikusi edo ez denean kargatzen.
|
||||
pdfjs-editor-alt-text-add-description-label = Gehitu azalpena
|
||||
pdfjs-editor-alt-text-add-description-description = Saiatu idazten gaia, ezarpena edo ekintzak deskribatzen dituen esaldi 1 edo 2.
|
||||
pdfjs-editor-alt-text-mark-decorative-label = Markatu apaingarri gisa
|
||||
@ -418,7 +439,7 @@ pdfjs-editor-alt-text-textarea =
|
||||
.placeholder = Adibidez, "gizon gaztea mahaian eserita dago bazkaltzeko"
|
||||
# Alternative text (alt text) helps when people can't see the image.
|
||||
pdfjs-editor-alt-text-button =
|
||||
.aria-label = Testu alternatiboa
|
||||
.aria-label = Ordezko testua
|
||||
|
||||
## Editor resizers
|
||||
## This is used in an aria label to help to understand the role of the resizer.
|
||||
@ -470,38 +491,38 @@ pdfjs-editor-highlight-show-all-button =
|
||||
## Group note for entire feature: Alternative text (alt text) helps when people can't see the image. This feature includes a tool to create alt text automatically using an AI model that works locally on the user's device to preserve privacy.
|
||||
|
||||
# Modal header positioned above a text box where users can edit the alt text.
|
||||
pdfjs-editor-new-alt-text-dialog-edit-label = Editatu testu alternatiboa (irudiaren azalpena)
|
||||
pdfjs-editor-new-alt-text-dialog-edit-label = Editatu ordezko testua (irudiaren azalpena)
|
||||
# Modal header positioned above a text box where users can add the alt text.
|
||||
pdfjs-editor-new-alt-text-dialog-add-label = Gehitu testu alternatiboa (irudiaren azalpena)
|
||||
pdfjs-editor-new-alt-text-dialog-add-label = Gehitu ordezko testua (irudiaren azalpena)
|
||||
pdfjs-editor-new-alt-text-textarea =
|
||||
.placeholder = Idatzi zure azalpena hemen…
|
||||
# This text refers to the alt text box above this description. It offers a definition of alt text.
|
||||
pdfjs-editor-new-alt-text-description = Azalpen laburra irudia ikusi ezin duen jendearentzat edo irudia kargatu ezin denerako.
|
||||
# This is a required legal disclaimer that refers to the automatically created text inside the alt text box above this text. It disappears if the text is edited by a human.
|
||||
pdfjs-editor-new-alt-text-disclaimer1 = Testu alternatibo hau automatikoki sortu da eta okerra izan liteke.
|
||||
pdfjs-editor-new-alt-text-disclaimer1 = Ordezko testu hau automatikoki sortu da eta okerra izan liteke.
|
||||
pdfjs-editor-new-alt-text-disclaimer-learn-more-url = Argibide gehiago
|
||||
pdfjs-editor-new-alt-text-create-automatically-button-label = Sortu testu alternatiboa automatikoki
|
||||
pdfjs-editor-new-alt-text-create-automatically-button-label = Sortu ordezko testua automatikoki
|
||||
pdfjs-editor-new-alt-text-not-now-button = Une honetan ez
|
||||
pdfjs-editor-new-alt-text-error-title = Ezin da testu alternatiboa automatikoki sortu
|
||||
pdfjs-editor-new-alt-text-error-description = Idatzi zure testu alternatibo propioa edo saiatu berriro geroago.
|
||||
pdfjs-editor-new-alt-text-error-title = Ezin da ordezko testua automatikoki sortu
|
||||
pdfjs-editor-new-alt-text-error-description = Idatzi zure ordezko testu propioa edo saiatu berriro geroago.
|
||||
pdfjs-editor-new-alt-text-error-close-button = Itxi
|
||||
# Variables:
|
||||
# $totalSize (Number) - the total size (in MB) of the AI model.
|
||||
# $downloadedSize (Number) - the downloaded size (in MB) of the AI model.
|
||||
pdfjs-editor-new-alt-text-ai-model-downloading-progress = Testu alternatiboaren AA modeloa deskargatzen ({ $downloadedSize }/{ $totalSize } MB)
|
||||
.aria-valuetext = Testu alternatiboaren AA modeloa deskargatzen ({ $downloadedSize }/{ $totalSize } MB)
|
||||
pdfjs-editor-new-alt-text-ai-model-downloading-progress = Ordezko testuaren AA modeloa deskargatzen ({ $downloadedSize }/{ $totalSize } MB)
|
||||
.aria-valuetext = Ordezko testuaren AA modeloa deskargatzen ({ $downloadedSize }/{ $totalSize } MB)
|
||||
# This is a button that users can click to edit the alt text they have already added.
|
||||
pdfjs-editor-new-alt-text-added-button =
|
||||
.aria-label = Testu alternatiboa gehituta
|
||||
pdfjs-editor-new-alt-text-added-button-label = Testu alternatiboa gehituta
|
||||
.aria-label = Ordezko testua gehituta
|
||||
pdfjs-editor-new-alt-text-added-button-label = Ordezko testua gehituta
|
||||
# This is a button that users can click to open the alt text editor and add alt text when it is not present.
|
||||
pdfjs-editor-new-alt-text-missing-button =
|
||||
.aria-label = Testu alternatiboa falta da
|
||||
pdfjs-editor-new-alt-text-missing-button-label = Testu alternatiboa falta da
|
||||
.aria-label = Ordezko testua falta da
|
||||
pdfjs-editor-new-alt-text-missing-button-label = Ordezko testua falta da
|
||||
# This is a button that opens up the alt text modal where users should review the alt text that was automatically generated.
|
||||
pdfjs-editor-new-alt-text-to-review-button =
|
||||
.aria-label = Berrikusi testu alternatiboa
|
||||
pdfjs-editor-new-alt-text-to-review-button-label = Berrikusi testu alternatiboa
|
||||
.aria-label = Berrikusi ordezko testua
|
||||
pdfjs-editor-new-alt-text-to-review-button-label = Berrikusi ordezko testua
|
||||
# "Created automatically" is a prefix that will be added to the beginning of any alt text that has been automatically generated. After the colon, the user will see/hear the actual alt text description. If the alt text has been edited by a human, this prefix will not appear.
|
||||
# Variables:
|
||||
# $generatedAltText (String) - the generated alt-text.
|
||||
@ -510,22 +531,22 @@ pdfjs-editor-new-alt-text-generated-alt-text-with-disclaimer = Automatikoki sort
|
||||
## Image alt-text settings
|
||||
|
||||
pdfjs-image-alt-text-settings-button =
|
||||
.title = Irudiaren testu alternatiboaren ezarpenak
|
||||
pdfjs-image-alt-text-settings-button-label = Irudiaren testu alternatiboaren ezarpenak
|
||||
pdfjs-editor-alt-text-settings-dialog-label = Irudiaren testu alternatiboaren ezarpenak
|
||||
pdfjs-editor-alt-text-settings-automatic-title = Testu alternatibo automatikoa
|
||||
pdfjs-editor-alt-text-settings-create-model-button-label = Sortu testu alternatiboa automatikoki
|
||||
.title = Irudien ordezko testuaren ezarpenak
|
||||
pdfjs-image-alt-text-settings-button-label = Irudien ordezko testuaren ezarpenak
|
||||
pdfjs-editor-alt-text-settings-dialog-label = Irudien ordezko testuaren ezarpenak
|
||||
pdfjs-editor-alt-text-settings-automatic-title = Ordezko testu automatikoa
|
||||
pdfjs-editor-alt-text-settings-create-model-button-label = Sortu ordezko testua automatikoki
|
||||
pdfjs-editor-alt-text-settings-create-model-description = Azalpenak iradokitzen ditu irudia ikusi ezin duen jendearentzat edo irudia kargatu ezin denerako.
|
||||
# Variables:
|
||||
# $totalSize (Number) - the total size (in MB) of the AI model.
|
||||
pdfjs-editor-alt-text-settings-download-model-label = Testu alternatiboaren AA modeloa ({ $totalSize } MB)
|
||||
pdfjs-editor-alt-text-settings-ai-model-description = Zure gailuan modu lokalean exekutatzen da eta zure datuak pribatu mantentzen dira. Testu alternatibo automatikorako beharrezkoa.
|
||||
pdfjs-editor-alt-text-settings-download-model-label = Ordezko testuaren AA modeloa ({ $totalSize } MB)
|
||||
pdfjs-editor-alt-text-settings-ai-model-description = Zure gailuan modu lokalean exekutatzen da eta zure datuak pribatu mantentzen dira. Ordezko testu automatikorako beharrezkoa.
|
||||
pdfjs-editor-alt-text-settings-delete-model-button = Ezabatu
|
||||
pdfjs-editor-alt-text-settings-download-model-button = Deskargatu
|
||||
pdfjs-editor-alt-text-settings-downloading-model-button = Deskargatzen…
|
||||
pdfjs-editor-alt-text-settings-editor-title = Testu alternatiboaren editorea
|
||||
pdfjs-editor-alt-text-settings-show-dialog-button-label = Erakutsi testu alternatiboa irudi bat gehitzean berehala
|
||||
pdfjs-editor-alt-text-settings-show-dialog-description = Zure irudiek testu alternatiboa duela ziurtatzen laguntzen dizu.
|
||||
pdfjs-editor-alt-text-settings-editor-title = Ordezko testuaren editorea
|
||||
pdfjs-editor-alt-text-settings-show-dialog-button-label = Erakutsi ordezko testua irudi bat gehitzean berehala
|
||||
pdfjs-editor-alt-text-settings-show-dialog-description = Zure irudi guztiek ordezko testua dutela ziurtatzen laguntzen dizu.
|
||||
pdfjs-editor-alt-text-settings-close-button = Itxi
|
||||
|
||||
## Accessibility labels (announced by screen readers) for objects added to the editor.
|
||||
@ -563,7 +584,7 @@ pdfjs-editor-undo-bar-close-button-label = Itxi
|
||||
pdfjs-editor-add-signature-dialog-label =
|
||||
Leiho modal honek PDF dokumentu batera gehitzeko sinadurak
|
||||
sortzea ahalbidetzen dio erabiltzaileari. Erabiltzaileak izena edita
|
||||
dezake (testu alternatibo modura ere erabiltzen dena) eta sinadura
|
||||
dezake (ordezko testu modura ere erabiltzen dena) eta sinadura
|
||||
gordetzeko aukera du gehiagotan erabili ahal izateko.
|
||||
pdfjs-editor-add-signature-dialog-title = Gehitu sinadura
|
||||
|
||||
@ -598,9 +619,9 @@ pdfjs-editor-add-signature-image-browse-link =
|
||||
|
||||
## Controls
|
||||
|
||||
pdfjs-editor-add-signature-description-label = Azalpena (testu alternatiboa)
|
||||
pdfjs-editor-add-signature-description-label = Azalpena (ordezko testua)
|
||||
pdfjs-editor-add-signature-description-input =
|
||||
.title = Azalpena (testu alternatiboa)
|
||||
.title = Azalpena (ordezko testua)
|
||||
pdfjs-editor-add-signature-description-default-when-drawing = Sinadura
|
||||
pdfjs-editor-add-signature-clear-button-label = Garbitu sinadura
|
||||
pdfjs-editor-add-signature-clear-button =
|
||||
@ -736,6 +757,74 @@ pdfjs-views-manager-waiting-for-file = Fitxategia igotzen…
|
||||
pdfjs-toggle-views-manager-button1 =
|
||||
.title = Kudeatu orriak
|
||||
|
||||
## Digital signature properties (signature verification panel)
|
||||
|
||||
pdfjs-digital-signature-properties-button =
|
||||
.title = Sinadura digitalaren propietateak
|
||||
.aria-label = Sinadura digitalaren propietateak
|
||||
pdfjs-digital-signature-properties-button-label = Sinadura digitalaren propietateak
|
||||
|
||||
## Banner shown above the signature list summarising the overall
|
||||
## verification state of the document. Each variant is selected by the
|
||||
## viewer based on the worst per-signature status; one signature is
|
||||
## enough to lower the banner.
|
||||
##
|
||||
## Variables:
|
||||
## $count (Number) - number of signatures at the worst level.
|
||||
|
||||
pdfjs-digital-signature-properties-banner-verified = Dokumentua baliozko sinadura digitalarekin sinatuta dago
|
||||
pdfjs-digital-signature-properties-banner-unknown =
|
||||
{ $count ->
|
||||
[one] Dokumentua sinatuta dago baina sinadura digital bat ezin izan da egiaztatu
|
||||
*[other] Dokumentua sinatuta dago baina { $count } sinadura digital ezin izan dira egiaztatu
|
||||
}
|
||||
pdfjs-digital-signature-properties-banner-untrusted =
|
||||
{ $count ->
|
||||
[one] Document ziurtagiri fidagaitz batekin sinatuta dago
|
||||
*[other] Document { $count } ziurtagiri fidagaitzekin sinatuta dago
|
||||
}
|
||||
pdfjs-digital-signature-properties-banner-expired =
|
||||
{ $count ->
|
||||
[one] Dokumentua iraungitako ziurtagiri batekin sinatuta dago
|
||||
*[other] Dokumentua iraungitako { $count } ziurtagirirekin sinatuta dago
|
||||
}
|
||||
pdfjs-digital-signature-properties-banner-invalid =
|
||||
{ $count ->
|
||||
[one] Dokumentuak sinadura digital baliogabe bat du
|
||||
*[other] Dokumentuak { $count } sinadura digital baliogabe ditu
|
||||
}
|
||||
pdfjs-digital-signature-properties-banner-revoked =
|
||||
{ $count ->
|
||||
[one] Dokumentua baliogabetutako ziurtagiri batekin sinatuta dago
|
||||
*[other] Dokumentua baliogabetutako { $count } ziurtagirirekin sinatuta dago
|
||||
}
|
||||
|
||||
## Per-signature status row. Only three distinct strings are needed:
|
||||
## the signature crypto either verified (the cert chain may still be
|
||||
## untrusted/expired/revoked, but that's surfaced on the cert row
|
||||
## below), or it failed, or its sub-format isn't supported.
|
||||
|
||||
pdfjs-digital-signature-properties-status-verified = Egoera: sinadura egiaztatuta
|
||||
pdfjs-digital-signature-properties-status-invalid = Egoera: sinadura baliogabea
|
||||
pdfjs-digital-signature-properties-status-unknown = Egoera: ezin da egiaztatu (euskarririk ez)
|
||||
|
||||
## Per-signature certificate row. The variants with an issuer / date in
|
||||
## parentheses embed fully-localized context — no English fall-through.
|
||||
##
|
||||
## Variables:
|
||||
## $issuer (String) - issuer or subject common name from the cert.
|
||||
## $dateObj (Date) - notAfter date for the expired-with-date form.
|
||||
|
||||
pdfjs-digital-signature-properties-certificate-trusted = Ziurtagiria: fidagarria ({ $issuer })
|
||||
pdfjs-digital-signature-properties-certificate-unknown = Ziurtagiria: ez dago erabilgarri
|
||||
pdfjs-digital-signature-properties-certificate-untrusted = Ziurtagiria: fidagaitza
|
||||
pdfjs-digital-signature-properties-certificate-untrusted-unknown-issuer = Ziurtagiria: jaulkitzaile ezezaguna ({ $issuer })
|
||||
pdfjs-digital-signature-properties-certificate-untrusted-self-signed = Ziurtagiria: bere buruak sinatutakoa ({ $issuer })
|
||||
pdfjs-digital-signature-properties-certificate-untrusted-untrusted-issuer = Ziurtagiria: jaulkitzaile fidagaitza ({ $issuer })
|
||||
pdfjs-digital-signature-properties-certificate-expired = Ziurtagiria: iraungita
|
||||
pdfjs-digital-signature-properties-certificate-expired-with-date = Ziurtagiria: iraungita ({ DATETIME($dateObj, dateStyle: "medium") })
|
||||
pdfjs-digital-signature-properties-certificate-revoked = Ziurtagiria: baliogabetuta
|
||||
|
||||
## Main menu for adding/removing signatures
|
||||
|
||||
pdfjs-editor-delete-signature-button1 =
|
||||
|
||||
@ -153,6 +153,27 @@ pdfjs-document-properties-linearized = Nopea web-katselu:
|
||||
pdfjs-document-properties-linearized-yes = Kyllä
|
||||
pdfjs-document-properties-linearized-no = Ei
|
||||
pdfjs-document-properties-close-button = Sulje
|
||||
pdfjs-digital-signature-properties-view-certificate = Näytä varmenne
|
||||
# Shown beneath an invalid signature card to explain why verification
|
||||
# failed. The text comes from NSS (e.g. "Signature integrity has been
|
||||
# compromised", "PKCS#7 signature could not be parsed") and is not
|
||||
# itself localized — it is the underlying error message produced by
|
||||
# the verification backend.
|
||||
# Variables:
|
||||
# $reason (String) - error message describing why the signature
|
||||
# could not be verified.
|
||||
pdfjs-digital-signature-properties-reason = Syy: { $reason }
|
||||
# Variables:
|
||||
# $dateObj (Date) - the signing time from the /Sig dict's /M entry.
|
||||
pdfjs-digital-signature-properties-timestamp = Aikaleima: { DATETIME($dateObj, dateStyle: "short", timeStyle: "medium") }
|
||||
# Variables:
|
||||
# $count (Number) - number of nested sub-signatures (one per earlier
|
||||
# incremental revision of the document).
|
||||
pdfjs-digital-signature-properties-sub-signatures =
|
||||
{ $count ->
|
||||
[one] Aliallekirjoitus ({ $count })
|
||||
*[other] Aliallekirjoitukset ({ $count })
|
||||
}
|
||||
|
||||
## Print
|
||||
|
||||
@ -732,6 +753,74 @@ pdfjs-views-manager-waiting-for-file = Lähetetään tiedostoa…
|
||||
pdfjs-toggle-views-manager-button1 =
|
||||
.title = Hallitse sivuja
|
||||
|
||||
## Digital signature properties (signature verification panel)
|
||||
|
||||
pdfjs-digital-signature-properties-button =
|
||||
.title = Digitaalisen allekirjoituksen ominaisuudet
|
||||
.aria-label = Digitaalisen allekirjoituksen ominaisuudet
|
||||
pdfjs-digital-signature-properties-button-label = Digitaalisen allekirjoituksen ominaisuudet
|
||||
|
||||
## Banner shown above the signature list summarising the overall
|
||||
## verification state of the document. Each variant is selected by the
|
||||
## viewer based on the worst per-signature status; one signature is
|
||||
## enough to lower the banner.
|
||||
##
|
||||
## Variables:
|
||||
## $count (Number) - number of signatures at the worst level.
|
||||
|
||||
pdfjs-digital-signature-properties-banner-verified = Asiakirja allekirjoitettiin kelvollisella digitaalisella allekirjoituksella
|
||||
pdfjs-digital-signature-properties-banner-unknown =
|
||||
{ $count ->
|
||||
[one] Asiakirja allekirjoitettu, mutta { $count } digitaalista allekirjoitusta ei voitu vahvistaa
|
||||
*[other] Asiakirja allekirjoitettu, mutta { $count } digitaalista allekirjoitusta ei voitu vahvistaa
|
||||
}
|
||||
pdfjs-digital-signature-properties-banner-untrusted =
|
||||
{ $count ->
|
||||
[one] Asiakirja on allekirjoitettu { $count } varmenteella, johon ei luoteta
|
||||
*[other] Asiakirja on allekirjoitettu { $count } varmenteella, joihin ei luoteta
|
||||
}
|
||||
pdfjs-digital-signature-properties-banner-expired =
|
||||
{ $count ->
|
||||
[one] Asiakirja allekirjoitettu { $count } vanhentuneella varmenteella
|
||||
*[other] Asiakirja allekirjoitettu { $count } vanhentuneella varmenteella
|
||||
}
|
||||
pdfjs-digital-signature-properties-banner-invalid =
|
||||
{ $count ->
|
||||
[one] Asiakirjassa on { $count } virheellinen digitaalinen allekirjoitus
|
||||
*[other] Asiakirjassa on { $count } virheellistä digitaalista allekirjoitusta
|
||||
}
|
||||
pdfjs-digital-signature-properties-banner-revoked =
|
||||
{ $count ->
|
||||
[one] Asiakirja allekirjoitettu { $count } kumotulla varmenteella
|
||||
*[other] Asiakirja allekirjoitettu { $count } kumotulla varmenteella
|
||||
}
|
||||
|
||||
## Per-signature status row. Only three distinct strings are needed:
|
||||
## the signature crypto either verified (the cert chain may still be
|
||||
## untrusted/expired/revoked, but that's surfaced on the cert row
|
||||
## below), or it failed, or its sub-format isn't supported.
|
||||
|
||||
pdfjs-digital-signature-properties-status-verified = Tila: Allekirjoitus vahvistettu
|
||||
pdfjs-digital-signature-properties-status-invalid = Tila: Allekirjoitus virheellinen
|
||||
pdfjs-digital-signature-properties-status-unknown = Tila: Vahvistus epäonnistui (ei tuettu)
|
||||
|
||||
## Per-signature certificate row. The variants with an issuer / date in
|
||||
## parentheses embed fully-localized context — no English fall-through.
|
||||
##
|
||||
## Variables:
|
||||
## $issuer (String) - issuer or subject common name from the cert.
|
||||
## $dateObj (Date) - notAfter date for the expired-with-date form.
|
||||
|
||||
pdfjs-digital-signature-properties-certificate-trusted = Varmenne: Luotettu ({ $issuer })
|
||||
pdfjs-digital-signature-properties-certificate-unknown = Varmenne: Ei saatavilla
|
||||
pdfjs-digital-signature-properties-certificate-untrusted = Varmenne: Ei-luotettu
|
||||
pdfjs-digital-signature-properties-certificate-untrusted-unknown-issuer = Varmenne: Tuntematon myöntäjä ({ $issuer })
|
||||
pdfjs-digital-signature-properties-certificate-untrusted-self-signed = Varmenne: Itse allekirjoitettu ({ $issuer })
|
||||
pdfjs-digital-signature-properties-certificate-untrusted-untrusted-issuer = Varmenne: Ei-luotettu myöntäjä ({ $issuer })
|
||||
pdfjs-digital-signature-properties-certificate-expired = Varmenne: Vanhentunut
|
||||
pdfjs-digital-signature-properties-certificate-expired-with-date = Varmenne: Vanhentunut ({ DATETIME($dateObj, dateStyle: "medium") })
|
||||
pdfjs-digital-signature-properties-certificate-revoked = Varmenne: Kumottu
|
||||
|
||||
## Main menu for adding/removing signatures
|
||||
|
||||
pdfjs-editor-delete-signature-button1 =
|
||||
|
||||
@ -153,6 +153,27 @@ pdfjs-document-properties-linearized = Affichage rapide des pages web :
|
||||
pdfjs-document-properties-linearized-yes = Oui
|
||||
pdfjs-document-properties-linearized-no = Non
|
||||
pdfjs-document-properties-close-button = Fermer
|
||||
pdfjs-digital-signature-properties-view-certificate = Afficher le certificat
|
||||
# Shown beneath an invalid signature card to explain why verification
|
||||
# failed. The text comes from NSS (e.g. "Signature integrity has been
|
||||
# compromised", "PKCS#7 signature could not be parsed") and is not
|
||||
# itself localized — it is the underlying error message produced by
|
||||
# the verification backend.
|
||||
# Variables:
|
||||
# $reason (String) - error message describing why the signature
|
||||
# could not be verified.
|
||||
pdfjs-digital-signature-properties-reason = Raison : { $reason }
|
||||
# Variables:
|
||||
# $dateObj (Date) - the signing time from the /Sig dict's /M entry.
|
||||
pdfjs-digital-signature-properties-timestamp = Horodatage : { DATETIME($dateObj, dateStyle: "short", timeStyle: "medium") }
|
||||
# Variables:
|
||||
# $count (Number) - number of nested sub-signatures (one per earlier
|
||||
# incremental revision of the document).
|
||||
pdfjs-digital-signature-properties-sub-signatures =
|
||||
{ $count ->
|
||||
[one] Sous-signature ({ $count })
|
||||
*[other] Sous-signatures ({ $count })
|
||||
}
|
||||
|
||||
## Print
|
||||
|
||||
@ -236,7 +257,7 @@ pdfjs-find-match-count = Occurrence { $current } sur { $total }
|
||||
# $limit (Number) - the maximum number of matches
|
||||
pdfjs-find-match-count-limit =
|
||||
{ $limit ->
|
||||
[one] Plus d’{ $limit } occurrence
|
||||
[1] Plus d’une occurrence
|
||||
*[other] Plus de { $limit } occurrences
|
||||
}
|
||||
pdfjs-find-not-found = Expression non trouvée
|
||||
@ -728,6 +749,74 @@ pdfjs-views-manager-waiting-for-file = Envoi du fichier…
|
||||
pdfjs-toggle-views-manager-button1 =
|
||||
.title = Gérer les pages
|
||||
|
||||
## Digital signature properties (signature verification panel)
|
||||
|
||||
pdfjs-digital-signature-properties-button =
|
||||
.title = Propriétés de la signature numérique
|
||||
.aria-label = Propriétés de la signature numérique
|
||||
pdfjs-digital-signature-properties-button-label = Propriétés de la signature numérique
|
||||
|
||||
## Banner shown above the signature list summarising the overall
|
||||
## verification state of the document. Each variant is selected by the
|
||||
## viewer based on the worst per-signature status; one signature is
|
||||
## enough to lower the banner.
|
||||
##
|
||||
## Variables:
|
||||
## $count (Number) - number of signatures at the worst level.
|
||||
|
||||
pdfjs-digital-signature-properties-banner-verified = Le document a été signé avec une signature numérique valide
|
||||
pdfjs-digital-signature-properties-banner-unknown =
|
||||
{ $count ->
|
||||
[one] Document signé mais { $count } signature numérique n’a pas pu être vérifiée
|
||||
*[other] Document signé mais { $count } signatures numériques n’ont pas pu être vérifiées
|
||||
}
|
||||
pdfjs-digital-signature-properties-banner-untrusted =
|
||||
{ $count ->
|
||||
[1] Document signé avec un certificat non digne de confiance
|
||||
*[other] Document signé avec { $count } certificats non dignes de confiance
|
||||
}
|
||||
pdfjs-digital-signature-properties-banner-expired =
|
||||
{ $count ->
|
||||
[1] Document signé avec un certificat expiré
|
||||
*[other] Document signé avec { $count } certificats expirés
|
||||
}
|
||||
pdfjs-digital-signature-properties-banner-invalid =
|
||||
{ $count ->
|
||||
[1] Le document contient une signature numérique non valide
|
||||
*[other] Le document contient { $count } signatures numériques non valides
|
||||
}
|
||||
pdfjs-digital-signature-properties-banner-revoked =
|
||||
{ $count ->
|
||||
[1] Document signé avec un certificat révoqué
|
||||
*[other] Document signé avec { $count } certificats révoqués
|
||||
}
|
||||
|
||||
## Per-signature status row. Only three distinct strings are needed:
|
||||
## the signature crypto either verified (the cert chain may still be
|
||||
## untrusted/expired/revoked, but that's surfaced on the cert row
|
||||
## below), or it failed, or its sub-format isn't supported.
|
||||
|
||||
pdfjs-digital-signature-properties-status-verified = État : signature vérifiée
|
||||
pdfjs-digital-signature-properties-status-invalid = État : signature invalide
|
||||
pdfjs-digital-signature-properties-status-unknown = État : impossible à vérifier (non pris en charge)
|
||||
|
||||
## Per-signature certificate row. The variants with an issuer / date in
|
||||
## parentheses embed fully-localized context — no English fall-through.
|
||||
##
|
||||
## Variables:
|
||||
## $issuer (String) - issuer or subject common name from the cert.
|
||||
## $dateObj (Date) - notAfter date for the expired-with-date form.
|
||||
|
||||
pdfjs-digital-signature-properties-certificate-trusted = Certificat : fiable ({ $issuer })
|
||||
pdfjs-digital-signature-properties-certificate-unknown = Certificat : indisponible
|
||||
pdfjs-digital-signature-properties-certificate-untrusted = Certificat : non fiable
|
||||
pdfjs-digital-signature-properties-certificate-untrusted-unknown-issuer = Certificat : émetteur inconnu ({ $issuer })
|
||||
pdfjs-digital-signature-properties-certificate-untrusted-self-signed = Certificat : auto-signé ({ $issuer })
|
||||
pdfjs-digital-signature-properties-certificate-untrusted-untrusted-issuer = Certificat : émetteur non fiable ({ $issuer })
|
||||
pdfjs-digital-signature-properties-certificate-expired = Certificat : expiré
|
||||
pdfjs-digital-signature-properties-certificate-expired-with-date = Certificat : expiré ({ DATETIME($dateObj, dateStyle: "medium") })
|
||||
pdfjs-digital-signature-properties-certificate-revoked = Certificat : révoqué
|
||||
|
||||
## Main menu for adding/removing signatures
|
||||
|
||||
pdfjs-editor-delete-signature-button1 =
|
||||
|
||||
@ -153,6 +153,27 @@ pdfjs-document-properties-linearized = Flugge webwerjefte:
|
||||
pdfjs-document-properties-linearized-yes = Ja
|
||||
pdfjs-document-properties-linearized-no = Nee
|
||||
pdfjs-document-properties-close-button = Slute
|
||||
pdfjs-digital-signature-properties-view-certificate = Sertifikaat besjen
|
||||
# Shown beneath an invalid signature card to explain why verification
|
||||
# failed. The text comes from NSS (e.g. "Signature integrity has been
|
||||
# compromised", "PKCS#7 signature could not be parsed") and is not
|
||||
# itself localized — it is the underlying error message produced by
|
||||
# the verification backend.
|
||||
# Variables:
|
||||
# $reason (String) - error message describing why the signature
|
||||
# could not be verified.
|
||||
pdfjs-digital-signature-properties-reason = Reden: { $reason }
|
||||
# Variables:
|
||||
# $dateObj (Date) - the signing time from the /Sig dict's /M entry.
|
||||
pdfjs-digital-signature-properties-timestamp = Tiidstimpel: { DATETIME($dateObj, dateStyle: "short", timeStyle: "medium") }
|
||||
# Variables:
|
||||
# $count (Number) - number of nested sub-signatures (one per earlier
|
||||
# incremental revision of the document).
|
||||
pdfjs-digital-signature-properties-sub-signatures =
|
||||
{ $count ->
|
||||
[one] Undertekening ({ $count })
|
||||
*[other] Undertekeningen ({ $count })
|
||||
}
|
||||
|
||||
## Print
|
||||
|
||||
@ -732,6 +753,74 @@ pdfjs-views-manager-waiting-for-file = Bestân oplade…
|
||||
pdfjs-toggle-views-manager-button1 =
|
||||
.title = Siden beheare
|
||||
|
||||
## Digital signature properties (signature verification panel)
|
||||
|
||||
pdfjs-digital-signature-properties-button =
|
||||
.title = Eigenskippen fan digitale hantekening
|
||||
.aria-label = Eigenskippen fan digitale hantekening
|
||||
pdfjs-digital-signature-properties-button-label = Eigenskippen fan digitale hantekening
|
||||
|
||||
## Banner shown above the signature list summarising the overall
|
||||
## verification state of the document. Each variant is selected by the
|
||||
## viewer based on the worst per-signature status; one signature is
|
||||
## enough to lower the banner.
|
||||
##
|
||||
## Variables:
|
||||
## $count (Number) - number of signatures at the worst level.
|
||||
|
||||
pdfjs-digital-signature-properties-banner-verified = Dokumint is ûndertekene mei in jildige digitale hantekening
|
||||
pdfjs-digital-signature-properties-banner-unknown =
|
||||
{ $count ->
|
||||
[one] Dokumint ûndertekene, mar { $count } digitale hantekening koe net ferifiearre wurde
|
||||
*[other] Dokumint ûndertekene, mar { $count } digitale hantekeningen koene net ferifiearre wurde
|
||||
}
|
||||
pdfjs-digital-signature-properties-banner-untrusted =
|
||||
{ $count ->
|
||||
[one] Dokumint ûndertekene mei { $count } sertifikaat dat net fertroud wurdt
|
||||
*[other] Dokumint ûndertekene mei { $count } sertifikaten dy’t net fertroud wurde
|
||||
}
|
||||
pdfjs-digital-signature-properties-banner-expired =
|
||||
{ $count ->
|
||||
[one] Dokumint ûndertekene mei { $count } ferrûne sertifikaat
|
||||
*[other] Dokumint ûndertekene mei { $count } ferrûne sertifikaten
|
||||
}
|
||||
pdfjs-digital-signature-properties-banner-invalid =
|
||||
{ $count ->
|
||||
[one] Dokumint hat { $count } ûnjildige digitale hantekening
|
||||
*[other] Dokumint hat { $count } ûnjildige digitale hantekeningen
|
||||
}
|
||||
pdfjs-digital-signature-properties-banner-revoked =
|
||||
{ $count ->
|
||||
[one] Dokumint ûndertekene mei { $count } ynlutsen sertifikaat
|
||||
*[other] Dokumint ûndertekene mei { $count } ynlutsen sertifikaten
|
||||
}
|
||||
|
||||
## Per-signature status row. Only three distinct strings are needed:
|
||||
## the signature crypto either verified (the cert chain may still be
|
||||
## untrusted/expired/revoked, but that's surfaced on the cert row
|
||||
## below), or it failed, or its sub-format isn't supported.
|
||||
|
||||
pdfjs-digital-signature-properties-status-verified = Status: hantekening ferifiearre
|
||||
pdfjs-digital-signature-properties-status-invalid = Status: hantekening ûnjildich
|
||||
pdfjs-digital-signature-properties-status-unknown = Status: kin net ferifiearje wurde (net stipe)
|
||||
|
||||
## Per-signature certificate row. The variants with an issuer / date in
|
||||
## parentheses embed fully-localized context — no English fall-through.
|
||||
##
|
||||
## Variables:
|
||||
## $issuer (String) - issuer or subject common name from the cert.
|
||||
## $dateObj (Date) - notAfter date for the expired-with-date form.
|
||||
|
||||
pdfjs-digital-signature-properties-certificate-trusted = Sertifikaat: fertroud ({ $issuer })
|
||||
pdfjs-digital-signature-properties-certificate-unknown = Sertifikaat: net beskikber
|
||||
pdfjs-digital-signature-properties-certificate-untrusted = Sertifikaat: net fertroud
|
||||
pdfjs-digital-signature-properties-certificate-untrusted-unknown-issuer = Sertifikaat: Unbekende útjouwer ({ $issuer })
|
||||
pdfjs-digital-signature-properties-certificate-untrusted-self-signed = Sertifikaat: selsûndertekene ({ $issuer })
|
||||
pdfjs-digital-signature-properties-certificate-untrusted-untrusted-issuer = Sertifikaat: net-fertroude útjouwer ({ $issuer })
|
||||
pdfjs-digital-signature-properties-certificate-expired = Sertifikaat: ferrûn
|
||||
pdfjs-digital-signature-properties-certificate-expired-with-date = Sertifikaat: ferrûn ({ DATETIME($dateObj, dateStyle: "medium") })
|
||||
pdfjs-digital-signature-properties-certificate-revoked = Sertifikaat: ynlutsen
|
||||
|
||||
## Main menu for adding/removing signatures
|
||||
|
||||
pdfjs-editor-delete-signature-button1 =
|
||||
|
||||
@ -153,6 +153,27 @@ pdfjs-document-properties-linearized = Ñanduti jahecha pya’e:
|
||||
pdfjs-document-properties-linearized-yes = Añete
|
||||
pdfjs-document-properties-linearized-no = Ahániri
|
||||
pdfjs-document-properties-close-button = Mboty
|
||||
pdfjs-digital-signature-properties-view-certificate = Mboajapyre jehecha
|
||||
# Shown beneath an invalid signature card to explain why verification
|
||||
# failed. The text comes from NSS (e.g. "Signature integrity has been
|
||||
# compromised", "PKCS#7 signature could not be parsed") and is not
|
||||
# itself localized — it is the underlying error message produced by
|
||||
# the verification backend.
|
||||
# Variables:
|
||||
# $reason (String) - error message describing why the signature
|
||||
# could not be verified.
|
||||
pdfjs-digital-signature-properties-reason = Mba’ére: { $reason }
|
||||
# Variables:
|
||||
# $dateObj (Date) - the signing time from the /Sig dict's /M entry.
|
||||
pdfjs-digital-signature-properties-timestamp = Ára: { DATETIME($dateObj, dateStyle: "short", timeStyle: "medium") }
|
||||
# Variables:
|
||||
# $count (Number) - number of nested sub-signatures (one per earlier
|
||||
# incremental revision of the document).
|
||||
pdfjs-digital-signature-properties-sub-signatures =
|
||||
{ $count ->
|
||||
[one] Mboheraguapy’i ({ $count })
|
||||
*[other] Mboheraguapy’ieta ({ $count })
|
||||
}
|
||||
|
||||
## Print
|
||||
|
||||
@ -560,6 +581,7 @@ pdfjs-editor-undo-bar-close-button-label = Mboty
|
||||
|
||||
## Add a signature dialog
|
||||
|
||||
pdfjs-editor-add-signature-dialog-label = Ko modal omoneĩ poruhárape omoheñóivo mboheraguapy ombojuaju hag̃ua PDF rehe. Upe poruhára ombosako’ikuaa téra (oikóva avei moñe’ẽrã mokõihávarõ) ha, ejaposérõ, eñongatu mboheraguapy eiporujey hag̃ua.
|
||||
pdfjs-editor-add-signature-dialog-title = Embojuaju teraguapy
|
||||
|
||||
## Tab names
|
||||
@ -731,6 +753,49 @@ pdfjs-views-manager-waiting-for-file = Ehupihína marandurenda…
|
||||
pdfjs-toggle-views-manager-button1 =
|
||||
.title = Eñangareko kuotiarogue
|
||||
|
||||
## Digital signature properties (signature verification panel)
|
||||
|
||||
pdfjs-digital-signature-properties-button =
|
||||
.title = Firma digital oguerekóva
|
||||
.aria-label = Firma digital oguerekóva
|
||||
pdfjs-digital-signature-properties-button-label = Firma digital oguerekóva
|
||||
|
||||
## Banner shown above the signature list summarising the overall
|
||||
## verification state of the document. Each variant is selected by the
|
||||
## viewer based on the worst per-signature status; one signature is
|
||||
## enough to lower the banner.
|
||||
##
|
||||
## Variables:
|
||||
## $count (Number) - number of signatures at the worst level.
|
||||
|
||||
pdfjs-digital-signature-properties-banner-verified = Pe kuatia oñemboheraguapy firma digital oikóvape
|
||||
|
||||
## Per-signature status row. Only three distinct strings are needed:
|
||||
## the signature crypto either verified (the cert chain may still be
|
||||
## untrusted/expired/revoked, but that's surfaced on the cert row
|
||||
## below), or it failed, or its sub-format isn't supported.
|
||||
|
||||
pdfjs-digital-signature-properties-status-verified = Heko: Mboheraguapy hechajeypyre
|
||||
pdfjs-digital-signature-properties-status-invalid = Heko: Mboheraguapy oiko’ỹva
|
||||
pdfjs-digital-signature-properties-status-unknown = Heko: Ndojehechajeykuaái (ndojokupytýi)
|
||||
|
||||
## Per-signature certificate row. The variants with an issuer / date in
|
||||
## parentheses embed fully-localized context — no English fall-through.
|
||||
##
|
||||
## Variables:
|
||||
## $issuer (String) - issuer or subject common name from the cert.
|
||||
## $dateObj (Date) - notAfter date for the expired-with-date form.
|
||||
|
||||
pdfjs-digital-signature-properties-certificate-trusted = Mboajapyre: Jeroviaha ({ $issuer })
|
||||
pdfjs-digital-signature-properties-certificate-unknown = Mboajapyre: Oĩ’ỹva
|
||||
pdfjs-digital-signature-properties-certificate-untrusted = Mboajapyre: Jerovia’ỹha
|
||||
pdfjs-digital-signature-properties-certificate-untrusted-unknown-issuer = Mboajapyre: Guenohẽha jekuaa’ỹva ({ $issuer })
|
||||
pdfjs-digital-signature-properties-certificate-untrusted-self-signed = Mboajapyre: Heraguapejeheguíva { $issuer })
|
||||
pdfjs-digital-signature-properties-certificate-untrusted-untrusted-issuer = Mboajapyre: Guenohẽha jerovia’ỹha ({ $issuer })
|
||||
pdfjs-digital-signature-properties-certificate-expired = Mboajapyre: Oikove’ỹmava
|
||||
pdfjs-digital-signature-properties-certificate-expired-with-date = Mboajapyre: Oikove’ỹmava ({ DATETIME($dateObj, dateStyle: "medium") })
|
||||
pdfjs-digital-signature-properties-certificate-revoked = Mboajapyre: Mbojevypyre
|
||||
|
||||
## Main menu for adding/removing signatures
|
||||
|
||||
pdfjs-editor-delete-signature-button1 =
|
||||
|
||||
@ -153,6 +153,27 @@ pdfjs-document-properties-linearized = תצוגת דף מהירה:
|
||||
pdfjs-document-properties-linearized-yes = כן
|
||||
pdfjs-document-properties-linearized-no = לא
|
||||
pdfjs-document-properties-close-button = סגירה
|
||||
pdfjs-digital-signature-properties-view-certificate = הצגת אישור
|
||||
# Shown beneath an invalid signature card to explain why verification
|
||||
# failed. The text comes from NSS (e.g. "Signature integrity has been
|
||||
# compromised", "PKCS#7 signature could not be parsed") and is not
|
||||
# itself localized — it is the underlying error message produced by
|
||||
# the verification backend.
|
||||
# Variables:
|
||||
# $reason (String) - error message describing why the signature
|
||||
# could not be verified.
|
||||
pdfjs-digital-signature-properties-reason = סיבה: { $reason }
|
||||
# Variables:
|
||||
# $dateObj (Date) - the signing time from the /Sig dict's /M entry.
|
||||
pdfjs-digital-signature-properties-timestamp = חותמת זמן: { DATETIME($dateObj, dateStyle: "short", timeStyle: "medium") }
|
||||
# Variables:
|
||||
# $count (Number) - number of nested sub-signatures (one per earlier
|
||||
# incremental revision of the document).
|
||||
pdfjs-digital-signature-properties-sub-signatures =
|
||||
{ $count ->
|
||||
[one] חתימת משנה ({ $count })
|
||||
*[other] חתימות משנה ({ $count })
|
||||
}
|
||||
|
||||
## Print
|
||||
|
||||
@ -732,6 +753,74 @@ pdfjs-views-manager-waiting-for-file = בתהליך העלאת הקובץ…
|
||||
pdfjs-toggle-views-manager-button1 =
|
||||
.title = ניהול עמודים
|
||||
|
||||
## Digital signature properties (signature verification panel)
|
||||
|
||||
pdfjs-digital-signature-properties-button =
|
||||
.title = מאפייני חתימה דיגיטלית
|
||||
.aria-label = מאפייני חתימה דיגיטלית
|
||||
pdfjs-digital-signature-properties-button-label = מאפייני חתימה דיגיטלית
|
||||
|
||||
## Banner shown above the signature list summarising the overall
|
||||
## verification state of the document. Each variant is selected by the
|
||||
## viewer based on the worst per-signature status; one signature is
|
||||
## enough to lower the banner.
|
||||
##
|
||||
## Variables:
|
||||
## $count (Number) - number of signatures at the worst level.
|
||||
|
||||
pdfjs-digital-signature-properties-banner-verified = המסמך נחתם בחתימה דיגיטלית תקפה
|
||||
pdfjs-digital-signature-properties-banner-unknown =
|
||||
{ $count ->
|
||||
[one] המסמך חתום אך לא ניתן היה לאמת חתימה דיגיטלית אחת
|
||||
*[other] המסמך חתום אך לא ניתן היה לאמת { $count } חתימות דיגיטליות
|
||||
}
|
||||
pdfjs-digital-signature-properties-banner-untrusted =
|
||||
{ $count ->
|
||||
[one] המסמך חתום עם אישור אחד שאינו מהימן
|
||||
*[other] המסמך חתום עם { $count } אישורים שאינם מהימנים
|
||||
}
|
||||
pdfjs-digital-signature-properties-banner-expired =
|
||||
{ $count ->
|
||||
[one] המסמך חתום עם אישור אחד שפג תוקפו
|
||||
*[other] המסמך חתום עם { $count } אישורים שפג תוקפם
|
||||
}
|
||||
pdfjs-digital-signature-properties-banner-invalid =
|
||||
{ $count ->
|
||||
[one] למסמך יש חתימה דיגיטלית אחת שאינה תקינה
|
||||
*[other] למסמך יש { $count } חתימות דיגיטליות שאינן תקינות
|
||||
}
|
||||
pdfjs-digital-signature-properties-banner-revoked =
|
||||
{ $count ->
|
||||
[one] המסמך חתום עם אישור אחד שנשלל
|
||||
*[other] המסמך חתום עם { $count } אישורים שנשללו
|
||||
}
|
||||
|
||||
## Per-signature status row. Only three distinct strings are needed:
|
||||
## the signature crypto either verified (the cert chain may still be
|
||||
## untrusted/expired/revoked, but that's surfaced on the cert row
|
||||
## below), or it failed, or its sub-format isn't supported.
|
||||
|
||||
pdfjs-digital-signature-properties-status-verified = מצב: החתימה מאומתת
|
||||
pdfjs-digital-signature-properties-status-invalid = מצב: החתימה לא תקינה
|
||||
pdfjs-digital-signature-properties-status-unknown = מצב: לא ניתן לאמת (לא נתמך)
|
||||
|
||||
## Per-signature certificate row. The variants with an issuer / date in
|
||||
## parentheses embed fully-localized context — no English fall-through.
|
||||
##
|
||||
## Variables:
|
||||
## $issuer (String) - issuer or subject common name from the cert.
|
||||
## $dateObj (Date) - notAfter date for the expired-with-date form.
|
||||
|
||||
pdfjs-digital-signature-properties-certificate-trusted = אישור אבטחה: מהימן ({ $issuer })
|
||||
pdfjs-digital-signature-properties-certificate-unknown = אישור אבטחה: לא זמין
|
||||
pdfjs-digital-signature-properties-certificate-untrusted = אישור אבטחה: לא מהימן
|
||||
pdfjs-digital-signature-properties-certificate-untrusted-unknown-issuer = אישור אבטחה: מנפיק לא ידוע ({ $issuer })
|
||||
pdfjs-digital-signature-properties-certificate-untrusted-self-signed = אישור אבטחה: נחתם עצמית ({ $issuer })
|
||||
pdfjs-digital-signature-properties-certificate-untrusted-untrusted-issuer = אישור אבטחה: מנפיק לא מהימן ({ $issuer })
|
||||
pdfjs-digital-signature-properties-certificate-expired = אישור אבטחה: פג תוקפו
|
||||
pdfjs-digital-signature-properties-certificate-expired-with-date = אישור אבטחה: פג תוקפו ({ DATETIME($dateObj, dateStyle: "medium") })
|
||||
pdfjs-digital-signature-properties-certificate-revoked = אישור אבטחה: נשלל
|
||||
|
||||
## Main menu for adding/removing signatures
|
||||
|
||||
pdfjs-editor-delete-signature-button1 =
|
||||
|
||||
@ -153,6 +153,29 @@ pdfjs-document-properties-linearized = Fast Web View:
|
||||
pdfjs-document-properties-linearized-yes = Haj
|
||||
pdfjs-document-properties-linearized-no = Ně
|
||||
pdfjs-document-properties-close-button = Začinić
|
||||
pdfjs-digital-signature-properties-view-certificate = Certifikat pokazać
|
||||
# Shown beneath an invalid signature card to explain why verification
|
||||
# failed. The text comes from NSS (e.g. "Signature integrity has been
|
||||
# compromised", "PKCS#7 signature could not be parsed") and is not
|
||||
# itself localized — it is the underlying error message produced by
|
||||
# the verification backend.
|
||||
# Variables:
|
||||
# $reason (String) - error message describing why the signature
|
||||
# could not be verified.
|
||||
pdfjs-digital-signature-properties-reason = Přičina: { $reason }
|
||||
# Variables:
|
||||
# $dateObj (Date) - the signing time from the /Sig dict's /M entry.
|
||||
pdfjs-digital-signature-properties-timestamp = Časowy kołk: { DATETIME($dateObj, dateStyle: "short", timeStyle: "medium") }
|
||||
# Variables:
|
||||
# $count (Number) - number of nested sub-signatures (one per earlier
|
||||
# incremental revision of the document).
|
||||
pdfjs-digital-signature-properties-sub-signatures =
|
||||
{ $count ->
|
||||
[one] { $count } podsignatura
|
||||
[two] { $count } podsignaturje
|
||||
[few] { $count } podsignatury
|
||||
*[other] { $count } podsignaturow
|
||||
}
|
||||
|
||||
## Print
|
||||
|
||||
@ -748,6 +771,84 @@ pdfjs-views-manager-waiting-for-file = Dataja so nahrawa…
|
||||
pdfjs-toggle-views-manager-button1 =
|
||||
.title = Strony rjadować
|
||||
|
||||
## Digital signature properties (signature verification panel)
|
||||
|
||||
pdfjs-digital-signature-properties-button =
|
||||
.title = Kajkosće digitalneje signatury
|
||||
.aria-label = Kajkosće digitalneje signatury
|
||||
pdfjs-digital-signature-properties-button-label = Kajkosće digitalneje signatury
|
||||
|
||||
## Banner shown above the signature list summarising the overall
|
||||
## verification state of the document. Each variant is selected by the
|
||||
## viewer based on the worst per-signature status; one signature is
|
||||
## enough to lower the banner.
|
||||
##
|
||||
## Variables:
|
||||
## $count (Number) - number of signatures at the worst level.
|
||||
|
||||
pdfjs-digital-signature-properties-banner-verified = Dokument je so z płaćiwej digitalnej signaturu signował
|
||||
pdfjs-digital-signature-properties-banner-unknown =
|
||||
{ $count ->
|
||||
[one] Dokument je so signował, ale { $count } digitalna signatura njeda so wobkrućić
|
||||
[two] Dokument je so signował, ale { $count } digitalnej signaturje njedatej so wobkrućić
|
||||
[few] Dokument je so signował, ale { $count } digitalne signatury njedachu so wobkrućić
|
||||
*[other] Dokument je so signował, ale { $count } digitalnych signaturow njeda so wobkrućić
|
||||
}
|
||||
pdfjs-digital-signature-properties-banner-untrusted =
|
||||
{ $count ->
|
||||
[one] Dokument je z { $count } certifikatom signowany, kotryž dowěry hódny njeje
|
||||
[two] Dokument je z { $count } certifikatomaj signowany, kotrejž dowěry hódnej njejstej
|
||||
[few] Dokument je z { $count } certifikatami signowany, kotrež dowěry hódne njejsu
|
||||
*[other] Dokument je z { $count } certifikatami signowany, kotrež dowěry hódne njejsu
|
||||
}
|
||||
pdfjs-digital-signature-properties-banner-expired =
|
||||
{ $count ->
|
||||
[one] Dokument je z { $count } spadnjenym certifikatom signowany
|
||||
[two] Dokument je z { $count } spadnjenymaj certifikatomaj signowany
|
||||
[few] Dokument je z { $count } spadnjenymi certifikatami signowany
|
||||
*[other] Dokument je z { $count } spadnjenymi certifikatami signowany
|
||||
}
|
||||
pdfjs-digital-signature-properties-banner-invalid =
|
||||
{ $count ->
|
||||
[one] Dokument ma { $count } njepłaćiwu digitalnu signaturu
|
||||
[two] Dokument ma { $count } njepłaćiwej digitalnej signaturje
|
||||
[few] Dokument ma { $count } njepłaćiwe digitalne signatury
|
||||
*[other] Dokument ma { $count } njepłaćiwych digitalnych signaturow
|
||||
}
|
||||
pdfjs-digital-signature-properties-banner-revoked =
|
||||
{ $count ->
|
||||
[one] Dokument je z { $count } wotwołanym certifikatom signowany
|
||||
[two] Dokument je z { $count } wotwołanymaj certifikatomaj signowany
|
||||
[few] Dokument je z { $count } wotwołanymi certifikatami signowany
|
||||
*[other] Dokument je z { $count } wotwołanymi certifikatami signowany
|
||||
}
|
||||
|
||||
## Per-signature status row. Only three distinct strings are needed:
|
||||
## the signature crypto either verified (the cert chain may still be
|
||||
## untrusted/expired/revoked, but that's surfaced on the cert row
|
||||
## below), or it failed, or its sub-format isn't supported.
|
||||
|
||||
pdfjs-digital-signature-properties-status-verified = Status: Signatura je wobkrućena
|
||||
pdfjs-digital-signature-properties-status-invalid = Status: Signatura je njepłaćiwa
|
||||
pdfjs-digital-signature-properties-status-unknown = Status: Njeda so wobkrućić (njepodpěruje so)
|
||||
|
||||
## Per-signature certificate row. The variants with an issuer / date in
|
||||
## parentheses embed fully-localized context — no English fall-through.
|
||||
##
|
||||
## Variables:
|
||||
## $issuer (String) - issuer or subject common name from the cert.
|
||||
## $dateObj (Date) - notAfter date for the expired-with-date form.
|
||||
|
||||
pdfjs-digital-signature-properties-certificate-trusted = Certifikat: Dowěry hódny ({ $issuer })
|
||||
pdfjs-digital-signature-properties-certificate-unknown = Certifikat: Nic k dispoziciji
|
||||
pdfjs-digital-signature-properties-certificate-untrusted = Certifikat: Dowěry njehódny
|
||||
pdfjs-digital-signature-properties-certificate-untrusted-unknown-issuer = Certifikat: Njeznaty wudawar ({ $issuer })
|
||||
pdfjs-digital-signature-properties-certificate-untrusted-self-signed = Certifikat: Samsignowany ({ $issuer })
|
||||
pdfjs-digital-signature-properties-certificate-untrusted-untrusted-issuer = Certifikat: Dowěry njehódny wudawar ({ $issuer })
|
||||
pdfjs-digital-signature-properties-certificate-expired = Certifikat: Spadnjeny
|
||||
pdfjs-digital-signature-properties-certificate-expired-with-date = Certifikat: Spadnjeny ({ DATETIME($dateObj, dateStyle: "medium") })
|
||||
pdfjs-digital-signature-properties-certificate-revoked = Certifikat: Wotwołany
|
||||
|
||||
## Main menu for adding/removing signatures
|
||||
|
||||
pdfjs-editor-delete-signature-button1 =
|
||||
|
||||
@ -153,6 +153,27 @@ pdfjs-document-properties-linearized = Gyors webes nézet:
|
||||
pdfjs-document-properties-linearized-yes = Igen
|
||||
pdfjs-document-properties-linearized-no = Nem
|
||||
pdfjs-document-properties-close-button = Bezárás
|
||||
pdfjs-digital-signature-properties-view-certificate = Tanúsítvány megtekintése
|
||||
# Shown beneath an invalid signature card to explain why verification
|
||||
# failed. The text comes from NSS (e.g. "Signature integrity has been
|
||||
# compromised", "PKCS#7 signature could not be parsed") and is not
|
||||
# itself localized — it is the underlying error message produced by
|
||||
# the verification backend.
|
||||
# Variables:
|
||||
# $reason (String) - error message describing why the signature
|
||||
# could not be verified.
|
||||
pdfjs-digital-signature-properties-reason = Ok: { $reason }
|
||||
# Variables:
|
||||
# $dateObj (Date) - the signing time from the /Sig dict's /M entry.
|
||||
pdfjs-digital-signature-properties-timestamp = Időbélyeg: { DATETIME($dateObj, dateStyle: "short", timeStyle: "medium") }
|
||||
# Variables:
|
||||
# $count (Number) - number of nested sub-signatures (one per earlier
|
||||
# incremental revision of the document).
|
||||
pdfjs-digital-signature-properties-sub-signatures =
|
||||
{ $count ->
|
||||
[one] Részaláírás ({ $count })
|
||||
*[other] Részaláírások ({ $count })
|
||||
}
|
||||
|
||||
## Print
|
||||
|
||||
@ -732,6 +753,74 @@ pdfjs-views-manager-waiting-for-file = Fájl feltöltése…
|
||||
pdfjs-toggle-views-manager-button1 =
|
||||
.title = Oldalak kezelése
|
||||
|
||||
## Digital signature properties (signature verification panel)
|
||||
|
||||
pdfjs-digital-signature-properties-button =
|
||||
.title = Digitális aláírás tulajdonságai
|
||||
.aria-label = Digitális aláírás tulajdonságai
|
||||
pdfjs-digital-signature-properties-button-label = Digitális aláírás tulajdonságai
|
||||
|
||||
## Banner shown above the signature list summarising the overall
|
||||
## verification state of the document. Each variant is selected by the
|
||||
## viewer based on the worst per-signature status; one signature is
|
||||
## enough to lower the banner.
|
||||
##
|
||||
## Variables:
|
||||
## $count (Number) - number of signatures at the worst level.
|
||||
|
||||
pdfjs-digital-signature-properties-banner-verified = A dokumentum érvényes digitális aláírással lett aláírva
|
||||
pdfjs-digital-signature-properties-banner-unknown =
|
||||
{ $count ->
|
||||
[one] A dokumentum alá van írva, de { $count } digitális aláírás nem ellenőrizhető
|
||||
*[other] A dokumentum alá van írva, de { $count } digitális aláírás nem ellenőrizhető
|
||||
}
|
||||
pdfjs-digital-signature-properties-banner-untrusted =
|
||||
{ $count ->
|
||||
[one] A dokumentum { $count } nem megbízható tanúsítvánnyal van aláírva
|
||||
*[other] A dokumentum { $count } nem megbízható tanúsítvánnyal van aláírva
|
||||
}
|
||||
pdfjs-digital-signature-properties-banner-expired =
|
||||
{ $count ->
|
||||
[one] A dokumentum { $count } lejárt tanúsítvánnyal van aláírva
|
||||
*[other] A dokumentum { $count } lejárt tanúsítvánnyal van aláírva
|
||||
}
|
||||
pdfjs-digital-signature-properties-banner-invalid =
|
||||
{ $count ->
|
||||
[one] A dokumentum { $count } érvénytelen aláírással rendelkezik
|
||||
*[other] A dokumentum { $count } érvénytelen aláírással rendelkezik
|
||||
}
|
||||
pdfjs-digital-signature-properties-banner-revoked =
|
||||
{ $count ->
|
||||
[one] A dokumentum { $count } visszavont tanúsítvánnyal van aláírva
|
||||
*[other] A dokumentum { $count } visszavont tanúsítvánnyal van aláírva
|
||||
}
|
||||
|
||||
## Per-signature status row. Only three distinct strings are needed:
|
||||
## the signature crypto either verified (the cert chain may still be
|
||||
## untrusted/expired/revoked, but that's surfaced on the cert row
|
||||
## below), or it failed, or its sub-format isn't supported.
|
||||
|
||||
pdfjs-digital-signature-properties-status-verified = Állapot: az aláírás ellenőrizve
|
||||
pdfjs-digital-signature-properties-status-invalid = Állapot: az aláírás érvénytelen
|
||||
pdfjs-digital-signature-properties-status-unknown = Állapot: nem ellenőrizhető (nem támogatott)
|
||||
|
||||
## Per-signature certificate row. The variants with an issuer / date in
|
||||
## parentheses embed fully-localized context — no English fall-through.
|
||||
##
|
||||
## Variables:
|
||||
## $issuer (String) - issuer or subject common name from the cert.
|
||||
## $dateObj (Date) - notAfter date for the expired-with-date form.
|
||||
|
||||
pdfjs-digital-signature-properties-certificate-trusted = Tanúsítvány: megbízható ({ $issuer })
|
||||
pdfjs-digital-signature-properties-certificate-unknown = Tanúsítvány: nem érhető el
|
||||
pdfjs-digital-signature-properties-certificate-untrusted = Tanúsítvány: nem megbízható
|
||||
pdfjs-digital-signature-properties-certificate-untrusted-unknown-issuer = Tanúsítvány: ismeretlen kibocsátó ({ $issuer })
|
||||
pdfjs-digital-signature-properties-certificate-untrusted-self-signed = Tanúsítvány: önaláírt ({ $issuer })
|
||||
pdfjs-digital-signature-properties-certificate-untrusted-untrusted-issuer = Tanúsítvány: nem megbízható kibocsátó ({ $issuer })
|
||||
pdfjs-digital-signature-properties-certificate-expired = Tanúsítvány: lejárt
|
||||
pdfjs-digital-signature-properties-certificate-expired-with-date = Tanúsítvány: lejárt ({ DATETIME($dateObj, dateStyle: "medium") })
|
||||
pdfjs-digital-signature-properties-certificate-revoked = Tanúsítvány: visszavonva
|
||||
|
||||
## Main menu for adding/removing signatures
|
||||
|
||||
pdfjs-editor-delete-signature-button1 =
|
||||
|
||||
@ -153,6 +153,15 @@ pdfjs-document-properties-linearized = Արագ վեբ դիտում․
|
||||
pdfjs-document-properties-linearized-yes = Այո
|
||||
pdfjs-document-properties-linearized-no = Ոչ
|
||||
pdfjs-document-properties-close-button = Փակել
|
||||
# Shown beneath an invalid signature card to explain why verification
|
||||
# failed. The text comes from NSS (e.g. "Signature integrity has been
|
||||
# compromised", "PKCS#7 signature could not be parsed") and is not
|
||||
# itself localized — it is the underlying error message produced by
|
||||
# the verification backend.
|
||||
# Variables:
|
||||
# $reason (String) - error message describing why the signature
|
||||
# could not be verified.
|
||||
pdfjs-digital-signature-properties-reason = Պատճառը՝ { $reason }
|
||||
|
||||
## Print
|
||||
|
||||
|
||||
@ -153,6 +153,27 @@ pdfjs-document-properties-linearized = Vista web rapide:
|
||||
pdfjs-document-properties-linearized-yes = Si
|
||||
pdfjs-document-properties-linearized-no = No
|
||||
pdfjs-document-properties-close-button = Clauder
|
||||
pdfjs-digital-signature-properties-view-certificate = Vider le certificato
|
||||
# Shown beneath an invalid signature card to explain why verification
|
||||
# failed. The text comes from NSS (e.g. "Signature integrity has been
|
||||
# compromised", "PKCS#7 signature could not be parsed") and is not
|
||||
# itself localized — it is the underlying error message produced by
|
||||
# the verification backend.
|
||||
# Variables:
|
||||
# $reason (String) - error message describing why the signature
|
||||
# could not be verified.
|
||||
pdfjs-digital-signature-properties-reason = Ration: { $reason }
|
||||
# Variables:
|
||||
# $dateObj (Date) - the signing time from the /Sig dict's /M entry.
|
||||
pdfjs-digital-signature-properties-timestamp = Data e hora: { DATETIME($dateObj, dateStyle: "short", timeStyle: "medium") }
|
||||
# Variables:
|
||||
# $count (Number) - number of nested sub-signatures (one per earlier
|
||||
# incremental revision of the document).
|
||||
pdfjs-digital-signature-properties-sub-signatures =
|
||||
{ $count ->
|
||||
[one] Firma secundari ({ $count })
|
||||
*[other] Firmas secundari ({ $count })
|
||||
}
|
||||
|
||||
## Print
|
||||
|
||||
@ -732,6 +753,74 @@ pdfjs-views-manager-waiting-for-file = Cargante file…
|
||||
pdfjs-toggle-views-manager-button1 =
|
||||
.title = Gerer paginas
|
||||
|
||||
## Digital signature properties (signature verification panel)
|
||||
|
||||
pdfjs-digital-signature-properties-button =
|
||||
.title = Proprietates del firma digital
|
||||
.aria-label = Proprietates del firma digital
|
||||
pdfjs-digital-signature-properties-button-label = Proprietates del firma digital
|
||||
|
||||
## Banner shown above the signature list summarising the overall
|
||||
## verification state of the document. Each variant is selected by the
|
||||
## viewer based on the worst per-signature status; one signature is
|
||||
## enough to lower the banner.
|
||||
##
|
||||
## Variables:
|
||||
## $count (Number) - number of signatures at the worst level.
|
||||
|
||||
pdfjs-digital-signature-properties-banner-verified = Le documento era firmate con un firma digital valide
|
||||
pdfjs-digital-signature-properties-banner-unknown =
|
||||
{ $count ->
|
||||
[one] Documento firmate ma { $count } firma digital non poteva esser verificate
|
||||
*[other] Documento firmate ma { $count } firmas digital non poteva esser verificate
|
||||
}
|
||||
pdfjs-digital-signature-properties-banner-untrusted =
|
||||
{ $count ->
|
||||
[one] Documento firmate con { $count } certificato que non es de fiducia
|
||||
*[other] Documento firmate con { $count } certificatos que non es de fiducia
|
||||
}
|
||||
pdfjs-digital-signature-properties-banner-expired =
|
||||
{ $count ->
|
||||
[one] Documento firmate con { $count } certificato expirate
|
||||
*[other] Documento firmate con { $count } certificatos expirate
|
||||
}
|
||||
pdfjs-digital-signature-properties-banner-invalid =
|
||||
{ $count ->
|
||||
[one] Le documento ha { $count } firma digital non valide
|
||||
*[other] Le documento ha { $count } firmas digital non valide
|
||||
}
|
||||
pdfjs-digital-signature-properties-banner-revoked =
|
||||
{ $count ->
|
||||
[one] Documento firmate con { $count } certificato revocate
|
||||
*[other] Documento firmate con { $count } certificatos revocate
|
||||
}
|
||||
|
||||
## Per-signature status row. Only three distinct strings are needed:
|
||||
## the signature crypto either verified (the cert chain may still be
|
||||
## untrusted/expired/revoked, but that's surfaced on the cert row
|
||||
## below), or it failed, or its sub-format isn't supported.
|
||||
|
||||
pdfjs-digital-signature-properties-status-verified = Stato: firma verificate
|
||||
pdfjs-digital-signature-properties-status-invalid = Stato: firma non valide
|
||||
pdfjs-digital-signature-properties-status-unknown = Stato: impossibile verificar (non supportate)
|
||||
|
||||
## Per-signature certificate row. The variants with an issuer / date in
|
||||
## parentheses embed fully-localized context — no English fall-through.
|
||||
##
|
||||
## Variables:
|
||||
## $issuer (String) - issuer or subject common name from the cert.
|
||||
## $dateObj (Date) - notAfter date for the expired-with-date form.
|
||||
|
||||
pdfjs-digital-signature-properties-certificate-trusted = Certificato: de fiducia ({ $issuer })
|
||||
pdfjs-digital-signature-properties-certificate-unknown = Certificato: indisponibile
|
||||
pdfjs-digital-signature-properties-certificate-untrusted = Certificato: non de confidentia
|
||||
pdfjs-digital-signature-properties-certificate-untrusted-unknown-issuer = Certificato: emissor incognite ({ $issuer })
|
||||
pdfjs-digital-signature-properties-certificate-untrusted-self-signed = Certificato: auto-firmate ({ $issuer })
|
||||
pdfjs-digital-signature-properties-certificate-untrusted-untrusted-issuer = Certificato: emissor non de confidentia ({ $issuer })
|
||||
pdfjs-digital-signature-properties-certificate-expired = Certificato: expirate
|
||||
pdfjs-digital-signature-properties-certificate-expired-with-date = Certificato: expirate ({ DATETIME($dateObj, dateStyle: "medium") })
|
||||
pdfjs-digital-signature-properties-certificate-revoked = Certificato: revocate
|
||||
|
||||
## Main menu for adding/removing signatures
|
||||
|
||||
pdfjs-editor-delete-signature-button1 =
|
||||
|
||||
@ -153,6 +153,27 @@ pdfjs-document-properties-linearized = Visualizzazione web veloce:
|
||||
pdfjs-document-properties-linearized-yes = Sì
|
||||
pdfjs-document-properties-linearized-no = No
|
||||
pdfjs-document-properties-close-button = Chiudi
|
||||
pdfjs-digital-signature-properties-view-certificate = Visualizza certificato
|
||||
# Shown beneath an invalid signature card to explain why verification
|
||||
# failed. The text comes from NSS (e.g. "Signature integrity has been
|
||||
# compromised", "PKCS#7 signature could not be parsed") and is not
|
||||
# itself localized — it is the underlying error message produced by
|
||||
# the verification backend.
|
||||
# Variables:
|
||||
# $reason (String) - error message describing why the signature
|
||||
# could not be verified.
|
||||
pdfjs-digital-signature-properties-reason = Motivo: { $reason }
|
||||
# Variables:
|
||||
# $dateObj (Date) - the signing time from the /Sig dict's /M entry.
|
||||
pdfjs-digital-signature-properties-timestamp = Data e ora: { DATETIME($dateObj, dateStyle: "short", timeStyle: "medium") }
|
||||
# Variables:
|
||||
# $count (Number) - number of nested sub-signatures (one per earlier
|
||||
# incremental revision of the document).
|
||||
pdfjs-digital-signature-properties-sub-signatures =
|
||||
{ $count ->
|
||||
[one] Firma secondaria ({ $count })
|
||||
*[other] Firme secondarie ({ $count })
|
||||
}
|
||||
|
||||
## Print
|
||||
|
||||
@ -240,7 +261,7 @@ pdfjs-find-match-count =
|
||||
# $limit (Number) - the maximum number of matches
|
||||
pdfjs-find-match-count-limit =
|
||||
{ $limit ->
|
||||
[one] Più di una { $limit } corrispondenza
|
||||
[one] Più di { $limit } corrispondenza
|
||||
*[other] Più di { $limit } corrispondenze
|
||||
}
|
||||
pdfjs-find-not-found = Testo non trovato
|
||||
@ -732,6 +753,74 @@ pdfjs-views-manager-waiting-for-file = Caricamento file…
|
||||
pdfjs-toggle-views-manager-button1 =
|
||||
.title = Gestisci pagine
|
||||
|
||||
## Digital signature properties (signature verification panel)
|
||||
|
||||
pdfjs-digital-signature-properties-button =
|
||||
.title = Proprietà firma digitale
|
||||
.aria-label = Proprietà firma digitale
|
||||
pdfjs-digital-signature-properties-button-label = Proprietà firma digitale
|
||||
|
||||
## Banner shown above the signature list summarising the overall
|
||||
## verification state of the document. Each variant is selected by the
|
||||
## viewer based on the worst per-signature status; one signature is
|
||||
## enough to lower the banner.
|
||||
##
|
||||
## Variables:
|
||||
## $count (Number) - number of signatures at the worst level.
|
||||
|
||||
pdfjs-digital-signature-properties-banner-verified = Il documento è stato firmato con una firma digitale valida
|
||||
pdfjs-digital-signature-properties-banner-unknown =
|
||||
{ $count ->
|
||||
[one] Il documento è stato firmato ma non è stato possibile verificare { $count } firma digitale
|
||||
*[other] Il documento è stato firmato ma non è stato possibile verificare { $count } firme digitali
|
||||
}
|
||||
pdfjs-digital-signature-properties-banner-untrusted =
|
||||
{ $count ->
|
||||
[one] Documento firmato con { $count } certificato non attendibile
|
||||
*[other] Documento firmato con { $count } certificati non attendibili
|
||||
}
|
||||
pdfjs-digital-signature-properties-banner-expired =
|
||||
{ $count ->
|
||||
[one] Documento firmato con { $count } certificato scaduto
|
||||
*[other] Documento firmato con { $count } certificati scaduti
|
||||
}
|
||||
pdfjs-digital-signature-properties-banner-invalid =
|
||||
{ $count ->
|
||||
[one] Il documento contiene { $count } firma digitale non valida
|
||||
*[other] Il documento contiene { $count } firme digitali non valide
|
||||
}
|
||||
pdfjs-digital-signature-properties-banner-revoked =
|
||||
{ $count ->
|
||||
[one] Documento firmato con { $count } certificato revocato
|
||||
*[other] Documento firmato con { $count } certificati revocati
|
||||
}
|
||||
|
||||
## Per-signature status row. Only three distinct strings are needed:
|
||||
## the signature crypto either verified (the cert chain may still be
|
||||
## untrusted/expired/revoked, but that's surfaced on the cert row
|
||||
## below), or it failed, or its sub-format isn't supported.
|
||||
|
||||
pdfjs-digital-signature-properties-status-verified = Stato: firma verificata
|
||||
pdfjs-digital-signature-properties-status-invalid = Stato: firma non valida
|
||||
pdfjs-digital-signature-properties-status-unknown = Stato: impossibile verificare (non supportato)
|
||||
|
||||
## Per-signature certificate row. The variants with an issuer / date in
|
||||
## parentheses embed fully-localized context — no English fall-through.
|
||||
##
|
||||
## Variables:
|
||||
## $issuer (String) - issuer or subject common name from the cert.
|
||||
## $dateObj (Date) - notAfter date for the expired-with-date form.
|
||||
|
||||
pdfjs-digital-signature-properties-certificate-trusted = Certificato: affidabile ({ $issuer })
|
||||
pdfjs-digital-signature-properties-certificate-unknown = Certificato: non disponibile
|
||||
pdfjs-digital-signature-properties-certificate-untrusted = Certificato: non attendibile
|
||||
pdfjs-digital-signature-properties-certificate-untrusted-unknown-issuer = Certificato: emittente sconosciuto ({ $issuer })
|
||||
pdfjs-digital-signature-properties-certificate-untrusted-self-signed = Certificato: autofirmato ({ $issuer })
|
||||
pdfjs-digital-signature-properties-certificate-untrusted-untrusted-issuer = Certificato: emittente non attendibile ({ $issuer })
|
||||
pdfjs-digital-signature-properties-certificate-expired = Certificato: scaduto
|
||||
pdfjs-digital-signature-properties-certificate-expired-with-date = Certificato: scaduto ({ DATETIME($dateObj, dateStyle: "medium") })
|
||||
pdfjs-digital-signature-properties-certificate-revoked = Certificato: revocato
|
||||
|
||||
## Main menu for adding/removing signatures
|
||||
|
||||
pdfjs-editor-delete-signature-button1 =
|
||||
|
||||
@ -153,6 +153,23 @@ pdfjs-document-properties-linearized = ウェブ表示用に最適化:
|
||||
pdfjs-document-properties-linearized-yes = はい
|
||||
pdfjs-document-properties-linearized-no = いいえ
|
||||
pdfjs-document-properties-close-button = 閉じる
|
||||
pdfjs-digital-signature-properties-view-certificate = 証明書を表示
|
||||
# Shown beneath an invalid signature card to explain why verification
|
||||
# failed. The text comes from NSS (e.g. "Signature integrity has been
|
||||
# compromised", "PKCS#7 signature could not be parsed") and is not
|
||||
# itself localized — it is the underlying error message produced by
|
||||
# the verification backend.
|
||||
# Variables:
|
||||
# $reason (String) - error message describing why the signature
|
||||
# could not be verified.
|
||||
pdfjs-digital-signature-properties-reason = 理由: { $reason }
|
||||
# Variables:
|
||||
# $dateObj (Date) - the signing time from the /Sig dict's /M entry.
|
||||
pdfjs-digital-signature-properties-timestamp = タイムスタンプ: { DATETIME($dateObj, dateStyle: "short", timeStyle: "medium") }
|
||||
# Variables:
|
||||
# $count (Number) - number of nested sub-signatures (one per earlier
|
||||
# incremental revision of the document).
|
||||
pdfjs-digital-signature-properties-sub-signatures = サブ署名 ({ $count } 筆)
|
||||
|
||||
## Print
|
||||
|
||||
@ -700,6 +717,54 @@ pdfjs-views-manager-waiting-for-file = ファイルをアップロードして
|
||||
pdfjs-toggle-views-manager-button1 =
|
||||
.title = ページを管理
|
||||
|
||||
## Digital signature properties (signature verification panel)
|
||||
|
||||
pdfjs-digital-signature-properties-button =
|
||||
.title = デジタル署名のプロパティ
|
||||
.aria-label = デジタル署名のプロパティ
|
||||
pdfjs-digital-signature-properties-button-label = デジタル署名のプロパティ
|
||||
|
||||
## Banner shown above the signature list summarising the overall
|
||||
## verification state of the document. Each variant is selected by the
|
||||
## viewer based on the worst per-signature status; one signature is
|
||||
## enough to lower the banner.
|
||||
##
|
||||
## Variables:
|
||||
## $count (Number) - number of signatures at the worst level.
|
||||
|
||||
pdfjs-digital-signature-properties-banner-verified = 文書は検証されたデジタル署名で署名されています
|
||||
pdfjs-digital-signature-properties-banner-unknown = 文書は署名されていますが、{ $count } 筆のデジタル署名が検証できません
|
||||
pdfjs-digital-signature-properties-banner-untrusted = 文書は { $count } 筆の信頼できないデジタル署名で署名されています
|
||||
pdfjs-digital-signature-properties-banner-expired = 文書は { $count } 枚の有効期限が切れた証明書で署名されています
|
||||
pdfjs-digital-signature-properties-banner-invalid = 文書には { $count } 筆の不正なデジタル署名があります
|
||||
pdfjs-digital-signature-properties-banner-revoked = 文書は { $count } 枚の破棄された証明書で署名されています
|
||||
|
||||
## Per-signature status row. Only three distinct strings are needed:
|
||||
## the signature crypto either verified (the cert chain may still be
|
||||
## untrusted/expired/revoked, but that's surfaced on the cert row
|
||||
## below), or it failed, or its sub-format isn't supported.
|
||||
|
||||
pdfjs-digital-signature-properties-status-verified = 状態: 検証された証明書
|
||||
pdfjs-digital-signature-properties-status-invalid = 状態: 不正な証明書
|
||||
pdfjs-digital-signature-properties-status-unknown = 状態: 検証不可 (未サポート)
|
||||
|
||||
## Per-signature certificate row. The variants with an issuer / date in
|
||||
## parentheses embed fully-localized context — no English fall-through.
|
||||
##
|
||||
## Variables:
|
||||
## $issuer (String) - issuer or subject common name from the cert.
|
||||
## $dateObj (Date) - notAfter date for the expired-with-date form.
|
||||
|
||||
pdfjs-digital-signature-properties-certificate-trusted = 証明書: 信頼されている ({ $issuer })
|
||||
pdfjs-digital-signature-properties-certificate-unknown = 証明書: 利用不可
|
||||
pdfjs-digital-signature-properties-certificate-untrusted = 証明書: 信頼できない
|
||||
pdfjs-digital-signature-properties-certificate-untrusted-unknown-issuer = 証明書: 発行者不明 ({ $issuer })
|
||||
pdfjs-digital-signature-properties-certificate-untrusted-self-signed = 証明書: 自己署名 ({ $issuer })
|
||||
pdfjs-digital-signature-properties-certificate-untrusted-untrusted-issuer = 証明書: 信頼できない発行者 ({ $issuer })
|
||||
pdfjs-digital-signature-properties-certificate-expired = 証明書: 有効期限切れ
|
||||
pdfjs-digital-signature-properties-certificate-expired-with-date = 証明書: 有効期限切れ ({ DATETIME($dateObj, dateStyle: "medium") })
|
||||
pdfjs-digital-signature-properties-certificate-revoked = 証明書: 破棄
|
||||
|
||||
## Main menu for adding/removing signatures
|
||||
|
||||
pdfjs-editor-delete-signature-button1 =
|
||||
|
||||
@ -153,6 +153,27 @@ pdfjs-document-properties-linearized = მსუბუქი ვებჩვე
|
||||
pdfjs-document-properties-linearized-yes = დიახ
|
||||
pdfjs-document-properties-linearized-no = არა
|
||||
pdfjs-document-properties-close-button = დახურვა
|
||||
pdfjs-digital-signature-properties-view-certificate = სერტიფიკატის ნახვა
|
||||
# Shown beneath an invalid signature card to explain why verification
|
||||
# failed. The text comes from NSS (e.g. "Signature integrity has been
|
||||
# compromised", "PKCS#7 signature could not be parsed") and is not
|
||||
# itself localized — it is the underlying error message produced by
|
||||
# the verification backend.
|
||||
# Variables:
|
||||
# $reason (String) - error message describing why the signature
|
||||
# could not be verified.
|
||||
pdfjs-digital-signature-properties-reason = მიზეზი: { $reason }
|
||||
# Variables:
|
||||
# $dateObj (Date) - the signing time from the /Sig dict's /M entry.
|
||||
pdfjs-digital-signature-properties-timestamp = დროის ნიშნული: { DATETIME($dateObj, dateStyle: "short", timeStyle: "medium") }
|
||||
# Variables:
|
||||
# $count (Number) - number of nested sub-signatures (one per earlier
|
||||
# incremental revision of the document).
|
||||
pdfjs-digital-signature-properties-sub-signatures =
|
||||
{ $count ->
|
||||
[one] ქვეხელმოწერები ({ $count })
|
||||
*[other] ქვეხელმოწერები ({ $count })
|
||||
}
|
||||
|
||||
## Print
|
||||
|
||||
@ -732,6 +753,74 @@ pdfjs-views-manager-waiting-for-file = ფაილი აიტვირთე
|
||||
pdfjs-toggle-views-manager-button1 =
|
||||
.title = გვერდების მართვა
|
||||
|
||||
## Digital signature properties (signature verification panel)
|
||||
|
||||
pdfjs-digital-signature-properties-button =
|
||||
.title = ციფრული ხელმოწერის პარამეტრები
|
||||
.aria-label = ციფრული ხელმოწერის პარამეტრები
|
||||
pdfjs-digital-signature-properties-button-label = ციფრული ხელმოწერის პარამეტრები
|
||||
|
||||
## Banner shown above the signature list summarising the overall
|
||||
## verification state of the document. Each variant is selected by the
|
||||
## viewer based on the worst per-signature status; one signature is
|
||||
## enough to lower the banner.
|
||||
##
|
||||
## Variables:
|
||||
## $count (Number) - number of signatures at the worst level.
|
||||
|
||||
pdfjs-digital-signature-properties-banner-verified = დოკუმენტი ხელმოწერილია მართებული ციფრული ხელმოწერით
|
||||
pdfjs-digital-signature-properties-banner-unknown =
|
||||
{ $count ->
|
||||
[one] დოკუმენტი ხელმოწერილია, მაგრამ { $count } ციფრული ხელმოწერა ვერ დამოწმდა
|
||||
*[other] დოკუმენტი ხელმოწერილია, მაგრამ { $count } ციფრული ხელმოწერა ვერ დამოწმდა
|
||||
}
|
||||
pdfjs-digital-signature-properties-banner-untrusted =
|
||||
{ $count ->
|
||||
[one] დოკუმენტი ხელმოწერილია { $count } არასანდო სერტიფიკატით
|
||||
*[other] დოკუმენტი ხელმოწერილია { $count } არასანდო სერტიფიკატით
|
||||
}
|
||||
pdfjs-digital-signature-properties-banner-expired =
|
||||
{ $count ->
|
||||
[one] დოკუმენტი ხელმოწერილია { $count } ვადაგასული სერტიფიკატით
|
||||
*[other] დოკუმენტი ხელმოწერილია { $count } ვადაგასული სერტიფიკატით
|
||||
}
|
||||
pdfjs-digital-signature-properties-banner-invalid =
|
||||
{ $count ->
|
||||
[one] დოკუმენტი ხელმოწერილია { $count } უმართებულო ციფრული სერტიფიკატით
|
||||
*[other] დოკუმენტი ხელმოწერილია { $count } უმართებულო ციფრული სერტიფიკატით
|
||||
}
|
||||
pdfjs-digital-signature-properties-banner-revoked =
|
||||
{ $count ->
|
||||
[one] დოკუმენტი ხელმოწერილია { $count } ძალადაკარგული სერტიფიკატით
|
||||
*[other] დოკუმენტი ხელმოწერილია { $count } ძალადაკარგული სერტიფიკატით
|
||||
}
|
||||
|
||||
## Per-signature status row. Only three distinct strings are needed:
|
||||
## the signature crypto either verified (the cert chain may still be
|
||||
## untrusted/expired/revoked, but that's surfaced on the cert row
|
||||
## below), or it failed, or its sub-format isn't supported.
|
||||
|
||||
pdfjs-digital-signature-properties-status-verified = მდგომარეობა: ხელმოწერა დამოწმებულია
|
||||
pdfjs-digital-signature-properties-status-invalid = მდგომარეობა: ხელმოწერა უმართებულოა
|
||||
pdfjs-digital-signature-properties-status-unknown = მდგომარეობა: ვერ მოწმდება (მხარდაუჭერელია)
|
||||
|
||||
## Per-signature certificate row. The variants with an issuer / date in
|
||||
## parentheses embed fully-localized context — no English fall-through.
|
||||
##
|
||||
## Variables:
|
||||
## $issuer (String) - issuer or subject common name from the cert.
|
||||
## $dateObj (Date) - notAfter date for the expired-with-date form.
|
||||
|
||||
pdfjs-digital-signature-properties-certificate-trusted = სერტიფიკატი: სანდოა ({ $issuer })
|
||||
pdfjs-digital-signature-properties-certificate-unknown = სერტიფიკატი: მიუწვდომელია
|
||||
pdfjs-digital-signature-properties-certificate-untrusted = სერტიფიკატი: არასანდოა
|
||||
pdfjs-digital-signature-properties-certificate-untrusted-unknown-issuer = სერტიფიკატი: უცნობი გამცემი ({ $issuer })
|
||||
pdfjs-digital-signature-properties-certificate-untrusted-self-signed = სერტიფიკატი: თვითხელმოწერით ({ $issuer })
|
||||
pdfjs-digital-signature-properties-certificate-untrusted-untrusted-issuer = სერტიფიკატი: არასანდო გამცემი ({ $issuer })
|
||||
pdfjs-digital-signature-properties-certificate-expired = სერტიფიკატი: ვადაგასული
|
||||
pdfjs-digital-signature-properties-certificate-expired-with-date = სერტიფიკატი: ვადაგასული ({ DATETIME($dateObj, dateStyle: "medium") })
|
||||
pdfjs-digital-signature-properties-certificate-revoked = სერტიფიკატი: ძალადაკარგულია
|
||||
|
||||
## Main menu for adding/removing signatures
|
||||
|
||||
pdfjs-editor-delete-signature-button1 =
|
||||
|
||||
@ -125,7 +125,7 @@ pdfjs-document-properties-creator = Yerna-t:
|
||||
pdfjs-document-properties-producer = Afecku n uselket PDF:
|
||||
pdfjs-document-properties-version = Lqem PDF:
|
||||
pdfjs-document-properties-page-count = Amḍan n yisebtar:
|
||||
pdfjs-document-properties-page-size = Tuγzi n usebter:
|
||||
pdfjs-document-properties-page-size = Teɣzi n usebter:
|
||||
pdfjs-document-properties-page-size-unit-inches = deg
|
||||
pdfjs-document-properties-page-size-unit-millimeters = mm
|
||||
pdfjs-document-properties-page-size-orientation-portrait = s teɣzi
|
||||
|
||||
@ -153,6 +153,27 @@ pdfjs-document-properties-linearized = Жылдам Web көрінісі:
|
||||
pdfjs-document-properties-linearized-yes = Иә
|
||||
pdfjs-document-properties-linearized-no = Жоқ
|
||||
pdfjs-document-properties-close-button = Жабу
|
||||
pdfjs-digital-signature-properties-view-certificate = Сертификатты қарау
|
||||
# Shown beneath an invalid signature card to explain why verification
|
||||
# failed. The text comes from NSS (e.g. "Signature integrity has been
|
||||
# compromised", "PKCS#7 signature could not be parsed") and is not
|
||||
# itself localized — it is the underlying error message produced by
|
||||
# the verification backend.
|
||||
# Variables:
|
||||
# $reason (String) - error message describing why the signature
|
||||
# could not be verified.
|
||||
pdfjs-digital-signature-properties-reason = Себебі: { $reason }
|
||||
# Variables:
|
||||
# $dateObj (Date) - the signing time from the /Sig dict's /M entry.
|
||||
pdfjs-digital-signature-properties-timestamp = Күн мен уақыт белгісі: { DATETIME($dateObj, dateStyle: "short", timeStyle: "medium") }
|
||||
# Variables:
|
||||
# $count (Number) - number of nested sub-signatures (one per earlier
|
||||
# incremental revision of the document).
|
||||
pdfjs-digital-signature-properties-sub-signatures =
|
||||
{ $count ->
|
||||
[one] Ішкі қолтаңба ({ $count })
|
||||
*[other] Ішкі қолтаңбалар ({ $count })
|
||||
}
|
||||
|
||||
## Print
|
||||
|
||||
@ -732,6 +753,74 @@ pdfjs-views-manager-waiting-for-file = Файл жүктеп салынуда…
|
||||
pdfjs-toggle-views-manager-button1 =
|
||||
.title = Беттерді басқару
|
||||
|
||||
## Digital signature properties (signature verification panel)
|
||||
|
||||
pdfjs-digital-signature-properties-button =
|
||||
.title = Цифрлық қолтаңба қасиеттері
|
||||
.aria-label = Цифрлық қолтаңба қасиеттері
|
||||
pdfjs-digital-signature-properties-button-label = Цифрлық қолтаңба қасиеттері
|
||||
|
||||
## Banner shown above the signature list summarising the overall
|
||||
## verification state of the document. Each variant is selected by the
|
||||
## viewer based on the worst per-signature status; one signature is
|
||||
## enough to lower the banner.
|
||||
##
|
||||
## Variables:
|
||||
## $count (Number) - number of signatures at the worst level.
|
||||
|
||||
pdfjs-digital-signature-properties-banner-verified = Құжатқа жарамды цифрлық қолтаңбамен қол қойылған
|
||||
pdfjs-digital-signature-properties-banner-unknown =
|
||||
{ $count ->
|
||||
[one] Құжатқа қол қойылған, бірақ { $count } цифрлық қолтаңбаны тексеру мүмкін болмады
|
||||
*[other] Құжатқа қол қойылған, бірақ { $count } цифрлық қолтаңбаны тексеру мүмкін болмады
|
||||
}
|
||||
pdfjs-digital-signature-properties-banner-untrusted =
|
||||
{ $count ->
|
||||
[one] Құжатқа сенімсіз { $count } сертификатпен қол қойылған
|
||||
*[other] Құжатқа сенімсіз { $count } сертификатпен қол қойылған
|
||||
}
|
||||
pdfjs-digital-signature-properties-banner-expired =
|
||||
{ $count ->
|
||||
[one] Құжатқа мерзімі өткен { $count } сертификатпен қол қойылған
|
||||
*[other] Құжатқа мерзімі өткен { $count } сертификатпен қол қойылған
|
||||
}
|
||||
pdfjs-digital-signature-properties-banner-invalid =
|
||||
{ $count ->
|
||||
[one] Құжатта { $count } жарамсыз цифрлық қолтаңба бар
|
||||
*[other] Құжатта { $count } жарамсыз цифрлық қолтаңба бар
|
||||
}
|
||||
pdfjs-digital-signature-properties-banner-revoked =
|
||||
{ $count ->
|
||||
[one] Құжатқа қайтарылған { $count } сертификатпен қол қойылған
|
||||
*[other] Құжатқа қайтарылған { $count } сертификатпен қол қойылған
|
||||
}
|
||||
|
||||
## Per-signature status row. Only three distinct strings are needed:
|
||||
## the signature crypto either verified (the cert chain may still be
|
||||
## untrusted/expired/revoked, but that's surfaced on the cert row
|
||||
## below), or it failed, or its sub-format isn't supported.
|
||||
|
||||
pdfjs-digital-signature-properties-status-verified = Қалып-күй: Қолтаңба тексерілді
|
||||
pdfjs-digital-signature-properties-status-invalid = Қалып-күй: Қолтаңба жарамсыз
|
||||
pdfjs-digital-signature-properties-status-unknown = Қалып-күй: Тексеру мүмкін емес (қолдау көрсетілмейді)
|
||||
|
||||
## Per-signature certificate row. The variants with an issuer / date in
|
||||
## parentheses embed fully-localized context — no English fall-through.
|
||||
##
|
||||
## Variables:
|
||||
## $issuer (String) - issuer or subject common name from the cert.
|
||||
## $dateObj (Date) - notAfter date for the expired-with-date form.
|
||||
|
||||
pdfjs-digital-signature-properties-certificate-trusted = Сертификат: Сенімді ({ $issuer })
|
||||
pdfjs-digital-signature-properties-certificate-unknown = Сертификат: Қолжетімсіз
|
||||
pdfjs-digital-signature-properties-certificate-untrusted = Сертификат: Сенімсіз
|
||||
pdfjs-digital-signature-properties-certificate-untrusted-unknown-issuer = Сертификат: Белгісіз шығарушы ({ $issuer })
|
||||
pdfjs-digital-signature-properties-certificate-untrusted-self-signed = Сертификат: Өздігінен қол қойылған ({ $issuer })
|
||||
pdfjs-digital-signature-properties-certificate-untrusted-untrusted-issuer = Сертификат: Сенімсіз шығарушы ({ $issuer })
|
||||
pdfjs-digital-signature-properties-certificate-expired = Сертификат: Мерзімі өткен
|
||||
pdfjs-digital-signature-properties-certificate-expired-with-date = Сертификат: Мерзімі өткен ({ DATETIME($dateObj, dateStyle: "medium") })
|
||||
pdfjs-digital-signature-properties-certificate-revoked = Сертификат: Қайтарылған
|
||||
|
||||
## Main menu for adding/removing signatures
|
||||
|
||||
pdfjs-editor-delete-signature-button1 =
|
||||
|
||||
@ -153,6 +153,23 @@ pdfjs-document-properties-linearized = 빠른 웹 보기:
|
||||
pdfjs-document-properties-linearized-yes = 예
|
||||
pdfjs-document-properties-linearized-no = 아니요
|
||||
pdfjs-document-properties-close-button = 닫기
|
||||
pdfjs-digital-signature-properties-view-certificate = 인증서 보기
|
||||
# Shown beneath an invalid signature card to explain why verification
|
||||
# failed. The text comes from NSS (e.g. "Signature integrity has been
|
||||
# compromised", "PKCS#7 signature could not be parsed") and is not
|
||||
# itself localized — it is the underlying error message produced by
|
||||
# the verification backend.
|
||||
# Variables:
|
||||
# $reason (String) - error message describing why the signature
|
||||
# could not be verified.
|
||||
pdfjs-digital-signature-properties-reason = 이유: { $reason }
|
||||
# Variables:
|
||||
# $dateObj (Date) - the signing time from the /Sig dict's /M entry.
|
||||
pdfjs-digital-signature-properties-timestamp = 타임스탬프: { DATETIME($dateObj, dateStyle: "short", timeStyle: "medium") }
|
||||
# Variables:
|
||||
# $count (Number) - number of nested sub-signatures (one per earlier
|
||||
# incremental revision of the document).
|
||||
pdfjs-digital-signature-properties-sub-signatures = 하위 서명 ({ $count }개)
|
||||
|
||||
## Print
|
||||
|
||||
@ -569,7 +586,7 @@ pdfjs-editor-add-signature-draw-thickness-range-label = 두께
|
||||
# $thickness (Number) - the thickness (in pixels) of the line used to draw a signature.
|
||||
pdfjs-editor-add-signature-draw-thickness-range =
|
||||
.title = 그리기 두께: { $thickness }
|
||||
pdfjs-editor-add-signature-image-placeholder = 이미지 파일을 여기에 끌어서 놓으세요
|
||||
pdfjs-editor-add-signature-image-placeholder = 이미지 파일을 여기에 끌어다 놓으세요
|
||||
pdfjs-editor-add-signature-image-browse-link =
|
||||
{ PLATFORM() ->
|
||||
[macos] 또는 이미지 파일 찾아보기
|
||||
@ -665,7 +682,7 @@ pdfjs-views-manager-pages-status-action-button-label = 관리
|
||||
pdfjs-views-manager-pages-status-copy-button-label = 복사
|
||||
pdfjs-views-manager-pages-status-cut-button-label = 잘라내기
|
||||
pdfjs-views-manager-pages-status-delete-button-label = 삭제
|
||||
pdfjs-views-manager-pages-status-export-selected-button-label = 선택 페이지 내보내기…
|
||||
pdfjs-views-manager-pages-status-export-selected-button-label = 선택한 페이지 내보내기…
|
||||
# Variables:
|
||||
# $count (Number) - the number of selected pages to be cut.
|
||||
pdfjs-views-manager-status-undo-cut-label = { $count }개 페이지 잘림
|
||||
@ -700,6 +717,54 @@ pdfjs-views-manager-waiting-for-file = 파일 업로드 중…
|
||||
pdfjs-toggle-views-manager-button1 =
|
||||
.title = 페이지 관리
|
||||
|
||||
## Digital signature properties (signature verification panel)
|
||||
|
||||
pdfjs-digital-signature-properties-button =
|
||||
.title = 디지털 서명 속성
|
||||
.aria-label = 디지털 서명 속성
|
||||
pdfjs-digital-signature-properties-button-label = 디지털 서명 속성
|
||||
|
||||
## Banner shown above the signature list summarising the overall
|
||||
## verification state of the document. Each variant is selected by the
|
||||
## viewer based on the worst per-signature status; one signature is
|
||||
## enough to lower the banner.
|
||||
##
|
||||
## Variables:
|
||||
## $count (Number) - number of signatures at the worst level.
|
||||
|
||||
pdfjs-digital-signature-properties-banner-verified = 유효한 디지털 서명으로 문서에 서명되었습니다
|
||||
pdfjs-digital-signature-properties-banner-unknown = 문서에 서명되었지만 { $count }개의 디지털 서명을 확인할 수 없음
|
||||
pdfjs-digital-signature-properties-banner-untrusted = 신뢰할 수 없는 { $count }개의 인증서로 서명된 문서
|
||||
pdfjs-digital-signature-properties-banner-expired = { $count }개의 만료된 인증서로 서명된 문서
|
||||
pdfjs-digital-signature-properties-banner-invalid = 문서에 잘못된 { $count }개의 디지털 서명이 있음
|
||||
pdfjs-digital-signature-properties-banner-revoked = 폐기된 인증서 { $count }개로 서명된 문서
|
||||
|
||||
## Per-signature status row. Only three distinct strings are needed:
|
||||
## the signature crypto either verified (the cert chain may still be
|
||||
## untrusted/expired/revoked, but that's surfaced on the cert row
|
||||
## below), or it failed, or its sub-format isn't supported.
|
||||
|
||||
pdfjs-digital-signature-properties-status-verified = 상태: 서명 확인됨
|
||||
pdfjs-digital-signature-properties-status-invalid = 상태: 유효하지 않은 서명
|
||||
pdfjs-digital-signature-properties-status-unknown = 상태: 확인할 수 없음 (지원되지 않음)
|
||||
|
||||
## Per-signature certificate row. The variants with an issuer / date in
|
||||
## parentheses embed fully-localized context — no English fall-through.
|
||||
##
|
||||
## Variables:
|
||||
## $issuer (String) - issuer or subject common name from the cert.
|
||||
## $dateObj (Date) - notAfter date for the expired-with-date form.
|
||||
|
||||
pdfjs-digital-signature-properties-certificate-trusted = 인증서: 신뢰할 수 있음 ({ $issuer })
|
||||
pdfjs-digital-signature-properties-certificate-unknown = 인증서: 사용할 수 없음
|
||||
pdfjs-digital-signature-properties-certificate-untrusted = 인증서: 신뢰할 수 없음
|
||||
pdfjs-digital-signature-properties-certificate-untrusted-unknown-issuer = 인증서: 알 수 없는 발급자 ({ $issuer })
|
||||
pdfjs-digital-signature-properties-certificate-untrusted-self-signed = 인증서: 자체 서명 ({ $issuer })
|
||||
pdfjs-digital-signature-properties-certificate-untrusted-untrusted-issuer = 인증서: 신뢰할 수 없는 발급자 ({ $issuer })
|
||||
pdfjs-digital-signature-properties-certificate-expired = 인증서: 만료됨
|
||||
pdfjs-digital-signature-properties-certificate-expired-with-date = 인증서: 만료됨 ({ DATETIME($dateObj, dateStyle: "medium") })
|
||||
pdfjs-digital-signature-properties-certificate-revoked = 인증서: 폐기됨
|
||||
|
||||
## Main menu for adding/removing signatures
|
||||
|
||||
pdfjs-editor-delete-signature-button1 =
|
||||
|
||||
@ -479,6 +479,21 @@ pdfjs-editor-add-signature-cancel-button = റദ്ദാക്കുക
|
||||
pdfjs-editor-add-signature-add-button = ചേൎക്കുക
|
||||
pdfjs-editor-edit-signature-update-button = പുതുക്കുക
|
||||
|
||||
## Edit a comment dialog
|
||||
|
||||
pdfjs-editor-edit-comment-dialog-cancel-button = റദ്ദാക്കുക
|
||||
|
||||
## The view manager is a sidebar displaying different views:
|
||||
## - thumbnails;
|
||||
## - outline;
|
||||
## - attachments;
|
||||
## - layers.
|
||||
## The thumbnails view is used to edit the pdf: remove/insert pages, ...
|
||||
|
||||
pdfjs-views-manager-status-close-button =
|
||||
.title = അടയ്ക്കുക
|
||||
pdfjs-views-manager-status-close-button-label = അടയ്ക്കുക
|
||||
|
||||
## Main menu for adding/removing signatures
|
||||
|
||||
pdfjs-editor-delete-signature-button1 =
|
||||
|
||||
@ -153,6 +153,27 @@ pdfjs-document-properties-linearized = Hurtig nettvisning:
|
||||
pdfjs-document-properties-linearized-yes = Ja
|
||||
pdfjs-document-properties-linearized-no = Nei
|
||||
pdfjs-document-properties-close-button = Lukk
|
||||
pdfjs-digital-signature-properties-view-certificate = Vis sertifikat
|
||||
# Shown beneath an invalid signature card to explain why verification
|
||||
# failed. The text comes from NSS (e.g. "Signature integrity has been
|
||||
# compromised", "PKCS#7 signature could not be parsed") and is not
|
||||
# itself localized — it is the underlying error message produced by
|
||||
# the verification backend.
|
||||
# Variables:
|
||||
# $reason (String) - error message describing why the signature
|
||||
# could not be verified.
|
||||
pdfjs-digital-signature-properties-reason = Grunn: { $reason }
|
||||
# Variables:
|
||||
# $dateObj (Date) - the signing time from the /Sig dict's /M entry.
|
||||
pdfjs-digital-signature-properties-timestamp = Tidsstempel: { DATETIME($dateObj, dateStyle: "short", timeStyle: "medium") }
|
||||
# Variables:
|
||||
# $count (Number) - number of nested sub-signatures (one per earlier
|
||||
# incremental revision of the document).
|
||||
pdfjs-digital-signature-properties-sub-signatures =
|
||||
{ $count ->
|
||||
[one] Undersignatur ({ $count })
|
||||
*[other] Undersignaturer ({ $count })
|
||||
}
|
||||
|
||||
## Print
|
||||
|
||||
@ -732,6 +753,74 @@ pdfjs-views-manager-waiting-for-file = Laster opp filen …
|
||||
pdfjs-toggle-views-manager-button1 =
|
||||
.title = Behandle sider
|
||||
|
||||
## Digital signature properties (signature verification panel)
|
||||
|
||||
pdfjs-digital-signature-properties-button =
|
||||
.title = Egenskaper for digital signatur
|
||||
.aria-label = Egenskaper for digital signatur
|
||||
pdfjs-digital-signature-properties-button-label = Egenskaper for digital signatur
|
||||
|
||||
## Banner shown above the signature list summarising the overall
|
||||
## verification state of the document. Each variant is selected by the
|
||||
## viewer based on the worst per-signature status; one signature is
|
||||
## enough to lower the banner.
|
||||
##
|
||||
## Variables:
|
||||
## $count (Number) - number of signatures at the worst level.
|
||||
|
||||
pdfjs-digital-signature-properties-banner-verified = Dokumentet ble signert med en gyldig digital signatur
|
||||
pdfjs-digital-signature-properties-banner-unknown =
|
||||
{ $count ->
|
||||
[one] Dokumentet er signert, men { $count } digital signatur kunne ikke verifiseres
|
||||
*[other] Dokumentet er signert, men { $count } digitale signaturer kunne ikke verifiseres
|
||||
}
|
||||
pdfjs-digital-signature-properties-banner-untrusted =
|
||||
{ $count ->
|
||||
[one] Dokumentet er signert med { $count } sertifikat som ikke er klarert
|
||||
*[other] Dokumentet er signert med { $count } sertifikater som ikke er klarert
|
||||
}
|
||||
pdfjs-digital-signature-properties-banner-expired =
|
||||
{ $count ->
|
||||
[one] Dokumentet er signert med { $count } utløpt sertifikat
|
||||
*[other] Dokumentet er signert med { $count } utløpte sertifikater
|
||||
}
|
||||
pdfjs-digital-signature-properties-banner-invalid =
|
||||
{ $count ->
|
||||
[one] Dokumentet har { $count } ugyldig digital signatur
|
||||
*[other] Dokumentet har { $count } ugyldige digitale signaturer
|
||||
}
|
||||
pdfjs-digital-signature-properties-banner-revoked =
|
||||
{ $count ->
|
||||
[one] Dokumentet er signert med { $count } tilbakekalt sertifikat
|
||||
*[other] Dokumentet er signert med { $count } tilbakekalte sertifikater
|
||||
}
|
||||
|
||||
## Per-signature status row. Only three distinct strings are needed:
|
||||
## the signature crypto either verified (the cert chain may still be
|
||||
## untrusted/expired/revoked, but that's surfaced on the cert row
|
||||
## below), or it failed, or its sub-format isn't supported.
|
||||
|
||||
pdfjs-digital-signature-properties-status-verified = Status: Signatur bekreftet
|
||||
pdfjs-digital-signature-properties-status-invalid = Status: Signatur ugyldig
|
||||
pdfjs-digital-signature-properties-status-unknown = Status: Kan ikke bekrefte (støttes ikke)
|
||||
|
||||
## Per-signature certificate row. The variants with an issuer / date in
|
||||
## parentheses embed fully-localized context — no English fall-through.
|
||||
##
|
||||
## Variables:
|
||||
## $issuer (String) - issuer or subject common name from the cert.
|
||||
## $dateObj (Date) - notAfter date for the expired-with-date form.
|
||||
|
||||
pdfjs-digital-signature-properties-certificate-trusted = Sertifikat: Klarert ({ $issuer })
|
||||
pdfjs-digital-signature-properties-certificate-unknown = Sertifikat: Utilgjengelig
|
||||
pdfjs-digital-signature-properties-certificate-untrusted = Sertifikat: Ikke klarert
|
||||
pdfjs-digital-signature-properties-certificate-untrusted-unknown-issuer = Sertifikat: Ukjent utsteder ({ $issuer })
|
||||
pdfjs-digital-signature-properties-certificate-untrusted-self-signed = Sertifikat: Selvsignert ({ $issuer })
|
||||
pdfjs-digital-signature-properties-certificate-untrusted-untrusted-issuer = Sertifikat: Ikke klarert utsteder ({ $issuer })
|
||||
pdfjs-digital-signature-properties-certificate-expired = Sertifikat: Utløpt
|
||||
pdfjs-digital-signature-properties-certificate-expired-with-date = Sertifikat: Utløpt ({ DATETIME($dateObj, dateStyle: "medium") })
|
||||
pdfjs-digital-signature-properties-certificate-revoked = Sertifikat: Tilbakekalt
|
||||
|
||||
## Main menu for adding/removing signatures
|
||||
|
||||
pdfjs-editor-delete-signature-button1 =
|
||||
|
||||
@ -153,6 +153,27 @@ pdfjs-document-properties-linearized = Snelle webweergave:
|
||||
pdfjs-document-properties-linearized-yes = Ja
|
||||
pdfjs-document-properties-linearized-no = Nee
|
||||
pdfjs-document-properties-close-button = Sluiten
|
||||
pdfjs-digital-signature-properties-view-certificate = Certificaat bekijken
|
||||
# Shown beneath an invalid signature card to explain why verification
|
||||
# failed. The text comes from NSS (e.g. "Signature integrity has been
|
||||
# compromised", "PKCS#7 signature could not be parsed") and is not
|
||||
# itself localized — it is the underlying error message produced by
|
||||
# the verification backend.
|
||||
# Variables:
|
||||
# $reason (String) - error message describing why the signature
|
||||
# could not be verified.
|
||||
pdfjs-digital-signature-properties-reason = Reden: { $reason }
|
||||
# Variables:
|
||||
# $dateObj (Date) - the signing time from the /Sig dict's /M entry.
|
||||
pdfjs-digital-signature-properties-timestamp = Tijdstempel: { DATETIME($dateObj, dateStyle: "short", timeStyle: "medium") }
|
||||
# Variables:
|
||||
# $count (Number) - number of nested sub-signatures (one per earlier
|
||||
# incremental revision of the document).
|
||||
pdfjs-digital-signature-properties-sub-signatures =
|
||||
{ $count ->
|
||||
[one] Ondertekening ({ $count })
|
||||
*[other] Ondertekeningen ({ $count })
|
||||
}
|
||||
|
||||
## Print
|
||||
|
||||
@ -732,6 +753,74 @@ pdfjs-views-manager-waiting-for-file = Bestand uploaden…
|
||||
pdfjs-toggle-views-manager-button1 =
|
||||
.title = Pagina’s beheren
|
||||
|
||||
## Digital signature properties (signature verification panel)
|
||||
|
||||
pdfjs-digital-signature-properties-button =
|
||||
.title = Eigenschappen digitale handtekening
|
||||
.aria-label = Eigenschappen digitale handtekening
|
||||
pdfjs-digital-signature-properties-button-label = Eigenschappen digitale handtekening
|
||||
|
||||
## Banner shown above the signature list summarising the overall
|
||||
## verification state of the document. Each variant is selected by the
|
||||
## viewer based on the worst per-signature status; one signature is
|
||||
## enough to lower the banner.
|
||||
##
|
||||
## Variables:
|
||||
## $count (Number) - number of signatures at the worst level.
|
||||
|
||||
pdfjs-digital-signature-properties-banner-verified = Document is ondertekend met een geldige digitale handtekening
|
||||
pdfjs-digital-signature-properties-banner-unknown =
|
||||
{ $count ->
|
||||
[one] Document ondertekend, maar { $count } digitale handtekening kon niet worden geverifieerd
|
||||
*[other] Document ondertekend, maar { $count } digitale handtekeningen konden niet worden geverifieerd
|
||||
}
|
||||
pdfjs-digital-signature-properties-banner-untrusted =
|
||||
{ $count ->
|
||||
[one] Document ondertekend met { $count } certificaat dat niet wordt vertrouwd
|
||||
*[other] Document ondertekend met { $count } certificaten die niet worden vertrouwd
|
||||
}
|
||||
pdfjs-digital-signature-properties-banner-expired =
|
||||
{ $count ->
|
||||
[one] Document ondertekend met { $count } verlopen certificaat
|
||||
*[other] Document ondertekend met { $count } verlopen certificaten
|
||||
}
|
||||
pdfjs-digital-signature-properties-banner-invalid =
|
||||
{ $count ->
|
||||
[one] Document heeft { $count } ongeldige digitale handtekening
|
||||
*[other] Document heeft { $count } ongeldige digitale handtekeningen
|
||||
}
|
||||
pdfjs-digital-signature-properties-banner-revoked =
|
||||
{ $count ->
|
||||
[one] Document ondertekend met { $count } ingetrokken certificaat
|
||||
*[other] Document ondertekend met { $count } ingetrokken certificaten
|
||||
}
|
||||
|
||||
## Per-signature status row. Only three distinct strings are needed:
|
||||
## the signature crypto either verified (the cert chain may still be
|
||||
## untrusted/expired/revoked, but that's surfaced on the cert row
|
||||
## below), or it failed, or its sub-format isn't supported.
|
||||
|
||||
pdfjs-digital-signature-properties-status-verified = Status: handtekening geverifieerd
|
||||
pdfjs-digital-signature-properties-status-invalid = Status: handtekening ongeldig
|
||||
pdfjs-digital-signature-properties-status-unknown = Status: kan niet worden geverifieerd (niet ondersteund)
|
||||
|
||||
## Per-signature certificate row. The variants with an issuer / date in
|
||||
## parentheses embed fully-localized context — no English fall-through.
|
||||
##
|
||||
## Variables:
|
||||
## $issuer (String) - issuer or subject common name from the cert.
|
||||
## $dateObj (Date) - notAfter date for the expired-with-date form.
|
||||
|
||||
pdfjs-digital-signature-properties-certificate-trusted = Certificaat: vertrouwd ({ $issuer })
|
||||
pdfjs-digital-signature-properties-certificate-unknown = Certificaat: niet beschikbaar
|
||||
pdfjs-digital-signature-properties-certificate-untrusted = Certificaat: niet vertrouwd
|
||||
pdfjs-digital-signature-properties-certificate-untrusted-unknown-issuer = Certificaat: onbekende uitgever ({ $issuer })
|
||||
pdfjs-digital-signature-properties-certificate-untrusted-self-signed = Certificaat: zelfondertekend ({ $issuer })
|
||||
pdfjs-digital-signature-properties-certificate-untrusted-untrusted-issuer = Certificaat: niet-vertrouwde uitgever ({ $issuer })
|
||||
pdfjs-digital-signature-properties-certificate-expired = Certificaat: verlopen
|
||||
pdfjs-digital-signature-properties-certificate-expired-with-date = Certificaat: verlopen ({ DATETIME($dateObj, dateStyle: "medium") })
|
||||
pdfjs-digital-signature-properties-certificate-revoked = Certificaat: ingetrokken
|
||||
|
||||
## Main menu for adding/removing signatures
|
||||
|
||||
pdfjs-editor-delete-signature-button1 =
|
||||
|
||||
@ -153,6 +153,27 @@ pdfjs-document-properties-linearized = Rask nettvising:
|
||||
pdfjs-document-properties-linearized-yes = Ja
|
||||
pdfjs-document-properties-linearized-no = Nei
|
||||
pdfjs-document-properties-close-button = Lat att
|
||||
pdfjs-digital-signature-properties-view-certificate = Vis sertifikat
|
||||
# Shown beneath an invalid signature card to explain why verification
|
||||
# failed. The text comes from NSS (e.g. "Signature integrity has been
|
||||
# compromised", "PKCS#7 signature could not be parsed") and is not
|
||||
# itself localized — it is the underlying error message produced by
|
||||
# the verification backend.
|
||||
# Variables:
|
||||
# $reason (String) - error message describing why the signature
|
||||
# could not be verified.
|
||||
pdfjs-digital-signature-properties-reason = Grunn: { $reason }
|
||||
# Variables:
|
||||
# $dateObj (Date) - the signing time from the /Sig dict's /M entry.
|
||||
pdfjs-digital-signature-properties-timestamp = Tidsstempel: { DATETIME($dateObj, dateStyle: "short", timeStyle: "medium") }
|
||||
# Variables:
|
||||
# $count (Number) - number of nested sub-signatures (one per earlier
|
||||
# incremental revision of the document).
|
||||
pdfjs-digital-signature-properties-sub-signatures =
|
||||
{ $count ->
|
||||
[one] Undersignatur ({ $count })
|
||||
*[other] Undersignaturar ({ $count })
|
||||
}
|
||||
|
||||
## Print
|
||||
|
||||
@ -515,7 +536,7 @@ pdfjs-image-alt-text-settings-button-label = Alternative tekst-innstillingar for
|
||||
pdfjs-editor-alt-text-settings-dialog-label = Alternative tekst-innstillingar for bilde
|
||||
pdfjs-editor-alt-text-settings-automatic-title = Automatisk alternativ tekst
|
||||
pdfjs-editor-alt-text-settings-create-model-button-label = Opprett alternativ tekt automatisk
|
||||
pdfjs-editor-alt-text-settings-create-model-description = Foreslår skildringar for å hjelpe folk som ikkje kan sjå bildet eller når bildet ikkje blir lasta inn.
|
||||
pdfjs-editor-alt-text-settings-create-model-description = Føreslår skildringar for å hjelpe folk som ikkje kan sjå bildet eller når bildet ikkje blir lasta inn.
|
||||
# Variables:
|
||||
# $totalSize (Number) - the total size (in MB) of the AI model.
|
||||
pdfjs-editor-alt-text-settings-download-model-label = KI-modell for alternativ tekst ({ $totalSize } MB)
|
||||
@ -732,6 +753,74 @@ pdfjs-views-manager-waiting-for-file = Lastar opp fila…
|
||||
pdfjs-toggle-views-manager-button1 =
|
||||
.title = Handsam sider
|
||||
|
||||
## Digital signature properties (signature verification panel)
|
||||
|
||||
pdfjs-digital-signature-properties-button =
|
||||
.title = Eigenskapar for digital signatur
|
||||
.aria-label = Eigenskapar for digital signatur
|
||||
pdfjs-digital-signature-properties-button-label = Eigenskapar for digital signatur
|
||||
|
||||
## Banner shown above the signature list summarising the overall
|
||||
## verification state of the document. Each variant is selected by the
|
||||
## viewer based on the worst per-signature status; one signature is
|
||||
## enough to lower the banner.
|
||||
##
|
||||
## Variables:
|
||||
## $count (Number) - number of signatures at the worst level.
|
||||
|
||||
pdfjs-digital-signature-properties-banner-verified = Dokumentet vart signert med ei gyldig digital signatur
|
||||
pdfjs-digital-signature-properties-banner-unknown =
|
||||
{ $count ->
|
||||
[one] Dokumentet er signert, men { $count } digital signatur kunne ikkje verifiserast
|
||||
*[other] Dokumentet er signert, men { $count } digitale signaturar kunne ikkje verifiserast
|
||||
}
|
||||
pdfjs-digital-signature-properties-banner-untrusted =
|
||||
{ $count ->
|
||||
[one] Dokumentet er signert med { $count } sertifikat som ikkje er klarert
|
||||
*[other] Dokumentet er signert med { $count } sertifikat som ikkje er klarerte
|
||||
}
|
||||
pdfjs-digital-signature-properties-banner-expired =
|
||||
{ $count ->
|
||||
[one] Dokumentet er signert med { $count } utgåttt sertifikat
|
||||
*[other] Dokumentet er signert med { $count } utgåtte sertifikat
|
||||
}
|
||||
pdfjs-digital-signature-properties-banner-invalid =
|
||||
{ $count ->
|
||||
[one] Dokumentet har { $count } ugyldig digital signatur
|
||||
*[other] Dokumentet har { $count } ugyldige digitale signaturar
|
||||
}
|
||||
pdfjs-digital-signature-properties-banner-revoked =
|
||||
{ $count ->
|
||||
[one] Dokumentet er signert med { $count } tilbakekalt sertifikat
|
||||
*[other] Dokumentet er signert med { $count } tilbakekalte sertifikat
|
||||
}
|
||||
|
||||
## Per-signature status row. Only three distinct strings are needed:
|
||||
## the signature crypto either verified (the cert chain may still be
|
||||
## untrusted/expired/revoked, but that's surfaced on the cert row
|
||||
## below), or it failed, or its sub-format isn't supported.
|
||||
|
||||
pdfjs-digital-signature-properties-status-verified = Status: Signatur stadfesta
|
||||
pdfjs-digital-signature-properties-status-invalid = Status: Signatur ugyldig
|
||||
pdfjs-digital-signature-properties-status-unknown = Status: Kan ikkje stadfeste (blir ikkje støtta)
|
||||
|
||||
## Per-signature certificate row. The variants with an issuer / date in
|
||||
## parentheses embed fully-localized context — no English fall-through.
|
||||
##
|
||||
## Variables:
|
||||
## $issuer (String) - issuer or subject common name from the cert.
|
||||
## $dateObj (Date) - notAfter date for the expired-with-date form.
|
||||
|
||||
pdfjs-digital-signature-properties-certificate-trusted = Sertifikat: Klarert ({ $issuer })
|
||||
pdfjs-digital-signature-properties-certificate-unknown = Sertifikat: Utilgjengeleg
|
||||
pdfjs-digital-signature-properties-certificate-untrusted = Sertifikat: Ikkje klarert
|
||||
pdfjs-digital-signature-properties-certificate-untrusted-unknown-issuer = Sertifikat: Ukjent utferdar ({ $issuer })
|
||||
pdfjs-digital-signature-properties-certificate-untrusted-self-signed = Sertifikat: Sjølvsignert ({ $issuer })
|
||||
pdfjs-digital-signature-properties-certificate-untrusted-untrusted-issuer = Sertifikat: Ikkje klarert utferdar ({ $issuer })
|
||||
pdfjs-digital-signature-properties-certificate-expired = Sertifikat: Utgått
|
||||
pdfjs-digital-signature-properties-certificate-expired-with-date = Sertifikat: Utgått ({ DATETIME($dateObj, dateStyle: "medium") })
|
||||
pdfjs-digital-signature-properties-certificate-revoked = Sertifikat: Tilbakekalla
|
||||
|
||||
## Main menu for adding/removing signatures
|
||||
|
||||
pdfjs-editor-delete-signature-button1 =
|
||||
|
||||
@ -153,6 +153,28 @@ pdfjs-document-properties-linearized = Szybki podgląd w Internecie:
|
||||
pdfjs-document-properties-linearized-yes = tak
|
||||
pdfjs-document-properties-linearized-no = nie
|
||||
pdfjs-document-properties-close-button = Zamknij
|
||||
pdfjs-digital-signature-properties-view-certificate = Wyświetl certyfikat
|
||||
# Shown beneath an invalid signature card to explain why verification
|
||||
# failed. The text comes from NSS (e.g. "Signature integrity has been
|
||||
# compromised", "PKCS#7 signature could not be parsed") and is not
|
||||
# itself localized — it is the underlying error message produced by
|
||||
# the verification backend.
|
||||
# Variables:
|
||||
# $reason (String) - error message describing why the signature
|
||||
# could not be verified.
|
||||
pdfjs-digital-signature-properties-reason = Powód: { $reason }
|
||||
# Variables:
|
||||
# $dateObj (Date) - the signing time from the /Sig dict's /M entry.
|
||||
pdfjs-digital-signature-properties-timestamp = Data: { DATETIME($dateObj, dateStyle: "short", timeStyle: "medium") }
|
||||
# Variables:
|
||||
# $count (Number) - number of nested sub-signatures (one per earlier
|
||||
# incremental revision of the document).
|
||||
pdfjs-digital-signature-properties-sub-signatures =
|
||||
{ $count ->
|
||||
[one] { $count } podpis podrzędny
|
||||
[few] { $count } podpisy podrzędne
|
||||
*[many] { $count } podpisów podrzędnych
|
||||
}
|
||||
|
||||
## Print
|
||||
|
||||
@ -739,6 +761,79 @@ pdfjs-views-manager-waiting-for-file = Przesyłanie pliku…
|
||||
pdfjs-toggle-views-manager-button1 =
|
||||
.title = Zarządzaj stronami
|
||||
|
||||
## Digital signature properties (signature verification panel)
|
||||
|
||||
pdfjs-digital-signature-properties-button =
|
||||
.title = Właściwości podpisu cyfrowego
|
||||
.aria-label = Właściwości podpisu cyfrowego
|
||||
pdfjs-digital-signature-properties-button-label = Właściwości podpisu cyfrowego
|
||||
|
||||
## Banner shown above the signature list summarising the overall
|
||||
## verification state of the document. Each variant is selected by the
|
||||
## viewer based on the worst per-signature status; one signature is
|
||||
## enough to lower the banner.
|
||||
##
|
||||
## Variables:
|
||||
## $count (Number) - number of signatures at the worst level.
|
||||
|
||||
pdfjs-digital-signature-properties-banner-verified = Dokument został podpisany ważnym podpisem cyfrowym
|
||||
pdfjs-digital-signature-properties-banner-unknown =
|
||||
{ $count ->
|
||||
[one] Dokument jest popisany, ale nie można zweryfikować { $count } podpisu cyfrowego
|
||||
[few] Dokument jest popisany, ale nie można zweryfikować { $count } podpisów cyfrowych
|
||||
*[many] Dokument jest popisany, ale nie można zweryfikować { $count } podpisów cyfrowych
|
||||
}
|
||||
pdfjs-digital-signature-properties-banner-untrusted =
|
||||
{ $count ->
|
||||
[one] Dokument jest podpisany za pomocą { $count } certyfikatu, który nie jest zaufany
|
||||
[few] Dokument jest podpisany za pomocą { $count } certyfikatów, które nie są zaufane
|
||||
*[many] Dokument jest podpisany za pomocą { $count } certyfikatów, które nie są zaufane
|
||||
}
|
||||
pdfjs-digital-signature-properties-banner-expired =
|
||||
{ $count ->
|
||||
[one] Dokument jest podpisany za pomocą { $count } wygasłego certyfikatu
|
||||
[few] Dokument jest podpisany za pomocą { $count } wygasłych certyfikatów
|
||||
*[many] Dokument jest podpisany za pomocą { $count } wygasłych certyfikatów
|
||||
}
|
||||
pdfjs-digital-signature-properties-banner-invalid =
|
||||
{ $count ->
|
||||
[one] Dokument ma { $count } nieważny podpis cyfrowy
|
||||
[few] Dokument ma { $count } nieważne podpisy cyfrowe
|
||||
*[many] Dokument ma { $count } nieważnych podpisów cyfrowych
|
||||
}
|
||||
pdfjs-digital-signature-properties-banner-revoked =
|
||||
{ $count ->
|
||||
[one] Dokument jest podpisany za pomocą { $count } odwołanego certyfikatu
|
||||
[few] Dokument jest podpisany za pomocą { $count } odwołanych certyfikatów
|
||||
*[many] Dokument jest podpisany za pomocą { $count } odwołanych certyfikatów
|
||||
}
|
||||
|
||||
## Per-signature status row. Only three distinct strings are needed:
|
||||
## the signature crypto either verified (the cert chain may still be
|
||||
## untrusted/expired/revoked, but that's surfaced on the cert row
|
||||
## below), or it failed, or its sub-format isn't supported.
|
||||
|
||||
pdfjs-digital-signature-properties-status-verified = Stan: podpis jest zweryfikowany
|
||||
pdfjs-digital-signature-properties-status-invalid = Stan: podpis jest nieważny
|
||||
pdfjs-digital-signature-properties-status-unknown = Stan: nie można zweryfikować (nieobsługiwane)
|
||||
|
||||
## Per-signature certificate row. The variants with an issuer / date in
|
||||
## parentheses embed fully-localized context — no English fall-through.
|
||||
##
|
||||
## Variables:
|
||||
## $issuer (String) - issuer or subject common name from the cert.
|
||||
## $dateObj (Date) - notAfter date for the expired-with-date form.
|
||||
|
||||
pdfjs-digital-signature-properties-certificate-trusted = Certyfikat: zaufany ({ $issuer })
|
||||
pdfjs-digital-signature-properties-certificate-unknown = Certyfikat: niedostępny
|
||||
pdfjs-digital-signature-properties-certificate-untrusted = Certyfikat: niezaufany
|
||||
pdfjs-digital-signature-properties-certificate-untrusted-unknown-issuer = Certyfikat: nieznany wystawca ({ $issuer })
|
||||
pdfjs-digital-signature-properties-certificate-untrusted-self-signed = Certyfikat: samopodpisany ({ $issuer })
|
||||
pdfjs-digital-signature-properties-certificate-untrusted-untrusted-issuer = Certyfikat: niezaufany wystawca ({ $issuer })
|
||||
pdfjs-digital-signature-properties-certificate-expired = Certyfikat: wygasły
|
||||
pdfjs-digital-signature-properties-certificate-expired-with-date = Certyfikat: wygasły ({ DATETIME($dateObj, dateStyle: "medium") })
|
||||
pdfjs-digital-signature-properties-certificate-revoked = Certyfikat: odwołany
|
||||
|
||||
## Main menu for adding/removing signatures
|
||||
|
||||
pdfjs-editor-delete-signature-button1 =
|
||||
|
||||
@ -153,6 +153,27 @@ pdfjs-document-properties-linearized = Exibição web rápida:
|
||||
pdfjs-document-properties-linearized-yes = Sim
|
||||
pdfjs-document-properties-linearized-no = Não
|
||||
pdfjs-document-properties-close-button = Fechar
|
||||
pdfjs-digital-signature-properties-view-certificate = Ver certificado
|
||||
# Shown beneath an invalid signature card to explain why verification
|
||||
# failed. The text comes from NSS (e.g. "Signature integrity has been
|
||||
# compromised", "PKCS#7 signature could not be parsed") and is not
|
||||
# itself localized — it is the underlying error message produced by
|
||||
# the verification backend.
|
||||
# Variables:
|
||||
# $reason (String) - error message describing why the signature
|
||||
# could not be verified.
|
||||
pdfjs-digital-signature-properties-reason = Motivo: { $reason }
|
||||
# Variables:
|
||||
# $dateObj (Date) - the signing time from the /Sig dict's /M entry.
|
||||
pdfjs-digital-signature-properties-timestamp = Data e hora: { DATETIME($dateObj, dateStyle: "short", timeStyle: "medium") }
|
||||
# Variables:
|
||||
# $count (Number) - number of nested sub-signatures (one per earlier
|
||||
# incremental revision of the document).
|
||||
pdfjs-digital-signature-properties-sub-signatures =
|
||||
{ $count ->
|
||||
[one] Assinatura secundária ({ $count })
|
||||
*[other] Assinaturas secundárias ({ $count })
|
||||
}
|
||||
|
||||
## Print
|
||||
|
||||
@ -732,6 +753,74 @@ pdfjs-views-manager-waiting-for-file = Enviando arquivo…
|
||||
pdfjs-toggle-views-manager-button1 =
|
||||
.title = Gerenciar páginas
|
||||
|
||||
## Digital signature properties (signature verification panel)
|
||||
|
||||
pdfjs-digital-signature-properties-button =
|
||||
.title = Propriedades da assinatura digital
|
||||
.aria-label = Propriedades da assinatura digital
|
||||
pdfjs-digital-signature-properties-button-label = Propriedades da assinatura digital
|
||||
|
||||
## Banner shown above the signature list summarising the overall
|
||||
## verification state of the document. Each variant is selected by the
|
||||
## viewer based on the worst per-signature status; one signature is
|
||||
## enough to lower the banner.
|
||||
##
|
||||
## Variables:
|
||||
## $count (Number) - number of signatures at the worst level.
|
||||
|
||||
pdfjs-digital-signature-properties-banner-verified = O documento foi assinado com uma assinatura digital válida
|
||||
pdfjs-digital-signature-properties-banner-unknown =
|
||||
{ $count ->
|
||||
[one] Documento assinado, mas { $count } assinatura digital não pôde ser verificada
|
||||
*[other] Documento assinado, mas { $count } assinaturas digitais não puderam ser verificadas
|
||||
}
|
||||
pdfjs-digital-signature-properties-banner-untrusted =
|
||||
{ $count ->
|
||||
[one] Documento assinado com { $count } certificado que não é confiável
|
||||
*[other] Documento assinado com { $count } certificados que não são confiáveis
|
||||
}
|
||||
pdfjs-digital-signature-properties-banner-expired =
|
||||
{ $count ->
|
||||
[one] Documento assinado com { $count } certificado expirado
|
||||
*[other] Documento assinado com { $count } certificados expirados
|
||||
}
|
||||
pdfjs-digital-signature-properties-banner-invalid =
|
||||
{ $count ->
|
||||
[one] O documento tem { $count } assinatura digital inválida
|
||||
*[other] O documento tem { $count } assinaturas digitais inválidas
|
||||
}
|
||||
pdfjs-digital-signature-properties-banner-revoked =
|
||||
{ $count ->
|
||||
[one] Documento assinado com { $count } certificado revogado
|
||||
*[other] Documento assinado com { $count } certificados revogados
|
||||
}
|
||||
|
||||
## Per-signature status row. Only three distinct strings are needed:
|
||||
## the signature crypto either verified (the cert chain may still be
|
||||
## untrusted/expired/revoked, but that's surfaced on the cert row
|
||||
## below), or it failed, or its sub-format isn't supported.
|
||||
|
||||
pdfjs-digital-signature-properties-status-verified = Status: Assinatura verificada
|
||||
pdfjs-digital-signature-properties-status-invalid = Status: Assinatura inválida
|
||||
pdfjs-digital-signature-properties-status-unknown = Status: Não foi possível verificar (não há suporte)
|
||||
|
||||
## Per-signature certificate row. The variants with an issuer / date in
|
||||
## parentheses embed fully-localized context — no English fall-through.
|
||||
##
|
||||
## Variables:
|
||||
## $issuer (String) - issuer or subject common name from the cert.
|
||||
## $dateObj (Date) - notAfter date for the expired-with-date form.
|
||||
|
||||
pdfjs-digital-signature-properties-certificate-trusted = Certificado: Confiável ({ $issuer })
|
||||
pdfjs-digital-signature-properties-certificate-unknown = Certificado: Não disponível
|
||||
pdfjs-digital-signature-properties-certificate-untrusted = Certificado: Não confiável
|
||||
pdfjs-digital-signature-properties-certificate-untrusted-unknown-issuer = Certificado: Emissor desconhecido ({ $issuer })
|
||||
pdfjs-digital-signature-properties-certificate-untrusted-self-signed = Certificado: Autoassinado ({ $issuer })
|
||||
pdfjs-digital-signature-properties-certificate-untrusted-untrusted-issuer = Certificado: Emissor não confiável ({ $issuer })
|
||||
pdfjs-digital-signature-properties-certificate-expired = Certificado: Expirado
|
||||
pdfjs-digital-signature-properties-certificate-expired-with-date = Certificado: Expirado ({ DATETIME($dateObj, dateStyle: "medium") })
|
||||
pdfjs-digital-signature-properties-certificate-revoked = Certificado: Revogado
|
||||
|
||||
## Main menu for adding/removing signatures
|
||||
|
||||
pdfjs-editor-delete-signature-button1 =
|
||||
|
||||
@ -153,6 +153,28 @@ pdfjs-document-properties-linearized = Vizualizare web rapidă:
|
||||
pdfjs-document-properties-linearized-yes = Da
|
||||
pdfjs-document-properties-linearized-no = Nu
|
||||
pdfjs-document-properties-close-button = Închide
|
||||
pdfjs-digital-signature-properties-view-certificate = Vezi certificatul
|
||||
# Shown beneath an invalid signature card to explain why verification
|
||||
# failed. The text comes from NSS (e.g. "Signature integrity has been
|
||||
# compromised", "PKCS#7 signature could not be parsed") and is not
|
||||
# itself localized — it is the underlying error message produced by
|
||||
# the verification backend.
|
||||
# Variables:
|
||||
# $reason (String) - error message describing why the signature
|
||||
# could not be verified.
|
||||
pdfjs-digital-signature-properties-reason = Motiv: { $reason }
|
||||
# Variables:
|
||||
# $dateObj (Date) - the signing time from the /Sig dict's /M entry.
|
||||
pdfjs-digital-signature-properties-timestamp = Marcaj temporal: { DATETIME($dateObj, dateStyle: "short", timeStyle: "medium") }
|
||||
# Variables:
|
||||
# $count (Number) - number of nested sub-signatures (one per earlier
|
||||
# incremental revision of the document).
|
||||
pdfjs-digital-signature-properties-sub-signatures =
|
||||
{ $count ->
|
||||
[one] ({ $count }) sub semnătură
|
||||
[few] ({ $count }) sub semnături
|
||||
*[other] ({ $count }) de sub semnături
|
||||
}
|
||||
|
||||
## Print
|
||||
|
||||
@ -390,8 +412,9 @@ pdfjs-free-text2 =
|
||||
# $count (Number) - the number of comments.
|
||||
pdfjs-editor-comments-sidebar-title =
|
||||
{ $count ->
|
||||
[one] Comentariu
|
||||
*[other] Comentarii
|
||||
[one] comentariu
|
||||
[few] comentarii
|
||||
*[other] de comentarii
|
||||
}
|
||||
pdfjs-editor-comments-sidebar-close-button =
|
||||
.title = Închide bara laterală
|
||||
@ -739,6 +762,79 @@ pdfjs-views-manager-waiting-for-file = Se încarcă fișierul…
|
||||
pdfjs-toggle-views-manager-button1 =
|
||||
.title = Gestionează paginile
|
||||
|
||||
## Digital signature properties (signature verification panel)
|
||||
|
||||
pdfjs-digital-signature-properties-button =
|
||||
.title = Proprietățile semnăturii digitale
|
||||
.aria-label = Proprietățile semnăturii digitale
|
||||
pdfjs-digital-signature-properties-button-label = Proprietățile semnăturii digitale
|
||||
|
||||
## Banner shown above the signature list summarising the overall
|
||||
## verification state of the document. Each variant is selected by the
|
||||
## viewer based on the worst per-signature status; one signature is
|
||||
## enough to lower the banner.
|
||||
##
|
||||
## Variables:
|
||||
## $count (Number) - number of signatures at the worst level.
|
||||
|
||||
pdfjs-digital-signature-properties-banner-verified = Documentul a fost semnat cu o semnătură digitală validă
|
||||
pdfjs-digital-signature-properties-banner-unknown =
|
||||
{ $count ->
|
||||
[one] Document semnat, dar { $count } semnătură digitală nu au putut fi verificată
|
||||
[few] Document semnat, dar { $count } semnături digitale nu au putut fi verificate
|
||||
*[other] Document semnat, dar { $count } de semnături digitale nu au putut fi verificate
|
||||
}
|
||||
pdfjs-digital-signature-properties-banner-untrusted =
|
||||
{ $count ->
|
||||
[one] Document semnat cu { $count } certificat care nu este de încredere
|
||||
[few] Document semnat cu { $count } certificate care nu sunt de încredere
|
||||
*[other] Document semnat cu { $count } de certificate care nu sunt de încredere
|
||||
}
|
||||
pdfjs-digital-signature-properties-banner-expired =
|
||||
{ $count ->
|
||||
[one] Document semnat cu { $count } certificat expirat
|
||||
[few] Document semnat cu { $count } certificate expirate
|
||||
*[other] Document semnat cu { $count } de certificate expirate
|
||||
}
|
||||
pdfjs-digital-signature-properties-banner-invalid =
|
||||
{ $count ->
|
||||
[one] Documentul are { $count } semnătură digitală nevalidă
|
||||
[few] Documentul are { $count } semnături digitale nevalide
|
||||
*[other] Documentul are { $count } de semnături digitale nevalide
|
||||
}
|
||||
pdfjs-digital-signature-properties-banner-revoked =
|
||||
{ $count ->
|
||||
[one] Document semnat cu { $count } certificat revocat
|
||||
[few] Document semnat cu { $count } certificate revocate
|
||||
*[other] Document semnat cu { $count } de certificate revocate
|
||||
}
|
||||
|
||||
## Per-signature status row. Only three distinct strings are needed:
|
||||
## the signature crypto either verified (the cert chain may still be
|
||||
## untrusted/expired/revoked, but that's surfaced on the cert row
|
||||
## below), or it failed, or its sub-format isn't supported.
|
||||
|
||||
pdfjs-digital-signature-properties-status-verified = Stare: Semnătură verificată
|
||||
pdfjs-digital-signature-properties-status-invalid = Stare: Semnătură nevalidă
|
||||
pdfjs-digital-signature-properties-status-unknown = Stare: Nu se poate verifica (neacceptat)
|
||||
|
||||
## Per-signature certificate row. The variants with an issuer / date in
|
||||
## parentheses embed fully-localized context — no English fall-through.
|
||||
##
|
||||
## Variables:
|
||||
## $issuer (String) - issuer or subject common name from the cert.
|
||||
## $dateObj (Date) - notAfter date for the expired-with-date form.
|
||||
|
||||
pdfjs-digital-signature-properties-certificate-trusted = Certificat: De încredere ({ $issuer })
|
||||
pdfjs-digital-signature-properties-certificate-unknown = Certificat: Indisponibil
|
||||
pdfjs-digital-signature-properties-certificate-untrusted = Certificat: De neîncredere
|
||||
pdfjs-digital-signature-properties-certificate-untrusted-unknown-issuer = Certificat: Emitent necunoscut ({ $issuer })
|
||||
pdfjs-digital-signature-properties-certificate-untrusted-self-signed = Certificat: Autosemnat ({ $issuer })
|
||||
pdfjs-digital-signature-properties-certificate-untrusted-untrusted-issuer = Certificat: Emitent de neîncredere ({ $issuer })
|
||||
pdfjs-digital-signature-properties-certificate-expired = Certificat: Expirat
|
||||
pdfjs-digital-signature-properties-certificate-expired-with-date = Certificat: Expirat ({ DATETIME($dateObj, dateStyle: "medium") })
|
||||
pdfjs-digital-signature-properties-certificate-revoked = Certificat: Revocat
|
||||
|
||||
## Main menu for adding/removing signatures
|
||||
|
||||
pdfjs-editor-delete-signature-button1 =
|
||||
|
||||
@ -153,6 +153,28 @@ pdfjs-document-properties-linearized = Быстрый просмотр в Web:
|
||||
pdfjs-document-properties-linearized-yes = Да
|
||||
pdfjs-document-properties-linearized-no = Нет
|
||||
pdfjs-document-properties-close-button = Закрыть
|
||||
pdfjs-digital-signature-properties-view-certificate = Просмотреть сертификат
|
||||
# Shown beneath an invalid signature card to explain why verification
|
||||
# failed. The text comes from NSS (e.g. "Signature integrity has been
|
||||
# compromised", "PKCS#7 signature could not be parsed") and is not
|
||||
# itself localized — it is the underlying error message produced by
|
||||
# the verification backend.
|
||||
# Variables:
|
||||
# $reason (String) - error message describing why the signature
|
||||
# could not be verified.
|
||||
pdfjs-digital-signature-properties-reason = Причина: { $reason }
|
||||
# Variables:
|
||||
# $dateObj (Date) - the signing time from the /Sig dict's /M entry.
|
||||
pdfjs-digital-signature-properties-timestamp = Метка времени: { DATETIME($dateObj, dateStyle: "short", timeStyle: "medium") }
|
||||
# Variables:
|
||||
# $count (Number) - number of nested sub-signatures (one per earlier
|
||||
# incremental revision of the document).
|
||||
pdfjs-digital-signature-properties-sub-signatures =
|
||||
{ $count ->
|
||||
[one] Дополнительная подпись ({ $count })
|
||||
[few] Дополнительные подписи ({ $count })
|
||||
*[many] Дополнительные подписи ({ $count })
|
||||
}
|
||||
|
||||
## Print
|
||||
|
||||
@ -740,6 +762,79 @@ pdfjs-views-manager-waiting-for-file = Загрузка файла…
|
||||
pdfjs-toggle-views-manager-button1 =
|
||||
.title = Управление страницами
|
||||
|
||||
## Digital signature properties (signature verification panel)
|
||||
|
||||
pdfjs-digital-signature-properties-button =
|
||||
.title = Свойства цифровой подписи
|
||||
.aria-label = Свойства цифровой подписи
|
||||
pdfjs-digital-signature-properties-button-label = Свойства цифровой подписи
|
||||
|
||||
## Banner shown above the signature list summarising the overall
|
||||
## verification state of the document. Each variant is selected by the
|
||||
## viewer based on the worst per-signature status; one signature is
|
||||
## enough to lower the banner.
|
||||
##
|
||||
## Variables:
|
||||
## $count (Number) - number of signatures at the worst level.
|
||||
|
||||
pdfjs-digital-signature-properties-banner-verified = Документ был подписан действительной цифровой подписью
|
||||
pdfjs-digital-signature-properties-banner-unknown =
|
||||
{ $count ->
|
||||
[one] Документ подписан, но { $count } цифровая подпись не может быть проверены
|
||||
[few] Документ подписан, но { $count } цифровых подписи не могут быть проверены
|
||||
*[many] Документ подписан, но { $count } цифровых подписей не могут быть проверены
|
||||
}
|
||||
pdfjs-digital-signature-properties-banner-untrusted =
|
||||
{ $count ->
|
||||
[one] Документ, подписанный { $count } недоверенным сертификатом
|
||||
[few] Документ, подписанный { $count } недоверенными сертификатами
|
||||
*[many] Документ, подписанный { $count } недоверенных сертификатов
|
||||
}
|
||||
pdfjs-digital-signature-properties-banner-expired =
|
||||
{ $count ->
|
||||
[one] Документ, подписанный { $count } истёкшим сертификатом
|
||||
[few] Документ, подписанный { $count } истёкшими сертификатами
|
||||
*[many] Документ, подписанный { $count } истёкших сертификатов
|
||||
}
|
||||
pdfjs-digital-signature-properties-banner-invalid =
|
||||
{ $count ->
|
||||
[one] Документ имеет { $count } неверную цифровую подпись
|
||||
[few] Документ имеет { $count } неверных цифровых подписей
|
||||
*[many] Документ имеет { $count } неверных цифровых подписей
|
||||
}
|
||||
pdfjs-digital-signature-properties-banner-revoked =
|
||||
{ $count ->
|
||||
[one] Документ, подписанный { $count } отозванным сертификатом
|
||||
[few] Документ, подписанный { $count } отозванными сертификатами
|
||||
*[many] Документ, подписанный { $count } отозванных сертификатов
|
||||
}
|
||||
|
||||
## Per-signature status row. Only three distinct strings are needed:
|
||||
## the signature crypto either verified (the cert chain may still be
|
||||
## untrusted/expired/revoked, but that's surfaced on the cert row
|
||||
## below), or it failed, or its sub-format isn't supported.
|
||||
|
||||
pdfjs-digital-signature-properties-status-verified = Статус: Подпись проверена
|
||||
pdfjs-digital-signature-properties-status-invalid = Статус: Подпись недействительна
|
||||
pdfjs-digital-signature-properties-status-unknown = Статус: Не удалось проверить (не поддерживается)
|
||||
|
||||
## Per-signature certificate row. The variants with an issuer / date in
|
||||
## parentheses embed fully-localized context — no English fall-through.
|
||||
##
|
||||
## Variables:
|
||||
## $issuer (String) - issuer or subject common name from the cert.
|
||||
## $dateObj (Date) - notAfter date for the expired-with-date form.
|
||||
|
||||
pdfjs-digital-signature-properties-certificate-trusted = Сертификат: Доверенный ({ $issuer })
|
||||
pdfjs-digital-signature-properties-certificate-unknown = Сертификат: Недоступен
|
||||
pdfjs-digital-signature-properties-certificate-untrusted = Сертификат: Недоверенный
|
||||
pdfjs-digital-signature-properties-certificate-untrusted-unknown-issuer = Сертификат: Неизвестный издатель ({ $issuer })
|
||||
pdfjs-digital-signature-properties-certificate-untrusted-self-signed = Сертификат: Самоподписанный ({ $issuer })
|
||||
pdfjs-digital-signature-properties-certificate-untrusted-untrusted-issuer = Сертификат: Недоверенный издатель ({ $issuer })
|
||||
pdfjs-digital-signature-properties-certificate-expired = Сертификат: Истёк срок действия
|
||||
pdfjs-digital-signature-properties-certificate-expired-with-date = Сертификат: Истёк срок действия ({ DATETIME($dateObj, dateStyle: "medium") })
|
||||
pdfjs-digital-signature-properties-certificate-revoked = Сертификат: Отозван
|
||||
|
||||
## Main menu for adding/removing signatures
|
||||
|
||||
pdfjs-editor-delete-signature-button1 =
|
||||
|
||||
@ -87,6 +87,7 @@ pdfjs-scroll-horizontal-button-label = Iscurrimentu orizontale
|
||||
pdfjs-scroll-wrapped-button =
|
||||
.title = Imprea s'iscurrimentu continu
|
||||
pdfjs-scroll-wrapped-button-label = Iscurrimentu continu
|
||||
pdfjs-spread-none-button-label = Pàginas individuales
|
||||
|
||||
## Document properties dialog
|
||||
|
||||
@ -133,6 +134,19 @@ pdfjs-document-properties-linearized = Visualizatzione web lestra:
|
||||
pdfjs-document-properties-linearized-yes = Eja
|
||||
pdfjs-document-properties-linearized-no = Nono
|
||||
pdfjs-document-properties-close-button = Serra
|
||||
pdfjs-digital-signature-properties-view-certificate = Ammustra su tzertificadu
|
||||
# Shown beneath an invalid signature card to explain why verification
|
||||
# failed. The text comes from NSS (e.g. "Signature integrity has been
|
||||
# compromised", "PKCS#7 signature could not be parsed") and is not
|
||||
# itself localized — it is the underlying error message produced by
|
||||
# the verification backend.
|
||||
# Variables:
|
||||
# $reason (String) - error message describing why the signature
|
||||
# could not be verified.
|
||||
pdfjs-digital-signature-properties-reason = Resone: { $reason }
|
||||
# Variables:
|
||||
# $dateObj (Date) - the signing time from the /Sig dict's /M entry.
|
||||
pdfjs-digital-signature-properties-timestamp = Data e ora: { DATETIME($dateObj, dateStyle: "short", timeStyle: "medium") }
|
||||
|
||||
## Print
|
||||
|
||||
@ -179,6 +193,15 @@ pdfjs-thumb-page-title =
|
||||
# $page (Number) - the page number
|
||||
pdfjs-thumb-page-canvas =
|
||||
.aria-label = Miniatura de sa pàgina { $page }
|
||||
# Variables:
|
||||
# $page (Number) - the page number
|
||||
pdfjs-thumb-page-checkbox1 =
|
||||
.title = Seletziona sa pàgina { $page }
|
||||
# Variables:
|
||||
# $page (Number) - the page number
|
||||
# $total (Number) - the number of pages
|
||||
pdfjs-thumb-page-title1 =
|
||||
.title = Pàgina { $page } de { $total }
|
||||
|
||||
## Find panel button title and messages
|
||||
|
||||
@ -197,10 +220,27 @@ pdfjs-find-match-diacritics-checkbox-label = Respeta is diacrìticos
|
||||
pdfjs-find-entire-word-checkbox-label = Faeddos intreos
|
||||
pdfjs-find-reached-top = S'est lòmpidu a su cumintzu de su documentu, si sighit dae su bàsciu
|
||||
pdfjs-find-reached-bottom = Acabbu de su documentu, si sighit dae s'artu
|
||||
# Variables:
|
||||
# $current (Number) - the index of the currently active find result
|
||||
# $total (Number) - the total number of matches in the document
|
||||
pdfjs-find-match-count =
|
||||
{ $total ->
|
||||
[one] { $current } currispondèntzia de { $total }
|
||||
*[other] { $current } currispondèntzias de { $total }
|
||||
}
|
||||
# Variables:
|
||||
# $limit (Number) - the maximum number of matches
|
||||
pdfjs-find-match-count-limit =
|
||||
{ $limit ->
|
||||
[one] Prus de { $limit } currispondèntzia
|
||||
*[other] Prus de { $limit } currispondèntzias
|
||||
}
|
||||
pdfjs-find-not-found = Testu no agatadu
|
||||
|
||||
## Predefined zoom values
|
||||
|
||||
pdfjs-page-scale-width = Larghesa de sa pàgina
|
||||
pdfjs-page-scale-fit = Pàgina intrea
|
||||
pdfjs-page-scale-auto = Ingrandimentu automàticu
|
||||
pdfjs-page-scale-actual = Mannària reale
|
||||
# Variables:
|
||||
@ -222,6 +262,12 @@ pdfjs-missing-file-error = Ammancat s'archìviu PDF.
|
||||
pdfjs-unexpected-response-error = Risposta imprevista de su serbidore.
|
||||
pdfjs-rendering-error = Faddina in sa visualizatzione de sa pàgina.
|
||||
|
||||
## Annotations
|
||||
|
||||
# Variables:
|
||||
# $dateObj (Date) - the modification date and time of the annotation
|
||||
pdfjs-annotation-date-time-string = { DATETIME($dateObj, dateStyle: "short", timeStyle: "medium") }
|
||||
|
||||
## Password
|
||||
|
||||
pdfjs-password-label = Inserta sa crae pro abèrrere custu archìviu PDF.
|
||||
@ -234,9 +280,13 @@ pdfjs-web-fonts-disabled = Is tipografias web sunt disativadas: is tipografias i
|
||||
|
||||
pdfjs-editor-free-text-button =
|
||||
.title = Testu
|
||||
pdfjs-editor-color-picker-free-text-input =
|
||||
.title = Muda su colore de su testu
|
||||
pdfjs-editor-free-text-button-label = Testu
|
||||
pdfjs-editor-ink-button =
|
||||
.title = Disinnu
|
||||
pdfjs-editor-color-picker-ink-input =
|
||||
.title = Muda su colore pro su disinnu
|
||||
pdfjs-editor-ink-button-label = Disinnu
|
||||
pdfjs-editor-stamp-button =
|
||||
.title = Agiunghe o modìfica immàgines
|
||||
@ -248,6 +298,33 @@ pdfjs-highlight-floating-button1 =
|
||||
.title = Evidèntzia
|
||||
.aria-label = Evidèntzia
|
||||
pdfjs-highlight-floating-button-label = Evidèntzia
|
||||
pdfjs-comment-floating-button =
|
||||
.title = Cummenta
|
||||
.aria-label = Cummenta
|
||||
pdfjs-comment-floating-button-label = Cummenta
|
||||
pdfjs-editor-comment-button =
|
||||
.title = Cummenta
|
||||
.aria-label = Cummenta
|
||||
pdfjs-editor-comment-button-label = Cummenta
|
||||
pdfjs-editor-signature-button =
|
||||
.title = Agiunghe una firma
|
||||
pdfjs-editor-signature-button-label = Agiunghe una firma
|
||||
|
||||
## Default editor aria labels
|
||||
|
||||
# “Highlight” is a noun, the string is used on the editor for highlights.
|
||||
pdfjs-editor-highlight-editor =
|
||||
.aria-label = Editore de sutaliniadura
|
||||
# “Drawing” is a noun, the string is used on the editor for drawings.
|
||||
pdfjs-editor-ink-editor =
|
||||
.aria-label = Editore de disinnos
|
||||
# Used when a signature editor is selected/hovered.
|
||||
# Variables:
|
||||
# $description (String) - a string describing/labeling the signature.
|
||||
pdfjs-editor-signature-editor1 =
|
||||
.aria-description = Editore de firmas: { $description }
|
||||
pdfjs-editor-stamp-editor =
|
||||
.aria-label = Editore de immàgines
|
||||
|
||||
## Remove button for the various kind of editor.
|
||||
|
||||
@ -259,6 +336,8 @@ pdfjs-editor-remove-stamp-button =
|
||||
.title = Boga s’immàgine
|
||||
pdfjs-editor-remove-highlight-button =
|
||||
.title = Boga s’evidèntzia
|
||||
pdfjs-editor-remove-signature-button =
|
||||
.title = Boga·nche sa firma
|
||||
|
||||
##
|
||||
|
||||
@ -272,19 +351,47 @@ pdfjs-editor-stamp-add-image-button =
|
||||
pdfjs-editor-stamp-add-image-button-label = Agiunghe un’immàgine
|
||||
# This refers to the thickness of the line used for free highlighting (not bound to text)
|
||||
pdfjs-editor-free-highlight-thickness-input = Grussària
|
||||
pdfjs-editor-add-signature-container =
|
||||
.aria-label = Controllos de firma e firmas sarvadas
|
||||
pdfjs-editor-signature-add-signature-button =
|
||||
.title = Agiunghe una firma noa
|
||||
pdfjs-editor-signature-add-signature-button-label = Agiunghe una firma noa
|
||||
# Used on the button to use an already saved signature.
|
||||
# Variables:
|
||||
# $description (String) - a string describing/labeling the signature.
|
||||
pdfjs-editor-add-saved-signature-button =
|
||||
.title = Firma sarvada: { $description }
|
||||
# .default-content is used as a placeholder in an empty text editor.
|
||||
pdfjs-free-text2 =
|
||||
.aria-label = Editore de testu
|
||||
.default-content = Cumintza a iscrìere…
|
||||
# Used to show how many comments are present in the pdf file.
|
||||
# Variables:
|
||||
# $count (Number) - the number of comments.
|
||||
pdfjs-editor-comments-sidebar-title =
|
||||
{ $count ->
|
||||
[one] Cummentu
|
||||
*[other] Cummentos
|
||||
}
|
||||
pdfjs-editor-comments-sidebar-close-button =
|
||||
.title = Serra sa barra laterale
|
||||
.aria-label = Serra sa barra laterale
|
||||
pdfjs-editor-comments-sidebar-close-button-label = Serra sa barra laterale
|
||||
# Instructional copy to add a comment by selecting text or an annotations.
|
||||
pdfjs-editor-comments-sidebar-no-comments1 = As rilevadu una cosa de interessu? Sinnala·dda e agiunghe unu cummentu.
|
||||
|
||||
## Alt-text dialog
|
||||
|
||||
pdfjs-editor-alt-text-button-label = Testu alternativu
|
||||
pdfjs-editor-alt-text-edit-button =
|
||||
.aria-label = Modifica su testu alternativu
|
||||
pdfjs-editor-alt-text-dialog-label = Sèbera un’optzione
|
||||
pdfjs-editor-alt-text-dialog-description = Su testu alternativu (“alt text”) est ùtile pro persones chi non podent bìdere s’immàgine o cando non benit carrigada.
|
||||
pdfjs-editor-alt-text-add-description-label = Agiunghe una descritzione
|
||||
pdfjs-editor-alt-text-mark-decorative-label = Sinnala comente decorativa
|
||||
pdfjs-editor-alt-text-cancel-button = Annulla
|
||||
pdfjs-editor-alt-text-save-button = Sarva
|
||||
pdfjs-editor-alt-text-decorative-tooltip = Sinnalada comente decorativu
|
||||
|
||||
## Color picker
|
||||
|
||||
@ -304,7 +411,13 @@ pdfjs-editor-colorpicker-pink =
|
||||
## New alt-text dialog
|
||||
## Group note for entire feature: Alternative text (alt text) helps when people can't see the image. This feature includes a tool to create alt text automatically using an AI model that works locally on the user's device to preserve privacy.
|
||||
|
||||
# This is a button that users can click to open the alt text editor and add alt text when it is not present.
|
||||
pdfjs-editor-new-alt-text-missing-button =
|
||||
.aria-label = Mancat su testu alternativu
|
||||
pdfjs-editor-new-alt-text-missing-button-label = Mancat su testu alternativu
|
||||
# This is a button that opens up the alt text modal where users should review the alt text that was automatically generated.
|
||||
pdfjs-editor-new-alt-text-to-review-button =
|
||||
.aria-label = Revisiona su testu alternativu
|
||||
pdfjs-editor-new-alt-text-to-review-button-label = Revisiona su testu alternativu
|
||||
# "Created automatically" is a prefix that will be added to the beginning of any alt text that has been automatically generated. After the colon, the user will see/hear the actual alt text description. If the alt text has been edited by a human, this prefix will not appear.
|
||||
# Variables:
|
||||
@ -332,6 +445,19 @@ pdfjs-editor-alt-text-settings-show-dialog-button-label = Mustra deretu s’edit
|
||||
pdfjs-editor-alt-text-settings-show-dialog-description = T’agiudat a assegurare chi totu is immàgines tuas tèngiant unu testu alternativu.
|
||||
pdfjs-editor-alt-text-settings-close-button = Serra
|
||||
|
||||
## "Annotations removed" bar
|
||||
|
||||
pdfjs-editor-undo-bar-message-freetext = Testu cantzelladu
|
||||
pdfjs-editor-undo-bar-message-ink = Disinnu cantzelladu
|
||||
pdfjs-editor-undo-bar-message-stamp = Immàgine cantzellada
|
||||
pdfjs-editor-undo-bar-message-signature = Firma cantzellada
|
||||
pdfjs-editor-undo-bar-undo-button =
|
||||
.title = Iscontza
|
||||
pdfjs-editor-undo-bar-undo-button-label = Iscontza
|
||||
pdfjs-editor-undo-bar-close-button =
|
||||
.title = Serra
|
||||
pdfjs-editor-undo-bar-close-button-label = Serra
|
||||
|
||||
## Dialog buttons
|
||||
|
||||
pdfjs-editor-add-signature-cancel-button = Annulla
|
||||
|
||||
@ -153,6 +153,29 @@ pdfjs-document-properties-linearized = Rýchle zobrazovanie z webu:
|
||||
pdfjs-document-properties-linearized-yes = Áno
|
||||
pdfjs-document-properties-linearized-no = Nie
|
||||
pdfjs-document-properties-close-button = Zavrieť
|
||||
pdfjs-digital-signature-properties-view-certificate = Zobraziť certifikát
|
||||
# Shown beneath an invalid signature card to explain why verification
|
||||
# failed. The text comes from NSS (e.g. "Signature integrity has been
|
||||
# compromised", "PKCS#7 signature could not be parsed") and is not
|
||||
# itself localized — it is the underlying error message produced by
|
||||
# the verification backend.
|
||||
# Variables:
|
||||
# $reason (String) - error message describing why the signature
|
||||
# could not be verified.
|
||||
pdfjs-digital-signature-properties-reason = Dôvod: { $reason }
|
||||
# Variables:
|
||||
# $dateObj (Date) - the signing time from the /Sig dict's /M entry.
|
||||
pdfjs-digital-signature-properties-timestamp = Časová pečiatka: { DATETIME($dateObj, dateStyle: "short", timeStyle: "medium") }
|
||||
# Variables:
|
||||
# $count (Number) - number of nested sub-signatures (one per earlier
|
||||
# incremental revision of the document).
|
||||
pdfjs-digital-signature-properties-sub-signatures =
|
||||
{ $count ->
|
||||
[one] Podpodpis ({ $count })
|
||||
[few] Podpodpisy ({ $count })
|
||||
[many] Podpodpisy ({ $count })
|
||||
*[other] Podpodpisy ({ $count })
|
||||
}
|
||||
|
||||
## Print
|
||||
|
||||
@ -748,6 +771,84 @@ pdfjs-views-manager-waiting-for-file = Nahráva sa súbor…
|
||||
pdfjs-toggle-views-manager-button1 =
|
||||
.title = Spravovať strany
|
||||
|
||||
## Digital signature properties (signature verification panel)
|
||||
|
||||
pdfjs-digital-signature-properties-button =
|
||||
.title = Vlastnosti digitálneho podpisu
|
||||
.aria-label = Vlastnosti digitálneho podpisu
|
||||
pdfjs-digital-signature-properties-button-label = Vlastnosti digitálneho podpisu
|
||||
|
||||
## Banner shown above the signature list summarising the overall
|
||||
## verification state of the document. Each variant is selected by the
|
||||
## viewer based on the worst per-signature status; one signature is
|
||||
## enough to lower the banner.
|
||||
##
|
||||
## Variables:
|
||||
## $count (Number) - number of signatures at the worst level.
|
||||
|
||||
pdfjs-digital-signature-properties-banner-verified = Dokument bol podpísaný platným digitálnym podpisom
|
||||
pdfjs-digital-signature-properties-banner-unknown =
|
||||
{ $count ->
|
||||
[one] Dokument bol podpísaný, ale { $count } digitálny podpis sa nepodarilo overiť
|
||||
[few] Dokument bol podpísaný, ale { $count } digitálne podpisy sa nepodarilo overiť
|
||||
[many] Dokument bol podpísaný, ale { $count } digitálnych podpisov sa nepodarilo overiť
|
||||
*[other] Dokument bol podpísaný, ale { $count } digitálnych podpisov sa nepodarilo overiť
|
||||
}
|
||||
pdfjs-digital-signature-properties-banner-untrusted =
|
||||
{ $count ->
|
||||
[one] Dokument bol podpísaný { $count } certifikátom, ktorý nie je dôveryhodný
|
||||
[few] Dokument bol podpísaný { $count } certifikátmi, ktoré nie sú dôveryhodné
|
||||
[many] Dokument bol podpísaný { $count } certifikátmi, ktoré nie sú dôveryhodné
|
||||
*[other] Dokument bol podpísaný { $count } certifikátmi, ktoré nie sú dôveryhodné
|
||||
}
|
||||
pdfjs-digital-signature-properties-banner-expired =
|
||||
{ $count ->
|
||||
[one] Dokument bol podpísaný { $count } certifikátom, ktorému vypršala platnosť
|
||||
[few] Dokument bol podpísaný { $count } certifikátmi, ktorých platnosť vypršala
|
||||
[many] Dokument bol podpísaný { $count } certifikátmi, ktorých platnosť vypršala
|
||||
*[other] Dokument bol podpísaný { $count } certifikátmi, ktorých platnosť vypršala
|
||||
}
|
||||
pdfjs-digital-signature-properties-banner-invalid =
|
||||
{ $count ->
|
||||
[one] Dokument má { $count } neplatný digitálny podpis
|
||||
[few] Dokument má { $count } neplatné digitálne podpisy
|
||||
[many] Dokument má { $count } neplatných digitálnych podpisov
|
||||
*[other] Dokument má { $count } neplatných digitálnych podpisov
|
||||
}
|
||||
pdfjs-digital-signature-properties-banner-revoked =
|
||||
{ $count ->
|
||||
[one] Dokument bol podpísaný { $count } zrušeným certifikátom
|
||||
[few] Dokument bol podpísaný { $count } zrušenými certifikátmi
|
||||
[many] Dokument bol podpísaný { $count } zrušenými certifikátmi
|
||||
*[other] Dokument bol podpísaný { $count } zrušenými certifikátmi
|
||||
}
|
||||
|
||||
## Per-signature status row. Only three distinct strings are needed:
|
||||
## the signature crypto either verified (the cert chain may still be
|
||||
## untrusted/expired/revoked, but that's surfaced on the cert row
|
||||
## below), or it failed, or its sub-format isn't supported.
|
||||
|
||||
pdfjs-digital-signature-properties-status-verified = Stav: Podpis overený
|
||||
pdfjs-digital-signature-properties-status-invalid = Stav: Podpis neplatný
|
||||
pdfjs-digital-signature-properties-status-unknown = Stav: Nedá sa overiť (nepodporovaný)
|
||||
|
||||
## Per-signature certificate row. The variants with an issuer / date in
|
||||
## parentheses embed fully-localized context — no English fall-through.
|
||||
##
|
||||
## Variables:
|
||||
## $issuer (String) - issuer or subject common name from the cert.
|
||||
## $dateObj (Date) - notAfter date for the expired-with-date form.
|
||||
|
||||
pdfjs-digital-signature-properties-certificate-trusted = Certifikát: Dôveryhodný ({ $issuer })
|
||||
pdfjs-digital-signature-properties-certificate-unknown = Certifikát: Nie je k dispozícii
|
||||
pdfjs-digital-signature-properties-certificate-untrusted = Certifikát: Nedôveryhodný
|
||||
pdfjs-digital-signature-properties-certificate-untrusted-unknown-issuer = Certifikát: Neznámy vydavateľ ({ $issuer })
|
||||
pdfjs-digital-signature-properties-certificate-untrusted-self-signed = Certifikát: Samopodpísaný ({ $issuer })
|
||||
pdfjs-digital-signature-properties-certificate-untrusted-untrusted-issuer = Certifikát: Nedôveryhodný vydavateľ ({ $issuer })
|
||||
pdfjs-digital-signature-properties-certificate-expired = Certifikát: Platnosť vypršala
|
||||
pdfjs-digital-signature-properties-certificate-expired-with-date = Certifikát: Platnosť vypršala ({ DATETIME($dateObj, dateStyle: "medium") })
|
||||
pdfjs-digital-signature-properties-certificate-revoked = Certifikát: Zrušený
|
||||
|
||||
## Main menu for adding/removing signatures
|
||||
|
||||
pdfjs-editor-delete-signature-button1 =
|
||||
|
||||
@ -132,8 +132,8 @@ pdfjs-document-properties-page-size-orientation-portrait = pokončno
|
||||
pdfjs-document-properties-page-size-orientation-landscape = ležeče
|
||||
pdfjs-document-properties-page-size-name-a-three = A3
|
||||
pdfjs-document-properties-page-size-name-a-four = A4
|
||||
pdfjs-document-properties-page-size-name-letter = Pismo
|
||||
pdfjs-document-properties-page-size-name-legal = Pravno
|
||||
pdfjs-document-properties-page-size-name-letter = Letter
|
||||
pdfjs-document-properties-page-size-name-legal = Legal
|
||||
|
||||
## Variables:
|
||||
## $width (Number) - the width of the (current) page
|
||||
@ -153,6 +153,29 @@ pdfjs-document-properties-linearized = Hitri spletni ogled:
|
||||
pdfjs-document-properties-linearized-yes = Da
|
||||
pdfjs-document-properties-linearized-no = Ne
|
||||
pdfjs-document-properties-close-button = Zapri
|
||||
pdfjs-digital-signature-properties-view-certificate = Ogled digitalnega potrdila
|
||||
# Shown beneath an invalid signature card to explain why verification
|
||||
# failed. The text comes from NSS (e.g. "Signature integrity has been
|
||||
# compromised", "PKCS#7 signature could not be parsed") and is not
|
||||
# itself localized — it is the underlying error message produced by
|
||||
# the verification backend.
|
||||
# Variables:
|
||||
# $reason (String) - error message describing why the signature
|
||||
# could not be verified.
|
||||
pdfjs-digital-signature-properties-reason = Razlog: { $reason }
|
||||
# Variables:
|
||||
# $dateObj (Date) - the signing time from the /Sig dict's /M entry.
|
||||
pdfjs-digital-signature-properties-timestamp = Časovni žig: { DATETIME($dateObj, dateStyle: "short", timeStyle: "medium") }
|
||||
# Variables:
|
||||
# $count (Number) - number of nested sub-signatures (one per earlier
|
||||
# incremental revision of the document).
|
||||
pdfjs-digital-signature-properties-sub-signatures =
|
||||
{ $count ->
|
||||
[one] Podpodpis ({ $count })
|
||||
[two] Podpodpisi ({ $count })
|
||||
[few] Podpodpisi ({ $count })
|
||||
*[other] Podpodpisi ({ $count })
|
||||
}
|
||||
|
||||
## Print
|
||||
|
||||
@ -748,6 +771,23 @@ pdfjs-views-manager-waiting-for-file = Nalaganje datoteke …
|
||||
pdfjs-toggle-views-manager-button1 =
|
||||
.title = Upravljanje strani
|
||||
|
||||
## Digital signature properties (signature verification panel)
|
||||
|
||||
pdfjs-digital-signature-properties-button =
|
||||
.title = Lastnosti digitalnega podpisa
|
||||
.aria-label = Lastnosti digitalnega podpisa
|
||||
pdfjs-digital-signature-properties-button-label = Lastnosti digitalnega podpisa
|
||||
|
||||
## Banner shown above the signature list summarising the overall
|
||||
## verification state of the document. Each variant is selected by the
|
||||
## viewer based on the worst per-signature status; one signature is
|
||||
## enough to lower the banner.
|
||||
##
|
||||
## Variables:
|
||||
## $count (Number) - number of signatures at the worst level.
|
||||
|
||||
pdfjs-digital-signature-properties-banner-verified = Dokument je bil podpisan z veljavnim digitalnim podpisom
|
||||
|
||||
## Main menu for adding/removing signatures
|
||||
|
||||
pdfjs-editor-delete-signature-button1 =
|
||||
|
||||
@ -153,6 +153,28 @@ pdfjs-document-properties-linearized = Брз веб приказ:
|
||||
pdfjs-document-properties-linearized-yes = Да
|
||||
pdfjs-document-properties-linearized-no = Не
|
||||
pdfjs-document-properties-close-button = Затвори
|
||||
pdfjs-digital-signature-properties-view-certificate = Прикажи сертификат
|
||||
# Shown beneath an invalid signature card to explain why verification
|
||||
# failed. The text comes from NSS (e.g. "Signature integrity has been
|
||||
# compromised", "PKCS#7 signature could not be parsed") and is not
|
||||
# itself localized — it is the underlying error message produced by
|
||||
# the verification backend.
|
||||
# Variables:
|
||||
# $reason (String) - error message describing why the signature
|
||||
# could not be verified.
|
||||
pdfjs-digital-signature-properties-reason = Разлог: { $reason }
|
||||
# Variables:
|
||||
# $dateObj (Date) - the signing time from the /Sig dict's /M entry.
|
||||
pdfjs-digital-signature-properties-timestamp = Временски жиг: { DATETIME($dateObj, dateStyle: "short", timeStyle: "medium") }
|
||||
# Variables:
|
||||
# $count (Number) - number of nested sub-signatures (one per earlier
|
||||
# incremental revision of the document).
|
||||
pdfjs-digital-signature-properties-sub-signatures =
|
||||
{ $count ->
|
||||
[one] Подпотпис ({ $count })
|
||||
[few] Подпотписа ({ $count })
|
||||
*[other] Подпотписа ({ $count })
|
||||
}
|
||||
|
||||
## Print
|
||||
|
||||
@ -740,6 +762,79 @@ pdfjs-views-manager-waiting-for-file = Отпремам датотеку…
|
||||
pdfjs-toggle-views-manager-button1 =
|
||||
.title = Управљај страницама
|
||||
|
||||
## Digital signature properties (signature verification panel)
|
||||
|
||||
pdfjs-digital-signature-properties-button =
|
||||
.title = Својства дигиталног потписа
|
||||
.aria-label = Својства дигиталног потписа
|
||||
pdfjs-digital-signature-properties-button-label = Својства дигиталног потписа
|
||||
|
||||
## Banner shown above the signature list summarising the overall
|
||||
## verification state of the document. Each variant is selected by the
|
||||
## viewer based on the worst per-signature status; one signature is
|
||||
## enough to lower the banner.
|
||||
##
|
||||
## Variables:
|
||||
## $count (Number) - number of signatures at the worst level.
|
||||
|
||||
pdfjs-digital-signature-properties-banner-verified = Документ је потписан исправним дигиталним потписом
|
||||
pdfjs-digital-signature-properties-banner-unknown =
|
||||
{ $count ->
|
||||
[one] Документ је потписан, али { $count } дигитални потпис није могао да се потврди
|
||||
[few] Документ је потписан, али { $count } дигитална потписа нису могли да се потврде
|
||||
*[other] Документ је потписан, али { $count } дигиталних потписа није могло да се потврде
|
||||
}
|
||||
pdfjs-digital-signature-properties-banner-untrusted =
|
||||
{ $count ->
|
||||
[one] Документ је потписан са { $count } сертификатом који није поуздан
|
||||
[few] Документ је потписан са { $count } сертификата који нису поуздани
|
||||
*[other] Документ је потписан са { $count } сертификата који нису поуздани
|
||||
}
|
||||
pdfjs-digital-signature-properties-banner-expired =
|
||||
{ $count ->
|
||||
[one] Документ је потписан са { $count } истеклим сертификатом
|
||||
[few] Документ је потписан са { $count } истекла сертификата
|
||||
*[other] Документ је потписан са { $count } истеклих сертификата
|
||||
}
|
||||
pdfjs-digital-signature-properties-banner-invalid =
|
||||
{ $count ->
|
||||
[one] Документ има { $count } неважећи дигитални потпис
|
||||
[few] Документ има { $count } неважећа дигитална потписа
|
||||
*[other] Документ има { $count } неважећих дигиталних потписа
|
||||
}
|
||||
pdfjs-digital-signature-properties-banner-revoked =
|
||||
{ $count ->
|
||||
[one] Документ је потписан са { $count } опозваним сертификатом
|
||||
[few] Документ је потписан са { $count } опозвана сертификата
|
||||
*[other] Документ је потписан са { $count } опозваних сертификата
|
||||
}
|
||||
|
||||
## Per-signature status row. Only three distinct strings are needed:
|
||||
## the signature crypto either verified (the cert chain may still be
|
||||
## untrusted/expired/revoked, but that's surfaced on the cert row
|
||||
## below), or it failed, or its sub-format isn't supported.
|
||||
|
||||
pdfjs-digital-signature-properties-status-verified = Статус: потврђен потпис
|
||||
pdfjs-digital-signature-properties-status-invalid = Статус: неважећи потпис
|
||||
pdfjs-digital-signature-properties-status-unknown = Статус: није могуће потврдити (неподржано)
|
||||
|
||||
## Per-signature certificate row. The variants with an issuer / date in
|
||||
## parentheses embed fully-localized context — no English fall-through.
|
||||
##
|
||||
## Variables:
|
||||
## $issuer (String) - issuer or subject common name from the cert.
|
||||
## $dateObj (Date) - notAfter date for the expired-with-date form.
|
||||
|
||||
pdfjs-digital-signature-properties-certificate-trusted = Сертификат: поуздан ({ $issuer })
|
||||
pdfjs-digital-signature-properties-certificate-unknown = Сертификат: недоступан
|
||||
pdfjs-digital-signature-properties-certificate-untrusted = Сертификат: неповерљив
|
||||
pdfjs-digital-signature-properties-certificate-untrusted-unknown-issuer = Сертификат: непознат издавач ({ $issuer })
|
||||
pdfjs-digital-signature-properties-certificate-untrusted-self-signed = Сертификат: самопотписан ({ $issuer })
|
||||
pdfjs-digital-signature-properties-certificate-untrusted-untrusted-issuer = Сертификат: неповерљив издавач ({ $issuer })
|
||||
pdfjs-digital-signature-properties-certificate-expired = Сертификат: истекао
|
||||
pdfjs-digital-signature-properties-certificate-expired-with-date = Сертификат: истекао ({ DATETIME($dateObj, dateStyle: "medium") })
|
||||
pdfjs-digital-signature-properties-certificate-revoked = Сертификат: опозван
|
||||
|
||||
## Main menu for adding/removing signatures
|
||||
|
||||
pdfjs-editor-delete-signature-button1 =
|
||||
|
||||
@ -153,6 +153,27 @@ pdfjs-document-properties-linearized = Snabb webbvisning:
|
||||
pdfjs-document-properties-linearized-yes = Ja
|
||||
pdfjs-document-properties-linearized-no = Nej
|
||||
pdfjs-document-properties-close-button = Stäng
|
||||
pdfjs-digital-signature-properties-view-certificate = Visa certifikat
|
||||
# Shown beneath an invalid signature card to explain why verification
|
||||
# failed. The text comes from NSS (e.g. "Signature integrity has been
|
||||
# compromised", "PKCS#7 signature could not be parsed") and is not
|
||||
# itself localized — it is the underlying error message produced by
|
||||
# the verification backend.
|
||||
# Variables:
|
||||
# $reason (String) - error message describing why the signature
|
||||
# could not be verified.
|
||||
pdfjs-digital-signature-properties-reason = Orsak: { $reason }
|
||||
# Variables:
|
||||
# $dateObj (Date) - the signing time from the /Sig dict's /M entry.
|
||||
pdfjs-digital-signature-properties-timestamp = Tidsstämpel: { DATETIME($dateObj, dateStyle: "short", timeStyle: "medium") }
|
||||
# Variables:
|
||||
# $count (Number) - number of nested sub-signatures (one per earlier
|
||||
# incremental revision of the document).
|
||||
pdfjs-digital-signature-properties-sub-signatures =
|
||||
{ $count ->
|
||||
[one] Undersignatur ({ $count })
|
||||
*[other] Undersignaturer ({ $count })
|
||||
}
|
||||
|
||||
## Print
|
||||
|
||||
@ -732,6 +753,74 @@ pdfjs-views-manager-waiting-for-file = Överför fil…
|
||||
pdfjs-toggle-views-manager-button1 =
|
||||
.title = Hantera sidor
|
||||
|
||||
## Digital signature properties (signature verification panel)
|
||||
|
||||
pdfjs-digital-signature-properties-button =
|
||||
.title = Egenskaper för digital signatur
|
||||
.aria-label = Egenskaper för digital signatur
|
||||
pdfjs-digital-signature-properties-button-label = Egenskaper för digital signatur
|
||||
|
||||
## Banner shown above the signature list summarising the overall
|
||||
## verification state of the document. Each variant is selected by the
|
||||
## viewer based on the worst per-signature status; one signature is
|
||||
## enough to lower the banner.
|
||||
##
|
||||
## Variables:
|
||||
## $count (Number) - number of signatures at the worst level.
|
||||
|
||||
pdfjs-digital-signature-properties-banner-verified = Dokumentet signerades med en giltig digital signatur
|
||||
pdfjs-digital-signature-properties-banner-unknown =
|
||||
{ $count ->
|
||||
[one] Dokument signerat men { $count } digital signatur kunde inte verifieras
|
||||
*[other] Dokument signerat men { $count } digitala signaturer kunde inte verifieras
|
||||
}
|
||||
pdfjs-digital-signature-properties-banner-untrusted =
|
||||
{ $count ->
|
||||
[one] Dokument signerat med { $count } certifikat som inte är tillförlitligt
|
||||
*[other] Dokument signerat med { $count } certifikat som inte är tillförlitliga
|
||||
}
|
||||
pdfjs-digital-signature-properties-banner-expired =
|
||||
{ $count ->
|
||||
[one] Dokument signerat med { $count } utgånget certifikat
|
||||
*[other] Dokument signerat med { $count } utgångna certifikat
|
||||
}
|
||||
pdfjs-digital-signature-properties-banner-invalid =
|
||||
{ $count ->
|
||||
[one] Dokumentet har { $count } ogiltig digital signatur
|
||||
*[other] Dokumentet har { $count } ogiltiga digitala signaturer
|
||||
}
|
||||
pdfjs-digital-signature-properties-banner-revoked =
|
||||
{ $count ->
|
||||
[one] Dokument signerat med { $count } återkallat certifikat
|
||||
*[other] Dokument signerat med { $count } återkallade certifikat
|
||||
}
|
||||
|
||||
## Per-signature status row. Only three distinct strings are needed:
|
||||
## the signature crypto either verified (the cert chain may still be
|
||||
## untrusted/expired/revoked, but that's surfaced on the cert row
|
||||
## below), or it failed, or its sub-format isn't supported.
|
||||
|
||||
pdfjs-digital-signature-properties-status-verified = Status: Signatur verifierad
|
||||
pdfjs-digital-signature-properties-status-invalid = Status: Ogiltig signatur
|
||||
pdfjs-digital-signature-properties-status-unknown = Status: Kan inte verifiera (stöds inte)
|
||||
|
||||
## Per-signature certificate row. The variants with an issuer / date in
|
||||
## parentheses embed fully-localized context — no English fall-through.
|
||||
##
|
||||
## Variables:
|
||||
## $issuer (String) - issuer or subject common name from the cert.
|
||||
## $dateObj (Date) - notAfter date for the expired-with-date form.
|
||||
|
||||
pdfjs-digital-signature-properties-certificate-trusted = Certifikat: Tillförlitligt ({ $issuer })
|
||||
pdfjs-digital-signature-properties-certificate-unknown = Certifikat: Ej tillgänglig
|
||||
pdfjs-digital-signature-properties-certificate-untrusted = Certifikat: Otillförlitligt
|
||||
pdfjs-digital-signature-properties-certificate-untrusted-unknown-issuer = Certifikat: Okänd utfärdare ({ $issuer })
|
||||
pdfjs-digital-signature-properties-certificate-untrusted-self-signed = Certifikat: Självsignerat ({ $issuer })
|
||||
pdfjs-digital-signature-properties-certificate-untrusted-untrusted-issuer = Certifikat: Otillförlitlig utfärdare ({ $issuer })
|
||||
pdfjs-digital-signature-properties-certificate-expired = Certifikat: Utgånget
|
||||
pdfjs-digital-signature-properties-certificate-expired-with-date = Certifikat: Utgånget ({ DATETIME($dateObj, dateStyle: "medium") })
|
||||
pdfjs-digital-signature-properties-certificate-revoked = Certifikat: Återkallat
|
||||
|
||||
## Main menu for adding/removing signatures
|
||||
|
||||
pdfjs-editor-delete-signature-button1 =
|
||||
|
||||
@ -153,6 +153,27 @@ pdfjs-document-properties-linearized = Hızlı web görünümü:
|
||||
pdfjs-document-properties-linearized-yes = Evet
|
||||
pdfjs-document-properties-linearized-no = Hayır
|
||||
pdfjs-document-properties-close-button = Kapat
|
||||
pdfjs-digital-signature-properties-view-certificate = Sertifikayı göster
|
||||
# Shown beneath an invalid signature card to explain why verification
|
||||
# failed. The text comes from NSS (e.g. "Signature integrity has been
|
||||
# compromised", "PKCS#7 signature could not be parsed") and is not
|
||||
# itself localized — it is the underlying error message produced by
|
||||
# the verification backend.
|
||||
# Variables:
|
||||
# $reason (String) - error message describing why the signature
|
||||
# could not be verified.
|
||||
pdfjs-digital-signature-properties-reason = Neden: { $reason }
|
||||
# Variables:
|
||||
# $dateObj (Date) - the signing time from the /Sig dict's /M entry.
|
||||
pdfjs-digital-signature-properties-timestamp = Zaman damgası: { DATETIME($dateObj, dateStyle: "short", timeStyle: "medium") }
|
||||
# Variables:
|
||||
# $count (Number) - number of nested sub-signatures (one per earlier
|
||||
# incremental revision of the document).
|
||||
pdfjs-digital-signature-properties-sub-signatures =
|
||||
{ $count ->
|
||||
[one] Alt imza ({ $count })
|
||||
*[other] Alt imzalar ({ $count })
|
||||
}
|
||||
|
||||
## Print
|
||||
|
||||
@ -496,11 +517,11 @@ pdfjs-editor-new-alt-text-added-button =
|
||||
pdfjs-editor-new-alt-text-added-button-label = Alt metin eklendi
|
||||
# This is a button that users can click to open the alt text editor and add alt text when it is not present.
|
||||
pdfjs-editor-new-alt-text-missing-button =
|
||||
.aria-label = Alternatif metin eksik
|
||||
.aria-label = Alt metin eksik
|
||||
pdfjs-editor-new-alt-text-missing-button-label = Alt metin eksik
|
||||
# This is a button that opens up the alt text modal where users should review the alt text that was automatically generated.
|
||||
pdfjs-editor-new-alt-text-to-review-button =
|
||||
.aria-label = Alternatif metni incele
|
||||
.aria-label = Alt metni incele
|
||||
pdfjs-editor-new-alt-text-to-review-button-label = Alt metni incele
|
||||
# "Created automatically" is a prefix that will be added to the beginning of any alt text that has been automatically generated. After the colon, the user will see/hear the actual alt text description. If the alt text has been edited by a human, this prefix will not appear.
|
||||
# Variables:
|
||||
@ -732,6 +753,74 @@ pdfjs-views-manager-waiting-for-file = Dosya yükleniyor…
|
||||
pdfjs-toggle-views-manager-button1 =
|
||||
.title = Sayfaları yönet
|
||||
|
||||
## Digital signature properties (signature verification panel)
|
||||
|
||||
pdfjs-digital-signature-properties-button =
|
||||
.title = Dijital imza özellikleri
|
||||
.aria-label = Dijital imza özellikleri
|
||||
pdfjs-digital-signature-properties-button-label = Dijital imza özellikleri
|
||||
|
||||
## Banner shown above the signature list summarising the overall
|
||||
## verification state of the document. Each variant is selected by the
|
||||
## viewer based on the worst per-signature status; one signature is
|
||||
## enough to lower the banner.
|
||||
##
|
||||
## Variables:
|
||||
## $count (Number) - number of signatures at the worst level.
|
||||
|
||||
pdfjs-digital-signature-properties-banner-verified = Belge geçerli bir dijital imza ile imzalanmıştır
|
||||
pdfjs-digital-signature-properties-banner-unknown =
|
||||
{ $count ->
|
||||
[one] Belge imzalanmış ancak { $count } dijital imza doğrulanamadı
|
||||
*[other] Belge imzalanmış ancak { $count } dijital imza doğrulanamadı
|
||||
}
|
||||
pdfjs-digital-signature-properties-banner-untrusted =
|
||||
{ $count ->
|
||||
[one] Belge, güvenilmeyen { $count } sertifikayla imzalanmış
|
||||
*[other] Belge, güvenilmeyen { $count } sertifikayla imzalanmış
|
||||
}
|
||||
pdfjs-digital-signature-properties-banner-expired =
|
||||
{ $count ->
|
||||
[one] Belge, süresi dolmuş { $count } sertifika ile imzalanmış
|
||||
*[other] Belge, süresi dolmuş { $count } sertifika ile imzalanmış
|
||||
}
|
||||
pdfjs-digital-signature-properties-banner-invalid =
|
||||
{ $count ->
|
||||
[one] Belge { $count } geçersiz dijital imza içeriyor
|
||||
*[other] Belge { $count } geçersiz dijital imza içeriyor
|
||||
}
|
||||
pdfjs-digital-signature-properties-banner-revoked =
|
||||
{ $count ->
|
||||
[one] Belge, iptal edilmiş { $count } sertifika ile imzalanmış
|
||||
*[other] Belge, iptal edilmiş { $count } sertifika ile imzalanmış
|
||||
}
|
||||
|
||||
## Per-signature status row. Only three distinct strings are needed:
|
||||
## the signature crypto either verified (the cert chain may still be
|
||||
## untrusted/expired/revoked, but that's surfaced on the cert row
|
||||
## below), or it failed, or its sub-format isn't supported.
|
||||
|
||||
pdfjs-digital-signature-properties-status-verified = Durum: İmza doğrulandı
|
||||
pdfjs-digital-signature-properties-status-invalid = Durum: İmza geçersiz
|
||||
pdfjs-digital-signature-properties-status-unknown = Durum: Doğrulanamadı (desteklenmiyor)
|
||||
|
||||
## Per-signature certificate row. The variants with an issuer / date in
|
||||
## parentheses embed fully-localized context — no English fall-through.
|
||||
##
|
||||
## Variables:
|
||||
## $issuer (String) - issuer or subject common name from the cert.
|
||||
## $dateObj (Date) - notAfter date for the expired-with-date form.
|
||||
|
||||
pdfjs-digital-signature-properties-certificate-trusted = Sertifika: Güvenilir ({ $issuer })
|
||||
pdfjs-digital-signature-properties-certificate-unknown = Sertifika: Kullanılamıyor
|
||||
pdfjs-digital-signature-properties-certificate-untrusted = Sertifika: Güvensiz
|
||||
pdfjs-digital-signature-properties-certificate-untrusted-unknown-issuer = Sertifika: Bilinmeyen yayıncı ({ $issuer })
|
||||
pdfjs-digital-signature-properties-certificate-untrusted-self-signed = Sertifika: Kendi kendine imzalanmış ({ $issuer })
|
||||
pdfjs-digital-signature-properties-certificate-untrusted-untrusted-issuer = Sertifika: Güvenilmeyen yayıncı ({ $issuer })
|
||||
pdfjs-digital-signature-properties-certificate-expired = Sertifika: Süresi dolmuş
|
||||
pdfjs-digital-signature-properties-certificate-expired-with-date = Sertifika: Süresi dolmuş ({ DATETIME($dateObj, dateStyle: "medium") })
|
||||
pdfjs-digital-signature-properties-certificate-revoked = Sertifika: İptal edilmiş
|
||||
|
||||
## Main menu for adding/removing signatures
|
||||
|
||||
pdfjs-editor-delete-signature-button1 =
|
||||
|
||||
@ -153,6 +153,23 @@ pdfjs-document-properties-linearized = Xem nhanh trên web:
|
||||
pdfjs-document-properties-linearized-yes = Có
|
||||
pdfjs-document-properties-linearized-no = Không
|
||||
pdfjs-document-properties-close-button = Ðóng
|
||||
pdfjs-digital-signature-properties-view-certificate = Xem chứng chỉ
|
||||
# Shown beneath an invalid signature card to explain why verification
|
||||
# failed. The text comes from NSS (e.g. "Signature integrity has been
|
||||
# compromised", "PKCS#7 signature could not be parsed") and is not
|
||||
# itself localized — it is the underlying error message produced by
|
||||
# the verification backend.
|
||||
# Variables:
|
||||
# $reason (String) - error message describing why the signature
|
||||
# could not be verified.
|
||||
pdfjs-digital-signature-properties-reason = Nguyên nhân: { $reason }
|
||||
# Variables:
|
||||
# $dateObj (Date) - the signing time from the /Sig dict's /M entry.
|
||||
pdfjs-digital-signature-properties-timestamp = Timestamp: { DATETIME($dateObj, dateStyle: "short", timeStyle: "medium") }
|
||||
# Variables:
|
||||
# $count (Number) - number of nested sub-signatures (one per earlier
|
||||
# incremental revision of the document).
|
||||
pdfjs-digital-signature-properties-sub-signatures = Chữ ký thành phần ({ $count })
|
||||
|
||||
## Print
|
||||
|
||||
@ -469,7 +486,7 @@ pdfjs-editor-new-alt-text-description = Mô tả ngắn gọn dành cho người
|
||||
pdfjs-editor-new-alt-text-disclaimer1 = Văn bản thay thế này được tạo tự động và có thể không chính xác.
|
||||
pdfjs-editor-new-alt-text-disclaimer-learn-more-url = Tìm hiểu thêm
|
||||
pdfjs-editor-new-alt-text-create-automatically-button-label = Tạo văn bản thay thế tự động
|
||||
pdfjs-editor-new-alt-text-not-now-button = Không phải bây giờ
|
||||
pdfjs-editor-new-alt-text-not-now-button = Để sau
|
||||
pdfjs-editor-new-alt-text-error-title = Không thể tạo tự động văn bản thay thế
|
||||
pdfjs-editor-new-alt-text-error-description = Vui lòng viết văn bản thay thế của riêng bạn hoặc thử lại sau.
|
||||
pdfjs-editor-new-alt-text-error-close-button = Đóng
|
||||
@ -700,6 +717,54 @@ pdfjs-views-manager-waiting-for-file = Đang tải lên tập tin…
|
||||
pdfjs-toggle-views-manager-button1 =
|
||||
.title = Quản lý trang
|
||||
|
||||
## Digital signature properties (signature verification panel)
|
||||
|
||||
pdfjs-digital-signature-properties-button =
|
||||
.title = Thuộc tính chữ ký điện tử
|
||||
.aria-label = Thuộc tính chữ ký điện tử
|
||||
pdfjs-digital-signature-properties-button-label = Thuộc tính chữ ký điện tử
|
||||
|
||||
## Banner shown above the signature list summarising the overall
|
||||
## verification state of the document. Each variant is selected by the
|
||||
## viewer based on the worst per-signature status; one signature is
|
||||
## enough to lower the banner.
|
||||
##
|
||||
## Variables:
|
||||
## $count (Number) - number of signatures at the worst level.
|
||||
|
||||
pdfjs-digital-signature-properties-banner-verified = Tài liệu đã được ký bằng chữ ký điện tử hợp lệ
|
||||
pdfjs-digital-signature-properties-banner-unknown = Tài liệu đã được ký nhưng không thể xác minh { $count } chữ ký điện tử
|
||||
pdfjs-digital-signature-properties-banner-untrusted = Tài liệu được ký bằng { $count } chứng chỉ không đáng tin cậy
|
||||
pdfjs-digital-signature-properties-banner-expired = Tài liệu được ký bằng { $count } chứng chỉ đã hết hạn
|
||||
pdfjs-digital-signature-properties-banner-invalid = Tài liệu có { $count } chữ ký điện tử không hợp lệ
|
||||
pdfjs-digital-signature-properties-banner-revoked = Tài liệu được ký bằng { $count } chứng chỉ đã bị thu hồi
|
||||
|
||||
## Per-signature status row. Only three distinct strings are needed:
|
||||
## the signature crypto either verified (the cert chain may still be
|
||||
## untrusted/expired/revoked, but that's surfaced on the cert row
|
||||
## below), or it failed, or its sub-format isn't supported.
|
||||
|
||||
pdfjs-digital-signature-properties-status-verified = Trạng thái: Chữ ký đã được xác minh
|
||||
pdfjs-digital-signature-properties-status-invalid = Trạng thái: Chữ ký không hợp lệ
|
||||
pdfjs-digital-signature-properties-status-unknown = Trạng thái: Không thể xác minh (không được hỗ trợ)
|
||||
|
||||
## Per-signature certificate row. The variants with an issuer / date in
|
||||
## parentheses embed fully-localized context — no English fall-through.
|
||||
##
|
||||
## Variables:
|
||||
## $issuer (String) - issuer or subject common name from the cert.
|
||||
## $dateObj (Date) - notAfter date for the expired-with-date form.
|
||||
|
||||
pdfjs-digital-signature-properties-certificate-trusted = Chứng chỉ: Đáng tin cậy ({ $issuer })
|
||||
pdfjs-digital-signature-properties-certificate-unknown = Chứng chỉ: Không khả dụng
|
||||
pdfjs-digital-signature-properties-certificate-untrusted = Chứng chỉ: Không đáng tin cậy
|
||||
pdfjs-digital-signature-properties-certificate-untrusted-unknown-issuer = Chứng chỉ: Người cấp không xác định ({ $issuer })
|
||||
pdfjs-digital-signature-properties-certificate-untrusted-self-signed = Chứng chỉ: Tự ký ({ $issuer })
|
||||
pdfjs-digital-signature-properties-certificate-untrusted-untrusted-issuer = Chứng chỉ: Người cấp không đáng tin cậy ({ $issuer })
|
||||
pdfjs-digital-signature-properties-certificate-expired = Chứng chỉ: Đã hết hạn
|
||||
pdfjs-digital-signature-properties-certificate-expired-with-date = Chứng chỉ: Đã hết hạn ({ DATETIME($dateObj, dateStyle: "medium") })
|
||||
pdfjs-digital-signature-properties-certificate-revoked = Chứng chỉ: Đã bị thu hồi
|
||||
|
||||
## Main menu for adding/removing signatures
|
||||
|
||||
pdfjs-editor-delete-signature-button1 =
|
||||
|
||||
@ -153,6 +153,19 @@ pdfjs-document-properties-linearized = 快速 Web 视图:
|
||||
pdfjs-document-properties-linearized-yes = 是
|
||||
pdfjs-document-properties-linearized-no = 否
|
||||
pdfjs-document-properties-close-button = 关闭
|
||||
pdfjs-digital-signature-properties-view-certificate = 查看证书
|
||||
# Shown beneath an invalid signature card to explain why verification
|
||||
# failed. The text comes from NSS (e.g. "Signature integrity has been
|
||||
# compromised", "PKCS#7 signature could not be parsed") and is not
|
||||
# itself localized — it is the underlying error message produced by
|
||||
# the verification backend.
|
||||
# Variables:
|
||||
# $reason (String) - error message describing why the signature
|
||||
# could not be verified.
|
||||
pdfjs-digital-signature-properties-reason = 原因:{ $reason }
|
||||
# Variables:
|
||||
# $dateObj (Date) - the signing time from the /Sig dict's /M entry.
|
||||
pdfjs-digital-signature-properties-timestamp = 时间戳:{ DATETIME($dateObj, dateStyle: "short", timeStyle: "medium") }
|
||||
|
||||
## Print
|
||||
|
||||
|
||||
@ -153,6 +153,23 @@ pdfjs-document-properties-linearized = 快速 Web 檢視:
|
||||
pdfjs-document-properties-linearized-yes = 是
|
||||
pdfjs-document-properties-linearized-no = 否
|
||||
pdfjs-document-properties-close-button = 關閉
|
||||
pdfjs-digital-signature-properties-view-certificate = 檢視憑證
|
||||
# Shown beneath an invalid signature card to explain why verification
|
||||
# failed. The text comes from NSS (e.g. "Signature integrity has been
|
||||
# compromised", "PKCS#7 signature could not be parsed") and is not
|
||||
# itself localized — it is the underlying error message produced by
|
||||
# the verification backend.
|
||||
# Variables:
|
||||
# $reason (String) - error message describing why the signature
|
||||
# could not be verified.
|
||||
pdfjs-digital-signature-properties-reason = 原因:{ $reason }
|
||||
# Variables:
|
||||
# $dateObj (Date) - the signing time from the /Sig dict's /M entry.
|
||||
pdfjs-digital-signature-properties-timestamp = 時間戳記:{ DATETIME($dateObj, dateStyle: "short", timeStyle: "medium") }
|
||||
# Variables:
|
||||
# $count (Number) - number of nested sub-signatures (one per earlier
|
||||
# incremental revision of the document).
|
||||
pdfjs-digital-signature-properties-sub-signatures = 子簽章({ $count })
|
||||
|
||||
## Print
|
||||
|
||||
@ -700,6 +717,54 @@ pdfjs-views-manager-waiting-for-file = 正在上傳檔案…
|
||||
pdfjs-toggle-views-manager-button1 =
|
||||
.title = 管理頁面
|
||||
|
||||
## Digital signature properties (signature verification panel)
|
||||
|
||||
pdfjs-digital-signature-properties-button =
|
||||
.title = 數位簽章屬性
|
||||
.aria-label = 數位簽章屬性
|
||||
pdfjs-digital-signature-properties-button-label = 數位簽章屬性
|
||||
|
||||
## Banner shown above the signature list summarising the overall
|
||||
## verification state of the document. Each variant is selected by the
|
||||
## viewer based on the worst per-signature status; one signature is
|
||||
## enough to lower the banner.
|
||||
##
|
||||
## Variables:
|
||||
## $count (Number) - number of signatures at the worst level.
|
||||
|
||||
pdfjs-digital-signature-properties-banner-verified = 文件使用有效的數位簽章進行簽署
|
||||
pdfjs-digital-signature-properties-banner-unknown = 文件已進行簽署,但無法驗證當中的 { $count } 筆數位簽章
|
||||
pdfjs-digital-signature-properties-banner-untrusted = 文件已進行簽署,但當中的 { $count } 筆數位簽章不受信任
|
||||
pdfjs-digital-signature-properties-banner-expired = 文件已進行簽署,但當中的 { $count } 筆數位簽章已過期
|
||||
pdfjs-digital-signature-properties-banner-invalid = 文件中有 { $count } 筆無效的數位簽章
|
||||
pdfjs-digital-signature-properties-banner-revoked = 文件已進行簽署,但當中的 { $count } 筆數位簽章已廢止
|
||||
|
||||
## Per-signature status row. Only three distinct strings are needed:
|
||||
## the signature crypto either verified (the cert chain may still be
|
||||
## untrusted/expired/revoked, but that's surfaced on the cert row
|
||||
## below), or it failed, or its sub-format isn't supported.
|
||||
|
||||
pdfjs-digital-signature-properties-status-verified = 狀態:已驗證簽章
|
||||
pdfjs-digital-signature-properties-status-invalid = 狀態:簽章無效
|
||||
pdfjs-digital-signature-properties-status-unknown = 狀態:無法驗證(不支援)
|
||||
|
||||
## Per-signature certificate row. The variants with an issuer / date in
|
||||
## parentheses embed fully-localized context — no English fall-through.
|
||||
##
|
||||
## Variables:
|
||||
## $issuer (String) - issuer or subject common name from the cert.
|
||||
## $dateObj (Date) - notAfter date for the expired-with-date form.
|
||||
|
||||
pdfjs-digital-signature-properties-certificate-trusted = 憑證:受信任({ $issuer })
|
||||
pdfjs-digital-signature-properties-certificate-unknown = 憑證:無法使用
|
||||
pdfjs-digital-signature-properties-certificate-untrusted = 憑證:未受信任
|
||||
pdfjs-digital-signature-properties-certificate-untrusted-unknown-issuer = 憑證:未知的簽發者({ $issuer })
|
||||
pdfjs-digital-signature-properties-certificate-untrusted-self-signed = 憑證:自行簽署({ $issuer })
|
||||
pdfjs-digital-signature-properties-certificate-untrusted-untrusted-issuer = 憑證:未受信任的簽發者({ $issuer })
|
||||
pdfjs-digital-signature-properties-certificate-expired = 憑證:已過期
|
||||
pdfjs-digital-signature-properties-certificate-expired-with-date = 憑證:已過期({ DATETIME($dateObj, dateStyle: "medium") })
|
||||
pdfjs-digital-signature-properties-certificate-revoked = 憑證:已廢止
|
||||
|
||||
## Main menu for adding/removing signatures
|
||||
|
||||
pdfjs-editor-delete-signature-button1 =
|
||||
|
||||
4478
package-lock.json
generated
4478
package-lock.json
generated
File diff suppressed because it is too large
Load Diff
54
package.json
54
package.json
@ -2,33 +2,33 @@
|
||||
"name": "pdf.js",
|
||||
"type": "module",
|
||||
"devDependencies": {
|
||||
"@babel/core": "^7.29.0",
|
||||
"@babel/preset-env": "^7.29.5",
|
||||
"@babel/runtime": "^7.29.2",
|
||||
"@eslint/json": "^1.2.0",
|
||||
"@babel/core": "^8.0.1",
|
||||
"@babel/preset-env": "^8.0.2",
|
||||
"@babel/runtime": "^8.0.0",
|
||||
"@eslint/json": "^2.0.1",
|
||||
"@fluent/bundle": "^0.19.1",
|
||||
"@fluent/dom": "^0.10.2",
|
||||
"@metalsmith/layouts": "^3.0.0",
|
||||
"@metalsmith/markdown": "^1.10.0",
|
||||
"@napi-rs/canvas": "^1.0.0",
|
||||
"@types/node": "^25.9.1",
|
||||
"autoprefixer": "^10.5.0",
|
||||
"@napi-rs/canvas": "^1.0.3",
|
||||
"@types/node": "^26.1.2",
|
||||
"autoprefixer": "^10.5.4",
|
||||
"babel-loader": "^10.1.1",
|
||||
"babel-plugin-add-header-comment": "^1.0.3",
|
||||
"babel-plugin-istanbul": "^8.0.0",
|
||||
"babel-plugin-istanbul": "^8.0.2",
|
||||
"babel-plugin-polyfill-corejs3": "^1.0.0",
|
||||
"cached-iterable": "^0.3.0",
|
||||
"caniuse-lite": "^1.0.30001793",
|
||||
"caniuse-lite": "^1.0.30001806",
|
||||
"core-js": "^3.49.0",
|
||||
"eslint": "^10.4.0",
|
||||
"eslint": "^10.8.0",
|
||||
"eslint-config-prettier": "^10.1.8",
|
||||
"eslint-plugin-import-x": "^4.16.2",
|
||||
"eslint-plugin-import-x": "^4.17.1",
|
||||
"eslint-plugin-jasmine": "^4.2.2",
|
||||
"eslint-plugin-no-unsanitized": "^4.1.5",
|
||||
"eslint-plugin-perfectionist": "^5.9.0",
|
||||
"eslint-plugin-prettier": "^5.5.5",
|
||||
"eslint-plugin-regexp": "^3.1.0",
|
||||
"eslint-plugin-unicorn": "^64.0.0",
|
||||
"globals": "^17.6.0",
|
||||
"eslint-plugin-perfectionist": "^5.10.0",
|
||||
"eslint-plugin-prettier": "^5.5.6",
|
||||
"eslint-plugin-regexp": "^3.1.1",
|
||||
"eslint-plugin-unicorn": "^72.0.0",
|
||||
"globals": "^17.8.0",
|
||||
"gulp": "^5.0.1",
|
||||
"gulp-cli": "^3.1.0",
|
||||
"gulp-postcss": "^10.0.0",
|
||||
@ -39,28 +39,28 @@
|
||||
"istanbul-lib-coverage": "^3.2.2",
|
||||
"istanbul-lib-report": "^3.0.1",
|
||||
"istanbul-reports": "^3.2.0",
|
||||
"jasmine": "^6.2.0",
|
||||
"jasmine": "^6.3.0",
|
||||
"jsdoc": "^4.0.5",
|
||||
"jstransformer-nunjucks": "^1.2.0",
|
||||
"kleur": "^4.1.5",
|
||||
"metalsmith": "^2.7.0",
|
||||
"metalsmith-html-relative": "^2.0.12",
|
||||
"metalsmith-html-relative": "^2.0.13",
|
||||
"ordered-read-streams": "^2.0.0",
|
||||
"pngjs": "^7.0.0",
|
||||
"postcss": "^8.5.15",
|
||||
"postcss-discard-comments": "^8.0.0",
|
||||
"postcss": "^8.5.25",
|
||||
"postcss-discard-comments": "^8.0.1",
|
||||
"postcss-values-parser": "^8.0.0",
|
||||
"prettier": "^3.8.3",
|
||||
"puppeteer": "^25.1.0",
|
||||
"stylelint": "^17.12.0",
|
||||
"prettier": "^3.9.6",
|
||||
"puppeteer": "^25.4.0",
|
||||
"stylelint": "^17.14.1",
|
||||
"stylelint-prettier": "^5.0.3",
|
||||
"svglint": "^4.2.1",
|
||||
"terser-webpack-plugin": "^5.6.0",
|
||||
"tsc-alias": "^1.8.17",
|
||||
"terser-webpack-plugin": "^5.6.1",
|
||||
"tsc-alias": "^1.9.1",
|
||||
"ttest": "^4.0.0",
|
||||
"typescript": "^6.0.3",
|
||||
"vinyl": "^3.0.1",
|
||||
"webpack": "^5.107.1",
|
||||
"webpack": "^5.109.2",
|
||||
"webpack-stream": "^7.0.0"
|
||||
},
|
||||
"repository": {
|
||||
|
||||
@ -1,5 +1,5 @@
|
||||
{
|
||||
"stableVersion": "5.7.284",
|
||||
"baseVersion": "e6e06cf6b5307fe39e0de69c6c884f816b0cb21b",
|
||||
"versionPrefix": "6.0."
|
||||
"stableVersion": "6.2.108",
|
||||
"baseVersion": "ce4ff55faaa83b39b0137dc458af6eea6f96235f",
|
||||
"versionPrefix": "6.3."
|
||||
}
|
||||
|
||||
File diff suppressed because it is too large
Load Diff
@ -25,11 +25,17 @@ class BaseStream {
|
||||
}
|
||||
}
|
||||
|
||||
/**
|
||||
* @returns {number}
|
||||
*/
|
||||
// eslint-disable-next-line getter-return
|
||||
get length() {
|
||||
unreachable("Abstract getter `length` accessed");
|
||||
}
|
||||
|
||||
/**
|
||||
* @returns {boolean}
|
||||
*/
|
||||
// eslint-disable-next-line getter-return
|
||||
get isEmpty() {
|
||||
unreachable("Abstract getter `isEmpty` accessed");
|
||||
@ -43,6 +49,10 @@ class BaseStream {
|
||||
unreachable("Abstract method `getByte` called");
|
||||
}
|
||||
|
||||
/**
|
||||
* @param {number | undefined} [length]
|
||||
* @returns {Uint8Array}
|
||||
*/
|
||||
getBytes(length) {
|
||||
unreachable("Abstract method `getBytes` called");
|
||||
}
|
||||
@ -135,6 +145,10 @@ class BaseStream {
|
||||
unreachable("Abstract method `makeSubStream` called");
|
||||
}
|
||||
|
||||
clone() {
|
||||
unreachable("Abstract method `clone` called");
|
||||
}
|
||||
|
||||
/**
|
||||
* @returns {Array | null}
|
||||
*/
|
||||
|
||||
@ -19,7 +19,7 @@ import {
|
||||
DocumentActionEventType,
|
||||
FormatError,
|
||||
info,
|
||||
objectSize,
|
||||
makeArr,
|
||||
PermissionFlag,
|
||||
shadow,
|
||||
stringToUTF8String,
|
||||
@ -52,9 +52,41 @@ import { clearGlobalCaches } from "./cleanup_helper.js";
|
||||
import { ColorSpaceUtils } from "./colorspace_utils.js";
|
||||
import { FileSpec } from "./file_spec.js";
|
||||
import { MetadataParser } from "./metadata_parser.js";
|
||||
import { soundStreamToWav } from "./sound.js";
|
||||
import { stringToPDFString } from "./string_utils.js";
|
||||
import { StructTreeRoot } from "./struct_tree.js";
|
||||
|
||||
/**
|
||||
* @import {XRef} from "./xref.js";
|
||||
*/
|
||||
|
||||
/**
|
||||
* @callback GetAttachmentContent
|
||||
* Callback used to lazily fetch attachment content.
|
||||
* @param {string} id
|
||||
* Unique attachment identifier.
|
||||
* @returns {CatalogAttachmentContent}
|
||||
* Result.
|
||||
*/
|
||||
|
||||
/**
|
||||
* @typedef {Uint8Array | null} CatalogAttachmentContent
|
||||
* Attachment value.
|
||||
*/
|
||||
|
||||
/**
|
||||
* @typedef CatalogAttachment
|
||||
* Attachment metadata.
|
||||
* @property {CatalogAttachmentContent | undefined} [content]
|
||||
* Value, when already available.
|
||||
* @property {string} description
|
||||
* Description.
|
||||
* @property {string} filename
|
||||
* Filename (just the basename) for display.
|
||||
* @property {string} rawFilename
|
||||
* File path.
|
||||
*/
|
||||
|
||||
const isRef = v => v instanceof Ref;
|
||||
|
||||
const isValidExplicitDest = _isValidExplicitDest.bind(
|
||||
@ -88,6 +120,12 @@ function fetchRemoteDest(action) {
|
||||
class Catalog {
|
||||
#actualNumPages = null;
|
||||
|
||||
#annotationAttachmentIdByRef = new RefSetCache();
|
||||
|
||||
#annotationAttachmentRefById = new Map();
|
||||
|
||||
#soundAttachmentIds = new Set();
|
||||
|
||||
#catDict = null;
|
||||
|
||||
builtInCMapCache = new Map();
|
||||
@ -127,6 +165,44 @@ class Catalog {
|
||||
return this.#catDict.clone();
|
||||
}
|
||||
|
||||
/**
|
||||
* Create an id for an attachment from a FileAttachment annotation.
|
||||
*
|
||||
* The id is registered here rather than parsed from a public string prefix in
|
||||
* `attachmentContent`, since catalog attachment names can be arbitrary PDF
|
||||
* strings and may otherwise collide with annotation-local ids.
|
||||
*
|
||||
* @param {Ref} ref
|
||||
* File-spec or embedded-file stream reference.
|
||||
* @param {boolean} [isSound]
|
||||
* When set, the referenced stream holds raw PDF sound samples that
|
||||
* `attachmentContent` wraps in a WAV container on fetch.
|
||||
* @returns {string}
|
||||
* Attachment id.
|
||||
*/
|
||||
getAttachmentIdForAnnotation(ref, isSound = false) {
|
||||
let id = this.#annotationAttachmentIdByRef.get(ref);
|
||||
if (!id) {
|
||||
const baseId = `attachmentRef:${ref.toString()}`;
|
||||
id = baseId;
|
||||
|
||||
let i = 1;
|
||||
while (
|
||||
this.#annotationAttachmentRefById.has(id) ||
|
||||
this.attachments?.has(id)
|
||||
) {
|
||||
id = `${baseId}-${i++}`;
|
||||
}
|
||||
|
||||
this.#annotationAttachmentIdByRef.put(ref, id);
|
||||
this.#annotationAttachmentRefById.set(id, ref);
|
||||
}
|
||||
if (isSound) {
|
||||
this.#soundAttachmentIds.add(id);
|
||||
}
|
||||
return id;
|
||||
}
|
||||
|
||||
get version() {
|
||||
const version = this.#catDict.get("Version");
|
||||
if (version instanceof Name) {
|
||||
@ -210,11 +286,11 @@ class Catalog {
|
||||
/* suppressEncryption = */ !this.xref.encrypt?.encryptMetadata
|
||||
);
|
||||
|
||||
if (stream instanceof BaseStream && stream.dict instanceof Dict) {
|
||||
const type = stream.dict.get("Type");
|
||||
const subtype = stream.dict.get("Subtype");
|
||||
|
||||
if (isName(type, "Metadata") && isName(subtype, "XML")) {
|
||||
if (
|
||||
stream instanceof BaseStream &&
|
||||
isDict(stream.dict, "Metadata") &&
|
||||
isName(stream.dict.get("Subtype"), "XML")
|
||||
) {
|
||||
// XXX: This should examine the charset the XML document defines,
|
||||
// however since there are currently no real means to decode arbitrary
|
||||
// charsets, let's just hope that the author of the PDF was reasonable
|
||||
@ -224,7 +300,6 @@ class Catalog {
|
||||
metadata = new MetadataParser(data).serializable;
|
||||
}
|
||||
}
|
||||
}
|
||||
} catch (ex) {
|
||||
if (ex instanceof MissingDataException) {
|
||||
throw ex;
|
||||
@ -286,15 +361,11 @@ class Catalog {
|
||||
}
|
||||
|
||||
#readStructTreeRoot() {
|
||||
const rawObj = this.#catDict.getRaw("StructTreeRoot");
|
||||
const obj = this.xref.fetchIfRef(rawObj);
|
||||
if (!(obj instanceof Dict)) {
|
||||
return null;
|
||||
}
|
||||
|
||||
const root = new StructTreeRoot(this.xref, obj, rawObj);
|
||||
root.init();
|
||||
return root;
|
||||
const rawObj = this.#catDict.getRaw("StructTreeRoot"),
|
||||
obj = this.xref.fetchIfRef(rawObj);
|
||||
return obj instanceof Dict
|
||||
? new StructTreeRoot(this.xref, obj, rawObj)
|
||||
: null;
|
||||
}
|
||||
|
||||
get toplevelPagesDict() {
|
||||
@ -369,6 +440,7 @@ class Catalog {
|
||||
|
||||
const outlineItem = {
|
||||
action: data.action,
|
||||
attachmentId: data.attachmentId,
|
||||
attachment: data.attachment,
|
||||
dest: data.dest,
|
||||
url: data.url,
|
||||
@ -691,15 +763,17 @@ class Catalog {
|
||||
}
|
||||
|
||||
get destinations() {
|
||||
const rawDests = this.#readDests(),
|
||||
dests = Object.create(null);
|
||||
for (const obj of rawDests) {
|
||||
const dests = new Map();
|
||||
|
||||
for (const obj of this.#readDests()) {
|
||||
if (obj instanceof NameTree) {
|
||||
for (const [key, value] of obj.getAll()) {
|
||||
const dest = fetchDest(value);
|
||||
if (dest) {
|
||||
dests[stringToPDFString(key, /* keepEscapeSequence = */ true)] =
|
||||
dest;
|
||||
dests.set(
|
||||
stringToPDFString(key, /* keepEscapeSequence = */ true),
|
||||
dest
|
||||
);
|
||||
}
|
||||
}
|
||||
} else if (obj instanceof Dict) {
|
||||
@ -707,8 +781,10 @@ class Catalog {
|
||||
const dest = fetchDest(value);
|
||||
if (dest) {
|
||||
// Always let the NameTree take precedence.
|
||||
dests[stringToPDFString(key, /* keepEscapeSequence = */ true)] ||=
|
||||
dest;
|
||||
dests.getOrInsert(
|
||||
stringToPDFString(key, /* keepEscapeSequence = */ true),
|
||||
dest
|
||||
);
|
||||
}
|
||||
}
|
||||
}
|
||||
@ -719,11 +795,10 @@ class Catalog {
|
||||
getDestination(id) {
|
||||
// Avoid extra lookup/parsing when all destinations are already available.
|
||||
if (Object.hasOwn(this, "destinations")) {
|
||||
return this.destinations[id] ?? null;
|
||||
return this.destinations.get(id) ?? null;
|
||||
}
|
||||
|
||||
const rawDests = this.#readDests();
|
||||
for (const obj of rawDests) {
|
||||
for (const obj of this.#readDests()) {
|
||||
if (obj instanceof NameTree || obj instanceof Dict) {
|
||||
const dest = fetchDest(obj.get(id));
|
||||
if (dest) {
|
||||
@ -735,13 +810,7 @@ class Catalog {
|
||||
// Always fallback to checking all destinations, in order to support:
|
||||
// - PDF documents with out-of-order NameTrees (fixes issue 10272).
|
||||
// - Destination keys that use PDFDocEncoding (fixes issue 19835).
|
||||
if (rawDests.length) {
|
||||
const dest = this.destinations[id];
|
||||
if (dest) {
|
||||
return dest;
|
||||
}
|
||||
}
|
||||
return null;
|
||||
return this.destinations.get(id) ?? null;
|
||||
}
|
||||
|
||||
#readDests() {
|
||||
@ -1007,18 +1076,19 @@ class Catalog {
|
||||
break;
|
||||
case "PrintPageRange":
|
||||
// The number of elements must be even.
|
||||
if (Array.isArray(value) && value.length % 2 === 0) {
|
||||
const isValid = value.every(
|
||||
if (
|
||||
Array.isArray(value) &&
|
||||
value.length % 2 === 0 &&
|
||||
value.every(
|
||||
(page, i, arr) =>
|
||||
Number.isInteger(page) &&
|
||||
page > 0 &&
|
||||
(i === 0 || page >= arr[i - 1]) &&
|
||||
page <= this.numPages
|
||||
);
|
||||
if (isValid) {
|
||||
)
|
||||
) {
|
||||
prefValue = value;
|
||||
}
|
||||
}
|
||||
break;
|
||||
case "NumCopies":
|
||||
if (Number.isInteger(value) && value > 0) {
|
||||
@ -1034,15 +1104,14 @@ class Catalog {
|
||||
warn(`Bad value, for key "${key}", in ViewerPreferences: ${value}.`);
|
||||
continue;
|
||||
}
|
||||
prefs ??= Object.create(null);
|
||||
prefs[key] = prefValue;
|
||||
(prefs ??= new Map()).set(key, prefValue);
|
||||
}
|
||||
return shadow(this, "viewerPreferences", prefs);
|
||||
}
|
||||
|
||||
get openAction() {
|
||||
const obj = this.#catDict.get("OpenAction");
|
||||
const openAction = Object.create(null);
|
||||
const openAction = new Map();
|
||||
|
||||
if (obj instanceof Dict) {
|
||||
// Convert the OpenAction dictionary into a format that works with
|
||||
@ -1054,36 +1123,92 @@ class Catalog {
|
||||
Catalog.parseDestDictionary({ destDict, resultObj });
|
||||
|
||||
if (Array.isArray(resultObj.dest)) {
|
||||
openAction.dest = resultObj.dest;
|
||||
openAction.set("dest", resultObj.dest);
|
||||
} else if (resultObj.action) {
|
||||
openAction.action = resultObj.action;
|
||||
openAction.set("action", resultObj.action);
|
||||
}
|
||||
} else if (isValidExplicitDest(obj)) {
|
||||
openAction.dest = obj;
|
||||
openAction.set("dest", obj);
|
||||
}
|
||||
return shadow(
|
||||
this,
|
||||
"openAction",
|
||||
objectSize(openAction) > 0 ? openAction : null
|
||||
);
|
||||
return shadow(this, "openAction", openAction.size ? openAction : null);
|
||||
}
|
||||
|
||||
/**
|
||||
* Get attachments.
|
||||
*
|
||||
* @returns {Map<string, CatalogAttachment> | null}
|
||||
* Attachments.
|
||||
*/
|
||||
get attachments() {
|
||||
const obj = this.#catDict.get("Names");
|
||||
/** @type {Map<string, CatalogAttachment> | null} */
|
||||
let attachments = null;
|
||||
|
||||
if (obj instanceof Dict && obj.has("EmbeddedFiles")) {
|
||||
const nameTree = new NameTree(obj.getRaw("EmbeddedFiles"), this.xref);
|
||||
for (const [key, value] of nameTree.getAll()) {
|
||||
const fs = new FileSpec(value);
|
||||
attachments ??= Object.create(null);
|
||||
attachments[stringToPDFString(key, /* keepEscapeSequence = */ true)] =
|
||||
fs.serializable;
|
||||
(attachments ??= new Map()).set(
|
||||
stringToPDFString(key, /* keepEscapeSequence = */ true),
|
||||
new FileSpec(value).serializable
|
||||
);
|
||||
}
|
||||
}
|
||||
return shadow(this, "attachments", attachments);
|
||||
}
|
||||
|
||||
/**
|
||||
* @param {string} id
|
||||
* Unique attachment identifier.
|
||||
* @returns {CatalogAttachmentContent | undefined}
|
||||
* Content, or `undefined` when no named attachment exists for the id.
|
||||
*/
|
||||
#attachmentContentByName(id) {
|
||||
const obj = this.#catDict.get("Names");
|
||||
if (obj instanceof Dict && obj.has("EmbeddedFiles")) {
|
||||
const nameTree = new NameTree(obj.getRaw("EmbeddedFiles"), this.xref);
|
||||
for (const [key, value] of nameTree.getAll()) {
|
||||
if (stringToPDFString(key, /* keepEscapeSequence = */ true) === id) {
|
||||
return FileSpec.readContent(value);
|
||||
}
|
||||
}
|
||||
}
|
||||
return undefined;
|
||||
}
|
||||
|
||||
/**
|
||||
* Get content for an attachment.
|
||||
*
|
||||
* @param {string} id
|
||||
* Unique attachment identifier (required).
|
||||
* @returns {CatalogAttachmentContent}
|
||||
* Content.
|
||||
*/
|
||||
attachmentContent(id) {
|
||||
const namedContent = this.#attachmentContentByName(id);
|
||||
if (namedContent !== undefined) {
|
||||
return namedContent;
|
||||
}
|
||||
|
||||
// Annotation-local attachments register the reference of their embedded
|
||||
// content in the catalog, so it's re-fetched from the xref on demand
|
||||
// instead of being cached (which would then need to survive `cleanup`).
|
||||
// The reference points either at the file-spec dictionary or, for an inline
|
||||
// file-spec, straight at the embedded-file stream.
|
||||
const ref = this.#annotationAttachmentRefById.get(id);
|
||||
if (ref) {
|
||||
const target = this.xref.fetch(ref);
|
||||
if (target instanceof BaseStream) {
|
||||
const content = FileSpec.readStreamContent(target);
|
||||
if (this.#soundAttachmentIds.has(id)) {
|
||||
return soundStreamToWav(target, content) ?? content;
|
||||
}
|
||||
return content;
|
||||
}
|
||||
return target instanceof Dict ? FileSpec.readContent(target) : null;
|
||||
}
|
||||
return null;
|
||||
}
|
||||
|
||||
get rawEmbeddedFiles() {
|
||||
const obj = this.#catDict.get("Names");
|
||||
if (!(obj instanceof Dict) || !obj.has("EmbeddedFiles")) {
|
||||
@ -1117,13 +1242,9 @@ class Catalog {
|
||||
let javaScript = null;
|
||||
|
||||
function appendIfJavaScriptDict(name, jsDict) {
|
||||
if (!(jsDict instanceof Dict)) {
|
||||
if (!(jsDict instanceof Dict) || !isName(jsDict.get("S"), "JavaScript")) {
|
||||
return;
|
||||
}
|
||||
if (!isName(jsDict.get("S"), "JavaScript")) {
|
||||
return;
|
||||
}
|
||||
|
||||
let js = jsDict.get("JS");
|
||||
if (js instanceof BaseStream) {
|
||||
js = js.getString();
|
||||
@ -1136,7 +1257,7 @@ class Catalog {
|
||||
);
|
||||
// Skip empty entries, similar to the `_collectJS` function.
|
||||
if (js) {
|
||||
(javaScript ||= new Map()).set(name, js);
|
||||
(javaScript ??= new Map()).set(name, js);
|
||||
}
|
||||
}
|
||||
|
||||
@ -1167,14 +1288,10 @@ class Catalog {
|
||||
);
|
||||
|
||||
if (javaScript) {
|
||||
actions ||= Object.create(null);
|
||||
actions ??= new Map();
|
||||
|
||||
for (const [key, val] of javaScript) {
|
||||
if (key in actions) {
|
||||
actions[key].push(val);
|
||||
} else {
|
||||
actions[key] = [val];
|
||||
}
|
||||
actions.getOrInsertComputed(key, makeArr).push(val);
|
||||
}
|
||||
}
|
||||
return shadow(this, "jsActions", actions);
|
||||
@ -1383,6 +1500,22 @@ class Catalog {
|
||||
}
|
||||
}
|
||||
if (!Array.isArray(kids)) {
|
||||
// Prevent errors in corrupt PDF documents that violate the
|
||||
// specification by *inlining* Page dicts (fixes issue21436.pdf).
|
||||
let type = currentNode.getRaw("Type");
|
||||
if (type instanceof Ref) {
|
||||
try {
|
||||
type = await xref.fetchAsync(type);
|
||||
} catch (ex) {
|
||||
addPageError(ex);
|
||||
break;
|
||||
}
|
||||
}
|
||||
if (isName(type, "Page") || !currentNode.has("Kids")) {
|
||||
addPageDict(currentNode, null);
|
||||
break;
|
||||
}
|
||||
|
||||
addPageError(
|
||||
new FormatError("Page dictionary kids object is not an array.")
|
||||
);
|
||||
@ -1458,6 +1591,9 @@ class Catalog {
|
||||
const xref = this.xref;
|
||||
let total = 0,
|
||||
ref = pageRef;
|
||||
// Prevent circular references in the /Pages tree.
|
||||
const visited = new RefSet();
|
||||
visited.put(pageRef);
|
||||
|
||||
while (true) {
|
||||
const node = await xref.fetchAsync(ref);
|
||||
@ -1477,6 +1613,12 @@ class Catalog {
|
||||
throw new FormatError("Node must be a dictionary.");
|
||||
}
|
||||
const parentRef = node.getRaw("Parent");
|
||||
if (parentRef instanceof Ref) {
|
||||
if (visited.has(parentRef)) {
|
||||
throw new FormatError("Pages tree contains circular reference.");
|
||||
}
|
||||
visited.put(parentRef);
|
||||
}
|
||||
|
||||
const parent = await node.getAsync("Parent");
|
||||
if (!parent) {
|
||||
@ -1556,8 +1698,8 @@ class Catalog {
|
||||
* properties will be placed.
|
||||
* @property {string} [docBaseUrl] - The document base URL that is used when
|
||||
* attempting to recover valid absolute URLs from relative ones.
|
||||
* @property {Object} [docAttachments] - The document attachments (may not
|
||||
* exist in most PDF documents).
|
||||
* @property {Record<string, CatalogAttachment> | null} [docAttachments] - The
|
||||
* document attachments (may not exist in most PDF documents).
|
||||
*/
|
||||
|
||||
/**
|
||||
@ -1589,9 +1731,19 @@ class Catalog {
|
||||
// reached (e.g. integer MCIDs or MCR/OBJR dicts without further K).
|
||||
if (!pageRef) {
|
||||
const queue = [seDict];
|
||||
// Prevent circular references in the structure tree.
|
||||
const visited = new RefSet();
|
||||
visited.put(seRef);
|
||||
while (queue.length > 0 && !pageRef) {
|
||||
const node = queue.shift();
|
||||
const kids = node.get("K");
|
||||
let kids = node.getRaw("K");
|
||||
if (kids instanceof Ref) {
|
||||
if (visited.has(kids)) {
|
||||
continue;
|
||||
}
|
||||
visited.put(kids);
|
||||
kids = xref.fetch(kids);
|
||||
}
|
||||
let kidsArr;
|
||||
if (Array.isArray(kids)) {
|
||||
kidsArr = kids;
|
||||
@ -1601,6 +1753,12 @@ class Catalog {
|
||||
continue;
|
||||
}
|
||||
for (const kid of kidsArr) {
|
||||
if (kid instanceof Ref) {
|
||||
if (visited.has(kid)) {
|
||||
continue;
|
||||
}
|
||||
visited.put(kid);
|
||||
}
|
||||
const kidObj = xref.fetchIfRef(kid);
|
||||
if (!(kidObj instanceof Dict)) {
|
||||
continue; // integer MCID – leaf node, no Pg here
|
||||
@ -1740,8 +1898,7 @@ class Catalog {
|
||||
case "GoToR":
|
||||
const urlDict = action.get("F");
|
||||
if (urlDict instanceof Dict) {
|
||||
const fs = new FileSpec(urlDict, /* skipContent = */ true);
|
||||
({ rawFilename: url } = fs.serializable);
|
||||
url = new FileSpec(urlDict).filename;
|
||||
} else if (typeof urlDict === "string") {
|
||||
url = urlDict;
|
||||
} else {
|
||||
@ -1766,22 +1923,21 @@ class Catalog {
|
||||
|
||||
case "GoToE":
|
||||
const target = action.get("T");
|
||||
let attachment;
|
||||
/** @type {string | null} */
|
||||
let id = null;
|
||||
|
||||
if (docAttachments && target instanceof Dict) {
|
||||
if (target instanceof Dict) {
|
||||
const relationship = target.get("R");
|
||||
const name = target.get("N");
|
||||
|
||||
if (isName(relationship, "C") && typeof name === "string") {
|
||||
attachment =
|
||||
docAttachments[
|
||||
stringToPDFString(name, /* keepEscapeSequence = */ true)
|
||||
];
|
||||
id = stringToPDFString(name, /* keepEscapeSequence = */ true);
|
||||
}
|
||||
}
|
||||
|
||||
if (attachment) {
|
||||
resultObj.attachment = attachment;
|
||||
if (docAttachments && id) {
|
||||
resultObj.attachmentId = id;
|
||||
resultObj.attachment = docAttachments.get(id);
|
||||
|
||||
// NOTE: the destination is relative to the *attachment*.
|
||||
const attachmentDest = fetchRemoteDest(action);
|
||||
|
||||
@ -58,11 +58,9 @@ class CCITTFaxStream extends DecodeStream {
|
||||
if (this.eof) {
|
||||
return this.buffer;
|
||||
}
|
||||
if (!bytes) {
|
||||
bytes = this.stream.isAsync
|
||||
bytes ??= this.stream.isAsync
|
||||
? (await this.stream.asyncGetBytes()) || this.bytes
|
||||
: this.bytes;
|
||||
}
|
||||
|
||||
this.buffer = await JBig2CCITTFaxImage.instance.decode(
|
||||
bytes,
|
||||
|
||||
@ -775,14 +775,12 @@ class CFFParser {
|
||||
} else if (localSubrIndex) {
|
||||
localSubrToUse = localSubrIndex;
|
||||
}
|
||||
if (valid) {
|
||||
valid = this.parseCharString(
|
||||
valid &&= this.parseCharString(
|
||||
state,
|
||||
charstring,
|
||||
localSubrToUse,
|
||||
globalSubrIndex
|
||||
);
|
||||
}
|
||||
if (state.width !== null) {
|
||||
const nominalWidth = privateDictToUse.getByName("nominalWidthX");
|
||||
widths[i] = nominalWidth + state.width;
|
||||
@ -894,9 +892,22 @@ class CFFParser {
|
||||
}
|
||||
}
|
||||
if (maxZoneHeight > 0) {
|
||||
// The lower bound of AFDKO's valid window is `0.5 / maxZoneHeight`.
|
||||
// When that bound is itself above the default BlueScale the font simply
|
||||
// has small zones (e.g. Eurostile LT Std, or the SofiaPro fonts shipped
|
||||
// with a near-default 0.037): even the default 0.039625 would be
|
||||
// flagged as out-of-range, so this is the rendered intent and forcing
|
||||
// BlueScale up only misaligns/collapses overshooting glyphs (notably
|
||||
// with macOS's Core Text rasterizer). Only apply the lower clamp when
|
||||
// its target does not exceed the default.
|
||||
// Round the bound in order to avoid too long operand (issue 21466).
|
||||
const PRECISION = 1e5;
|
||||
const lowerBound = 0.5 / maxZoneHeight;
|
||||
const minBlueScale =
|
||||
blueScale < DEFAULT_BLUE_SCALE ? 0.5 / maxZoneHeight : -Infinity;
|
||||
const maxBlueScale = 1 / maxZoneHeight;
|
||||
lowerBound <= DEFAULT_BLUE_SCALE
|
||||
? Math.ceil(lowerBound * PRECISION) / PRECISION
|
||||
: -Infinity;
|
||||
const maxBlueScale = Math.floor(PRECISION / maxZoneHeight) / PRECISION;
|
||||
const clamped = MathClamp(blueScale, minBlueScale, maxBlueScale);
|
||||
if (clamped !== blueScale) {
|
||||
privateDict.setByName("BlueScale", clamped);
|
||||
@ -1417,10 +1428,9 @@ class CFFFDSelect {
|
||||
}
|
||||
|
||||
getFDIndex(glyphIndex) {
|
||||
if (glyphIndex < 0 || glyphIndex >= this.fdSelect.length) {
|
||||
return -1;
|
||||
}
|
||||
return this.fdSelect[glyphIndex];
|
||||
return glyphIndex < 0 || glyphIndex >= this.fdSelect.length
|
||||
? -1
|
||||
: this.fdSelect[glyphIndex];
|
||||
}
|
||||
}
|
||||
|
||||
|
||||
@ -182,28 +182,14 @@ class ChunkedStream extends Stream {
|
||||
}
|
||||
|
||||
getBytes(length) {
|
||||
const bytes = this.bytes;
|
||||
const pos = this.pos;
|
||||
const strEnd = this.end;
|
||||
const endPos = !length ? this.end : Math.min(pos + length, this.end);
|
||||
|
||||
if (!length) {
|
||||
if (strEnd > this.progressiveDataLength) {
|
||||
this.ensureRange(pos, strEnd);
|
||||
if (endPos > this.progressiveDataLength) {
|
||||
this.ensureRange(pos, endPos);
|
||||
}
|
||||
this.pos = strEnd;
|
||||
return bytes.subarray(pos, strEnd);
|
||||
}
|
||||
|
||||
let end = pos + length;
|
||||
if (end > strEnd) {
|
||||
end = strEnd;
|
||||
}
|
||||
if (end > this.progressiveDataLength) {
|
||||
this.ensureRange(pos, end);
|
||||
}
|
||||
|
||||
this.pos = end;
|
||||
return bytes.subarray(pos, end);
|
||||
this.pos = endPos;
|
||||
return this.bytes.subarray(pos, endPos);
|
||||
}
|
||||
|
||||
getByteRange(begin, end) {
|
||||
@ -253,10 +239,10 @@ class ChunkedStream extends Stream {
|
||||
};
|
||||
Object.defineProperty(ChunkedStreamSubstream.prototype, "isDataLoaded", {
|
||||
get() {
|
||||
if (this.numChunksLoaded === this.numChunks) {
|
||||
return true;
|
||||
}
|
||||
return this.getMissingChunks().length === 0;
|
||||
return (
|
||||
this.numChunksLoaded === this.numChunks ||
|
||||
this.getMissingChunks().length === 0
|
||||
);
|
||||
},
|
||||
configurable: true,
|
||||
});
|
||||
@ -274,13 +260,13 @@ class ChunkedStream extends Stream {
|
||||
}
|
||||
|
||||
class ChunkedStreamManager {
|
||||
aborted = false;
|
||||
#aborted = false;
|
||||
|
||||
currRequestId = 0;
|
||||
|
||||
_chunksNeededByRequest = new Map();
|
||||
|
||||
_loadedStreamCapability = Promise.withResolvers();
|
||||
#loadedStreamCapability = Promise.withResolvers();
|
||||
|
||||
_promisesByRequest = new Map();
|
||||
|
||||
@ -302,7 +288,7 @@ class ChunkedStreamManager {
|
||||
while (true) {
|
||||
const { value, done } = await rangeReader.read();
|
||||
|
||||
if (this.aborted) {
|
||||
if (this.#aborted) {
|
||||
chunks = null;
|
||||
return; // Ignoring any data after abort.
|
||||
}
|
||||
@ -337,7 +323,7 @@ class ChunkedStreamManager {
|
||||
const missingChunks = this.stream.getMissingChunks();
|
||||
this._requestChunks(missingChunks);
|
||||
}
|
||||
return this._loadedStreamCapability.promise;
|
||||
return this.#loadedStreamCapability.promise;
|
||||
}
|
||||
|
||||
_requestChunks(chunks) {
|
||||
@ -360,13 +346,13 @@ class ChunkedStreamManager {
|
||||
|
||||
const chunksToRequest = [];
|
||||
for (const chunk of chunksNeeded) {
|
||||
let requestIds = this._requestsByChunk.get(chunk);
|
||||
if (!requestIds) {
|
||||
requestIds = [];
|
||||
this._requestsByChunk.set(chunk, requestIds);
|
||||
|
||||
const requestIds = this._requestsByChunk.getOrInsertComputed(
|
||||
chunk,
|
||||
() => {
|
||||
chunksToRequest.push(chunk);
|
||||
return [];
|
||||
}
|
||||
);
|
||||
requestIds.push(requestId);
|
||||
}
|
||||
|
||||
@ -383,7 +369,7 @@ class ChunkedStreamManager {
|
||||
}
|
||||
|
||||
return capability.promise.catch(reason => {
|
||||
if (this.aborted) {
|
||||
if (this.#aborted) {
|
||||
return; // Ignoring any pending requests after abort.
|
||||
}
|
||||
throw reason;
|
||||
@ -473,7 +459,7 @@ class ChunkedStreamManager {
|
||||
}
|
||||
|
||||
if (stream.isDataLoaded) {
|
||||
this._loadedStreamCapability.resolve(stream);
|
||||
this.#loadedStreamCapability.resolve(stream);
|
||||
}
|
||||
|
||||
const loadedRequests = [];
|
||||
@ -534,10 +520,6 @@ class ChunkedStreamManager {
|
||||
});
|
||||
}
|
||||
|
||||
onError(err) {
|
||||
this._loadedStreamCapability.reject(err);
|
||||
}
|
||||
|
||||
getBeginChunk(begin) {
|
||||
return Math.floor(begin / this.chunkSize);
|
||||
}
|
||||
@ -547,12 +529,13 @@ class ChunkedStreamManager {
|
||||
}
|
||||
|
||||
abort(reason) {
|
||||
this.aborted = true;
|
||||
this.#aborted = true;
|
||||
this.pdfStream?.cancelAllRequests(reason);
|
||||
|
||||
for (const capability of this._promisesByRequest.values()) {
|
||||
capability.reject(reason);
|
||||
}
|
||||
this.#loadedStreamCapability.reject(reason);
|
||||
}
|
||||
}
|
||||
|
||||
|
||||
@ -183,6 +183,21 @@ class ColorSpace {
|
||||
unreachable("Should not call ColorSpace.getRgbBuffer");
|
||||
}
|
||||
|
||||
/**
|
||||
* Converts `count` unscaled colors to RGB, starting at `destOffset`.
|
||||
* Components use the native color-space ranges expected by `getRgbItem`,
|
||||
* and each output has a `3 + alpha01` byte stride.
|
||||
* Subclasses may override this to batch expensive conversions.
|
||||
*/
|
||||
getRgbItems(src, count, dest, destOffset, alpha01) {
|
||||
const { numComps } = this;
|
||||
|
||||
for (let i = 0, srcOffset = 0; i < count; i++, srcOffset += numComps) {
|
||||
this.getRgbItem(src, srcOffset, dest, destOffset);
|
||||
destOffset += 3 + alpha01;
|
||||
}
|
||||
}
|
||||
|
||||
/**
|
||||
* Determines the number of bytes required to store the result of the
|
||||
* conversion done by the getRgbBuffer method. As in getRgbBuffer,
|
||||
@ -379,6 +394,20 @@ class AlternateCS extends ColorSpace {
|
||||
this.base.getRgbItem(tmpBuf, 0, dest, destOffset);
|
||||
}
|
||||
|
||||
getRgbItems(src, count, dest, destOffset, alpha01) {
|
||||
const { base, numComps, tintFn } = this;
|
||||
const baseNumComps = base.numComps;
|
||||
// Tint first so the base color space can convert the batch at once.
|
||||
const tinted = new Float32Array(count * baseNumComps);
|
||||
|
||||
for (let i = 0, srcOffset = 0, tintedOffset = 0; i < count; i++) {
|
||||
tintFn(src, srcOffset, tinted, tintedOffset);
|
||||
srcOffset += numComps;
|
||||
tintedOffset += baseNumComps;
|
||||
}
|
||||
base.getRgbItems(tinted, count, dest, destOffset, alpha01);
|
||||
}
|
||||
|
||||
getRgbBuffer(src, srcOffset, count, dest, destOffset, bits, alpha01) {
|
||||
if (typeof PDFJSDev === "undefined" || PDFJSDev.test("TESTING")) {
|
||||
assert(
|
||||
@ -446,24 +475,36 @@ class PatternCS extends ColorSpace {
|
||||
* The default color is `new Uint8Array([0])`.
|
||||
*/
|
||||
class IndexedCS extends ColorSpace {
|
||||
#rgbLookup;
|
||||
|
||||
constructor(base, highVal, lookup) {
|
||||
super("Indexed", 1);
|
||||
this.base = base;
|
||||
this.highVal = highVal;
|
||||
|
||||
const length = base.numComps * (highVal + 1);
|
||||
this.lookup = new Uint8Array(length);
|
||||
const count = highVal + 1;
|
||||
const length = base.numComps * count;
|
||||
const palette = new Uint8Array(length);
|
||||
|
||||
if (lookup instanceof BaseStream) {
|
||||
const bytes = lookup.getBytes(length);
|
||||
this.lookup.set(bytes);
|
||||
palette.set(lookup.getBytes(length));
|
||||
} else if (typeof lookup === "string") {
|
||||
for (let i = 0; i < length; ++i) {
|
||||
this.lookup[i] = lookup.charCodeAt(i) & 0xff;
|
||||
palette[i] = lookup.charCodeAt(i);
|
||||
}
|
||||
} else {
|
||||
throw new FormatError(`IndexedCS - unrecognized lookup table: ${lookup}`);
|
||||
}
|
||||
|
||||
this.#rgbLookup = new Uint8ClampedArray(count * 3);
|
||||
base.getRgbBuffer(
|
||||
palette,
|
||||
0,
|
||||
count,
|
||||
this.#rgbLookup,
|
||||
0,
|
||||
/* bits = */ 8,
|
||||
/* alpha01 = */ 0
|
||||
);
|
||||
}
|
||||
|
||||
getRgbItem(src, srcOffset, dest, destOffset) {
|
||||
@ -473,10 +514,12 @@ class IndexedCS extends ColorSpace {
|
||||
'IndexedCS.getRgbItem: Unsupported "dest" type.'
|
||||
);
|
||||
}
|
||||
const { base, highVal, lookup } = this;
|
||||
const start =
|
||||
MathClamp(Math.round(src[srcOffset]), 0, highVal) * base.numComps;
|
||||
base.getRgbBuffer(lookup, start, 1, dest, destOffset, 8, 0);
|
||||
const rgbLookup = this.#rgbLookup;
|
||||
const pos = MathClamp(Math.round(src[srcOffset]), 0, this.highVal) * 3;
|
||||
|
||||
dest[destOffset] = rgbLookup[pos];
|
||||
dest[destOffset + 1] = rgbLookup[pos + 1];
|
||||
dest[destOffset + 2] = rgbLookup[pos + 2];
|
||||
}
|
||||
|
||||
getRgbBuffer(src, srcOffset, count, dest, destOffset, bits, alpha01) {
|
||||
@ -486,20 +529,21 @@ class IndexedCS extends ColorSpace {
|
||||
'IndexedCS.getRgbBuffer: Unsupported "dest" type.'
|
||||
);
|
||||
}
|
||||
const { base, highVal, lookup } = this;
|
||||
const { numComps } = base;
|
||||
const outputDelta = base.getOutputLength(numComps, alpha01);
|
||||
const { highVal } = this;
|
||||
const rgbLookup = this.#rgbLookup;
|
||||
|
||||
for (let i = 0; i < count; ++i) {
|
||||
const lookupPos =
|
||||
MathClamp(Math.round(src[srcOffset++]), 0, highVal) * numComps;
|
||||
base.getRgbBuffer(lookup, lookupPos, 1, dest, destOffset, 8, alpha01);
|
||||
destOffset += outputDelta;
|
||||
const pos = MathClamp(Math.round(src[srcOffset++]), 0, highVal) * 3;
|
||||
|
||||
dest[destOffset++] = rgbLookup[pos];
|
||||
dest[destOffset++] = rgbLookup[pos + 1];
|
||||
dest[destOffset++] = rgbLookup[pos + 2];
|
||||
destOffset += alpha01;
|
||||
}
|
||||
}
|
||||
|
||||
getOutputLength(inputLength, alpha01) {
|
||||
return this.base.getOutputLength(inputLength * this.base.numComps, alpha01);
|
||||
return inputLength * (3 + alpha01);
|
||||
}
|
||||
|
||||
isDefaultDecode(decode, bpc) {
|
||||
|
||||
@ -243,9 +243,7 @@ class ColorSpaceUtils {
|
||||
break;
|
||||
case "Pattern":
|
||||
baseCS = cs[1] || null;
|
||||
if (baseCS) {
|
||||
baseCS = this.#subParse(baseCS, options);
|
||||
}
|
||||
baseCS &&= this.#subParse(baseCS, options);
|
||||
return new PatternCS(baseCS);
|
||||
case "I":
|
||||
case "Indexed":
|
||||
|
||||
@ -18,12 +18,12 @@ import {
|
||||
assert,
|
||||
BaseException,
|
||||
makeArr,
|
||||
objectSize,
|
||||
Util,
|
||||
warn,
|
||||
} from "../shared/util.js";
|
||||
import { Dict, isName, isRefsEqual, Name, Ref, RefSet } from "./primitives.js";
|
||||
import { BaseStream } from "./base_stream.js";
|
||||
import { CONTROL_CHAR_REGEXP } from "../shared/css_utils.js";
|
||||
import { stringToPDFString } from "./string_utils.js";
|
||||
|
||||
const PDF_VERSION_REGEXP = /^[1-9]\.\d$/;
|
||||
@ -342,7 +342,8 @@ function lookupNormalRect(arr, fallback) {
|
||||
* each part of the path.
|
||||
*/
|
||||
function parseXFAPath(path) {
|
||||
const positionPattern = /(.+)\[(\d+)\]$/;
|
||||
// Anchoring prevents retrying the match at every character.
|
||||
const positionPattern = /^(.+)\[(\d+)\]$/;
|
||||
return path.split(".").map(component => {
|
||||
const m = component.match(positionPattern);
|
||||
if (m) {
|
||||
@ -376,7 +377,7 @@ function escapePDFName(str) {
|
||||
if (start < i) {
|
||||
buffer.push(str.substring(start, i));
|
||||
}
|
||||
buffer.push(`#${char.toString(16)}`);
|
||||
buffer.push(`#${char.toString(16).padStart(2, "0")}`);
|
||||
start = i + 1;
|
||||
}
|
||||
}
|
||||
@ -386,7 +387,7 @@ function escapePDFName(str) {
|
||||
}
|
||||
|
||||
if (start < str.length) {
|
||||
buffer.push(str.substring(start, str.length));
|
||||
buffer.push(str.substring(start));
|
||||
}
|
||||
|
||||
return buffer.join("");
|
||||
@ -450,7 +451,7 @@ function _collectJS(entry, xref, list, parents) {
|
||||
}
|
||||
|
||||
function collectActions(xref, dict, eventType) {
|
||||
const actions = Object.create(null);
|
||||
const actions = new Map();
|
||||
const additionalActionsDicts = getInheritableProperty({
|
||||
dict,
|
||||
key: "AA",
|
||||
@ -476,7 +477,7 @@ function collectActions(xref, dict, eventType) {
|
||||
const list = [];
|
||||
_collectJS(rawActionDict, xref, list, parents);
|
||||
if (list.length > 0) {
|
||||
actions[action] = list;
|
||||
actions.set(action, list);
|
||||
}
|
||||
}
|
||||
}
|
||||
@ -488,10 +489,10 @@ function collectActions(xref, dict, eventType) {
|
||||
const list = [];
|
||||
_collectJS(actionDict, xref, list, parents);
|
||||
if (list.length > 0) {
|
||||
actions.Action = list;
|
||||
actions.set("Action", list);
|
||||
}
|
||||
}
|
||||
return objectSize(actions) > 0 ? actions : null;
|
||||
return actions.size ? actions : null;
|
||||
}
|
||||
|
||||
const XMLEntities = {
|
||||
@ -533,7 +534,7 @@ function encodeToXmlString(str) {
|
||||
buffer.push(str.substring(start, i));
|
||||
}
|
||||
buffer.push(`&#x${char.toString(16).toUpperCase()};`);
|
||||
if (char > 0xd7ff && (char < 0xe000 || char > 0xfffd)) {
|
||||
if (char > 0xffff) {
|
||||
// char is represented by two u16
|
||||
i++;
|
||||
}
|
||||
@ -545,7 +546,7 @@ function encodeToXmlString(str) {
|
||||
return str;
|
||||
}
|
||||
if (start < str.length) {
|
||||
buffer.push(str.substring(start, str.length));
|
||||
buffer.push(str.substring(start));
|
||||
}
|
||||
return buffer.join("");
|
||||
}
|
||||
@ -561,6 +562,17 @@ function validateFontName(fontFamily, mustWarn = false) {
|
||||
}
|
||||
return false;
|
||||
}
|
||||
// A <string> is terminated by a newline, which for CSS also includes the
|
||||
// form feed character; see https://drafts.csswg.org/css-syntax/#newline.
|
||||
// The font family is escaped before being used, see `serializeFontFamily`,
|
||||
// hence this only prevents values that cannot sensibly name a font from
|
||||
// being used at all (the unquoted case below is already this strict).
|
||||
if (CONTROL_CHAR_REGEXP.test(fontFamily)) {
|
||||
if (mustWarn) {
|
||||
warn(`FontFamily contains control characters: ${fontFamily}.`);
|
||||
}
|
||||
return false;
|
||||
}
|
||||
} else {
|
||||
// See https://developer.mozilla.org/en-US/docs/Web/CSS/custom-ident.
|
||||
for (const ident of fontFamily.split(/[ \t]+/)) {
|
||||
@ -575,6 +587,18 @@ function validateFontName(fontFamily, mustWarn = false) {
|
||||
return true;
|
||||
}
|
||||
|
||||
// Strip the spaces preceding a digit, since e.g. "Wingdings 3" is not a valid
|
||||
// font name in the css specs.
|
||||
// The optional trailing digit is matched as part of the space run, so that a
|
||||
// failing match cannot backtrack over the spaces; otherwise the replacement
|
||||
// would be quadratic in the number of consecutive spaces.
|
||||
function normalizeCSSFontFamily(fontFamily) {
|
||||
return fontFamily.replaceAll(
|
||||
/( +)(\d)?/g,
|
||||
(_, spaces, digit) => digit ?? " "
|
||||
);
|
||||
}
|
||||
|
||||
function validateCSSFont(cssFontInfo) {
|
||||
// See https://developer.mozilla.org/en-US/docs/Web/CSS/font-style.
|
||||
const DEFAULT_CSS_FONT_OBLIQUE = "14";
|
||||
@ -751,6 +775,7 @@ export {
|
||||
lookupRect,
|
||||
MAX_INT_32,
|
||||
MissingDataException,
|
||||
normalizeCSSFontFamily,
|
||||
numberToString,
|
||||
ParserEOFException,
|
||||
parseXFAPath,
|
||||
|
||||
@ -13,6 +13,10 @@
|
||||
* limitations under the License.
|
||||
*/
|
||||
|
||||
/**
|
||||
* @import {BaseStream} from "./base_stream.js";
|
||||
*/
|
||||
|
||||
import {
|
||||
bytesToString,
|
||||
FormatError,
|
||||
@ -26,10 +30,11 @@ import {
|
||||
warn,
|
||||
} from "../shared/util.js";
|
||||
import { calculateSHA384, calculateSHA512 } from "./calculate_sha_other.js";
|
||||
import { Dict, isName, Name } from "./primitives.js";
|
||||
import { Dict, isDict, isName, Name } from "./primitives.js";
|
||||
import { calculateMD5 } from "./calculate_md5.js";
|
||||
import { calculateSHA256 } from "./calculate_sha256.js";
|
||||
import { DecryptStream } from "./decrypt_stream.js";
|
||||
import { saslPrep } from "./sasl_prep.js";
|
||||
|
||||
/**
|
||||
* @typedef {typeof AES128Cipher | typeof AES256Cipher | typeof ARCFourCipher
|
||||
@ -754,6 +759,9 @@ class CipherTransform {
|
||||
/** @type {Map<string, CipherConstructors>} */
|
||||
#cipherCache = new Map();
|
||||
|
||||
/** @type {Name | null} */
|
||||
embeddedFilterName = null;
|
||||
|
||||
/**
|
||||
* @param {ResolveCipher} resolveCipher
|
||||
* Resolve a cipher constructor from a crypt filter name.
|
||||
@ -789,7 +797,11 @@ class CipherTransform {
|
||||
* @returns {DecryptStream}
|
||||
*/
|
||||
createStream(stream, length, cryptFilterName = null) {
|
||||
const Cipher = this.#getCipher(cryptFilterName || this.streamFilterName);
|
||||
const defaultFilterName =
|
||||
this.embeddedFilterName && isDict(stream.dict, "EmbeddedFile")
|
||||
? this.embeddedFilterName
|
||||
: this.streamFilterName;
|
||||
const Cipher = this.#getCipher(cryptFilterName || defaultFilterName);
|
||||
const cipher = new Cipher();
|
||||
return new DecryptStream(
|
||||
stream,
|
||||
@ -842,7 +854,18 @@ class CipherTransform {
|
||||
}
|
||||
}
|
||||
|
||||
function utf8PasswordToBytes(password) {
|
||||
try {
|
||||
password = utf8StringToString(password);
|
||||
} catch {
|
||||
warn("CipherTransformFactory: Unable to convert UTF8 encoded password.");
|
||||
}
|
||||
return stringToBytes(password);
|
||||
}
|
||||
|
||||
class CipherTransformFactory {
|
||||
#fileId;
|
||||
|
||||
static get _defaultPasswordBytes() {
|
||||
return shadow(
|
||||
this,
|
||||
@ -1042,6 +1065,7 @@ class CipherTransformFactory {
|
||||
}
|
||||
this.filterName = filter.name;
|
||||
this.dict = dict;
|
||||
this.#fileId = fileId;
|
||||
const algorithm = dict.get("V");
|
||||
if (
|
||||
!Number.isInteger(algorithm) ||
|
||||
@ -1077,6 +1101,29 @@ class CipherTransformFactory {
|
||||
throw new FormatError("invalid key length");
|
||||
}
|
||||
|
||||
let cf = null;
|
||||
let stmf = Name.get("Identity");
|
||||
let strf = Name.get("Identity");
|
||||
let eff = stmf;
|
||||
|
||||
if (algorithm >= 4) {
|
||||
cf = dict.get("CF");
|
||||
if (cf instanceof Dict) {
|
||||
// The 'CF' dictionary itself should not be encrypted, and by setting
|
||||
// `suppressEncryption` we can prevent an infinite loop inside of
|
||||
// `XRef_fetchUncompressed` if the dictionary contains indirect
|
||||
// objects (fixes issue7665.pdf).
|
||||
cf.suppressEncryption = true;
|
||||
}
|
||||
stmf = dict.get("StmF") || Name.get("Identity");
|
||||
strf = dict.get("StrF") || Name.get("Identity");
|
||||
eff = dict.get("EFF") || stmf;
|
||||
}
|
||||
this.cf = cf;
|
||||
this.stmf = stmf;
|
||||
this.strf = strf;
|
||||
this.eff = eff;
|
||||
|
||||
const ownerBytes = stringToBytes(dict.get("O")),
|
||||
userBytes = stringToBytes(dict.get("U"));
|
||||
// prepare keys
|
||||
@ -1091,19 +1138,20 @@ class CipherTransformFactory {
|
||||
this.encryptMetadata = encryptMetadata;
|
||||
|
||||
const fileIdBytes = stringToBytes(fileId);
|
||||
let passwordBytes;
|
||||
let passwordBytes, rawPasswordBytes;
|
||||
if (password) {
|
||||
if (revision === 6) {
|
||||
try {
|
||||
password = utf8StringToString(password);
|
||||
} catch {
|
||||
warn(
|
||||
"CipherTransformFactory: Unable to convert UTF8 encoded password."
|
||||
);
|
||||
}
|
||||
const preppedPassword = saslPrep(password);
|
||||
passwordBytes = utf8PasswordToBytes(preppedPassword);
|
||||
if (preppedPassword !== password) {
|
||||
rawPasswordBytes = utf8PasswordToBytes(password);
|
||||
}
|
||||
} else if (algorithm === 5) {
|
||||
passwordBytes = utf8PasswordToBytes(password);
|
||||
} else {
|
||||
passwordBytes = stringToBytes(password);
|
||||
}
|
||||
}
|
||||
|
||||
let encryptionKey;
|
||||
if (algorithm !== 5) {
|
||||
@ -1126,9 +1174,12 @@ class CipherTransformFactory {
|
||||
const ownerEncryption = stringToBytes(dict.get("OE"));
|
||||
const userEncryption = stringToBytes(dict.get("UE"));
|
||||
const perms = stringToBytes(dict.get("Perms"));
|
||||
for (const candidate of rawPasswordBytes
|
||||
? [passwordBytes, rawPasswordBytes]
|
||||
: [passwordBytes]) {
|
||||
encryptionKey = this.#createEncryptionKey20(
|
||||
revision,
|
||||
passwordBytes,
|
||||
candidate,
|
||||
ownerPassword,
|
||||
ownerValidationSalt,
|
||||
ownerKeySalt,
|
||||
@ -1140,9 +1191,28 @@ class CipherTransformFactory {
|
||||
userEncryption,
|
||||
perms
|
||||
);
|
||||
if (encryptionKey) {
|
||||
break;
|
||||
}
|
||||
}
|
||||
}
|
||||
if (!encryptionKey) {
|
||||
if (!password) {
|
||||
if (
|
||||
this.algorithm >= 4 &&
|
||||
isName(this.stmf, "Identity") &&
|
||||
isName(this.strf, "Identity")
|
||||
) {
|
||||
const effCF = this.cf?.get(this.eff.name);
|
||||
const authEvent = effCF?.get("AuthEvent");
|
||||
|
||||
if (isName(authEvent, "EFOpen")) {
|
||||
// For EFOpen with Identity as default stream/string filters, defer
|
||||
// password prompting until an EmbeddedFile stream is actually read.
|
||||
this.encryptionKey = null;
|
||||
return;
|
||||
}
|
||||
}
|
||||
throw new PasswordException(
|
||||
"No password given",
|
||||
PasswordResponses.NEED_PASSWORD
|
||||
@ -1182,21 +1252,23 @@ class CipherTransformFactory {
|
||||
} else {
|
||||
this.encryptionKey = encryptionKey;
|
||||
}
|
||||
}
|
||||
|
||||
if (algorithm >= 4) {
|
||||
const cf = dict.get("CF");
|
||||
if (cf instanceof Dict) {
|
||||
// The 'CF' dictionary itself should not be encrypted, and by setting
|
||||
// `suppressEncryption` we can prevent an infinite loop inside of
|
||||
// `XRef_fetchUncompressed` if the dictionary contains indirect
|
||||
// objects (fixes issue7665.pdf).
|
||||
cf.suppressEncryption = true;
|
||||
}
|
||||
this.cf = cf;
|
||||
this.stmf = dict.get("StmF") || Name.get("Identity");
|
||||
this.strf = dict.get("StrF") || Name.get("Identity");
|
||||
this.eff = dict.get("EFF") || this.stmf;
|
||||
}
|
||||
/**
|
||||
* Set password.
|
||||
*
|
||||
* @param {string} password
|
||||
* New password.
|
||||
* @returns {undefined}
|
||||
* Nothing.
|
||||
*/
|
||||
setPassword(password) {
|
||||
const transform = new CipherTransformFactory(
|
||||
this.dict,
|
||||
this.#fileId,
|
||||
password
|
||||
);
|
||||
this.encryptionKey = transform.encryptionKey;
|
||||
}
|
||||
|
||||
/**
|
||||
@ -1220,6 +1292,18 @@ class CipherTransformFactory {
|
||||
if (!cfm || cfm.name === "None") {
|
||||
return NullCipher;
|
||||
}
|
||||
if (!this.encryptionKey) {
|
||||
throw new PasswordException(
|
||||
"No password given",
|
||||
PasswordResponses.NEED_PASSWORD
|
||||
);
|
||||
}
|
||||
if (this.algorithm === 5 || cfm.name === "AESV3") {
|
||||
// V=5 always uses 256-bit AES with the file encryption key, even
|
||||
// when a producer wrongly sets the crypt filter's CFM to AESV2
|
||||
// (bug 2046659).
|
||||
return AES256Cipher.bind(null, this.encryptionKey);
|
||||
}
|
||||
if (cfm.name === "V2") {
|
||||
return ARCFourCipher.bind(
|
||||
null,
|
||||
@ -1242,13 +1326,16 @@ class CipherTransformFactory {
|
||||
)
|
||||
);
|
||||
}
|
||||
if (cfm.name === "AESV3") {
|
||||
return AES256Cipher.bind(null, this.encryptionKey);
|
||||
}
|
||||
throw new FormatError("Unknown crypto method");
|
||||
};
|
||||
|
||||
return new CipherTransform(resolveCipher, this.strf, this.stmf);
|
||||
const transform = new CipherTransform(
|
||||
resolveCipher,
|
||||
this.strf,
|
||||
this.stmf
|
||||
);
|
||||
transform.embeddedFilterName = this.eff;
|
||||
return transform;
|
||||
}
|
||||
|
||||
// algorithms 1 and 2
|
||||
|
||||
@ -111,10 +111,9 @@ class DecodeStream extends BaseStream {
|
||||
|
||||
async getImageData(length, decoderOptions) {
|
||||
if (!this.canAsyncDecodeImageFromBuffer) {
|
||||
if (this.isAsyncDecoder) {
|
||||
return this.decodeImage(null, length, decoderOptions);
|
||||
}
|
||||
return this.getBytes(length, decoderOptions);
|
||||
return this.isAsyncDecoder
|
||||
? this.decodeImage(null, length, decoderOptions)
|
||||
: this.getBytes(length, decoderOptions);
|
||||
}
|
||||
const data = await this.stream.asyncGetBytes();
|
||||
return this.decodeImage(data, length, decoderOptions);
|
||||
@ -178,21 +177,16 @@ class DecodeStream extends BaseStream {
|
||||
return new Stream(this.buffer, start, length, dict);
|
||||
}
|
||||
|
||||
getBaseStreams() {
|
||||
return this.stream ? this.stream.getBaseStreams() : null;
|
||||
}
|
||||
|
||||
clone() {
|
||||
// Make sure it has been fully read.
|
||||
while (!this.eof) {
|
||||
this.readBlock();
|
||||
}
|
||||
return new Stream(
|
||||
this.buffer,
|
||||
this.start,
|
||||
this.end - this.start,
|
||||
this.dict.clone()
|
||||
);
|
||||
return new Stream(this.buffer, 0, this.bufferLength, this.dict?.clone());
|
||||
}
|
||||
|
||||
getBaseStreams() {
|
||||
return this.stream ? this.stream.getBaseStreams() : null;
|
||||
}
|
||||
}
|
||||
|
||||
|
||||
@ -25,6 +25,7 @@ import {
|
||||
LINE_FACTOR,
|
||||
OPS,
|
||||
shadow,
|
||||
Util,
|
||||
warn,
|
||||
} from "../shared/util.js";
|
||||
import { ColorSpaceUtils } from "./colorspace_utils.js";
|
||||
@ -144,7 +145,8 @@ class AppearanceStreamEvaluator extends EvaluatorPreprocessor {
|
||||
result = stack.pop() || result;
|
||||
break;
|
||||
case OPS.setTextMatrix:
|
||||
result.scaleFactor *= Math.hypot(args[0], args[1]);
|
||||
const tm = Util.transform(this.stateManager.state.ctm, args);
|
||||
result.scaleFactor *= Math.hypot(tm[0], tm[1]);
|
||||
break;
|
||||
case OPS.setFont:
|
||||
const [fontName, fontSize] = args;
|
||||
@ -152,7 +154,7 @@ class AppearanceStreamEvaluator extends EvaluatorPreprocessor {
|
||||
result.fontName = fontName.name;
|
||||
}
|
||||
if (typeof fontSize === "number" && fontSize > 0) {
|
||||
result.fontSize = fontSize * result.scaleFactor;
|
||||
result.fontSize = fontSize;
|
||||
}
|
||||
break;
|
||||
case OPS.setFillColorSpace:
|
||||
@ -182,6 +184,10 @@ class AppearanceStreamEvaluator extends EvaluatorPreprocessor {
|
||||
case OPS.showSpacedText:
|
||||
case OPS.nextLineShowText:
|
||||
case OPS.nextLineSetSpacingShowText:
|
||||
// The font (Tf) and the text matrix (Tm) can be set in any order,
|
||||
// so the scale factor is applied here, when text is actually shown
|
||||
// and both are known to be in effect.
|
||||
result.fontSize *= result.scaleFactor;
|
||||
breakLoop = true;
|
||||
break;
|
||||
}
|
||||
@ -418,10 +424,7 @@ class FakeUnicodeFont {
|
||||
[w, h] = [h, w];
|
||||
}
|
||||
|
||||
let hscale = 1;
|
||||
if (maxWidth > w) {
|
||||
hscale = w / maxWidth;
|
||||
}
|
||||
const hscale = maxWidth > w ? w / maxWidth : 1;
|
||||
let vscale = 1;
|
||||
const lineHeight = LINE_FACTOR * fontSize;
|
||||
const lineDescent = LINE_DESCENT_FACTOR * fontSize;
|
||||
@ -479,10 +482,7 @@ class FakeUnicodeFont {
|
||||
appearanceStreamDict.set("Matrix", matrix);
|
||||
}
|
||||
|
||||
const ap = new StringStream(appearance);
|
||||
ap.dict = appearanceStreamDict;
|
||||
|
||||
return ap;
|
||||
return new StringStream(appearance, appearanceStreamDict);
|
||||
}
|
||||
}
|
||||
|
||||
|
||||
@ -21,7 +21,6 @@ import {
|
||||
InvalidPDFException,
|
||||
isArrayEqual,
|
||||
makeArr,
|
||||
objectSize,
|
||||
PageActionEventType,
|
||||
RenderingIntentFlag,
|
||||
shadow,
|
||||
@ -43,6 +42,7 @@ import {
|
||||
isWhiteSpace,
|
||||
lookupNormalRect,
|
||||
MissingDataException,
|
||||
normalizeCSSFontFamily,
|
||||
PDF_VERSION_REGEXP,
|
||||
RESOURCES_KEYS_OPERATOR_LIST,
|
||||
RESOURCES_KEYS_TEXT_CONTENT,
|
||||
@ -81,6 +81,7 @@ import { XFAFactory } from "./xfa/factory.js";
|
||||
import { XRef } from "./xref.js";
|
||||
|
||||
const LETTER_SIZE_MEDIABOX = [0, 0, 612, 792];
|
||||
const SIGNATURE_TAIL_CHUNK_SIZE = 65536;
|
||||
|
||||
class Page {
|
||||
#resourcesPromise = null;
|
||||
@ -718,8 +719,7 @@ class Page {
|
||||
"_parseStructTree",
|
||||
[structTreeRoot]
|
||||
);
|
||||
const data = await this.pdfManager.ensure(structTree, "serializable");
|
||||
return data;
|
||||
return await this.pdfManager.ensure(structTree, "serializable");
|
||||
} catch (ex) {
|
||||
warn(`getStructTree: "${ex}".`);
|
||||
return null;
|
||||
@ -790,8 +790,6 @@ class Page {
|
||||
includeMarkedContent: false,
|
||||
disableNormalization: false,
|
||||
sink: null,
|
||||
viewBox: this.view,
|
||||
lang: null,
|
||||
intersector,
|
||||
}).then(() => {
|
||||
intersector.setText();
|
||||
@ -1007,6 +1005,12 @@ function find(stream, signature, limit = 1024, backwards = false) {
|
||||
class PDFDocument {
|
||||
#pagePromises = new Map();
|
||||
|
||||
// Map<id, {byteRange: number[4], pkcs7: Uint8Array}> — populated by the
|
||||
// `signatures` getter, consumed by `getSignatureData`. We deliberately
|
||||
// keep the signed byte spans out of the metadata array and only slice
|
||||
// them out of the stream when the viewer actually asks to verify.
|
||||
#signatureData = null;
|
||||
|
||||
#version = null;
|
||||
|
||||
constructor(pdfManager, stream) {
|
||||
@ -1191,7 +1195,10 @@ class PDFDocument {
|
||||
recursionDepth
|
||||
);
|
||||
}
|
||||
const isSignature = isName(field.get("FT"), "Sig");
|
||||
const isSignature = isName(
|
||||
getInheritableProperty({ dict: field, key: "FT" }),
|
||||
"Sig"
|
||||
);
|
||||
const rectangle = field.get("Rect");
|
||||
const isInvisible =
|
||||
Array.isArray(rectangle) && rectangle.every(value => value === 0);
|
||||
@ -1276,13 +1283,13 @@ class PDFDocument {
|
||||
if (!streams) {
|
||||
return null;
|
||||
}
|
||||
const data = Object.create(null);
|
||||
const data = new Map();
|
||||
for (const [key, stream] of streams) {
|
||||
if (!stream) {
|
||||
continue;
|
||||
}
|
||||
try {
|
||||
data[key] = stringToUTF8String(stream.getString());
|
||||
data.set(key, stringToUTF8String(stream.getString()));
|
||||
} catch {
|
||||
warn("XFA - Invalid utf-8 string.");
|
||||
return null;
|
||||
@ -1390,9 +1397,7 @@ class PDFDocument {
|
||||
if (!(descriptor instanceof Dict)) {
|
||||
continue;
|
||||
}
|
||||
let fontFamily = descriptor.get("FontFamily");
|
||||
// For example, "Wingdings 3" is not a valid font name in the css specs.
|
||||
fontFamily = fontFamily.replaceAll(/ +(\d)/g, "$1");
|
||||
const fontFamily = normalizeCSSFontFamily(descriptor.get("FontFamily"));
|
||||
const fontWeight = descriptor.get("FontWeight");
|
||||
|
||||
// Angle is expressed in degrees counterclockwise in PDF
|
||||
@ -1874,12 +1879,15 @@ class PDFDocument {
|
||||
name = name === "" ? partName : `${name}.${partName}`;
|
||||
} else {
|
||||
let obj = field;
|
||||
// The `Parent` chain can be cyclic, hence the local `RefSet`.
|
||||
const walkedRefs = new RefSet();
|
||||
while (true) {
|
||||
obj = obj.getRaw("Parent") || parentRef;
|
||||
if (obj instanceof Ref) {
|
||||
if (visitedRefs.has(obj)) {
|
||||
if (visitedRefs.has(obj) || walkedRefs.has(obj)) {
|
||||
break;
|
||||
}
|
||||
walkedRefs.put(obj);
|
||||
obj = await xref.fetchAsync(obj);
|
||||
}
|
||||
if (!(obj instanceof Dict)) {
|
||||
@ -1953,7 +1961,7 @@ class PDFDocument {
|
||||
const { acroForm } = annotationGlobals;
|
||||
|
||||
const visitedRefs = new RefSet();
|
||||
const allFields = Object.create(null);
|
||||
const allFields = new Map();
|
||||
const fieldPromises = new Map();
|
||||
const orphanFields = new RefSetCache();
|
||||
for (const fieldRef of acroForm.get("Fields")) {
|
||||
@ -1974,7 +1982,7 @@ class PDFDocument {
|
||||
Promise.all(promises).then(fields => {
|
||||
fields = fields.filter(field => !!field);
|
||||
if (fields.length > 0) {
|
||||
allFields[name] = fields;
|
||||
allFields.set(name, fields);
|
||||
}
|
||||
})
|
||||
);
|
||||
@ -1982,7 +1990,7 @@ class PDFDocument {
|
||||
await Promise.all(allPromises);
|
||||
|
||||
return {
|
||||
allFields: objectSize(allFields) > 0 ? allFields : null,
|
||||
allFields: allFields.size ? allFields : null,
|
||||
orphanFields,
|
||||
};
|
||||
});
|
||||
@ -1990,6 +1998,258 @@ class PDFDocument {
|
||||
return shadow(this, "fieldObjects", promise);
|
||||
}
|
||||
|
||||
async #collectSignatureFields(fields, out, visitedRefs) {
|
||||
if (!Array.isArray(fields)) {
|
||||
return;
|
||||
}
|
||||
for (const fieldRef of fields) {
|
||||
if (fieldRef instanceof Ref) {
|
||||
if (visitedRefs.has(fieldRef)) {
|
||||
continue;
|
||||
}
|
||||
visitedRefs.put(fieldRef);
|
||||
}
|
||||
const field = await this.xref.fetchIfRefAsync(fieldRef);
|
||||
if (!(field instanceof Dict)) {
|
||||
continue;
|
||||
}
|
||||
if (isName(await field.getAsync("FT"), "Sig")) {
|
||||
const sigDict = await field.getAsync("V");
|
||||
if (sigDict instanceof Dict) {
|
||||
const parsed = await this.#parseSignatureDict(
|
||||
field,
|
||||
sigDict,
|
||||
fieldRef
|
||||
);
|
||||
if (parsed) {
|
||||
out.push(parsed);
|
||||
}
|
||||
}
|
||||
}
|
||||
if (field.has("Kids")) {
|
||||
// A terminal field can have Widget annotations as children, so its
|
||||
// own signature must be collected before walking the field tree.
|
||||
await this.#collectSignatureFields(
|
||||
await field.getAsync("Kids"),
|
||||
out,
|
||||
visitedRefs
|
||||
);
|
||||
}
|
||||
}
|
||||
}
|
||||
|
||||
async #getByteRange(begin, end) {
|
||||
try {
|
||||
return this.stream.getByteRange(begin, end);
|
||||
} catch (ex) {
|
||||
if (!(ex instanceof MissingDataException)) {
|
||||
throw ex;
|
||||
}
|
||||
await this.pdfManager.requestRange(begin, end);
|
||||
return this.#getByteRange(begin, end);
|
||||
}
|
||||
}
|
||||
|
||||
async #coversWholeDocument(signedEnd, modificationsAfterSignature) {
|
||||
if (modificationsAfterSignature > 0) {
|
||||
return false;
|
||||
}
|
||||
|
||||
const fileLength = this.stream.end;
|
||||
for (
|
||||
let begin = signedEnd;
|
||||
begin < fileLength;
|
||||
begin += SIGNATURE_TAIL_CHUNK_SIZE
|
||||
) {
|
||||
const end = Math.min(begin + SIGNATURE_TAIL_CHUNK_SIZE, fileLength);
|
||||
const tail = await this.#getByteRange(begin, end);
|
||||
|
||||
for (const byte of tail) {
|
||||
if (
|
||||
byte !== 0x00 && // null
|
||||
byte !== 0x09 && // horizontal tab
|
||||
byte !== 0x0a && // line feed
|
||||
byte !== 0x0c && // form feed
|
||||
byte !== 0x0d && // carriage return
|
||||
byte !== 0x20 // space
|
||||
) {
|
||||
return false;
|
||||
}
|
||||
}
|
||||
}
|
||||
return true;
|
||||
}
|
||||
|
||||
async #parseSignatureDict(field, sigDict, fieldRef) {
|
||||
const byteRange = await sigDict.getAsync("ByteRange");
|
||||
if (
|
||||
!Array.isArray(byteRange) ||
|
||||
byteRange.length !== 4 ||
|
||||
byteRange.some(n => !Number.isInteger(n) || n < 0)
|
||||
) {
|
||||
return null;
|
||||
}
|
||||
// Slice the two ByteRange byte spans out of the underlying PDF stream.
|
||||
// ByteRange = [a, b, c, d] means signed bytes are [a..a+b] and [c..c+d];
|
||||
// the gap covers the /Contents hex blob itself.
|
||||
const [a, b, c, d] = byteRange;
|
||||
// `/ByteRange` offsets are absolute, so compare against `stream.end`
|
||||
// (raw buffer end), not `stream.length` (post-`moveStart` payload).
|
||||
const fileLength = this.stream.end || 0;
|
||||
// Reject signatures whose /ByteRange is structurally implausible: it
|
||||
// must start at the file head, define a non-empty first span, leave
|
||||
// room for the /Contents blob between the two spans, and fit within
|
||||
// the file. Without this a crafted PDF can claim to cover the whole
|
||||
// document while only signing a small prologue.
|
||||
if (
|
||||
a !== 0 ||
|
||||
b <= 0 ||
|
||||
a + b > c ||
|
||||
c + d > fileLength ||
|
||||
fileLength === 0
|
||||
) {
|
||||
return null;
|
||||
}
|
||||
|
||||
const contents = await sigDict.getAsync("Contents");
|
||||
if (typeof contents !== "string" || contents.length === 0) {
|
||||
return null;
|
||||
}
|
||||
|
||||
const [
|
||||
filterName,
|
||||
subFilterName,
|
||||
t,
|
||||
name,
|
||||
reason,
|
||||
location,
|
||||
contactInfo,
|
||||
m,
|
||||
] = await Promise.all([
|
||||
sigDict.getAsync("Filter"),
|
||||
sigDict.getAsync("SubFilter"),
|
||||
field.getAsync("T"),
|
||||
sigDict.getAsync("Name"),
|
||||
sigDict.getAsync("Reason"),
|
||||
sigDict.getAsync("Location"),
|
||||
sigDict.getAsync("ContactInfo"),
|
||||
sigDict.getAsync("M"),
|
||||
]);
|
||||
|
||||
const filter = filterName instanceof Name ? filterName.name : null,
|
||||
subFilter = subFilterName instanceof Name ? subFilterName.name : null;
|
||||
|
||||
let signatureType = null;
|
||||
if (subFilter === "adbe.pkcs7.detached") {
|
||||
signatureType = 0;
|
||||
} else if (subFilter === "adbe.pkcs7.sha1") {
|
||||
signatureType = 1;
|
||||
}
|
||||
const refKey = fieldRef instanceof Ref ? fieldRef.toString() : "inline";
|
||||
|
||||
return {
|
||||
id: `${refKey}:${a}-${b}-${c}-${d}`,
|
||||
fieldName: typeof t === "string" ? stringToPDFString(t) : "",
|
||||
signerName: typeof name === "string" ? stringToPDFString(name) : null,
|
||||
reason: typeof reason === "string" ? stringToPDFString(reason) : null,
|
||||
location:
|
||||
typeof location === "string" ? stringToPDFString(location) : null,
|
||||
contactInfo:
|
||||
typeof contactInfo === "string" ? stringToPDFString(contactInfo) : null,
|
||||
signingTime: typeof m === "string" ? m : null,
|
||||
filter,
|
||||
subFilter,
|
||||
signatureType,
|
||||
byteRange,
|
||||
pkcs7: stringToBytes(contents),
|
||||
revisionIndex: 0,
|
||||
parentId: null,
|
||||
};
|
||||
}
|
||||
|
||||
get signatures() {
|
||||
const promise = this.pdfManager
|
||||
.ensureDoc("formInfo")
|
||||
.then(async formInfo => {
|
||||
if (!formInfo.hasSignatures || !formInfo.hasFields) {
|
||||
return null;
|
||||
}
|
||||
const annotationGlobals = await this.annotationGlobals;
|
||||
if (!annotationGlobals) {
|
||||
return null;
|
||||
}
|
||||
const fields = annotationGlobals.acroForm.get("Fields");
|
||||
|
||||
const collected = [];
|
||||
await this.#collectSignatureFields(fields, collected, new RefSet());
|
||||
|
||||
await Promise.all(
|
||||
collected.map(async signature => {
|
||||
const signedEnd = signature.byteRange[2] + signature.byteRange[3];
|
||||
signature.modificationsAfterSignature =
|
||||
this.xref.countUpdatesAfter(signedEnd);
|
||||
signature.coversWholeDocument = await this.#coversWholeDocument(
|
||||
signedEnd,
|
||||
signature.modificationsAfterSignature
|
||||
);
|
||||
})
|
||||
);
|
||||
|
||||
// Group sub-signatures by ByteRange containment: outer revision is
|
||||
// the largest covering signature (largest c + d). Sort descending,
|
||||
// then point each later signature at the smallest enclosing parent
|
||||
// that came before it.
|
||||
collected.sort(
|
||||
(a, b) =>
|
||||
b.byteRange[2] + b.byteRange[3] - (a.byteRange[2] + a.byteRange[3])
|
||||
);
|
||||
for (let i = 0, ii = collected.length; i < ii; i++) {
|
||||
const sig = collected[i];
|
||||
sig.revisionIndex = i;
|
||||
for (let j = i - 1; j >= 0; j--) {
|
||||
const candidate = collected[j];
|
||||
if (
|
||||
candidate.byteRange[2] + candidate.byteRange[3] >
|
||||
sig.byteRange[2] + sig.byteRange[3]
|
||||
) {
|
||||
sig.parentId = candidate.id;
|
||||
break;
|
||||
}
|
||||
}
|
||||
}
|
||||
// Keep the PKCS#7 blob and byte-range information worker-side so the
|
||||
// metadata array stays small. The viewer fetches the signed bytes on
|
||||
// demand via `getSignatureData(id)`, one signature at a time, only
|
||||
// when verification is about to run.
|
||||
const signatureData = new Map();
|
||||
const metadata = collected.map(sig => {
|
||||
const { pkcs7, ...rest } = sig;
|
||||
signatureData.set(sig.id, { byteRange: sig.byteRange, pkcs7 });
|
||||
return rest;
|
||||
});
|
||||
this.#signatureData = signatureData;
|
||||
return metadata.length ? metadata : null;
|
||||
});
|
||||
|
||||
return shadow(this, "signatures", promise);
|
||||
}
|
||||
|
||||
async getSignatureData(id) {
|
||||
// Ensure parsing is finished and `#signatureData` is populated.
|
||||
await this.signatures;
|
||||
const signature = this.#signatureData?.get(id);
|
||||
if (!signature) {
|
||||
return null;
|
||||
}
|
||||
const { byteRange, pkcs7 } = signature;
|
||||
const [a, b, c, d] = byteRange;
|
||||
const data = await Promise.all([
|
||||
this.#getByteRange(a, a + b),
|
||||
this.#getByteRange(c, c + d),
|
||||
]);
|
||||
return { data, pkcs7 };
|
||||
}
|
||||
|
||||
get hasJSActions() {
|
||||
const promise = this.pdfManager.ensureDoc("_parseHasJSActions");
|
||||
return shadow(this, "hasJSActions", promise);
|
||||
@ -2008,9 +2268,9 @@ class PDFDocument {
|
||||
return true;
|
||||
}
|
||||
if (fieldObjects?.allFields) {
|
||||
return Object.values(fieldObjects.allFields).some(fieldObject =>
|
||||
fieldObject.some(object => object.actions !== null)
|
||||
);
|
||||
return fieldObjects.allFields
|
||||
.values()
|
||||
.some(fieldObj => fieldObj.some(obj => obj.actions !== null));
|
||||
}
|
||||
return false;
|
||||
}
|
||||
|
||||
@ -27,16 +27,25 @@ import {
|
||||
getNewAnnotationsMap,
|
||||
numberToString,
|
||||
} from "../core_utils.js";
|
||||
import { Dict, isName, Name, Ref, RefSet, RefSetCache } from "../primitives.js";
|
||||
import {
|
||||
Dict,
|
||||
isDict,
|
||||
isName,
|
||||
Name,
|
||||
Ref,
|
||||
RefSet,
|
||||
RefSetCache,
|
||||
} from "../primitives.js";
|
||||
import { incrementalUpdate, writeValue } from "../writer.js";
|
||||
import { isArrayEqual, makeArr, stringToBytes } from "../../shared/util.js";
|
||||
import { NameTree, NumberTree } from "../name_number_tree.js";
|
||||
import { Stream, StringStream } from "../stream.js";
|
||||
import { stringToAsciiOrUTF16BE, stringToPDFString } from "../string_utils.js";
|
||||
import { AnnotationFactory } from "../annotation.js";
|
||||
import { BaseStream } from "../base_stream.js";
|
||||
import { createImage } from "./pdf_images.js";
|
||||
import { LETTER_SIZE_MEDIABOX } from "../document.js";
|
||||
import { stringToBytes } from "../../shared/util.js";
|
||||
import { MurmurHash3_64 } from "../../shared/murmurhash3.js";
|
||||
import { StringStream } from "../stream.js";
|
||||
|
||||
const MAX_LEAVES_PER_PAGES_NODE = 16;
|
||||
const MAX_IN_NAME_TREE_NODE = 64;
|
||||
@ -63,6 +72,7 @@ class DocumentData {
|
||||
this.dedupNamedDestinations = new Map();
|
||||
this.usedNamedDestinations = new Set();
|
||||
this.postponedRefCopies = new RefSetCache();
|
||||
this.resourceStreamPromises = new Map();
|
||||
this.usedStructParents = new Set();
|
||||
this.oldStructParentMapping = new Map();
|
||||
this.structTreeRoot = null;
|
||||
@ -94,6 +104,10 @@ class XRefWrapper {
|
||||
return this._getNewRef();
|
||||
}
|
||||
|
||||
countUpdatesAfter(offset) {
|
||||
return null;
|
||||
}
|
||||
|
||||
fetchIfRef(obj) {
|
||||
return obj instanceof Ref ? this.fetch(obj) : obj;
|
||||
}
|
||||
@ -126,6 +140,12 @@ class PDFEditor {
|
||||
|
||||
#primaryDocument = null;
|
||||
|
||||
// Deduplicates resource streams (fonts/images) shared across the merged
|
||||
// documents. Maps a cheap content key to a bucket of { ref, dictStr, stream }
|
||||
// candidates; the key only groups possible matches, an exact byte comparison
|
||||
// decides, so a key collision can never alias two distinct resources.
|
||||
#resourceStreamCache = new Map();
|
||||
|
||||
currentDocument = null;
|
||||
|
||||
oldPages = [];
|
||||
@ -232,40 +252,73 @@ class PDFEditor {
|
||||
* @param {*} obj
|
||||
* @param {boolean} mustClone
|
||||
* @param {XRef} xref
|
||||
* @param {RefSet} resourceStreamPath
|
||||
* @returns {Promise<*>}
|
||||
*/
|
||||
async #collectDependencies(obj, mustClone, xref) {
|
||||
async #collectDependencies(
|
||||
obj,
|
||||
mustClone,
|
||||
xref,
|
||||
resourceStreamPath = new RefSet()
|
||||
) {
|
||||
if (obj instanceof Ref) {
|
||||
const {
|
||||
currentDocument: { oldRefMapping },
|
||||
currentDocument: { fieldToParent, oldRefMapping },
|
||||
} = this;
|
||||
let newRef = oldRefMapping.get(obj);
|
||||
if (newRef) {
|
||||
return newRef;
|
||||
const existingRef = oldRefMapping.get(obj);
|
||||
if (existingRef) {
|
||||
return existingRef;
|
||||
}
|
||||
const oldRef = obj;
|
||||
obj = await xref.fetchAsync(oldRef);
|
||||
const mappedRef = oldRefMapping.get(oldRef);
|
||||
if (mappedRef) {
|
||||
// Another concurrent traversal may have allocated the clone while the
|
||||
// source object was being fetched.
|
||||
return mappedRef;
|
||||
}
|
||||
if (typeof obj === "number") {
|
||||
// Simple value; no need to create a new reference.
|
||||
return obj;
|
||||
}
|
||||
|
||||
newRef = this.newRef;
|
||||
// Deduplicate fonts/images against earlier copies (common when merging
|
||||
// exports of the same template). Reusing a copy costs no reference, so
|
||||
// allocation is deferred to #collectResourceStream until it's known new.
|
||||
if (obj instanceof BaseStream && this.#isResourceStream(obj.dict)) {
|
||||
return this.#collectResourceStream(
|
||||
oldRef,
|
||||
obj,
|
||||
xref,
|
||||
resourceStreamPath
|
||||
);
|
||||
}
|
||||
|
||||
const newRef = this.newRef;
|
||||
oldRefMapping.put(oldRef, newRef);
|
||||
|
||||
if (typeof PDFJSDev === "undefined" || PDFJSDev.test("TESTING")) {
|
||||
if (
|
||||
obj instanceof Dict &&
|
||||
isName(obj.get("Type"), "Page") &&
|
||||
!this.currentDocument.pagesMap.has(oldRef)
|
||||
) {
|
||||
if (isDict(obj, "Page") && !this.currentDocument.pagesMap.has(oldRef)) {
|
||||
throw new Error(
|
||||
"Add a deleted page to the document is not supported."
|
||||
);
|
||||
}
|
||||
}
|
||||
|
||||
this.xref[newRef.num] = await this.#collectDependencies(obj, true, xref);
|
||||
let cloneSource = true;
|
||||
if (fieldToParent.has(oldRef) && obj instanceof Dict) {
|
||||
// Avoid following a widget's field hierarchy while cloning the page,
|
||||
// without mutating the source dictionary cached by its XRef.
|
||||
obj = this.cloneDict(obj);
|
||||
obj.delete("Parent");
|
||||
cloneSource = false;
|
||||
}
|
||||
this.xref[newRef.num] = await this.#collectDependencies(
|
||||
obj,
|
||||
cloneSource,
|
||||
xref,
|
||||
resourceStreamPath
|
||||
);
|
||||
return newRef;
|
||||
}
|
||||
const promises = [];
|
||||
@ -285,9 +338,12 @@ class PDFEditor {
|
||||
continue;
|
||||
}
|
||||
promises.push(
|
||||
this.#collectDependencies(obj[i], true, xref).then(
|
||||
newObj => (obj[i] = newObj)
|
||||
)
|
||||
this.#collectDependencies(
|
||||
obj[i],
|
||||
true,
|
||||
xref,
|
||||
resourceStreamPath
|
||||
).then(newObj => (obj[i] = newObj))
|
||||
);
|
||||
}
|
||||
await Promise.all(promises);
|
||||
@ -314,9 +370,12 @@ class PDFEditor {
|
||||
continue;
|
||||
}
|
||||
promises.push(
|
||||
this.#collectDependencies(rawObj, true, xref).then(newObj =>
|
||||
dict.set(key, newObj)
|
||||
)
|
||||
this.#collectDependencies(
|
||||
rawObj,
|
||||
true,
|
||||
xref,
|
||||
resourceStreamPath
|
||||
).then(newObj => dict.set(key, newObj))
|
||||
);
|
||||
}
|
||||
await Promise.all(promises);
|
||||
@ -325,6 +384,173 @@ class PDFEditor {
|
||||
return obj;
|
||||
}
|
||||
|
||||
/**
|
||||
* Whether a stream is worth deduplicating: an image or an embedded font
|
||||
* program (large and often shared). Per-page content streams etc. are
|
||||
* essentially never shared, so hashing them would be wasted work.
|
||||
* @param {Dict} dict
|
||||
* @returns {boolean}
|
||||
*/
|
||||
#isResourceStream(dict) {
|
||||
const subtype = dict.get("Subtype");
|
||||
return (
|
||||
isName(subtype, "Image") ||
|
||||
// FontFile/FontFile2 carry Length1; FontFile3 has one of these Subtypes.
|
||||
dict.has("Length1") ||
|
||||
isName(subtype, "Type1C") ||
|
||||
isName(subtype, "CIDFontType0C") ||
|
||||
isName(subtype, "OpenType")
|
||||
);
|
||||
}
|
||||
|
||||
/**
|
||||
* Read the raw, still-encoded bytes of a stream.
|
||||
* @param {BaseStream} stream
|
||||
* @returns {Uint8Array}
|
||||
*/
|
||||
#rawStreamBytes(stream) {
|
||||
const original = stream.getOriginalStream();
|
||||
original.reset();
|
||||
return original.getBytes();
|
||||
}
|
||||
|
||||
/**
|
||||
* Serialize a dictionary to a canonical string. Two clones of the same source
|
||||
* dict serialize identically, so this works as a bucket key and as an exact
|
||||
* comparison.
|
||||
* @param {Dict} dict
|
||||
* @returns {Promise<string>}
|
||||
*/
|
||||
async #serializeDict(dict) {
|
||||
const buffer = [];
|
||||
await writeValue(dict, buffer, /* transform = */ null);
|
||||
return buffer.join("");
|
||||
}
|
||||
|
||||
/**
|
||||
* Cheap bucket key for a resource stream: the serialized dict, the byte
|
||||
* length, and a few sampled chunks (so large payloads aren't fully hashed).
|
||||
* Collisions only group candidates that are then compared byte-for-byte, so
|
||||
* they cost time but never cause a wrong merge.
|
||||
* @param {string} dictStr
|
||||
* @param {Uint8Array} bytes
|
||||
* @returns {string}
|
||||
*/
|
||||
#resourceStreamKey(dictStr, bytes) {
|
||||
const SAMPLE_SIZE = 256;
|
||||
const SAMPLE_COUNT = 4;
|
||||
const { length } = bytes;
|
||||
const hash = new MurmurHash3_64();
|
||||
hash.update(dictStr);
|
||||
hash.update(`#${length}`);
|
||||
if (length <= SAMPLE_SIZE * SAMPLE_COUNT) {
|
||||
hash.update(bytes);
|
||||
} else {
|
||||
const step = Math.floor((length - SAMPLE_SIZE) / (SAMPLE_COUNT - 1));
|
||||
for (let i = 0; i < SAMPLE_COUNT; i++) {
|
||||
const start = Math.min(i * step, length - SAMPLE_SIZE);
|
||||
hash.update(bytes.subarray(start, start + SAMPLE_SIZE));
|
||||
}
|
||||
}
|
||||
return hash.hexdigest();
|
||||
}
|
||||
|
||||
/**
|
||||
* Clone a resource stream and return its output reference, reusing an earlier
|
||||
* copy when possible. The reference is allocated lazily (in
|
||||
* #dedupResourceStream), so a reused resource leaves no unused reference.
|
||||
* @param {Ref} oldRef
|
||||
* @param {BaseStream} stream
|
||||
* @param {XRef} xref
|
||||
* @param {RefSet} resourceStreamPath
|
||||
* @returns {Promise<Ref>}
|
||||
*/
|
||||
async #collectResourceStream(oldRef, stream, xref, resourceStreamPath) {
|
||||
const {
|
||||
currentDocument: { oldRefMapping, resourceStreamPromises },
|
||||
} = this;
|
||||
|
||||
// Re-entry means a (malformed) cycle back to this stream: allocate its
|
||||
// reference now to break the loop, like the generic path's eager alloc.
|
||||
if (resourceStreamPath.has(oldRef)) {
|
||||
return oldRefMapping.getOrPutComputed(oldRef, () => this.newRef);
|
||||
}
|
||||
|
||||
const key = oldRef.toString();
|
||||
const pending = resourceStreamPromises.get(key);
|
||||
if (pending) {
|
||||
return pending;
|
||||
}
|
||||
|
||||
// The path only grows here, so the shared parent path can be passed
|
||||
// read-only everywhere else; snapshot it, add this stream, and recurse.
|
||||
const childPath = new RefSet(resourceStreamPath);
|
||||
childPath.put(oldRef);
|
||||
|
||||
const promise = Promise.resolve().then(async () => {
|
||||
const collected = await this.#collectDependencies(
|
||||
stream,
|
||||
true,
|
||||
xref,
|
||||
childPath
|
||||
);
|
||||
|
||||
// A cycle already allocated a reference, so store the clone there.
|
||||
const cycleRef = oldRefMapping.get(oldRef);
|
||||
if (cycleRef) {
|
||||
this.xref[cycleRef.num] = collected;
|
||||
return cycleRef;
|
||||
}
|
||||
|
||||
const ref = await this.#dedupResourceStream(collected);
|
||||
oldRefMapping.put(oldRef, ref);
|
||||
return ref;
|
||||
});
|
||||
resourceStreamPromises.set(key, promise);
|
||||
try {
|
||||
return await promise;
|
||||
} finally {
|
||||
if (resourceStreamPromises.get(key) === promise) {
|
||||
resourceStreamPromises.delete(key);
|
||||
}
|
||||
}
|
||||
}
|
||||
|
||||
/**
|
||||
* Return the reference for a cloned resource stream, reusing a byte-identical
|
||||
* earlier copy or else allocating and registering a new one.
|
||||
* @param {BaseStream} stream
|
||||
* @returns {Promise<Ref>}
|
||||
*/
|
||||
async #dedupResourceStream(stream) {
|
||||
const dictStr = await this.#serializeDict(stream.dict);
|
||||
const bytes = this.#rawStreamBytes(stream);
|
||||
const key = this.#resourceStreamKey(dictStr, bytes);
|
||||
|
||||
const bucket = this.#resourceStreamCache.getOrInsertComputed(key, makeArr);
|
||||
// Same key only means "maybe equal": confirm with an exact comparison.
|
||||
for (const entry of bucket) {
|
||||
if (
|
||||
entry.dictStr === dictStr &&
|
||||
isArrayEqual(this.#rawStreamBytes(entry.stream), bytes)
|
||||
) {
|
||||
return entry.ref;
|
||||
}
|
||||
}
|
||||
const ref = this.newRef;
|
||||
this.xref[ref.num] = stream;
|
||||
bucket.push({ ref, dictStr, stream });
|
||||
return ref;
|
||||
}
|
||||
|
||||
async #resolveStructKids(rawKids, xref) {
|
||||
if (rawKids instanceof Ref) {
|
||||
const fetched = await xref.fetchAsync(rawKids);
|
||||
return Array.isArray(fetched) ? fetched : [rawKids];
|
||||
}
|
||||
return Array.isArray(rawKids) ? rawKids : [rawKids];
|
||||
}
|
||||
|
||||
async #cloneStructTreeNode(
|
||||
parentStructRef,
|
||||
node,
|
||||
@ -342,19 +568,11 @@ class PDFEditor {
|
||||
if (pg instanceof Ref && !pagesMap.has(pg)) {
|
||||
return null;
|
||||
}
|
||||
let kids;
|
||||
const k = (kids = node.getRaw("K"));
|
||||
if (k instanceof Ref) {
|
||||
// We're only interested by ref referencing nodes and not an array.
|
||||
if (visited.has(k)) {
|
||||
const k = node.getRaw("K");
|
||||
if (k instanceof Ref && visited.has(k)) {
|
||||
return null;
|
||||
}
|
||||
kids = await xref.fetchAsync(k);
|
||||
if (!Array.isArray(kids)) {
|
||||
kids = [k];
|
||||
}
|
||||
}
|
||||
kids = Array.isArray(kids) ? kids : [kids];
|
||||
const kids = await this.#resolveStructKids(k, xref);
|
||||
const newKids = [];
|
||||
const structElemIndices = [];
|
||||
for (let kid of kids) {
|
||||
@ -415,10 +633,15 @@ class PDFEditor {
|
||||
if (!kidRef) {
|
||||
continue;
|
||||
}
|
||||
const newKidRef = oldRefMapping.get(kidRef);
|
||||
if (!newKidRef) {
|
||||
// Only keep the reference when its target was actually copied. A link
|
||||
// annotation targeting a removed page is dropped, so skip its OBJR.
|
||||
const oldObjRef = kid.getRaw("Obj");
|
||||
if (oldObjRef instanceof Ref && !oldRefMapping.get(oldObjRef)) {
|
||||
continue;
|
||||
}
|
||||
const newKidRef =
|
||||
oldRefMapping.get(kidRef) ||
|
||||
(await this.#collectDependencies(kidRef, true, xref));
|
||||
const newKid = this.xref[newKidRef.num];
|
||||
// Fix the missing StructParent entry in the referenced object.
|
||||
const objRef = newKid.getRaw("Obj");
|
||||
@ -469,21 +692,13 @@ class PDFEditor {
|
||||
const classNames = node.get("C");
|
||||
if (classNames instanceof Name) {
|
||||
const newClassName = dedupClasses.get(classNames.name);
|
||||
if (newClassName) {
|
||||
newNode.set("C", Name.get(newClassName));
|
||||
} else {
|
||||
newNode.set("C", classNames);
|
||||
}
|
||||
newNode.set("C", newClassName ? Name.get(newClassName) : classNames);
|
||||
} else if (Array.isArray(classNames)) {
|
||||
const newClassNames = [];
|
||||
for (const className of classNames) {
|
||||
if (className instanceof Name) {
|
||||
const newClassName = dedupClasses.get(className.name);
|
||||
if (newClassName) {
|
||||
newClassNames.push(Name.get(newClassName));
|
||||
} else {
|
||||
newClassNames.push(className);
|
||||
}
|
||||
newClassNames.push(newClassName ? Name.get(newClassName) : className);
|
||||
}
|
||||
}
|
||||
newNode.set("C", newClassNames);
|
||||
@ -493,11 +708,7 @@ class PDFEditor {
|
||||
const roleName = node.get("S");
|
||||
if (roleName instanceof Name) {
|
||||
const newRoleName = dedupRoles.get(roleName.name);
|
||||
if (newRoleName) {
|
||||
newNode.set("S", Name.get(newRoleName));
|
||||
} else {
|
||||
newNode.set("S", roleName);
|
||||
}
|
||||
newNode.set("S", newRoleName ? Name.get(newRoleName) : roleName);
|
||||
}
|
||||
|
||||
// Fix the ID.
|
||||
@ -505,11 +716,7 @@ class PDFEditor {
|
||||
if (typeof id === "string") {
|
||||
const stringId = stringToPDFString(id, /* keepEscapeSequence = */ false);
|
||||
const newId = dedupIDs.get(stringId);
|
||||
if (newId) {
|
||||
newNode.set("ID", stringToAsciiOrUTF16BE(newId));
|
||||
} else {
|
||||
newNode.set("ID", id);
|
||||
}
|
||||
newNode.set("ID", newId ? stringToAsciiOrUTF16BE(newId) : id);
|
||||
}
|
||||
|
||||
// Table headers may contain IDs that need to be deduplicated.
|
||||
@ -520,12 +727,21 @@ class PDFEditor {
|
||||
}
|
||||
for (let attr of attributes) {
|
||||
attr = this.xrefWrapper.fetchIfRef(attr);
|
||||
if (!(attr instanceof Dict)) {
|
||||
// An attribute array may interleave dictionaries and revision
|
||||
// numbers (ISO 32000-2, 14.7.6.3).
|
||||
continue;
|
||||
}
|
||||
if (isName(attr.get("O"), "Table") && attr.has("Headers")) {
|
||||
const headers = this.xrefWrapper.fetchIfRef(attr.getRaw("Headers"));
|
||||
if (Array.isArray(headers)) {
|
||||
for (let i = 0, ii = headers.length; i < ii; i++) {
|
||||
const header = this.xrefWrapper.fetchIfRef(headers[i]);
|
||||
if (typeof header !== "string") {
|
||||
continue;
|
||||
}
|
||||
const newId = dedupIDs.get(
|
||||
stringToPDFString(headers[i], /* keepEscapeSequence = */ false)
|
||||
stringToPDFString(header, /* keepEscapeSequence = */ false)
|
||||
);
|
||||
if (newId) {
|
||||
headers[i] = newId;
|
||||
@ -1017,15 +1233,12 @@ class PDFEditor {
|
||||
if (!isName(annotationDict.get("Subtype"), "Link")) {
|
||||
if (isName(annotationDict.get("Subtype"), "Widget")) {
|
||||
hasSignatureAnnotations ||= isName(
|
||||
annotationDict.get("FT"),
|
||||
getInheritableProperty({ dict: annotationDict, key: "FT" }),
|
||||
"Sig"
|
||||
);
|
||||
const parentRef = annotationDict.get("Parent") || null;
|
||||
// We remove the parent to avoid visiting it when cloning the
|
||||
// annotation.
|
||||
// It'll be fixed later in #mergeAcroForms when merging the
|
||||
// AcroForms.
|
||||
annotationDict.delete("Parent");
|
||||
const parentRef = annotationDict.getRaw("Parent") || null;
|
||||
// The parent will be omitted from the annotation clone to avoid
|
||||
// visiting it, then restored by #mergeAcroForms.
|
||||
fieldToParent.put(annotationRef, parentRef);
|
||||
}
|
||||
|
||||
@ -1033,6 +1246,13 @@ class PDFEditor {
|
||||
return;
|
||||
}
|
||||
const action = annotationDict.get("A");
|
||||
if (action instanceof Dict && !isName(action.get("S"), "GoTo")) {
|
||||
// Only GoTo actions point to pages in the current document. Other
|
||||
// actions, such as GoToR, must not be filtered using the current
|
||||
// document's page map.
|
||||
newAnnotations[newAnnotationIndex] = annotationRef;
|
||||
return;
|
||||
}
|
||||
const dest =
|
||||
action instanceof Dict
|
||||
? action.get("D")
|
||||
@ -1044,9 +1264,9 @@ class PDFEditor {
|
||||
) {
|
||||
// Keep the annotation as is: it isn't linking to a deleted page.
|
||||
newAnnotations[newAnnotationIndex] = annotationRef;
|
||||
} else if (typeof dest === "string") {
|
||||
} else if (dest instanceof Name || typeof dest === "string") {
|
||||
const destString = stringToPDFString(
|
||||
dest,
|
||||
dest instanceof Name ? dest.name : dest,
|
||||
/* keepEscapeSequence = */ true
|
||||
);
|
||||
if (destinations.has(destString)) {
|
||||
@ -1327,17 +1547,24 @@ class PDFEditor {
|
||||
}
|
||||
|
||||
// Get the kids.
|
||||
let kids = structTreeRoot.dict.get("K");
|
||||
if (!kids) {
|
||||
const rawKids = structTreeRoot.dict.getRaw("K");
|
||||
if (!rawKids) {
|
||||
continue;
|
||||
}
|
||||
kids = Array.isArray(kids) ? kids : [kids];
|
||||
const kids = await this.#resolveStructKids(rawKids, xref);
|
||||
for (let kid of kids) {
|
||||
const kidRef = kid instanceof Ref ? kid : null;
|
||||
if (kidRef && removedStructElements.has(kidRef)) {
|
||||
kid = await xref.fetchIfRefAsync(kid);
|
||||
if (!(kid instanceof Dict)) {
|
||||
continue;
|
||||
}
|
||||
kid = await xref.fetchIfRefAsync(kid);
|
||||
let setAsSpan = false;
|
||||
if (kidRef && removedStructElements.has(kidRef)) {
|
||||
if (!isName(kid.get("S"), "Link")) {
|
||||
continue;
|
||||
}
|
||||
setAsSpan = true;
|
||||
}
|
||||
const newKidRef = await this.#cloneStructTreeNode(
|
||||
kidRef,
|
||||
kid,
|
||||
@ -1349,6 +1576,12 @@ class PDFEditor {
|
||||
);
|
||||
if (newKidRef) {
|
||||
structTreeKids.push(newKidRef);
|
||||
if (kidRef) {
|
||||
oldRefMapping.put(kidRef, newKidRef);
|
||||
}
|
||||
if (setAsSpan) {
|
||||
this.xref[newKidRef.num].setIfName("S", "Span");
|
||||
}
|
||||
}
|
||||
}
|
||||
|
||||
@ -1406,7 +1639,7 @@ class PDFEditor {
|
||||
}
|
||||
const { destinations, pagesMap } = documentData;
|
||||
const newDestinations = (documentData.destinations = new Map());
|
||||
for (const [key, dest] of Object.entries(destinations)) {
|
||||
for (const [key, dest] of destinations) {
|
||||
const pageRef = dest[0];
|
||||
const pageData = pageRef instanceof Ref && pagesMap.get(pageRef);
|
||||
if (!pageData) {
|
||||
@ -1900,14 +2133,14 @@ class PDFEditor {
|
||||
* If the document has some fields but no Fields entry in the AcroForm, we
|
||||
* need to fix that by creating a Fields entry with the oldest parent field
|
||||
* for each field.
|
||||
* @param {Map<Ref, Ref>} fieldToParent
|
||||
* @param {RefSetCache} fieldToParent
|
||||
* @param {XRef} xref
|
||||
* @returns {Array<Ref>}
|
||||
*/
|
||||
#fixFields(fieldToParent, xref) {
|
||||
const newFields = [];
|
||||
const processed = new RefSet();
|
||||
for (const [fieldRef, parentRef] of fieldToParent) {
|
||||
for (const [fieldRef, parentRef] of fieldToParent.items()) {
|
||||
if (!parentRef) {
|
||||
newFields.push(fieldRef);
|
||||
continue;
|
||||
@ -2021,11 +2254,7 @@ class PDFEditor {
|
||||
if (data.parentRef) {
|
||||
newKid.set("Parent", data.parentRef);
|
||||
}
|
||||
if (
|
||||
acroFormDefaultAppearance &&
|
||||
isName(newKid.get("FT"), "Tx") &&
|
||||
!newKid.has("DA")
|
||||
) {
|
||||
if (acroFormDefaultAppearance && !newKid.has("DA")) {
|
||||
// Fix the DA later since we need to have all the fields tree.
|
||||
daToFix.push(newKid);
|
||||
}
|
||||
@ -2043,6 +2272,10 @@ class PDFEditor {
|
||||
}
|
||||
|
||||
for (const field of daToFix) {
|
||||
const fieldType = getInheritableProperty({ dict: field, key: "FT" });
|
||||
if (!isName(fieldType, "Tx")) {
|
||||
continue;
|
||||
}
|
||||
const da = getInheritableProperty({ dict: field, key: "DA" });
|
||||
if (!da) {
|
||||
// No DA in a parent field, we can set the default one.
|
||||
@ -2050,36 +2283,27 @@ class PDFEditor {
|
||||
}
|
||||
}
|
||||
const resourcesValuesCache = new Map();
|
||||
for (const field of drToFix) {
|
||||
const ap = field.get("AP");
|
||||
for (const [, value] of ap) {
|
||||
if (!(value instanceof BaseStream)) {
|
||||
continue;
|
||||
}
|
||||
let resources = value.dict.getRaw("Resources");
|
||||
if (!resources) {
|
||||
const newResourcesRef =
|
||||
await resourcesValuesCache.getOrInsertComputed(
|
||||
const fixAppearanceResources = async stream => {
|
||||
let resources = stream.dict.getRaw("Resources");
|
||||
resources &&= this.xrefWrapper.fetchIfRef(resources);
|
||||
if (!(resources instanceof Dict)) {
|
||||
const newResourcesRef = await resourcesValuesCache.getOrInsertComputed(
|
||||
acroFormDefaultResources,
|
||||
() => this.#cloneObject(acroFormDefaultResources, xref)
|
||||
);
|
||||
value.dict.set("Resources", newResourcesRef);
|
||||
continue;
|
||||
stream.dict.set("Resources", newResourcesRef);
|
||||
return;
|
||||
}
|
||||
|
||||
resources = xref.fetchIfRef(resources);
|
||||
for (const [
|
||||
resKey,
|
||||
resValue,
|
||||
] of acroFormDefaultResources.getRawEntries()) {
|
||||
if (!resources.has(resKey)) {
|
||||
if (resources.has(resKey)) {
|
||||
continue;
|
||||
}
|
||||
let newResValue = resValue;
|
||||
if (resValue instanceof Ref) {
|
||||
newResValue = await this.#collectDependencies(
|
||||
resValue,
|
||||
true,
|
||||
xref
|
||||
);
|
||||
newResValue = await this.#collectDependencies(resValue, true, xref);
|
||||
} else if (
|
||||
resValue instanceof Dict ||
|
||||
resValue instanceof BaseStream ||
|
||||
@ -2092,6 +2316,19 @@ class PDFEditor {
|
||||
}
|
||||
resources.set(resKey, newResValue);
|
||||
}
|
||||
};
|
||||
|
||||
for (const field of drToFix) {
|
||||
const ap = field.get("AP");
|
||||
for (const [, value] of ap) {
|
||||
if (value instanceof BaseStream) {
|
||||
await fixAppearanceResources(value);
|
||||
} else if (value instanceof Dict) {
|
||||
for (const [, stream] of value) {
|
||||
if (stream instanceof BaseStream) {
|
||||
await fixAppearanceResources(stream);
|
||||
}
|
||||
}
|
||||
}
|
||||
}
|
||||
}
|
||||
@ -2374,12 +2611,9 @@ class PDFEditor {
|
||||
const content =
|
||||
`q ${numberToString(drawW)} 0 0 ${numberToString(drawH)} ` +
|
||||
`${numberToString(tx)} ${numberToString(ty)} cm /Im0 Do Q`;
|
||||
const contentsDict = new Dict(this.xrefWrapper);
|
||||
const contentsStream = new Stream(
|
||||
stringToBytes(content),
|
||||
0,
|
||||
0,
|
||||
contentsDict
|
||||
const contentsStream = new StringStream(
|
||||
content,
|
||||
new Dict(this.xrefWrapper)
|
||||
);
|
||||
const contentsRef = this.newRef;
|
||||
this.xref[contentsRef.num] = contentsStream;
|
||||
@ -2459,7 +2693,15 @@ class PDFEditor {
|
||||
#makeNameNumTree(map, areNames) {
|
||||
const allEntries = map.sort(
|
||||
areNames
|
||||
? ([keyA], [keyB]) => keyA.localeCompare(keyB)
|
||||
? ([keyA], [keyB]) => {
|
||||
if (keyA < keyB) {
|
||||
return -1;
|
||||
}
|
||||
if (keyA > keyB) {
|
||||
return 1;
|
||||
}
|
||||
return 0;
|
||||
}
|
||||
: ([keyA], [keyB]) => keyA - keyB
|
||||
);
|
||||
const maxLeaves =
|
||||
@ -2502,7 +2744,7 @@ class PDFEditor {
|
||||
*/
|
||||
#makePageLabelsTree() {
|
||||
const { pageLabels } = this;
|
||||
if (!pageLabels || pageLabels.length === 0) {
|
||||
if (!pageLabels?.length) {
|
||||
return;
|
||||
}
|
||||
const { rootDict } = this;
|
||||
@ -2536,7 +2778,7 @@ class PDFEditor {
|
||||
/* keepEscapeSequence = */ true
|
||||
);
|
||||
for (let i = 1; ; i++) {
|
||||
const deduped = `${displayName}_${i}`;
|
||||
const deduped = stringToAsciiOrUTF16BE(`${displayName}_${i}`);
|
||||
if (!embeddedFiles.has(deduped)) {
|
||||
name = deduped;
|
||||
break;
|
||||
@ -2582,7 +2824,10 @@ class PDFEditor {
|
||||
this.namesDict.set(
|
||||
"Dests",
|
||||
this.#makeNameNumTree(
|
||||
Array.from(namedDestinations.entries()),
|
||||
Array.from(namedDestinations, ([name, dest]) => [
|
||||
stringToAsciiOrUTF16BE(name),
|
||||
dest,
|
||||
]),
|
||||
/* areNames = */ true
|
||||
)
|
||||
);
|
||||
@ -2590,7 +2835,7 @@ class PDFEditor {
|
||||
|
||||
#makeStructTree() {
|
||||
const { structTreeKids } = this;
|
||||
if (!structTreeKids || structTreeKids.length === 0) {
|
||||
if (!structTreeKids?.length) {
|
||||
return;
|
||||
}
|
||||
const { rootDict } = this;
|
||||
@ -2669,7 +2914,7 @@ class PDFEditor {
|
||||
acroForm.set("SigFlags", this.acroFormSigFlags);
|
||||
}
|
||||
acroForm.setIfArray("CO", this.acroFormCalculationOrder);
|
||||
acroForm.setIfDict("DR", this.acroFormDefaultResources);
|
||||
acroForm.setIfDefined("DR", this.acroFormDefaultResources);
|
||||
if (this.acroFormDefaultAppearance) {
|
||||
acroForm.set("DA", this.acroFormDefaultAppearance);
|
||||
}
|
||||
@ -2805,11 +3050,11 @@ class PDFEditor {
|
||||
offset += obj.length + 1;
|
||||
}
|
||||
streamBuffer[0] = objOffsets.join("\n");
|
||||
const objStream = new StringStream(streamBuffer.join("\n"));
|
||||
const objStreamDict = (objStream.dict = new Dict());
|
||||
objStreamDict.setIfName("Type", "ObjStm");
|
||||
objStreamDict.set("N", objRefs.length);
|
||||
objStreamDict.set("First", streamBuffer[0].length + 1);
|
||||
const dict = new Dict();
|
||||
dict.setIfName("Type", "ObjStm");
|
||||
dict.set("N", objRefs.length);
|
||||
dict.set("First", streamBuffer[0].length + 1);
|
||||
const objStream = new StringStream(streamBuffer.join("\n"), dict);
|
||||
|
||||
changes.put(objStreamRef, { data: objStream });
|
||||
}
|
||||
|
||||
@ -200,8 +200,7 @@ async function createImage(bitmap, xref, { closeBitmap = false } = {}) {
|
||||
const colorCounter = new Set();
|
||||
let hasAlpha = false;
|
||||
let useFlate = true;
|
||||
for (let i = 0, ii = buf32.length; i < ii; i++) {
|
||||
const v = buf32[i];
|
||||
for (const v of buf32) {
|
||||
if ((isLE ? v >>> 24 : v & 0xff) !== 0xff) {
|
||||
hasAlpha = true;
|
||||
break;
|
||||
|
||||
Some files were not shown because too many files have changed in this diff Show More
Loading…
x
Reference in New Issue
Block a user