Compare commits

..

No commits in common. "master" and "v6.0.227" have entirely different histories.

371 changed files with 6715 additions and 26065 deletions

27
.gitattributes vendored
View File

@ -1,24 +1,23 @@
# Force Unix line endings for most file formats (except binary files)
*.config 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
*.jsm text eol=lf
*.css text eol=lf
*.html 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
*.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
# 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

View File

@ -1,7 +1 @@
# 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
moz-fluent-linter==0.4.*

View File

@ -1,3 +1 @@
# 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
fonttools==4.*

View File

@ -16,13 +16,13 @@ jobs:
steps:
- name: Checkout repository
uses: actions/checkout@3d3c42e5aac5ba805825da76410c181273ba90b1 # v7.0.1
uses: actions/checkout@de0fac2e4500dabe0009e67214ff5f5447ce83dd # v6.0.2
with:
fetch-depth: 0
persist-credentials: false
- name: Use Node.js ${{ matrix.node-version }}
uses: actions/setup-node@820762786026740c76f36085b0efc47a31fe5020 # v7.0.0
uses: actions/setup-node@48b55a011bda9f5d6aeb4c2d9c7362e8dae4041e # v6.4.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@55cc8345863c7cc4c66a329aec7e433d2d1c52a9 # v6.1.0
uses: actions/cache/restore@27d5ce7f107fe9357f9df03efb73ab90386fccae # v5.0.5
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@55cc8345863c7cc4c66a329aec7e433d2d1c52a9 # v6.1.0
uses: actions/cache/save@27d5ce7f107fe9357f9df03efb73ab90386fccae # v5.0.5
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
uses: codecov/codecov-action@e79a6962e0d4c0c17b229090214935d2e33f8354 # v6.0.1
with:
token: ${{ secrets.CODECOV_TOKEN }}
fail_ci_if_error: true

View File

@ -18,19 +18,19 @@ jobs:
steps:
- name: Checkout repository
uses: actions/checkout@3d3c42e5aac5ba805825da76410c181273ba90b1 # v7.0.1
uses: actions/checkout@de0fac2e4500dabe0009e67214ff5f5447ce83dd # v6.0.2
with:
fetch-depth: 0
persist-credentials: false
- name: Initialize CodeQL
uses: github/codeql-action/init@e0647621c2984b5ed2f768cb892365bf2a616ad1 # v4.37.2
uses: github/codeql-action/init@9e0d7b8d25671d64c341c19c0152d693099fb5ba # v4.35.5
with:
languages: ${{ matrix.language }}
queries: security-and-quality
- name: Autobuild CodeQL
uses: github/codeql-action/autobuild@e0647621c2984b5ed2f768cb892365bf2a616ad1 # v4.37.2
uses: github/codeql-action/autobuild@9e0d7b8d25671d64c341c19c0152d693099fb5ba # v4.35.5
- name: Perform CodeQL analysis
uses: github/codeql-action/analyze@e0647621c2984b5ed2f768cb892365bf2a616ad1 # v4.37.2
uses: github/codeql-action/analyze@9e0d7b8d25671d64c341c19c0152d693099fb5ba # v4.35.5

View File

@ -1,101 +0,0 @@
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

View File

@ -4,7 +4,6 @@ on:
paths:
- 'l10n/en-US/**.ftl'
- '.github/fluent_linter_config.yml'
- '.github/fluent_linter_requirements.txt'
- '.github/workflows/fluent_linter.yml'
branches:
- master
@ -12,7 +11,6 @@ on:
paths:
- 'l10n/en-US/**.ftl'
- '.github/fluent_linter_config.yml'
- '.github/fluent_linter_requirements.txt'
- '.github/workflows/fluent_linter.yml'
branches:
- master
@ -27,12 +25,12 @@ jobs:
steps:
- name: Checkout repository
uses: actions/checkout@3d3c42e5aac5ba805825da76410c181273ba90b1 # v7.0.1
uses: actions/checkout@de0fac2e4500dabe0009e67214ff5f5447ce83dd # v6.0.2
with:
persist-credentials: false
- name: Use Python 3.14
uses: actions/setup-python@5fda3b95a4ea91299a34e894583c3862153e4b97 # v7.0.0
uses: actions/setup-python@a309ff8b426b58ec0e2a45f0f869d46889d02405 # v6.2.0
with:
python-version: '3.14'
cache: 'pip'

View File

@ -3,24 +3,18 @@ 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
@ -49,13 +43,13 @@ jobs:
steps:
- name: Checkout repository
uses: actions/checkout@3d3c42e5aac5ba805825da76410c181273ba90b1 # v7.0.1
uses: actions/checkout@de0fac2e4500dabe0009e67214ff5f5447ce83dd # v6.0.2
with:
fetch-depth: 0
persist-credentials: false
- name: Use Node.js ${{ matrix.node-version }}
uses: actions/setup-node@820762786026740c76f36085b0efc47a31fe5020 # v7.0.0
uses: actions/setup-node@48b55a011bda9f5d6aeb4c2d9c7362e8dae4041e # v6.4.0
with:
node-version: ${{ matrix.node-version }}
cache: 'npm'
@ -64,7 +58,7 @@ jobs:
run: npm ci
- name: Use Python 3.14
uses: actions/setup-python@5fda3b95a4ea91299a34e894583c3862153e4b97 # v7.0.0
uses: actions/setup-python@a309ff8b426b58ec0e2a45f0f869d46889d02405 # v6.0.2
with:
python-version: '3.14'
cache: 'pip'
@ -77,7 +71,7 @@ jobs:
run: npx gulp fonttest --headless --coverage --coverage-output build/coverage/font ${{ matrix.skip }}
- name: Upload results to Codecov
uses: codecov/codecov-action@fb8b3582c8e4def4969c97caa2f19720cb33a72f # v7.0.0
uses: codecov/codecov-action@e79a6962e0d4c0c17b229090214935d2e33f8354 # v6.0.1
with:
token: ${{ secrets.CODECOV_TOKEN }}
fail_ci_if_error: true

View File

@ -3,8 +3,7 @@ on:
push:
paths:
- 'gulpfile.mjs'
- 'external/**'
- 'package-lock.json'
- 'external/builder/**'
- 'src/**'
- 'test/test.mjs'
- 'test/integration/**'
@ -15,8 +14,7 @@ on:
pull_request:
paths:
- 'gulpfile.mjs'
- 'external/**'
- 'package-lock.json'
- 'external/builder/**'
- 'src/**'
- 'test/test.mjs'
- 'test/integration/**'
@ -49,13 +47,13 @@ jobs:
steps:
- name: Checkout repository
uses: actions/checkout@3d3c42e5aac5ba805825da76410c181273ba90b1 # v7.0.1
uses: actions/checkout@de0fac2e4500dabe0009e67214ff5f5447ce83dd # v6.0.2
with:
fetch-depth: 0
persist-credentials: false
- name: Use Node.js ${{ matrix.node-version }}
uses: actions/setup-node@820762786026740c76f36085b0efc47a31fe5020 # v7.0.0
uses: actions/setup-node@48b55a011bda9f5d6aeb4c2d9c7362e8dae4041e # v6.4.0
with:
node-version: ${{ matrix.node-version }}
cache: 'npm'
@ -64,7 +62,7 @@ jobs:
run: npm ci
- name: Restore cached PDF files
uses: actions/cache/restore@55cc8345863c7cc4c66a329aec7e433d2d1c52a9 # v6.1.0
uses: actions/cache/restore@27d5ce7f107fe9357f9df03efb73ab90386fccae # v5.0.5
with:
path: test/pdfs/*.pdf
key: cached-pdf-files-${{ hashFiles('test/pdfs/*.pdf') }}
@ -89,14 +87,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@55cc8345863c7cc4c66a329aec7e433d2d1c52a9 # v6.1.0
uses: actions/cache/save@27d5ce7f107fe9357f9df03efb73ab90386fccae # v5.0.5
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
uses: codecov/codecov-action@e79a6962e0d4c0c17b229090214935d2e33f8354 # v6.0.1
with:
token: ${{ secrets.CODECOV_TOKEN }}
fail_ci_if_error: true

View File

@ -15,13 +15,13 @@ jobs:
steps:
- name: Checkout repository
uses: actions/checkout@3d3c42e5aac5ba805825da76410c181273ba90b1 # v7.0.1
uses: actions/checkout@de0fac2e4500dabe0009e67214ff5f5447ce83dd # v6.0.2
with:
fetch-depth: 0
persist-credentials: false
- name: Use Node.js ${{ matrix.node-version }}
uses: actions/setup-node@820762786026740c76f36085b0efc47a31fe5020 # v7.0.0
uses: actions/setup-node@48b55a011bda9f5d6aeb4c2d9c7362e8dae4041e # v6.4.0
with:
node-version: ${{ matrix.node-version }}
cache: 'npm'

View File

@ -16,7 +16,7 @@ jobs:
steps:
- name: Checkout repository
uses: actions/checkout@3d3c42e5aac5ba805825da76410c181273ba90b1 # v7.0.1
uses: actions/checkout@de0fac2e4500dabe0009e67214ff5f5447ce83dd # v6.0.2
with:
fetch-depth: 1
persist-credentials: false

View File

@ -15,13 +15,13 @@ jobs:
steps:
- name: Checkout repository
uses: actions/checkout@3d3c42e5aac5ba805825da76410c181273ba90b1 # v7.0.1
uses: actions/checkout@de0fac2e4500dabe0009e67214ff5f5447ce83dd # v6.0.2
with:
fetch-depth: 0
persist-credentials: false
- name: Use Node.js ${{ matrix.node-version }}
uses: actions/setup-node@820762786026740c76f36085b0efc47a31fe5020 # v7.0.0
uses: actions/setup-node@48b55a011bda9f5d6aeb4c2d9c7362e8dae4041e # v6.4.0
with:
node-version: ${{ matrix.node-version }}
cache: 'npm'

View File

@ -1,185 +0,0 @@
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

View File

@ -17,13 +17,13 @@ jobs:
steps:
- name: Checkout repository
uses: actions/checkout@3d3c42e5aac5ba805825da76410c181273ba90b1 # v7.0.1
uses: actions/checkout@de0fac2e4500dabe0009e67214ff5f5447ce83dd # v6.0.2
with:
fetch-depth: 0
persist-credentials: false
- name: Use Node.js ${{ matrix.node-version }}
uses: actions/setup-node@820762786026740c76f36085b0efc47a31fe5020 # v7.0.0
uses: actions/setup-node@48b55a011bda9f5d6aeb4c2d9c7362e8dae4041e # v6.4.0
with:
node-version: ${{ matrix.node-version }}
cache: 'npm'

View File

@ -6,12 +6,6 @@ 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
@ -23,13 +17,13 @@ jobs:
steps:
- name: Checkout repository
uses: actions/checkout@3d3c42e5aac5ba805825da76410c181273ba90b1 # v7.0.1
uses: actions/checkout@de0fac2e4500dabe0009e67214ff5f5447ce83dd # v6.0.2
with:
fetch-depth: 0
persist-credentials: false
- name: Use Node.js ${{ matrix.node-version }}
uses: actions/setup-node@820762786026740c76f36085b0efc47a31fe5020 # v7.0.0
uses: actions/setup-node@48b55a011bda9f5d6aeb4c2d9c7362e8dae4041e # v6.4.0
with:
node-version: ${{ matrix.node-version }}
cache: 'npm'

View File

@ -15,13 +15,13 @@ jobs:
steps:
- name: Checkout repository
uses: actions/checkout@3d3c42e5aac5ba805825da76410c181273ba90b1 # v7.0.1
uses: actions/checkout@de0fac2e4500dabe0009e67214ff5f5447ce83dd # v6.0.2
with:
fetch-depth: 0
persist-credentials: false
- name: Use Node.js ${{ matrix.node-version }}
uses: actions/setup-node@820762786026740c76f36085b0efc47a31fe5020 # v7.0.0
uses: actions/setup-node@48b55a011bda9f5d6aeb4c2d9c7362e8dae4041e # v6.4.0
with:
node-version: ${{ matrix.node-version }}
cache: 'npm'

View File

@ -3,8 +3,7 @@ on:
push:
paths:
- 'gulpfile.mjs'
- 'external/**'
- 'package-lock.json'
- 'external/builder/**'
- 'src/**'
- 'test/test.mjs'
- 'test/unit/**'
@ -15,8 +14,7 @@ on:
pull_request:
paths:
- 'gulpfile.mjs'
- 'external/**'
- 'package-lock.json'
- 'external/builder/**'
- 'src/**'
- 'test/test.mjs'
- 'test/unit/**'
@ -49,13 +47,13 @@ jobs:
steps:
- name: Checkout repository
uses: actions/checkout@3d3c42e5aac5ba805825da76410c181273ba90b1 # v7.0.1
uses: actions/checkout@de0fac2e4500dabe0009e67214ff5f5447ce83dd # v6.0.2
with:
fetch-depth: 0
persist-credentials: false
- name: Use Node.js ${{ matrix.node-version }}
uses: actions/setup-node@820762786026740c76f36085b0efc47a31fe5020 # v7.0.0
uses: actions/setup-node@48b55a011bda9f5d6aeb4c2d9c7362e8dae4041e # v6.4.0
with:
node-version: ${{ matrix.node-version }}
cache: 'npm'
@ -64,7 +62,7 @@ jobs:
run: npm ci
- name: Restore cached PDF files
uses: actions/cache/restore@55cc8345863c7cc4c66a329aec7e433d2d1c52a9 # v6.1.0
uses: actions/cache/restore@27d5ce7f107fe9357f9df03efb73ab90386fccae # v5.0.5
with:
path: test/pdfs/*.pdf
key: cached-pdf-files-${{ hashFiles('test/pdfs/*.pdf') }}
@ -76,14 +74,14 @@ jobs:
run: npx gulp unittest --headless --coverage --coverage-output build/coverage/unit ${{ matrix.skip }}
- name: Save cached PDF files
uses: actions/cache/save@55cc8345863c7cc4c66a329aec7e433d2d1c52a9 # v6.1.0
uses: actions/cache/save@27d5ce7f107fe9357f9df03efb73ab90386fccae # v5.0.5
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
uses: codecov/codecov-action@e79a6962e0d4c0c17b229090214935d2e33f8354 # v6.0.1
with:
token: ${{ secrets.CODECOV_TOKEN }}
fail_ci_if_error: true

View File

@ -23,13 +23,13 @@ jobs:
private-key: ${{ secrets.APP_PRIVATE_KEY }}
- name: Checkout repository
uses: actions/checkout@3d3c42e5aac5ba805825da76410c181273ba90b1 # v7.0.1
uses: actions/checkout@de0fac2e4500dabe0009e67214ff5f5447ce83dd # v6.0.2
with:
token: ${{ steps.app-token.outputs.token }}
persist-credentials: false
- name: Use Node.js LTS
uses: actions/setup-node@820762786026740c76f36085b0efc47a31fe5020 # v7.0.0
uses: actions/setup-node@48b55a011bda9f5d6aeb4c2d9c7362e8dae4041e # v6.4.0
with:
node-version: lts/*
cache: 'npm'

View File

@ -1,13 +1,9 @@
{
"chrome": {
"skipDownload": true,
"version": "stable"
},
"chrome-headless-shell": {
"skipDownload": true
"skipDownload": false
},
"firefox": {
"skipDownload": true,
"skipDownload": false,
"version": "nightly"
}
}

View File

@ -46,7 +46,7 @@ directory `build/chromium`.
### PDF debugger
Browse the internal structure of a PDF document with https://mozilla.github.io/pdf.js/internal-viewer/web/debugger.html
Browser the internal structure of a PDF document with https://mozilla.github.io/pdf.js/internal-viewer/web/debugger.html
## Getting the Code
@ -91,88 +91,6 @@ 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

View File

@ -178,11 +178,6 @@ 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",

View File

@ -192,7 +192,7 @@ function renderDefaultZoomValue(shortDescription) {
document.getElementById("settings-boxes").append(wrapper);
function renderPreference(value) {
value ||= "auto";
value = value || "auto";
select.value = value;
var customOption = select.querySelector("option.custom-zoom");
if (select.selectedIndex === -1 && value) {

View File

@ -150,7 +150,7 @@ limitations under the License.
*/
function didUpdateSinceLastCheck() {
var chromeVersion = /Chrome\/(\d+)\./.exec(navigator.userAgent);
chromeVersion &&= chromeVersion[1];
chromeVersion = chromeVersion && chromeVersion[1];
if (!chromeVersion || localStorage.telemetryLastVersion === chromeVersion) {
return false;
}

View File

@ -319,16 +319,6 @@ function babelPluginStripSrcPath() {
};
}
function babelPluginAddHeaderComment(babel, { header }) {
return {
visitor: {
Program(path) {
path.addComment("leading", header);
},
},
};
}
function preprocessPDFJSCode(ctx, content) {
return transformSync(content, {
configFile: false,
@ -337,7 +327,6 @@ function preprocessPDFJSCode(ctx, content) {
}
export {
babelPluginAddHeaderComment,
babelPluginPDFJSPreprocessor,
babelPluginStripSrcPath,
preprocessPDFJSCode,

View File

@ -73,7 +73,10 @@ function preprocess(inFilename, outFilename, defines) {
const out = [];
let i = 0;
function readLine() {
return i < totalLines ? lines[i++] : null;
if (i < totalLines) {
return lines[i++];
}
return null;
}
const writeLine =
typeof outFilename === "function"
@ -110,9 +113,16 @@ function preprocess(inFilename, outFilename, defines) {
const realPath = fs.realpathSync(inFilename);
const dir = path.dirname(realPath);
try {
const fullpath = file.startsWith("$ROOT/")
? path.join(__dirname, "../..", file.substring("$ROOT/".length))
: path.join(dir, file);
let fullpath;
if (file.indexOf("$ROOT/") === 0) {
fullpath = path.join(
__dirname,
"../..",
file.substring("$ROOT/".length)
);
} else {
fullpath = path.join(dir, file);
}
preprocess(fullpath, writeLine, defines);
} catch (e) {
if (e.code === "ENOENT") {
@ -124,7 +134,10 @@ function preprocess(inFilename, outFilename, defines) {
function expand(line) {
line = line.replaceAll(/__\w+__/g, function (variable) {
variable = variable.substring(2, variable.length - 2);
return variable in defines ? defines[variable] : "";
if (variable in defines) {
return defines[variable];
}
return "";
});
writeLine(line);
}

View File

@ -20,46 +20,26 @@ import path from "path";
const __dirname = import.meta.dirname;
const PROJECT_ROOT = path.join(__dirname, "../..");
// 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({
const { values } = parseArgs({
args: process.argv.slice(2),
options: {
code: { type: "string" },
index: { type: "string", default: "build/per-test-index.json" },
"no-download": { type: "boolean", default: false },
"coverage-dir": { type: "string", default: "build/coverage" },
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> [--index=<path>] [--no-download]\n\n" +
"Usage: coverage_search.mjs --code=<file>::<line|function> [--coverage-dir=<path>]\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" +
" --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" +
" --coverage-dir Coverage directory containing per-test-index.json [build/coverage]\n\n" +
"Prints to stdout the IDs of tests whose coverage includes the given line or\n" +
"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}`
"function (one ID per line).\n" +
"Run browsertest with --coverage-per-test first to generate the index."
);
process.exit(values.help ? 0 : 1);
}
@ -78,129 +58,18 @@ const isLine = /^\d+$/.test(location);
const lineNum = isLine ? parseInt(location, 10) : null;
const funcName = isLine ? null : location;
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 coverageDir = path.isAbsolute(values["coverage-dir"])
? values["coverage-dir"]
: path.join(PROJECT_ROOT, values["coverage-dir"]);
const indexPath = path.join(coverageDir, "per-test-index.json");
if (!fs.existsSync(indexPath)) {
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."
);
console.error(`Error: index file not found: ${indexPath}`);
console.error("Run browsertest with --coverage-per-test first.");
process.exit(1);
}
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);
}
const { ids, files } = JSON.parse(fs.readFileSync(indexPath, "utf8"));
// Find the file entry whose path matches fileName.
let fileEntry = null;

View File

@ -386,7 +386,7 @@ function writeNumber(n) {
if (buffer > 0) {
s = writeByte((buffer & 0x7f) | (s.length > 0 ? 0x80 : 0)) + s;
}
while (s.startsWith("80")) {
while (s.indexOf("80") === 0) {
s = s.substring(2);
}
return s;

45
external/qcms/qcms.js vendored
View File

@ -1,5 +1,5 @@
/* THIS FILE IS GENERATED - DO NOT EDIT */
import { copy_result } from './qcms_utils.js';
import { copy_result, copy_rgb, make_cssRGB } from './qcms_utils.js';
/**
@ -25,20 +25,16 @@ 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, add_alpha) {
export function qcms_convert_array(transformer, src) {
const ptr0 = passArray8ToWasm0(src, wasm.__wbindgen_malloc);
const len0 = WASM_VECTOR_LEN;
wasm.qcms_convert_array(transformer, ptr0, len0, add_alpha);
wasm.qcms_convert_array(transformer, ptr0, len0);
}
/**
@ -50,11 +46,10 @@ export function qcms_convert_array(transformer, src, add_alpha) {
* @param {number} src2
* @param {number} src3
* @param {number} src4
* @returns {number}
* @param {boolean} 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;
export function qcms_convert_four(transformer, src1, src2, src3, src4, css) {
wasm.qcms_convert_four(transformer, src1, src2, src3, src4, css);
}
/**
@ -63,11 +58,10 @@ export function qcms_convert_four(transformer, src1, src2, src3, src4) {
* This function is called directly from JavaScript.
* @param {number} transformer
* @param {number} src
* @returns {number}
* @param {boolean} css
*/
export function qcms_convert_one(transformer, src) {
const ret = wasm.qcms_convert_one(transformer, src);
return ret >>> 0;
export function qcms_convert_one(transformer, src, css) {
wasm.qcms_convert_one(transformer, src, css);
}
/**
@ -78,11 +72,10 @@ export function qcms_convert_one(transformer, src) {
* @param {number} src1
* @param {number} src2
* @param {number} src3
* @returns {number}
* @param {boolean} css
*/
export function qcms_convert_three(transformer, src1, src2, src3) {
const ret = wasm.qcms_convert_three(transformer, src1, src2, src3);
return ret >>> 0;
export function qcms_convert_three(transformer, src1, src2, src3, css) {
wasm.qcms_convert_three(transformer, src1, src2, src3, css);
}
/**
@ -113,12 +106,18 @@ export function qcms_transformer_from_memory(mem, in_type, intent) {
function __wbg_get_imports() {
const import0 = {
__proto__: null,
__wbg___wbindgen_throw_344f42d3211c4765: function(arg0, arg1) {
__wbg___wbindgen_throw_6b64449b9b9ed33c: 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);
@ -136,7 +135,8 @@ function __wbg_get_imports() {
}
function getStringFromWasm0(ptr, len) {
return decodeText(ptr >>> 0, len);
ptr = ptr >>> 0;
return decodeText(ptr, len);
}
let cachedUint8ArrayMemory0 = null;
@ -170,9 +170,8 @@ function decodeText(ptr, len) {
let WASM_VECTOR_LEN = 0;
let wasmModule, wasmInstance, wasm;
let wasmModule, wasm;
function __wbg_finalize_init(instance, module) {
wasmInstance = instance;
wasm = instance.exports;
wasmModule = module;
cachedUint8ArrayMemory0 = null;

Binary file not shown.

View File

@ -13,28 +13,22 @@
* 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;
// Where the next `qcms_convert_array` result should land.
static _mustAddAlpha = false;
static _destBuffer = null;
static _destOffset = 0;
// 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 _destLength = 0;
static _cssColor = "";
static _makeHexColor = null;
static get _memoryArray() {
const array = this.#memoryArray;
@ -48,31 +42,43 @@ 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. 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) {
// to the destination buffer without any intermediate copies.
const { _mustAddAlpha, _destBuffer, _destOffset, _destLength, _memoryArray } =
QCMS;
if (len === _destLength) {
_destBuffer.set(_memoryArray.subarray(ptr, ptr + len), _destOffset);
return;
}
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);
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;
}
return;
}
for (let i = ptr, ii = ptr + len, j = _destOffset; i < ii; i += 4, j += 4) {
} else {
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];
}
}
}
export { copy_result, QCMS };
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 };

View File

@ -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(;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)};
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)};
e.stringToNewUTF8=T;
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});
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});
;return moduleRtn}export default QuickJS;

Binary file not shown.

View File

@ -13,9 +13,7 @@
* limitations under the License.
*/
import * as babel from "@babel/core";
import {
babelPluginAddHeaderComment,
babelPluginPDFJSPreprocessor,
babelPluginStripSrcPath,
preprocessPDFJSCode,
@ -26,6 +24,7 @@ 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";
@ -105,11 +104,11 @@ const AUTOPREFIXER_CONFIG = {
// Default Babel targets used for generic, components, minified-pre
const BABEL_TARGETS = ENV_TARGETS.join(", ");
const BABEL_COREJS_OPTS = Object.freeze({
method: "usage-global",
version: "3.49.0",
const BABEL_PRESET_ENV_OPTS = Object.freeze({
corejs: "3.49.0",
exclude: ["web.structured-clone"],
shippedProposals: true,
useBuiltIns: "usage",
});
const DEFINES = Object.freeze({
@ -226,8 +225,6 @@ 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",
};
@ -328,7 +325,9 @@ function createWebpackConfig(
/node_modules[\\/]core-js/,
];
const babelPresets = skipBabel ? undefined : ["@babel/preset-env"];
const babelPresets = skipBabel
? undefined
: [["@babel/preset-env", BABEL_PRESET_ENV_OPTS]];
const babelPlugins = [
[
babelPluginPDFJSPreprocessor,
@ -338,9 +337,6 @@ function createWebpackConfig(
},
],
];
if (!skipBabel) {
babelPlugins.push(["babel-plugin-polyfill-corejs3", BABEL_COREJS_OPTS]);
}
if (bundleDefines.COVERAGE) {
babelPlugins.push("babel-plugin-istanbul");
}
@ -793,18 +789,36 @@ function runTests(testsName, { bot = false } = {}) {
args.push("--coveragePerTest");
}
if (testsName === "browser") {
let shouldRun;
try {
shouldRun = applyCodeTestFilter(args);
} catch (error) {
reject(error);
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"));
return;
}
if (!shouldRun) {
const testIds = result.stdout.trim().split("\n").filter(Boolean);
if (testIds.length === 0) {
console.log(`\n### No tests found covering "${codeArg}"`);
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" });
@ -870,136 +884,6 @@ 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");
@ -1048,18 +932,6 @@ 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) {
@ -1070,33 +942,34 @@ function makeRef(done, bot) {
});
}
// 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).
// 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
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;
}
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(
result.error
? `coverage_search failed: ${result.error.message}`
: `coverage_search failed (exit code ${result.status})`
)
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);
}
if (result.status !== 0) {
done(new Error("coverage_search failed"));
return;
}
done();
@ -1157,7 +1030,10 @@ function createBuildNumber(done) {
const version = config.versionPrefix + buildNumber;
exec('git log --format="%h" -n 1', function (err2, stdout2, stderr2) {
const buildCommit = !err2 ? stdout2.replace("\n", "") : "";
let buildCommit = "";
if (!err2) {
buildCommit = stdout2.replace("\n", "");
}
createStringSource(
"version.json",
@ -1810,9 +1686,9 @@ function buildLibHelper(bundleDefines, inputStream, outputDir) {
const licenseHeader = fs
.readFileSync("./src/license_header.js")
.toString()
.trim()
.replace(/^\/\*/, "")
.replace(/\*\/$/, "");
.split("\n")
.slice(1, -2)
.map(line => line.replace(/^\s*\*\s?/, ""));
const ctx = {
rootPath: __dirname,
@ -1852,9 +1728,6 @@ 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",
@ -1864,16 +1737,28 @@ function buildLibHelper(bundleDefines, inputStream, outputDir) {
},
]);
}
plugins.push([babelPluginAddHeaderComment, { header: licenseHeader }]);
plugins.push([
"add-header-comment",
{
header: licenseHeader,
},
]);
const result = babel.transformSync(file.contents.toString(), {
const result = babel.transform(file.contents.toString(), {
...(enableCoverage && {
filename: file.path,
babelrc: false,
configFile: false,
}),
sourceType: "module",
presets: skipBabel ? undefined : ["@babel/preset-env"],
presets: skipBabel
? undefined
: [
[
"@babel/preset-env",
{ ...BABEL_PRESET_ENV_OPTS, loose: false, modules: false },
],
],
plugins,
targets: BABEL_TARGETS,
sourceMaps: enableSourceMaps,
@ -2514,71 +2399,6 @@ 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");
@ -2643,7 +2463,7 @@ gulp.task("lint", function (done) {
return;
}
gulp.series("lint-licenses", "lint-chmod", "lint-bom")(done);
gulp.series("lint-licenses", "lint-chmod")(done);
});
});

View File

@ -153,19 +153,6 @@ 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
@ -777,49 +764,6 @@ 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 =

View File

@ -153,28 +153,6 @@ 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
@ -762,79 +740,6 @@ 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 =

View File

@ -386,16 +386,3 @@ 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 = Сертификат: с изтекъл срок на валидност

View File

@ -5,194 +5,18 @@
## 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 = خا
@ -200,12 +24,6 @@ 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 = ٱووردن یا آلشت شؽواتا
@ -217,14 +35,6 @@ 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 = آلشتگر هؽل
@ -234,55 +44,15 @@ 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
@ -294,32 +64,4 @@ 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 = نۊ

View File

@ -153,29 +153,6 @@ 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
@ -771,84 +748,6 @@ 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 =

View File

@ -153,31 +153,6 @@ 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
@ -789,94 +764,6 @@ 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 =

View File

@ -660,10 +660,7 @@ 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 =
@ -681,7 +678,6 @@ 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 =
@ -703,8 +699,6 @@ 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 =
@ -717,10 +711,6 @@ 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

View File

@ -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 den Uhrzeigersinn drehen
pdfjs-page-rotate-ccw-button-label = Gegen den Uhrzeigersinn drehen
.title = Gegen Uhrzeigersinn drehen
pdfjs-page-rotate-ccw-button-label = Gegen Uhrzeigersinn drehen
pdfjs-cursor-text-select-tool-button =
.title = Textauswahl-Werkzeug aktivieren
pdfjs-cursor-text-select-tool-button-label = Textauswahl-Werkzeug
@ -153,27 +153,6 @@ 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
@ -299,7 +278,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 = [{ $type } Anmerkung]
.alt = [Anlage: { $type }]
# Variables:
# $dateObj (Date) - the modification date and time of the annotation
pdfjs-annotation-date-time-string = { DATETIME($dateObj, dateStyle: "short", timeStyle: "medium") }
@ -626,7 +605,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 Unterschrift umwandeln
pdfjs-editor-add-signature-image-no-data-error-title = Kann Grafik nicht in eine Signatur 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
@ -730,9 +709,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 nicht möglich. Aktualisieren Sie die Seite und versuchen Sie es erneut.
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-copy-label = Kopieren 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-delete-label = Löschen war 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
@ -753,79 +732,11 @@ 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 Unterschrift entfernen
pdfjs-editor-delete-signature-button-label1 = Gespeicherte Unterschrift entfernen
.title = Gespeicherte Signatur entfernen
pdfjs-editor-delete-signature-button-label1 = Gespeicherte Signatur entfernen
## Editor toolbar

View File

@ -153,29 +153,6 @@ 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
@ -771,84 +748,6 @@ 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 =

View File

@ -153,27 +153,6 @@ 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
@ -753,74 +732,6 @@ 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 =

View File

@ -153,27 +153,6 @@ 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
@ -753,74 +732,6 @@ 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 =

View File

@ -785,96 +785,3 @@ 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 })
}

View File

@ -153,27 +153,6 @@ 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
@ -753,74 +732,6 @@ 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 =

View File

@ -153,27 +153,6 @@ 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
@ -753,74 +732,6 @@ 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 =

View File

@ -153,27 +153,6 @@ 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
@ -753,74 +732,6 @@ 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 =

View File

@ -153,7 +153,6 @@ 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
@ -162,8 +161,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 está completamente soportada por este navegador.
pdfjs-printing-not-ready = Advertencia: El PDF no cargó completamente para impresión.
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.
## Tooltips and alt text for side panel toolbar buttons
@ -266,7 +265,7 @@ pdfjs-page-landmark =
## Loading indicator messages
pdfjs-loading-error = Un error ocurrió al cargar el PDF.
pdfjs-invalid-file-error = Archivo PDF inválido o dañado.
pdfjs-invalid-file-error = Archivo PDF invalido 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.
@ -361,7 +360,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 = Grosor
pdfjs-editor-ink-thickness-input = Grossor
pdfjs-editor-ink-opacity-input = Opacidad
pdfjs-editor-stamp-add-image-button =
.title = Agregar imagen
@ -581,7 +580,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 = Grosor
pdfjs-editor-add-signature-draw-thickness-range-label = Grossor
# Variables:
# $thickness (Number) - the thickness (in pixels) of the line used to draw a signature.
pdfjs-editor-add-signature-draw-thickness-range =
@ -698,15 +697,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 página copiada
*[other] { $count } páginas copiadas
[one] 1 pagina copiada
*[other] { $count } paginas copiadas
}
# Variables:
# $count (Number) - the number of selected pages to be deleted.
pdfjs-views-manager-pages-status-undo-delete-label =
{ $count ->
[one] 1 página eliminada
*[other] { $count } páginas eliminadas
[one] 1 pagina eliminada
*[other] { $count } paginas eliminadas
}
pdfjs-views-manager-pages-status-waiting-ready-label = Preparando tu archivo…
pdfjs-views-manager-pages-status-waiting-uploading-label = Subiendo archivo…

View File

@ -153,27 +153,6 @@ 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
@ -422,11 +401,11 @@ pdfjs-editor-comments-sidebar-no-comments-link = Argibide gehiago
## Alt-text dialog
pdfjs-editor-alt-text-button-label = Ordezko testua
pdfjs-editor-alt-text-button-label = Testu alternatiboa
pdfjs-editor-alt-text-edit-button =
.aria-label = Editatu ordezko testua
.aria-label = Editatu testu alternatiboa
pdfjs-editor-alt-text-dialog-label = Aukeratu aukera
pdfjs-editor-alt-text-dialog-description = Ordezko testuak laguntzen du jendeak ezin duenean irudia ikusi edo ez denean kargatzen.
pdfjs-editor-alt-text-dialog-description = Testu alternatiboak 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
@ -439,7 +418,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 = Ordezko testua
.aria-label = Testu alternatiboa
## Editor resizers
## This is used in an aria label to help to understand the role of the resizer.
@ -491,38 +470,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 ordezko testua (irudiaren azalpena)
pdfjs-editor-new-alt-text-dialog-edit-label = Editatu testu alternatiboa (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 ordezko testua (irudiaren azalpena)
pdfjs-editor-new-alt-text-dialog-add-label = Gehitu testu alternatiboa (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 = Ordezko testu hau automatikoki sortu da eta okerra izan liteke.
pdfjs-editor-new-alt-text-disclaimer1 = Testu alternatibo 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 ordezko testua automatikoki
pdfjs-editor-new-alt-text-create-automatically-button-label = Sortu testu alternatiboa automatikoki
pdfjs-editor-new-alt-text-not-now-button = Une honetan ez
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-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-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 = Ordezko testuaren AA modeloa deskargatzen ({ $downloadedSize }/{ $totalSize } MB)
.aria-valuetext = Ordezko testuaren AA modeloa deskargatzen ({ $downloadedSize }/{ $totalSize } MB)
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)
# 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 = Ordezko testua gehituta
pdfjs-editor-new-alt-text-added-button-label = Ordezko testua gehituta
.aria-label = Testu alternatiboa gehituta
pdfjs-editor-new-alt-text-added-button-label = Testu alternatiboa 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 = Ordezko testua falta da
pdfjs-editor-new-alt-text-missing-button-label = Ordezko testua falta da
.aria-label = Testu alternatiboa falta da
pdfjs-editor-new-alt-text-missing-button-label = Testu alternatiboa 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 ordezko testua
pdfjs-editor-new-alt-text-to-review-button-label = Berrikusi ordezko testua
.aria-label = Berrikusi testu alternatiboa
pdfjs-editor-new-alt-text-to-review-button-label = Berrikusi testu alternatiboa
# "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.
@ -531,22 +510,22 @@ pdfjs-editor-new-alt-text-generated-alt-text-with-disclaimer = Automatikoki sort
## Image alt-text settings
pdfjs-image-alt-text-settings-button =
.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
.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
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 = 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-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-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 = 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-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-close-button = Itxi
## Accessibility labels (announced by screen readers) for objects added to the editor.
@ -584,7 +563,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 (ordezko testu modura ere erabiltzen dena) eta sinadura
dezake (testu alternatibo modura ere erabiltzen dena) eta sinadura
gordetzeko aukera du gehiagotan erabili ahal izateko.
pdfjs-editor-add-signature-dialog-title = Gehitu sinadura
@ -619,9 +598,9 @@ pdfjs-editor-add-signature-image-browse-link =
## Controls
pdfjs-editor-add-signature-description-label = Azalpena (ordezko testua)
pdfjs-editor-add-signature-description-label = Azalpena (testu alternatiboa)
pdfjs-editor-add-signature-description-input =
.title = Azalpena (ordezko testua)
.title = Azalpena (testu alternatiboa)
pdfjs-editor-add-signature-description-default-when-drawing = Sinadura
pdfjs-editor-add-signature-clear-button-label = Garbitu sinadura
pdfjs-editor-add-signature-clear-button =
@ -757,74 +736,6 @@ 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 =

View File

@ -153,27 +153,6 @@ 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
@ -753,74 +732,6 @@ 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 =

View File

@ -153,27 +153,6 @@ 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
@ -257,7 +236,7 @@ pdfjs-find-match-count = Occurrence { $current } sur { $total }
# $limit (Number) - the maximum number of matches
pdfjs-find-match-count-limit =
{ $limit ->
[1] Plus dune occurrence
[one] Plus d{ $limit } occurrence
*[other] Plus de { $limit } occurrences
}
pdfjs-find-not-found = Expression non trouvée
@ -749,74 +728,6 @@ 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 na pas pu être vérifiée
*[other] Document signé mais { $count } signatures numériques nont 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 =

View File

@ -153,27 +153,6 @@ 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
@ -753,74 +732,6 @@ 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 dyt 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 =

View File

@ -153,27 +153,6 @@ pdfjs-document-properties-linearized = Ñanduti jahecha pyae:
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] Mboheraguapyi ({ $count })
*[other] Mboheraguapyieta ({ $count })
}
## Print
@ -581,7 +560,6 @@ 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 ombosakoikuaa 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
@ -753,49 +731,6 @@ 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 =

View File

@ -153,27 +153,6 @@ 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
@ -753,74 +732,6 @@ 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 =

View File

@ -153,29 +153,6 @@ 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
@ -771,84 +748,6 @@ 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 =

View File

@ -153,27 +153,6 @@ 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
@ -753,74 +732,6 @@ 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 =

View File

@ -153,15 +153,6 @@ 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

View File

@ -153,27 +153,6 @@ 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
@ -753,74 +732,6 @@ 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 =

View File

@ -153,27 +153,6 @@ 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
@ -261,7 +240,7 @@ pdfjs-find-match-count =
# $limit (Number) - the maximum number of matches
pdfjs-find-match-count-limit =
{ $limit ->
[one] Più di { $limit } corrispondenza
[one] Più di una { $limit } corrispondenza
*[other] Più di { $limit } corrispondenze
}
pdfjs-find-not-found = Testo non trovato
@ -753,74 +732,6 @@ 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 =

View File

@ -153,23 +153,6 @@ 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
@ -717,54 +700,6 @@ 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 =

View File

@ -153,27 +153,6 @@ 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
@ -753,74 +732,6 @@ 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 =

View File

@ -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 = Teɣzi n usebter:
pdfjs-document-properties-page-size = Tuγ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

View File

@ -153,27 +153,6 @@ 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
@ -753,74 +732,6 @@ 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 =

View File

@ -153,23 +153,6 @@ 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
@ -586,7 +569,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] 또는 이미지 파일 찾아보기
@ -682,7 +665,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 }개 페이지 잘림
@ -717,54 +700,6 @@ 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 =

View File

@ -479,21 +479,6 @@ 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 =

View File

@ -153,27 +153,6 @@ 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
@ -753,74 +732,6 @@ 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 =

View File

@ -153,27 +153,6 @@ 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
@ -753,74 +732,6 @@ pdfjs-views-manager-waiting-for-file = Bestand uploaden…
pdfjs-toggle-views-manager-button1 =
.title = Paginas 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 =

View File

@ -153,27 +153,6 @@ 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
@ -536,7 +515,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 = Føreslå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 = Foreslå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)
@ -753,74 +732,6 @@ 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 =

View File

@ -153,28 +153,6 @@ 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
@ -761,79 +739,6 @@ 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 =

View File

@ -153,27 +153,6 @@ 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
@ -753,74 +732,6 @@ 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 =

View File

@ -153,28 +153,6 @@ 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
@ -412,9 +390,8 @@ pdfjs-free-text2 =
# $count (Number) - the number of comments.
pdfjs-editor-comments-sidebar-title =
{ $count ->
[one] comentariu
[few] comentarii
*[other] de comentarii
[one] Comentariu
*[other] Comentarii
}
pdfjs-editor-comments-sidebar-close-button =
.title = Închide bara laterală
@ -762,79 +739,6 @@ 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 =

View File

@ -153,28 +153,6 @@ 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
@ -762,79 +740,6 @@ 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 =

View File

@ -87,7 +87,6 @@ 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
@ -134,19 +133,6 @@ 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
@ -193,15 +179,6 @@ 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
@ -220,27 +197,10 @@ 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:
@ -262,12 +222,6 @@ 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.
@ -280,13 +234,9 @@ 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
@ -298,33 +248,6 @@ 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.
@ -336,8 +259,6 @@ pdfjs-editor-remove-stamp-button =
.title = Boga simmàgine
pdfjs-editor-remove-highlight-button =
.title = Boga sevidèntzia
pdfjs-editor-remove-signature-button =
.title = Boga·nche sa firma
##
@ -351,47 +272,19 @@ pdfjs-editor-stamp-add-image-button =
pdfjs-editor-stamp-add-image-button-label = Agiunghe unimmà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 unoptzione
pdfjs-editor-alt-text-dialog-description = Su testu alternativu (“alt text”) est ùtile pro persones chi non podent bìdere simmà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
@ -411,13 +304,7 @@ 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:
@ -445,19 +332,6 @@ pdfjs-editor-alt-text-settings-show-dialog-button-label = Mustra deretu sedit
pdfjs-editor-alt-text-settings-show-dialog-description = Tagiudat 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

View File

@ -153,29 +153,6 @@ 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
@ -771,84 +748,6 @@ 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 =

View File

@ -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 = Letter
pdfjs-document-properties-page-size-name-legal = Legal
pdfjs-document-properties-page-size-name-letter = Pismo
pdfjs-document-properties-page-size-name-legal = Pravno
## Variables:
## $width (Number) - the width of the (current) page
@ -153,29 +153,6 @@ 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
@ -771,23 +748,6 @@ 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 =

View File

@ -153,28 +153,6 @@ 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
@ -762,79 +740,6 @@ 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 =

View File

@ -153,27 +153,6 @@ 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
@ -753,74 +732,6 @@ 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 =

View File

@ -153,27 +153,6 @@ 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
@ -517,11 +496,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 = Alt metin eksik
.aria-label = Alternatif 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 = Alt metni incele
.aria-label = Alternatif 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:
@ -753,74 +732,6 @@ 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 =

View File

@ -153,23 +153,6 @@ 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
@ -486,7 +469,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 = Để sau
pdfjs-editor-new-alt-text-not-now-button = Không phải bây giờ
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
@ -717,54 +700,6 @@ 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 =

View File

@ -153,19 +153,6 @@ 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

View File

@ -153,23 +153,6 @@ 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
@ -717,54 +700,6 @@ 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 =

4492
package-lock.json generated

File diff suppressed because it is too large Load Diff

View File

@ -2,33 +2,33 @@
"name": "pdf.js",
"type": "module",
"devDependencies": {
"@babel/core": "^8.0.1",
"@babel/preset-env": "^8.0.2",
"@babel/runtime": "^8.0.0",
"@eslint/json": "^2.0.1",
"@babel/core": "^7.29.0",
"@babel/preset-env": "^7.29.5",
"@babel/runtime": "^7.29.2",
"@eslint/json": "^1.2.0",
"@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.3",
"@types/node": "^26.1.2",
"autoprefixer": "^10.5.4",
"@napi-rs/canvas": "^1.0.0",
"@types/node": "^25.9.1",
"autoprefixer": "^10.5.0",
"babel-loader": "^10.1.1",
"babel-plugin-istanbul": "^8.0.2",
"babel-plugin-polyfill-corejs3": "^1.0.0",
"babel-plugin-add-header-comment": "^1.0.3",
"babel-plugin-istanbul": "^8.0.0",
"cached-iterable": "^0.3.0",
"caniuse-lite": "^1.0.30001806",
"caniuse-lite": "^1.0.30001793",
"core-js": "^3.49.0",
"eslint": "^10.8.0",
"eslint": "^10.4.0",
"eslint-config-prettier": "^10.1.8",
"eslint-plugin-import-x": "^4.17.1",
"eslint-plugin-import-x": "^4.16.2",
"eslint-plugin-jasmine": "^4.2.2",
"eslint-plugin-no-unsanitized": "^4.1.5",
"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",
"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",
"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.3.0",
"jasmine": "^6.2.0",
"jsdoc": "^4.0.5",
"jstransformer-nunjucks": "^1.2.0",
"kleur": "^4.1.5",
"metalsmith": "^2.7.0",
"metalsmith-html-relative": "^2.0.13",
"metalsmith-html-relative": "^2.0.12",
"ordered-read-streams": "^2.0.0",
"pngjs": "^7.0.0",
"postcss": "^8.5.25",
"postcss-discard-comments": "^8.0.1",
"postcss": "^8.5.15",
"postcss-discard-comments": "^8.0.0",
"postcss-values-parser": "^8.0.0",
"prettier": "^3.9.6",
"puppeteer": "^25.4.0",
"stylelint": "^17.14.1",
"prettier": "^3.8.3",
"puppeteer": "^25.1.0",
"stylelint": "^17.12.0",
"stylelint-prettier": "^5.0.3",
"svglint": "^4.2.1",
"terser-webpack-plugin": "^5.6.1",
"tsc-alias": "^1.9.1",
"terser-webpack-plugin": "^5.6.0",
"tsc-alias": "^1.8.17",
"ttest": "^4.0.0",
"typescript": "^6.0.3",
"vinyl": "^3.0.1",
"webpack": "^5.109.2",
"webpack": "^5.107.1",
"webpack-stream": "^7.0.0"
},
"repository": {

View File

@ -1,5 +1,5 @@
{
"stableVersion": "6.2.108",
"baseVersion": "ce4ff55faaa83b39b0137dc458af6eea6f96235f",
"versionPrefix": "6.3."
"stableVersion": "5.7.284",
"baseVersion": "e6e06cf6b5307fe39e0de69c6c884f816b0cb21b",
"versionPrefix": "6.0."
}

File diff suppressed because it is too large Load Diff

View File

@ -25,17 +25,11 @@ 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");
@ -49,10 +43,6 @@ class BaseStream {
unreachable("Abstract method `getByte` called");
}
/**
* @param {number | undefined} [length]
* @returns {Uint8Array}
*/
getBytes(length) {
unreachable("Abstract method `getBytes` called");
}
@ -145,10 +135,6 @@ class BaseStream {
unreachable("Abstract method `makeSubStream` called");
}
clone() {
unreachable("Abstract method `clone` called");
}
/**
* @returns {Array | null}
*/

View File

@ -19,7 +19,7 @@ import {
DocumentActionEventType,
FormatError,
info,
makeArr,
objectSize,
PermissionFlag,
shadow,
stringToUTF8String,
@ -52,41 +52,9 @@ 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(
@ -120,12 +88,6 @@ function fetchRemoteDest(action) {
class Catalog {
#actualNumPages = null;
#annotationAttachmentIdByRef = new RefSetCache();
#annotationAttachmentRefById = new Map();
#soundAttachmentIds = new Set();
#catDict = null;
builtInCMapCache = new Map();
@ -165,44 +127,6 @@ 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) {
@ -286,11 +210,11 @@ class Catalog {
/* suppressEncryption = */ !this.xref.encrypt?.encryptMetadata
);
if (
stream instanceof BaseStream &&
isDict(stream.dict, "Metadata") &&
isName(stream.dict.get("Subtype"), "XML")
) {
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")) {
// 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
@ -300,6 +224,7 @@ class Catalog {
metadata = new MetadataParser(data).serializable;
}
}
}
} catch (ex) {
if (ex instanceof MissingDataException) {
throw ex;
@ -361,11 +286,15 @@ class Catalog {
}
#readStructTreeRoot() {
const rawObj = this.#catDict.getRaw("StructTreeRoot"),
obj = this.xref.fetchIfRef(rawObj);
return obj instanceof Dict
? new StructTreeRoot(this.xref, obj, rawObj)
: null;
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;
}
get toplevelPagesDict() {
@ -440,7 +369,6 @@ class Catalog {
const outlineItem = {
action: data.action,
attachmentId: data.attachmentId,
attachment: data.attachment,
dest: data.dest,
url: data.url,
@ -763,17 +691,15 @@ class Catalog {
}
get destinations() {
const dests = new Map();
for (const obj of this.#readDests()) {
const rawDests = this.#readDests(),
dests = Object.create(null);
for (const obj of rawDests) {
if (obj instanceof NameTree) {
for (const [key, value] of obj.getAll()) {
const dest = fetchDest(value);
if (dest) {
dests.set(
stringToPDFString(key, /* keepEscapeSequence = */ true),
dest
);
dests[stringToPDFString(key, /* keepEscapeSequence = */ true)] =
dest;
}
}
} else if (obj instanceof Dict) {
@ -781,10 +707,8 @@ class Catalog {
const dest = fetchDest(value);
if (dest) {
// Always let the NameTree take precedence.
dests.getOrInsert(
stringToPDFString(key, /* keepEscapeSequence = */ true),
dest
);
dests[stringToPDFString(key, /* keepEscapeSequence = */ true)] ||=
dest;
}
}
}
@ -795,10 +719,11 @@ class Catalog {
getDestination(id) {
// Avoid extra lookup/parsing when all destinations are already available.
if (Object.hasOwn(this, "destinations")) {
return this.destinations.get(id) ?? null;
return this.destinations[id] ?? null;
}
for (const obj of this.#readDests()) {
const rawDests = this.#readDests();
for (const obj of rawDests) {
if (obj instanceof NameTree || obj instanceof Dict) {
const dest = fetchDest(obj.get(id));
if (dest) {
@ -810,7 +735,13 @@ 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).
return this.destinations.get(id) ?? null;
if (rawDests.length) {
const dest = this.destinations[id];
if (dest) {
return dest;
}
}
return null;
}
#readDests() {
@ -1076,19 +1007,18 @@ class Catalog {
break;
case "PrintPageRange":
// The number of elements must be even.
if (
Array.isArray(value) &&
value.length % 2 === 0 &&
value.every(
if (Array.isArray(value) && value.length % 2 === 0) {
const isValid = 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) {
@ -1104,14 +1034,15 @@ class Catalog {
warn(`Bad value, for key "${key}", in ViewerPreferences: ${value}.`);
continue;
}
(prefs ??= new Map()).set(key, prefValue);
prefs ??= Object.create(null);
prefs[key] = prefValue;
}
return shadow(this, "viewerPreferences", prefs);
}
get openAction() {
const obj = this.#catDict.get("OpenAction");
const openAction = new Map();
const openAction = Object.create(null);
if (obj instanceof Dict) {
// Convert the OpenAction dictionary into a format that works with
@ -1123,92 +1054,36 @@ class Catalog {
Catalog.parseDestDictionary({ destDict, resultObj });
if (Array.isArray(resultObj.dest)) {
openAction.set("dest", resultObj.dest);
openAction.dest = resultObj.dest;
} else if (resultObj.action) {
openAction.set("action", resultObj.action);
openAction.action = resultObj.action;
}
} else if (isValidExplicitDest(obj)) {
openAction.set("dest", obj);
openAction.dest = obj;
}
return shadow(this, "openAction", openAction.size ? openAction : null);
return shadow(
this,
"openAction",
objectSize(openAction) > 0 ? 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()) {
(attachments ??= new Map()).set(
stringToPDFString(key, /* keepEscapeSequence = */ true),
new FileSpec(value).serializable
);
const fs = new FileSpec(value);
attachments ??= Object.create(null);
attachments[stringToPDFString(key, /* keepEscapeSequence = */ true)] =
fs.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")) {
@ -1242,9 +1117,13 @@ class Catalog {
let javaScript = null;
function appendIfJavaScriptDict(name, jsDict) {
if (!(jsDict instanceof Dict) || !isName(jsDict.get("S"), "JavaScript")) {
if (!(jsDict instanceof Dict)) {
return;
}
if (!isName(jsDict.get("S"), "JavaScript")) {
return;
}
let js = jsDict.get("JS");
if (js instanceof BaseStream) {
js = js.getString();
@ -1257,7 +1136,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);
}
}
@ -1288,10 +1167,14 @@ class Catalog {
);
if (javaScript) {
actions ??= new Map();
actions ||= Object.create(null);
for (const [key, val] of javaScript) {
actions.getOrInsertComputed(key, makeArr).push(val);
if (key in actions) {
actions[key].push(val);
} else {
actions[key] = [val];
}
}
}
return shadow(this, "jsActions", actions);
@ -1500,22 +1383,6 @@ 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.")
);
@ -1591,9 +1458,6 @@ 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);
@ -1613,12 +1477,6 @@ 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) {
@ -1698,8 +1556,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 {Record<string, CatalogAttachment> | null} [docAttachments] - The
* document attachments (may not exist in most PDF documents).
* @property {Object} [docAttachments] - The document attachments (may not
* exist in most PDF documents).
*/
/**
@ -1731,19 +1589,9 @@ 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();
let kids = node.getRaw("K");
if (kids instanceof Ref) {
if (visited.has(kids)) {
continue;
}
visited.put(kids);
kids = xref.fetch(kids);
}
const kids = node.get("K");
let kidsArr;
if (Array.isArray(kids)) {
kidsArr = kids;
@ -1753,12 +1601,6 @@ 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
@ -1898,7 +1740,8 @@ class Catalog {
case "GoToR":
const urlDict = action.get("F");
if (urlDict instanceof Dict) {
url = new FileSpec(urlDict).filename;
const fs = new FileSpec(urlDict, /* skipContent = */ true);
({ rawFilename: url } = fs.serializable);
} else if (typeof urlDict === "string") {
url = urlDict;
} else {
@ -1923,21 +1766,22 @@ class Catalog {
case "GoToE":
const target = action.get("T");
/** @type {string | null} */
let id = null;
let attachment;
if (target instanceof Dict) {
if (docAttachments && target instanceof Dict) {
const relationship = target.get("R");
const name = target.get("N");
if (isName(relationship, "C") && typeof name === "string") {
id = stringToPDFString(name, /* keepEscapeSequence = */ true);
attachment =
docAttachments[
stringToPDFString(name, /* keepEscapeSequence = */ true)
];
}
}
if (docAttachments && id) {
resultObj.attachmentId = id;
resultObj.attachment = docAttachments.get(id);
if (attachment) {
resultObj.attachment = attachment;
// NOTE: the destination is relative to the *attachment*.
const attachmentDest = fetchRemoteDest(action);

View File

@ -58,9 +58,11 @@ class CCITTFaxStream extends DecodeStream {
if (this.eof) {
return this.buffer;
}
bytes ??= this.stream.isAsync
if (!bytes) {
bytes = this.stream.isAsync
? (await this.stream.asyncGetBytes()) || this.bytes
: this.bytes;
}
this.buffer = await JBig2CCITTFaxImage.instance.decode(
bytes,

View File

@ -775,12 +775,14 @@ class CFFParser {
} else if (localSubrIndex) {
localSubrToUse = localSubrIndex;
}
valid &&= this.parseCharString(
if (valid) {
valid = this.parseCharString(
state,
charstring,
localSubrToUse,
globalSubrIndex
);
}
if (state.width !== null) {
const nominalWidth = privateDictToUse.getByName("nominalWidthX");
widths[i] = nominalWidth + state.width;
@ -892,22 +894,9 @@ 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 =
lowerBound <= DEFAULT_BLUE_SCALE
? Math.ceil(lowerBound * PRECISION) / PRECISION
: -Infinity;
const maxBlueScale = Math.floor(PRECISION / maxZoneHeight) / PRECISION;
blueScale < DEFAULT_BLUE_SCALE ? 0.5 / maxZoneHeight : -Infinity;
const maxBlueScale = 1 / maxZoneHeight;
const clamped = MathClamp(blueScale, minBlueScale, maxBlueScale);
if (clamped !== blueScale) {
privateDict.setByName("BlueScale", clamped);
@ -1428,9 +1417,10 @@ class CFFFDSelect {
}
getFDIndex(glyphIndex) {
return glyphIndex < 0 || glyphIndex >= this.fdSelect.length
? -1
: this.fdSelect[glyphIndex];
if (glyphIndex < 0 || glyphIndex >= this.fdSelect.length) {
return -1;
}
return this.fdSelect[glyphIndex];
}
}

View File

@ -182,14 +182,28 @@ class ChunkedStream extends Stream {
}
getBytes(length) {
const bytes = this.bytes;
const pos = this.pos;
const endPos = !length ? this.end : Math.min(pos + length, this.end);
const strEnd = this.end;
if (endPos > this.progressiveDataLength) {
this.ensureRange(pos, endPos);
if (!length) {
if (strEnd > this.progressiveDataLength) {
this.ensureRange(pos, strEnd);
}
this.pos = endPos;
return this.bytes.subarray(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);
}
getByteRange(begin, end) {
@ -239,10 +253,10 @@ class ChunkedStream extends Stream {
};
Object.defineProperty(ChunkedStreamSubstream.prototype, "isDataLoaded", {
get() {
return (
this.numChunksLoaded === this.numChunks ||
this.getMissingChunks().length === 0
);
if (this.numChunksLoaded === this.numChunks) {
return true;
}
return this.getMissingChunks().length === 0;
},
configurable: true,
});
@ -260,13 +274,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();
@ -288,7 +302,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.
}
@ -323,7 +337,7 @@ class ChunkedStreamManager {
const missingChunks = this.stream.getMissingChunks();
this._requestChunks(missingChunks);
}
return this.#loadedStreamCapability.promise;
return this._loadedStreamCapability.promise;
}
_requestChunks(chunks) {
@ -346,13 +360,13 @@ class ChunkedStreamManager {
const chunksToRequest = [];
for (const chunk of chunksNeeded) {
const requestIds = this._requestsByChunk.getOrInsertComputed(
chunk,
() => {
let requestIds = this._requestsByChunk.get(chunk);
if (!requestIds) {
requestIds = [];
this._requestsByChunk.set(chunk, requestIds);
chunksToRequest.push(chunk);
return [];
}
);
requestIds.push(requestId);
}
@ -369,7 +383,7 @@ class ChunkedStreamManager {
}
return capability.promise.catch(reason => {
if (this.#aborted) {
if (this.aborted) {
return; // Ignoring any pending requests after abort.
}
throw reason;
@ -459,7 +473,7 @@ class ChunkedStreamManager {
}
if (stream.isDataLoaded) {
this.#loadedStreamCapability.resolve(stream);
this._loadedStreamCapability.resolve(stream);
}
const loadedRequests = [];
@ -520,6 +534,10 @@ class ChunkedStreamManager {
});
}
onError(err) {
this._loadedStreamCapability.reject(err);
}
getBeginChunk(begin) {
return Math.floor(begin / this.chunkSize);
}
@ -529,13 +547,12 @@ 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);
}
}

View File

@ -183,21 +183,6 @@ 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,
@ -394,20 +379,6 @@ 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(
@ -475,36 +446,24 @@ 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 count = highVal + 1;
const length = base.numComps * count;
const palette = new Uint8Array(length);
const length = base.numComps * (highVal + 1);
this.lookup = new Uint8Array(length);
if (lookup instanceof BaseStream) {
palette.set(lookup.getBytes(length));
const bytes = lookup.getBytes(length);
this.lookup.set(bytes);
} else if (typeof lookup === "string") {
for (let i = 0; i < length; ++i) {
palette[i] = lookup.charCodeAt(i);
this.lookup[i] = lookup.charCodeAt(i) & 0xff;
}
} 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) {
@ -514,12 +473,10 @@ class IndexedCS extends ColorSpace {
'IndexedCS.getRgbItem: Unsupported "dest" type.'
);
}
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];
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);
}
getRgbBuffer(src, srcOffset, count, dest, destOffset, bits, alpha01) {
@ -529,21 +486,20 @@ class IndexedCS extends ColorSpace {
'IndexedCS.getRgbBuffer: Unsupported "dest" type.'
);
}
const { highVal } = this;
const rgbLookup = this.#rgbLookup;
const { base, highVal, lookup } = this;
const { numComps } = base;
const outputDelta = base.getOutputLength(numComps, alpha01);
for (let i = 0; i < count; ++i) {
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;
const lookupPos =
MathClamp(Math.round(src[srcOffset++]), 0, highVal) * numComps;
base.getRgbBuffer(lookup, lookupPos, 1, dest, destOffset, 8, alpha01);
destOffset += outputDelta;
}
}
getOutputLength(inputLength, alpha01) {
return inputLength * (3 + alpha01);
return this.base.getOutputLength(inputLength * this.base.numComps, alpha01);
}
isDefaultDecode(decode, bpc) {

View File

@ -243,7 +243,9 @@ class ColorSpaceUtils {
break;
case "Pattern":
baseCS = cs[1] || null;
baseCS &&= this.#subParse(baseCS, options);
if (baseCS) {
baseCS = this.#subParse(baseCS, options);
}
return new PatternCS(baseCS);
case "I":
case "Indexed":

View File

@ -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,8 +342,7 @@ function lookupNormalRect(arr, fallback) {
* each part of the path.
*/
function parseXFAPath(path) {
// Anchoring prevents retrying the match at every character.
const positionPattern = /^(.+)\[(\d+)\]$/;
const positionPattern = /(.+)\[(\d+)\]$/;
return path.split(".").map(component => {
const m = component.match(positionPattern);
if (m) {
@ -377,7 +376,7 @@ function escapePDFName(str) {
if (start < i) {
buffer.push(str.substring(start, i));
}
buffer.push(`#${char.toString(16).padStart(2, "0")}`);
buffer.push(`#${char.toString(16)}`);
start = i + 1;
}
}
@ -387,7 +386,7 @@ function escapePDFName(str) {
}
if (start < str.length) {
buffer.push(str.substring(start));
buffer.push(str.substring(start, str.length));
}
return buffer.join("");
@ -451,7 +450,7 @@ function _collectJS(entry, xref, list, parents) {
}
function collectActions(xref, dict, eventType) {
const actions = new Map();
const actions = Object.create(null);
const additionalActionsDicts = getInheritableProperty({
dict,
key: "AA",
@ -477,7 +476,7 @@ function collectActions(xref, dict, eventType) {
const list = [];
_collectJS(rawActionDict, xref, list, parents);
if (list.length > 0) {
actions.set(action, list);
actions[action] = list;
}
}
}
@ -489,10 +488,10 @@ function collectActions(xref, dict, eventType) {
const list = [];
_collectJS(actionDict, xref, list, parents);
if (list.length > 0) {
actions.set("Action", list);
actions.Action = list;
}
}
return actions.size ? actions : null;
return objectSize(actions) > 0 ? actions : null;
}
const XMLEntities = {
@ -534,7 +533,7 @@ function encodeToXmlString(str) {
buffer.push(str.substring(start, i));
}
buffer.push(`&#x${char.toString(16).toUpperCase()};`);
if (char > 0xffff) {
if (char > 0xd7ff && (char < 0xe000 || char > 0xfffd)) {
// char is represented by two u16
i++;
}
@ -546,7 +545,7 @@ function encodeToXmlString(str) {
return str;
}
if (start < str.length) {
buffer.push(str.substring(start));
buffer.push(str.substring(start, str.length));
}
return buffer.join("");
}
@ -562,17 +561,6 @@ 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]+/)) {
@ -587,18 +575,6 @@ 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";
@ -775,7 +751,6 @@ export {
lookupRect,
MAX_INT_32,
MissingDataException,
normalizeCSSFontFamily,
numberToString,
ParserEOFException,
parseXFAPath,

View File

@ -13,10 +13,6 @@
* limitations under the License.
*/
/**
* @import {BaseStream} from "./base_stream.js";
*/
import {
bytesToString,
FormatError,
@ -30,11 +26,10 @@ import {
warn,
} from "../shared/util.js";
import { calculateSHA384, calculateSHA512 } from "./calculate_sha_other.js";
import { Dict, isDict, isName, Name } from "./primitives.js";
import { Dict, 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
@ -759,9 +754,6 @@ 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.
@ -797,11 +789,7 @@ class CipherTransform {
* @returns {DecryptStream}
*/
createStream(stream, length, cryptFilterName = null) {
const defaultFilterName =
this.embeddedFilterName && isDict(stream.dict, "EmbeddedFile")
? this.embeddedFilterName
: this.streamFilterName;
const Cipher = this.#getCipher(cryptFilterName || defaultFilterName);
const Cipher = this.#getCipher(cryptFilterName || this.streamFilterName);
const cipher = new Cipher();
return new DecryptStream(
stream,
@ -854,18 +842,7 @@ 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,
@ -1065,7 +1042,6 @@ class CipherTransformFactory {
}
this.filterName = filter.name;
this.dict = dict;
this.#fileId = fileId;
const algorithm = dict.get("V");
if (
!Number.isInteger(algorithm) ||
@ -1101,29 +1077,6 @@ 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
@ -1138,20 +1091,19 @@ class CipherTransformFactory {
this.encryptMetadata = encryptMetadata;
const fileIdBytes = stringToBytes(fileId);
let passwordBytes, rawPasswordBytes;
let passwordBytes;
if (password) {
if (revision === 6) {
const preppedPassword = saslPrep(password);
passwordBytes = utf8PasswordToBytes(preppedPassword);
if (preppedPassword !== password) {
rawPasswordBytes = utf8PasswordToBytes(password);
try {
password = utf8StringToString(password);
} catch {
warn(
"CipherTransformFactory: Unable to convert UTF8 encoded password."
);
}
}
} else if (algorithm === 5) {
passwordBytes = utf8PasswordToBytes(password);
} else {
passwordBytes = stringToBytes(password);
}
}
let encryptionKey;
if (algorithm !== 5) {
@ -1174,12 +1126,9 @@ 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,
candidate,
passwordBytes,
ownerPassword,
ownerValidationSalt,
ownerKeySalt,
@ -1191,28 +1140,9 @@ 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
@ -1252,23 +1182,21 @@ class CipherTransformFactory {
} else {
this.encryptionKey = encryptionKey;
}
}
/**
* 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;
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;
}
}
/**
@ -1292,18 +1220,6 @@ 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,
@ -1326,16 +1242,13 @@ class CipherTransformFactory {
)
);
}
if (cfm.name === "AESV3") {
return AES256Cipher.bind(null, this.encryptionKey);
}
throw new FormatError("Unknown crypto method");
};
const transform = new CipherTransform(
resolveCipher,
this.strf,
this.stmf
);
transform.embeddedFilterName = this.eff;
return transform;
return new CipherTransform(resolveCipher, this.strf, this.stmf);
}
// algorithms 1 and 2

View File

@ -111,9 +111,10 @@ class DecodeStream extends BaseStream {
async getImageData(length, decoderOptions) {
if (!this.canAsyncDecodeImageFromBuffer) {
return this.isAsyncDecoder
? this.decodeImage(null, length, decoderOptions)
: this.getBytes(length, decoderOptions);
if (this.isAsyncDecoder) {
return this.decodeImage(null, length, decoderOptions);
}
return this.getBytes(length, decoderOptions);
}
const data = await this.stream.asyncGetBytes();
return this.decodeImage(data, length, decoderOptions);
@ -177,16 +178,21 @@ 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, 0, this.bufferLength, this.dict?.clone());
}
getBaseStreams() {
return this.stream ? this.stream.getBaseStreams() : null;
return new Stream(
this.buffer,
this.start,
this.end - this.start,
this.dict.clone()
);
}
}

View File

@ -25,7 +25,6 @@ import {
LINE_FACTOR,
OPS,
shadow,
Util,
warn,
} from "../shared/util.js";
import { ColorSpaceUtils } from "./colorspace_utils.js";
@ -145,8 +144,7 @@ class AppearanceStreamEvaluator extends EvaluatorPreprocessor {
result = stack.pop() || result;
break;
case OPS.setTextMatrix:
const tm = Util.transform(this.stateManager.state.ctm, args);
result.scaleFactor *= Math.hypot(tm[0], tm[1]);
result.scaleFactor *= Math.hypot(args[0], args[1]);
break;
case OPS.setFont:
const [fontName, fontSize] = args;
@ -154,7 +152,7 @@ class AppearanceStreamEvaluator extends EvaluatorPreprocessor {
result.fontName = fontName.name;
}
if (typeof fontSize === "number" && fontSize > 0) {
result.fontSize = fontSize;
result.fontSize = fontSize * result.scaleFactor;
}
break;
case OPS.setFillColorSpace:
@ -184,10 +182,6 @@ 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;
}
@ -424,7 +418,10 @@ class FakeUnicodeFont {
[w, h] = [h, w];
}
const hscale = maxWidth > w ? w / maxWidth : 1;
let hscale = 1;
if (maxWidth > w) {
hscale = w / maxWidth;
}
let vscale = 1;
const lineHeight = LINE_FACTOR * fontSize;
const lineDescent = LINE_DESCENT_FACTOR * fontSize;
@ -482,7 +479,10 @@ class FakeUnicodeFont {
appearanceStreamDict.set("Matrix", matrix);
}
return new StringStream(appearance, appearanceStreamDict);
const ap = new StringStream(appearance);
ap.dict = appearanceStreamDict;
return ap;
}
}

View File

@ -21,6 +21,7 @@ import {
InvalidPDFException,
isArrayEqual,
makeArr,
objectSize,
PageActionEventType,
RenderingIntentFlag,
shadow,
@ -42,7 +43,6 @@ import {
isWhiteSpace,
lookupNormalRect,
MissingDataException,
normalizeCSSFontFamily,
PDF_VERSION_REGEXP,
RESOURCES_KEYS_OPERATOR_LIST,
RESOURCES_KEYS_TEXT_CONTENT,
@ -81,7 +81,6 @@ 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;
@ -719,7 +718,8 @@ class Page {
"_parseStructTree",
[structTreeRoot]
);
return await this.pdfManager.ensure(structTree, "serializable");
const data = await this.pdfManager.ensure(structTree, "serializable");
return data;
} catch (ex) {
warn(`getStructTree: "${ex}".`);
return null;
@ -790,6 +790,8 @@ class Page {
includeMarkedContent: false,
disableNormalization: false,
sink: null,
viewBox: this.view,
lang: null,
intersector,
}).then(() => {
intersector.setText();
@ -1005,12 +1007,6 @@ 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) {
@ -1195,10 +1191,7 @@ class PDFDocument {
recursionDepth
);
}
const isSignature = isName(
getInheritableProperty({ dict: field, key: "FT" }),
"Sig"
);
const isSignature = isName(field.get("FT"), "Sig");
const rectangle = field.get("Rect");
const isInvisible =
Array.isArray(rectangle) && rectangle.every(value => value === 0);
@ -1283,13 +1276,13 @@ class PDFDocument {
if (!streams) {
return null;
}
const data = new Map();
const data = Object.create(null);
for (const [key, stream] of streams) {
if (!stream) {
continue;
}
try {
data.set(key, stringToUTF8String(stream.getString()));
data[key] = stringToUTF8String(stream.getString());
} catch {
warn("XFA - Invalid utf-8 string.");
return null;
@ -1397,7 +1390,9 @@ class PDFDocument {
if (!(descriptor instanceof Dict)) {
continue;
}
const fontFamily = normalizeCSSFontFamily(descriptor.get("FontFamily"));
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 fontWeight = descriptor.get("FontWeight");
// Angle is expressed in degrees counterclockwise in PDF
@ -1879,15 +1874,12 @@ 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) || walkedRefs.has(obj)) {
if (visitedRefs.has(obj)) {
break;
}
walkedRefs.put(obj);
obj = await xref.fetchAsync(obj);
}
if (!(obj instanceof Dict)) {
@ -1961,7 +1953,7 @@ class PDFDocument {
const { acroForm } = annotationGlobals;
const visitedRefs = new RefSet();
const allFields = new Map();
const allFields = Object.create(null);
const fieldPromises = new Map();
const orphanFields = new RefSetCache();
for (const fieldRef of acroForm.get("Fields")) {
@ -1982,7 +1974,7 @@ class PDFDocument {
Promise.all(promises).then(fields => {
fields = fields.filter(field => !!field);
if (fields.length > 0) {
allFields.set(name, fields);
allFields[name] = fields;
}
})
);
@ -1990,7 +1982,7 @@ class PDFDocument {
await Promise.all(allPromises);
return {
allFields: allFields.size ? allFields : null,
allFields: objectSize(allFields) > 0 ? allFields : null,
orphanFields,
};
});
@ -1998,258 +1990,6 @@ 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);
@ -2268,9 +2008,9 @@ class PDFDocument {
return true;
}
if (fieldObjects?.allFields) {
return fieldObjects.allFields
.values()
.some(fieldObj => fieldObj.some(obj => obj.actions !== null));
return Object.values(fieldObjects.allFields).some(fieldObject =>
fieldObject.some(object => object.actions !== null)
);
}
return false;
}

View File

@ -27,25 +27,16 @@ import {
getNewAnnotationsMap,
numberToString,
} from "../core_utils.js";
import {
Dict,
isDict,
isName,
Name,
Ref,
RefSet,
RefSetCache,
} from "../primitives.js";
import { Dict, 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 { MurmurHash3_64 } from "../../shared/murmurhash3.js";
import { StringStream } from "../stream.js";
import { stringToBytes } from "../../shared/util.js";
const MAX_LEAVES_PER_PAGES_NODE = 16;
const MAX_IN_NAME_TREE_NODE = 64;
@ -72,7 +63,6 @@ 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;
@ -104,10 +94,6 @@ class XRefWrapper {
return this._getNewRef();
}
countUpdatesAfter(offset) {
return null;
}
fetchIfRef(obj) {
return obj instanceof Ref ? this.fetch(obj) : obj;
}
@ -140,12 +126,6 @@ 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 = [];
@ -252,73 +232,40 @@ class PDFEditor {
* @param {*} obj
* @param {boolean} mustClone
* @param {XRef} xref
* @param {RefSet} resourceStreamPath
* @returns {Promise<*>}
*/
async #collectDependencies(
obj,
mustClone,
xref,
resourceStreamPath = new RefSet()
) {
async #collectDependencies(obj, mustClone, xref) {
if (obj instanceof Ref) {
const {
currentDocument: { fieldToParent, oldRefMapping },
currentDocument: { oldRefMapping },
} = this;
const existingRef = oldRefMapping.get(obj);
if (existingRef) {
return existingRef;
let newRef = oldRefMapping.get(obj);
if (newRef) {
return newRef;
}
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;
}
// 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;
newRef = this.newRef;
oldRefMapping.put(oldRef, newRef);
if (typeof PDFJSDev === "undefined" || PDFJSDev.test("TESTING")) {
if (isDict(obj, "Page") && !this.currentDocument.pagesMap.has(oldRef)) {
if (
obj instanceof Dict &&
isName(obj.get("Type"), "Page") &&
!this.currentDocument.pagesMap.has(oldRef)
) {
throw new Error(
"Add a deleted page to the document is not supported."
);
}
}
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
);
this.xref[newRef.num] = await this.#collectDependencies(obj, true, xref);
return newRef;
}
const promises = [];
@ -338,12 +285,9 @@ class PDFEditor {
continue;
}
promises.push(
this.#collectDependencies(
obj[i],
true,
xref,
resourceStreamPath
).then(newObj => (obj[i] = newObj))
this.#collectDependencies(obj[i], true, xref).then(
newObj => (obj[i] = newObj)
)
);
}
await Promise.all(promises);
@ -370,12 +314,9 @@ class PDFEditor {
continue;
}
promises.push(
this.#collectDependencies(
rawObj,
true,
xref,
resourceStreamPath
).then(newObj => dict.set(key, newObj))
this.#collectDependencies(rawObj, true, xref).then(newObj =>
dict.set(key, newObj)
)
);
}
await Promise.all(promises);
@ -384,173 +325,6 @@ 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,
@ -568,11 +342,19 @@ class PDFEditor {
if (pg instanceof Ref && !pagesMap.has(pg)) {
return null;
}
const k = node.getRaw("K");
if (k instanceof Ref && visited.has(k)) {
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)) {
return null;
}
const kids = await this.#resolveStructKids(k, xref);
kids = await xref.fetchAsync(k);
if (!Array.isArray(kids)) {
kids = [k];
}
}
kids = Array.isArray(kids) ? kids : [kids];
const newKids = [];
const structElemIndices = [];
for (let kid of kids) {
@ -633,15 +415,10 @@ class PDFEditor {
if (!kidRef) {
continue;
}
// 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)) {
const newKidRef = oldRefMapping.get(kidRef);
if (!newKidRef) {
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");
@ -692,13 +469,21 @@ class PDFEditor {
const classNames = node.get("C");
if (classNames instanceof Name) {
const newClassName = dedupClasses.get(classNames.name);
newNode.set("C", newClassName ? Name.get(newClassName) : classNames);
if (newClassName) {
newNode.set("C", Name.get(newClassName));
} else {
newNode.set("C", classNames);
}
} else if (Array.isArray(classNames)) {
const newClassNames = [];
for (const className of classNames) {
if (className instanceof Name) {
const newClassName = dedupClasses.get(className.name);
newClassNames.push(newClassName ? Name.get(newClassName) : className);
if (newClassName) {
newClassNames.push(Name.get(newClassName));
} else {
newClassNames.push(className);
}
}
}
newNode.set("C", newClassNames);
@ -708,7 +493,11 @@ class PDFEditor {
const roleName = node.get("S");
if (roleName instanceof Name) {
const newRoleName = dedupRoles.get(roleName.name);
newNode.set("S", newRoleName ? Name.get(newRoleName) : roleName);
if (newRoleName) {
newNode.set("S", Name.get(newRoleName));
} else {
newNode.set("S", roleName);
}
}
// Fix the ID.
@ -716,7 +505,11 @@ class PDFEditor {
if (typeof id === "string") {
const stringId = stringToPDFString(id, /* keepEscapeSequence = */ false);
const newId = dedupIDs.get(stringId);
newNode.set("ID", newId ? stringToAsciiOrUTF16BE(newId) : id);
if (newId) {
newNode.set("ID", stringToAsciiOrUTF16BE(newId));
} else {
newNode.set("ID", id);
}
}
// Table headers may contain IDs that need to be deduplicated.
@ -727,21 +520,12 @@ 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(header, /* keepEscapeSequence = */ false)
stringToPDFString(headers[i], /* keepEscapeSequence = */ false)
);
if (newId) {
headers[i] = newId;
@ -1233,12 +1017,15 @@ class PDFEditor {
if (!isName(annotationDict.get("Subtype"), "Link")) {
if (isName(annotationDict.get("Subtype"), "Widget")) {
hasSignatureAnnotations ||= isName(
getInheritableProperty({ dict: annotationDict, key: "FT" }),
annotationDict.get("FT"),
"Sig"
);
const parentRef = annotationDict.getRaw("Parent") || null;
// The parent will be omitted from the annotation clone to avoid
// visiting it, then restored by #mergeAcroForms.
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");
fieldToParent.put(annotationRef, parentRef);
}
@ -1246,13 +1033,6 @@ 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")
@ -1264,9 +1044,9 @@ class PDFEditor {
) {
// Keep the annotation as is: it isn't linking to a deleted page.
newAnnotations[newAnnotationIndex] = annotationRef;
} else if (dest instanceof Name || typeof dest === "string") {
} else if (typeof dest === "string") {
const destString = stringToPDFString(
dest instanceof Name ? dest.name : dest,
dest,
/* keepEscapeSequence = */ true
);
if (destinations.has(destString)) {
@ -1547,24 +1327,17 @@ class PDFEditor {
}
// Get the kids.
const rawKids = structTreeRoot.dict.getRaw("K");
if (!rawKids) {
let kids = structTreeRoot.dict.get("K");
if (!kids) {
continue;
}
const kids = await this.#resolveStructKids(rawKids, xref);
kids = Array.isArray(kids) ? kids : [kids];
for (let kid of kids) {
const kidRef = kid instanceof Ref ? kid : null;
kid = await xref.fetchIfRefAsync(kid);
if (!(kid instanceof Dict)) {
continue;
}
let setAsSpan = false;
if (kidRef && removedStructElements.has(kidRef)) {
if (!isName(kid.get("S"), "Link")) {
continue;
}
setAsSpan = true;
}
kid = await xref.fetchIfRefAsync(kid);
const newKidRef = await this.#cloneStructTreeNode(
kidRef,
kid,
@ -1576,12 +1349,6 @@ class PDFEditor {
);
if (newKidRef) {
structTreeKids.push(newKidRef);
if (kidRef) {
oldRefMapping.put(kidRef, newKidRef);
}
if (setAsSpan) {
this.xref[newKidRef.num].setIfName("S", "Span");
}
}
}
@ -1639,7 +1406,7 @@ class PDFEditor {
}
const { destinations, pagesMap } = documentData;
const newDestinations = (documentData.destinations = new Map());
for (const [key, dest] of destinations) {
for (const [key, dest] of Object.entries(destinations)) {
const pageRef = dest[0];
const pageData = pageRef instanceof Ref && pagesMap.get(pageRef);
if (!pageData) {
@ -2133,14 +1900,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 {RefSetCache} fieldToParent
* @param {Map<Ref, Ref>} fieldToParent
* @param {XRef} xref
* @returns {Array<Ref>}
*/
#fixFields(fieldToParent, xref) {
const newFields = [];
const processed = new RefSet();
for (const [fieldRef, parentRef] of fieldToParent.items()) {
for (const [fieldRef, parentRef] of fieldToParent) {
if (!parentRef) {
newFields.push(fieldRef);
continue;
@ -2254,7 +2021,11 @@ class PDFEditor {
if (data.parentRef) {
newKid.set("Parent", data.parentRef);
}
if (acroFormDefaultAppearance && !newKid.has("DA")) {
if (
acroFormDefaultAppearance &&
isName(newKid.get("FT"), "Tx") &&
!newKid.has("DA")
) {
// Fix the DA later since we need to have all the fields tree.
daToFix.push(newKid);
}
@ -2272,10 +2043,6 @@ 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.
@ -2283,27 +2050,36 @@ class PDFEditor {
}
}
const resourcesValuesCache = new Map();
const fixAppearanceResources = async stream => {
let resources = stream.dict.getRaw("Resources");
resources &&= this.xrefWrapper.fetchIfRef(resources);
if (!(resources instanceof Dict)) {
const newResourcesRef = await resourcesValuesCache.getOrInsertComputed(
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(
acroFormDefaultResources,
() => this.#cloneObject(acroFormDefaultResources, xref)
);
stream.dict.set("Resources", newResourcesRef);
return;
value.dict.set("Resources", newResourcesRef);
continue;
}
resources = xref.fetchIfRef(resources);
for (const [
resKey,
resValue,
] of acroFormDefaultResources.getRawEntries()) {
if (resources.has(resKey)) {
continue;
}
if (!resources.has(resKey)) {
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 ||
@ -2316,19 +2092,6 @@ 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);
}
}
}
}
}
@ -2611,9 +2374,12 @@ class PDFEditor {
const content =
`q ${numberToString(drawW)} 0 0 ${numberToString(drawH)} ` +
`${numberToString(tx)} ${numberToString(ty)} cm /Im0 Do Q`;
const contentsStream = new StringStream(
content,
new Dict(this.xrefWrapper)
const contentsDict = new Dict(this.xrefWrapper);
const contentsStream = new Stream(
stringToBytes(content),
0,
0,
contentsDict
);
const contentsRef = this.newRef;
this.xref[contentsRef.num] = contentsStream;
@ -2693,15 +2459,7 @@ class PDFEditor {
#makeNameNumTree(map, areNames) {
const allEntries = map.sort(
areNames
? ([keyA], [keyB]) => {
if (keyA < keyB) {
return -1;
}
if (keyA > keyB) {
return 1;
}
return 0;
}
? ([keyA], [keyB]) => keyA.localeCompare(keyB)
: ([keyA], [keyB]) => keyA - keyB
);
const maxLeaves =
@ -2744,7 +2502,7 @@ class PDFEditor {
*/
#makePageLabelsTree() {
const { pageLabels } = this;
if (!pageLabels?.length) {
if (!pageLabels || pageLabels.length === 0) {
return;
}
const { rootDict } = this;
@ -2778,7 +2536,7 @@ class PDFEditor {
/* keepEscapeSequence = */ true
);
for (let i = 1; ; i++) {
const deduped = stringToAsciiOrUTF16BE(`${displayName}_${i}`);
const deduped = `${displayName}_${i}`;
if (!embeddedFiles.has(deduped)) {
name = deduped;
break;
@ -2824,10 +2582,7 @@ class PDFEditor {
this.namesDict.set(
"Dests",
this.#makeNameNumTree(
Array.from(namedDestinations, ([name, dest]) => [
stringToAsciiOrUTF16BE(name),
dest,
]),
Array.from(namedDestinations.entries()),
/* areNames = */ true
)
);
@ -2835,7 +2590,7 @@ class PDFEditor {
#makeStructTree() {
const { structTreeKids } = this;
if (!structTreeKids?.length) {
if (!structTreeKids || structTreeKids.length === 0) {
return;
}
const { rootDict } = this;
@ -2914,7 +2669,7 @@ class PDFEditor {
acroForm.set("SigFlags", this.acroFormSigFlags);
}
acroForm.setIfArray("CO", this.acroFormCalculationOrder);
acroForm.setIfDefined("DR", this.acroFormDefaultResources);
acroForm.setIfDict("DR", this.acroFormDefaultResources);
if (this.acroFormDefaultAppearance) {
acroForm.set("DA", this.acroFormDefaultAppearance);
}
@ -3050,11 +2805,11 @@ class PDFEditor {
offset += obj.length + 1;
}
streamBuffer[0] = objOffsets.join("\n");
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);
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);
changes.put(objStreamRef, { data: objStream });
}

View File

@ -200,7 +200,8 @@ async function createImage(bitmap, xref, { closeBitmap = false } = {}) {
const colorCounter = new Set();
let hasAlpha = false;
let useFlate = true;
for (const v of buf32) {
for (let i = 0, ii = buf32.length; i < ii; i++) {
const v = buf32[i];
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