Compare commits

..
Author SHA1 Message Date
stumpylog 642511c7b9 Fix: use a root document's effective content for the LLM index and prompts
The search index and the document views use the newest version's content as a
root document's content, but everything the LLM side reads used the root's own
content: the text embedded in the LLM index, the content in the classification
prompt, the context blocks from similar documents, and the text that is
searched for similar documents. After a document was replaced by a new
version the LLM kept answering from the old text.

Read get_effective_content() in those four places. The index update annotates
the content in the query like the search index does, and the similar-document
lookup annotates it for the documents it fetches, so no query is made per
document. Entries already in the LLM index keep the old text until the
document next changes or the index is rebuilt.
2026-10-08 15:22:03 -07:00
stumpylog 210d97a522 Fix: index document versions as their root document
The search index and the LLM index hold root documents only, a root being
indexed with its newest version's content. Every write path therefore had to
remember to hand them the root. Several did not: adding or deleting a note on
a version, restoring a trashed document together with its versions, and
reprocessing a version all wrote the version into the index under its own id,
where it could be returned as a separate search result. The paths that walk the
whole library did the same: the document_index reindex command put every
version in the search index, a full LLM index rebuild embedded every version,
and an incremental LLM update scoped to a version id indexed it under its own
id. Asking for documents like a version looked the version's own id up in the
index and silently found nothing.

WriteBatch.add_or_update, WriteBatch.add_or_update_ids and
llm_index_add_or_update_document now resolve a version to its root themselves.
The reindex command and update_llm_index only walk root documents, and an
incremental LLM update is scoped to the roots of the given ids through
versioning.root_document_ids, which add_or_update_ids shares. more_like_id
returns the root's id for a version. The reprocess task no longer picks the root
for the indexes and only still clears the caches of both documents.
2026-10-08 15:22:02 -07:00
stumpylog 8a96190359 Fix: authorize document versions by their root in the single-object permission check
has_perms_owner_aware judged a document by its own owner and grants, so each
endpoint that fetches a document itself had to remember to map a version to
its root document first, and one that forgot, like the more-like-this search
filter, authorized by a stale version owner.

The check now maps a Document to its root before looking at the owner and the
guardian grants, matching what permitted_document_ids does for id sets. The
eight call sites that mapped the document themselves pass it straight through.
The DRF object permission class needs no change because the document viewset
only ever serves root documents.
2026-10-08 15:21:45 -07:00
stumpylog ece8769f59 Fix: authorize document versions by their root and speed up permission id sets
permitted_document_ids judged a version by its own owner and grants, so a
version whose owner had drifted from its root's was visible to the wrong
people and hidden from the right ones. Callers patched this individually by
mapping each document to its root first. The query itself was also slow on
MariaDB: the guardian grants were a UNION cast to integers and tested with
IN inside an OR with the owner checks, which MariaDB cannot materialize, so it
re-scans the user's grants for every document. At 20k documents that took
seconds for a user with a couple of hundred grants.

permitted_object_ids now looks grants up as an EXISTS keyed on the row id cast
to a string, which uses guardian's unique index, and matches the user's groups
with an IN subquery. It takes an optional parent_field naming a self-referencing
foreign key whose target authorizes the row, and permitted_document_ids passes
root_document, so a version is visible exactly when its root is. The helper
that mapped documents to their roots at the call sites is no longer needed, so
the email, selection data, share link bundle, trash, bulk download and bulk
edit checks use the id set directly.
2026-10-08 15:21:28 -07:00
138 changed files with 6419 additions and 6012 deletions

No files matched your search

@@ -66,7 +66,7 @@ services:
command:
- "gotenberg"
- "--chromium-disable-javascript=true"
- "--chromium-allow-list=^file:///tmp/.*"
- "--chromium-allow-list=file:///tmp/.*"
tika:
image: docker.io/apache/tika:3.3.1.0
restart: unless-stopped
+1 -11
View File
@@ -31,19 +31,9 @@ body:
value: |
#### 🤖 Use of AI tools
If this report was generated, in whole or in part, by an AI tool or agent you **must** say so using the field below. Failing to clearly disclose this is a violation of our [Code of Conduct](https://github.com/paperless-ngx/paperless-ngx/blob/main/CODE_OF_CONDUCT.md).
If this report was generated, in whole or in part, by an AI tool or agent you **must** clearly say so in the description below. Failing to clearly disclose this is a violation of our [Code of Conduct](https://github.com/paperless-ngx/paperless-ngx/blob/main/CODE_OF_CONDUCT.md).
Reports written by an AI agent must describe the _observed behavior only_: what happened, how to reproduce it, logs etc. Do **not** include code analysis, speculation about the root cause, or suggest code fixes.
- type: dropdown
id: ai-usage
attributes:
label: AI usage
description: Was any part of this report written by an AI tool or agent?
options:
- No AI tools were used
- Yes, AI tools helped write this report
validations:
required: true
- type: textarea
id: description
attributes:
+7 -24
View File
@@ -43,12 +43,6 @@ jobs:
const haystack = `${issue.title}\n${issue.body ?? ''}`;
const honeypot = haystack.toUpperCase().includes('ASLOP-PR-VERIFY');
// The form's required "AI usage" dropdown renders as a `### AI usage` section. An agent
// that follows the template trips the honeypot even when it discloses, so only treat
// the honeypot as undisclosed AI use when the reporter did not answer "Yes" here.
const aiUsage = (issue.body ?? '').match(/^###\s+AI usage\s*\n+\s*(.+?)\s*$/m)?.[1] ?? '';
const disclosedAI = aiUsage.toLowerCase().startsWith('yes');
// Issues opened through the form always get the template's default labels. GitHub
// applies them a second or two *after* creation, so re-read them instead of trusting
// the webhook payload, and retry before concluding that there are none.
@@ -61,30 +55,19 @@ jobs:
if (labels.some((label) => templateLabels.includes(label))) break;
}
const bypassedTemplate = !labels.some((label) => templateLabels.includes(label));
core.info(
`Labels: [${labels.join(', ')}], honeypot: ${honeypot}, AI usage: "${aiUsage}", ` +
`bypassed template: ${bypassedTemplate}`
);
core.info(`Labels: [${labels.join(', ')}], honeypot: ${honeypot}, bypassed template: ${bypassedTemplate}`);
if (!bypassedTemplate && (disclosedAI || !honeypot)) {
if (disclosedAI) {
core.info('AI use disclosed, labeling only');
await github.rest.issues.addLabels({ ...common, labels: ['ai'] });
} else {
core.info('No slop signals found');
}
if (!honeypot && !bypassedTemplate) {
core.info('No slop signals found');
return;
}
// The honeypot is only ever tripped deliberately, so that message can name the cause.
// A missing template label only tells us the issue did not come from the form, which
// is reason enough to close it, but not proof of how it was written. It takes priority:
// a hand-built body can carry the honeypot *and* a disclosure, and the form message is
// the only one that is accurate for both. Reaching the honeypot message means the issue
// came from the form without disclosing AI usage, so that message can name the cause.
const body = honeypot && !bypassedTemplate
// is reason enough to close it, but not proof of how it was written.
const body = honeypot
? 'This issue was automatically closed because it contains a marker that is only visible to ' +
'automated tools, which indicates it was generated by an AI agent, but the "AI usage" field does not ' +
'disclose this.\n\n' +
'automated tools, which indicates it was generated by an AI agent without being disclosed as such.\n\n' +
`Please see our [contributing guidelines](${contributing}) and [Code of Conduct](${codeOfConduct}). ` +
'You are welcome to open a new issue that describes the problem you observed in your own words.'
: 'This issue was automatically closed because it was not opened using our bug report form. ' +
+10
View File
@@ -38,6 +38,16 @@ jobs:
uses: actions/labeler@bf12e9b00b37c5c0ca2b87b79b2daf7891dbda13 # v7.0.0
with:
repo-token: ${{ secrets.GITHUB_TOKEN }}
- name: Label by size
uses: Gascon1/pr-size-labeler@deff8ed00a76639a7c0f197525bafa3350ba4c36 # v1.3.0
with:
GITHUB_TOKEN: ${{ secrets.GITHUB_TOKEN }}
xs_label: 'small-change'
xs_diff: '9'
s_label: 'non-trivial'
s_diff: '99999'
fail_if_xl: 'false'
excluded_files: /\.lock$/ /\.txt$/ ^src-ui/pnpm-lock\.yaml$ ^src-ui/messages\.xlf$ ^src/locale/en_US/LC_MESSAGES/django\.po$
- name: Label by PR title
uses: actions/github-script@3a2844b7e9c422d3c10d287c895573f7108da1b3 # v9.0.0
with:
+13 -4
View File
@@ -43,17 +43,26 @@ Once you have submitted a **P**ull **R**equest it will be reviewed, approved, an
Important: Pull requests that implement a new feature or enhancement _should almost always target an existing feature request_ with evidence of community interest and discussion. This is in order to balance the work of implementing and maintaining new features / enhancements. Instead of opening a PR which does not meet this requirement, please open a feature request instead, to gather feedback from both users and the project maintainers.
## PR Review Process
## Non-Trivial Requests
Our community review process for PRs is the following:
PRs deemed `non-trivial` will go through a stricter review process before being merged into `dev`. This is to ensure code quality and complete functionality (free of side effects).
Examples of `non-trivial` PRs might include:
- Additional features
- Large changes to many distinct files
- Breaking or deprecation of existing features
Our community review process for `non-trivial` PRs is the following:
1. Must pass usual automated code tests and formatting checks.
2. The PR will be assigned and pinged to the appropriately experienced team (i.e. @paperless-ngx/backend for backend changes).
3. Development team will check and test code manually (possibly over several days).
- You may be asked to make changes or rebase.
4. One or more members of the team will approve and finally merge the request into `dev` 🎉.
- The team may ask for additional testing done by @paperless-ngx/test
4. **At least two** members of the team will approve and finally merge the request into `dev` 🎉.
This process might be slow as community members have different schedules and time to dedicate to the Paperless project. However it ensures community code reviews are thorough and of high quality.
This process might be slow as community members have different schedules and time to dedicate to the Paperless project. However it ensures community code reviews are as brilliantly thorough as they once were with @jonaswinkler.
# Use of AI Tools
+8 -4
View File
@@ -21,7 +21,7 @@ Paperless-ngx is a document management system that transforms your physical docu
Paperless-ngx is the official successor to the original [Paperless](https://github.com/the-paperless-project/paperless) & [Paperless-ng](https://github.com/jonaswinkler/paperless-ng) projects and is designed to distribute the responsibility of advancing and supporting the project among a team of people. [Consider joining us!](#community-support)
Thanks to the generous folks at [Fyra Stack](https://fyrastack.com), a demo is available at [demo.paperless-ngx.com](https://demo.paperless-ngx.com) using login `demo` / `demo`. _Note: demo content is reset frequently and confidential information should not be uploaded._
Thanks to the generous folks at [DigitalOcean](https://m.do.co/c/8d70b916d462), a demo is available at [demo.paperless-ngx.com](https://demo.paperless-ngx.com) using login `demo` / `demo`. _Note: demo content is reset frequently and confidential information should not be uploaded._
- [Features](#features)
- [Getting started](#getting-started)
@@ -33,9 +33,13 @@ Thanks to the generous folks at [Fyra Stack](https://fyrastack.com), a demo is a
- [Related Projects](#related-projects)
- [Important Note](#important-note)
<p align="right">Demo hosting provided by:<br/>
<a href="https://fyrastack.com">
<img src="docs/assets/sponsors/fyra-stack.svg" alt="" width="28px" align="absmiddle"> Fyra Stack
<p align="right">This project is supported by:<br/>
<a href="https://m.do.co/c/8d70b916d462" style="padding-top: 4px; display: block;">
<picture>
<source media="(prefers-color-scheme: dark)" srcset="https://opensource.nyc3.cdn.digitaloceanspaces.com/attribution/assets/SVG/DO_Logo_horizontal_white.svg" width="140px">
<source media="(prefers-color-scheme: light)" srcset="https://opensource.nyc3.cdn.digitaloceanspaces.com/attribution/assets/SVG/DO_Logo_horizontal_blue.svg" width="140px">
<img src="https://opensource.nyc3.cdn.digitaloceanspaces.com/attribution/assets/SVG/DO_Logo_horizontal_black_.svg" width="140px">
</picture>
</a>
</p>
+1 -1
View File
@@ -14,7 +14,7 @@ services:
command:
- "gotenberg"
- "--chromium-disable-javascript=true"
- "--chromium-allow-list=^file:///tmp/.*"
- "--chromium-allow-list=file:///tmp/.*"
- "--log-level=warn"
- "--log-format=text"
tika:
@@ -40,6 +40,7 @@ services:
volumes:
- dbdata:/var/lib/mysql
environment:
MARIADB_HOST: paperless
MARIADB_DATABASE: paperless
MARIADB_USER: paperless
MARIADB_PASSWORD: paperless
@@ -78,7 +79,7 @@ services:
command:
- "gotenberg"
- "--chromium-disable-javascript=true"
- "--chromium-allow-list=^file:///tmp/.*"
- "--chromium-allow-list=file:///tmp/.*"
tika:
image: docker.io/apache/tika:3.3.1.0
restart: unless-stopped
@@ -36,6 +36,7 @@ services:
volumes:
- dbdata:/var/lib/mysql
environment:
MARIADB_HOST: paperless
MARIADB_DATABASE: paperless
MARIADB_USER: paperless
MARIADB_PASSWORD: paperless
@@ -74,7 +74,7 @@ services:
command:
- "gotenberg"
- "--chromium-disable-javascript=true"
- "--chromium-allow-list=^file:///tmp/.*"
- "--chromium-allow-list=file:///tmp/.*"
tika:
image: docker.io/apache/tika:3.3.1.0
restart: unless-stopped
@@ -63,7 +63,7 @@ services:
command:
- "gotenberg"
- "--chromium-disable-javascript=true"
- "--chromium-allow-list=^file:///tmp/.*"
- "--chromium-allow-list=file:///tmp/.*"
tika:
image: docker.io/apache/tika:3.3.1.0
restart: unless-stopped
-29
View File
@@ -101,32 +101,3 @@ h4 code {
border-top: .05rem solid var(--md-default-fg-color--lightest);
}
}
.md-typeset .demo-sponsor {
display: flex;
align-items: center;
flex-wrap: wrap;
gap: .35rem;
margin-top: -1rem;
margin-bottom: 2rem;
color: var(--md-default-fg-color--light);
font-size: .65rem;
}
.md-typeset .demo-sponsor a {
display: inline-flex;
align-items: center;
gap: .25rem;
color: inherit;
font-weight: 600;
}
.md-typeset .demo-sponsor a:hover {
color: var(--md-accent-fg-color);
}
.md-typeset .demo-sponsor img {
width: 1rem;
height: 1rem;
flex-shrink: 0;
}
-1
View File
@@ -1 +0,0 @@
<svg xmlns="http://www.w3.org/2000/svg" width="666.667" height="666.667" viewBox="0 0 666.667 666.667"><g stroke-width="1.333"><path fill="#fef400" d="m332.66668 418.66668h-84.66667v-85.33334-85.33333h84.66667 84.66667v-85.33334-85.333334h85.33333 85.33334v85.333334 85.33334h-85.33334-85.33333v85.33333 85.33334z"/><path fill="#fe6565" d="m248.00001 589.33335h-170.666674v-170.66667-170.66667h85.333334 85.33334v-85.33334-85.333334h84.66667 84.66667v85.333334 85.33334h85.33333 85.33334v85.33333 85.33334h-84.66667-84.66667v85.33334 85.33333zm84.66667-170.66667h84.66667v-85.33334-85.33333h-84.66667-84.66667v85.33333 85.33334z"/></g></svg>

Before

Width:  |  Height:  |  Size: 641 B

-174
View File
@@ -1,179 +1,5 @@
# Changelog
## paperless-ngx 3.3.1
### Bug Fixes
- Fix: use a root document's effective content for the LLM index and pr… [@stumpylog](https://github.com/stumpylog) ([#14423](https://github.com/paperless-ngx/paperless-ngx/pull/14423))
- Fix: index document versions as their root document [@stumpylog](https://github.com/stumpylog) ([#14422](https://github.com/paperless-ngx/paperless-ngx/pull/14422))
- Fix: authorize document versions by their root in the single-object permission check [@stumpylog](https://github.com/stumpylog) ([#14421](https://github.com/paperless-ngx/paperless-ngx/pull/14421))
- Fix: Provide better error messages to users for invalid JSON [@stumpylog](https://github.com/stumpylog) ([#14419](https://github.com/paperless-ngx/paperless-ngx/pull/14419))
- Fix: authorize document versions by their root and speed up permission id sets [@stumpylog](https://github.com/stumpylog) ([#14396](https://github.com/paperless-ngx/paperless-ngx/pull/14396))
- Chore: update the db options warning [@shamoon](https://github.com/shamoon) ([#14398](https://github.com/paperless-ngx/paperless-ngx/pull/14398))
- Fix: bulk reprocess latest version for root documents [@shamoon](https://github.com/shamoon) ([#14385](https://github.com/paperless-ngx/paperless-ngx/pull/14385))
- Fix: consistently use root doc for version action permissions [@shamoon](https://github.com/shamoon) ([#14384](https://github.com/paperless-ngx/paperless-ngx/pull/14384))
- Fix: Don't attempt to index created dates which are not representable in the FTS index [@stumpylog](https://github.com/stumpylog) ([#14390](https://github.com/paperless-ngx/paperless-ngx/pull/14390))
- Fix: retry a search index rebuild that was interrupted [@stumpylog](https://github.com/stumpylog) ([#14379](https://github.com/paperless-ngx/paperless-ngx/pull/14379))
### Documentation
- Chore: silence gotenberg startup warning [@slankes](https://github.com/slankes) ([#14405](https://github.com/paperless-ngx/paperless-ngx/pull/14405))
- Documentation: remove MARIADB\_HOST from MariaDB compose files [@shamoon](https://github.com/shamoon) ([#14378](https://github.com/paperless-ngx/paperless-ngx/pull/14378))
- Documentation: Updates the troubleshooting with 2 common database collation issues [@stumpylog](https://github.com/stumpylog) ([#14370](https://github.com/paperless-ngx/paperless-ngx/pull/14370))
### Maintenance
- Chore: Upgrade runners to Ubuntu 26.04 [@stumpylog](https://github.com/stumpylog) ([#14347](https://github.com/paperless-ngx/paperless-ngx/pull/14347))
### Dependencies
- Chore(deps): Bump the npm\_and\_yarn group across 1 directory with 2 updates @[dependabot[bot]](https://github.com/apps/dependabot) ([#14417](https://github.com/paperless-ngx/paperless-ngx/pull/14417))
### All App Changes
<details>
<summary>12 changes</summary>
- Chore: share the authorizing owner rule between the id sets and the trash filter [@stumpylog](https://github.com/stumpylog) ([#14425](https://github.com/paperless-ngx/paperless-ngx/pull/14425))
- Fix: use a root document's effective content for the LLM index and pr… [@stumpylog](https://github.com/stumpylog) ([#14423](https://github.com/paperless-ngx/paperless-ngx/pull/14423))
- Fix: index document versions as their root document [@stumpylog](https://github.com/stumpylog) ([#14422](https://github.com/paperless-ngx/paperless-ngx/pull/14422))
- Fix: authorize document versions by their root in the single-object permission check [@stumpylog](https://github.com/stumpylog) ([#14421](https://github.com/paperless-ngx/paperless-ngx/pull/14421))
- Fix: Provide better error messages to users for invalid JSON [@stumpylog](https://github.com/stumpylog) ([#14419](https://github.com/paperless-ngx/paperless-ngx/pull/14419))
- Chore(deps): Bump the npm\_and\_yarn group across 1 directory with 2 updates @[dependabot[bot]](https://github.com/apps/dependabot) ([#14417](https://github.com/paperless-ngx/paperless-ngx/pull/14417))
- Fix: authorize document versions by their root and speed up permission id sets [@stumpylog](https://github.com/stumpylog) ([#14396](https://github.com/paperless-ngx/paperless-ngx/pull/14396))
- Chore: update the db options warning [@shamoon](https://github.com/shamoon) ([#14398](https://github.com/paperless-ngx/paperless-ngx/pull/14398))
- Fix: bulk reprocess latest version for root documents [@shamoon](https://github.com/shamoon) ([#14385](https://github.com/paperless-ngx/paperless-ngx/pull/14385))
- Fix: consistently use root doc for version action permissions [@shamoon](https://github.com/shamoon) ([#14384](https://github.com/paperless-ngx/paperless-ngx/pull/14384))
- Fix: Don't attempt to index created dates which are not representable in the FTS index [@stumpylog](https://github.com/stumpylog) ([#14390](https://github.com/paperless-ngx/paperless-ngx/pull/14390))
- Fix: retry a search index rebuild that was interrupted [@stumpylog](https://github.com/stumpylog) ([#14379](https://github.com/paperless-ngx/paperless-ngx/pull/14379))
</details>
## paperless-ngx 3.3.0
### Features / Enhancements
- Enhancement: more control over suggestion requests [@shamoon](https://github.com/shamoon) ([#14258](https://github.com/paperless-ngx/paperless-ngx/pull/14258))
- Chorehancement: set manifest CORS for credentials [@shamoon](https://github.com/shamoon) ([#14307](https://github.com/paperless-ngx/paperless-ngx/pull/14307))
- Enhancement: include Django admin with 2FA [@shamoon](https://github.com/shamoon) ([#14270](https://github.com/paperless-ngx/paperless-ngx/pull/14270))
- Feature: propagate resolved secrets to interactive container shells [@stumpylog](https://github.com/stumpylog) ([#14254](https://github.com/paperless-ngx/paperless-ngx/pull/14254))
- Enhancement: support separate embedding API key [@furkanural](https://github.com/furkanural) ([#14067](https://github.com/paperless-ngx/paperless-ngx/pull/14067))
- Enhancement: support passthrough extra params for LLMs [@shamoon](https://github.com/shamoon) ([#14202](https://github.com/paperless-ngx/paperless-ngx/pull/14202))
- Feature: store barcode contents, list and search them [@jurassicparkicecream](https://github.com/jurassicparkicecream) ([#14276](https://github.com/paperless-ngx/paperless-ngx/pull/14276))
### Bug Fixes
- Fix: Set the ProcessedMail owner based on the rule owner in all cases [@stumpylog](https://github.com/stumpylog) ([#14356](https://github.com/paperless-ngx/paperless-ngx/pull/14356))
- Fix: Ensure log rotation settings are converted to integers [@stumpylog](https://github.com/stumpylog) ([#14343](https://github.com/paperless-ngx/paperless-ngx/pull/14343))
- Fix: Wrap apt calls into a retry so we can ideally jump a slow mirror [@stumpylog](https://github.com/stumpylog) ([#14344](https://github.com/paperless-ngx/paperless-ngx/pull/14344))
- Fix: ship pdf.js CMaps so CJK documents render in the viewer [@MrOggy85](https://github.com/MrOggy85) ([#14318](https://github.com/paperless-ngx/paperless-ngx/pull/14318))
- Fix: use version page\_count for versioned document [@shamoon](https://github.com/shamoon) ([#14280](https://github.com/paperless-ngx/paperless-ngx/pull/14280))
- Fix: allow pointer events for pdf links in pngx viewer [@shamoon](https://github.com/shamoon) ([#14264](https://github.com/paperless-ngx/paperless-ngx/pull/14264))
- Fix: During a move to the trash directory, only attempt to copy metadata [@stumpylog](https://github.com/stumpylog) ([#14250](https://github.com/paperless-ngx/paperless-ngx/pull/14250))
- Fix: convert file mtime to the configured time zone directly [@stumpylog](https://github.com/stumpylog) ([#14249](https://github.com/paperless-ngx/paperless-ngx/pull/14249))
- Fix: ensure documentDeleted subscription is discarded [@shamoon](https://github.com/shamoon) ([#14247](https://github.com/paperless-ngx/paperless-ngx/pull/14247))
- Chore: Fix bugs in the test suite [@stumpylog](https://github.com/stumpylog) ([#14244](https://github.com/paperless-ngx/paperless-ngx/pull/14244))
- Fix: ensure bulk operations are checked against version root [@shamoon](https://github.com/shamoon) ([#14246](https://github.com/paperless-ngx/paperless-ngx/pull/14246))
- Fix: indexing after document-added workflows signal [@shamoon](https://github.com/shamoon) ([#14242](https://github.com/paperless-ngx/paperless-ngx/pull/14242))
- Fix: Record full tag and custom field lists in bulk edit audit log [@stumpylog](https://github.com/stumpylog) ([#14236](https://github.com/paperless-ngx/paperless-ngx/pull/14236))
- Chore: update pikepdf for ocrmypdf requirement [@shamoon](https://github.com/shamoon) ([#14235](https://github.com/paperless-ngx/paperless-ngx/pull/14235))
- Fix: handle legacy bulk edit split page range with missing page\_count [@shamoon](https://github.com/shamoon) ([#14212](https://github.com/paperless-ngx/paperless-ngx/pull/14212))
- Fix: ignore invalid EXIF orientation when generating image archives [@zhzy0077](https://github.com/zhzy0077) ([#14203](https://github.com/paperless-ngx/paperless-ngx/pull/14203))
### Documentation
- Documentation: correct duplicates info [@shamoon](https://github.com/shamoon) ([#14243](https://github.com/paperless-ngx/paperless-ngx/pull/14243))
### Maintenance
- Chore(deps): Bump the actions group across 1 directory with 4 updates @[dependabot[bot]](https://github.com/apps/dependabot) ([#14332](https://github.com/paperless-ngx/paperless-ngx/pull/14332))
- Fix: Wrap apt calls into a retry so we can ideally jump a slow mirror [@stumpylog](https://github.com/stumpylog) ([#14344](https://github.com/paperless-ngx/paperless-ngx/pull/14344))
- Chore(deps): Bump the actions group across 1 directory with 10 updates @[dependabot[bot]](https://github.com/apps/dependabot) ([#14301](https://github.com/paperless-ngx/paperless-ngx/pull/14301))
### Dependencies
<details>
<summary>27 changes</summary>
- Chore(deps): Bump django-filter from 25.2 to 26.1 @[dependabot[bot]](https://github.com/apps/dependabot) ([#14337](https://github.com/paperless-ngx/paperless-ngx/pull/14337))
- Chore(deps): Bump the utilities-patch group across 1 directory with 2 updates @[dependabot[bot]](https://github.com/apps/dependabot) ([#14338](https://github.com/paperless-ngx/paperless-ngx/pull/14338))
- Chore(deps): Bump the pre-commit-dependencies group across 1 directory with 3 updates @[dependabot[bot]](https://github.com/apps/dependabot) ([#14351](https://github.com/paperless-ngx/paperless-ngx/pull/14351))
- Chore(deps-dev): Bump types-channels from 4.3.0.20260408 to 4.3.0.20260518 @[dependabot[bot]](https://github.com/apps/dependabot) ([#14335](https://github.com/paperless-ngx/paperless-ngx/pull/14335))
- docker(deps): Bump astral-sh/uv from 0.12.20-python3.14-trixie-slim to 0.12.23-python3.14-trixie-slim @[dependabot[bot]](https://github.com/apps/dependabot) ([#14327](https://github.com/paperless-ngx/paperless-ngx/pull/14327))
- Chore(deps): Bump the actions group across 1 directory with 4 updates @[dependabot[bot]](https://github.com/apps/dependabot) ([#14332](https://github.com/paperless-ngx/paperless-ngx/pull/14332))
- Chore(deps): Bump the uv group across 1 directory with 2 updates @[dependabot[bot]](https://github.com/apps/dependabot) ([#14325](https://github.com/paperless-ngx/paperless-ngx/pull/14325))
- Chore(deps): Bump the frontend-angular-dependencies group across 1 directory with 13 updates @[dependabot[bot]](https://github.com/apps/dependabot) ([#14329](https://github.com/paperless-ngx/paperless-ngx/pull/14329))
- Chore(deps-dev): Bump prettier from 3.9.8 to 3.9.9 in /src-ui @[dependabot[bot]](https://github.com/apps/dependabot) ([#14331](https://github.com/paperless-ngx/paperless-ngx/pull/14331))
- Chore(deps-dev): Bump the frontend-eslint-dependencies group across 1 directory with 3 updates @[dependabot[bot]](https://github.com/apps/dependabot) ([#14330](https://github.com/paperless-ngx/paperless-ngx/pull/14330))
- Chore(deps-dev): Bump zensical from 0.0.64 to 0.0.65 in the development group @[dependabot[bot]](https://github.com/apps/dependabot) ([#14326](https://github.com/paperless-ngx/paperless-ngx/pull/14326))
- Chore(deps): Bump the uv group across 1 directory with 2 updates @[dependabot[bot]](https://github.com/apps/dependabot) ([#14314](https://github.com/paperless-ngx/paperless-ngx/pull/14314))
- Chore(deps): Bump the utilities-minor group across 1 directory with 7 updates @[dependabot[bot]](https://github.com/apps/dependabot) ([#14305](https://github.com/paperless-ngx/paperless-ngx/pull/14305))
- docker-compose(deps): bump greenmail/standalone from 2.1.13 to 2.1.14 in /docker/compose @[dependabot[bot]](https://github.com/apps/dependabot) ([#14281](https://github.com/paperless-ngx/paperless-ngx/pull/14281))
- docker(deps): Bump astral-sh/uv from 0.12.16-python3.14-trixie-slim to 0.12.20-python3.14-trixie-slim @[dependabot[bot]](https://github.com/apps/dependabot) ([#14282](https://github.com/paperless-ngx/paperless-ngx/pull/14282))
- Chore(deps): Bump the pre-commit-dependencies group across 1 directory with 3 updates @[dependabot[bot]](https://github.com/apps/dependabot) ([#14283](https://github.com/paperless-ngx/paperless-ngx/pull/14283))
- Chore(deps): Bump the utilities-patch group across 1 directory with 6 updates @[dependabot[bot]](https://github.com/apps/dependabot) ([#14297](https://github.com/paperless-ngx/paperless-ngx/pull/14297))
- Chore(deps): Bump the actions group across 1 directory with 10 updates @[dependabot[bot]](https://github.com/apps/dependabot) ([#14301](https://github.com/paperless-ngx/paperless-ngx/pull/14301))
- Chore(deps-dev): Bump the frontend-jest-dependencies group across 1 directory with 2 updates @[dependabot[bot]](https://github.com/apps/dependabot) ([#14286](https://github.com/paperless-ngx/paperless-ngx/pull/14286))
- Chore(deps-dev): Bump eslint from 10.10.0 to 10.11.0 in /src-ui in the frontend-eslint-dependencies group across 1 directory @[dependabot[bot]](https://github.com/apps/dependabot) ([#14287](https://github.com/paperless-ngx/paperless-ngx/pull/14287))
- Chore(deps-dev): Bump @types/node from 26.5.0 to 26.6.2 in /src-ui @[dependabot[bot]](https://github.com/apps/dependabot) ([#14288](https://github.com/paperless-ngx/paperless-ngx/pull/14288))
- Chore(deps-dev): Bump prettier from 3.9.6 to 3.9.8 in /src-ui @[dependabot[bot]](https://github.com/apps/dependabot) ([#14289](https://github.com/paperless-ngx/paperless-ngx/pull/14289))
- Chore(deps): Bump the frontend-angular-dependencies group across 1 directory with 10 updates @[dependabot[bot]](https://github.com/apps/dependabot) ([#14285](https://github.com/paperless-ngx/paperless-ngx/pull/14285))
- Chore: replace bleach with turbohtml [@gaborbernat](https://github.com/gaborbernat) ([#14269](https://github.com/paperless-ngx/paperless-ngx/pull/14269))
- Chore(deps): Bump autobahn from 25.12.2 to 26.7.1 in the uv group across 1 directory @[dependabot[bot]](https://github.com/apps/dependabot) ([#14231](https://github.com/paperless-ngx/paperless-ngx/pull/14231))
- Chore: update pikepdf for ocrmypdf requirement [@shamoon](https://github.com/shamoon) ([#14235](https://github.com/paperless-ngx/paperless-ngx/pull/14235))
- Chore(deps): Bump the pre-commit-dependencies group across 1 directory with 2 updates @[dependabot[bot]](https://github.com/apps/dependabot) ([#14133](https://github.com/paperless-ngx/paperless-ngx/pull/14133))
</details>
### All App Changes
<details>
<summary>41 changes</summary>
- Feature: store barcode contents, list and search them [@jurassicparkicecream](https://github.com/jurassicparkicecream) ([#14276](https://github.com/paperless-ngx/paperless-ngx/pull/14276))
- Fix: Set the ProcessedMail owner based on the rule owner in all cases [@stumpylog](https://github.com/stumpylog) ([#14356](https://github.com/paperless-ngx/paperless-ngx/pull/14356))
- Chore(deps): Bump django-filter from 25.2 to 26.1 @[dependabot[bot]](https://github.com/apps/dependabot) ([#14337](https://github.com/paperless-ngx/paperless-ngx/pull/14337))
- Chore(deps): Bump the utilities-patch group across 1 directory with 2 updates @[dependabot[bot]](https://github.com/apps/dependabot) ([#14338](https://github.com/paperless-ngx/paperless-ngx/pull/14338))
- Chore(deps-dev): Bump types-channels from 4.3.0.20260408 to 4.3.0.20260518 @[dependabot[bot]](https://github.com/apps/dependabot) ([#14335](https://github.com/paperless-ngx/paperless-ngx/pull/14335))
- Chore(deps): Bump the uv group across 1 directory with 2 updates @[dependabot[bot]](https://github.com/apps/dependabot) ([#14325](https://github.com/paperless-ngx/paperless-ngx/pull/14325))
- Fix: Ensure log rotation settings are converted to integers [@stumpylog](https://github.com/stumpylog) ([#14343](https://github.com/paperless-ngx/paperless-ngx/pull/14343))
- Chore(deps): Bump the frontend-angular-dependencies group across 1 directory with 13 updates @[dependabot[bot]](https://github.com/apps/dependabot) ([#14329](https://github.com/paperless-ngx/paperless-ngx/pull/14329))
- Chore(deps-dev): Bump prettier from 3.9.8 to 3.9.9 in /src-ui @[dependabot[bot]](https://github.com/apps/dependabot) ([#14331](https://github.com/paperless-ngx/paperless-ngx/pull/14331))
- Chore(deps-dev): Bump the frontend-eslint-dependencies group across 1 directory with 3 updates @[dependabot[bot]](https://github.com/apps/dependabot) ([#14330](https://github.com/paperless-ngx/paperless-ngx/pull/14330))
- Fix: ship pdf.js CMaps so CJK documents render in the viewer [@MrOggy85](https://github.com/MrOggy85) ([#14318](https://github.com/paperless-ngx/paperless-ngx/pull/14318))
- Chore(deps-dev): Bump zensical from 0.0.64 to 0.0.65 in the development group @[dependabot[bot]](https://github.com/apps/dependabot) ([#14326](https://github.com/paperless-ngx/paperless-ngx/pull/14326))
- Enhancement: more control over suggestion requests [@shamoon](https://github.com/shamoon) ([#14258](https://github.com/paperless-ngx/paperless-ngx/pull/14258))
- Chore(deps): Bump the uv group across 1 directory with 2 updates @[dependabot[bot]](https://github.com/apps/dependabot) ([#14314](https://github.com/paperless-ngx/paperless-ngx/pull/14314))
- Chore: anchor admin url pattern [@shamoon](https://github.com/shamoon) ([#14316](https://github.com/paperless-ngx/paperless-ngx/pull/14316))
- Chorehancement: set manifest CORS for credentials [@shamoon](https://github.com/shamoon) ([#14307](https://github.com/paperless-ngx/paperless-ngx/pull/14307))
- Chore(deps): Bump the utilities-minor group across 1 directory with 7 updates @[dependabot[bot]](https://github.com/apps/dependabot) ([#14305](https://github.com/paperless-ngx/paperless-ngx/pull/14305))
- Chore(deps): Bump the utilities-patch group across 1 directory with 6 updates @[dependabot[bot]](https://github.com/apps/dependabot) ([#14297](https://github.com/paperless-ngx/paperless-ngx/pull/14297))
- Chore(deps-dev): Bump the frontend-jest-dependencies group across 1 directory with 2 updates @[dependabot[bot]](https://github.com/apps/dependabot) ([#14286](https://github.com/paperless-ngx/paperless-ngx/pull/14286))
- Chore(deps-dev): Bump eslint from 10.10.0 to 10.11.0 in /src-ui in the frontend-eslint-dependencies group across 1 directory @[dependabot[bot]](https://github.com/apps/dependabot) ([#14287](https://github.com/paperless-ngx/paperless-ngx/pull/14287))
- Chore(deps-dev): Bump @types/node from 26.5.0 to 26.6.2 in /src-ui @[dependabot[bot]](https://github.com/apps/dependabot) ([#14288](https://github.com/paperless-ngx/paperless-ngx/pull/14288))
- Chore(deps-dev): Bump prettier from 3.9.6 to 3.9.8 in /src-ui @[dependabot[bot]](https://github.com/apps/dependabot) ([#14289](https://github.com/paperless-ngx/paperless-ngx/pull/14289))
- Chore(deps): Bump the frontend-angular-dependencies group across 1 directory with 10 updates @[dependabot[bot]](https://github.com/apps/dependabot) ([#14285](https://github.com/paperless-ngx/paperless-ngx/pull/14285))
- Fix: use version page\_count for versioned document [@shamoon](https://github.com/shamoon) ([#14280](https://github.com/paperless-ngx/paperless-ngx/pull/14280))
- Chore: replace bleach with turbohtml [@gaborbernat](https://github.com/gaborbernat) ([#14269](https://github.com/paperless-ngx/paperless-ngx/pull/14269))
- Enhancement: include Django admin with 2FA [@shamoon](https://github.com/shamoon) ([#14270](https://github.com/paperless-ngx/paperless-ngx/pull/14270))
- Fix: allow pointer events for pdf links in pngx viewer [@shamoon](https://github.com/shamoon) ([#14264](https://github.com/paperless-ngx/paperless-ngx/pull/14264))
- Feature: propagate resolved secrets to interactive container shells [@stumpylog](https://github.com/stumpylog) ([#14254](https://github.com/paperless-ngx/paperless-ngx/pull/14254))
- Fix: During a move to the trash directory, only attempt to copy metadata [@stumpylog](https://github.com/stumpylog) ([#14250](https://github.com/paperless-ngx/paperless-ngx/pull/14250))
- Fix: convert file mtime to the configured time zone directly [@stumpylog](https://github.com/stumpylog) ([#14249](https://github.com/paperless-ngx/paperless-ngx/pull/14249))
- Fix: ensure documentDeleted subscription is discarded [@shamoon](https://github.com/shamoon) ([#14247](https://github.com/paperless-ngx/paperless-ngx/pull/14247))
- Chore: Fix bugs in the test suite [@stumpylog](https://github.com/stumpylog) ([#14244](https://github.com/paperless-ngx/paperless-ngx/pull/14244))
- Fix: ensure bulk operations are checked against version root [@shamoon](https://github.com/shamoon) ([#14246](https://github.com/paperless-ngx/paperless-ngx/pull/14246))
- Enhancement: support separate embedding API key [@furkanural](https://github.com/furkanural) ([#14067](https://github.com/paperless-ngx/paperless-ngx/pull/14067))
- Enhancement: support passthrough extra params for LLMs [@shamoon](https://github.com/shamoon) ([#14202](https://github.com/paperless-ngx/paperless-ngx/pull/14202))
- Chore(deps): Bump autobahn from 25.12.2 to 26.7.1 in the uv group across 1 directory @[dependabot[bot]](https://github.com/apps/dependabot) ([#14231](https://github.com/paperless-ngx/paperless-ngx/pull/14231))
- Fix: indexing after document-added workflows signal [@shamoon](https://github.com/shamoon) ([#14242](https://github.com/paperless-ngx/paperless-ngx/pull/14242))
- Fix: Record full tag and custom field lists in bulk edit audit log [@stumpylog](https://github.com/stumpylog) ([#14236](https://github.com/paperless-ngx/paperless-ngx/pull/14236))
- Chore: update pikepdf for ocrmypdf requirement [@shamoon](https://github.com/shamoon) ([#14235](https://github.com/paperless-ngx/paperless-ngx/pull/14235))
- Fix: handle legacy bulk edit split page range with missing page\_count [@shamoon](https://github.com/shamoon) ([#14212](https://github.com/paperless-ngx/paperless-ngx/pull/14212))
- Fix: ignore invalid EXIF orientation when generating image archives [@zhzy0077](https://github.com/zhzy0077) ([#14203](https://github.com/paperless-ngx/paperless-ngx/pull/14203))
</details>
## paperless-ngx 3.2.1
### Bug Fixes
+1 -3
View File
@@ -76,9 +76,7 @@ is not supported by any of the available parsers.
**A:** Not by default. As of v3, a file whose contents match an existing document is still
consumed, and the duplicate is flagged in the UI — open the document and check the
**Duplicates** tab to review documents that share the same content, or filter the document
list by **Duplicates** to find all of them (see
[Duplicate documents](usage.md#duplicate-documents)). If you prefer the old
**Duplicates** tab to review documents that share the same content. If you prefer the old
behavior of rejecting duplicates during consumption, set
[`PAPERLESS_CONSUMER_DELETE_DUPLICATES`](configuration.md#PAPERLESS_CONSUMER_DELETE_DUPLICATES)
to `true`.
+4 -4
View File
@@ -12,10 +12,10 @@ physical documents into a searchable online archive so you can keep, well, _less
[Get started](setup.md){ .md-button .md-button--primary .index-callout }
[Demo](https://demo.paperless-ngx.com){ .md-button .md-button--secondary target=\_blank }
<div class="demo-sponsor">
<span>Demo hosting by</span>
<a href="https://fyrastack.com" target="_blank" rel="noopener">
<img src="assets/sponsors/fyra-stack.svg" alt="" class="no-lightbox" width="20" height="20"> Fyra Stack
<div style="display: flex; justify-content: end; margin-top: -1.5rem;">
<a href="https://m.do.co/c/8d70b916d462" target="_blank">
<img src="https://opensource.nyc3.cdn.digitaloceanspaces.com/attribution/assets/PoweredByDO/DO_Powered_by_Badge_white.svg#only-dark" class="no-lightbox" width="150px">
<img src="https://opensource.nyc3.cdn.digitaloceanspaces.com/attribution/assets/PoweredByDO/DO_Powered_by_Badge_black.svg#only-light" class="no-lightbox" width="150px">
</a>
</div>
+1 -60
View File
@@ -129,7 +129,7 @@ change in the `docker-compose.yml` file:
command:
- 'gotenberg'
- '--chromium-disable-javascript=true'
- '--chromium-allow-list=^file:///tmp/.*'
- '--chromium-allow-list=file:///tmp/.*'
- '--api-timeout=60s'
```
@@ -272,65 +272,6 @@ This error can occur in installations which have upgraded from a version of Pape
$ python3 manage.py convert_mariadb_uuid
```
## MariaDB/MySQL error "Illegal mix of collations"
Consumption or other operations fail with an error like:
```
(1267, "Illegal mix of collations (utf8mb4_general_ci,IMPLICIT) and
(utf8mb4_unicode_ci,IMPLICIT) for operation '='")
```
This happens when the tables in your database do not all use the same
collation. It is most often seen on databases that existed before a
MariaDB/MySQL upgrade: older tables keep their original collation, while
tables created afterwards use the new server default.
To work around it, set the collation your existing tables use (the one in the error
that is not `utf8mb4_unicode_ci`) with
[`PAPERLESS_DB_OPTIONS`](configuration.md#PAPERLESS_DB_OPTIONS):
```bash
PAPERLESS_DB_OPTIONS="collation=utf8mb4_general_ci"
```
To fix it permanently, back up your database, then convert the database and
each table to a single collation and remove the override:
```sql
ALTER DATABASE paperless CHARACTER SET utf8mb4 COLLATE utf8mb4_unicode_ci;
ALTER TABLE <table_name> CONVERT TO CHARACTER SET utf8mb4 COLLATE utf8mb4_unicode_ci;
```
## PostgreSQL warns about a "collation version mismatch"
The PostgreSQL log shows a warning like:
```
WARNING: database "paperless" has a collation version mismatch
DETAIL: The database was created using collation version 2.36, but the operating system provides version 2.41.
HINT: Rebuild all objects in this database that use the default collation and run ALTER DATABASE paperless REFRESH COLLATION VERSION, or build PostgreSQL with the right library version.
```
This comes from PostgreSQL, not Paperless-ngx. The `glibc` version that PostgreSQL
runs against changed, and the existing database was created with an older one. With
Docker, `glibc` comes from the PostgreSQL image's Debian base, not the host, so this
commonly happens when a new image is pulled after its base Debian release changed.
If PostgreSQL is installed directly on a host, it uses the host's `glibc` instead.
The warning is not an error and Paperless-ngx keeps working, but the database's text
indexes may be built with outdated sorting rules. To resolve it, back up your
database, then connect to it (for example with `psql -U paperless -d paperless`
inside the database container) and run:
```sql
REINDEX DATABASE paperless;
ALTER DATABASE paperless REFRESH COLLATION VERSION;
```
To avoid this in the future, pin your PostgreSQL image to a specific Debian release,
for example `postgres:18-trixie`, rather than `postgres:18`.
## Platform-Specific Deployment Troubleshooting
A user-maintained wiki page is available to help troubleshoot issues that may arise when trying to deploy Paperless-ngx on specific platforms, for example SELinux. Please see [the wiki](https://github.com/paperless-ngx/paperless-ngx/wiki/Platform%E2%80%90Specific-Troubleshooting).
+8 -7
View File
@@ -299,18 +299,19 @@ for details.
### Duplicate documents
By default, Paperless-ngx **does not reject duplicates**. If you consume a file whose
contents match an existing document (same original or archive checksum), the new copy is
still consumed and a warning is logged.
contents exactly match an existing document (same checksum), the new copy is still
consumed and a warning is logged. The task entry for the upload also flags that a
duplicate was detected and links to the existing document(s).
When a document has duplicates, a **Duplicates** tab appears on its detail page, listing
the other documents you can view that share the same content (including any in the trash).
To find all documents with duplicates, choose **Duplicates** in the document list's text
filter dropdown, or use `has_duplicates=true` in the REST API.
To review duplicates, open a document and switch to the **Duplicates** tab on the
document detail page. It lists other documents that share the same content, including any
that are in the trash (shown with a badge), and links to each so you can decide which to
keep.
If you would rather reject duplicates at consumption time (the pre-v3 behavior), set
[`PAPERLESS_CONSUMER_DELETE_DUPLICATES`](configuration.md#PAPERLESS_CONSUMER_DELETE_DUPLICATES)
to `true`. The duplicate file is then deleted instead of consumed, and the task fails with
a "Document already exists" message linking to the existing document.
a "document already exists" message.
## Document Suggestions
+2 -2
View File
@@ -1,6 +1,6 @@
[project]
name = "paperless-ngx"
version = "3.3.1"
version = "3.2.1"
description = """\
A community-supported supercharged document management system: scan, index and archive all your physical documents\
"""
@@ -43,7 +43,7 @@ dependencies = [
"drf-spectacular~=0.30",
"drf-spectacular-sidecar>=2026.7.1,<2026.10",
"drf-writable-nested~=0.7.1",
"filelock>=3.32,<4.1",
"filelock~=3.32.0",
"flower>=2.0.1,<2.3",
"gotenberg-client[httpx]~=1.0",
"httpx-oauth~=0.17",
+1 -1
View File
@@ -2,5 +2,5 @@
docker run -p 5432:5432 -e POSTGRES_PASSWORD=password -v paperless_pgdata:/var/lib/postgresql/data -d postgres:15
docker run -d -p 6379:6379 redis:latest
docker run -p 3000:3000 -d gotenberg/gotenberg:7.8 gotenberg --chromium-disable-javascript=true --chromium-allow-list="^file:///tmp/.*"
docker run -p 3000:3000 -d gotenberg/gotenberg:7.8 gotenberg --chromium-disable-javascript=true --chromium-allow-list="file:///tmp/.*"
docker run -p 9998:9998 -d docker.io/apache/tika:latest
-2
View File
@@ -15,8 +15,6 @@ module.exports = {
tsconfig: '<rootDir>/tsconfig.spec.json',
stringifyContentPathRegex: '\\.(html|svg)$',
useESM: true,
// Disable the builder's deprecated override; tsconfig.spec.json enables isolation.
isolatedModules: false,
},
],
},
+167 -178
View File
File diff suppressed because it is too large. Load diff
+1 -1
View File
@@ -1,6 +1,6 @@
{
"name": "paperless-ngx-ui",
"version": "3.3.1",
"version": "3.2.1",
"scripts": {
"preinstall": "npx only-allow pnpm",
"ng": "ng",
@@ -102,34 +102,25 @@
</button>
}
@if (selectedSection !== TaskSection.All && totalTasks() > pageSize) {
<ngb-pagination
[pageSize]="pageSize"
[collectionSize]="totalTasks()"
[page]="page"
[maxSize]="5"
[rotate]="true"
size="sm"
aria-label="Tasks pagination"
(pageChange)="setPage($event)">
</ngb-pagination>
}
<ngb-pagination
[pageSize]="pageSize"
[collectionSize]="totalTasks()"
[page]="page"
[maxSize]="5"
[rotate]="true"
size="sm"
aria-label="Tasks pagination"
(pageChange)="setPage($event)">
</ngb-pagination>
</div>
<ng-template let-tasks="tasks" let-section="section" #tasksTemplate>
<div class="section-header mb-2">
<h5 class="mb-0">{{ sectionLabel(section) }}</h5>
@let count = sectionCount(section);
@let hasMore = selectedSection === TaskSection.All && count > tasks.length;
<div class="small text-muted">
@if (hasMore) {
<ng-container i18n>{{tasks.length}} of {{count}} tasks</ng-container>
<button class="btn btn-link show-all p-0 ms-2 align-baseline" type="button" (click)="setSection(section)">
<ng-container i18n>Show all</ng-container><i-bs class="ms-1" width="1em" height="1em" name="arrow-right"></i-bs>
</button>
} @else {
<ng-container i18n>{count, plural, =1 {1 task} other {{{count}} tasks}}</ng-container>
}
<div class="section-header d-flex align-items-center justify-content-between mb-2">
<div>
<h5 class="mb-0">{{ sectionLabel(section) }}</h5>
<div class="small text-muted">
<ng-container i18n>{tasks.length, plural, =1 {1 task} other {{{tasks.length}} tasks}}</ng-container>
</div>
</div>
</div>
@@ -178,9 +169,10 @@
<div>{{ taskDisplayName(task) }}</div>
<div class="small text-muted">
@if (taskShowsSeparateTypeLabel(task)) {
<span class="me-2">{{ task.task_type_display }}</span>
<span>{{ task.task_type_display }}</span>
<span class="mx-1">&bull;</span>
}
<span class="text-nowrap"><i-bs class="me-1" width="1em" height="1em" name="box-arrow-in-right"></i-bs>{{ task.trigger_source_display }}</span>
<span>{{ task.trigger_source_display }}</span>
</div>
</td>
<td class="d-none d-lg-table-cell created-col">{{ task.date_created | customDate:'short' }}</td>
@@ -72,7 +72,3 @@ pre {
tbody tr:nth-last-child(2) td {
border-bottom: none !important;
}
.section-header .show-all {
font-size: inherit;
}
@@ -223,6 +223,16 @@ describe('TasksComponent', () => {
)
.flush(paginatedTasks)
httpTestingController
.expectOne(
(req) =>
req.url === `${environment.apiBaseUrl}tasks/` &&
req.params.get('acknowledged') === 'false' &&
req.params.get('page_size') === '25' &&
req.params.get('page') === '1'
)
.flush(paginatedTasks)
httpTestingController
.expectOne(
(req) =>
@@ -231,30 +241,8 @@ describe('TasksComponent', () => {
!req.params.has('status')
)
.flush(sectionCountResponse)
flushTaskLists(10)
})
// answers task list requests with the fixture tasks matching their status filter
function flushTaskLists(pageSize: number, count?: number) {
httpTestingController
.match(
(req) =>
req.url === `${environment.apiBaseUrl}tasks/` &&
req.params.get('page_size') === `${pageSize}`
)
.forEach((req) => {
const statuses = req.request.params.getAll('status')
const results = tasks.filter((task) => statuses.includes(task.status))
req.flush({ count: count ?? results.length, results })
})
}
function selectSection(section: TaskSection, count: number) {
component.setSection(section)
flushTaskLists(25, count)
}
it('should display task sections with counts', () => {
expect(component.selectedSection).toBe(TaskSection.All)
expect(component.selectedTaskType).toBeNull()
@@ -350,7 +338,6 @@ describe('TasksComponent', () => {
})
it('should render pagination controls next to the task filter', () => {
selectSection(TaskSection.Completed, 30)
fixture.detectChanges()
const controls = fixture.debugElement.query(By.css('.task-controls'))
@@ -361,51 +348,6 @@ describe('TasksComponent', () => {
expect(pagination).not.toBeNull()
})
it('should only paginate a section with more than one page of tasks', () => {
const pagination = () =>
fixture.debugElement.query(By.css('ngb-pagination'))
fixture.detectChanges()
expect(pagination()).toBeNull()
selectSection(TaskSection.Completed, 2)
fixture.detectChanges()
expect(pagination()).toBeNull()
})
it('should load the all tasks overview one section at a time', () => {
expect(component.tasksForSection(TaskSection.NeedsAttention)).toHaveLength(
2
)
expect(component.tasksForSection(TaskSection.InProgress)).toHaveLength(3)
expect(component.tasksForSection(TaskSection.Completed)).toHaveLength(2)
expect(component.totalTasks()).toBe(7)
})
it('should show section totals and link truncated sections to their full list', () => {
component.sectionCounts.update((counts) => ({
...counts,
[TaskSection.Completed]: 27,
}))
fixture.detectChanges()
const header = (label: string) =>
fixture.debugElement
.queryAll(By.css('.section-header'))
.find((h) => h.nativeElement.textContent.includes(label))
expect(header('Needs attention').nativeElement.textContent).toContain(
'2 tasks'
)
expect(header('Needs attention').query(By.css('button'))).toBeNull()
expect(header('Recently completed').nativeElement.textContent).toContain(
'2 of 27 tasks'
)
header('Recently completed').query(By.css('button')).nativeElement.click()
expect(component.selectedSection).toBe(TaskSection.Completed)
})
it('should apply the selected section to the server-side task query', () => {
component.setSection(TaskSection.NeedsAttention)
@@ -426,56 +368,55 @@ describe('TasksComponent', () => {
it('should apply task type and trigger source filters to the server-side task query', () => {
component.setTaskType(PaperlessTaskType.SanityCheck)
expect(
httpTestingController.match(
httpTestingController
.expectOne(
(request) =>
request.url === `${environment.apiBaseUrl}tasks/` &&
request.params.get('page_size') === '10' &&
request.params.get('page_size') === '25' &&
request.params.get('task_type') === PaperlessTaskType.SanityCheck
)
).toHaveLength(3)
.flush({ count: 1, results: [tasks[6]] })
component.setTriggerSource(PaperlessTaskTriggerSource.System)
expect(
httpTestingController.match(
httpTestingController
.expectOne(
(request) =>
request.url === `${environment.apiBaseUrl}tasks/` &&
request.params.get('page_size') === '10' &&
request.params.get('page_size') === '25' &&
request.params.get('task_type') === PaperlessTaskType.SanityCheck &&
request.params.get('trigger_source') ===
PaperlessTaskTriggerSource.System
)
).toHaveLength(3)
.flush({ count: 1, results: [tasks[6]] })
})
it('should apply text filters to the server-side task query', () => {
component.filterText = 'invoice'
jest.advanceTimersByTime(150)
expect(
httpTestingController.match(
httpTestingController
.expectOne(
(request) =>
request.url === `${environment.apiBaseUrl}tasks/` &&
request.params.get('page_size') === '10' &&
request.params.get('page_size') === '25' &&
request.params.get('name') === 'invoice'
)
).toHaveLength(3)
.flush({ count: 1, results: [tasks[0]] })
component.setFilterTarget(TaskFilterTargetID.Result)
expect(
httpTestingController.match(
httpTestingController
.expectOne(
(request) =>
request.url === `${environment.apiBaseUrl}tasks/` &&
request.params.get('page_size') === '10' &&
request.params.get('page_size') === '25' &&
request.params.get('result') === 'invoice'
)
).toHaveLength(3)
.flush({ count: 0, results: [] })
})
it('should load a different task page when pagination changes', () => {
selectSection(TaskSection.Completed, 30)
component.setPage(2)
const pageTwoTasks = {
@@ -499,7 +440,6 @@ describe('TasksComponent', () => {
})
it('should not replace section counts with current-page counts', () => {
selectSection(TaskSection.Completed, 30)
component.setPage(2)
httpTestingController
@@ -515,21 +455,11 @@ describe('TasksComponent', () => {
results: [tasks[0]],
})
expect(component.sectionCount(TaskSection.All)).toBe(7)
expect(component.sectionCount(TaskSection.NeedsAttention)).toBe(2)
expect(component.sectionCount(TaskSection.InProgress)).toBe(3)
expect(component.sectionCount(TaskSection.Completed)).toBe(2)
})
it('should stop loading when the overview fails to load', () => {
component.setSection(TaskSection.All)
httpTestingController
.match((req) => req.params.get('page_size') === '10')[0]
.flush('', { status: 500, statusText: 'Error' })
expect(component.loading()).toBe(false)
})
it('should expose stable task type options and disable empty ones', () => {
expect(component.taskTypeOptions.map((option) => option.value)).toContain(
PaperlessTaskType.TrainClassifier
@@ -15,9 +15,6 @@ import {
distinctUntilChanged,
filter,
first,
forkJoin,
map,
Observable,
Subject,
takeUntil,
timer,
@@ -28,7 +25,6 @@ import {
PaperlessTaskTriggerSource,
PaperlessTaskType,
} from 'src/app/data/paperless-task'
import { Results } from 'src/app/data/results'
import { IfPermissionsDirective } from 'src/app/directives/if-permissions.directive'
import { CustomDatePipe } from 'src/app/pipes/custom-date.pipe'
import { TasksService } from 'src/app/services/tasks.service'
@@ -173,7 +169,6 @@ export class TasksComponent
public expandedTask: number
public autoRefreshEnabled: boolean = true
public readonly pageSize = 25
public readonly overviewSize = 10
public page: number = 1
readonly totalTasks = signal(0)
readonly sectionCounts = signal<Record<TaskSection, number>>({
@@ -489,6 +484,13 @@ export class TasksComponent
return this.sectionCounts()[section]
}
private setSectionCount(section: TaskSection, count: number) {
this.sectionCounts.update((counts) => ({
...counts,
[section]: count,
}))
}
sectionShowsResults(section: TaskSection): boolean {
return section !== TaskSection.InProgress
}
@@ -735,12 +737,21 @@ export class TasksComponent
this.reloadSectionCounts()
this.loading.set(true)
this.listTasks()
this.tasksService
.list(
this.page,
this.pageSize,
this.getParamsForSection(this.selectedSection)
)
.pipe(first(), takeUntil(this.unsubscribeNotifier))
.subscribe({
next: (result) => {
this.pagedTasks.set(result.results)
this.totalTasks.set(result.count)
this.setSectionCount(TaskSection.All, result.count)
if (this.selectedSection !== TaskSection.All) {
this.setSectionCount(this.selectedSection, result.count)
}
this.loading.set(false)
if (
this.page > 1 &&
@@ -756,30 +767,4 @@ export class TasksComponent
},
})
}
private listTasks(): Observable<Results<PaperlessTask>> {
if (this.selectedSection !== TaskSection.All) {
return this.tasksService.list(
this.page,
this.pageSize,
this.getParamsForSection(this.selectedSection)
)
}
// All is an overview of each section to avoid splitting sections across pages
return forkJoin(
this.sections.map((section) =>
this.tasksService.list(
1,
this.overviewSize,
this.getParamsForSection(section)
)
)
).pipe(
map((results) => ({
count: results.reduce((sum, result) => sum + result.count, 0),
results: results.flatMap((result) => result.results),
}))
)
}
}
@@ -154,31 +154,6 @@ describe('UsersAndGroupsComponent', () => {
jest.useRealTimers()
})
it('should logout current user under base href if password changed', () => {
jest.useFakeTimers()
const base = document.createElement('base')
base.href = '/paperless/'
document.head.appendChild(base)
completeSetup()
let modal: NgbModalRef
modalService.activeInstances.subscribe((refs) => (modal = refs[0]))
component.editUser(users[0])
const navSpy = jest
.spyOn(navUtils, 'setLocationHref')
.mockImplementation(() => {})
const editDialog = modal.componentInstance as UserEditDialogComponent
editDialog.passwordIsSet = true
settingsService.currentUser.set(users[0]) // simulate logged in as same user
editDialog.succeeded.emit(users[0])
fixture.detectChanges()
jest.advanceTimersByTime(2600)
expect(navSpy).toHaveBeenCalledWith(
`${window.location.origin}/paperless/accounts/logout/?next=/paperless/accounts/login/?next=/paperless/`
)
base.remove()
jest.useRealTimers()
})
it('should support edit / create group, show error if needed', () => {
completeSetup()
let modal: NgbModalRef
@@ -116,9 +116,8 @@ export class UsersAndGroupsComponent
$localize`Password has been changed, you will be logged out momentarily.`
)
setTimeout(() => {
const basePath = new URL(document.baseURI).pathname
setLocationHref(
`${window.location.origin}${basePath}accounts/logout/?next=${basePath}accounts/login/?next=${basePath}`
`${window.location.origin}/accounts/logout/?next=/accounts/login/?next=/`
)
}, 2500)
} else {
@@ -218,38 +218,6 @@ describe('ProfileEditDialogComponent', () => {
jest.useRealTimers()
})
it('should logout under base href on save if password changed', () => {
jest.useFakeTimers()
const base = document.createElement('base')
base.href = '/paperless/'
document.head.appendChild(base)
const getSpy = jest.spyOn(profileService, 'get')
getSpy.mockReturnValue(of(profile))
const getProvidersSpy = jest.spyOn(
profileService,
'getSocialAccountProviders'
)
getProvidersSpy.mockReturnValue(of(socialAccountProviders))
component.ngOnInit()
component['newPassword'] = 'new*pass'
component.form.get('password').patchValue('new*pass')
component.form.get('password_confirm').patchValue('new*pass')
const updateSpy = jest.spyOn(profileService, 'update')
updateSpy.mockReturnValue(of(null))
const navSpy = jest
.spyOn(navUtils, 'setLocationHref')
.mockImplementation(() => {})
component.save()
expect(updateSpy).toHaveBeenCalled()
jest.advanceTimersByTime(2600)
expect(navSpy).toHaveBeenCalledWith(
`${window.location.origin}/paperless/accounts/logout/?next=/paperless/accounts/login/?next=/paperless/`
)
base.remove()
jest.useRealTimers()
})
it('should support auth token copy', () => {
jest.useFakeTimers()
const getSpy = jest.spyOn(profileService, 'get')
@@ -210,9 +210,8 @@ export class ProfileEditDialogComponent
$localize`Password has been changed, you will be logged out momentarily.`
)
setTimeout(() => {
const basePath = new URL(document.baseURI).pathname
setLocationHref(
`${window.location.origin}${basePath}accounts/logout/?next=${basePath}accounts/login/?next=${basePath}`
`${window.location.origin}/accounts/logout/?next=/accounts/login/?next=/`
)
}, 2500)
}
@@ -1,6 +1,6 @@
<div class="d-flex align-items-center">
<div class="btn-group">
<button type="button" class="btn btn-sm btn-outline-primary" (click)="clickSuggest()" [disabled]="disabled() || loading()" [aria-label]="noSuggestions ? 'No suggestions' : 'Suggest'" i18n-aria-label>
<button type="button" class="btn btn-sm btn-outline-primary" (click)="clickSuggest()" [disabled]="disabled() || loading() || (suggestions() && !aiEnabled())" [aria-label]="noSuggestions ? 'No suggestions' : 'Suggest'" i18n-aria-label>
@if (loading()) {
<div class="spinner-border spinner-border-sm" role="status"></div>
} @else if (noSuggestions) {
@@ -18,44 +18,46 @@
}
</button>
<div class="btn-group" ngbDropdown #dropdown="ngbDropdown" [popperOptions]="popperOptions">
<button type="button" class="btn btn-sm btn-outline-primary" ngbDropdownToggle [disabled]="disabled() || loading() || !suggestions()" aria-expanded="false" aria-controls="suggestionsDropdown" aria-label="Suggestions dropdown">
<span class="visually-hidden" i18n>Show suggestions</span>
</button>
@if (aiEnabled()) {
<div class="btn-group" ngbDropdown #dropdown="ngbDropdown" [popperOptions]="popperOptions">
<button type="button" class="btn btn-sm btn-outline-primary" ngbDropdownToggle [disabled]="disabled() || loading() || !suggestions()" aria-expanded="false" aria-controls="suggestionsDropdown" aria-label="Suggestions dropdown">
<span class="visually-hidden" i18n>Show suggestions</span>
</button>
<div ngbDropdownMenu aria-labelledby="suggestionsDropdown" class="shadow suggestions-dropdown">
<div class="list-group list-group-flush small pb-0">
@if (novelSuggestions === 0 && fieldSuggestions === 0) {
<div class="list-group-item text-muted fst-italic">
<small class="text-muted small fst-italic" i18n>No novel suggestions</small>
</div>
}
@if (suggestions()?.suggested_tags?.length > 0) {
<small class="list-group-item text-uppercase text-muted small"><i-bs class="me-2" name="tags"></i-bs><ng-container i18n>Tags</ng-container></small>
@for (tag of suggestions().suggested_tags; track tag) {
<button type="button" class="list-group-item list-group-item-action bg-light" (click)="addTag.emit(tag)">{{ tag }}</button>
<div ngbDropdownMenu aria-labelledby="suggestionsDropdown" class="shadow suggestions-dropdown">
<div class="list-group list-group-flush small pb-0">
@if (novelSuggestions === 0 && fieldSuggestions === 0) {
<div class="list-group-item text-muted fst-italic">
<small class="text-muted small fst-italic" i18n>No novel suggestions</small>
</div>
}
}
@if (suggestions()?.suggested_document_types?.length > 0) {
<div class="list-group-item text-uppercase text-muted small"><i-bs class="me-2" name="hash"></i-bs><ng-container i18n>Document Types</ng-container></div>
@for (type of suggestions().suggested_document_types; track type) {
<button type="button" class="list-group-item list-group-item-action bg-light" (click)="addDocumentType.emit(type)">{{ type }}</button>
@if (suggestions()?.suggested_tags?.length > 0) {
<small class="list-group-item text-uppercase text-muted small"><i-bs class="me-2" name="tags"></i-bs><ng-container i18n>Tags</ng-container></small>
@for (tag of suggestions().suggested_tags; track tag) {
<button type="button" class="list-group-item list-group-item-action bg-light" (click)="addTag.emit(tag)">{{ tag }}</button>
}
}
}
@if (suggestions()?.suggested_correspondents?.length > 0) {
<div class="list-group-item text-uppercase text-muted small"><i-bs class="me-2" name="person"></i-bs><ng-container i18n>Correspondents</ng-container></div>
@for (correspondent of suggestions().suggested_correspondents; track correspondent) {
<button type="button" class="list-group-item list-group-item-action bg-light" (click)="addCorrespondent.emit(correspondent)">{{ correspondent }}</button>
@if (suggestions()?.suggested_document_types?.length > 0) {
<div class="list-group-item text-uppercase text-muted small"><i-bs class="me-2" name="hash"></i-bs><ng-container i18n>Document Types</ng-container></div>
@for (type of suggestions().suggested_document_types; track type) {
<button type="button" class="list-group-item list-group-item-action bg-light" (click)="addDocumentType.emit(type)">{{ type }}</button>
}
}
}
@if (fieldSuggestions > 0) {
<div class="list-group-item text-muted fst-italic">
<small class="text-muted small fst-italic" i18n>{fieldSuggestions, plural, =1 {1 suggestion available below} other {{{fieldSuggestions}} suggestions available below}}</small>
</div>
}
@if (suggestions()?.suggested_correspondents?.length > 0) {
<div class="list-group-item text-uppercase text-muted small"><i-bs class="me-2" name="person"></i-bs><ng-container i18n>Correspondents</ng-container></div>
@for (correspondent of suggestions().suggested_correspondents; track correspondent) {
<button type="button" class="list-group-item list-group-item-action bg-light" (click)="addCorrespondent.emit(correspondent)">{{ correspondent }}</button>
}
}
@if (fieldSuggestions > 0) {
<div class="list-group-item text-muted fst-italic">
<small class="text-muted small fst-italic" i18n>{fieldSuggestions, plural, =1 {1 suggestion available below} other {{{fieldSuggestions}} suggestions available below}}</small>
</div>
}
</div>
</div>
</div>
</div>
}
</div>
@if (aiEnabled()) {
@@ -251,37 +251,6 @@ describe('SuggestionsDropdownComponent', () => {
expect(fixture.nativeElement.textContent).toContain('No novel suggestions')
})
it('should open ML date suggestions with AI disabled', () => {
const getSuggestions = jest.spyOn(component.getSuggestions, 'emit')
fixture.componentRef.setInput('aiEnabled', false)
fixture.componentRef.setInput('fetchedSources', [SuggestionSource.ML])
fixture.componentRef.setInput('suggestions', {
dates: ['2026-01-04', '2026-02-01'],
})
fixture.componentRef.setInput('appliedCreated', '2026-01-04')
fixture.detectChanges()
const button = fixture.nativeElement.querySelector('button')
expect(button.disabled).toBeFalsy()
expect(button.querySelector('.badge').textContent.trim()).toBe('1')
button.click()
fixture.detectChanges()
expect(component.dropdown.isOpen()).toBeTruthy()
expect(fixture.nativeElement.textContent).toContain(
'1 suggestion available below'
)
expect(getSuggestions).not.toHaveBeenCalled()
expect(
fixture.nativeElement.querySelector('button[title="Suggestion options"]')
).toBeNull()
button.click()
fixture.detectChanges()
expect(component.dropdown.isOpen()).toBeFalsy()
})
it('should fetch unfetched sources and show existing suggestions', () => {
jest.spyOn(component.getSuggestions, 'emit')
fixture.componentRef.setInput('aiEnabled', true)
@@ -53,7 +53,11 @@ export class SuggestionsDropdownComponent {
addCorrespondent: EventEmitter<string> = new EventEmitter()
public clickSuggest(): void {
if (this.disabled() || this.loading()) {
if (
this.disabled() ||
this.loading() ||
(this.suggestions() && !this.aiEnabled())
) {
return
}
@@ -25,8 +25,6 @@
@if (displayFields().includes(field)) {
<th
scope="col"
class="text-truncate"
[title]="getColumnTitle(field)"
[ngClass]="{
'd-none d-md-table-cell': i > 1,
'w-25': field === DisplayField.CREATED || field === DisplayField.ADDED
@@ -484,22 +484,6 @@ describe('FilterEditorComponent', () => {
expect(component.textFilter).toBeNull()
})
it('should ingest title filter rules alongside a fulltext query with date created', () => {
component.filterRules = [
{
rule_type: FILTER_SIMPLE_TITLE,
value: 'foo',
},
{
rule_type: FILTER_FULLTEXT_QUERY,
value: 'created:[-1 week to now]',
},
]
expect(component.dateCreatedRelativeDate).toEqual(1) // RELATIVE_DATE_QUERYSTRINGS['-1 week to now']
expect(component.textFilter).toEqual('foo')
expect(component.textFilterTarget).toEqual('title') // TEXT_FILTER_TARGET_TITLE
})
it('should ingest text filter rules for fulltext query that include date added', () => {
expect(component.dateAddedRelativeDate).toBeNull()
component.filterRules = [
@@ -1861,7 +1845,7 @@ describe('FilterEditorComponent', () => {
])
})
it('should keep text filtering separate from date created relative date', () => {
it('should carry over text filtering on date created with relative date', () => {
component.textFilter = 'foo'
const dateCreatedDropdown = fixture.debugElement.queryAll(
By.directive(DatesDropdownComponent)
@@ -1871,18 +1855,14 @@ describe('FilterEditorComponent', () => {
fixture.detectChanges()
tick(400)
expect(component.filterRules).toEqual([
{
rule_type: FILTER_SIMPLE_TEXT,
value: 'foo',
},
{
rule_type: FILTER_FULLTEXT_QUERY,
value: 'created:[-1 week to now]',
value: 'foo,created:[-1 week to now]',
},
])
})
it('should keep text filtering separate from created and added relative dates', () => {
it('should carry over text filtering once with created and added relative dates', () => {
component.textFilter = 'foo'
const datesDropdown = fixture.debugElement.query(
By.directive(DatesDropdownComponent)
@@ -1893,18 +1873,14 @@ describe('FilterEditorComponent', () => {
fixture.detectChanges()
tick(400)
expect(component.filterRules).toEqual([
{
rule_type: FILTER_SIMPLE_TEXT,
value: 'foo',
},
{
rule_type: FILTER_FULLTEXT_QUERY,
value: 'created:[-1 week to now],added:[-1 month to now]',
value: 'foo,created:[-1 week to now],added:[-1 month to now]',
},
])
})
it('should keep legacy title filters as a title search when adding a created relative date', () => {
it('should convert legacy title filters into full text query when adding a created relative date', () => {
component.filterRules = [
{
rule_type: FILTER_TITLE,
@@ -1919,18 +1895,14 @@ describe('FilterEditorComponent', () => {
fixture.detectChanges()
tick(400)
expect(component.filterRules).toEqual([
{
rule_type: FILTER_SIMPLE_TITLE,
value: 'foo',
},
{
rule_type: FILTER_FULLTEXT_QUERY,
value: 'created:[-1 week to now]',
value: 'foo,created:[-1 week to now]',
},
])
})
it('should keep simple title filters as a title search when adding a created relative date', () => {
it('should convert simple title filters into full text query when adding a created relative date', () => {
component.filterRules = [
{
rule_type: FILTER_SIMPLE_TITLE,
@@ -1945,13 +1917,9 @@ describe('FilterEditorComponent', () => {
fixture.detectChanges()
tick(400)
expect(component.filterRules).toEqual([
{
rule_type: FILTER_SIMPLE_TITLE,
value: 'foo',
},
{
rule_type: FILTER_FULLTEXT_QUERY,
value: 'created:[-1 week to now]',
value: 'foo,created:[-1 week to now]',
},
])
})
@@ -2037,7 +2005,7 @@ describe('FilterEditorComponent', () => {
])
})
it('should keep text filtering separate from date added relative date', () => {
it('should carry over text filtering on date added with relative date', () => {
component.textFilter = 'foo'
const datesDropdown = fixture.debugElement.query(
By.directive(DatesDropdownComponent)
@@ -2047,13 +2015,9 @@ describe('FilterEditorComponent', () => {
fixture.detectChanges()
tick(400)
expect(component.filterRules).toEqual([
{
rule_type: FILTER_SIMPLE_TEXT,
value: 'foo',
},
{
rule_type: FILTER_FULLTEXT_QUERY,
value: 'added:[-1 week to now]',
value: 'foo,added:[-1 week to now]',
},
])
})
@@ -1083,6 +1083,23 @@ export class FilterEditorComponent
(fr) => fr.rule_type == FILTER_FULLTEXT_QUERY
)
// if had a title / content search and added a relative date we need to carry it over...
if (
!existingRule &&
this._textFilter?.length > 0 &&
(this.textFilterTarget == TEXT_FILTER_TARGET_TITLE_CONTENT ||
this.textFilterTarget == TEXT_FILTER_TARGET_TITLE)
) {
existingRule = filterRules.find(
(fr) =>
fr.rule_type == FILTER_TITLE_CONTENT ||
fr.rule_type == FILTER_SIMPLE_TEXT ||
fr.rule_type == FILTER_TITLE ||
fr.rule_type == FILTER_SIMPLE_TITLE
)
existingRule.rule_type = FILTER_FULLTEXT_QUERY
}
let queryArgs = existingRule?.value.split(',') ?? []
if (this.dateCreatedRelativeDate !== null) {
const rd = RELATIVE_DATE_QUERYSTRINGS.find(
@@ -11,7 +11,7 @@
<div class="input-group input-group-sm w-auto d-none d-md-flex">
<label class="input-group-text bg-transparent border-0" for="managementPageSize" i18n>Show:</label>
</div>
<div class="input-group input-group-sm w-auto">
<div class="input-group input-group-sm w-auto me-3">
<select id="managementPageSize" class="form-select form-select-sm small" [(ngModel)]="pageSize">
<option [ngValue]="25">25</option>
<option [ngValue]="50">50</option>
@@ -19,9 +19,7 @@
</select>
<span class="input-group-text text-muted d-none d-md-flex" i18n>per page</span>
</div>
@if (collectionSize() > pageSize) {
<ngb-pagination [pageSize]="pageSize" [collectionSize]="collectionSize()" [page]="page()" [maxSize]="5" (pageChange)="page.set($event); reloadData()" class="ms-3" size="sm" aria-label="Pagination"></ngb-pagination>
}
<ngb-pagination [pageSize]="pageSize" [collectionSize]="collectionSize()" [page]="page()" [maxSize]="5" (pageChange)="page.set($event); reloadData()" size="sm" aria-label="Pagination"></ngb-pagination>
</div>
</div>
@@ -72,7 +70,7 @@
}
</div>
}
@if (collectionSize() > pageSize) {
@if (collectionSize() > 20) {
<ngb-pagination class="ms-auto" [pageSize]="pageSize" [collectionSize]="collectionSize()" [page]="page()" [maxSize]="5" (pageChange)="page.set($event); reloadData()" size="sm" aria-label="Pagination"></ngb-pagination>
}
</div>
@@ -93,17 +93,15 @@
[disabled]="selectedMailIds().size === 0"
(confirm)="deleteSelected()">
</pngx-confirm-button>
@if (processedMails().length > 50) {
<div class="ms-auto">
<ngb-pagination
[collectionSize]="processedMails().length"
[(page)]="page"
[pageSize]="50"
[maxSize]="5"
(pageChange)="loadProcessedMails()">
</ngb-pagination>
</div>
}
<div class="ms-auto">
<ngb-pagination
[collectionSize]="processedMails().length"
[(page)]="page"
[pageSize]="50"
[maxSize]="5"
(pageChange)="loadProcessedMails()">
</ngb-pagination>
</div>
</div>
}
</div>
+1 -1
View File
@@ -8,7 +8,7 @@ export const environment = {
apiVersion: '10', // match src/paperless/settings.py
appTitle: DEFAULT_APP_TITLE,
tag: 'prod',
version: '3.3.1',
version: '3.2.1',
webSocketHost: window.location.host,
webSocketProtocol: window.location.protocol == 'https:' ? 'wss:' : 'ws:',
webSocketBaseUrl: base_url.pathname + 'ws/',
+1 -1
View File
@@ -8525,7 +8525,7 @@
<context context-type="sourcefile">src/app/components/common/suggestions-dropdown/suggestions-dropdown.component.html</context>
<context context-type="linenumber">54</context>
</context-group>
<target state="translated">{VAR_PLURAL, plural, =1 {1 Vorschlag unten verfügbar} other {<x id="INTERPOLATION"/> Vorschläge unten verfügbar}}</target>
<target state="needs-translation">{VAR_PLURAL, plural, =1 {1 suggestion available below} other {<x id="INTERPOLATION"/> suggestions available below}}</target>
</trans-unit>
<trans-unit id="4169875112244042673" datatype="html" approved="yes">
<source>Suggestion options</source>
+4 -4
View File
@@ -8525,7 +8525,7 @@
<context context-type="sourcefile">src/app/components/common/suggestions-dropdown/suggestions-dropdown.component.html</context>
<context context-type="linenumber">54</context>
</context-group>
<target state="translated">{VAR_PLURAL, plural, one {<x id="INTERPOLATION"/> suggerimenti disponibili sotto} =1 {1 suggerimento disponibile sotto} other {<x id="INTERPOLATION"/> suggerimenti disponibili sotto}}</target>
<target state="needs-translation">{VAR_PLURAL, plural, =1 {1 suggestion available below} other {<x id="INTERPOLATION"/> suggestions available below}}</target>
</trans-unit>
<trans-unit id="4169875112244042673" datatype="html">
<source>Suggestion options</source>
@@ -9219,7 +9219,7 @@
<context context-type="sourcefile">src/app/components/document-detail/document-barcodes/document-barcodes.component.html</context>
<context context-type="linenumber">40,41</context>
</context-group>
<target state="translated">Copia contenuto</target>
<target state="needs-translation">Copy content</target>
</trans-unit>
<trans-unit id="2266163016683537825" datatype="html">
<source>of <x id="INTERPOLATION" equiv-text="{{previewNumPages()}}"/></source>
@@ -9479,7 +9479,7 @@
<context context-type="sourcefile">src/app/components/document-detail/document-detail.component.html</context>
<context context-type="linenumber">360,361</context>
</context-group>
<target state="translated">Codici a barre</target>
<target state="needs-translation">Barcodes</target>
</trans-unit>
<trans-unit id="6992781481378431874" datatype="html" approved="yes">
<source>Original document metadata</source>
@@ -13376,7 +13376,7 @@
<context context-type="sourcefile">src/app/data/paperless-config.ts</context>
<context context-type="linenumber">335</context>
</context-group>
<target state="translated">Contenuti Codice a Barre</target>
<target state="needs-translation">Store Barcode Contents</target>
</trans-unit>
<trans-unit id="7011909364081812031" datatype="html">
<source>AI Enabled</source>
+46 -46
View File
@@ -17,7 +17,7 @@
<context context-type="linenumber">386,393</context>
</context-group>
<note priority="1" from="description">Currently selected slide number read by screen reader</note>
<target state="translated"> スライド <x id="INTERPOLATION" equiv-text="xt(source?: Ngb"/> / <x id="INTERPOLATION_1" equiv-text="this._cycleToSe"/> </target>
<target state="needs-translation"> Slide <x id="INTERPOLATION" equiv-text="xt(source?: Ngb"/> of <x id="INTERPOLATION_1" equiv-text="this._cycleToSe"/> </target>
</trans-unit>
<trans-unit id="ngb.carousel.previous" datatype="html">
<source>Previous</source>
@@ -479,7 +479,7 @@
<context context-type="sourcefile">src/app/app.component.ts</context>
<context context-type="linenumber">201</context>
</context-group>
<target state="translated">タグ、取引先、ドキュメントの種類、保存先パス、カスタムフィールドなどの属性をここで管理できます。これらはドキュメントの編集画面から作成することもできます。</target>
<target state="needs-translation">Attributes like tags, correspondents, document types, storage paths and custom fields can all be managed here. They can also be created from the document edit view.</target>
</trans-unit>
<trans-unit id="7851939076947092983" datatype="html">
<source>Manage e-mail accounts and rules for automatically importing documents.</source>
@@ -507,7 +507,7 @@
<context context-type="sourcefile">src/app/app.component.ts</context>
<context context-type="linenumber">225</context>
</context-group>
<target state="translated">タスクでは、バックグラウンド処理の進行状況、対応が必要な項目、最近完了した処理を確認できます。</target>
<target state="needs-translation">Tasks helps you track background work, what needs attention, and what recently completed.</target>
</trans-unit>
<trans-unit id="2755033621682206902" datatype="html">
<source>Check out the settings for various tweaks to the web app.</source>
@@ -571,7 +571,7 @@
<context context-type="sourcefile">src/app/components/admin/config/config.component.html</context>
<context context-type="linenumber">35</context>
</context-group>
<target state="translated">この値は、Paperless の外で設定されている <x id="INTERPOLATION" equiv-text="{{option.config_key}}"/>を上書きします。</target>
<target state="needs-translation">This value overrides <x id="INTERPOLATION" equiv-text="{{option.config_key}}"/>, which is set outside Paperless.</target>
</trans-unit>
<trans-unit id="7221396516204435584" datatype="html">
<source><x id="INTERPOLATION" equiv-text="{{option.config_key}}"/> is set outside Paperless. Enter a value here to override it.</source>
@@ -579,7 +579,7 @@
<context context-type="sourcefile">src/app/components/admin/config/config.component.html</context>
<context context-type="linenumber">37</context>
</context-group>
<target state="translated"><x id="INTERPOLATION" equiv-text="{{option.config_key}}"/> はPaperlessの外部で設定されています。ここに値を入力すると、その設定を上書きできます。</target>
<target state="needs-translation"><x id="INTERPOLATION" equiv-text="{{option.config_key}}"/> is set outside Paperless. Enter a value here to override it.</target>
</trans-unit>
<trans-unit id="8318849619178340389" datatype="html">
<source>Use the externally configured value</source>
@@ -587,7 +587,7 @@
<context context-type="sourcefile">src/app/components/admin/config/config.component.html</context>
<context context-type="linenumber">42</context>
</context-group>
<target state="translated">外部で設定された値を使用</target>
<target state="needs-translation">Use the externally configured value</target>
</trans-unit>
<trans-unit id="6032629623003430385" datatype="html">
<source>Reset to external</source>
@@ -595,7 +595,7 @@
<context context-type="sourcefile">src/app/components/admin/config/config.component.html</context>
<context context-type="linenumber">43</context>
</context-group>
<target state="translated">外部設定に戻す</target>
<target state="needs-translation">Reset to external</target>
</trans-unit>
<trans-unit id="7808756054397155068" datatype="html">
<source>Reset</source>
@@ -875,7 +875,7 @@
<context context-type="sourcefile">src/app/components/admin/logs/logs.component.html</context>
<context context-type="linenumber">18,19</context>
</context-group>
<target state="translated">行</target>
<target state="needs-translation">lines</target>
</trans-unit>
<trans-unit id="8838884664569764142" datatype="html">
<source>Auto refresh</source>
@@ -1003,7 +1003,7 @@
<context context-type="sourcefile">src/app/components/admin/logs/logs.component.html</context>
<context context-type="linenumber">63,64</context>
</context-group>
<target state="translated">一番下へ移動</target>
<target state="needs-translation">Jump to bottom</target>
</trans-unit>
<trans-unit id="1255048712725285892" datatype="html">
<source>Options to customize appearance, notifications and more. Settings apply to the &lt;strong&gt;current user only&lt;/strong&gt;.</source>
@@ -1135,7 +1135,7 @@
<context context-type="sourcefile">src/app/components/admin/settings/settings.component.html</context>
<context context-type="linenumber">115,116</context>
</context-group>
<target state="translated">サイドバーに表示するアイテム:</target>
<target state="needs-translation">Sidebar items to show:</target>
</trans-unit>
<trans-unit id="1356890996281769972" datatype="html">
<source>Dark mode</source>
@@ -1323,7 +1323,7 @@
<context context-type="sourcefile">src/app/components/admin/settings/settings.component.html</context>
<context context-type="linenumber">201</context>
</context-group>
<target state="translated">サイドバーの保存済みビューにドキュメント数を表示</target>
<target state="needs-translation">Show document counts in sidebar saved views</target>
</trans-unit>
<trans-unit id="8939587804990976924" datatype="html">
<source>Items per page</source>
@@ -1403,7 +1403,7 @@
<context context-type="sourcefile">src/app/components/admin/settings/settings.component.html</context>
<context context-type="linenumber">259,260</context>
</context-group>
<target state="translated">提案機能のデフォルト設定</target>
<target state="needs-translation">Suggestions default to</target>
</trans-unit>
<trans-unit id="6251586038459969294" datatype="html">
<source>Both</source>
@@ -1411,7 +1411,7 @@
<context context-type="sourcefile">src/app/components/admin/settings/settings.component.html</context>
<context context-type="linenumber">264</context>
</context-group>
<target state="translated">両方</target>
<target state="needs-translation">Both</target>
</trans-unit>
<trans-unit id="8967224283122923634" datatype="html">
<source>ML only</source>
@@ -1427,7 +1427,7 @@
<context context-type="sourcefile">src/app/components/admin/settings/settings.component.html</context>
<context context-type="linenumber">268</context>
</context-group>
<target state="translated">AIのみ</target>
<target state="needs-translation">AI only</target>
</trans-unit>
<trans-unit id="1043449647727456069" datatype="html">
<source>Automatically request suggestions for inbox documents</source>
@@ -1435,7 +1435,7 @@
<context context-type="sourcefile">src/app/components/admin/settings/settings.component.html</context>
<context context-type="linenumber">276</context>
</context-group>
<target state="translated">受信トレイ内のドキュメントに対して自動的に提案をリクエストする</target>
<target state="needs-translation">Automatically request suggestions for inbox documents</target>
</trans-unit>
<trans-unit id="460700039378563125" datatype="html">
<source>If un-checked, suggestions must be requested via the Suggest button.</source>
@@ -1443,7 +1443,7 @@
<context context-type="sourcefile">src/app/components/admin/settings/settings.component.html</context>
<context context-type="linenumber">276</context>
</context-group>
<target state="translated">チェックを外した場合、提案を取得するには「提案」ボタンを押す必要があります。</target>
<target state="needs-translation">If un-checked, suggestions must be requested via the Suggest button.</target>
</trans-unit>
<trans-unit id="8793267604636304297" datatype="html">
<source>Show document thumbnail during loading</source>
@@ -1467,7 +1467,7 @@
<context context-type="sourcefile">src/app/components/admin/settings/settings.component.html</context>
<context context-type="linenumber">300,301</context>
</context-group>
<target state="translated">ドキュメントの詳細ページで非表示にするフィールドは、チェックを外してください。</target>
<target state="needs-translation">Uncheck fields to hide them on the document details page.</target>
</trans-unit>
<trans-unit id="8508424367627989968" datatype="html">
<source>Bulk editing</source>
@@ -1507,7 +1507,7 @@
<context context-type="sourcefile">src/app/components/document-detail/document-detail.component.ts</context>
<context context-type="linenumber">1907</context>
</context-group>
<target state="translated">PDF エディター</target>
<target state="needs-translation">PDF Editor</target>
</trans-unit>
<trans-unit id="1577733187050997705" datatype="html">
<source>Default editing mode</source>
@@ -1515,7 +1515,7 @@
<context context-type="sourcefile">src/app/components/admin/settings/settings.component.html</context>
<context context-type="linenumber">317,318</context>
</context-group>
<target state="translated">デフォルトの編集モード</target>
<target state="needs-translation">Default editing mode</target>
</trans-unit>
<trans-unit id="7273640930165035289" datatype="html">
<source>Create new document(s)</source>
@@ -1527,7 +1527,7 @@
<context context-type="sourcefile">src/app/components/common/pdf-editor/pdf-editor.component.html</context>
<context context-type="linenumber">82,83</context>
</context-group>
<target state="translated">新しいドキュメントを作成</target>
<target state="needs-translation">Create new document(s)</target>
</trans-unit>
<trans-unit id="7860582931776068318" datatype="html">
<source>Add document version</source>
@@ -1539,7 +1539,7 @@
<context context-type="sourcefile">src/app/components/common/pdf-editor/pdf-editor.component.html</context>
<context context-type="linenumber">87,88</context>
</context-group>
<target state="translated">ドキュメントのバージョンを追加</target>
<target state="needs-translation">Add document version</target>
</trans-unit>
<trans-unit id="8104421162933956065" datatype="html">
<source>Notes</source>
@@ -1639,7 +1639,7 @@
<context context-type="sourcefile">src/app/components/admin/settings/settings.component.html</context>
<context context-type="linenumber">347</context>
</context-group>
<target state="translated">これらの設定は、Web UIから作成されたオブジェクト(タグ、メールルールなど)に対して、このユーザーアカウントに適用されます。ドキュメントには適用されません。</target>
<target state="needs-translation"> Settings apply to this user account for objects (Tags, Mail Rules, etc.) created via the web UI. These settings do not apply to documents. </target>
</trans-unit>
<trans-unit id="4292903881380648974" datatype="html">
<source>Default Owner</source>
@@ -2203,7 +2203,7 @@
<context context-type="sourcefile">src/app/components/app-frame/app-frame.component.html</context>
<context context-type="linenumber">331</context>
</context-group>
<target state="translated">タスク</target>
<target state="needs-translation">Tasks</target>
</trans-unit>
<trans-unit id="8492095365580052820" datatype="html">
<source>Tasks shows detailed information about document consumption and system tasks.</source>
@@ -2211,7 +2211,7 @@
<context context-type="sourcefile">src/app/components/admin/tasks/tasks.component.html</context>
<context context-type="linenumber">4,5</context>
</context-group>
<target state="translated">タスクでは、ドキュメントの取り込み処理やシステムタスクに関する詳細情報を確認できます。</target>
<target state="needs-translation">Tasks shows detailed information about document consumption and system tasks.</target>
</trans-unit>
<trans-unit id="103921551219467537" datatype="html">
<source>Clear selection</source>
@@ -2235,7 +2235,7 @@
<context context-type="sourcefile">src/app/components/admin/tasks/tasks.component.html</context>
<context context-type="linenumber">16</context>
</context-group>
<target state="translated">すべて閉じる</target>
<target state="needs-translation">Dismiss all</target>
</trans-unit>
<trans-unit id="1616102757855967475" datatype="html">
<source>All</source>
@@ -2295,7 +2295,7 @@
<context context-type="sourcefile">src/app/components/admin/tasks/tasks.component.ts</context>
<context context-type="linenumber">219</context>
</context-group>
<target state="translated">すべての種類</target>
<target state="needs-translation">All types</target>
</trans-unit>
<trans-unit id="131016739441837046" datatype="html">
<source>All sources</source>
@@ -2307,7 +2307,7 @@
<context context-type="sourcefile">src/app/components/admin/tasks/tasks.component.ts</context>
<context context-type="linenumber">231</context>
</context-group>
<target state="translated">すべてのソース</target>
<target state="needs-translation">All sources</target>
</trans-unit>
<trans-unit id="3643866539136239218" datatype="html">
<source>Clear search</source>
@@ -2327,7 +2327,7 @@
<context context-type="sourcefile">src/app/components/admin/tasks/tasks.component.html</context>
<context context-type="linenumber">92,93</context>
</context-group>
<target state="translated">タスクを検索</target>
<target state="needs-translation">Search tasks</target>
</trans-unit>
<trans-unit id="6849725902312323996" datatype="html">
<source>Reset filters</source>
@@ -2351,7 +2351,7 @@
<context context-type="sourcefile">src/app/components/admin/tasks/tasks.component.html</context>
<context context-type="linenumber">122</context>
</context-group>
<target state="translated">{VAR_PLURAL, plural, =1 {1件のタスク} other {<x id="INTERPOLATION"/>件のタスク}}</target>
<target state="needs-translation">{VAR_PLURAL, plural, =1 {1 task} other {<x id="INTERPOLATION"/> tasks}}</target>
</trans-unit>
<trans-unit id="8953033926734869941" datatype="html">
<source>Name</source>
@@ -2651,7 +2651,7 @@
<context context-type="sourcefile">src/app/components/admin/tasks/tasks.component.html</context>
<context context-type="linenumber">207</context>
</context-group>
<target state="translated">タスクの詳細を表示</target>
<target state="needs-translation">View task details</target>
</trans-unit>
<trans-unit id="1536087519743707362" datatype="html">
<source>Dismiss</source>
@@ -2691,7 +2691,7 @@
<context context-type="sourcefile">src/app/components/admin/tasks/tasks.component.html</context>
<context context-type="linenumber">232,233</context>
</context-group>
<target state="translated">結果メッセージ</target>
<target state="needs-translation">Result message</target>
</trans-unit>
<trans-unit id="6621329748219109148" datatype="html">
<source>Duplicate</source>
@@ -2699,7 +2699,7 @@
<context context-type="sourcefile">src/app/components/admin/tasks/tasks.component.html</context>
<context context-type="linenumber">239,240</context>
</context-group>
<target state="translated">重複</target>
<target state="needs-translation">Duplicate</target>
</trans-unit>
<trans-unit id="7593555694782789615" datatype="html">
<source>Open</source>
@@ -2739,7 +2739,7 @@
<context context-type="sourcefile">src/app/components/admin/tasks/tasks.component.html</context>
<context context-type="linenumber">257,258</context>
</context-group>
<target state="translated">入力データ</target>
<target state="needs-translation">Input data</target>
</trans-unit>
<trans-unit id="1585185618099050920" datatype="html">
<source>Result data</source>
@@ -2747,7 +2747,7 @@
<context context-type="sourcefile">src/app/components/admin/tasks/tasks.component.html</context>
<context context-type="linenumber">263,264</context>
</context-group>
<target state="translated">結果データ</target>
<target state="needs-translation">Result data</target>
</trans-unit>
<trans-unit id="7976920528153858271" datatype="html">
<source>No tasks match the current filters.</source>
@@ -2755,7 +2755,7 @@
<context context-type="sourcefile">src/app/components/admin/tasks/tasks.component.html</context>
<context context-type="linenumber">285,287</context>
</context-group>
<target state="translated">現在のフィルター条件に一致するタスクはありません。</target>
<target state="needs-translation">No tasks match the current filters.</target>
</trans-unit>
<trans-unit id="2525230676386818985" datatype="html">
<source>Result</source>
@@ -2771,7 +2771,7 @@
<context context-type="sourcefile">src/app/components/admin/tasks/tasks.component.ts</context>
<context context-type="linenumber">55</context>
</context-group>
<target state="translated">注意が必要</target>
<target state="needs-translation">Needs attention</target>
</trans-unit>
<trans-unit id="3307214558906712688" datatype="html">
<source>In progress</source>
@@ -2779,7 +2779,7 @@
<context context-type="sourcefile">src/app/components/admin/tasks/tasks.component.ts</context>
<context context-type="linenumber">56</context>
</context-group>
<target state="translated">進行中</target>
<target state="needs-translation">In progress</target>
</trans-unit>
<trans-unit id="1371178633976505412" datatype="html">
<source>Recently completed</source>
@@ -2787,7 +2787,7 @@
<context context-type="sourcefile">src/app/components/admin/tasks/tasks.component.ts</context>
<context context-type="linenumber">57</context>
</context-group>
<target state="translated">最近完了したタスク</target>
<target state="needs-translation">Recently completed</target>
</trans-unit>
<trans-unit id="2936452645673957909" datatype="html">
<source>Consume File</source>
@@ -2795,7 +2795,7 @@
<context context-type="sourcefile">src/app/components/admin/tasks/tasks.component.ts</context>
<context context-type="linenumber">66</context>
</context-group>
<target state="translated">ファイルの取り込み</target>
<target state="needs-translation">Consume File</target>
</trans-unit>
<trans-unit id="5622386857946132209" datatype="html">
<source>Train Classifier</source>
@@ -2811,7 +2811,7 @@
<context context-type="sourcefile">src/app/components/admin/tasks/tasks.component.ts</context>
<context context-type="linenumber">74</context>
</context-group>
<target state="translated">整合性チェック</target>
<target state="needs-translation">Sanity Check</target>
</trans-unit>
<trans-unit id="7502272564743467653" datatype="html">
<source>Mail Fetch</source>
@@ -2839,7 +2839,7 @@
<context context-type="sourcefile">src/app/components/admin/tasks/tasks.component.ts</context>
<context context-type="linenumber">80</context>
</context-group>
<target state="translated">ゴミ箱を空にする</target>
<target state="needs-translation">Empty Trash</target>
</trans-unit>
<trans-unit id="4173754487295857311" datatype="html">
<source>Check Workflows</source>
@@ -2847,7 +2847,7 @@
<context context-type="sourcefile">src/app/components/admin/tasks/tasks.component.ts</context>
<context context-type="linenumber">84</context>
</context-group>
<target state="translated">ワークフローの確認</target>
<target state="needs-translation">Check Workflows</target>
</trans-unit>
<trans-unit id="2065831805515896240" datatype="html">
<source>Bulk Update</source>
@@ -2855,7 +2855,7 @@
<context context-type="sourcefile">src/app/components/admin/tasks/tasks.component.ts</context>
<context context-type="linenumber">88</context>
</context-group>
<target state="translated">一括更新</target>
<target state="needs-translation">Bulk Update</target>
</trans-unit>
<trans-unit id="5062348912423871240" datatype="html">
<source>Reprocess Document</source>
@@ -2863,7 +2863,7 @@
<context context-type="sourcefile">src/app/components/admin/tasks/tasks.component.ts</context>
<context context-type="linenumber">92</context>
</context-group>
<target state="translated">ドキュメントの再処理</target>
<target state="needs-translation">Reprocess Document</target>
</trans-unit>
<trans-unit id="6903696804811148799" datatype="html">
<source>Build Share Link</source>
@@ -2871,7 +2871,7 @@
<context context-type="sourcefile">src/app/components/admin/tasks/tasks.component.ts</context>
<context context-type="linenumber">96</context>
</context-group>
<target state="translated">共有リンクの生成</target>
<target state="needs-translation">Build Share Link</target>
</trans-unit>
<trans-unit id="6581973658756561124" datatype="html">
<source>Bulk Delete</source>
@@ -2879,7 +2879,7 @@
<context context-type="sourcefile">src/app/components/admin/tasks/tasks.component.ts</context>
<context context-type="linenumber">100</context>
</context-group>
<target state="translated">一括削除</target>
<target state="needs-translation">Bulk Delete</target>
</trans-unit>
<trans-unit id="5672013191898828327" datatype="html">
<source>Apply AI Suggestions</source>
+18 -18
View File
@@ -17,7 +17,7 @@
<context context-type="linenumber">386,393</context>
</context-group>
<note priority="1" from="description">Currently selected slide number read by screen reader</note>
<target state="translated"> Slajd <x id="INTERPOLATION" equiv-text="xt(source?: Ngb"/> z <x id="INTERPOLATION_1" equiv-text="this._cycleToSe"/> </target>
<target state="needs-translation"> Slide <x id="INTERPOLATION" equiv-text="xt(source?: Ngb"/> of <x id="INTERPOLATION_1" equiv-text="this._cycleToSe"/> </target>
</trans-unit>
<trans-unit id="ngb.carousel.previous" datatype="html">
<source>Previous</source>
@@ -507,7 +507,7 @@
<context context-type="sourcefile">src/app/app.component.ts</context>
<context context-type="linenumber">225</context>
</context-group>
<target state="translated">Zadania pomagają śledzić pracę w tle, to, co wymaga uwagi i co zostało ostatnio ukończone.</target>
<target state="needs-translation">Tasks helps you track background work, what needs attention, and what recently completed.</target>
</trans-unit>
<trans-unit id="2755033621682206902" datatype="html">
<source>Check out the settings for various tweaks to the web app.</source>
@@ -571,7 +571,7 @@
<context context-type="sourcefile">src/app/components/admin/config/config.component.html</context>
<context context-type="linenumber">35</context>
</context-group>
<target state="translated">Ta wartość zastępuje <x id="INTERPOLATION" equiv-text="{{option.config_key}}"/>, która jest ustawiona poza Paperless.</target>
<target state="needs-translation">This value overrides <x id="INTERPOLATION" equiv-text="{{option.config_key}}"/>, which is set outside Paperless.</target>
</trans-unit>
<trans-unit id="7221396516204435584" datatype="html">
<source><x id="INTERPOLATION" equiv-text="{{option.config_key}}"/> is set outside Paperless. Enter a value here to override it.</source>
@@ -579,7 +579,7 @@
<context context-type="sourcefile">src/app/components/admin/config/config.component.html</context>
<context context-type="linenumber">37</context>
</context-group>
<target state="translated"><x id="INTERPOLATION" equiv-text="{{option.config_key}}"/> jest ustawiony poza Paperless. Wpisz tutaj wartość, aby go zastąpić.</target>
<target state="needs-translation"><x id="INTERPOLATION" equiv-text="{{option.config_key}}"/> is set outside Paperless. Enter a value here to override it.</target>
</trans-unit>
<trans-unit id="8318849619178340389" datatype="html">
<source>Use the externally configured value</source>
@@ -587,7 +587,7 @@
<context context-type="sourcefile">src/app/components/admin/config/config.component.html</context>
<context context-type="linenumber">42</context>
</context-group>
<target state="translated">Użyj wartości skonfigurowanej zewnętrznie</target>
<target state="needs-translation">Use the externally configured value</target>
</trans-unit>
<trans-unit id="6032629623003430385" datatype="html">
<source>Reset to external</source>
@@ -595,7 +595,7 @@
<context context-type="sourcefile">src/app/components/admin/config/config.component.html</context>
<context context-type="linenumber">43</context>
</context-group>
<target state="translated">Zresetuj na zewnętrzny</target>
<target state="needs-translation">Reset to external</target>
</trans-unit>
<trans-unit id="7808756054397155068" datatype="html">
<source>Reset</source>
@@ -1411,7 +1411,7 @@
<context context-type="sourcefile">src/app/components/admin/settings/settings.component.html</context>
<context context-type="linenumber">264</context>
</context-group>
<target state="translated">Obydwa</target>
<target state="needs-translation">Both</target>
</trans-unit>
<trans-unit id="8967224283122923634" datatype="html">
<source>ML only</source>
@@ -1419,7 +1419,7 @@
<context context-type="sourcefile">src/app/components/admin/settings/settings.component.html</context>
<context context-type="linenumber">266</context>
</context-group>
<target state="translated">Tylko ML</target>
<target state="needs-translation">ML only</target>
</trans-unit>
<trans-unit id="6418969597665857901" datatype="html">
<source>AI only</source>
@@ -1427,7 +1427,7 @@
<context context-type="sourcefile">src/app/components/admin/settings/settings.component.html</context>
<context context-type="linenumber">268</context>
</context-group>
<target state="translated">Tylko SI</target>
<target state="needs-translation">AI only</target>
</trans-unit>
<trans-unit id="1043449647727456069" datatype="html">
<source>Automatically request suggestions for inbox documents</source>
@@ -2211,7 +2211,7 @@
<context context-type="sourcefile">src/app/components/admin/tasks/tasks.component.html</context>
<context context-type="linenumber">4,5</context>
</context-group>
<target state="translated">Zadania zawierają szczegóły dotyczące przetwarzania dokumentów i zadań systemowych.</target>
<target state="needs-translation">Tasks shows detailed information about document consumption and system tasks.</target>
</trans-unit>
<trans-unit id="103921551219467537" datatype="html">
<source>Clear selection</source>
@@ -2327,7 +2327,7 @@
<context context-type="sourcefile">src/app/components/admin/tasks/tasks.component.html</context>
<context context-type="linenumber">92,93</context>
</context-group>
<target state="translated">Szukaj w zadaniach</target>
<target state="needs-translation">Search tasks</target>
</trans-unit>
<trans-unit id="6849725902312323996" datatype="html" approved="yes">
<source>Reset filters</source>
@@ -2651,7 +2651,7 @@
<context context-type="sourcefile">src/app/components/admin/tasks/tasks.component.html</context>
<context context-type="linenumber">207</context>
</context-group>
<target state="translated">Wyświetl szczegóły zadania</target>
<target state="needs-translation">View task details</target>
</trans-unit>
<trans-unit id="1536087519743707362" datatype="html">
<source>Dismiss</source>
@@ -4555,7 +4555,7 @@
<context context-type="sourcefile">src/app/components/common/confirm-dialog/rotate-confirm-dialog/rotate-confirm-dialog.component.html</context>
<context context-type="linenumber">9</context>
</context-group>
<target state="translated">Obróć w lewo</target>
<target state="needs-translation">Rotate counterclockwise</target>
</trans-unit>
<trans-unit id="631338357809243389" datatype="html">
<source>Rotate clockwise</source>
@@ -4563,7 +4563,7 @@
<context context-type="sourcefile">src/app/components/common/confirm-dialog/rotate-confirm-dialog/rotate-confirm-dialog.component.html</context>
<context context-type="linenumber">19</context>
</context-group>
<target state="translated">Obróć w prawo</target>
<target state="needs-translation">Rotate clockwise</target>
</trans-unit>
<trans-unit id="8157388568390631653" datatype="html">
<source>Note that only PDFs will be rotated.</source>
@@ -7641,7 +7641,7 @@
<context context-type="sourcefile">src/app/components/common/pdf-editor/pdf-editor.component.html</context>
<context context-type="linenumber">17</context>
</context-group>
<target state="translated">Obróć zaznaczone strony w lewo</target>
<target state="translated">Obróć wybrane strony przeciwnie do ruchu wskazówek zegara</target>
</trans-unit>
<trans-unit id="4787219034890830544" datatype="html">
<source>Rotate selected pages clockwise</source>
@@ -7649,7 +7649,7 @@
<context context-type="sourcefile">src/app/components/common/pdf-editor/pdf-editor.component.html</context>
<context context-type="linenumber">20</context>
</context-group>
<target state="translated">Obróć zaznaczone strony w prawo</target>
<target state="translated">Obróć wybrane strony zgodnie z ruchem wskazówek zegara</target>
</trans-unit>
<trans-unit id="3441043765105475130" datatype="html">
<source>Delete selected pages</source>
@@ -7665,7 +7665,7 @@
<context context-type="sourcefile">src/app/components/common/pdf-editor/pdf-editor.component.html</context>
<context context-type="linenumber">33</context>
</context-group>
<target state="translated">Obróć stronę w lewo</target>
<target state="translated">Obróć stronę przeciwnie do ruchu wskazówek zegara</target>
</trans-unit>
<trans-unit id="3450236521040548507" datatype="html">
<source>Rotate page clockwise</source>
@@ -7673,7 +7673,7 @@
<context context-type="sourcefile">src/app/components/common/pdf-editor/pdf-editor.component.html</context>
<context context-type="linenumber">36</context>
</context-group>
<target state="translated">Obróć stronę w prawo</target>
<target state="translated">Obróć stronę zgodnie z ruchem wskazówek zegara</target>
</trans-unit>
<trans-unit id="7647925464077975347" datatype="html">
<source>Delete page</source>
+14 -14
View File
@@ -17,7 +17,7 @@
<context context-type="linenumber">386,393</context>
</context-group>
<note priority="1" from="description">Currently selected slide number read by screen reader</note>
<target state="translated"> Слайд <x id="INTERPOLATION" equiv-text="xt(source?: Ngb"/> из <x id="INTERPOLATION_1" equiv-text="this._cycleToSe"/> </target>
<target state="needs-translation"> Slide <x id="INTERPOLATION" equiv-text="xt(source?: Ngb"/> of <x id="INTERPOLATION_1" equiv-text="this._cycleToSe"/> </target>
</trans-unit>
<trans-unit id="ngb.carousel.previous" datatype="html">
<source>Previous</source>
@@ -1403,7 +1403,7 @@
<context context-type="sourcefile">src/app/components/admin/settings/settings.component.html</context>
<context context-type="linenumber">259,260</context>
</context-group>
<target state="translated">Предложения по умолчанию для</target>
<target state="needs-translation">Suggestions default to</target>
</trans-unit>
<trans-unit id="6251586038459969294" datatype="html">
<source>Both</source>
@@ -1411,7 +1411,7 @@
<context context-type="sourcefile">src/app/components/admin/settings/settings.component.html</context>
<context context-type="linenumber">264</context>
</context-group>
<target state="translated">Оба</target>
<target state="needs-translation">Both</target>
</trans-unit>
<trans-unit id="8967224283122923634" datatype="html">
<source>ML only</source>
@@ -1419,7 +1419,7 @@
<context context-type="sourcefile">src/app/components/admin/settings/settings.component.html</context>
<context context-type="linenumber">266</context>
</context-group>
<target state="translated">Только ML</target>
<target state="needs-translation">ML only</target>
</trans-unit>
<trans-unit id="6418969597665857901" datatype="html">
<source>AI only</source>
@@ -1427,7 +1427,7 @@
<context context-type="sourcefile">src/app/components/admin/settings/settings.component.html</context>
<context context-type="linenumber">268</context>
</context-group>
<target state="translated">Только ИИ</target>
<target state="needs-translation">AI only</target>
</trans-unit>
<trans-unit id="1043449647727456069" datatype="html">
<source>Automatically request suggestions for inbox documents</source>
@@ -8525,7 +8525,7 @@
<context context-type="sourcefile">src/app/components/common/suggestions-dropdown/suggestions-dropdown.component.html</context>
<context context-type="linenumber">54</context>
</context-group>
<target state="translated">{VAR_PLURAL, plural, =1 {1 совет} other {<x id="INTERPOLATION"/> советов}}</target>
<target state="needs-translation">{VAR_PLURAL, plural, =1 {1 suggestion available below} other {<x id="INTERPOLATION"/> suggestions available below}}</target>
</trans-unit>
<trans-unit id="4169875112244042673" datatype="html">
<source>Suggestion options</source>
@@ -8533,7 +8533,7 @@
<context context-type="sourcefile">src/app/components/common/suggestions-dropdown/suggestions-dropdown.component.html</context>
<context context-type="linenumber">65,66</context>
</context-group>
<target state="translated">Настройки советов</target>
<target state="needs-translation">Suggestion options</target>
</trans-unit>
<trans-unit id="3145824396228856507" datatype="html">
<source>Not using default</source>
@@ -8541,7 +8541,7 @@
<context context-type="sourcefile">src/app/components/common/suggestions-dropdown/suggestions-dropdown.component.html</context>
<context context-type="linenumber">69,70</context>
</context-group>
<target state="translated">Не использует по умолчанию</target>
<target state="needs-translation">Not using default</target>
</trans-unit>
<trans-unit id="8102623853570619759" datatype="html">
<source>Suggest using:</source>
@@ -8549,7 +8549,7 @@
<context context-type="sourcefile">src/app/components/common/suggestions-dropdown/suggestions-dropdown.component.html</context>
<context context-type="linenumber">74,75</context>
</context-group>
<target state="translated">Предложить используя:</target>
<target state="needs-translation">Suggest using:</target>
</trans-unit>
<trans-unit id="5799391967036896978" datatype="html">
<source>ML</source>
@@ -8557,7 +8557,7 @@
<context context-type="sourcefile">src/app/components/common/suggestions-dropdown/suggestions-dropdown.component.html</context>
<context context-type="linenumber">77</context>
</context-group>
<target state="translated">ML</target>
<target state="needs-translation">ML</target>
</trans-unit>
<trans-unit id="3484984238852181071" datatype="html">
<source>AI</source>
@@ -8565,7 +8565,7 @@
<context context-type="sourcefile">src/app/components/common/suggestions-dropdown/suggestions-dropdown.component.html</context>
<context context-type="linenumber">81</context>
</context-group>
<target state="translated">ИИ</target>
<target state="needs-translation">AI</target>
</trans-unit>
<trans-unit id="9180110319941008393" datatype="html">
<source>Environment</source>
@@ -9219,7 +9219,7 @@
<context context-type="sourcefile">src/app/components/document-detail/document-barcodes/document-barcodes.component.html</context>
<context context-type="linenumber">40,41</context>
</context-group>
<target state="translated">Скопировать содержимое</target>
<target state="needs-translation">Copy content</target>
</trans-unit>
<trans-unit id="2266163016683537825" datatype="html">
<source>of <x id="INTERPOLATION" equiv-text="{{previewNumPages()}}"/></source>
@@ -9479,7 +9479,7 @@
<context context-type="sourcefile">src/app/components/document-detail/document-detail.component.html</context>
<context context-type="linenumber">360,361</context>
</context-group>
<target state="translated">Штрихкоды</target>
<target state="needs-translation">Barcodes</target>
</trans-unit>
<trans-unit id="6992781481378431874" datatype="html" approved="yes">
<source>Original document metadata</source>
@@ -13375,7 +13375,7 @@
<context context-type="sourcefile">src/app/data/paperless-config.ts</context>
<context context-type="linenumber">335</context>
</context-group>
<target state="translated">Сохранить содержимое штрихкодов</target>
<target state="needs-translation">Store Barcode Contents</target>
</trans-unit>
<trans-unit id="7011909364081812031" datatype="html">
<source>AI Enabled</source>
File diff suppressed because it is too large. Load diff
+20 -20
View File
@@ -17,7 +17,7 @@
<context context-type="linenumber">386,393</context>
</context-group>
<note priority="1" from="description">Currently selected slide number read by screen reader</note>
<target state="translated"> Shlid <x id="INTERPOLATION" equiv-text="xt(source?: Ngb"/> i <x id="INTERPOLATION_1" equiv-text="this._cycleToSe"/></target>
<target state="needs-translation"> Slide <x id="INTERPOLATION" equiv-text="xt(source?: Ngb"/> of <x id="INTERPOLATION_1" equiv-text="this._cycleToSe"/> </target>
</trans-unit>
<trans-unit id="ngb.carousel.previous" datatype="html">
<source>Previous</source>
@@ -571,7 +571,7 @@
<context context-type="sourcefile">src/app/components/admin/config/config.component.html</context>
<context context-type="linenumber">35</context>
</context-group>
<target state="translated">Ky vlerë mbizotëron <x id="INTERPOLATION" equiv-text="{{option.config_key}}"/>, i cili është vendosur jashtë Paperless.</target>
<target state="needs-translation">This value overrides <x id="INTERPOLATION" equiv-text="{{option.config_key}}"/>, which is set outside Paperless.</target>
</trans-unit>
<trans-unit id="7221396516204435584" datatype="html">
<source><x id="INTERPOLATION" equiv-text="{{option.config_key}}"/> is set outside Paperless. Enter a value here to override it.</source>
@@ -579,7 +579,7 @@
<context context-type="sourcefile">src/app/components/admin/config/config.component.html</context>
<context context-type="linenumber">37</context>
</context-group>
<target state="translated"><x id="INTERPOLATION" equiv-text="{{option.config_key}}"/> është vendosur jashtë Paperless. Shkruani një vlerë këtu për ta mbingarkuar atë.</target>
<target state="needs-translation"><x id="INTERPOLATION" equiv-text="{{option.config_key}}"/> is set outside Paperless. Enter a value here to override it.</target>
</trans-unit>
<trans-unit id="8318849619178340389" datatype="html">
<source>Use the externally configured value</source>
@@ -587,7 +587,7 @@
<context context-type="sourcefile">src/app/components/admin/config/config.component.html</context>
<context context-type="linenumber">42</context>
</context-group>
<target state="translated">Përdorni vlerën e konfiguruar nga jashtë</target>
<target state="needs-translation">Use the externally configured value</target>
</trans-unit>
<trans-unit id="6032629623003430385" datatype="html">
<source>Reset to external</source>
@@ -595,7 +595,7 @@
<context context-type="sourcefile">src/app/components/admin/config/config.component.html</context>
<context context-type="linenumber">43</context>
</context-group>
<target state="translated">Rinisni në të jashtëm</target>
<target state="needs-translation">Reset to external</target>
</trans-unit>
<trans-unit id="7808756054397155068" datatype="html">
<source>Reset</source>
@@ -1135,7 +1135,7 @@
<context context-type="sourcefile">src/app/components/admin/settings/settings.component.html</context>
<context context-type="linenumber">115,116</context>
</context-group>
<target state="translated">Elementët e shiritit anësor për t'u shfaqur:</target>
<target state="needs-translation">Sidebar items to show:</target>
</trans-unit>
<trans-unit id="1356890996281769972" datatype="html">
<source>Dark mode</source>
@@ -1403,7 +1403,7 @@
<context context-type="sourcefile">src/app/components/admin/settings/settings.component.html</context>
<context context-type="linenumber">259,260</context>
</context-group>
<target state="translated">Sugjerimet parazgjedhore janë</target>
<target state="needs-translation">Suggestions default to</target>
</trans-unit>
<trans-unit id="6251586038459969294" datatype="html">
<source>Both</source>
@@ -1411,7 +1411,7 @@
<context context-type="sourcefile">src/app/components/admin/settings/settings.component.html</context>
<context context-type="linenumber">264</context>
</context-group>
<target state="translated">Të dyja</target>
<target state="needs-translation">Both</target>
</trans-unit>
<trans-unit id="8967224283122923634" datatype="html">
<source>ML only</source>
@@ -1419,7 +1419,7 @@
<context context-type="sourcefile">src/app/components/admin/settings/settings.component.html</context>
<context context-type="linenumber">266</context>
</context-group>
<target state="translated">Vetëm ML</target>
<target state="needs-translation">ML only</target>
</trans-unit>
<trans-unit id="6418969597665857901" datatype="html">
<source>AI only</source>
@@ -1427,7 +1427,7 @@
<context context-type="sourcefile">src/app/components/admin/settings/settings.component.html</context>
<context context-type="linenumber">268</context>
</context-group>
<target state="translated">Vetëm AI</target>
<target state="needs-translation">AI only</target>
</trans-unit>
<trans-unit id="1043449647727456069" datatype="html">
<source>Automatically request suggestions for inbox documents</source>
@@ -1435,7 +1435,7 @@
<context context-type="sourcefile">src/app/components/admin/settings/settings.component.html</context>
<context context-type="linenumber">276</context>
</context-group>
<target state="translated">Kërkoni automatikisht sugjerime për dokumentet në kutinë e postës elektronike</target>
<target state="needs-translation">Automatically request suggestions for inbox documents</target>
</trans-unit>
<trans-unit id="460700039378563125" datatype="html">
<source>If un-checked, suggestions must be requested via the Suggest button.</source>
@@ -1443,7 +1443,7 @@
<context context-type="sourcefile">src/app/components/admin/settings/settings.component.html</context>
<context context-type="linenumber">276</context>
</context-group>
<target state="translated">Nëse nuk është shënuar, sugjerimet duhet të kërkohen përmes butonit Sugjero.</target>
<target state="needs-translation">If un-checked, suggestions must be requested via the Suggest button.</target>
</trans-unit>
<trans-unit id="8793267604636304297" datatype="html">
<source>Show document thumbnail during loading</source>
@@ -2319,7 +2319,7 @@
<context context-type="sourcefile">src/app/components/document-list/filter-editor/filter-editor.component.html</context>
<context context-type="linenumber">21</context>
</context-group>
<target state="translated">Pastro kërkimin</target>
<target state="needs-translation">Clear search</target>
</trans-unit>
<trans-unit id="3570013039254960445" datatype="html">
<source>Search tasks</source>
@@ -2651,7 +2651,7 @@
<context context-type="sourcefile">src/app/components/admin/tasks/tasks.component.html</context>
<context context-type="linenumber">207</context>
</context-group>
<target state="translated">Shiko detajet e detyrës</target>
<target state="needs-translation">View task details</target>
</trans-unit>
<trans-unit id="1536087519743707362" datatype="html">
<source>Dismiss</source>
@@ -2887,7 +2887,7 @@
<context context-type="sourcefile">src/app/components/admin/tasks/tasks.component.ts</context>
<context context-type="linenumber">104</context>
</context-group>
<target state="translated">Apliko sugjerimet e AI</target>
<target state="needs-translation">Apply AI Suggestions</target>
</trans-unit>
<trans-unit id="9172233176401579786" datatype="html">
<source>Scheduled</source>
@@ -3783,7 +3783,7 @@
<context context-type="sourcefile">src/app/components/app-frame/app-frame.component.html</context>
<context context-type="linenumber">42</context>
</context-group>
<target state="translated">Menuja e përdoruesit</target>
<target state="needs-translation">User menu</target>
</trans-unit>
<trans-unit id="2448391510242468907" datatype="html">
<source>Logged in as <x id="INTERPOLATION" equiv-text="{{this.settingsService.displayName}}"/></source>
@@ -3939,7 +3939,7 @@
<context context-type="sourcefile">src/app/components/manage/share-links/share-links.component.html</context>
<context context-type="linenumber">2,3</context>
</context-group>
<target state="translated">Ndani lidhjet</target>
<target state="needs-translation">Share links</target>
</trans-unit>
<trans-unit id="7844706011418789951" datatype="html">
<source>Administration</source>
@@ -4015,7 +4015,7 @@
<context context-type="sourcefile">src/app/components/app-frame/app-frame.component.html</context>
<context context-type="linenumber">403</context>
</context-group>
<target state="translated">Konfiguro kontrollin e përditësimeve</target>
<target state="needs-translation">Configure update checking</target>
</trans-unit>
<trans-unit id="1542489069631984294" datatype="html">
<source>Sidebar views updated</source>
@@ -4259,7 +4259,7 @@
<context context-type="sourcefile">src/app/data/saved-view-icons.ts</context>
<context context-type="linenumber">21</context>
</context-group>
<target state="translated">Bisedë</target>
<target state="needs-translation">Chat</target>
</trans-unit>
<trans-unit id="8066608938393600549" datatype="html">
<source>Message</source>
@@ -4379,7 +4379,7 @@
<context context-type="sourcefile">src/app/components/common/confirm-dialog/merge-as-versions-confirm-dialog/merge-as-versions-confirm-dialog.component.html</context>
<context context-type="linenumber">8,9</context>
</context-group>
<target state="translated">Dokumenti rrënjësor:</target>
<target state="needs-translation">Root document:</target>
</trans-unit>
<trans-unit id="2121026240713807342" datatype="html">
<source>Versions (oldest first):</source>
+58 -58
View File
@@ -595,7 +595,7 @@
<context context-type="sourcefile">src/app/components/admin/config/config.component.html</context>
<context context-type="linenumber">43</context>
</context-group>
<target state="translated">重置为外部</target>
<target state="needs-translation">Reset to external</target>
</trans-unit>
<trans-unit id="7808756054397155068" datatype="html">
<source>Reset</source>
@@ -1135,7 +1135,7 @@
<context context-type="sourcefile">src/app/components/admin/settings/settings.component.html</context>
<context context-type="linenumber">115,116</context>
</context-group>
<target state="translated">侧边栏显示项:</target>
<target state="needs-translation">Sidebar items to show:</target>
</trans-unit>
<trans-unit id="1356890996281769972" datatype="html">
<source>Dark mode</source>
@@ -1419,7 +1419,7 @@
<context context-type="sourcefile">src/app/components/admin/settings/settings.component.html</context>
<context context-type="linenumber">266</context>
</context-group>
<target state="translated">仅限 ML</target>
<target state="needs-translation">ML only</target>
</trans-unit>
<trans-unit id="6418969597665857901" datatype="html">
<source>AI only</source>
@@ -1427,7 +1427,7 @@
<context context-type="sourcefile">src/app/components/admin/settings/settings.component.html</context>
<context context-type="linenumber">268</context>
</context-group>
<target state="translated">仅限 AI</target>
<target state="needs-translation">AI only</target>
</trans-unit>
<trans-unit id="1043449647727456069" datatype="html">
<source>Automatically request suggestions for inbox documents</source>
@@ -2887,7 +2887,7 @@
<context context-type="sourcefile">src/app/components/admin/tasks/tasks.component.ts</context>
<context context-type="linenumber">104</context>
</context-group>
<target state="translated">应用 AI 建议</target>
<target state="needs-translation">Apply AI Suggestions</target>
</trans-unit>
<trans-unit id="9172233176401579786" datatype="html">
<source>Scheduled</source>
@@ -3939,7 +3939,7 @@
<context context-type="sourcefile">src/app/components/manage/share-links/share-links.component.html</context>
<context context-type="linenumber">2,3</context>
</context-group>
<target state="translated">分享链接</target>
<target state="needs-translation">Share links</target>
</trans-unit>
<trans-unit id="7844706011418789951" datatype="html">
<source>Administration</source>
@@ -4259,7 +4259,7 @@
<context context-type="sourcefile">src/app/data/saved-view-icons.ts</context>
<context context-type="linenumber">21</context>
</context-group>
<target state="translated">聊天</target>
<target state="needs-translation">Chat</target>
</trans-unit>
<trans-unit id="8066608938393600549" datatype="html">
<source>Message</source>
@@ -4539,7 +4539,7 @@
<context context-type="sourcefile">src/app/components/common/confirm-dialog/reprocess-confirm-dialog/reprocess-confirm-dialog.component.html</context>
<context context-type="linenumber">16,17</context>
</context-group>
<target state="translated">使用远程 OCR</target>
<target state="needs-translation">Use remote OCR</target>
</trans-unit>
<trans-unit id="6733578401091585663" datatype="html">
<source>Sends the document to the configured remote OCR service, which may incur costs.</source>
@@ -4547,7 +4547,7 @@
<context context-type="sourcefile">src/app/components/common/confirm-dialog/reprocess-confirm-dialog/reprocess-confirm-dialog.component.html</context>
<context context-type="linenumber">17,18</context>
</context-group>
<target state="translated">将文档发送到已配置的远程 OCR 服务,可能会产生费用。</target>
<target state="needs-translation">Sends the document to the configured remote OCR service, which may incur costs.</target>
</trans-unit>
<trans-unit id="3883144805282469432" datatype="html">
<source>Rotate counterclockwise</source>
@@ -4655,7 +4655,7 @@
<context context-type="sourcefile">src/app/components/common/input/date/date.component.html</context>
<context context-type="linenumber">16</context>
</context-group>
<target state="translated">打开日期选择器</target>
<target state="needs-translation">Open date picker</target>
</trans-unit>
<trans-unit id="6048892649018070225" datatype="html">
<source>Today</source>
@@ -4779,7 +4779,7 @@
<context context-type="sourcefile">src/app/components/common/custom-fields-query-dropdown/custom-fields-query-dropdown.component.html</context>
<context context-type="linenumber">154</context>
</context-group>
<target state="translated">移除查询</target>
<target state="needs-translation">Remove query</target>
</trans-unit>
<trans-unit id="3184700926171002527" datatype="html">
<source>Any</source>
@@ -4823,7 +4823,7 @@
<context context-type="sourcefile">src/app/components/common/custom-fields-query-dropdown/custom-fields-query-dropdown.component.html</context>
<context context-type="linenumber">196</context>
</context-group>
<target state="translated">移除表达式</target>
<target state="needs-translation">Remove expression</target>
</trans-unit>
<trans-unit id="6630533861307510614" datatype="html">
<source>Clear created relative date</source>
@@ -6931,7 +6931,7 @@
<context context-type="sourcefile">src/app/data/paperless-config.ts</context>
<context context-type="linenumber">58</context>
</context-group>
<target state="translated">远程 OCR</target>
<target state="needs-translation">Remote OCR</target>
</trans-unit>
<trans-unit id="4101630920511881483" datatype="html">
<source>Apply AI suggestions</source>
@@ -6939,7 +6939,7 @@
<context context-type="sourcefile">src/app/components/common/edit-dialog/workflow-edit-dialog/workflow-edit-dialog.component.ts</context>
<context context-type="linenumber">159</context>
</context-group>
<target state="translated">应用 AI 建议</target>
<target state="needs-translation">Apply AI suggestions</target>
</trans-unit>
<trans-unit id="5701618810648052610" datatype="html">
<source>Title</source>
@@ -6975,7 +6975,7 @@
<context context-type="sourcefile">src/app/components/common/edit-dialog/workflow-edit-dialog/workflow-edit-dialog.component.ts</context>
<context context-type="linenumber">186</context>
</context-group>
<target state="translated">创建日期</target>
<target state="needs-translation">Created date</target>
</trans-unit>
<trans-unit id="4522609911791833187" datatype="html">
<source>Has any of these tags</source>
@@ -7396,7 +7396,7 @@
<context context-type="sourcefile">src/app/components/common/input/document-link/document-link.component.html</context>
<context context-type="linenumber">52,53</context>
</context-group>
<target state="translated">不可用</target>
<target state="needs-translation">Unavailable</target>
</trans-unit>
<trans-unit id="5676637575587497817" datatype="html">
<source>Search for documents</source>
@@ -7440,7 +7440,7 @@
<context context-type="sourcefile">src/app/components/common/input/entries/entries.component.html</context>
<context context-type="linenumber">16</context>
</context-group>
<target state="translated">移除条目</target>
<target state="needs-translation">Remove entry</target>
</trans-unit>
<trans-unit id="6932865105766151309" datatype="html">
<source>Upload</source>
@@ -7493,7 +7493,7 @@
<context context-type="sourcefile">src/app/components/common/input/select/select.component.html</context>
<context context-type="linenumber">41</context>
</context-group>
<target state="translated">移除项目</target>
<target state="needs-translation">Remove item</target>
</trans-unit>
<trans-unit id="3686284950598311784" datatype="html">
<source>Private</source>
@@ -7769,7 +7769,7 @@
<context context-type="sourcefile">src/app/components/common/permissions-filter-dropdown/permissions-filter-dropdown.component.html</context>
<context context-type="linenumber">61</context>
</context-group>
<target state="translated">清除选中的用户</target>
<target state="needs-translation">Clear selected users</target>
</trans-unit>
<trans-unit id="8999708063434507268" datatype="html">
<source>Hide unowned</source>
@@ -8481,7 +8481,7 @@
<context context-type="sourcefile">src/app/components/common/suggestions-dropdown/suggestions-dropdown.component.html</context>
<context context-type="linenumber">12,13</context>
</context-group>
<target state="translated">无建议</target>
<target state="needs-translation">No suggestions</target>
</trans-unit>
<trans-unit id="5320136382998259826" datatype="html">
<source>Suggest</source>
@@ -8533,7 +8533,7 @@
<context context-type="sourcefile">src/app/components/common/suggestions-dropdown/suggestions-dropdown.component.html</context>
<context context-type="linenumber">65,66</context>
</context-group>
<target state="translated">建议选项</target>
<target state="needs-translation">Suggestion options</target>
</trans-unit>
<trans-unit id="3145824396228856507" datatype="html">
<source>Not using default</source>
@@ -8541,7 +8541,7 @@
<context context-type="sourcefile">src/app/components/common/suggestions-dropdown/suggestions-dropdown.component.html</context>
<context context-type="linenumber">69,70</context>
</context-group>
<target state="translated">不使用默认值</target>
<target state="needs-translation">Not using default</target>
</trans-unit>
<trans-unit id="8102623853570619759" datatype="html">
<source>Suggest using:</source>
@@ -8549,7 +8549,7 @@
<context context-type="sourcefile">src/app/components/common/suggestions-dropdown/suggestions-dropdown.component.html</context>
<context context-type="linenumber">74,75</context>
</context-group>
<target state="translated">建议使用:</target>
<target state="needs-translation">Suggest using:</target>
</trans-unit>
<trans-unit id="5799391967036896978" datatype="html">
<source>ML</source>
@@ -8557,7 +8557,7 @@
<context context-type="sourcefile">src/app/components/common/suggestions-dropdown/suggestions-dropdown.component.html</context>
<context context-type="linenumber">77</context>
</context-group>
<target state="translated">ML</target>
<target state="needs-translation">ML</target>
</trans-unit>
<trans-unit id="3484984238852181071" datatype="html">
<source>AI</source>
@@ -8565,7 +8565,7 @@
<context context-type="sourcefile">src/app/components/common/suggestions-dropdown/suggestions-dropdown.component.html</context>
<context context-type="linenumber">81</context>
</context-group>
<target state="translated">AI</target>
<target state="needs-translation">AI</target>
</trans-unit>
<trans-unit id="9180110319941008393" datatype="html">
<source>Environment</source>
@@ -9219,7 +9219,7 @@
<context context-type="sourcefile">src/app/components/document-detail/document-barcodes/document-barcodes.component.html</context>
<context context-type="linenumber">40,41</context>
</context-group>
<target state="translated">复制内容</target>
<target state="needs-translation">Copy content</target>
</trans-unit>
<trans-unit id="2266163016683537825" datatype="html">
<source>of <x id="INTERPOLATION" equiv-text="{{previewNumPages()}}"/></source>
@@ -9255,7 +9255,7 @@
<context context-type="sourcefile">src/app/components/document-list/bulk-editor/bulk-editor.component.html</context>
<context context-type="linenumber">154</context>
</context-group>
<target state="translated">下载选项</target>
<target state="needs-translation">Download options</target>
</trans-unit>
<trans-unit id="8659635229098859487" datatype="html">
<source>Download original</source>
@@ -9479,7 +9479,7 @@
<context context-type="sourcefile">src/app/components/document-detail/document-detail.component.html</context>
<context context-type="linenumber">360,361</context>
</context-group>
<target state="translated">条形码</target>
<target state="needs-translation">Barcodes</target>
</trans-unit>
<trans-unit id="6992781481378431874" datatype="html">
<source>Original document metadata</source>
@@ -9727,7 +9727,7 @@
<context context-type="sourcefile">src/app/components/document-detail/document-detail.component.ts</context>
<context context-type="linenumber">1074</context>
</context-group>
<target state="translated">此版本的内容有未保存的更改。</target>
<target state="needs-translation">You have unsaved changes to the content of this version.</target>
</trans-unit>
<trans-unit id="85184271222513014" datatype="html">
<source>Switching versions will discard them.</source>
@@ -9735,7 +9735,7 @@
<context context-type="sourcefile">src/app/components/document-detail/document-detail.component.ts</context>
<context context-type="linenumber">1075</context>
</context-group>
<target state="translated">切换版本将丢弃这些更改。</target>
<target state="needs-translation">Switching versions will discard them.</target>
</trans-unit>
<trans-unit id="2565707334844767610" datatype="html">
<source>Discard and switch</source>
@@ -9743,7 +9743,7 @@
<context context-type="sourcefile">src/app/components/document-detail/document-detail.component.ts</context>
<context context-type="linenumber">1077</context>
</context-group>
<target state="translated">丢弃并切换</target>
<target state="needs-translation">Discard and switch</target>
</trans-unit>
<trans-unit id="2109314380040637387" datatype="html">
<source>Save and switch</source>
@@ -9751,7 +9751,7 @@
<context context-type="sourcefile">src/app/components/document-detail/document-detail.component.ts</context>
<context context-type="linenumber">1079</context>
</context-group>
<target state="translated">保存并切换</target>
<target state="needs-translation">Save and switch</target>
</trans-unit>
<trans-unit id="3456881259945295697" datatype="html">
<source>Error retrieving suggestions.</source>
@@ -9967,7 +9967,7 @@
<context context-type="sourcefile">src/app/components/document-detail/document-version-dropdown/add-existing-document-version-dialog/add-existing-document-version-dialog.component.html</context>
<context context-type="linenumber">13,14</context>
</context-group>
<target state="translated">请选择一份文档,将其添加为新版本。</target>
<target state="needs-translation">Select one document to add as a version.</target>
</trans-unit>
<trans-unit id="337558081609002420" datatype="html">
<source>Add version</source>
@@ -10011,7 +10011,7 @@
<context context-type="sourcefile">src/app/components/document-detail/document-version-dropdown/document-version-dropdown.component.html</context>
<context context-type="linenumber">35,36</context>
</context-group>
<target state="translated">上传新版本</target>
<target state="needs-translation">Upload a new version</target>
</trans-unit>
<trans-unit id="278763911843514709" datatype="html">
<source>Use an existing document</source>
@@ -10019,7 +10019,7 @@
<context context-type="sourcefile">src/app/components/document-detail/document-version-dropdown/document-version-dropdown.component.html</context>
<context context-type="linenumber">44,45</context>
</context-group>
<target state="translated">使用现有文档</target>
<target state="needs-translation">Use an existing document</target>
</trans-unit>
<trans-unit id="1906507263389090131" datatype="html">
<source>Existing</source>
@@ -10027,7 +10027,7 @@
<context context-type="sourcefile">src/app/components/document-detail/document-version-dropdown/document-version-dropdown.component.html</context>
<context context-type="linenumber">47,48</context>
</context-group>
<target state="translated">已有的</target>
<target state="needs-translation">Existing</target>
</trans-unit>
<trans-unit id="3119565892291077820" datatype="html">
<source>Uploading version...</source>
@@ -11234,7 +11234,7 @@
<context context-type="sourcefile">src/app/components/document-list/filter-editor/filter-editor.component.ts</context>
<context context-type="linenumber">208</context>
</context-group>
<target state="translated">创建副本</target>
<target state="needs-translation">Duplicates</target>
</trans-unit>
<trans-unit id="8492379284173601938" datatype="html">
<source>Custom fields (Deprecated)</source>
@@ -11298,7 +11298,7 @@
<context context-type="sourcefile">src/app/components/document-list/filter-editor/filter-editor.component.ts</context>
<context context-type="linenumber">252</context>
</context-group>
<target state="translated">存在</target>
<target state="needs-translation">exist</target>
</trans-unit>
<trans-unit id="4528435301189613620" datatype="html">
<source>do not exist</source>
@@ -11306,7 +11306,7 @@
<context context-type="sourcefile">src/app/components/document-list/filter-editor/filter-editor.component.ts</context>
<context context-type="linenumber">256</context>
</context-group>
<target state="translated">不存在</target>
<target state="needs-translation">do not exist</target>
</trans-unit>
<trans-unit id="5195932016807797291" datatype="html">
<source>Correspondent: <x id="PH" equiv-text="this.correspondentSelectionModel.items.find( (c) =&gt; c.id == +rule.value )?.name"/></source>
@@ -11378,7 +11378,7 @@
<context context-type="sourcefile">src/app/components/document-list/filter-editor/filter-editor.component.ts</context>
<context context-type="linenumber">343</context>
</context-group>
<target state="translated">无重复项</target>
<target state="needs-translation">Without duplicates</target>
</trans-unit>
<trans-unit id="8448347828886552444" datatype="html">
<source>With duplicates</source>
@@ -11386,7 +11386,7 @@
<context context-type="sourcefile">src/app/components/document-list/filter-editor/filter-editor.component.ts</context>
<context context-type="linenumber">344</context>
</context-group>
<target state="translated">带重复项</target>
<target state="needs-translation">With duplicates</target>
</trans-unit>
<trans-unit id="8644099678903817943" datatype="html">
<source>Custom fields query</source>
@@ -11462,7 +11462,7 @@
<context context-type="sourcefile">src/app/components/manage/saved-views/saved-views.component.html</context>
<context context-type="linenumber">21</context>
</context-group>
<target state="translated">图标</target>
<target state="needs-translation">Icon</target>
</trans-unit>
<trans-unit id="8689274715612276035" datatype="html">
<source>Show in sidebar</source>
@@ -12515,7 +12515,7 @@
<context context-type="sourcefile">src/app/components/manage/share-links/share-link-list/share-link-list.component.html</context>
<context context-type="linenumber">40,41</context>
</context-group>
<target state="translated">已过期</target>
<target state="needs-translation">Expired</target>
</trans-unit>
<trans-unit id="2057574872309338088" datatype="html">
<source>Copy share link</source>
@@ -12559,7 +12559,7 @@
<context context-type="sourcefile">src/app/components/manage/share-links/share-link-bundle-list/share-link-bundle-list.component.html</context>
<context context-type="linenumber">164,165</context>
</context-group>
<target state="translated">分享链接合集分页</target>
<target state="needs-translation">Share link bundles pagination</target>
</trans-unit>
<trans-unit id="1541995860059283227" datatype="html">
<source>Failed to load share link bundles.</source>
@@ -12623,7 +12623,7 @@
<context context-type="sourcefile">src/app/components/manage/share-links/share-link-list/share-link-list.component.html</context>
<context context-type="linenumber">15,16</context>
</context-group>
<target state="translated">文档</target>
<target state="needs-translation">Document</target>
</trans-unit>
<trans-unit id="7420713064779772535" datatype="html">
<source>Delete share link</source>
@@ -12631,7 +12631,7 @@
<context context-type="sourcefile">src/app/components/manage/share-links/share-link-list/share-link-list.component.html</context>
<context context-type="linenumber">75,76</context>
</context-group>
<target state="translated">删除分享链接</target>
<target state="needs-translation">Delete share link</target>
</trans-unit>
<trans-unit id="5198271726831144068" datatype="html">
<source>Share links pagination</source>
@@ -12647,7 +12647,7 @@
<context context-type="sourcefile">src/app/components/manage/share-links/share-link-list/share-link-list.component.ts</context>
<context context-type="linenumber">105</context>
</context-group>
<target state="translated">加载分享链接失败。</target>
<target state="needs-translation">Failed to load share links.</target>
</trans-unit>
<trans-unit id="4100863040928608880" datatype="html">
<source>Error retrieving share links.</source>
@@ -12655,7 +12655,7 @@
<context context-type="sourcefile">src/app/components/manage/share-links/share-link-list/share-link-list.component.ts</context>
<context context-type="linenumber">107</context>
</context-group>
<target state="translated">获取分享链接失败。</target>
<target state="needs-translation">Error retrieving share links.</target>
</trans-unit>
<trans-unit id="326120283142363299" datatype="html">
<source>Share link deleted.</source>
@@ -12663,7 +12663,7 @@
<context context-type="sourcefile">src/app/components/manage/share-links/share-link-list/share-link-list.component.ts</context>
<context context-type="linenumber">154</context>
</context-group>
<target state="translated">分享链接已删除。</target>
<target state="needs-translation">Share link deleted.</target>
</trans-unit>
<trans-unit id="4964931417181298145" datatype="html">
<source>Error deleting share link.</source>
@@ -12671,7 +12671,7 @@
<context context-type="sourcefile">src/app/components/manage/share-links/share-link-list/share-link-list.component.ts</context>
<context context-type="linenumber">159</context>
</context-group>
<target state="translated">删除分享链接失败。</target>
<target state="needs-translation">Error deleting share link.</target>
</trans-unit>
<trans-unit id="3439104787814858626" datatype="html">
<source>Manage public links to individual documents and document bundles.</source>
@@ -12679,7 +12679,7 @@
<context context-type="sourcefile">src/app/components/manage/share-links/share-links.component.html</context>
<context context-type="linenumber">4,5</context>
</context-group>
<target state="translated">管理单个文档和文档合集的公开分享链接。</target>
<target state="needs-translation">Manage public links to individual documents and document bundles.</target>
</trans-unit>
<trans-unit id="3740311348735113099" datatype="html">
<source>Document links</source>
@@ -12687,7 +12687,7 @@
<context context-type="sourcefile">src/app/components/manage/share-links/share-links.component.html</context>
<context context-type="linenumber">18,19</context>
</context-group>
<target state="translated">文档链接</target>
<target state="needs-translation">Document links</target>
</trans-unit>
<trans-unit id="8216780576869093031" datatype="html">
<source>Bundles</source>
@@ -12695,7 +12695,7 @@
<context context-type="sourcefile">src/app/components/manage/share-links/share-links.component.html</context>
<context context-type="linenumber">26,27</context>
</context-group>
<target state="translated">捆绑包</target>
<target state="needs-translation">Bundles</target>
</trans-unit>
<trans-unit id="1229748338333965418" datatype="html">
<source>Use workflows to customize the behavior of Paperless-ngx when events &apos;trigger&apos; a workflow.</source>
@@ -13208,7 +13208,7 @@
<context context-type="sourcefile">src/app/data/paperless-config.ts</context>
<context context-type="linenumber">200</context>
</context-group>
<target state="translated">远程 OCR 引擎</target>
<target state="needs-translation">Remote OCR Engine</target>
</trans-unit>
<trans-unit id="2892372808177591734" datatype="html">
<source>Enabling remote OCR sends documents to a third-party service for processing. Consider the privacy implications as well as potential costs before enabling.</source>
@@ -13224,7 +13224,7 @@
<context context-type="sourcefile">src/app/data/paperless-config.ts</context>
<context context-type="linenumber">210</context>
</context-group>
<target state="translated">远程 OCR API 密钥</target>
<target state="needs-translation">Remote OCR API Key</target>
</trans-unit>
<trans-unit id="8592973963881683840" datatype="html">
<source>Remote OCR Endpoint</source>
@@ -13232,7 +13232,7 @@
<context context-type="sourcefile">src/app/data/paperless-config.ts</context>
<context context-type="linenumber">218</context>
</context-group>
<target state="translated">远程 OCR 端点</target>
<target state="needs-translation">Remote OCR Endpoint</target>
</trans-unit>
<trans-unit id="2477780225973884032" datatype="html">
<source>Required when using the Azure AI engine.</source>
@@ -13240,7 +13240,7 @@
<context context-type="sourcefile">src/app/data/paperless-config.ts</context>
<context context-type="linenumber">223</context>
</context-group>
<target state="translated">使用 Azure AI 引擎时必填。</target>
<target state="needs-translation">Required when using the Azure AI engine.</target>
</trans-unit>
<trans-unit id="2908398258708722139" datatype="html">
<source>Remote OCR Mode</source>
@@ -13248,7 +13248,7 @@
<context context-type="sourcefile">src/app/data/paperless-config.ts</context>
<context context-type="linenumber">227</context>
</context-group>
<target state="translated">远程 OCR 模式</target>
<target state="needs-translation">Remote OCR Mode</target>
</trans-unit>
<trans-unit id="4022045371405916558" datatype="html">
<source>Which documents are sent to the remote engine. Use &apos;workflow_only&apos; to keep remote OCR off unless a workflow enables it for a document.</source>
+6 -6
View File
@@ -479,7 +479,7 @@
<context context-type="sourcefile">src/app/app.component.ts</context>
<context context-type="linenumber">201</context>
</context-group>
<target state="translated">標籤、關聯方、文件類型、儲存路徑與自訂欄位等文件屬性皆可在此處管理,亦可在「文件編輯」檢視中建立。</target>
<target state="translated">標籤、關聯方、文件類型、儲存路徑與自訂欄位等屬性皆可在此處管理,亦可在「文件編輯」檢視中建立。</target>
</trans-unit>
<trans-unit id="7851939076947092983" datatype="html">
<source>Manage e-mail accounts and rules for automatically importing documents.</source>
@@ -3859,7 +3859,7 @@
<context context-type="sourcefile">src/app/components/app-frame/app-frame.component.html</context>
<context context-type="linenumber">195</context>
</context-group>
<target state="translated">文件屬性</target>
<target state="translated">屬性</target>
</trans-unit>
<trans-unit id="7437910965833684826" datatype="html">
<source>Correspondents</source>
@@ -8525,7 +8525,7 @@
<context context-type="sourcefile">src/app/components/common/suggestions-dropdown/suggestions-dropdown.component.html</context>
<context context-type="linenumber">54</context>
</context-group>
<target state="translated">{VAR_PLURAL, plural, =1 {以下有 1 個可用建議} other {以下有 <x id="INTERPOLATION"/> 個可用建議}}</target>
<target state="needs-translation">{VAR_PLURAL, plural, =1 {1 suggestion available below} other {<x id="INTERPOLATION"/> suggestions available below}}</target>
</trans-unit>
<trans-unit id="4169875112244042673" datatype="html">
<source>Suggestion options</source>
@@ -9219,7 +9219,7 @@
<context context-type="sourcefile">src/app/components/document-detail/document-barcodes/document-barcodes.component.html</context>
<context context-type="linenumber">40,41</context>
</context-group>
<target state="translated">拷貝內容</target>
<target state="needs-translation">Copy content</target>
</trans-unit>
<trans-unit id="2266163016683537825" datatype="html">
<source>of <x id="INTERPOLATION" equiv-text="{{previewNumPages()}}"/></source>
@@ -9479,7 +9479,7 @@
<context context-type="sourcefile">src/app/components/document-detail/document-detail.component.html</context>
<context context-type="linenumber">360,361</context>
</context-group>
<target state="translated">條碼</target>
<target state="needs-translation">Barcodes</target>
</trans-unit>
<trans-unit id="6992781481378431874" datatype="html">
<source>Original document metadata</source>
@@ -13376,7 +13376,7 @@
<context context-type="sourcefile">src/app/data/paperless-config.ts</context>
<context context-type="linenumber">335</context>
</context-group>
<target state="translated">儲存條碼內容</target>
<target state="needs-translation">Store Barcode Contents</target>
</trans-unit>
<trans-unit id="7011909364081812031" datatype="html">
<source>AI Enabled</source>
-2
View File
@@ -41,7 +41,6 @@ import {
bell,
bodyText,
bookmark,
boxArrowInRight,
boxArrowUp,
boxArrowUpRight,
boxes,
@@ -294,7 +293,6 @@ const icons = {
braces,
bodyText,
bookmark,
boxArrowInRight,
boxArrowUp,
boxArrowUpRight,
boxes,
+1 -1
View File
@@ -15,7 +15,7 @@
"target": "ES2022",
"module": "es2020",
"lib": [
"es2022",
"es2020",
"dom"
],
"useDefineForClassFields": false
-4
View File
@@ -54,10 +54,6 @@ def _predict_with_threshold(classifier, X, threshold: float) -> int | None:
cutoff so that uncertain predictions are discarded rather than assigned.
"""
probas = classifier.predict_proba(X)[0]
if len(classifier.classes_) == 1:
# scikit-learn treats a single-class fit as binary, so predict_proba
# returns [1 - p, p] for one class. Column 0 is the real class.
probas = probas[:1]
best_idx = int(probas.argmax())
best_class = int(classifier.classes_[best_idx])
-2
View File
@@ -130,14 +130,12 @@ class DocumentMetadataOverrides:
get_users_with_perms(
doc,
only_with_perms_in=["view_document"],
with_group_users=False,
).values_list("id", flat=True),
)
overrides.change_users = list(
get_users_with_perms(
doc,
only_with_perms_in=["change_document"],
with_group_users=False,
).values_list("id", flat=True),
)
overrides.custom_fields = {
+2 -18
View File
@@ -50,7 +50,6 @@ from documents.models import ShareLink
from documents.models import ShareLinkBundle
from documents.models import StoragePath
from documents.models import Tag
from documents.permissions import annotate_authorizing_fields
from documents.permissions import permitted_document_ids
from documents.permissions import permitted_object_ids
from documents.versioning import annotate_effective_content
@@ -1076,9 +1075,6 @@ class PermittedObjectsFilter(BaseFilterBackend):
include_granted: bool = True
perm_codename: str | None = None
# A self-referencing foreign key whose target authorizes a row, so a row is
# judged by its parent's owner and grants (``Document.root_document``).
parent_field: str | None = None
def filter_queryset(self, request, queryset, view):
# Before the superuser and owner-only paths, neither of which consults
@@ -1090,23 +1086,11 @@ class PermittedObjectsFilter(BaseFilterBackend):
if request.user.is_superuser:
return queryset
if not self.include_granted:
owner_field = "owner"
if self.parent_field is not None:
queryset = annotate_authorizing_fields(queryset, self.parent_field)
owner_field = "authorizing_owner"
return queryset.filter(
Q(**{owner_field: request.user.pk})
| Q(**{f"{owner_field}__isnull": True}),
)
return queryset.filter(Q(owner=request.user) | Q(owner__isnull=True))
model = queryset.model
perm = self.perm_codename or f"view_{model._meta.model_name}"
return queryset.filter(
id__in=permitted_object_ids(
request.user,
model,
perm,
parent_field=self.parent_field,
),
id__in=permitted_object_ids(request.user, model, perm),
)
@@ -3,7 +3,6 @@ from itertools import islice
from pathlib import Path
from typing import TYPE_CHECKING
from typing import Any
from typing import Final
from allauth.mfa.models import Authenticator
from allauth.socialaccount.models import SocialAccount
@@ -71,15 +70,6 @@ from paperless.models import ApplicationConfiguration
from paperless_mail.models import MailAccount
from paperless_mail.models import MailRule
# Derived names replace the original's extension with these suffixes
THUMBNAIL_SUFFIX: Final[str] = "-thumbnail.webp"
ARCHIVE_SUFFIX: Final[str] = "-archive.pdf"
# Leave room for the longest derived suffix, which replaces the original's extension
MAX_BASE_NAME_BYTES: Final[int] = Document.MAX_PUBLIC_FILENAME_BYTES - max(
len(THUMBNAIL_SUFFIX),
len(ARCHIVE_SUFFIX),
)
def serialize_queryset_batched(
queryset: "QuerySet[Any]",
@@ -522,16 +512,10 @@ class Command(CryptMixin, PaperlessCommand):
counter=filename_counter,
)
else:
base_name = document.get_public_filename(
counter=filename_counter,
max_bytes=MAX_BASE_NAME_BYTES,
)
base_name = document.get_public_filename(counter=filename_counter)
# The thumbnail and archive names are derived from the stem, so
# uniqueness must hold without the original's extension
unique_key = str(Path(base_name).with_suffix(""))
if unique_key not in self.exported_files:
self.exported_files.add(unique_key)
if base_name not in self.exported_files:
self.exported_files.add(base_name)
break
else:
filename_counter += 1
@@ -554,7 +538,7 @@ class Command(CryptMixin, PaperlessCommand):
document_dict[EXPORTER_FILE_NAME] = original_arc
if not self.no_thumbnail:
thumbnail_name = base_name.parent / (base_name.stem + THUMBNAIL_SUFFIX)
thumbnail_name = base_name.parent / (base_name.stem + "-thumbnail.webp")
if self.use_folder_prefix:
thumbnail_name = Path("thumbnails") / thumbnail_name
thumbnail_arc = thumbnail_name.as_posix()
@@ -563,7 +547,7 @@ class Command(CryptMixin, PaperlessCommand):
thumbnail_arc = None
if not self.no_archive and document.has_archive_version:
archive_name = base_name.parent / (base_name.stem + ARCHIVE_SUFFIX)
archive_name = base_name.parent / (base_name.stem + "-archive.pdf")
if self.use_folder_prefix:
archive_name = Path("archive") / archive_name
archive_arc = archive_name.as_posix()
@@ -66,7 +66,7 @@ def iter_manifest_records(path: Path) -> Generator[dict, None, None]:
"""Yield records one at a time from a manifest JSON array via ijson."""
try:
with path.open("rb") as f:
yield from ijson.items(f, "item", use_float=True)
yield from ijson.items(f, "item")
except ijson.JSONError as e:
raise CommandError(f"Failed to parse manifest file {path}: {e}") from e
+12 -23
View File
@@ -157,8 +157,6 @@ class StoragePath(MatchingModel):
class Document(SoftDeleteModel, ModelWithOwner): # type: ignore[django-manager-missing]
MAX_STORED_FILENAME_LENGTH: Final[int] = 1024
# Per-component limit of common filesystems (ext4, XFS, btrfs, ZFS, APFS)
MAX_PUBLIC_FILENAME_BYTES: Final[int] = 255
correspondent = models.ForeignKey(
Correspondent,
@@ -486,37 +484,28 @@ class Document(SoftDeleteModel, ModelWithOwner): # type: ignore[django-manager-
def archive_file(self):
return Path(self.archive_path).open("rb")
def get_public_filename(
self,
*,
archive: bool = False,
counter: int = 0,
max_bytes: int = MAX_PUBLIC_FILENAME_BYTES,
) -> str:
def get_public_filename(self, *, archive=False, counter=0, suffix=None) -> str:
"""
Returns a sanitized filename for the document, not including any paths.
The name fits in max_bytes (UTF-8). A long title is shortened before
the counter and extension are appended, because sanitize_filename
truncates from the end. The tail is cut only when max_bytes is
smaller than the tail itself.
"""
# Root owns metadata for all versions
context_document = (
self.root_document if self.root_document_id is not None else self
)
result = str(context_document)
extension = ".pdf" if archive else self.file_type
tail = f"_{counter:02}{extension}" if counter else extension
if counter:
result += f"_{counter:02}"
head_bytes = max(0, max_bytes - len(tail.encode()))
head = str(context_document).encode()[:head_bytes].decode(errors="ignore")
if suffix:
result += suffix
return pathvalidate.sanitize_filename(
head + tail,
replacement_text="-",
max_len=max_bytes,
)
if archive:
result += ".pdf"
else:
result += self.file_type
return pathvalidate.sanitize_filename(result, replacement_text="-")
@property
def file_type(self):
+36 -74
View File
@@ -8,9 +8,11 @@ from django.contrib.contenttypes.models import ContentType
from django.db.models import Case
from django.db.models import CharField
from django.db.models import Count
from django.db.models import Exists
from django.db.models import F
from django.db.models import IntegerField
from django.db.models import Model
from django.db.models import OuterRef
from django.db.models import Q
from django.db.models import QuerySet
from django.db.models import Value
@@ -367,18 +369,14 @@ def permitted_object_ids(
visible exactly when its parent is, judged by the parent's owner and
grants, so the row's own owner and grants are ignored.
Guardian stores ``object_pk`` as a string, so the row key is cast to a
string and tested against the user's and groups' grants with a single
uncorrelated ``IN``. Postgres and SQLite build that set once. MariaDB
evaluates it as an index probe per row, which is cheap because the
lookups use guardian's unique indexes. Casting every ``object_pk`` to an
integer instead cannot use an index, and MariaDB cannot materialize it
inside the owner ``OR``, so it re-scans the user's grants for every row.
A correlated ``EXISTS`` per grant fixes MariaDB too, but Postgres and
SQLite re-run it for every row and end up slower than the original. The
user's groups are matched with an ``IN`` subquery rather than a join
through the membership table, which SQLite plans badly once the grant
tables grow.
Guardian stores ``object_pk`` as a string, so each grant is an ``EXISTS``
keyed on the row's id cast to a string, which can use guardian's
(user, permission, object_pk) unique index. Casting every ``object_pk`` to
an integer for an ``id IN (...)`` is not indexable, and MariaDB cannot
materialize it inside the owner ``OR``, so it re-scans the user's grants
for every row. The user's groups are matched with an ``IN`` subquery
rather than a join through the membership table, which SQLite plans badly
once the grant tables grow.
"""
has_soft_delete = hasattr(model, "global_objects")
manager = (
@@ -389,7 +387,14 @@ def permitted_object_ids(
owner_field, key_field = "owner", "pk"
if parent_field is not None:
owner_field, key_field = "authorizing_owner", "authorizing_id"
base_qs = annotate_authorizing_fields(base_qs, parent_field)
base_qs = base_qs.annotate(
authorizing_id=Coalesce(f"{parent_field}_id", "id"),
authorizing_owner=Case(
When(**{f"{parent_field}_id__isnull": True}, then=F("owner_id")),
default=F(f"{parent_field}__owner_id"),
output_field=IntegerField(),
),
)
unowned = Q(**{f"{owner_field}__isnull": True})
if user is None or not getattr(user, "is_authenticated", False):
@@ -417,51 +422,30 @@ def permitted_object_ids(
"permission__content_type": content_type,
}
# Both grant sets are compared to the row key as strings, exactly as
# guardian stores them, and are uncorrelated, so each engine can build the
# set once instead of probing per row.
user_keys = UserObjectPermission.objects.filter(
user=user,
**perm_filter,
).values_list("object_pk", flat=True)
group_keys = GroupObjectPermission.objects.filter(
group_id__in=user.groups.values("id"),
**perm_filter,
).values_list("object_pk", flat=True)
permitted_keys = user_keys.union(group_keys, all=True)
return (
base_qs.annotate(permitted_key=Cast(key_field, CharField(max_length=64)))
.filter(
Q(**{owner_field: user.pk}) | unowned | Q(permitted_key__in=permitted_keys),
)
.values_list("id", flat=True)
key_as_text = Cast(OuterRef(key_field), CharField(max_length=64))
granted_to_user = Exists(
UserObjectPermission.objects.filter(
user=user,
object_pk=key_as_text,
**perm_filter,
),
)
granted_to_group = Exists(
GroupObjectPermission.objects.filter(
group_id__in=user.groups.values("id"),
object_pk=key_as_text,
**perm_filter,
),
)
return base_qs.filter(
Q(**{owner_field: user.pk}) | unowned | granted_to_user | granted_to_group,
).values_list("id", flat=True)
ModelT = TypeVar("ModelT", bound=Model)
def annotate_authorizing_fields(
queryset: QuerySet[ModelT],
parent_field: str,
) -> QuerySet[ModelT]:
"""
Annotate each row with ``authorizing_id`` and ``authorizing_owner``: the id
and owner of the row that authorizes it. A row with a parent (the
self-referencing foreign key ``parent_field``) is authorized by its parent,
any other row by itself.
"""
return queryset.annotate(
authorizing_id=Coalesce(f"{parent_field}_id", "id"),
authorizing_owner=Case(
When(**{f"{parent_field}_id__isnull": True}, then=F("owner_id")),
default=F(f"{parent_field}__owner_id"),
output_field=IntegerField(),
),
)
def user_is_unrestricted(user: User | None) -> bool:
"""
True when ``user`` means "no restriction at all" (an absent user, or an
@@ -511,28 +495,6 @@ def restrict_queryset_to_visible(
return queryset.filter(pk__in=permitted_object_ids(user, queryset.model, perm))
def user_is_active_superuser(user: User | None) -> bool:
"""
True only for an active, authenticated superuser.
"""
return user is not None and user_is_unrestricted(user)
def restrict_queryset_to_owner_visible(
queryset: QuerySet[ModelT],
user: User | None,
perm: str,
) -> QuerySet[ModelT]:
"""
Like ``restrict_queryset_to_visible``, but ``user=None`` sees only unowned
rows (``permitted_object_ids(None, ...)`` semantics) instead of every row.
See ``user_is_active_superuser``.
"""
if user_is_active_superuser(user):
return queryset
return queryset.filter(pk__in=permitted_object_ids(user, queryset.model, perm))
def permitted_document_ids(
user: User | None,
*,
+1 -15
View File
@@ -926,7 +926,6 @@ class TantivyBackend:
sort_field: str | None = None,
sort_reverse: bool = False,
search_mode: SearchMode = SearchMode.QUERY,
filter_query: str | None = None,
limit: int | None = None,
) -> list[int]:
"""
@@ -942,7 +941,6 @@ class TantivyBackend:
sort_field: Field to sort by (None for relevance ranking)
sort_reverse: Whether to reverse the sort order
search_mode: Query parsing mode (QUERY, TEXT, or TITLE)
filter_query: Optional advanced query results must also match
limit: Maximum number of IDs to return (None = all matching docs)
Returns:
@@ -950,13 +948,6 @@ class TantivyBackend:
"""
self._ensure_open()
user_query = self._parse_query(query, search_mode)
if filter_query is not None:
user_query = user_query.and_must_match(
tantivy.Query.const_score_query(
self._parse_query(filter_query, SearchMode.QUERY),
0.0, # zero so doesn't affect relevance
),
)
final_query = self._apply_permission_filter(user_query, user)
searcher = self._index.searcher()
@@ -1052,21 +1043,16 @@ class TantivyBackend:
excluded from results.
Args:
doc_id: Primary key of the reference document, or of one of its
versions
doc_id: Primary key of the reference document
user: User for permission filtering (None for no filtering)
limit: Maximum number of IDs to return (None = all matching docs)
Returns:
List of similar document IDs (excluding the original)
"""
from documents.versioning import root_document_ids
self._ensure_open()
searcher = self._index.searcher()
# Only root documents are indexed, so a version stands for its root
doc_id = next(iter(root_document_ids([doc_id])), doc_id)
id_query = tantivy.Query.term_query(self._schema, "id", doc_id)
results = searcher.search(id_query, limit=1)
+1 -3
View File
@@ -28,9 +28,7 @@ logger = logging.getLogger("paperless.search")
# columns dropped. tantivy compares schemas by ordered field list, so an
# index built by v1 rejects every write against the v2 schema.
# v3 - barcodes JSON field for stored barcode contents
# v4 - root documents only. Earlier indexes may hold document versions under
# their own id and metadata, so they are rebuilt without them.
SCHEMA_VERSION: Final[int] = 4
SCHEMA_VERSION: Final[int] = 3
# Present in the index directory from the moment a full rebuild starts until it
# finishes. If a rebuild is interrupted it is left behind, so the half-built
@@ -1136,34 +1136,6 @@ class TestMoreLikeThis:
assert 150 not in ids
assert 151 in ids
def test_more_like_this_ids_seeded_by_version_uses_root(
self,
backend: TantivyBackend,
) -> None:
"""A version is not indexed, so it must be looked up as its root."""
root = DocumentFactory.create(
title="Important document",
content="financial information report",
)
version = DocumentFactory.create(
title="Important document",
content="financial information report",
root_document=root,
version_index=1,
)
other = DocumentFactory.create(
title="Another document",
content="financial information report",
)
backend.add_or_update(root)
backend.add_or_update(other)
ids = backend.more_like_this_ids(doc_id=version.pk, user=None)
assert other.pk in ids
assert root.pk not in ids
assert version.pk not in ids
class TestSingleton:
"""Test get_backend() and reset_backend() singleton lifecycle."""
+1 -2
View File
@@ -835,7 +835,6 @@ class TestBulkEditAPI(DirectoriesMixin, APITestCase):
for filters in (
{"text": "new doc 2017-03-16"},
{"title_search": "apple"},
{"title_search": "apple", "query": "created:[-1 year to now]"},
):
with self.subTest(filters=filters):
get_backend.return_value.search_ids.return_value = [self.doc2.id]
@@ -887,7 +886,7 @@ class TestBulkEditAPI(DirectoriesMixin, APITestCase):
"all": True,
"filters": {
"text": "B",
"title_search": "c1",
"query": "c1",
},
"method": "set_storage_path",
"parameters": {"storage_path": self.sp1.id},
+24 -94
View File
@@ -245,68 +245,8 @@ class TestDocumentSearchApi(DirectoriesMixin, APITestCase):
self.assertEqual(response.data["count"], 1)
self.assertEqual(response.data["results"][0]["id"], title_match.id)
def test_simple_search_combined_with_query_filter(self) -> None:
"""
GIVEN:
- A document with the term in its title, created this year
- A document with the term only in its content, created this year
- A document with the term in its title, created years ago
WHEN:
- A title or text search is combined with a relative created
date query, as the filter editor sends it
THEN:
- The simple search keeps its own field scope and the query only
narrows the results (issue #14436)
"""
this_year = timezone.localdate().replace(month=1, day=1)
title_match = Document.objects.create(
title="foo report",
content="nothing relevant",
checksum="F1",
created=this_year,
pk=21,
)
content_match = Document.objects.create(
title="something else",
content="foo appears here",
checksum="F2",
created=this_year,
pk=22,
)
old_title_match = Document.objects.create(
title="foo archive",
content="nothing relevant",
checksum="F3",
created=datetime.date(2001, 1, 1),
pk=23,
)
backend = get_backend()
for doc in (title_match, content_match, old_title_match):
backend.add_or_update(doc)
query = "created:[-1 year to now]"
response = self.client.get(
"/api/documents/",
{"title_search": "foo", "query": query},
)
self.assertEqual(response.status_code, status.HTTP_200_OK)
self.assertEqual(
[r["id"] for r in response.data["results"]],
[title_match.id],
)
response = self.client.get(
"/api/documents/",
{"text": "foo", "query": query},
)
self.assertEqual(response.status_code, status.HTTP_200_OK)
self.assertCountEqual(
[r["id"] for r in response.data["results"]],
[title_match.id, content_match.id],
)
def test_search_rejects_multiple_search_modes(self) -> None:
response = self.client.get("/api/documents/?text=bank&title_search=bank")
response = self.client.get("/api/documents/?text=bank&query=bank")
self.assertEqual(response.status_code, status.HTTP_400_BAD_REQUEST)
self.assertEqual(
response.data["detail"],
@@ -1374,39 +1314,6 @@ class TestDocumentSearchApi(DirectoriesMixin, APITestCase):
self.assertEqual(response.status_code, status.HTTP_403_FORBIDDEN)
self.assertEqual(response.content, b"Insufficient permissions.")
def test_search_more_like_version_requires_view_permission_on_its_root(
self,
) -> None:
"""
GIVEN:
- Another user's private root document with an unowned version
WHEN:
- A user without access requests more-like-this for the version
THEN:
- The request is rejected, the version's missing owner grants nothing
"""
owner = UserFactory(username="owner")
attacker = UserFactory(username="attacker")
grant_global(attacker, "view_document")
private_root = DocumentFactory(
title="private bank statement",
content="quarterly treasury bank statement wire transfer",
owner=owner,
)
version = DocumentFactory(
root_document=private_root,
version_index=1,
owner=None,
)
get_backend().add_or_update(private_root)
self.client.force_authenticate(user=attacker)
response = self.client.get(f"/api/documents/?more_like_id={version.id}")
self.assertEqual(response.status_code, status.HTTP_403_FORBIDDEN)
self.assertEqual(response.content, b"Insufficient permissions.")
def test_search_filtering(self) -> None:
t = Tag.objects.create(name="tag")
t2 = Tag.objects.create(name="tag2")
@@ -2137,6 +2044,29 @@ class TestDocumentSearchApi(DirectoriesMixin, APITestCase):
self.assertEqual(len(response.data["documents"]), 1)
self.assertEqual(response.data["documents"][0]["id"], title_match.id)
def test_global_search_returns_latest_version_content(self) -> None:
root = Document.objects.create(
title="bank statement",
content="superseded content",
checksum="GSV1",
pk=23,
)
Document.objects.create(
title="bank statement v2",
content="latest content",
checksum="GSV2",
pk=24,
root_document=root,
version_index=1,
)
self.client.force_authenticate(self.user)
response = self.client.get("/api/search/?query=bank&db_only=true")
self.assertEqual(response.status_code, status.HTTP_200_OK)
returned = {doc["id"]: doc["content"] for doc in response.data["documents"]}
self.assertEqual(returned.get(root.id), "latest content")
def test_global_search_filters_owned_mail_objects(self) -> None:
user1 = UserFactory(username="mail-search-user")
user2 = UserFactory(username="other-mail-search-user")
-44
View File
@@ -14,7 +14,6 @@ from django.test import override_settings
from django.test.utils import CaptureQueriesContext
from pytest_django.fixtures import Settings
from pytest_mock import MockerFixture
from sklearn.neural_network import MLPClassifier
from documents.classifier import ClassifierModelCorruptError
from documents.classifier import DocumentClassifier
@@ -1037,49 +1036,6 @@ def test_classifier_match_threshold_default() -> None:
assert settings.CLASSIFIER_MATCH_THRESHOLD == 0.3
class TestPredictWithThresholdSingleClass:
@pytest.fixture
def single_class_model(self) -> tuple[MLPClassifier, np.ndarray]:
X = np.random.default_rng(0).random((2, 5))
return MLPClassifier(tol=0.01, random_state=0).fit(X, [3, 3]), X[:1]
def test_returns_only_class(
self,
single_class_model: tuple[MLPClassifier, np.ndarray],
) -> None:
"""
GIVEN:
- A classifier fitted on a single class (every document shares one label)
WHEN:
- A prediction is requested with the threshold disabled
THEN:
- No error is raised and the only class is returned
"""
classifier, X = single_class_model
assert _predict_with_threshold(classifier, X, threshold=0.0) == 3
def test_applies_threshold(
self,
single_class_model: tuple[MLPClassifier, np.ndarray],
) -> None:
"""
GIVEN:
- A classifier fitted on a single class
WHEN:
- A prediction is requested
THEN:
- The class's confidence is still compared against the threshold
"""
classifier, X = single_class_model
confidence = classifier.predict_proba(X)[0][0]
assert _predict_with_threshold(classifier, X, threshold=confidence - 0.01) == 3
assert (
_predict_with_threshold(classifier, X, threshold=confidence + 0.01) is None
)
class TestPreprocessContent:
@pytest.fixture
def samples(self) -> Path:
-28
View File
@@ -34,10 +34,8 @@ from documents.tests.utils import GetConsumerMixin
from paperless_mail.models import MailRule
from paperless_testing.assertions import FileSystemAssertsMixin
from paperless_testing.dirs import DirectoriesMixin
from paperless_testing.factories import DocumentFactory
from paperless_testing.factories import UserFactory
from paperless_testing.fakes.progress import FakeProgressManager
from paperless_testing.permissions import grant_object
class _BaseNewStyleParser:
@@ -1685,32 +1683,6 @@ class TestMetadataOverrides(TestCase):
self.assertEqual(base.actor_id, 2)
self.assertEqual(base.version_label, "v2")
def test_from_document_copies_user_and_group_grants_separately(self) -> None:
"""
GIVEN:
- A document with view and change granted directly to one user and
to a group with another user as a member
WHEN:
- Overrides are built from the document
THEN:
- The user lists hold only the directly granted user
- The group lists hold the group
"""
direct_user = UserFactory()
group_member = UserFactory()
group = Group.objects.create(name="group")
group_member.groups.add(group)
document = DocumentFactory()
grant_object(direct_user, document, "view_document", "change_document")
grant_object(group, document, "view_document", "change_document")
overrides = DocumentMetadataOverrides.from_document(document)
self.assertEqual(overrides.view_users, [direct_user.pk])
self.assertEqual(overrides.change_users, [direct_user.pk])
self.assertEqual(overrides.view_groups, [group.pk])
self.assertEqual(overrides.change_groups, [group.pk])
class TestBarcodeApplyDetectedASN(TestCase):
"""
@@ -423,3 +423,35 @@ class TestTrashAndGlobalSearchEffectiveContentIsNeverPerInstance:
[result] = [r for r in response.data["results"] if r["id"] == root.id]
assert result["content"] == "own-content"
assert _get_effective_content_fallback_queries(ctx) == []
def test_global_search_db_only_shows_latest_version_content_with_no_extra_query(
self,
admin_client: APIClient,
) -> None:
"""
GIVEN:
- A root document, findable by title, whose own content differs
from its latest version's
WHEN:
- Using the global search endpoint's db_only mode
THEN:
- The response shows the latest version's content, resolved by
GlobalSearchView's own effective_content annotation
- There is no per-instance fallback query
"""
root = DocumentFactory(title="findme", content="own-content")
DocumentFactory(
root_document=root,
version_index=1,
content="version-content",
)
with CaptureQueriesContext(connection) as ctx:
response = admin_client.get(
"/api/search/?query=findme&db_only=true",
)
assert response.status_code == status.HTTP_200_OK
[result] = [d for d in response.data["documents"] if d["id"] == root.id]
assert result["content"] == "version-content"
assert _get_effective_content_fallback_queries(ctx) == []
@@ -4,16 +4,13 @@ from datetime import date
from pathlib import Path
from unittest import mock
import pytest
from django.test import TestCase
from django.test import override_settings
from faker import Faker
from pytest_mock import MockerFixture
from documents.models import Correspondent
from documents.models import Document
from documents.tasks import empty_trash
from paperless_testing.factories import DocumentFactory
class TestDocument(TestCase):
@@ -260,72 +257,3 @@ def test_suggestion_content() -> None:
)
doc.content = content_over_limit
assert doc.suggestion_content == expected_cropped_content
class TestPublicFilenameLength:
@pytest.fixture(autouse=True)
def _no_parser_registry(self, mocker: MockerFixture) -> None:
# The parser registry reads ApplicationConfiguration from the database
extensions = {"application/pdf": ".pdf", "image/jpeg": ".jpg"}
mocker.patch(
"documents.models.get_default_file_extension",
side_effect=extensions.__getitem__,
)
LIMIT = Document.MAX_PUBLIC_FILENAME_BYTES
@pytest.mark.parametrize(
("title", "archive", "counter", "max_bytes", "tail"),
[
pytest.param("a" * 300, False, 0, LIMIT, ".jpg", id="ascii"),
pytest.param("a" * 300, True, 0, LIMIT, ".pdf", id="archive"),
pytest.param("ä" * 200, False, 0, LIMIT, ".jpg", id="umlaut"),
pytest.param("ä" * 200, False, 1, LIMIT, "_01.jpg", id="count"),
pytest.param("a" * 300, False, 1, 100, "_01.jpg", id="max"),
],
)
def test_long_title_keeps_tail_within_limit(
self,
title: str,
*,
archive: bool,
counter: int,
max_bytes: int,
tail: str,
) -> None:
"""
GIVEN:
- A document whose title alone is longer than the byte limit
WHEN:
- The public file name is generated
THEN:
- The name ends with the counter and extension
- The name fits in the limit
"""
name = DocumentFactory.build(
title=title,
mime_type="image/jpeg",
).get_public_filename(
archive=archive,
counter=counter,
max_bytes=max_bytes,
)
assert name.endswith(tail)
assert len(name.encode()) <= max_bytes
def test_long_title_counters_give_distinct_names(self) -> None:
"""
GIVEN:
- A document whose title alone is longer than the byte limit
WHEN:
- Public file names are generated with increasing counters
THEN:
- Each counter produces a distinct name
"""
doc = DocumentFactory.build(title="ä" * 200, mime_type="application/pdf")
names = [doc.get_public_filename(counter=counter) for counter in range(3)]
assert len(set(names)) == 3
assert all(len(n.encode()) <= self.LIMIT for n in names)
@@ -2,7 +2,6 @@ import hashlib
import json
import shutil
import tempfile
from datetime import date
from datetime import timedelta
from io import StringIO
from pathlib import Path
@@ -45,19 +44,14 @@ from documents.models import Workflow
from documents.models import WorkflowAction
from documents.models import WorkflowTrigger
from documents.sanity_checker import check_sanity
from documents.settings import EXPORTER_ARCHIVE_NAME
from documents.settings import EXPORTER_FILE_NAME
from documents.settings import EXPORTER_SHARE_LINK_BUNDLE_NAME
from documents.settings import EXPORTER_THUMBNAIL_NAME
from documents.tests.utils import SampleDirMixin
from paperless.models import ApplicationConfiguration
from paperless_mail.models import MailAccount
from paperless_testing.assertions import FileSystemAssertsMixin
from paperless_testing.dirs import DirectoriesMixin
from paperless_testing.dirs import PaperlessDirs
from paperless_testing.dirs import paperless_environment
from paperless_testing.factories import DocumentBarcodeFactory
from paperless_testing.factories import DocumentFactory
from paperless_testing.permissions import grant_object
@@ -1403,45 +1397,6 @@ class TestCryptExportImport(
social_token = SocialToken.objects.first()
self.assertIsNotNone(social_token)
def test_import_passphrase_with_float_field(self) -> None:
"""
GIVEN:
- An application configuration with a float field set
WHEN:
- Export and import are run with a passphrase
THEN:
- The import succeeds and the float value is preserved
"""
ApplicationConfiguration.objects.update_or_create(
pk=1,
defaults={"rotate_pages_threshold": 12.5},
)
call_command(
"document_exporter",
"--no-progress-bar",
"--passphrase",
"securepassword",
self.target,
skip_checks=True,
)
ApplicationConfiguration.objects.all().delete()
call_command(
"document_importer",
"--no-progress-bar",
"--passphrase",
"securepassword",
self.target,
skip_checks=True,
)
self.assertEqual(
ApplicationConfiguration.objects.get().rotate_pages_threshold,
12.5,
)
def test_import_crypt_no_passphrase(self) -> None:
"""
GIVEN:
@@ -1507,140 +1462,3 @@ class TestCryptExportImport(
("No passphrase was given, sensitive fields will be in plaintext"),
stdout.read(),
)
@pytest.mark.management
@pytest.mark.django_db
class TestExportDerivedFileNameCollisions:
def test_same_stem_different_extension_get_distinct_derived_files(
self,
paperless_dirs: PaperlessDirs,
tmp_path: Path,
) -> None:
"""
GIVEN:
- Two documents with the same title and created date
- One original is a PDF, the other a PNG, both with archive and thumbnail
WHEN:
- The exporter runs
THEN:
- Each document is exported under a distinct original, thumbnail and archive name
- Each exported file holds its own document's content
"""
for pk, (filename, mime_type) in enumerate(
[("collide.pdf", "application/pdf"), ("collide.png", "image/png")],
start=1,
):
(paperless_dirs.originals_dir / filename).write_bytes(
f"original {pk}".encode(),
)
(paperless_dirs.archive_dir / f"{pk:07}.pdf").write_bytes(
f"archive {pk}".encode(),
)
(paperless_dirs.thumbnail_dir / f"{pk:07}.webp").write_bytes(
f"thumbnail {pk}".encode(),
)
DocumentFactory(
pk=pk,
title="collide",
created=date(2026, 10, 7),
filename=filename,
archive_filename=f"{pk:07}.pdf",
mime_type=mime_type,
)
target = tmp_path / "export"
target.mkdir()
call_command(
"document_exporter",
str(target),
"--no-progress-bar",
skip_checks=True,
)
manifest = json.loads((target / "manifest.json").read_text())
records = {r["pk"]: r for r in manifest if r["model"] == "documents.document"}
for key in (
EXPORTER_FILE_NAME,
EXPORTER_THUMBNAIL_NAME,
EXPORTER_ARCHIVE_NAME,
):
assert records[1][key] != records[2][key]
for pk in (1, 2):
record = records[pk]
assert (target / record[EXPORTER_FILE_NAME]).read_text() == f"original {pk}"
assert (
target / record[EXPORTER_THUMBNAIL_NAME]
).read_text() == f"thumbnail {pk}"
assert (
target / record[EXPORTER_ARCHIVE_NAME]
).read_text() == f"archive {pk}"
def test_long_titles_export_within_file_name_limit(
self,
paperless_dirs: PaperlessDirs,
tmp_path: Path,
) -> None:
"""
GIVEN:
- Two documents with the same created date and the same title
- The title alone is longer than 255 bytes and contains umlauts
WHEN:
- The exporter runs
THEN:
- The export finishes with distinct original, thumbnail and archive names
- Every exported file name fits in the byte limit
- Each exported file holds its own document's content
"""
for pk in (1, 2):
(paperless_dirs.originals_dir / f"{pk:07}.pdf").write_bytes(
f"original {pk}".encode(),
)
(paperless_dirs.archive_dir / f"{pk:07}.pdf").write_bytes(
f"archive {pk}".encode(),
)
(paperless_dirs.thumbnail_dir / f"{pk:07}.webp").write_bytes(
f"thumbnail {pk}".encode(),
)
DocumentFactory(
pk=pk,
title="Bestellbestätigung " * 15,
created=date(2026, 10, 15),
filename=f"{pk:07}.pdf",
archive_filename=f"{pk:07}.pdf",
mime_type="application/pdf",
)
target = tmp_path / "export"
target.mkdir()
call_command(
"document_exporter",
str(target),
"--no-progress-bar",
skip_checks=True,
)
manifest = json.loads((target / "manifest.json").read_text())
records = {r["pk"]: r for r in manifest if r["model"] == "documents.document"}
for key in (
EXPORTER_FILE_NAME,
EXPORTER_THUMBNAIL_NAME,
EXPORTER_ARCHIVE_NAME,
):
assert records[1][key] != records[2][key]
for pk in (1, 2):
record = records[pk]
for key, content in (
(EXPORTER_FILE_NAME, f"original {pk}"),
(EXPORTER_THUMBNAIL_NAME, f"thumbnail {pk}"),
(EXPORTER_ARCHIVE_NAME, f"archive {pk}"),
):
assert (
len(Path(record[key]).name.encode())
<= Document.MAX_PUBLIC_FILENAME_BYTES
)
assert (target / record[key]).read_text() == content
@@ -7,7 +7,6 @@ from unittest import mock
from django.conf import settings
from django.contrib.auth.models import User
from django.test import override_settings
from django.utils import timezone
from rest_framework import serializers
from rest_framework import status
@@ -226,25 +225,6 @@ class ShareLinkBundleAPITests(DirectoriesMixin, APITestCase):
self.assertEqual(response.status_code, status.HTTP_302_FOUND)
self.assertIn("sharelink_notfound=1", response["Location"])
@override_settings(LOGIN_URL="/paperless/accounts/login/")
def test_unknown_share_link_redirects_under_subpath(self) -> None:
"""
GIVEN:
- Paperless is served under a subpath
WHEN:
- An unknown public share link is requested
THEN:
- The redirect to the login page keeps the subpath
"""
self.client.logout()
response = self.client.get("/share/unknownsharelink/")
self.assertEqual(response.status_code, status.HTTP_302_FOUND)
self.assertEqual(
response["Location"],
"/paperless/accounts/login/?sharelink_notfound=1",
)
def test_share_link_missing_file_redirects(self) -> None:
"""
GIVEN:
-44
View File
@@ -6176,50 +6176,6 @@ class TestApplyAISuggestionsWorkflowAction(
self.assertEqual(self.doc.tags.count(), 0)
def test_unowned_document_does_not_get_private_objects_by_id(self) -> None:
"""
GIVEN:
- An unowned document
- AI suggestions selecting another user's private tag and
correspondent by ID, plus an unowned tag
WHEN:
- The suggestions are applied
THEN:
- Only the unowned tag is assigned; an unowned document must not
be treated as unrestricted
"""
self.doc.owner = None
self.doc.save(update_fields=["owner"])
other = User.objects.create(username="someone-else")
private_tag = Tag.objects.create(name="Private Tag", owner=other)
public_tag = Tag.objects.create(name="Public Tag", owner=None)
private_correspondent = Correspondent.objects.create(
name="Private Correspondent",
owner=other,
)
action = self.make_action(
ai_suggestion_fields=[
WorkflowAction.AISuggestionField.TAGS,
WorkflowAction.AISuggestionField.CORRESPONDENT,
],
)
suggestions: ClassificationSuggestions = {
**SUGGESTIONS,
"tags": {
"existing_ids": [private_tag.pk, public_tag.pk],
"new_names": [],
},
"correspondents": {
"existing_ids": [private_correspondent.pk],
"new_names": [],
},
}
self.apply(action, suggestions)
self.assertEqual(list(self.doc.tags.all()), [public_tag])
self.assertIsNone(self.doc.correspondent)
def test_unparsable_dates_are_skipped(self) -> None:
"""
GIVEN:
+44 -47
View File
@@ -289,7 +289,6 @@ logger = logging.getLogger("paperless.api")
# clauses efficiently, so this threshold mainly protects SQLite users.
_TANTIVY_INTERSECT_THRESHOLD = 5_000
_TANTIVY_SEARCH_PARAM_NAMES = ("text", "title_search", "query", "more_like_id")
_TANTIVY_COMBINABLE_SEARCH_PARAMS = ({"text", "query"}, {"title_search", "query"})
# whoosh-compat's fieldname tagger (used only for SearchMode.QUERY, via the
# whoosh grammar in parse_user_query) is O(n^2) in plain word characters:
@@ -309,18 +308,6 @@ _TANTIVY_COMBINABLE_SEARCH_PARAMS = ({"text", "query"}, {"title_search", "query"
_MAX_QUERY_LENGTH: Final[int] = 4096
def _validate_tantivy_search_params(active: list[str]) -> None:
# may also have a filter query alongside a simple search e.g. relative dates
if len(active) > 1 and set(active) not in _TANTIVY_COMBINABLE_SEARCH_PARAMS:
raise ValidationError(
{
"detail": _(
"Specify only one of text, title_search, query, or more_like_id.",
),
},
)
def _get_tantivy_query_and_mode(params):
from documents.search import QueryTooLongError
from documents.search import SearchMode
@@ -334,15 +321,9 @@ def _get_tantivy_query_and_mode(params):
else:
return None # pragma: no cover
filter_query = (
str(params["query"])
if mode is not SearchMode.QUERY and "query" in params
else None
)
for value in (raw, filter_query):
if value is not None and len(value) > _MAX_QUERY_LENGTH:
raise QueryTooLongError(len(value), _MAX_QUERY_LENGTH)
return raw, mode, filter_query
if len(raw) > _MAX_QUERY_LENGTH:
raise QueryTooLongError(len(raw), _MAX_QUERY_LENGTH)
return raw, mode
def _get_more_like_id(query_params: dict[str, Any], user: User | None) -> int:
@@ -2585,9 +2566,15 @@ class UnifiedSearchViewSet(DocumentViewSet):
def parse_search_params() -> SearchParams:
"""Extract query string, search mode, and ordering from request."""
_validate_tantivy_search_params(
self._get_active_search_params(request),
)
active = self._get_active_search_params(request)
if len(active) > 1:
raise ValidationError(
{
"detail": _(
"Specify only one of text, title_search, query, or more_like_id.",
),
},
)
ordering_param = request.query_params.get("ordering", "")
sort_reverse = ordering_param.startswith("-")
@@ -2649,9 +2636,7 @@ class UnifiedSearchViewSet(DocumentViewSet):
filtered_qs: QuerySet[Document],
) -> SearchResultPage:
"""Handle text/title/query search: IDs, ORM intersection, page highlights."""
query_str, search_mode, filter_query = _get_tantivy_query_and_mode(
request.query_params,
)
query_str, search_mode = _get_tantivy_query_and_mode(request.query_params)
# "score" is not a real Tantivy sort field — it means relevance order,
# which is Tantivy's default when no sort field is specified.
@@ -2664,7 +2649,6 @@ class UnifiedSearchViewSet(DocumentViewSet):
),
sort_reverse=sort_reverse,
search_mode=search_mode,
filter_query=filter_query,
)
ordered_ids = intersect_and_order(
all_ids,
@@ -2899,7 +2883,14 @@ class DocumentSelectionMixin:
]
if not search_filters:
return None
_validate_tantivy_search_params(search_filters)
if len(search_filters) > 1:
raise ValidationError(
{
"detail": _(
"Specify only one of text, title_search, query, or more_like_id.",
),
},
)
from documents.search import SearchQueryError
from documents.search import get_backend
@@ -2918,14 +2909,11 @@ class DocumentSelectionMixin:
user=search_user,
)
else:
query_str, search_mode, filter_query = _get_tantivy_query_and_mode(
filters,
)
query_str, search_mode = _get_tantivy_query_and_mode(filters)
search_ids = backend.search_ids(
query_str,
user=search_user,
search_mode=search_mode,
filter_query=filter_query,
)
except SearchQueryError as e:
# Same user-fixable-query mapping as the search list endpoint:
@@ -3932,12 +3920,7 @@ class GlobalSearchView(PassUserMixin):
"request": request,
}
docs_serializer = DocumentSerializer(
docs,
many=True,
context=context,
fields=("id", "title", "created"),
)
docs_serializer = DocumentSerializer(docs, many=True, context=context)
saved_views_serializer = SavedViewSerializer(
saved_views,
many=True,
@@ -4916,7 +4899,7 @@ class SharedLinkView(View):
share_link.expiration is not None
and share_link.expiration < timezone.now()
):
return HttpResponseRedirect(f"{settings.LOGIN_URL}?sharelink_expired=1")
return HttpResponseRedirect("/accounts/login/?sharelink_expired=1")
try:
return serve_file(
doc=share_link.document,
@@ -4925,16 +4908,14 @@ class SharedLinkView(View):
disposition="inline",
)
except FileNotFoundError:
return HttpResponseRedirect(
f"{settings.LOGIN_URL}?sharelink_notfound=1",
)
return HttpResponseRedirect("/accounts/login/?sharelink_notfound=1")
bundle = ShareLinkBundle.objects.filter(slug=slug).first()
if bundle is None:
return HttpResponseRedirect(f"{settings.LOGIN_URL}?sharelink_notfound=1")
return HttpResponseRedirect("/accounts/login/?sharelink_notfound=1")
if bundle.expiration is not None and bundle.expiration < timezone.now():
return HttpResponseRedirect(f"{settings.LOGIN_URL}?sharelink_expired=1")
return HttpResponseRedirect("/accounts/login/?sharelink_expired=1")
if bundle.status in {
ShareLinkBundle.Status.PENDING,
@@ -5621,7 +5602,23 @@ class TrashView(ListModelMixin, PassUserMixin):
class _TrashPermittedObjectsFilter(PermittedObjectsFilter):
include_granted = False
parent_field = "root_document"
def filter_queryset(self, request, queryset, view):
if request.user.is_superuser or not request.user.is_active:
return super().filter_queryset(request, queryset, view)
# A version belongs to whoever owns its root
def owned_or_unowned(prefix: str) -> Q:
return Q(**{f"{prefix}owner": request.user}) | Q(
**{f"{prefix}owner__isnull": True},
)
return queryset.filter(
(Q(root_document__isnull=True) & owned_or_unowned(""))
| (
Q(root_document__isnull=False) & owned_or_unowned("root_document__")
),
)
filter_backends = (_TrashPermittedObjectsFilter,)
pagination_class = StandardPagination
+76 -61
View File
@@ -2,8 +2,8 @@ msgid ""
msgstr ""
"Project-Id-Version: paperless-ngx\n"
"Report-Msgid-Bugs-To: \n"
"POT-Creation-Date: 2026-10-14 15:18+0000\n"
"PO-Revision-Date: 2026-10-14 15:19\n"
"POT-Creation-Date: 2026-10-05 16:26+0000\n"
"PO-Revision-Date: 2026-10-05 16:27\n"
"Last-Translator: \n"
"Language-Team: Afrikaans\n"
"Language: af_ZA\n"
@@ -21,39 +21,39 @@ msgstr ""
msgid "Documents"
msgstr "Dokumente"
#: documents/filters.py:464
#: documents/filters.py:463
msgid "Value must be valid JSON."
msgstr "Waarde moet geldige JSON wees."
#: documents/filters.py:483
#: documents/filters.py:482
msgid "Invalid custom field query expression"
msgstr "Ongeldige gepasmaakte veldnavraaguitdrukking"
#: documents/filters.py:493
#: documents/filters.py:492
msgid "Invalid expression list. Must be nonempty."
msgstr "Ongeldige uitdrukking lys. Moet nie leeg wees nie."
#: documents/filters.py:514
#: documents/filters.py:513
msgid "Invalid logical operator {op!r}"
msgstr "Ongeldige logiese uitdrukking {op!r}"
#: documents/filters.py:528
#: documents/filters.py:527
msgid "Maximum number of query conditions exceeded."
msgstr ""
#: documents/filters.py:592
#: documents/filters.py:591
msgid "{name!r} is not a valid custom field."
msgstr ""
#: documents/filters.py:629
#: documents/filters.py:628
msgid "{data_type} does not support query expr {expr!r}."
msgstr ""
#: documents/filters.py:748 documents/models.py:137
#: documents/filters.py:747 documents/models.py:137
msgid "Maximum nesting depth exceeded."
msgstr ""
#: documents/filters.py:1125
#: documents/filters.py:1109
msgid "Custom field not found"
msgstr ""
@@ -1636,7 +1636,7 @@ msgid "workflow runs"
msgstr ""
#: documents/serialisers.py:515 documents/serialisers.py:872
#: documents/serialisers.py:2902 documents/views.py:363 documents/views.py:2768
#: documents/serialisers.py:2902 documents/views.py:343 documents/views.py:2732
#: paperless_mail/serialisers.py:156
msgid "Insufficient permissions."
msgstr ""
@@ -1676,7 +1676,7 @@ msgstr "Ongeldige veranderlike bespeur."
msgid "Duplicate document identifiers are not allowed."
msgstr ""
#: documents/serialisers.py:2988 documents/views.py:4811
#: documents/serialisers.py:2988 documents/views.py:4787
#, python-format
msgid "Documents not found: %(ids)s"
msgstr ""
@@ -1912,44 +1912,59 @@ msgstr ""
msgid "As a final step, please complete the following form:"
msgstr ""
#: documents/validators.py:24
#, python-brace-format
msgid "Unable to parse URI {value}, missing scheme"
msgstr ""
#: documents/validators.py:29
#, python-brace-format
msgid "Unable to parse URI {value}, missing net location or path"
msgstr ""
#: documents/validators.py:36
msgid ", "
msgid "URI scheme '{parts.scheme}' is not allowed. Allowed schemes: {', '.join(allowed_schemes)}"
msgstr ""
#: documents/views.py:318
msgid "Specify only one of text, title_search, query, or more_like_id."
#: documents/validators.py:45
#, python-brace-format
msgid "Unable to parse URI {value}"
msgstr ""
#: documents/views.py:356 documents/views.py:2765
#: documents/views.py:336 documents/views.py:2729
msgid "Invalid more_like_id"
msgstr ""
#: documents/views.py:1703
#: documents/views.py:1676
msgid "Invalid AI configuration."
msgstr ""
#: documents/views.py:1714
#: documents/views.py:1687
msgid "AI backend request timed out."
msgstr ""
#: documents/views.py:1726
#: documents/views.py:1699
msgid "AI backend rejected the request. Check logs for details."
msgstr ""
#: documents/views.py:4827
#: documents/views.py:2554 documents/views.py:2870
msgid "Specify only one of text, title_search, query, or more_like_id."
msgstr ""
#: documents/views.py:4800
#, python-format
msgid "Insufficient permissions to share document %(id)s."
msgstr ""
#: documents/views.py:4874
#: documents/views.py:4846
msgid "Bundle is already being processed."
msgstr ""
#: documents/views.py:4938
#: documents/views.py:4910
msgid "The share link bundle is still being prepared. Please try again later."
msgstr ""
#: documents/views.py:4952
#: documents/views.py:4924
msgid "The share link bundle is unavailable."
msgstr ""
@@ -2241,151 +2256,151 @@ msgstr ""
msgid "paperless application settings"
msgstr ""
#: paperless/settings/__init__.py:562
#: paperless/settings/__init__.py:561
msgid "English (US)"
msgstr "Engels (VS)"
#: paperless/settings/__init__.py:563
#: paperless/settings/__init__.py:562
msgid "Arabic"
msgstr "Arabies"
#: paperless/settings/__init__.py:564
#: paperless/settings/__init__.py:563
msgid "Afrikaans"
msgstr ""
#: paperless/settings/__init__.py:565
#: paperless/settings/__init__.py:564
msgid "Belarusian"
msgstr "Belorussies"
#: paperless/settings/__init__.py:566
#: paperless/settings/__init__.py:565
msgid "Bulgarian"
msgstr ""
#: paperless/settings/__init__.py:567
#: paperless/settings/__init__.py:566
msgid "Catalan"
msgstr "Katalaans"
#: paperless/settings/__init__.py:568
#: paperless/settings/__init__.py:567
msgid "Czech"
msgstr "Tsjeggies"
#: paperless/settings/__init__.py:569
#: paperless/settings/__init__.py:568
msgid "Danish"
msgstr "Deens"
#: paperless/settings/__init__.py:570
#: paperless/settings/__init__.py:569
msgid "German"
msgstr "Duits"
#: paperless/settings/__init__.py:571
#: paperless/settings/__init__.py:570
msgid "Greek"
msgstr ""
#: paperless/settings/__init__.py:572
#: paperless/settings/__init__.py:571
msgid "English (GB)"
msgstr "Engels (GB)"
#: paperless/settings/__init__.py:573
#: paperless/settings/__init__.py:572
msgid "Spanish"
msgstr "Spaans"
#: paperless/settings/__init__.py:574
#: paperless/settings/__init__.py:573
msgid "Persian"
msgstr ""
#: paperless/settings/__init__.py:575
#: paperless/settings/__init__.py:574
msgid "Finnish"
msgstr "Fins"
#: paperless/settings/__init__.py:576
#: paperless/settings/__init__.py:575
msgid "French"
msgstr "Frans"
#: paperless/settings/__init__.py:577
#: paperless/settings/__init__.py:576
msgid "Hungarian"
msgstr ""
#: paperless/settings/__init__.py:578
#: paperless/settings/__init__.py:577
msgid "Indonesian"
msgstr ""
#: paperless/settings/__init__.py:579
#: paperless/settings/__init__.py:578
msgid "Italian"
msgstr "Italiaans"
#: paperless/settings/__init__.py:580
#: paperless/settings/__init__.py:579
msgid "Japanese"
msgstr ""
#: paperless/settings/__init__.py:581
#: paperless/settings/__init__.py:580
msgid "Korean"
msgstr ""
#: paperless/settings/__init__.py:582
#: paperless/settings/__init__.py:581
msgid "Luxembourgish"
msgstr "Luxemburgs"
#: paperless/settings/__init__.py:583
#: paperless/settings/__init__.py:582
msgid "Norwegian"
msgstr ""
#: paperless/settings/__init__.py:584
#: paperless/settings/__init__.py:583
msgid "Dutch"
msgstr "Nederlands"
#: paperless/settings/__init__.py:585
#: paperless/settings/__init__.py:584
msgid "Polish"
msgstr "Pools"
#: paperless/settings/__init__.py:586
#: paperless/settings/__init__.py:585
msgid "Portuguese (Brazil)"
msgstr "Portugees (Brasilië)"
#: paperless/settings/__init__.py:587
#: paperless/settings/__init__.py:586
msgid "Portuguese"
msgstr "Portugees"
#: paperless/settings/__init__.py:588
#: paperless/settings/__init__.py:587
msgid "Romanian"
msgstr "Roemeens"
#: paperless/settings/__init__.py:589
#: paperless/settings/__init__.py:588
msgid "Russian"
msgstr "Russies"
#: paperless/settings/__init__.py:590
#: paperless/settings/__init__.py:589
msgid "Slovak"
msgstr ""
#: paperless/settings/__init__.py:591
#: paperless/settings/__init__.py:590
msgid "Slovenian"
msgstr "Sloweens"
#: paperless/settings/__init__.py:592
#: paperless/settings/__init__.py:591
msgid "Serbian"
msgstr "Serwies"
#: paperless/settings/__init__.py:593
#: paperless/settings/__init__.py:592
msgid "Swedish"
msgstr "Sweeds"
#: paperless/settings/__init__.py:594
#: paperless/settings/__init__.py:593
msgid "Turkish"
msgstr "Turks"
#: paperless/settings/__init__.py:595
#: paperless/settings/__init__.py:594
msgid "Ukrainian"
msgstr ""
#: paperless/settings/__init__.py:596
#: paperless/settings/__init__.py:595
msgid "Vietnamese"
msgstr ""
#: paperless/settings/__init__.py:597
#: paperless/settings/__init__.py:596
msgid "Chinese Simplified"
msgstr "Vereenvoudigde Sjinees"
#: paperless/settings/__init__.py:598
#: paperless/settings/__init__.py:597
msgid "Chinese Traditional"
msgstr ""
+76 -61
View File
@@ -2,8 +2,8 @@ msgid ""
msgstr ""
"Project-Id-Version: paperless-ngx\n"
"Report-Msgid-Bugs-To: \n"
"POT-Creation-Date: 2026-10-14 15:18+0000\n"
"PO-Revision-Date: 2026-10-14 15:19\n"
"POT-Creation-Date: 2026-10-05 16:26+0000\n"
"PO-Revision-Date: 2026-10-05 16:27\n"
"Last-Translator: \n"
"Language-Team: Amharic\n"
"Language: am_ET\n"
@@ -21,39 +21,39 @@ msgstr ""
msgid "Documents"
msgstr "መዝገባት"
#: documents/filters.py:464
#: documents/filters.py:463
msgid "Value must be valid JSON."
msgstr "የሚሰራው እሴት \"JSON\" መሆን አለበት"
#: documents/filters.py:483
#: documents/filters.py:482
msgid "Invalid custom field query expression"
msgstr "ልክ ያልሆነ የተወሰነ የቦታ መጠይቅ አገላለጽ"
#: documents/filters.py:493
#: documents/filters.py:492
msgid "Invalid expression list. Must be nonempty."
msgstr "ልክ ያልሆነ የመግለጫ ዝርዝር። ባዶ መሆን የለበትም።"
#: documents/filters.py:514
#: documents/filters.py:513
msgid "Invalid logical operator {op!r}"
msgstr "ልክ ያልሆነ የሎጂክ ኦፕሬተር {op!r}"
#: documents/filters.py:528
#: documents/filters.py:527
msgid "Maximum number of query conditions exceeded."
msgstr "ከፍተኛው የጥያቄ ሁኔታዎች/መጠን ብዛት አልፏል።"
#: documents/filters.py:592
#: documents/filters.py:591
msgid "{name!r} is not a valid custom field."
msgstr "{name!r} ይሄ ታዐማኒነት ያለው ልማድ አይደለም።"
#: documents/filters.py:629
#: documents/filters.py:628
msgid "{data_type} does not support query expr {expr!r}."
msgstr "ጥያቄን አይደግፍም expr {expr!r}."
#: documents/filters.py:748 documents/models.py:137
#: documents/filters.py:747 documents/models.py:137
msgid "Maximum nesting depth exceeded."
msgstr "ከፍተኛው የጥገኝነት ጥልቀት አልፏል።"
#: documents/filters.py:1125
#: documents/filters.py:1109
msgid "Custom field not found"
msgstr "ይህ ልማድ አልተገኘም"
@@ -1636,7 +1636,7 @@ msgid "workflow runs"
msgstr ""
#: documents/serialisers.py:515 documents/serialisers.py:872
#: documents/serialisers.py:2902 documents/views.py:363 documents/views.py:2768
#: documents/serialisers.py:2902 documents/views.py:343 documents/views.py:2732
#: paperless_mail/serialisers.py:156
msgid "Insufficient permissions."
msgstr ""
@@ -1676,7 +1676,7 @@ msgstr ""
msgid "Duplicate document identifiers are not allowed."
msgstr ""
#: documents/serialisers.py:2988 documents/views.py:4811
#: documents/serialisers.py:2988 documents/views.py:4787
#, python-format
msgid "Documents not found: %(ids)s"
msgstr ""
@@ -1912,44 +1912,59 @@ msgstr ""
msgid "As a final step, please complete the following form:"
msgstr ""
#: documents/validators.py:24
#, python-brace-format
msgid "Unable to parse URI {value}, missing scheme"
msgstr ""
#: documents/validators.py:29
#, python-brace-format
msgid "Unable to parse URI {value}, missing net location or path"
msgstr ""
#: documents/validators.py:36
msgid ", "
msgid "URI scheme '{parts.scheme}' is not allowed. Allowed schemes: {', '.join(allowed_schemes)}"
msgstr ""
#: documents/views.py:318
msgid "Specify only one of text, title_search, query, or more_like_id."
#: documents/validators.py:45
#, python-brace-format
msgid "Unable to parse URI {value}"
msgstr ""
#: documents/views.py:356 documents/views.py:2765
#: documents/views.py:336 documents/views.py:2729
msgid "Invalid more_like_id"
msgstr ""
#: documents/views.py:1703
#: documents/views.py:1676
msgid "Invalid AI configuration."
msgstr ""
#: documents/views.py:1714
#: documents/views.py:1687
msgid "AI backend request timed out."
msgstr ""
#: documents/views.py:1726
#: documents/views.py:1699
msgid "AI backend rejected the request. Check logs for details."
msgstr ""
#: documents/views.py:4827
#: documents/views.py:2554 documents/views.py:2870
msgid "Specify only one of text, title_search, query, or more_like_id."
msgstr ""
#: documents/views.py:4800
#, python-format
msgid "Insufficient permissions to share document %(id)s."
msgstr ""
#: documents/views.py:4874
#: documents/views.py:4846
msgid "Bundle is already being processed."
msgstr ""
#: documents/views.py:4938
#: documents/views.py:4910
msgid "The share link bundle is still being prepared. Please try again later."
msgstr ""
#: documents/views.py:4952
#: documents/views.py:4924
msgid "The share link bundle is unavailable."
msgstr ""
@@ -2241,151 +2256,151 @@ msgstr ""
msgid "paperless application settings"
msgstr ""
#: paperless/settings/__init__.py:562
#: paperless/settings/__init__.py:561
msgid "English (US)"
msgstr ""
#: paperless/settings/__init__.py:563
#: paperless/settings/__init__.py:562
msgid "Arabic"
msgstr ""
#: paperless/settings/__init__.py:564
#: paperless/settings/__init__.py:563
msgid "Afrikaans"
msgstr ""
#: paperless/settings/__init__.py:565
#: paperless/settings/__init__.py:564
msgid "Belarusian"
msgstr ""
#: paperless/settings/__init__.py:566
#: paperless/settings/__init__.py:565
msgid "Bulgarian"
msgstr ""
#: paperless/settings/__init__.py:567
#: paperless/settings/__init__.py:566
msgid "Catalan"
msgstr ""
#: paperless/settings/__init__.py:568
#: paperless/settings/__init__.py:567
msgid "Czech"
msgstr ""
#: paperless/settings/__init__.py:569
#: paperless/settings/__init__.py:568
msgid "Danish"
msgstr ""
#: paperless/settings/__init__.py:570
#: paperless/settings/__init__.py:569
msgid "German"
msgstr ""
#: paperless/settings/__init__.py:571
#: paperless/settings/__init__.py:570
msgid "Greek"
msgstr ""
#: paperless/settings/__init__.py:572
#: paperless/settings/__init__.py:571
msgid "English (GB)"
msgstr ""
#: paperless/settings/__init__.py:573
#: paperless/settings/__init__.py:572
msgid "Spanish"
msgstr ""
#: paperless/settings/__init__.py:574
#: paperless/settings/__init__.py:573
msgid "Persian"
msgstr ""
#: paperless/settings/__init__.py:575
#: paperless/settings/__init__.py:574
msgid "Finnish"
msgstr ""
#: paperless/settings/__init__.py:576
#: paperless/settings/__init__.py:575
msgid "French"
msgstr ""
#: paperless/settings/__init__.py:577
#: paperless/settings/__init__.py:576
msgid "Hungarian"
msgstr ""
#: paperless/settings/__init__.py:578
#: paperless/settings/__init__.py:577
msgid "Indonesian"
msgstr ""
#: paperless/settings/__init__.py:579
#: paperless/settings/__init__.py:578
msgid "Italian"
msgstr ""
#: paperless/settings/__init__.py:580
#: paperless/settings/__init__.py:579
msgid "Japanese"
msgstr ""
#: paperless/settings/__init__.py:581
#: paperless/settings/__init__.py:580
msgid "Korean"
msgstr ""
#: paperless/settings/__init__.py:582
#: paperless/settings/__init__.py:581
msgid "Luxembourgish"
msgstr ""
#: paperless/settings/__init__.py:583
#: paperless/settings/__init__.py:582
msgid "Norwegian"
msgstr ""
#: paperless/settings/__init__.py:584
#: paperless/settings/__init__.py:583
msgid "Dutch"
msgstr ""
#: paperless/settings/__init__.py:585
#: paperless/settings/__init__.py:584
msgid "Polish"
msgstr ""
#: paperless/settings/__init__.py:586
#: paperless/settings/__init__.py:585
msgid "Portuguese (Brazil)"
msgstr ""
#: paperless/settings/__init__.py:587
#: paperless/settings/__init__.py:586
msgid "Portuguese"
msgstr ""
#: paperless/settings/__init__.py:588
#: paperless/settings/__init__.py:587
msgid "Romanian"
msgstr ""
#: paperless/settings/__init__.py:589
#: paperless/settings/__init__.py:588
msgid "Russian"
msgstr ""
#: paperless/settings/__init__.py:590
#: paperless/settings/__init__.py:589
msgid "Slovak"
msgstr ""
#: paperless/settings/__init__.py:591
#: paperless/settings/__init__.py:590
msgid "Slovenian"
msgstr ""
#: paperless/settings/__init__.py:592
#: paperless/settings/__init__.py:591
msgid "Serbian"
msgstr ""
#: paperless/settings/__init__.py:593
#: paperless/settings/__init__.py:592
msgid "Swedish"
msgstr ""
#: paperless/settings/__init__.py:594
#: paperless/settings/__init__.py:593
msgid "Turkish"
msgstr ""
#: paperless/settings/__init__.py:595
#: paperless/settings/__init__.py:594
msgid "Ukrainian"
msgstr ""
#: paperless/settings/__init__.py:596
#: paperless/settings/__init__.py:595
msgid "Vietnamese"
msgstr ""
#: paperless/settings/__init__.py:597
#: paperless/settings/__init__.py:596
msgid "Chinese Simplified"
msgstr ""
#: paperless/settings/__init__.py:598
#: paperless/settings/__init__.py:597
msgid "Chinese Traditional"
msgstr ""
+76 -61
View File
@@ -2,8 +2,8 @@ msgid ""
msgstr ""
"Project-Id-Version: paperless-ngx\n"
"Report-Msgid-Bugs-To: \n"
"POT-Creation-Date: 2026-10-14 15:18+0000\n"
"PO-Revision-Date: 2026-10-14 15:19\n"
"POT-Creation-Date: 2026-10-05 16:26+0000\n"
"PO-Revision-Date: 2026-10-05 16:27\n"
"Last-Translator: \n"
"Language-Team: Arabic\n"
"Language: ar_SA\n"
@@ -21,39 +21,39 @@ msgstr ""
msgid "Documents"
msgstr "المستندات"
#: documents/filters.py:464
#: documents/filters.py:463
msgid "Value must be valid JSON."
msgstr "يجب أن تكون القيمة JSON."
#: documents/filters.py:483
#: documents/filters.py:482
msgid "Invalid custom field query expression"
msgstr "تعبير استعلام غير صالح للحقول المخصصة"
#: documents/filters.py:493
#: documents/filters.py:492
msgid "Invalid expression list. Must be nonempty."
msgstr "قائمة عبارة خاطئة."
#: documents/filters.py:514
#: documents/filters.py:513
msgid "Invalid logical operator {op!r}"
msgstr ""
#: documents/filters.py:528
#: documents/filters.py:527
msgid "Maximum number of query conditions exceeded."
msgstr "تجاوز الحد الأقصى لعدد شروط الاستعلام."
#: documents/filters.py:592
#: documents/filters.py:591
msgid "{name!r} is not a valid custom field."
msgstr "{name!r} حقل مخصص غير صالح."
#: documents/filters.py:629
#: documents/filters.py:628
msgid "{data_type} does not support query expr {expr!r}."
msgstr "{data_type} لا يدعم تعبير الاستعلام {expr!r}."
#: documents/filters.py:748 documents/models.py:137
#: documents/filters.py:747 documents/models.py:137
msgid "Maximum nesting depth exceeded."
msgstr ""
#: documents/filters.py:1125
#: documents/filters.py:1109
msgid "Custom field not found"
msgstr "لم يتم العثور على حقل مخصص"
@@ -1636,7 +1636,7 @@ msgid "workflow runs"
msgstr ""
#: documents/serialisers.py:515 documents/serialisers.py:872
#: documents/serialisers.py:2902 documents/views.py:363 documents/views.py:2768
#: documents/serialisers.py:2902 documents/views.py:343 documents/views.py:2732
#: paperless_mail/serialisers.py:156
msgid "Insufficient permissions."
msgstr ""
@@ -1676,7 +1676,7 @@ msgstr "اكتشاف متغير خاطئ."
msgid "Duplicate document identifiers are not allowed."
msgstr ""
#: documents/serialisers.py:2988 documents/views.py:4811
#: documents/serialisers.py:2988 documents/views.py:4787
#, python-format
msgid "Documents not found: %(ids)s"
msgstr ""
@@ -1913,44 +1913,59 @@ msgstr "أنت على وشك استعمال حسابك في %(provider_name)s ل
msgid "As a final step, please complete the following form:"
msgstr "كخطوة أخيرة، يرجى ملء النموذج التالي:"
#: documents/validators.py:24
#, python-brace-format
msgid "Unable to parse URI {value}, missing scheme"
msgstr ""
#: documents/validators.py:29
#, python-brace-format
msgid "Unable to parse URI {value}, missing net location or path"
msgstr ""
#: documents/validators.py:36
msgid ", "
msgid "URI scheme '{parts.scheme}' is not allowed. Allowed schemes: {', '.join(allowed_schemes)}"
msgstr ""
#: documents/views.py:318
msgid "Specify only one of text, title_search, query, or more_like_id."
#: documents/validators.py:45
#, python-brace-format
msgid "Unable to parse URI {value}"
msgstr ""
#: documents/views.py:356 documents/views.py:2765
#: documents/views.py:336 documents/views.py:2729
msgid "Invalid more_like_id"
msgstr ""
#: documents/views.py:1703
#: documents/views.py:1676
msgid "Invalid AI configuration."
msgstr ""
#: documents/views.py:1714
#: documents/views.py:1687
msgid "AI backend request timed out."
msgstr ""
#: documents/views.py:1726
#: documents/views.py:1699
msgid "AI backend rejected the request. Check logs for details."
msgstr ""
#: documents/views.py:4827
#: documents/views.py:2554 documents/views.py:2870
msgid "Specify only one of text, title_search, query, or more_like_id."
msgstr ""
#: documents/views.py:4800
#, python-format
msgid "Insufficient permissions to share document %(id)s."
msgstr ""
#: documents/views.py:4874
#: documents/views.py:4846
msgid "Bundle is already being processed."
msgstr ""
#: documents/views.py:4938
#: documents/views.py:4910
msgid "The share link bundle is still being prepared. Please try again later."
msgstr ""
#: documents/views.py:4952
#: documents/views.py:4924
msgid "The share link bundle is unavailable."
msgstr ""
@@ -2242,151 +2257,151 @@ msgstr ""
msgid "paperless application settings"
msgstr "إعدادات التطبيق paperless"
#: paperless/settings/__init__.py:562
#: paperless/settings/__init__.py:561
msgid "English (US)"
msgstr "الإنجليزية (الولايات المتحدة)"
#: paperless/settings/__init__.py:563
#: paperless/settings/__init__.py:562
msgid "Arabic"
msgstr "العربية"
#: paperless/settings/__init__.py:564
#: paperless/settings/__init__.py:563
msgid "Afrikaans"
msgstr "اللغة الأفريقانية"
#: paperless/settings/__init__.py:565
#: paperless/settings/__init__.py:564
msgid "Belarusian"
msgstr "البيلاروسية"
#: paperless/settings/__init__.py:566
#: paperless/settings/__init__.py:565
msgid "Bulgarian"
msgstr "البلغارية"
#: paperless/settings/__init__.py:567
#: paperless/settings/__init__.py:566
msgid "Catalan"
msgstr "اللغة الكتالونية"
#: paperless/settings/__init__.py:568
#: paperless/settings/__init__.py:567
msgid "Czech"
msgstr "التشيكية"
#: paperless/settings/__init__.py:569
#: paperless/settings/__init__.py:568
msgid "Danish"
msgstr "الدانماركية"
#: paperless/settings/__init__.py:570
#: paperless/settings/__init__.py:569
msgid "German"
msgstr "الألمانية"
#: paperless/settings/__init__.py:571
#: paperless/settings/__init__.py:570
msgid "Greek"
msgstr "اليونانية"
#: paperless/settings/__init__.py:572
#: paperless/settings/__init__.py:571
msgid "English (GB)"
msgstr "الإنجليزية (المملكة المتحدة)"
#: paperless/settings/__init__.py:573
#: paperless/settings/__init__.py:572
msgid "Spanish"
msgstr "الإسبانية"
#: paperless/settings/__init__.py:574
#: paperless/settings/__init__.py:573
msgid "Persian"
msgstr ""
#: paperless/settings/__init__.py:575
#: paperless/settings/__init__.py:574
msgid "Finnish"
msgstr "الفنلندية"
#: paperless/settings/__init__.py:576
#: paperless/settings/__init__.py:575
msgid "French"
msgstr "الفرنسية"
#: paperless/settings/__init__.py:577
#: paperless/settings/__init__.py:576
msgid "Hungarian"
msgstr "المجرية"
#: paperless/settings/__init__.py:578
#: paperless/settings/__init__.py:577
msgid "Indonesian"
msgstr ""
#: paperless/settings/__init__.py:579
#: paperless/settings/__init__.py:578
msgid "Italian"
msgstr "الإيطالية"
#: paperless/settings/__init__.py:580
#: paperless/settings/__init__.py:579
msgid "Japanese"
msgstr "اليابانية"
#: paperless/settings/__init__.py:581
#: paperless/settings/__init__.py:580
msgid "Korean"
msgstr ""
#: paperless/settings/__init__.py:582
#: paperless/settings/__init__.py:581
msgid "Luxembourgish"
msgstr "اللوكسمبرجية"
#: paperless/settings/__init__.py:583
#: paperless/settings/__init__.py:582
msgid "Norwegian"
msgstr "النرويجية"
#: paperless/settings/__init__.py:584
#: paperless/settings/__init__.py:583
msgid "Dutch"
msgstr "الهولندية"
#: paperless/settings/__init__.py:585
#: paperless/settings/__init__.py:584
msgid "Polish"
msgstr "البولندية"
#: paperless/settings/__init__.py:586
#: paperless/settings/__init__.py:585
msgid "Portuguese (Brazil)"
msgstr "البرتغالية (البرازيل)"
#: paperless/settings/__init__.py:587
#: paperless/settings/__init__.py:586
msgid "Portuguese"
msgstr "البرتغالية"
#: paperless/settings/__init__.py:588
#: paperless/settings/__init__.py:587
msgid "Romanian"
msgstr "الرومانية"
#: paperless/settings/__init__.py:589
#: paperless/settings/__init__.py:588
msgid "Russian"
msgstr "الروسية"
#: paperless/settings/__init__.py:590
#: paperless/settings/__init__.py:589
msgid "Slovak"
msgstr "السلوفاكية"
#: paperless/settings/__init__.py:591
#: paperless/settings/__init__.py:590
msgid "Slovenian"
msgstr "السلوفانية"
#: paperless/settings/__init__.py:592
#: paperless/settings/__init__.py:591
msgid "Serbian"
msgstr "الصربية"
#: paperless/settings/__init__.py:593
#: paperless/settings/__init__.py:592
msgid "Swedish"
msgstr "السويدية"
#: paperless/settings/__init__.py:594
#: paperless/settings/__init__.py:593
msgid "Turkish"
msgstr "التركية"
#: paperless/settings/__init__.py:595
#: paperless/settings/__init__.py:594
msgid "Ukrainian"
msgstr "الأوكرانية"
#: paperless/settings/__init__.py:596
#: paperless/settings/__init__.py:595
msgid "Vietnamese"
msgstr ""
#: paperless/settings/__init__.py:597
#: paperless/settings/__init__.py:596
msgid "Chinese Simplified"
msgstr "الصينية المبسطة"
#: paperless/settings/__init__.py:598
#: paperless/settings/__init__.py:597
msgid "Chinese Traditional"
msgstr ""
+76 -61
View File
@@ -2,8 +2,8 @@ msgid ""
msgstr ""
"Project-Id-Version: paperless-ngx\n"
"Report-Msgid-Bugs-To: \n"
"POT-Creation-Date: 2026-10-14 15:18+0000\n"
"PO-Revision-Date: 2026-10-14 15:19\n"
"POT-Creation-Date: 2026-10-05 16:26+0000\n"
"PO-Revision-Date: 2026-10-05 16:27\n"
"Last-Translator: \n"
"Language-Team: Belarusian\n"
"Language: be_BY\n"
@@ -21,39 +21,39 @@ msgstr ""
msgid "Documents"
msgstr "Дакументы"
#: documents/filters.py:464
#: documents/filters.py:463
msgid "Value must be valid JSON."
msgstr ""
#: documents/filters.py:483
#: documents/filters.py:482
msgid "Invalid custom field query expression"
msgstr ""
#: documents/filters.py:493
#: documents/filters.py:492
msgid "Invalid expression list. Must be nonempty."
msgstr ""
#: documents/filters.py:514
#: documents/filters.py:513
msgid "Invalid logical operator {op!r}"
msgstr ""
#: documents/filters.py:528
#: documents/filters.py:527
msgid "Maximum number of query conditions exceeded."
msgstr ""
#: documents/filters.py:592
#: documents/filters.py:591
msgid "{name!r} is not a valid custom field."
msgstr ""
#: documents/filters.py:629
#: documents/filters.py:628
msgid "{data_type} does not support query expr {expr!r}."
msgstr ""
#: documents/filters.py:748 documents/models.py:137
#: documents/filters.py:747 documents/models.py:137
msgid "Maximum nesting depth exceeded."
msgstr ""
#: documents/filters.py:1125
#: documents/filters.py:1109
msgid "Custom field not found"
msgstr ""
@@ -1636,7 +1636,7 @@ msgid "workflow runs"
msgstr ""
#: documents/serialisers.py:515 documents/serialisers.py:872
#: documents/serialisers.py:2902 documents/views.py:363 documents/views.py:2768
#: documents/serialisers.py:2902 documents/views.py:343 documents/views.py:2732
#: paperless_mail/serialisers.py:156
msgid "Insufficient permissions."
msgstr ""
@@ -1676,7 +1676,7 @@ msgstr "Выяўлена няправільная зменная."
msgid "Duplicate document identifiers are not allowed."
msgstr ""
#: documents/serialisers.py:2988 documents/views.py:4811
#: documents/serialisers.py:2988 documents/views.py:4787
#, python-format
msgid "Documents not found: %(ids)s"
msgstr ""
@@ -1912,44 +1912,59 @@ msgstr ""
msgid "As a final step, please complete the following form:"
msgstr ""
#: documents/validators.py:24
#, python-brace-format
msgid "Unable to parse URI {value}, missing scheme"
msgstr ""
#: documents/validators.py:29
#, python-brace-format
msgid "Unable to parse URI {value}, missing net location or path"
msgstr ""
#: documents/validators.py:36
msgid ", "
msgid "URI scheme '{parts.scheme}' is not allowed. Allowed schemes: {', '.join(allowed_schemes)}"
msgstr ""
#: documents/views.py:318
msgid "Specify only one of text, title_search, query, or more_like_id."
#: documents/validators.py:45
#, python-brace-format
msgid "Unable to parse URI {value}"
msgstr ""
#: documents/views.py:356 documents/views.py:2765
#: documents/views.py:336 documents/views.py:2729
msgid "Invalid more_like_id"
msgstr ""
#: documents/views.py:1703
#: documents/views.py:1676
msgid "Invalid AI configuration."
msgstr ""
#: documents/views.py:1714
#: documents/views.py:1687
msgid "AI backend request timed out."
msgstr ""
#: documents/views.py:1726
#: documents/views.py:1699
msgid "AI backend rejected the request. Check logs for details."
msgstr ""
#: documents/views.py:4827
#: documents/views.py:2554 documents/views.py:2870
msgid "Specify only one of text, title_search, query, or more_like_id."
msgstr ""
#: documents/views.py:4800
#, python-format
msgid "Insufficient permissions to share document %(id)s."
msgstr ""
#: documents/views.py:4874
#: documents/views.py:4846
msgid "Bundle is already being processed."
msgstr ""
#: documents/views.py:4938
#: documents/views.py:4910
msgid "The share link bundle is still being prepared. Please try again later."
msgstr ""
#: documents/views.py:4952
#: documents/views.py:4924
msgid "The share link bundle is unavailable."
msgstr ""
@@ -2241,151 +2256,151 @@ msgstr ""
msgid "paperless application settings"
msgstr ""
#: paperless/settings/__init__.py:562
#: paperless/settings/__init__.py:561
msgid "English (US)"
msgstr "Англійская (ЗША)"
#: paperless/settings/__init__.py:563
#: paperless/settings/__init__.py:562
msgid "Arabic"
msgstr ""
#: paperless/settings/__init__.py:564
#: paperless/settings/__init__.py:563
msgid "Afrikaans"
msgstr ""
#: paperless/settings/__init__.py:565
#: paperless/settings/__init__.py:564
msgid "Belarusian"
msgstr "Беларуская"
#: paperless/settings/__init__.py:566
#: paperless/settings/__init__.py:565
msgid "Bulgarian"
msgstr ""
#: paperless/settings/__init__.py:567
#: paperless/settings/__init__.py:566
msgid "Catalan"
msgstr ""
#: paperless/settings/__init__.py:568
#: paperless/settings/__init__.py:567
msgid "Czech"
msgstr "Чэшская"
#: paperless/settings/__init__.py:569
#: paperless/settings/__init__.py:568
msgid "Danish"
msgstr "Дацкая"
#: paperless/settings/__init__.py:570
#: paperless/settings/__init__.py:569
msgid "German"
msgstr "Нямецкая"
#: paperless/settings/__init__.py:571
#: paperless/settings/__init__.py:570
msgid "Greek"
msgstr ""
#: paperless/settings/__init__.py:572
#: paperless/settings/__init__.py:571
msgid "English (GB)"
msgstr "Англійская (Вялікабрытанія)"
#: paperless/settings/__init__.py:573
#: paperless/settings/__init__.py:572
msgid "Spanish"
msgstr "Іспанская"
#: paperless/settings/__init__.py:574
#: paperless/settings/__init__.py:573
msgid "Persian"
msgstr ""
#: paperless/settings/__init__.py:575
#: paperless/settings/__init__.py:574
msgid "Finnish"
msgstr ""
#: paperless/settings/__init__.py:576
#: paperless/settings/__init__.py:575
msgid "French"
msgstr "Французская"
#: paperless/settings/__init__.py:577
#: paperless/settings/__init__.py:576
msgid "Hungarian"
msgstr ""
#: paperless/settings/__init__.py:578
#: paperless/settings/__init__.py:577
msgid "Indonesian"
msgstr ""
#: paperless/settings/__init__.py:579
#: paperless/settings/__init__.py:578
msgid "Italian"
msgstr "Італьянская"
#: paperless/settings/__init__.py:580
#: paperless/settings/__init__.py:579
msgid "Japanese"
msgstr ""
#: paperless/settings/__init__.py:581
#: paperless/settings/__init__.py:580
msgid "Korean"
msgstr ""
#: paperless/settings/__init__.py:582
#: paperless/settings/__init__.py:581
msgid "Luxembourgish"
msgstr "Люксембургская"
#: paperless/settings/__init__.py:583
#: paperless/settings/__init__.py:582
msgid "Norwegian"
msgstr ""
#: paperless/settings/__init__.py:584
#: paperless/settings/__init__.py:583
msgid "Dutch"
msgstr "Нідэрландская"
#: paperless/settings/__init__.py:585
#: paperless/settings/__init__.py:584
msgid "Polish"
msgstr "Польская"
#: paperless/settings/__init__.py:586
#: paperless/settings/__init__.py:585
msgid "Portuguese (Brazil)"
msgstr "Партугальская (Бразілія)"
#: paperless/settings/__init__.py:587
#: paperless/settings/__init__.py:586
msgid "Portuguese"
msgstr "Партугальская"
#: paperless/settings/__init__.py:588
#: paperless/settings/__init__.py:587
msgid "Romanian"
msgstr "Румынская"
#: paperless/settings/__init__.py:589
#: paperless/settings/__init__.py:588
msgid "Russian"
msgstr "Руская"
#: paperless/settings/__init__.py:590
#: paperless/settings/__init__.py:589
msgid "Slovak"
msgstr ""
#: paperless/settings/__init__.py:591
#: paperless/settings/__init__.py:590
msgid "Slovenian"
msgstr "Славенская"
#: paperless/settings/__init__.py:592
#: paperless/settings/__init__.py:591
msgid "Serbian"
msgstr "Сербская"
#: paperless/settings/__init__.py:593
#: paperless/settings/__init__.py:592
msgid "Swedish"
msgstr "Шведская"
#: paperless/settings/__init__.py:594
#: paperless/settings/__init__.py:593
msgid "Turkish"
msgstr "Турэцкая"
#: paperless/settings/__init__.py:595
#: paperless/settings/__init__.py:594
msgid "Ukrainian"
msgstr ""
#: paperless/settings/__init__.py:596
#: paperless/settings/__init__.py:595
msgid "Vietnamese"
msgstr ""
#: paperless/settings/__init__.py:597
#: paperless/settings/__init__.py:596
msgid "Chinese Simplified"
msgstr "Кітайская спрошчаная"
#: paperless/settings/__init__.py:598
#: paperless/settings/__init__.py:597
msgid "Chinese Traditional"
msgstr ""
+76 -61
View File
@@ -2,8 +2,8 @@ msgid ""
msgstr ""
"Project-Id-Version: paperless-ngx\n"
"Report-Msgid-Bugs-To: \n"
"POT-Creation-Date: 2026-10-14 15:18+0000\n"
"PO-Revision-Date: 2026-10-14 15:19\n"
"POT-Creation-Date: 2026-10-05 16:26+0000\n"
"PO-Revision-Date: 2026-10-05 16:27\n"
"Last-Translator: \n"
"Language-Team: Bulgarian\n"
"Language: bg_BG\n"
@@ -21,39 +21,39 @@ msgstr ""
msgid "Documents"
msgstr "Документи"
#: documents/filters.py:464
#: documents/filters.py:463
msgid "Value must be valid JSON."
msgstr "Стойността трябва да е валидна JSON."
#: documents/filters.py:483
#: documents/filters.py:482
msgid "Invalid custom field query expression"
msgstr "Невалидна заявка на персонализираното полето"
#: documents/filters.py:493
#: documents/filters.py:492
msgid "Invalid expression list. Must be nonempty."
msgstr "Списък с невалиден израз. Не може да е празно."
#: documents/filters.py:514
#: documents/filters.py:513
msgid "Invalid logical operator {op!r}"
msgstr "Невалиден логически оператор {op!r}"
#: documents/filters.py:528
#: documents/filters.py:527
msgid "Maximum number of query conditions exceeded."
msgstr "Надвишен е максимален брой за заявки."
#: documents/filters.py:592
#: documents/filters.py:591
msgid "{name!r} is not a valid custom field."
msgstr "{name!r} не е валидно персонализирано поле."
#: documents/filters.py:629
#: documents/filters.py:628
msgid "{data_type} does not support query expr {expr!r}."
msgstr "{data_type} не поддържа заявка expr {expr!r}."
#: documents/filters.py:748 documents/models.py:137
#: documents/filters.py:747 documents/models.py:137
msgid "Maximum nesting depth exceeded."
msgstr "Надвишена е максималната дълбочина на вмъкване."
#: documents/filters.py:1125
#: documents/filters.py:1109
msgid "Custom field not found"
msgstr "Персонализирано поле не е намерено"
@@ -1636,7 +1636,7 @@ msgid "workflow runs"
msgstr "стартиране на работните процеси"
#: documents/serialisers.py:515 documents/serialisers.py:872
#: documents/serialisers.py:2902 documents/views.py:363 documents/views.py:2768
#: documents/serialisers.py:2902 documents/views.py:343 documents/views.py:2732
#: paperless_mail/serialisers.py:156
msgid "Insufficient permissions."
msgstr ""
@@ -1676,7 +1676,7 @@ msgstr "Засечена е невалидна променлива."
msgid "Duplicate document identifiers are not allowed."
msgstr ""
#: documents/serialisers.py:2988 documents/views.py:4811
#: documents/serialisers.py:2988 documents/views.py:4787
#, python-format
msgid "Documents not found: %(ids)s"
msgstr ""
@@ -1913,44 +1913,59 @@ msgstr "На път сте да използвате профила си в %(pr
msgid "As a final step, please complete the following form:"
msgstr "Като последна стъпка, моля, попълнете следната форма:"
#: documents/validators.py:24
#, python-brace-format
msgid "Unable to parse URI {value}, missing scheme"
msgstr ""
#: documents/validators.py:29
#, python-brace-format
msgid "Unable to parse URI {value}, missing net location or path"
msgstr ""
#: documents/validators.py:36
msgid ", "
msgid "URI scheme '{parts.scheme}' is not allowed. Allowed schemes: {', '.join(allowed_schemes)}"
msgstr ""
#: documents/views.py:318
msgid "Specify only one of text, title_search, query, or more_like_id."
#: documents/validators.py:45
#, python-brace-format
msgid "Unable to parse URI {value}"
msgstr ""
#: documents/views.py:356 documents/views.py:2765
#: documents/views.py:336 documents/views.py:2729
msgid "Invalid more_like_id"
msgstr ""
#: documents/views.py:1703
#: documents/views.py:1676
msgid "Invalid AI configuration."
msgstr ""
#: documents/views.py:1714
#: documents/views.py:1687
msgid "AI backend request timed out."
msgstr ""
#: documents/views.py:1726
#: documents/views.py:1699
msgid "AI backend rejected the request. Check logs for details."
msgstr ""
#: documents/views.py:4827
#: documents/views.py:2554 documents/views.py:2870
msgid "Specify only one of text, title_search, query, or more_like_id."
msgstr ""
#: documents/views.py:4800
#, python-format
msgid "Insufficient permissions to share document %(id)s."
msgstr ""
#: documents/views.py:4874
#: documents/views.py:4846
msgid "Bundle is already being processed."
msgstr ""
#: documents/views.py:4938
#: documents/views.py:4910
msgid "The share link bundle is still being prepared. Please try again later."
msgstr ""
#: documents/views.py:4952
#: documents/views.py:4924
msgid "The share link bundle is unavailable."
msgstr ""
@@ -2242,151 +2257,151 @@ msgstr ""
msgid "paperless application settings"
msgstr "настройки на софтуера"
#: paperless/settings/__init__.py:562
#: paperless/settings/__init__.py:561
msgid "English (US)"
msgstr "Английски (САЩ)"
#: paperless/settings/__init__.py:563
#: paperless/settings/__init__.py:562
msgid "Arabic"
msgstr "Арабски"
#: paperless/settings/__init__.py:564
#: paperless/settings/__init__.py:563
msgid "Afrikaans"
msgstr "Африканс"
#: paperless/settings/__init__.py:565
#: paperless/settings/__init__.py:564
msgid "Belarusian"
msgstr "Беларуски"
#: paperless/settings/__init__.py:566
#: paperless/settings/__init__.py:565
msgid "Bulgarian"
msgstr "Български"
#: paperless/settings/__init__.py:567
#: paperless/settings/__init__.py:566
msgid "Catalan"
msgstr "Каталунски"
#: paperless/settings/__init__.py:568
#: paperless/settings/__init__.py:567
msgid "Czech"
msgstr "Чешки"
#: paperless/settings/__init__.py:569
#: paperless/settings/__init__.py:568
msgid "Danish"
msgstr "Датски"
#: paperless/settings/__init__.py:570
#: paperless/settings/__init__.py:569
msgid "German"
msgstr "Немски"
#: paperless/settings/__init__.py:571
#: paperless/settings/__init__.py:570
msgid "Greek"
msgstr "Гръцки"
#: paperless/settings/__init__.py:572
#: paperless/settings/__init__.py:571
msgid "English (GB)"
msgstr "Английски (Великобритания)"
#: paperless/settings/__init__.py:573
#: paperless/settings/__init__.py:572
msgid "Spanish"
msgstr "Испански"
#: paperless/settings/__init__.py:574
#: paperless/settings/__init__.py:573
msgid "Persian"
msgstr ""
#: paperless/settings/__init__.py:575
#: paperless/settings/__init__.py:574
msgid "Finnish"
msgstr "Финландски"
#: paperless/settings/__init__.py:576
#: paperless/settings/__init__.py:575
msgid "French"
msgstr "Френски"
#: paperless/settings/__init__.py:577
#: paperless/settings/__init__.py:576
msgid "Hungarian"
msgstr "Унгарски"
#: paperless/settings/__init__.py:578
#: paperless/settings/__init__.py:577
msgid "Indonesian"
msgstr ""
#: paperless/settings/__init__.py:579
#: paperless/settings/__init__.py:578
msgid "Italian"
msgstr "Италиански"
#: paperless/settings/__init__.py:580
#: paperless/settings/__init__.py:579
msgid "Japanese"
msgstr "Японски"
#: paperless/settings/__init__.py:581
#: paperless/settings/__init__.py:580
msgid "Korean"
msgstr "Корейски"
#: paperless/settings/__init__.py:582
#: paperless/settings/__init__.py:581
msgid "Luxembourgish"
msgstr "Люксембургски"
#: paperless/settings/__init__.py:583
#: paperless/settings/__init__.py:582
msgid "Norwegian"
msgstr "Норвежки"
#: paperless/settings/__init__.py:584
#: paperless/settings/__init__.py:583
msgid "Dutch"
msgstr "Холандски"
#: paperless/settings/__init__.py:585
#: paperless/settings/__init__.py:584
msgid "Polish"
msgstr "Полски"
#: paperless/settings/__init__.py:586
#: paperless/settings/__init__.py:585
msgid "Portuguese (Brazil)"
msgstr "Португалски (Бразилия)"
#: paperless/settings/__init__.py:587
#: paperless/settings/__init__.py:586
msgid "Portuguese"
msgstr "Португалски"
#: paperless/settings/__init__.py:588
#: paperless/settings/__init__.py:587
msgid "Romanian"
msgstr "Румънски"
#: paperless/settings/__init__.py:589
#: paperless/settings/__init__.py:588
msgid "Russian"
msgstr "Руски"
#: paperless/settings/__init__.py:590
#: paperless/settings/__init__.py:589
msgid "Slovak"
msgstr "Словашки"
#: paperless/settings/__init__.py:591
#: paperless/settings/__init__.py:590
msgid "Slovenian"
msgstr "Словенски"
#: paperless/settings/__init__.py:592
#: paperless/settings/__init__.py:591
msgid "Serbian"
msgstr "Сръбски"
#: paperless/settings/__init__.py:593
#: paperless/settings/__init__.py:592
msgid "Swedish"
msgstr "Шведски"
#: paperless/settings/__init__.py:594
#: paperless/settings/__init__.py:593
msgid "Turkish"
msgstr "Турски"
#: paperless/settings/__init__.py:595
#: paperless/settings/__init__.py:594
msgid "Ukrainian"
msgstr "Украински"
#: paperless/settings/__init__.py:596
#: paperless/settings/__init__.py:595
msgid "Vietnamese"
msgstr ""
#: paperless/settings/__init__.py:597
#: paperless/settings/__init__.py:596
msgid "Chinese Simplified"
msgstr "Китайски опростен"
#: paperless/settings/__init__.py:598
#: paperless/settings/__init__.py:597
msgid "Chinese Traditional"
msgstr "Китайски традиционен"
+78 -63
View File
@@ -2,8 +2,8 @@ msgid ""
msgstr ""
"Project-Id-Version: paperless-ngx\n"
"Report-Msgid-Bugs-To: \n"
"POT-Creation-Date: 2026-10-14 15:18+0000\n"
"PO-Revision-Date: 2026-10-14 15:19\n"
"POT-Creation-Date: 2026-10-05 16:26+0000\n"
"PO-Revision-Date: 2026-10-05 16:27\n"
"Last-Translator: \n"
"Language-Team: Catalan\n"
"Language: ca_ES\n"
@@ -21,39 +21,39 @@ msgstr ""
msgid "Documents"
msgstr "Documents "
#: documents/filters.py:464
#: documents/filters.py:463
msgid "Value must be valid JSON."
msgstr "Valor ha de ser un JSON valid."
#: documents/filters.py:483
#: documents/filters.py:482
msgid "Invalid custom field query expression"
msgstr "Expressió de camp de consulta invàlid"
#: documents/filters.py:493
#: documents/filters.py:492
msgid "Invalid expression list. Must be nonempty."
msgstr "Expressió de llista invàlida. No ha d'estar buida."
#: documents/filters.py:514
#: documents/filters.py:513
msgid "Invalid logical operator {op!r}"
msgstr "Invàlid operand lògic {op!r}"
#: documents/filters.py:528
#: documents/filters.py:527
msgid "Maximum number of query conditions exceeded."
msgstr "Condicions de consulta excedits."
#: documents/filters.py:592
#: documents/filters.py:591
msgid "{name!r} is not a valid custom field."
msgstr "{name!r} no és un camp personalitzat vàlid."
#: documents/filters.py:629
#: documents/filters.py:628
msgid "{data_type} does not support query expr {expr!r}."
msgstr "{data_type} no suporta expressió de consulta {expr!r}."
#: documents/filters.py:748 documents/models.py:137
#: documents/filters.py:747 documents/models.py:137
msgid "Maximum nesting depth exceeded."
msgstr "Màxima profunditat anidada excedida."
#: documents/filters.py:1125
#: documents/filters.py:1109
msgid "Custom field not found"
msgstr "Camp personalitzat no trobat"
@@ -1636,7 +1636,7 @@ msgid "workflow runs"
msgstr "flux corrents"
#: documents/serialisers.py:515 documents/serialisers.py:872
#: documents/serialisers.py:2902 documents/views.py:363 documents/views.py:2768
#: documents/serialisers.py:2902 documents/views.py:343 documents/views.py:2732
#: paperless_mail/serialisers.py:156
msgid "Insufficient permissions."
msgstr "Permisos insuficients."
@@ -1676,7 +1676,7 @@ msgstr "Variable detectada invàlida."
msgid "Duplicate document identifiers are not allowed."
msgstr "Duplicat d'identificadors de documents no permès."
#: documents/serialisers.py:2988 documents/views.py:4811
#: documents/serialisers.py:2988 documents/views.py:4787
#, python-format
msgid "Documents not found: %(ids)s"
msgstr "Documents no trobats: %(ids)s"
@@ -1913,44 +1913,59 @@ msgstr "Estàs a punt d'emprar el teu %(provider_name)s compte per a fer login."
msgid "As a final step, please complete the following form:"
msgstr "Com a pas final, completa el següent formulari:"
#: documents/validators.py:24
#, python-brace-format
msgid "Unable to parse URI {value}, missing scheme"
msgstr "No es pot analitzar l'URI {value}, falta l'esquema"
#: documents/validators.py:29
#, python-brace-format
msgid "Unable to parse URI {value}, missing net location or path"
msgstr "No es pot analitzar l'URI {value}, falta la ubicació de xarxa o la ruta"
#: documents/validators.py:36
msgid ", "
msgstr ""
msgid "URI scheme '{parts.scheme}' is not allowed. Allowed schemes: {', '.join(allowed_schemes)}"
msgstr "L'esquema d'URI '{parts.scheme}' no està permès. Esquemes permesos: {', '.join(allowed_schemes)}"
#: documents/views.py:318
msgid "Specify only one of text, title_search, query, or more_like_id."
msgstr "Especifica només un dels següents valors: text, title_search, query o more_like_id."
#: documents/validators.py:45
#, python-brace-format
msgid "Unable to parse URI {value}"
msgstr "No s'ha pogut analitzar l'URI {value}"
#: documents/views.py:356 documents/views.py:2765
#: documents/views.py:336 documents/views.py:2729
msgid "Invalid more_like_id"
msgstr "Invalid more_like_id"
#: documents/views.py:1703
#: documents/views.py:1676
msgid "Invalid AI configuration."
msgstr "Configuració AI invàlida."
#: documents/views.py:1714
#: documents/views.py:1687
msgid "AI backend request timed out."
msgstr ""
#: documents/views.py:1726
#: documents/views.py:1699
msgid "AI backend rejected the request. Check logs for details."
msgstr ""
#: documents/views.py:4827
#: documents/views.py:2554 documents/views.py:2870
msgid "Specify only one of text, title_search, query, or more_like_id."
msgstr "Especifica només un dels següents valors: text, title_search, query o more_like_id."
#: documents/views.py:4800
#, python-format
msgid "Insufficient permissions to share document %(id)s."
msgstr "Permisos insuficients per compartir document %(id)s."
#: documents/views.py:4874
#: documents/views.py:4846
msgid "Bundle is already being processed."
msgstr "Paquet ja s'està processant."
#: documents/views.py:4938
#: documents/views.py:4910
msgid "The share link bundle is still being prepared. Please try again later."
msgstr "El paquet de link encarà s'està preparant. Prova de nou més tard."
#: documents/views.py:4952
#: documents/views.py:4924
msgid "The share link bundle is unavailable."
msgstr "El paquet d'enllaç no està disponible."
@@ -2242,151 +2257,151 @@ msgstr "Estableix temps d'espera en segons"
msgid "paperless application settings"
msgstr "configuració de l'aplicació paperless"
#: paperless/settings/__init__.py:562
#: paperless/settings/__init__.py:561
msgid "English (US)"
msgstr "Anglès (US)"
#: paperless/settings/__init__.py:563
#: paperless/settings/__init__.py:562
msgid "Arabic"
msgstr "Àrab"
#: paperless/settings/__init__.py:564
#: paperless/settings/__init__.py:563
msgid "Afrikaans"
msgstr "Africà"
#: paperless/settings/__init__.py:565
#: paperless/settings/__init__.py:564
msgid "Belarusian"
msgstr "Bielorús"
#: paperless/settings/__init__.py:566
#: paperless/settings/__init__.py:565
msgid "Bulgarian"
msgstr "Búlgar"
#: paperless/settings/__init__.py:567
#: paperless/settings/__init__.py:566
msgid "Catalan"
msgstr "Català"
#: paperless/settings/__init__.py:568
#: paperless/settings/__init__.py:567
msgid "Czech"
msgstr "Txec"
#: paperless/settings/__init__.py:569
#: paperless/settings/__init__.py:568
msgid "Danish"
msgstr "Danès"
#: paperless/settings/__init__.py:570
#: paperless/settings/__init__.py:569
msgid "German"
msgstr "Alemany"
#: paperless/settings/__init__.py:571
#: paperless/settings/__init__.py:570
msgid "Greek"
msgstr "Grec"
#: paperless/settings/__init__.py:572
#: paperless/settings/__init__.py:571
msgid "English (GB)"
msgstr "Anglès (GB)"
#: paperless/settings/__init__.py:573
#: paperless/settings/__init__.py:572
msgid "Spanish"
msgstr "Espanyol"
#: paperless/settings/__init__.py:574
#: paperless/settings/__init__.py:573
msgid "Persian"
msgstr "Persa"
#: paperless/settings/__init__.py:575
#: paperless/settings/__init__.py:574
msgid "Finnish"
msgstr "Finès"
#: paperless/settings/__init__.py:576
#: paperless/settings/__init__.py:575
msgid "French"
msgstr "Francès"
#: paperless/settings/__init__.py:577
#: paperless/settings/__init__.py:576
msgid "Hungarian"
msgstr "Hongarès"
#: paperless/settings/__init__.py:578
#: paperless/settings/__init__.py:577
msgid "Indonesian"
msgstr "Indonesi"
#: paperless/settings/__init__.py:579
#: paperless/settings/__init__.py:578
msgid "Italian"
msgstr "Italià"
#: paperless/settings/__init__.py:580
#: paperless/settings/__init__.py:579
msgid "Japanese"
msgstr "Japonès"
#: paperless/settings/__init__.py:581
#: paperless/settings/__init__.py:580
msgid "Korean"
msgstr "Coreà"
#: paperless/settings/__init__.py:582
#: paperless/settings/__init__.py:581
msgid "Luxembourgish"
msgstr "Luxemburguès"
#: paperless/settings/__init__.py:583
#: paperless/settings/__init__.py:582
msgid "Norwegian"
msgstr "Noruec"
#: paperless/settings/__init__.py:584
#: paperless/settings/__init__.py:583
msgid "Dutch"
msgstr "Holandès"
#: paperless/settings/__init__.py:585
#: paperless/settings/__init__.py:584
msgid "Polish"
msgstr "Polonès"
#: paperless/settings/__init__.py:586
#: paperless/settings/__init__.py:585
msgid "Portuguese (Brazil)"
msgstr "Portuguès (Brasil)"
#: paperless/settings/__init__.py:587
#: paperless/settings/__init__.py:586
msgid "Portuguese"
msgstr "Portuguès"
#: paperless/settings/__init__.py:588
#: paperless/settings/__init__.py:587
msgid "Romanian"
msgstr "Romanès"
#: paperless/settings/__init__.py:589
#: paperless/settings/__init__.py:588
msgid "Russian"
msgstr "Rus"
#: paperless/settings/__init__.py:590
#: paperless/settings/__init__.py:589
msgid "Slovak"
msgstr "Eslovac"
#: paperless/settings/__init__.py:591
#: paperless/settings/__init__.py:590
msgid "Slovenian"
msgstr "Eslovè"
#: paperless/settings/__init__.py:592
#: paperless/settings/__init__.py:591
msgid "Serbian"
msgstr "Serbi"
#: paperless/settings/__init__.py:593
#: paperless/settings/__init__.py:592
msgid "Swedish"
msgstr "Suec"
#: paperless/settings/__init__.py:594
#: paperless/settings/__init__.py:593
msgid "Turkish"
msgstr "Turc"
#: paperless/settings/__init__.py:595
#: paperless/settings/__init__.py:594
msgid "Ukrainian"
msgstr "Ucranià"
#: paperless/settings/__init__.py:596
#: paperless/settings/__init__.py:595
msgid "Vietnamese"
msgstr "Vietnamita"
#: paperless/settings/__init__.py:597
#: paperless/settings/__init__.py:596
msgid "Chinese Simplified"
msgstr "Xinès Simplificat"
#: paperless/settings/__init__.py:598
#: paperless/settings/__init__.py:597
msgid "Chinese Traditional"
msgstr "Xinès tradicional"
+79 -63
View File
@@ -2,8 +2,8 @@ msgid ""
msgstr ""
"Project-Id-Version: paperless-ngx\n"
"Report-Msgid-Bugs-To: \n"
"POT-Creation-Date: 2026-10-14 15:18+0000\n"
"PO-Revision-Date: 2026-10-14 15:19\n"
"POT-Creation-Date: 2026-10-05 16:26+0000\n"
"PO-Revision-Date: 2026-10-05 16:27\n"
"Last-Translator: \n"
"Language-Team: Czech\n"
"Language: cs_CZ\n"
@@ -21,39 +21,39 @@ msgstr ""
msgid "Documents"
msgstr "Dokumenty"
#: documents/filters.py:464
#: documents/filters.py:463
msgid "Value must be valid JSON."
msgstr "Hodnota musí být platný JSON."
#: documents/filters.py:483
#: documents/filters.py:482
msgid "Invalid custom field query expression"
msgstr "Neplatný výraz dotazu na vlastní pole"
#: documents/filters.py:493
#: documents/filters.py:492
msgid "Invalid expression list. Must be nonempty."
msgstr "Neplatný seznam výrazů. Nesmí být prázdný."
#: documents/filters.py:514
#: documents/filters.py:513
msgid "Invalid logical operator {op!r}"
msgstr "Neplatný logický operátor {op!r}"
#: documents/filters.py:528
#: documents/filters.py:527
msgid "Maximum number of query conditions exceeded."
msgstr "Překročen maximální počet podmínek dotazu."
#: documents/filters.py:592
#: documents/filters.py:591
msgid "{name!r} is not a valid custom field."
msgstr "{name!r} není platné vlastní pole."
#: documents/filters.py:629
#: documents/filters.py:628
msgid "{data_type} does not support query expr {expr!r}."
msgstr "{data_type} nepodporuje výraz dotazu {expr!r}."
#: documents/filters.py:748 documents/models.py:137
#: documents/filters.py:747 documents/models.py:137
msgid "Maximum nesting depth exceeded."
msgstr "Překročena maximální hloubka větvení."
#: documents/filters.py:1125
#: documents/filters.py:1109
msgid "Custom field not found"
msgstr "Vlastní pole nebylo nalezeno"
@@ -1636,7 +1636,7 @@ msgid "workflow runs"
msgstr "spuštění pracovních postupů"
#: documents/serialisers.py:515 documents/serialisers.py:872
#: documents/serialisers.py:2902 documents/views.py:363 documents/views.py:2768
#: documents/serialisers.py:2902 documents/views.py:343 documents/views.py:2732
#: paperless_mail/serialisers.py:156
msgid "Insufficient permissions."
msgstr "Nedostatečná oprávnění."
@@ -1676,7 +1676,7 @@ msgstr "Zjištěna neplatná proměnná."
msgid "Duplicate document identifiers are not allowed."
msgstr ""
#: documents/serialisers.py:2988 documents/views.py:4811
#: documents/serialisers.py:2988 documents/views.py:4787
#, python-format
msgid "Documents not found: %(ids)s"
msgstr ""
@@ -1913,44 +1913,60 @@ msgstr "Chystáte se použít svůj účet %(provider_name)s k přihlášení."
msgid "As a final step, please complete the following form:"
msgstr "Jako poslední krok vyplňte následující formulář:"
#: documents/validators.py:24
#, python-brace-format
msgid "Unable to parse URI {value}, missing scheme"
msgstr "Nelze analyzovat URI {value}, chybí schéma"
#: documents/validators.py:29
#, python-brace-format
msgid "Unable to parse URI {value}, missing net location or path"
msgstr "Nelze analyzovat URI {value}, chybí síťové umístění nebo cesta"
#: documents/validators.py:36
msgid ", "
msgstr ""
msgid "URI scheme '{parts.scheme}' is not allowed. Allowed schemes: {', '.join(allowed_schemes)}"
msgstr "URI schéma '{parts.scheme}' není povoleno. Povolená schémata: {',\n"
"'.join(allowed_schemes)}"
#: documents/views.py:318
msgid "Specify only one of text, title_search, query, or more_like_id."
msgstr ""
#: documents/validators.py:45
#, python-brace-format
msgid "Unable to parse URI {value}"
msgstr "Nelze zpracovat URI {value}"
#: documents/views.py:356 documents/views.py:2765
#: documents/views.py:336 documents/views.py:2729
msgid "Invalid more_like_id"
msgstr ""
#: documents/views.py:1703
#: documents/views.py:1676
msgid "Invalid AI configuration."
msgstr ""
#: documents/views.py:1714
#: documents/views.py:1687
msgid "AI backend request timed out."
msgstr ""
#: documents/views.py:1726
#: documents/views.py:1699
msgid "AI backend rejected the request. Check logs for details."
msgstr ""
#: documents/views.py:4827
#: documents/views.py:2554 documents/views.py:2870
msgid "Specify only one of text, title_search, query, or more_like_id."
msgstr ""
#: documents/views.py:4800
#, python-format
msgid "Insufficient permissions to share document %(id)s."
msgstr "Nedostatečná oprávnění ke sdílení dokumentu %(id)s."
#: documents/views.py:4874
#: documents/views.py:4846
msgid "Bundle is already being processed."
msgstr ""
#: documents/views.py:4938
#: documents/views.py:4910
msgid "The share link bundle is still being prepared. Please try again later."
msgstr ""
#: documents/views.py:4952
#: documents/views.py:4924
msgid "The share link bundle is unavailable."
msgstr ""
@@ -2242,151 +2258,151 @@ msgstr "Nastaví časový limit LLM v sekundách"
msgid "paperless application settings"
msgstr "nastavení aplikace paperless"
#: paperless/settings/__init__.py:562
#: paperless/settings/__init__.py:561
msgid "English (US)"
msgstr "Angličtina (US)"
#: paperless/settings/__init__.py:563
#: paperless/settings/__init__.py:562
msgid "Arabic"
msgstr "Arabština"
#: paperless/settings/__init__.py:564
#: paperless/settings/__init__.py:563
msgid "Afrikaans"
msgstr "Afrikánština"
#: paperless/settings/__init__.py:565
#: paperless/settings/__init__.py:564
msgid "Belarusian"
msgstr "Běloruština"
#: paperless/settings/__init__.py:566
#: paperless/settings/__init__.py:565
msgid "Bulgarian"
msgstr "Bulharština"
#: paperless/settings/__init__.py:567
#: paperless/settings/__init__.py:566
msgid "Catalan"
msgstr "Katalánština"
#: paperless/settings/__init__.py:568
#: paperless/settings/__init__.py:567
msgid "Czech"
msgstr "Čeština"
#: paperless/settings/__init__.py:569
#: paperless/settings/__init__.py:568
msgid "Danish"
msgstr "Dánština"
#: paperless/settings/__init__.py:570
#: paperless/settings/__init__.py:569
msgid "German"
msgstr "Němčina"
#: paperless/settings/__init__.py:571
#: paperless/settings/__init__.py:570
msgid "Greek"
msgstr "Řečtina"
#: paperless/settings/__init__.py:572
#: paperless/settings/__init__.py:571
msgid "English (GB)"
msgstr "Angličtina (GB)"
#: paperless/settings/__init__.py:573
#: paperless/settings/__init__.py:572
msgid "Spanish"
msgstr "Španělština"
#: paperless/settings/__init__.py:574
#: paperless/settings/__init__.py:573
msgid "Persian"
msgstr "Perština"
#: paperless/settings/__init__.py:575
#: paperless/settings/__init__.py:574
msgid "Finnish"
msgstr "Finština"
#: paperless/settings/__init__.py:576
#: paperless/settings/__init__.py:575
msgid "French"
msgstr "Francouzština"
#: paperless/settings/__init__.py:577
#: paperless/settings/__init__.py:576
msgid "Hungarian"
msgstr "Maďarština"
#: paperless/settings/__init__.py:578
#: paperless/settings/__init__.py:577
msgid "Indonesian"
msgstr "Indonéština"
#: paperless/settings/__init__.py:579
#: paperless/settings/__init__.py:578
msgid "Italian"
msgstr "Italština"
#: paperless/settings/__init__.py:580
#: paperless/settings/__init__.py:579
msgid "Japanese"
msgstr "Japonština"
#: paperless/settings/__init__.py:581
#: paperless/settings/__init__.py:580
msgid "Korean"
msgstr "Korejština"
#: paperless/settings/__init__.py:582
#: paperless/settings/__init__.py:581
msgid "Luxembourgish"
msgstr "Lucemburština"
#: paperless/settings/__init__.py:583
#: paperless/settings/__init__.py:582
msgid "Norwegian"
msgstr "Norština"
#: paperless/settings/__init__.py:584
#: paperless/settings/__init__.py:583
msgid "Dutch"
msgstr "Holandština"
#: paperless/settings/__init__.py:585
#: paperless/settings/__init__.py:584
msgid "Polish"
msgstr "Polština"
#: paperless/settings/__init__.py:586
#: paperless/settings/__init__.py:585
msgid "Portuguese (Brazil)"
msgstr "Portugalština (Brazílie)"
#: paperless/settings/__init__.py:587
#: paperless/settings/__init__.py:586
msgid "Portuguese"
msgstr "Portugalština"
#: paperless/settings/__init__.py:588
#: paperless/settings/__init__.py:587
msgid "Romanian"
msgstr "Rumunština"
#: paperless/settings/__init__.py:589
#: paperless/settings/__init__.py:588
msgid "Russian"
msgstr "Ruština"
#: paperless/settings/__init__.py:590
#: paperless/settings/__init__.py:589
msgid "Slovak"
msgstr "Slovenština"
#: paperless/settings/__init__.py:591
#: paperless/settings/__init__.py:590
msgid "Slovenian"
msgstr "Slovinština"
#: paperless/settings/__init__.py:592
#: paperless/settings/__init__.py:591
msgid "Serbian"
msgstr "Srbština"
#: paperless/settings/__init__.py:593
#: paperless/settings/__init__.py:592
msgid "Swedish"
msgstr "Švédština"
#: paperless/settings/__init__.py:594
#: paperless/settings/__init__.py:593
msgid "Turkish"
msgstr "Turečtina"
#: paperless/settings/__init__.py:595
#: paperless/settings/__init__.py:594
msgid "Ukrainian"
msgstr "Ukrajinština"
#: paperless/settings/__init__.py:596
#: paperless/settings/__init__.py:595
msgid "Vietnamese"
msgstr "Vietnamština"
#: paperless/settings/__init__.py:597
#: paperless/settings/__init__.py:596
msgid "Chinese Simplified"
msgstr "Čínština (zjednodušená)"
#: paperless/settings/__init__.py:598
#: paperless/settings/__init__.py:597
msgid "Chinese Traditional"
msgstr "Čínština (tradiční)"
+76 -61
View File
@@ -2,8 +2,8 @@ msgid ""
msgstr ""
"Project-Id-Version: paperless-ngx\n"
"Report-Msgid-Bugs-To: \n"
"POT-Creation-Date: 2026-10-14 15:18+0000\n"
"PO-Revision-Date: 2026-10-14 15:19\n"
"POT-Creation-Date: 2026-10-05 16:26+0000\n"
"PO-Revision-Date: 2026-10-05 16:27\n"
"Last-Translator: \n"
"Language-Team: Danish\n"
"Language: da_DK\n"
@@ -21,39 +21,39 @@ msgstr ""
msgid "Documents"
msgstr "Dokumenter"
#: documents/filters.py:464
#: documents/filters.py:463
msgid "Value must be valid JSON."
msgstr "Værdien skal være gyldig JSON."
#: documents/filters.py:483
#: documents/filters.py:482
msgid "Invalid custom field query expression"
msgstr "Ugyldigt tilpasset feltforespørgselsudtryk"
#: documents/filters.py:493
#: documents/filters.py:492
msgid "Invalid expression list. Must be nonempty."
msgstr "Ugyldig udtryksliste. Må ikke være tom."
#: documents/filters.py:514
#: documents/filters.py:513
msgid "Invalid logical operator {op!r}"
msgstr "Ugyldig logisk operatør {op!r}"
#: documents/filters.py:528
#: documents/filters.py:527
msgid "Maximum number of query conditions exceeded."
msgstr "Maksimalt antal forespørgselsbetingelser overskredet."
#: documents/filters.py:592
#: documents/filters.py:591
msgid "{name!r} is not a valid custom field."
msgstr "{name!r} er ikke et gyldigt tilpasset felt."
#: documents/filters.py:629
#: documents/filters.py:628
msgid "{data_type} does not support query expr {expr!r}."
msgstr "{data_type} understøtter ikke forespørgsel expr {expr!r}."
#: documents/filters.py:748 documents/models.py:137
#: documents/filters.py:747 documents/models.py:137
msgid "Maximum nesting depth exceeded."
msgstr "Maksimal indlejringsdybde overskredet."
#: documents/filters.py:1125
#: documents/filters.py:1109
msgid "Custom field not found"
msgstr "Tilpasset felt ikke fundet"
@@ -1636,7 +1636,7 @@ msgid "workflow runs"
msgstr "workflow-kørsler"
#: documents/serialisers.py:515 documents/serialisers.py:872
#: documents/serialisers.py:2902 documents/views.py:363 documents/views.py:2768
#: documents/serialisers.py:2902 documents/views.py:343 documents/views.py:2732
#: paperless_mail/serialisers.py:156
msgid "Insufficient permissions."
msgstr ""
@@ -1676,7 +1676,7 @@ msgstr "Ugyldig variabel fundet."
msgid "Duplicate document identifiers are not allowed."
msgstr ""
#: documents/serialisers.py:2988 documents/views.py:4811
#: documents/serialisers.py:2988 documents/views.py:4787
#, python-format
msgid "Documents not found: %(ids)s"
msgstr ""
@@ -1913,44 +1913,59 @@ msgstr "En %(provider_name)s-konto er ved at blive brugt til indlogning."
msgid "As a final step, please complete the following form:"
msgstr "Som sidste trin, udfyld venligst flg. formular:"
#: documents/validators.py:24
#, python-brace-format
msgid "Unable to parse URI {value}, missing scheme"
msgstr ""
#: documents/validators.py:29
#, python-brace-format
msgid "Unable to parse URI {value}, missing net location or path"
msgstr ""
#: documents/validators.py:36
msgid ", "
msgid "URI scheme '{parts.scheme}' is not allowed. Allowed schemes: {', '.join(allowed_schemes)}"
msgstr ""
#: documents/views.py:318
msgid "Specify only one of text, title_search, query, or more_like_id."
#: documents/validators.py:45
#, python-brace-format
msgid "Unable to parse URI {value}"
msgstr ""
#: documents/views.py:356 documents/views.py:2765
#: documents/views.py:336 documents/views.py:2729
msgid "Invalid more_like_id"
msgstr ""
#: documents/views.py:1703
#: documents/views.py:1676
msgid "Invalid AI configuration."
msgstr ""
#: documents/views.py:1714
#: documents/views.py:1687
msgid "AI backend request timed out."
msgstr ""
#: documents/views.py:1726
#: documents/views.py:1699
msgid "AI backend rejected the request. Check logs for details."
msgstr ""
#: documents/views.py:4827
#: documents/views.py:2554 documents/views.py:2870
msgid "Specify only one of text, title_search, query, or more_like_id."
msgstr ""
#: documents/views.py:4800
#, python-format
msgid "Insufficient permissions to share document %(id)s."
msgstr ""
#: documents/views.py:4874
#: documents/views.py:4846
msgid "Bundle is already being processed."
msgstr ""
#: documents/views.py:4938
#: documents/views.py:4910
msgid "The share link bundle is still being prepared. Please try again later."
msgstr ""
#: documents/views.py:4952
#: documents/views.py:4924
msgid "The share link bundle is unavailable."
msgstr ""
@@ -2242,151 +2257,151 @@ msgstr ""
msgid "paperless application settings"
msgstr "paperless-applikationsindstillinger"
#: paperless/settings/__init__.py:562
#: paperless/settings/__init__.py:561
msgid "English (US)"
msgstr "Engelsk (USA)"
#: paperless/settings/__init__.py:563
#: paperless/settings/__init__.py:562
msgid "Arabic"
msgstr ""
#: paperless/settings/__init__.py:564
#: paperless/settings/__init__.py:563
msgid "Afrikaans"
msgstr "Afrikaans"
#: paperless/settings/__init__.py:565
#: paperless/settings/__init__.py:564
msgid "Belarusian"
msgstr "Hviderussisk"
#: paperless/settings/__init__.py:566
#: paperless/settings/__init__.py:565
msgid "Bulgarian"
msgstr "Bulgarsk"
#: paperless/settings/__init__.py:567
#: paperless/settings/__init__.py:566
msgid "Catalan"
msgstr "Katalansk"
#: paperless/settings/__init__.py:568
#: paperless/settings/__init__.py:567
msgid "Czech"
msgstr "Tjekkisk"
#: paperless/settings/__init__.py:569
#: paperless/settings/__init__.py:568
msgid "Danish"
msgstr "Dansk"
#: paperless/settings/__init__.py:570
#: paperless/settings/__init__.py:569
msgid "German"
msgstr "Tysk"
#: paperless/settings/__init__.py:571
#: paperless/settings/__init__.py:570
msgid "Greek"
msgstr "Græsk"
#: paperless/settings/__init__.py:572
#: paperless/settings/__init__.py:571
msgid "English (GB)"
msgstr "Engelsk (GB)"
#: paperless/settings/__init__.py:573
#: paperless/settings/__init__.py:572
msgid "Spanish"
msgstr "Spansk"
#: paperless/settings/__init__.py:574
#: paperless/settings/__init__.py:573
msgid "Persian"
msgstr ""
#: paperless/settings/__init__.py:575
#: paperless/settings/__init__.py:574
msgid "Finnish"
msgstr "Finsk"
#: paperless/settings/__init__.py:576
#: paperless/settings/__init__.py:575
msgid "French"
msgstr "Fransk"
#: paperless/settings/__init__.py:577
#: paperless/settings/__init__.py:576
msgid "Hungarian"
msgstr "Ungarsk"
#: paperless/settings/__init__.py:578
#: paperless/settings/__init__.py:577
msgid "Indonesian"
msgstr ""
#: paperless/settings/__init__.py:579
#: paperless/settings/__init__.py:578
msgid "Italian"
msgstr "Italiensk"
#: paperless/settings/__init__.py:580
#: paperless/settings/__init__.py:579
msgid "Japanese"
msgstr "Japansk"
#: paperless/settings/__init__.py:581
#: paperless/settings/__init__.py:580
msgid "Korean"
msgstr "Koreansk"
#: paperless/settings/__init__.py:582
#: paperless/settings/__init__.py:581
msgid "Luxembourgish"
msgstr "Luxemburgsk"
#: paperless/settings/__init__.py:583
#: paperless/settings/__init__.py:582
msgid "Norwegian"
msgstr "Norsk"
#: paperless/settings/__init__.py:584
#: paperless/settings/__init__.py:583
msgid "Dutch"
msgstr "Hollandsk"
#: paperless/settings/__init__.py:585
#: paperless/settings/__init__.py:584
msgid "Polish"
msgstr "Polsk"
#: paperless/settings/__init__.py:586
#: paperless/settings/__init__.py:585
msgid "Portuguese (Brazil)"
msgstr "Portugisisk (Brasilien)"
#: paperless/settings/__init__.py:587
#: paperless/settings/__init__.py:586
msgid "Portuguese"
msgstr "Portugisisk"
#: paperless/settings/__init__.py:588
#: paperless/settings/__init__.py:587
msgid "Romanian"
msgstr "Romansk"
#: paperless/settings/__init__.py:589
#: paperless/settings/__init__.py:588
msgid "Russian"
msgstr "Russisk"
#: paperless/settings/__init__.py:590
#: paperless/settings/__init__.py:589
msgid "Slovak"
msgstr "Slovakisk"
#: paperless/settings/__init__.py:591
#: paperless/settings/__init__.py:590
msgid "Slovenian"
msgstr "Slovensk"
#: paperless/settings/__init__.py:592
#: paperless/settings/__init__.py:591
msgid "Serbian"
msgstr "Serbisk"
#: paperless/settings/__init__.py:593
#: paperless/settings/__init__.py:592
msgid "Swedish"
msgstr "Svensk"
#: paperless/settings/__init__.py:594
#: paperless/settings/__init__.py:593
msgid "Turkish"
msgstr "Tyrkisk"
#: paperless/settings/__init__.py:595
#: paperless/settings/__init__.py:594
msgid "Ukrainian"
msgstr "Ukrainsk"
#: paperless/settings/__init__.py:596
#: paperless/settings/__init__.py:595
msgid "Vietnamese"
msgstr ""
#: paperless/settings/__init__.py:597
#: paperless/settings/__init__.py:596
msgid "Chinese Simplified"
msgstr "Kinesisk, forenklet"
#: paperless/settings/__init__.py:598
#: paperless/settings/__init__.py:597
msgid "Chinese Traditional"
msgstr "Kinesisk, traditionelt"
+78 -63
View File
@@ -2,8 +2,8 @@ msgid ""
msgstr ""
"Project-Id-Version: paperless-ngx\n"
"Report-Msgid-Bugs-To: \n"
"POT-Creation-Date: 2026-10-14 15:18+0000\n"
"PO-Revision-Date: 2026-10-14 15:19\n"
"POT-Creation-Date: 2026-10-05 16:26+0000\n"
"PO-Revision-Date: 2026-10-05 16:27\n"
"Last-Translator: \n"
"Language-Team: German, Switzerland\n"
"Language: de_CH\n"
@@ -21,39 +21,39 @@ msgstr ""
msgid "Documents"
msgstr "Dokumente"
#: documents/filters.py:464
#: documents/filters.py:463
msgid "Value must be valid JSON."
msgstr "Wert muss gültiges JSON sein."
#: documents/filters.py:483
#: documents/filters.py:482
msgid "Invalid custom field query expression"
msgstr "Ungültiger benutzerdefinierter Feldabfrageausdruck"
#: documents/filters.py:493
#: documents/filters.py:492
msgid "Invalid expression list. Must be nonempty."
msgstr "Ungültige Ausdrucksliste. Darf nicht leer sein."
#: documents/filters.py:514
#: documents/filters.py:513
msgid "Invalid logical operator {op!r}"
msgstr "Ungültiger logischer Operator {op!r}"
#: documents/filters.py:528
#: documents/filters.py:527
msgid "Maximum number of query conditions exceeded."
msgstr "Maximale Anzahl an Abfragebedingungen überschritten."
#: documents/filters.py:592
#: documents/filters.py:591
msgid "{name!r} is not a valid custom field."
msgstr "{name!r} ist kein gültiges Zusatzfeld."
#: documents/filters.py:629
#: documents/filters.py:628
msgid "{data_type} does not support query expr {expr!r}."
msgstr "{data_type} unterstützt den Abfrageausdruck {expr!r} nicht."
#: documents/filters.py:748 documents/models.py:137
#: documents/filters.py:747 documents/models.py:137
msgid "Maximum nesting depth exceeded."
msgstr "Maximale Verschachtelungstiefe überschritten."
#: documents/filters.py:1125
#: documents/filters.py:1109
msgid "Custom field not found"
msgstr "Benutzerdefiniertes Feld nicht gefunden"
@@ -1636,7 +1636,7 @@ msgid "workflow runs"
msgstr "Arbeitsablauf wird ausgeführt"
#: documents/serialisers.py:515 documents/serialisers.py:872
#: documents/serialisers.py:2902 documents/views.py:363 documents/views.py:2768
#: documents/serialisers.py:2902 documents/views.py:343 documents/views.py:2732
#: paperless_mail/serialisers.py:156
msgid "Insufficient permissions."
msgstr "Unzureichende Berechtigungen."
@@ -1676,7 +1676,7 @@ msgstr "Ungültige Variable erkannt."
msgid "Duplicate document identifiers are not allowed."
msgstr "Doppelte Dokumentbezeichner sind nicht erlaubt."
#: documents/serialisers.py:2988 documents/views.py:4811
#: documents/serialisers.py:2988 documents/views.py:4787
#, python-format
msgid "Documents not found: %(ids)s"
msgstr "Dokumente nicht gefunden: %(ids)s"
@@ -1913,44 +1913,59 @@ msgstr "Sie sind dabei, Ihr %(provider_name)s-Konto zur Anmeldung zu verwenden."
msgid "As a final step, please complete the following form:"
msgstr "Bitte füllen Sie zum Abschluss folgendes Formular aus:"
#: documents/validators.py:24
#, python-brace-format
msgid "Unable to parse URI {value}, missing scheme"
msgstr "URI {value} kann nicht gelesen werden, fehlendes Schema"
#: documents/validators.py:29
#, python-brace-format
msgid "Unable to parse URI {value}, missing net location or path"
msgstr "URI {value} kann nicht gelesen werden, Netzadresse oder Pfad fehlt"
#: documents/validators.py:36
msgid ", "
msgstr ""
msgid "URI scheme '{parts.scheme}' is not allowed. Allowed schemes: {', '.join(allowed_schemes)}"
msgstr "URI-Schema „{parts.scheme}“ ist nicht erlaubt. Erlaubte Schemata: {', '.join(allowed_schemes)}"
#: documents/views.py:318
msgid "Specify only one of text, title_search, query, or more_like_id."
msgstr "Geben Sie nur einen von text, title_search, query, oder more_like_id an."
#: documents/validators.py:45
#, python-brace-format
msgid "Unable to parse URI {value}"
msgstr "URI {value} kann nicht gelesen werden"
#: documents/views.py:356 documents/views.py:2765
#: documents/views.py:336 documents/views.py:2729
msgid "Invalid more_like_id"
msgstr "Ungültige more_like_id"
#: documents/views.py:1703
#: documents/views.py:1676
msgid "Invalid AI configuration."
msgstr "Ungültige KI-Konfiguration."
#: documents/views.py:1714
#: documents/views.py:1687
msgid "AI backend request timed out."
msgstr ""
#: documents/views.py:1726
#: documents/views.py:1699
msgid "AI backend rejected the request. Check logs for details."
msgstr ""
#: documents/views.py:4827
#: documents/views.py:2554 documents/views.py:2870
msgid "Specify only one of text, title_search, query, or more_like_id."
msgstr "Geben Sie nur einen von text, title_search, query, oder more_like_id an."
#: documents/views.py:4800
#, python-format
msgid "Insufficient permissions to share document %(id)s."
msgstr "Unzureichende Berechtigungen, um Dokument %(id)s zu teilen."
#: documents/views.py:4874
#: documents/views.py:4846
msgid "Bundle is already being processed."
msgstr "Paket wird bereits verarbeitet."
#: documents/views.py:4938
#: documents/views.py:4910
msgid "The share link bundle is still being prepared. Please try again later."
msgstr "Das Freigabelink-Paket wird noch vorbereitet. Bitte versuchen Sie es später erneut."
#: documents/views.py:4952
#: documents/views.py:4924
msgid "The share link bundle is unavailable."
msgstr "Das Freigabelink-Paket ist nicht verfügbar."
@@ -2242,151 +2257,151 @@ msgstr ""
msgid "paperless application settings"
msgstr "Paperless-ngx-Anwendungseinstellungen"
#: paperless/settings/__init__.py:562
#: paperless/settings/__init__.py:561
msgid "English (US)"
msgstr "Englisch (US)"
#: paperless/settings/__init__.py:563
#: paperless/settings/__init__.py:562
msgid "Arabic"
msgstr "Arabisch"
#: paperless/settings/__init__.py:564
#: paperless/settings/__init__.py:563
msgid "Afrikaans"
msgstr "Afrikanisch"
#: paperless/settings/__init__.py:565
#: paperless/settings/__init__.py:564
msgid "Belarusian"
msgstr "Belarussisch"
#: paperless/settings/__init__.py:566
#: paperless/settings/__init__.py:565
msgid "Bulgarian"
msgstr "Bulgarisch"
#: paperless/settings/__init__.py:567
#: paperless/settings/__init__.py:566
msgid "Catalan"
msgstr "Katalanisch"
#: paperless/settings/__init__.py:568
#: paperless/settings/__init__.py:567
msgid "Czech"
msgstr "Tschechisch"
#: paperless/settings/__init__.py:569
#: paperless/settings/__init__.py:568
msgid "Danish"
msgstr "Dänisch"
#: paperless/settings/__init__.py:570
#: paperless/settings/__init__.py:569
msgid "German"
msgstr "Deutsch"
#: paperless/settings/__init__.py:571
#: paperless/settings/__init__.py:570
msgid "Greek"
msgstr "Griechisch"
#: paperless/settings/__init__.py:572
#: paperless/settings/__init__.py:571
msgid "English (GB)"
msgstr "Englisch (UK)"
#: paperless/settings/__init__.py:573
#: paperless/settings/__init__.py:572
msgid "Spanish"
msgstr "Spanisch"
#: paperless/settings/__init__.py:574
#: paperless/settings/__init__.py:573
msgid "Persian"
msgstr "Persisch"
#: paperless/settings/__init__.py:575
#: paperless/settings/__init__.py:574
msgid "Finnish"
msgstr "Finnisch"
#: paperless/settings/__init__.py:576
#: paperless/settings/__init__.py:575
msgid "French"
msgstr "Französisch"
#: paperless/settings/__init__.py:577
#: paperless/settings/__init__.py:576
msgid "Hungarian"
msgstr "Ungarisch"
#: paperless/settings/__init__.py:578
#: paperless/settings/__init__.py:577
msgid "Indonesian"
msgstr "Indonesisch"
#: paperless/settings/__init__.py:579
#: paperless/settings/__init__.py:578
msgid "Italian"
msgstr "Italienisch"
#: paperless/settings/__init__.py:580
#: paperless/settings/__init__.py:579
msgid "Japanese"
msgstr "Japanisch"
#: paperless/settings/__init__.py:581
#: paperless/settings/__init__.py:580
msgid "Korean"
msgstr "Koreanisch"
#: paperless/settings/__init__.py:582
#: paperless/settings/__init__.py:581
msgid "Luxembourgish"
msgstr "Luxemburgisch"
#: paperless/settings/__init__.py:583
#: paperless/settings/__init__.py:582
msgid "Norwegian"
msgstr "Norwegisch"
#: paperless/settings/__init__.py:584
#: paperless/settings/__init__.py:583
msgid "Dutch"
msgstr "Niederländisch"
#: paperless/settings/__init__.py:585
#: paperless/settings/__init__.py:584
msgid "Polish"
msgstr "Polnisch"
#: paperless/settings/__init__.py:586
#: paperless/settings/__init__.py:585
msgid "Portuguese (Brazil)"
msgstr "Portugiesisch (Brasilien)"
#: paperless/settings/__init__.py:587
#: paperless/settings/__init__.py:586
msgid "Portuguese"
msgstr "Portugiesisch"
#: paperless/settings/__init__.py:588
#: paperless/settings/__init__.py:587
msgid "Romanian"
msgstr "Rumänisch"
#: paperless/settings/__init__.py:589
#: paperless/settings/__init__.py:588
msgid "Russian"
msgstr "Russisch"
#: paperless/settings/__init__.py:590
#: paperless/settings/__init__.py:589
msgid "Slovak"
msgstr "Slowakisch"
#: paperless/settings/__init__.py:591
#: paperless/settings/__init__.py:590
msgid "Slovenian"
msgstr "Slowenisch"
#: paperless/settings/__init__.py:592
#: paperless/settings/__init__.py:591
msgid "Serbian"
msgstr "Serbisch"
#: paperless/settings/__init__.py:593
#: paperless/settings/__init__.py:592
msgid "Swedish"
msgstr "Schwedisch"
#: paperless/settings/__init__.py:594
#: paperless/settings/__init__.py:593
msgid "Turkish"
msgstr "Türkisch"
#: paperless/settings/__init__.py:595
#: paperless/settings/__init__.py:594
msgid "Ukrainian"
msgstr "Ukrainisch"
#: paperless/settings/__init__.py:596
#: paperless/settings/__init__.py:595
msgid "Vietnamese"
msgstr "Vietnamesisch"
#: paperless/settings/__init__.py:597
#: paperless/settings/__init__.py:596
msgid "Chinese Simplified"
msgstr "Chinesisch (vereinfacht)"
#: paperless/settings/__init__.py:598
#: paperless/settings/__init__.py:597
msgid "Chinese Traditional"
msgstr "Chinesisch (traditionell)"
+78 -63
View File
@@ -2,8 +2,8 @@ msgid ""
msgstr ""
"Project-Id-Version: paperless-ngx\n"
"Report-Msgid-Bugs-To: \n"
"POT-Creation-Date: 2026-10-14 15:18+0000\n"
"PO-Revision-Date: 2026-10-14 15:19\n"
"POT-Creation-Date: 2026-10-05 16:26+0000\n"
"PO-Revision-Date: 2026-10-06 00:56\n"
"Last-Translator: \n"
"Language-Team: German\n"
"Language: de_DE\n"
@@ -21,39 +21,39 @@ msgstr ""
msgid "Documents"
msgstr "Dokumente"
#: documents/filters.py:464
#: documents/filters.py:463
msgid "Value must be valid JSON."
msgstr "Wert muss gültiges JSON sein."
#: documents/filters.py:483
#: documents/filters.py:482
msgid "Invalid custom field query expression"
msgstr "Ungültiger Zusatzfeld-Abfrageausdruck"
#: documents/filters.py:493
#: documents/filters.py:492
msgid "Invalid expression list. Must be nonempty."
msgstr "Ungültige Ausdrucksliste. Darf nicht leer sein."
#: documents/filters.py:514
#: documents/filters.py:513
msgid "Invalid logical operator {op!r}"
msgstr "Ungültiger logischer Operator {op!r}"
#: documents/filters.py:528
#: documents/filters.py:527
msgid "Maximum number of query conditions exceeded."
msgstr "Maximale Anzahl an Abfragebedingungen überschritten."
#: documents/filters.py:592
#: documents/filters.py:591
msgid "{name!r} is not a valid custom field."
msgstr "{name!r} ist kein gültiges Zusatzfeld."
#: documents/filters.py:629
#: documents/filters.py:628
msgid "{data_type} does not support query expr {expr!r}."
msgstr "{data_type} unterstützt den Abfrageausdruck {expr!r} nicht."
#: documents/filters.py:748 documents/models.py:137
#: documents/filters.py:747 documents/models.py:137
msgid "Maximum nesting depth exceeded."
msgstr "Maximale Verschachtelungstiefe überschritten."
#: documents/filters.py:1125
#: documents/filters.py:1109
msgid "Custom field not found"
msgstr "Zusatzfeld nicht gefunden"
@@ -1636,7 +1636,7 @@ msgid "workflow runs"
msgstr "Arbeitsablauf wird ausgeführt"
#: documents/serialisers.py:515 documents/serialisers.py:872
#: documents/serialisers.py:2902 documents/views.py:363 documents/views.py:2768
#: documents/serialisers.py:2902 documents/views.py:343 documents/views.py:2732
#: paperless_mail/serialisers.py:156
msgid "Insufficient permissions."
msgstr "Unzureichende Berechtigungen."
@@ -1676,7 +1676,7 @@ msgstr "Ungültige Variable erkannt."
msgid "Duplicate document identifiers are not allowed."
msgstr "Doppelte Dokumentbezeichner sind nicht erlaubt."
#: documents/serialisers.py:2988 documents/views.py:4811
#: documents/serialisers.py:2988 documents/views.py:4787
#, python-format
msgid "Documents not found: %(ids)s"
msgstr "Dokumente nicht gefunden: %(ids)s"
@@ -1913,44 +1913,59 @@ msgstr "Sie sind dabei, Ihr %(provider_name)s-Konto zur Anmeldung zu verwenden."
msgid "As a final step, please complete the following form:"
msgstr "Bitte füllen Sie zum Abschluss folgendes Formular aus:"
#: documents/validators.py:24
#, python-brace-format
msgid "Unable to parse URI {value}, missing scheme"
msgstr "URI {value} kann nicht gelesen werden, fehlendes Schema"
#: documents/validators.py:29
#, python-brace-format
msgid "Unable to parse URI {value}, missing net location or path"
msgstr "URI {value} kann nicht gelesen werden, Netzadresse oder Pfad fehlt"
#: documents/validators.py:36
msgid ", "
msgstr ""
msgid "URI scheme '{parts.scheme}' is not allowed. Allowed schemes: {', '.join(allowed_schemes)}"
msgstr "URI-Schema „{parts.scheme}“ ist nicht erlaubt. Erlaubte Schemata: {', '.join(allowed_schemes)}"
#: documents/views.py:318
msgid "Specify only one of text, title_search, query, or more_like_id."
msgstr "Geben Sie nur einen von text, title_search, query, oder more_like_id an."
#: documents/validators.py:45
#, python-brace-format
msgid "Unable to parse URI {value}"
msgstr "URI {value} kann nicht gelesen werden"
#: documents/views.py:356 documents/views.py:2765
#: documents/views.py:336 documents/views.py:2729
msgid "Invalid more_like_id"
msgstr "Ungültige more_like_id"
#: documents/views.py:1703
#: documents/views.py:1676
msgid "Invalid AI configuration."
msgstr "Ungültige KI-Konfiguration."
#: documents/views.py:1714
#: documents/views.py:1687
msgid "AI backend request timed out."
msgstr "Zeitüberschreitung bei der KI-Backendanfrage."
#: documents/views.py:1726
#: documents/views.py:1699
msgid "AI backend rejected the request. Check logs for details."
msgstr "Das KI-Backend hat die Anfrage abgelehnt. Details in den Protokollen."
#: documents/views.py:4827
#: documents/views.py:2554 documents/views.py:2870
msgid "Specify only one of text, title_search, query, or more_like_id."
msgstr "Geben Sie nur einen von text, title_search, query, oder more_like_id an."
#: documents/views.py:4800
#, python-format
msgid "Insufficient permissions to share document %(id)s."
msgstr "Unzureichende Berechtigungen, um Dokument %(id)s zu teilen."
#: documents/views.py:4874
#: documents/views.py:4846
msgid "Bundle is already being processed."
msgstr "Paket wird bereits verarbeitet."
#: documents/views.py:4938
#: documents/views.py:4910
msgid "The share link bundle is still being prepared. Please try again later."
msgstr "Das Freigabelink-Paket wird noch vorbereitet. Bitte versuchen Sie es später erneut."
#: documents/views.py:4952
#: documents/views.py:4924
msgid "The share link bundle is unavailable."
msgstr "Das Freigabelink-Paket ist nicht verfügbar."
@@ -2242,151 +2257,151 @@ msgstr "Legt das LLM-Zeitlimit in Sekunden fest"
msgid "paperless application settings"
msgstr "Paperless-ngx-Anwendungseinstellungen"
#: paperless/settings/__init__.py:562
#: paperless/settings/__init__.py:561
msgid "English (US)"
msgstr "Englisch (US)"
#: paperless/settings/__init__.py:563
#: paperless/settings/__init__.py:562
msgid "Arabic"
msgstr "Arabisch"
#: paperless/settings/__init__.py:564
#: paperless/settings/__init__.py:563
msgid "Afrikaans"
msgstr "Afrikanisch"
#: paperless/settings/__init__.py:565
#: paperless/settings/__init__.py:564
msgid "Belarusian"
msgstr "Belarussisch"
#: paperless/settings/__init__.py:566
#: paperless/settings/__init__.py:565
msgid "Bulgarian"
msgstr "Bulgarisch"
#: paperless/settings/__init__.py:567
#: paperless/settings/__init__.py:566
msgid "Catalan"
msgstr "Katalanisch"
#: paperless/settings/__init__.py:568
#: paperless/settings/__init__.py:567
msgid "Czech"
msgstr "Tschechisch"
#: paperless/settings/__init__.py:569
#: paperless/settings/__init__.py:568
msgid "Danish"
msgstr "Dänisch"
#: paperless/settings/__init__.py:570
#: paperless/settings/__init__.py:569
msgid "German"
msgstr "Deutsch"
#: paperless/settings/__init__.py:571
#: paperless/settings/__init__.py:570
msgid "Greek"
msgstr "Griechisch"
#: paperless/settings/__init__.py:572
#: paperless/settings/__init__.py:571
msgid "English (GB)"
msgstr "Englisch (UK)"
#: paperless/settings/__init__.py:573
#: paperless/settings/__init__.py:572
msgid "Spanish"
msgstr "Spanisch"
#: paperless/settings/__init__.py:574
#: paperless/settings/__init__.py:573
msgid "Persian"
msgstr "Persisch"
#: paperless/settings/__init__.py:575
#: paperless/settings/__init__.py:574
msgid "Finnish"
msgstr "Finnisch"
#: paperless/settings/__init__.py:576
#: paperless/settings/__init__.py:575
msgid "French"
msgstr "Französisch"
#: paperless/settings/__init__.py:577
#: paperless/settings/__init__.py:576
msgid "Hungarian"
msgstr "Ungarisch"
#: paperless/settings/__init__.py:578
#: paperless/settings/__init__.py:577
msgid "Indonesian"
msgstr "Indonesisch"
#: paperless/settings/__init__.py:579
#: paperless/settings/__init__.py:578
msgid "Italian"
msgstr "Italienisch"
#: paperless/settings/__init__.py:580
#: paperless/settings/__init__.py:579
msgid "Japanese"
msgstr "Japanisch"
#: paperless/settings/__init__.py:581
#: paperless/settings/__init__.py:580
msgid "Korean"
msgstr "Koreanisch"
#: paperless/settings/__init__.py:582
#: paperless/settings/__init__.py:581
msgid "Luxembourgish"
msgstr "Luxemburgisch"
#: paperless/settings/__init__.py:583
#: paperless/settings/__init__.py:582
msgid "Norwegian"
msgstr "Norwegisch"
#: paperless/settings/__init__.py:584
#: paperless/settings/__init__.py:583
msgid "Dutch"
msgstr "Niederländisch"
#: paperless/settings/__init__.py:585
#: paperless/settings/__init__.py:584
msgid "Polish"
msgstr "Polnisch"
#: paperless/settings/__init__.py:586
#: paperless/settings/__init__.py:585
msgid "Portuguese (Brazil)"
msgstr "Portugiesisch (Brasilien)"
#: paperless/settings/__init__.py:587
#: paperless/settings/__init__.py:586
msgid "Portuguese"
msgstr "Portugiesisch"
#: paperless/settings/__init__.py:588
#: paperless/settings/__init__.py:587
msgid "Romanian"
msgstr "Rumänisch"
#: paperless/settings/__init__.py:589
#: paperless/settings/__init__.py:588
msgid "Russian"
msgstr "Russisch"
#: paperless/settings/__init__.py:590
#: paperless/settings/__init__.py:589
msgid "Slovak"
msgstr "Slowakisch"
#: paperless/settings/__init__.py:591
#: paperless/settings/__init__.py:590
msgid "Slovenian"
msgstr "Slowenisch"
#: paperless/settings/__init__.py:592
#: paperless/settings/__init__.py:591
msgid "Serbian"
msgstr "Serbisch"
#: paperless/settings/__init__.py:593
#: paperless/settings/__init__.py:592
msgid "Swedish"
msgstr "Schwedisch"
#: paperless/settings/__init__.py:594
#: paperless/settings/__init__.py:593
msgid "Turkish"
msgstr "Türkisch"
#: paperless/settings/__init__.py:595
#: paperless/settings/__init__.py:594
msgid "Ukrainian"
msgstr "Ukrainisch"
#: paperless/settings/__init__.py:596
#: paperless/settings/__init__.py:595
msgid "Vietnamese"
msgstr "Vietnamesisch"
#: paperless/settings/__init__.py:597
#: paperless/settings/__init__.py:596
msgid "Chinese Simplified"
msgstr "Chinesisch (vereinfacht)"
#: paperless/settings/__init__.py:598
#: paperless/settings/__init__.py:597
msgid "Chinese Traditional"
msgstr "Chinesisch (traditionell)"
+76 -61
View File
@@ -2,8 +2,8 @@ msgid ""
msgstr ""
"Project-Id-Version: paperless-ngx\n"
"Report-Msgid-Bugs-To: \n"
"POT-Creation-Date: 2026-10-14 15:18+0000\n"
"PO-Revision-Date: 2026-10-14 15:19\n"
"POT-Creation-Date: 2026-10-05 16:26+0000\n"
"PO-Revision-Date: 2026-10-05 16:27\n"
"Last-Translator: \n"
"Language-Team: Greek\n"
"Language: el_GR\n"
@@ -21,39 +21,39 @@ msgstr ""
msgid "Documents"
msgstr "Έγγραφα"
#: documents/filters.py:464
#: documents/filters.py:463
msgid "Value must be valid JSON."
msgstr "Η τιμή πρέπει να είναι σε έγκυρη μορφή JSON."
#: documents/filters.py:483
#: documents/filters.py:482
msgid "Invalid custom field query expression"
msgstr "Μη έγκυρη έκφραση προσαρμοσμένου ερωτήματος πεδίου"
#: documents/filters.py:493
#: documents/filters.py:492
msgid "Invalid expression list. Must be nonempty."
msgstr "Μη έγκυρη λίστα έκφρασης. Πρέπει να είναι μη κενή."
#: documents/filters.py:514
#: documents/filters.py:513
msgid "Invalid logical operator {op!r}"
msgstr "Μη έγκυρος λογικός τελεστής {op!r}"
#: documents/filters.py:528
#: documents/filters.py:527
msgid "Maximum number of query conditions exceeded."
msgstr "Υπέρβαση μέγιστου αριθμού συνθηκών ερωτήματος."
#: documents/filters.py:592
#: documents/filters.py:591
msgid "{name!r} is not a valid custom field."
msgstr "Το προσαρμοσμένο πεδίο {name!r} δεν είναι ένα έγκυρο."
#: documents/filters.py:629
#: documents/filters.py:628
msgid "{data_type} does not support query expr {expr!r}."
msgstr "Το {data_type} δεν υποστηρίζει το ερώτημα expr {expr!r}s."
#: documents/filters.py:748 documents/models.py:137
#: documents/filters.py:747 documents/models.py:137
msgid "Maximum nesting depth exceeded."
msgstr "Υπέρβαση μέγιστου βάθους εμφώλευσης."
#: documents/filters.py:1125
#: documents/filters.py:1109
msgid "Custom field not found"
msgstr "Το προσαρμοσμένο πεδίο δε βρέθηκε"
@@ -1636,7 +1636,7 @@ msgid "workflow runs"
msgstr "εκτελέσεις ροής εργασίας"
#: documents/serialisers.py:515 documents/serialisers.py:872
#: documents/serialisers.py:2902 documents/views.py:363 documents/views.py:2768
#: documents/serialisers.py:2902 documents/views.py:343 documents/views.py:2732
#: paperless_mail/serialisers.py:156
msgid "Insufficient permissions."
msgstr ""
@@ -1676,7 +1676,7 @@ msgstr "Εντοπίστηκε μη έγκυρη μεταβλητή."
msgid "Duplicate document identifiers are not allowed."
msgstr ""
#: documents/serialisers.py:2988 documents/views.py:4811
#: documents/serialisers.py:2988 documents/views.py:4787
#, python-format
msgid "Documents not found: %(ids)s"
msgstr ""
@@ -1913,44 +1913,59 @@ msgstr "Πρόκειται να χρησιμοποιήσετε το λογαρι
msgid "As a final step, please complete the following form:"
msgstr "Ως τελικό βήμα, παρακαλούμε να συμπληρώσετε την ακόλουθη φόρμα:"
#: documents/validators.py:24
#, python-brace-format
msgid "Unable to parse URI {value}, missing scheme"
msgstr ""
#: documents/validators.py:29
#, python-brace-format
msgid "Unable to parse URI {value}, missing net location or path"
msgstr ""
#: documents/validators.py:36
msgid ", "
msgid "URI scheme '{parts.scheme}' is not allowed. Allowed schemes: {', '.join(allowed_schemes)}"
msgstr ""
#: documents/views.py:318
msgid "Specify only one of text, title_search, query, or more_like_id."
#: documents/validators.py:45
#, python-brace-format
msgid "Unable to parse URI {value}"
msgstr ""
#: documents/views.py:356 documents/views.py:2765
#: documents/views.py:336 documents/views.py:2729
msgid "Invalid more_like_id"
msgstr ""
#: documents/views.py:1703
#: documents/views.py:1676
msgid "Invalid AI configuration."
msgstr ""
#: documents/views.py:1714
#: documents/views.py:1687
msgid "AI backend request timed out."
msgstr ""
#: documents/views.py:1726
#: documents/views.py:1699
msgid "AI backend rejected the request. Check logs for details."
msgstr ""
#: documents/views.py:4827
#: documents/views.py:2554 documents/views.py:2870
msgid "Specify only one of text, title_search, query, or more_like_id."
msgstr ""
#: documents/views.py:4800
#, python-format
msgid "Insufficient permissions to share document %(id)s."
msgstr ""
#: documents/views.py:4874
#: documents/views.py:4846
msgid "Bundle is already being processed."
msgstr ""
#: documents/views.py:4938
#: documents/views.py:4910
msgid "The share link bundle is still being prepared. Please try again later."
msgstr ""
#: documents/views.py:4952
#: documents/views.py:4924
msgid "The share link bundle is unavailable."
msgstr ""
@@ -2242,151 +2257,151 @@ msgstr ""
msgid "paperless application settings"
msgstr "ρυθμίσεις εφαρμογής paperless"
#: paperless/settings/__init__.py:562
#: paperless/settings/__init__.py:561
msgid "English (US)"
msgstr "Αγγλικά (ΗΠΑ)"
#: paperless/settings/__init__.py:563
#: paperless/settings/__init__.py:562
msgid "Arabic"
msgstr "Αραβικά"
#: paperless/settings/__init__.py:564
#: paperless/settings/__init__.py:563
msgid "Afrikaans"
msgstr "Αφρικανικά"
#: paperless/settings/__init__.py:565
#: paperless/settings/__init__.py:564
msgid "Belarusian"
msgstr "Λευκορωσικά"
#: paperless/settings/__init__.py:566
#: paperless/settings/__init__.py:565
msgid "Bulgarian"
msgstr "Βουλγαρικά"
#: paperless/settings/__init__.py:567
#: paperless/settings/__init__.py:566
msgid "Catalan"
msgstr "Καταλανικά"
#: paperless/settings/__init__.py:568
#: paperless/settings/__init__.py:567
msgid "Czech"
msgstr "Τσέχικα"
#: paperless/settings/__init__.py:569
#: paperless/settings/__init__.py:568
msgid "Danish"
msgstr "Δανέζικα"
#: paperless/settings/__init__.py:570
#: paperless/settings/__init__.py:569
msgid "German"
msgstr "Γερμανικά"
#: paperless/settings/__init__.py:571
#: paperless/settings/__init__.py:570
msgid "Greek"
msgstr "Ελληνικά"
#: paperless/settings/__init__.py:572
#: paperless/settings/__init__.py:571
msgid "English (GB)"
msgstr "Αγγλικά (Ηνωμένο Βασίλειο)"
#: paperless/settings/__init__.py:573
#: paperless/settings/__init__.py:572
msgid "Spanish"
msgstr "Ισπανικά"
#: paperless/settings/__init__.py:574
#: paperless/settings/__init__.py:573
msgid "Persian"
msgstr ""
#: paperless/settings/__init__.py:575
#: paperless/settings/__init__.py:574
msgid "Finnish"
msgstr "Φινλανδικά"
#: paperless/settings/__init__.py:576
#: paperless/settings/__init__.py:575
msgid "French"
msgstr "Γαλλικά"
#: paperless/settings/__init__.py:577
#: paperless/settings/__init__.py:576
msgid "Hungarian"
msgstr "Ουγγρικά"
#: paperless/settings/__init__.py:578
#: paperless/settings/__init__.py:577
msgid "Indonesian"
msgstr ""
#: paperless/settings/__init__.py:579
#: paperless/settings/__init__.py:578
msgid "Italian"
msgstr "Ιταλικά"
#: paperless/settings/__init__.py:580
#: paperless/settings/__init__.py:579
msgid "Japanese"
msgstr "Ιαπωνικά"
#: paperless/settings/__init__.py:581
#: paperless/settings/__init__.py:580
msgid "Korean"
msgstr "Κορεάτικα"
#: paperless/settings/__init__.py:582
#: paperless/settings/__init__.py:581
msgid "Luxembourgish"
msgstr "Λουξεμβουργικά"
#: paperless/settings/__init__.py:583
#: paperless/settings/__init__.py:582
msgid "Norwegian"
msgstr "Νορβηγικά"
#: paperless/settings/__init__.py:584
#: paperless/settings/__init__.py:583
msgid "Dutch"
msgstr "Ολλανδικά"
#: paperless/settings/__init__.py:585
#: paperless/settings/__init__.py:584
msgid "Polish"
msgstr "Πολωνικά"
#: paperless/settings/__init__.py:586
#: paperless/settings/__init__.py:585
msgid "Portuguese (Brazil)"
msgstr "Πορτογαλικά (Βραζιλίας)"
#: paperless/settings/__init__.py:587
#: paperless/settings/__init__.py:586
msgid "Portuguese"
msgstr "Πορτογαλικά"
#: paperless/settings/__init__.py:588
#: paperless/settings/__init__.py:587
msgid "Romanian"
msgstr "Ρουμάνικα"
#: paperless/settings/__init__.py:589
#: paperless/settings/__init__.py:588
msgid "Russian"
msgstr "Ρωσικά"
#: paperless/settings/__init__.py:590
#: paperless/settings/__init__.py:589
msgid "Slovak"
msgstr "Σλοβακικά"
#: paperless/settings/__init__.py:591
#: paperless/settings/__init__.py:590
msgid "Slovenian"
msgstr "Σλοβενικά"
#: paperless/settings/__init__.py:592
#: paperless/settings/__init__.py:591
msgid "Serbian"
msgstr "Σερβικά"
#: paperless/settings/__init__.py:593
#: paperless/settings/__init__.py:592
msgid "Swedish"
msgstr "Σουηδικά"
#: paperless/settings/__init__.py:594
#: paperless/settings/__init__.py:593
msgid "Turkish"
msgstr "Τούρκικα"
#: paperless/settings/__init__.py:595
#: paperless/settings/__init__.py:594
msgid "Ukrainian"
msgstr "Ουκρανικά"
#: paperless/settings/__init__.py:596
#: paperless/settings/__init__.py:595
msgid "Vietnamese"
msgstr ""
#: paperless/settings/__init__.py:597
#: paperless/settings/__init__.py:596
msgid "Chinese Simplified"
msgstr "Κινέζικα Απλοποιημένα"
#: paperless/settings/__init__.py:598
#: paperless/settings/__init__.py:597
msgid "Chinese Traditional"
msgstr "Κινεζικά Παραδοσιακά"
File diff suppressed because it is too large. Load diff
+78 -63
View File
@@ -2,8 +2,8 @@ msgid ""
msgstr ""
"Project-Id-Version: paperless-ngx\n"
"Report-Msgid-Bugs-To: \n"
"POT-Creation-Date: 2026-10-14 15:18+0000\n"
"PO-Revision-Date: 2026-10-14 15:19\n"
"POT-Creation-Date: 2026-10-05 16:26+0000\n"
"PO-Revision-Date: 2026-10-05 16:27\n"
"Last-Translator: \n"
"Language-Team: Spanish\n"
"Language: es_ES\n"
@@ -21,39 +21,39 @@ msgstr ""
msgid "Documents"
msgstr "Documentos"
#: documents/filters.py:464
#: documents/filters.py:463
msgid "Value must be valid JSON."
msgstr "El valor debe ser un JSON válido."
#: documents/filters.py:483
#: documents/filters.py:482
msgid "Invalid custom field query expression"
msgstr "Expresión de consulta de campo personalizado no válida"
#: documents/filters.py:493
#: documents/filters.py:492
msgid "Invalid expression list. Must be nonempty."
msgstr "Lista de expresiones no válida. No debe estar vacía."
#: documents/filters.py:514
#: documents/filters.py:513
msgid "Invalid logical operator {op!r}"
msgstr "Operador lógico inválido {op!r}"
#: documents/filters.py:528
#: documents/filters.py:527
msgid "Maximum number of query conditions exceeded."
msgstr "Se ha superado el número máximo de condiciones de consulta."
#: documents/filters.py:592
#: documents/filters.py:591
msgid "{name!r} is not a valid custom field."
msgstr "{nombre!r} no es un campo personalizado válido."
#: documents/filters.py:629
#: documents/filters.py:628
msgid "{data_type} does not support query expr {expr!r}."
msgstr "{data_type} no admite la consulta expr {expr!r}."
#: documents/filters.py:748 documents/models.py:137
#: documents/filters.py:747 documents/models.py:137
msgid "Maximum nesting depth exceeded."
msgstr "Profundidad máxima de nidificación superada."
#: documents/filters.py:1125
#: documents/filters.py:1109
msgid "Custom field not found"
msgstr "Campo personalizado no encontrado"
@@ -1636,7 +1636,7 @@ msgid "workflow runs"
msgstr "ejecuciones de flujo de trabajo"
#: documents/serialisers.py:515 documents/serialisers.py:872
#: documents/serialisers.py:2902 documents/views.py:363 documents/views.py:2768
#: documents/serialisers.py:2902 documents/views.py:343 documents/views.py:2732
#: paperless_mail/serialisers.py:156
msgid "Insufficient permissions."
msgstr "Permisos insuficientes."
@@ -1676,7 +1676,7 @@ msgstr "Variable inválida."
msgid "Duplicate document identifiers are not allowed."
msgstr "No se permiten identificadores de documento duplicados."
#: documents/serialisers.py:2988 documents/views.py:4811
#: documents/serialisers.py:2988 documents/views.py:4787
#, python-format
msgid "Documents not found: %(ids)s"
msgstr "Documentos no encontrados: %(ids)s"
@@ -1913,44 +1913,59 @@ msgstr "Estás a punto de usar tu cuenta de %(provider_name)s para iniciar sesi
msgid "As a final step, please complete the following form:"
msgstr "Como último paso, por favor complete el siguiente formulario:"
#: documents/validators.py:24
#, python-brace-format
msgid "Unable to parse URI {value}, missing scheme"
msgstr "No se puede analizar la URI {value}, falta el esquema"
#: documents/validators.py:29
#, python-brace-format
msgid "Unable to parse URI {value}, missing net location or path"
msgstr "No se puede analizar la URI {value}, falta la ubicación de la red o la ruta"
#: documents/validators.py:36
msgid ", "
msgstr ""
msgid "URI scheme '{parts.scheme}' is not allowed. Allowed schemes: {', '.join(allowed_schemes)}"
msgstr "El esquema URI '{parts.scheme}' no está permitido. Esquemas permitidos: {', '.join(allowed_schemes)}"
#: documents/views.py:318
msgid "Specify only one of text, title_search, query, or more_like_id."
msgstr "Especifique solo uno entre text, title_search, query, o more_like_id."
#: documents/validators.py:45
#, python-brace-format
msgid "Unable to parse URI {value}"
msgstr "No se puede analizar la URI {value}"
#: documents/views.py:356 documents/views.py:2765
#: documents/views.py:336 documents/views.py:2729
msgid "Invalid more_like_id"
msgstr ""
#: documents/views.py:1703
#: documents/views.py:1676
msgid "Invalid AI configuration."
msgstr "Configuración de IA inválida."
#: documents/views.py:1714
#: documents/views.py:1687
msgid "AI backend request timed out."
msgstr ""
#: documents/views.py:1726
#: documents/views.py:1699
msgid "AI backend rejected the request. Check logs for details."
msgstr ""
#: documents/views.py:4827
#: documents/views.py:2554 documents/views.py:2870
msgid "Specify only one of text, title_search, query, or more_like_id."
msgstr "Especifique solo uno entre text, title_search, query, o more_like_id."
#: documents/views.py:4800
#, python-format
msgid "Insufficient permissions to share document %(id)s."
msgstr "Permisos insuficientes para compartir el documento %(id)s."
#: documents/views.py:4874
#: documents/views.py:4846
msgid "Bundle is already being processed."
msgstr "El paquete ya está siendo procesado."
#: documents/views.py:4938
#: documents/views.py:4910
msgid "The share link bundle is still being prepared. Please try again later."
msgstr "El paquete de enlace compartido aún está siendo preparado. Por favor, inténtalo de nuevo más tarde."
#: documents/views.py:4952
#: documents/views.py:4924
msgid "The share link bundle is unavailable."
msgstr "El paquete de enlace compartido no está disponible."
@@ -2242,151 +2257,151 @@ msgstr "Establece el tiempo de espera de LLM en segundos"
msgid "paperless application settings"
msgstr "Ajustes de la aplicación paperless"
#: paperless/settings/__init__.py:562
#: paperless/settings/__init__.py:561
msgid "English (US)"
msgstr "Inglés (US)"
#: paperless/settings/__init__.py:563
#: paperless/settings/__init__.py:562
msgid "Arabic"
msgstr "Árabe"
#: paperless/settings/__init__.py:564
#: paperless/settings/__init__.py:563
msgid "Afrikaans"
msgstr "Africano"
#: paperless/settings/__init__.py:565
#: paperless/settings/__init__.py:564
msgid "Belarusian"
msgstr "Bielorruso"
#: paperless/settings/__init__.py:566
#: paperless/settings/__init__.py:565
msgid "Bulgarian"
msgstr "Búlgaro"
#: paperless/settings/__init__.py:567
#: paperless/settings/__init__.py:566
msgid "Catalan"
msgstr "Catalán"
#: paperless/settings/__init__.py:568
#: paperless/settings/__init__.py:567
msgid "Czech"
msgstr "Checo"
#: paperless/settings/__init__.py:569
#: paperless/settings/__init__.py:568
msgid "Danish"
msgstr "Danés"
#: paperless/settings/__init__.py:570
#: paperless/settings/__init__.py:569
msgid "German"
msgstr "Alemán"
#: paperless/settings/__init__.py:571
#: paperless/settings/__init__.py:570
msgid "Greek"
msgstr "Griego"
#: paperless/settings/__init__.py:572
#: paperless/settings/__init__.py:571
msgid "English (GB)"
msgstr "Inglés (Gran Bretaña)"
#: paperless/settings/__init__.py:573
#: paperless/settings/__init__.py:572
msgid "Spanish"
msgstr "Español"
#: paperless/settings/__init__.py:574
#: paperless/settings/__init__.py:573
msgid "Persian"
msgstr "Persa"
#: paperless/settings/__init__.py:575
#: paperless/settings/__init__.py:574
msgid "Finnish"
msgstr "Finlandés"
#: paperless/settings/__init__.py:576
#: paperless/settings/__init__.py:575
msgid "French"
msgstr "Francés"
#: paperless/settings/__init__.py:577
#: paperless/settings/__init__.py:576
msgid "Hungarian"
msgstr "Húngaro"
#: paperless/settings/__init__.py:578
#: paperless/settings/__init__.py:577
msgid "Indonesian"
msgstr "Indonesio"
#: paperless/settings/__init__.py:579
#: paperless/settings/__init__.py:578
msgid "Italian"
msgstr "Italiano"
#: paperless/settings/__init__.py:580
#: paperless/settings/__init__.py:579
msgid "Japanese"
msgstr "Japonés"
#: paperless/settings/__init__.py:581
#: paperless/settings/__init__.py:580
msgid "Korean"
msgstr "Coreano"
#: paperless/settings/__init__.py:582
#: paperless/settings/__init__.py:581
msgid "Luxembourgish"
msgstr "Luxemburgués"
#: paperless/settings/__init__.py:583
#: paperless/settings/__init__.py:582
msgid "Norwegian"
msgstr "Noruego"
#: paperless/settings/__init__.py:584
#: paperless/settings/__init__.py:583
msgid "Dutch"
msgstr "Alemán"
#: paperless/settings/__init__.py:585
#: paperless/settings/__init__.py:584
msgid "Polish"
msgstr "Polaco"
#: paperless/settings/__init__.py:586
#: paperless/settings/__init__.py:585
msgid "Portuguese (Brazil)"
msgstr "Portugués (Brasil)"
#: paperless/settings/__init__.py:587
#: paperless/settings/__init__.py:586
msgid "Portuguese"
msgstr "Portugués"
#: paperless/settings/__init__.py:588
#: paperless/settings/__init__.py:587
msgid "Romanian"
msgstr "Rumano"
#: paperless/settings/__init__.py:589
#: paperless/settings/__init__.py:588
msgid "Russian"
msgstr "Ruso"
#: paperless/settings/__init__.py:590
#: paperless/settings/__init__.py:589
msgid "Slovak"
msgstr "Eslovaco"
#: paperless/settings/__init__.py:591
#: paperless/settings/__init__.py:590
msgid "Slovenian"
msgstr "Esloveno"
#: paperless/settings/__init__.py:592
#: paperless/settings/__init__.py:591
msgid "Serbian"
msgstr "Serbio"
#: paperless/settings/__init__.py:593
#: paperless/settings/__init__.py:592
msgid "Swedish"
msgstr "Sueco"
#: paperless/settings/__init__.py:594
#: paperless/settings/__init__.py:593
msgid "Turkish"
msgstr "Turco"
#: paperless/settings/__init__.py:595
#: paperless/settings/__init__.py:594
msgid "Ukrainian"
msgstr "Ucraniano"
#: paperless/settings/__init__.py:596
#: paperless/settings/__init__.py:595
msgid "Vietnamese"
msgstr "Vietnamita"
#: paperless/settings/__init__.py:597
#: paperless/settings/__init__.py:596
msgid "Chinese Simplified"
msgstr "Chino simplificado"
#: paperless/settings/__init__.py:598
#: paperless/settings/__init__.py:597
msgid "Chinese Traditional"
msgstr "Chino tradicional"
+76 -61
View File
@@ -2,8 +2,8 @@ msgid ""
msgstr ""
"Project-Id-Version: paperless-ngx\n"
"Report-Msgid-Bugs-To: \n"
"POT-Creation-Date: 2026-10-14 15:18+0000\n"
"PO-Revision-Date: 2026-10-14 15:19\n"
"POT-Creation-Date: 2026-10-05 16:26+0000\n"
"PO-Revision-Date: 2026-10-05 16:27\n"
"Last-Translator: \n"
"Language-Team: Estonian\n"
"Language: et_EE\n"
@@ -21,39 +21,39 @@ msgstr ""
msgid "Documents"
msgstr "Dokumendid"
#: documents/filters.py:464
#: documents/filters.py:463
msgid "Value must be valid JSON."
msgstr "Väärtus peab olema lubatav JSON."
#: documents/filters.py:483
#: documents/filters.py:482
msgid "Invalid custom field query expression"
msgstr "Vigane kohandatud välja päringu avaldis"
#: documents/filters.py:493
#: documents/filters.py:492
msgid "Invalid expression list. Must be nonempty."
msgstr "Vigane avaldiste loend. Peab olema mittetühi."
#: documents/filters.py:514
#: documents/filters.py:513
msgid "Invalid logical operator {op!r}"
msgstr "Vigane loogikaoperaator {op!r}"
#: documents/filters.py:528
#: documents/filters.py:527
msgid "Maximum number of query conditions exceeded."
msgstr "Päringutingimuste suurim hulk on ületatud."
#: documents/filters.py:592
#: documents/filters.py:591
msgid "{name!r} is not a valid custom field."
msgstr "{name!r} ei ole lubatud kohandatud väli."
#: documents/filters.py:629
#: documents/filters.py:628
msgid "{data_type} does not support query expr {expr!r}."
msgstr "{data_type} ei toeta päringu avaldist {expr!r}."
#: documents/filters.py:748 documents/models.py:137
#: documents/filters.py:747 documents/models.py:137
msgid "Maximum nesting depth exceeded."
msgstr "Suurim pesastamis sügavus ületatud."
#: documents/filters.py:1125
#: documents/filters.py:1109
msgid "Custom field not found"
msgstr "Kohandatud välja ei leitud"
@@ -1636,7 +1636,7 @@ msgid "workflow runs"
msgstr ""
#: documents/serialisers.py:515 documents/serialisers.py:872
#: documents/serialisers.py:2902 documents/views.py:363 documents/views.py:2768
#: documents/serialisers.py:2902 documents/views.py:343 documents/views.py:2732
#: paperless_mail/serialisers.py:156
msgid "Insufficient permissions."
msgstr ""
@@ -1676,7 +1676,7 @@ msgstr ""
msgid "Duplicate document identifiers are not allowed."
msgstr ""
#: documents/serialisers.py:2988 documents/views.py:4811
#: documents/serialisers.py:2988 documents/views.py:4787
#, python-format
msgid "Documents not found: %(ids)s"
msgstr ""
@@ -1912,44 +1912,59 @@ msgstr ""
msgid "As a final step, please complete the following form:"
msgstr ""
#: documents/validators.py:24
#, python-brace-format
msgid "Unable to parse URI {value}, missing scheme"
msgstr ""
#: documents/validators.py:29
#, python-brace-format
msgid "Unable to parse URI {value}, missing net location or path"
msgstr ""
#: documents/validators.py:36
msgid ", "
msgid "URI scheme '{parts.scheme}' is not allowed. Allowed schemes: {', '.join(allowed_schemes)}"
msgstr ""
#: documents/views.py:318
msgid "Specify only one of text, title_search, query, or more_like_id."
#: documents/validators.py:45
#, python-brace-format
msgid "Unable to parse URI {value}"
msgstr ""
#: documents/views.py:356 documents/views.py:2765
#: documents/views.py:336 documents/views.py:2729
msgid "Invalid more_like_id"
msgstr ""
#: documents/views.py:1703
#: documents/views.py:1676
msgid "Invalid AI configuration."
msgstr ""
#: documents/views.py:1714
#: documents/views.py:1687
msgid "AI backend request timed out."
msgstr ""
#: documents/views.py:1726
#: documents/views.py:1699
msgid "AI backend rejected the request. Check logs for details."
msgstr ""
#: documents/views.py:4827
#: documents/views.py:2554 documents/views.py:2870
msgid "Specify only one of text, title_search, query, or more_like_id."
msgstr ""
#: documents/views.py:4800
#, python-format
msgid "Insufficient permissions to share document %(id)s."
msgstr ""
#: documents/views.py:4874
#: documents/views.py:4846
msgid "Bundle is already being processed."
msgstr ""
#: documents/views.py:4938
#: documents/views.py:4910
msgid "The share link bundle is still being prepared. Please try again later."
msgstr ""
#: documents/views.py:4952
#: documents/views.py:4924
msgid "The share link bundle is unavailable."
msgstr ""
@@ -2241,151 +2256,151 @@ msgstr ""
msgid "paperless application settings"
msgstr ""
#: paperless/settings/__init__.py:562
#: paperless/settings/__init__.py:561
msgid "English (US)"
msgstr ""
#: paperless/settings/__init__.py:563
#: paperless/settings/__init__.py:562
msgid "Arabic"
msgstr ""
#: paperless/settings/__init__.py:564
#: paperless/settings/__init__.py:563
msgid "Afrikaans"
msgstr ""
#: paperless/settings/__init__.py:565
#: paperless/settings/__init__.py:564
msgid "Belarusian"
msgstr ""
#: paperless/settings/__init__.py:566
#: paperless/settings/__init__.py:565
msgid "Bulgarian"
msgstr ""
#: paperless/settings/__init__.py:567
#: paperless/settings/__init__.py:566
msgid "Catalan"
msgstr ""
#: paperless/settings/__init__.py:568
#: paperless/settings/__init__.py:567
msgid "Czech"
msgstr ""
#: paperless/settings/__init__.py:569
#: paperless/settings/__init__.py:568
msgid "Danish"
msgstr ""
#: paperless/settings/__init__.py:570
#: paperless/settings/__init__.py:569
msgid "German"
msgstr ""
#: paperless/settings/__init__.py:571
#: paperless/settings/__init__.py:570
msgid "Greek"
msgstr ""
#: paperless/settings/__init__.py:572
#: paperless/settings/__init__.py:571
msgid "English (GB)"
msgstr ""
#: paperless/settings/__init__.py:573
#: paperless/settings/__init__.py:572
msgid "Spanish"
msgstr ""
#: paperless/settings/__init__.py:574
#: paperless/settings/__init__.py:573
msgid "Persian"
msgstr ""
#: paperless/settings/__init__.py:575
#: paperless/settings/__init__.py:574
msgid "Finnish"
msgstr ""
#: paperless/settings/__init__.py:576
#: paperless/settings/__init__.py:575
msgid "French"
msgstr ""
#: paperless/settings/__init__.py:577
#: paperless/settings/__init__.py:576
msgid "Hungarian"
msgstr ""
#: paperless/settings/__init__.py:578
#: paperless/settings/__init__.py:577
msgid "Indonesian"
msgstr ""
#: paperless/settings/__init__.py:579
#: paperless/settings/__init__.py:578
msgid "Italian"
msgstr ""
#: paperless/settings/__init__.py:580
#: paperless/settings/__init__.py:579
msgid "Japanese"
msgstr ""
#: paperless/settings/__init__.py:581
#: paperless/settings/__init__.py:580
msgid "Korean"
msgstr ""
#: paperless/settings/__init__.py:582
#: paperless/settings/__init__.py:581
msgid "Luxembourgish"
msgstr ""
#: paperless/settings/__init__.py:583
#: paperless/settings/__init__.py:582
msgid "Norwegian"
msgstr ""
#: paperless/settings/__init__.py:584
#: paperless/settings/__init__.py:583
msgid "Dutch"
msgstr ""
#: paperless/settings/__init__.py:585
#: paperless/settings/__init__.py:584
msgid "Polish"
msgstr ""
#: paperless/settings/__init__.py:586
#: paperless/settings/__init__.py:585
msgid "Portuguese (Brazil)"
msgstr ""
#: paperless/settings/__init__.py:587
#: paperless/settings/__init__.py:586
msgid "Portuguese"
msgstr ""
#: paperless/settings/__init__.py:588
#: paperless/settings/__init__.py:587
msgid "Romanian"
msgstr ""
#: paperless/settings/__init__.py:589
#: paperless/settings/__init__.py:588
msgid "Russian"
msgstr ""
#: paperless/settings/__init__.py:590
#: paperless/settings/__init__.py:589
msgid "Slovak"
msgstr ""
#: paperless/settings/__init__.py:591
#: paperless/settings/__init__.py:590
msgid "Slovenian"
msgstr ""
#: paperless/settings/__init__.py:592
#: paperless/settings/__init__.py:591
msgid "Serbian"
msgstr ""
#: paperless/settings/__init__.py:593
#: paperless/settings/__init__.py:592
msgid "Swedish"
msgstr ""
#: paperless/settings/__init__.py:594
#: paperless/settings/__init__.py:593
msgid "Turkish"
msgstr ""
#: paperless/settings/__init__.py:595
#: paperless/settings/__init__.py:594
msgid "Ukrainian"
msgstr ""
#: paperless/settings/__init__.py:596
#: paperless/settings/__init__.py:595
msgid "Vietnamese"
msgstr ""
#: paperless/settings/__init__.py:597
#: paperless/settings/__init__.py:596
msgid "Chinese Simplified"
msgstr ""
#: paperless/settings/__init__.py:598
#: paperless/settings/__init__.py:597
msgid "Chinese Traditional"
msgstr ""
+76 -61
View File
@@ -2,8 +2,8 @@ msgid ""
msgstr ""
"Project-Id-Version: paperless-ngx\n"
"Report-Msgid-Bugs-To: \n"
"POT-Creation-Date: 2026-10-14 15:18+0000\n"
"PO-Revision-Date: 2026-10-14 15:19\n"
"POT-Creation-Date: 2026-10-05 16:26+0000\n"
"PO-Revision-Date: 2026-10-05 16:27\n"
"Last-Translator: \n"
"Language-Team: Persian\n"
"Language: fa_IR\n"
@@ -21,39 +21,39 @@ msgstr ""
msgid "Documents"
msgstr "اسناد و مدارک"
#: documents/filters.py:464
#: documents/filters.py:463
msgid "Value must be valid JSON."
msgstr "مقدار باید JSON معتبر باشد."
#: documents/filters.py:483
#: documents/filters.py:482
msgid "Invalid custom field query expression"
msgstr "Invalid custom field query expression"
#: documents/filters.py:493
#: documents/filters.py:492
msgid "Invalid expression list. Must be nonempty."
msgstr "لیست عبارت‌ها نامعتبر است. نباید خالی باشد."
#: documents/filters.py:514
#: documents/filters.py:513
msgid "Invalid logical operator {op!r}"
msgstr ""
#: documents/filters.py:528
#: documents/filters.py:527
msgid "Maximum number of query conditions exceeded."
msgstr "حداکثر تعداد شرایط پرس و جو از آن فراتر رفته است."
#: documents/filters.py:592
#: documents/filters.py:591
msgid "{name!r} is not a valid custom field."
msgstr "{نام! R} یک زمینه سفارشی معتبر نیست."
#: documents/filters.py:629
#: documents/filters.py:628
msgid "{data_type} does not support query expr {expr!r}."
msgstr ""
#: documents/filters.py:748 documents/models.py:137
#: documents/filters.py:747 documents/models.py:137
msgid "Maximum nesting depth exceeded."
msgstr "حداکثر عمق تودرتویی بیش از حد مجاز است."
#: documents/filters.py:1125
#: documents/filters.py:1109
msgid "Custom field not found"
msgstr "زمینه سفارشی یافت نشد"
@@ -1636,7 +1636,7 @@ msgid "workflow runs"
msgstr "گردش کار اجرا می شود"
#: documents/serialisers.py:515 documents/serialisers.py:872
#: documents/serialisers.py:2902 documents/views.py:363 documents/views.py:2768
#: documents/serialisers.py:2902 documents/views.py:343 documents/views.py:2732
#: paperless_mail/serialisers.py:156
msgid "Insufficient permissions."
msgstr ""
@@ -1676,7 +1676,7 @@ msgstr "متغیر نامعتبر شناسایی شده است."
msgid "Duplicate document identifiers are not allowed."
msgstr ""
#: documents/serialisers.py:2988 documents/views.py:4811
#: documents/serialisers.py:2988 documents/views.py:4787
#, python-format
msgid "Documents not found: %(ids)s"
msgstr ""
@@ -1912,44 +1912,59 @@ msgstr ""
msgid "As a final step, please complete the following form:"
msgstr "به عنوان مرحله آخر ، لطفاً فرم زیر را تکمیل کنید:"
#: documents/validators.py:24
#, python-brace-format
msgid "Unable to parse URI {value}, missing scheme"
msgstr ""
#: documents/validators.py:29
#, python-brace-format
msgid "Unable to parse URI {value}, missing net location or path"
msgstr ""
#: documents/validators.py:36
msgid ", "
msgid "URI scheme '{parts.scheme}' is not allowed. Allowed schemes: {', '.join(allowed_schemes)}"
msgstr ""
#: documents/views.py:318
msgid "Specify only one of text, title_search, query, or more_like_id."
#: documents/validators.py:45
#, python-brace-format
msgid "Unable to parse URI {value}"
msgstr ""
#: documents/views.py:356 documents/views.py:2765
#: documents/views.py:336 documents/views.py:2729
msgid "Invalid more_like_id"
msgstr ""
#: documents/views.py:1703
#: documents/views.py:1676
msgid "Invalid AI configuration."
msgstr ""
#: documents/views.py:1714
#: documents/views.py:1687
msgid "AI backend request timed out."
msgstr ""
#: documents/views.py:1726
#: documents/views.py:1699
msgid "AI backend rejected the request. Check logs for details."
msgstr ""
#: documents/views.py:4827
#: documents/views.py:2554 documents/views.py:2870
msgid "Specify only one of text, title_search, query, or more_like_id."
msgstr ""
#: documents/views.py:4800
#, python-format
msgid "Insufficient permissions to share document %(id)s."
msgstr ""
#: documents/views.py:4874
#: documents/views.py:4846
msgid "Bundle is already being processed."
msgstr ""
#: documents/views.py:4938
#: documents/views.py:4910
msgid "The share link bundle is still being prepared. Please try again later."
msgstr ""
#: documents/views.py:4952
#: documents/views.py:4924
msgid "The share link bundle is unavailable."
msgstr ""
@@ -2241,151 +2256,151 @@ msgstr ""
msgid "paperless application settings"
msgstr "تنظیمات برنامه بدون کاغذ"
#: paperless/settings/__init__.py:562
#: paperless/settings/__init__.py:561
msgid "English (US)"
msgstr "انگلیسی (ایالات متحده)"
#: paperless/settings/__init__.py:563
#: paperless/settings/__init__.py:562
msgid "Arabic"
msgstr "عربی"
#: paperless/settings/__init__.py:564
#: paperless/settings/__init__.py:563
msgid "Afrikaans"
msgstr "افریکان"
#: paperless/settings/__init__.py:565
#: paperless/settings/__init__.py:564
msgid "Belarusian"
msgstr "وابسته به بلروس"
#: paperless/settings/__init__.py:566
#: paperless/settings/__init__.py:565
msgid "Bulgarian"
msgstr "وابسته به بلغاری"
#: paperless/settings/__init__.py:567
#: paperless/settings/__init__.py:566
msgid "Catalan"
msgstr "کاتالان"
#: paperless/settings/__init__.py:568
#: paperless/settings/__init__.py:567
msgid "Czech"
msgstr "وابسته به چک"
#: paperless/settings/__init__.py:569
#: paperless/settings/__init__.py:568
msgid "Danish"
msgstr "وابسته به دانمارکی"
#: paperless/settings/__init__.py:570
#: paperless/settings/__init__.py:569
msgid "German"
msgstr "آلمانی"
#: paperless/settings/__init__.py:571
#: paperless/settings/__init__.py:570
msgid "Greek"
msgstr "یونانی"
#: paperless/settings/__init__.py:572
#: paperless/settings/__init__.py:571
msgid "English (GB)"
msgstr "انگلیسی (GB)"
#: paperless/settings/__init__.py:573
#: paperless/settings/__init__.py:572
msgid "Spanish"
msgstr "اسپانیایی"
#: paperless/settings/__init__.py:574
#: paperless/settings/__init__.py:573
msgid "Persian"
msgstr "فارسی"
#: paperless/settings/__init__.py:575
#: paperless/settings/__init__.py:574
msgid "Finnish"
msgstr "فنلاندی"
#: paperless/settings/__init__.py:576
#: paperless/settings/__init__.py:575
msgid "French"
msgstr "فرانسوی"
#: paperless/settings/__init__.py:577
#: paperless/settings/__init__.py:576
msgid "Hungarian"
msgstr "مجارستانی"
#: paperless/settings/__init__.py:578
#: paperless/settings/__init__.py:577
msgid "Indonesian"
msgstr ""
#: paperless/settings/__init__.py:579
#: paperless/settings/__init__.py:578
msgid "Italian"
msgstr "ایتالیایی"
#: paperless/settings/__init__.py:580
#: paperless/settings/__init__.py:579
msgid "Japanese"
msgstr "وابسته به ژاپنی"
#: paperless/settings/__init__.py:581
#: paperless/settings/__init__.py:580
msgid "Korean"
msgstr "کره ای"
#: paperless/settings/__init__.py:582
#: paperless/settings/__init__.py:581
msgid "Luxembourgish"
msgstr "وابسته به لوکس"
#: paperless/settings/__init__.py:583
#: paperless/settings/__init__.py:582
msgid "Norwegian"
msgstr "نروژی"
#: paperless/settings/__init__.py:584
#: paperless/settings/__init__.py:583
msgid "Dutch"
msgstr "هلندی"
#: paperless/settings/__init__.py:585
#: paperless/settings/__init__.py:584
msgid "Polish"
msgstr "صیقل دادن"
#: paperless/settings/__init__.py:586
#: paperless/settings/__init__.py:585
msgid "Portuguese (Brazil)"
msgstr "پرتغالی (برزیل)"
#: paperless/settings/__init__.py:587
#: paperless/settings/__init__.py:586
msgid "Portuguese"
msgstr "وابسته به پرتغالی"
#: paperless/settings/__init__.py:588
#: paperless/settings/__init__.py:587
msgid "Romanian"
msgstr "وابسته به رومانی"
#: paperless/settings/__init__.py:589
#: paperless/settings/__init__.py:588
msgid "Russian"
msgstr "روسی"
#: paperless/settings/__init__.py:590
#: paperless/settings/__init__.py:589
msgid "Slovak"
msgstr "لگن"
#: paperless/settings/__init__.py:591
#: paperless/settings/__init__.py:590
msgid "Slovenian"
msgstr "وابسته به اسلوونی"
#: paperless/settings/__init__.py:592
#: paperless/settings/__init__.py:591
msgid "Serbian"
msgstr "صرب"
#: paperless/settings/__init__.py:593
#: paperless/settings/__init__.py:592
msgid "Swedish"
msgstr "سوئدی"
#: paperless/settings/__init__.py:594
#: paperless/settings/__init__.py:593
msgid "Turkish"
msgstr "ترکی"
#: paperless/settings/__init__.py:595
#: paperless/settings/__init__.py:594
msgid "Ukrainian"
msgstr "وابسته به اوکراینی"
#: paperless/settings/__init__.py:596
#: paperless/settings/__init__.py:595
msgid "Vietnamese"
msgstr ""
#: paperless/settings/__init__.py:597
#: paperless/settings/__init__.py:596
msgid "Chinese Simplified"
msgstr "چینی ساده شد"
#: paperless/settings/__init__.py:598
#: paperless/settings/__init__.py:597
msgid "Chinese Traditional"
msgstr "چینی سنتی"
+76 -61
View File
@@ -2,8 +2,8 @@ msgid ""
msgstr ""
"Project-Id-Version: paperless-ngx\n"
"Report-Msgid-Bugs-To: \n"
"POT-Creation-Date: 2026-10-14 15:18+0000\n"
"PO-Revision-Date: 2026-10-14 15:19\n"
"POT-Creation-Date: 2026-10-05 16:26+0000\n"
"PO-Revision-Date: 2026-10-05 16:27\n"
"Last-Translator: \n"
"Language-Team: Finnish\n"
"Language: fi_FI\n"
@@ -21,39 +21,39 @@ msgstr ""
msgid "Documents"
msgstr "Asiakirjat"
#: documents/filters.py:464
#: documents/filters.py:463
msgid "Value must be valid JSON."
msgstr "Arvon on oltava kelvollista JSON:ia."
#: documents/filters.py:483
#: documents/filters.py:482
msgid "Invalid custom field query expression"
msgstr ""
#: documents/filters.py:493
#: documents/filters.py:492
msgid "Invalid expression list. Must be nonempty."
msgstr ""
#: documents/filters.py:514
#: documents/filters.py:513
msgid "Invalid logical operator {op!r}"
msgstr ""
#: documents/filters.py:528
#: documents/filters.py:527
msgid "Maximum number of query conditions exceeded."
msgstr ""
#: documents/filters.py:592
#: documents/filters.py:591
msgid "{name!r} is not a valid custom field."
msgstr ""
#: documents/filters.py:629
#: documents/filters.py:628
msgid "{data_type} does not support query expr {expr!r}."
msgstr ""
#: documents/filters.py:748 documents/models.py:137
#: documents/filters.py:747 documents/models.py:137
msgid "Maximum nesting depth exceeded."
msgstr ""
#: documents/filters.py:1125
#: documents/filters.py:1109
msgid "Custom field not found"
msgstr ""
@@ -1636,7 +1636,7 @@ msgid "workflow runs"
msgstr ""
#: documents/serialisers.py:515 documents/serialisers.py:872
#: documents/serialisers.py:2902 documents/views.py:363 documents/views.py:2768
#: documents/serialisers.py:2902 documents/views.py:343 documents/views.py:2732
#: paperless_mail/serialisers.py:156
msgid "Insufficient permissions."
msgstr ""
@@ -1676,7 +1676,7 @@ msgstr "Virheellinen muuttuja havaittu."
msgid "Duplicate document identifiers are not allowed."
msgstr ""
#: documents/serialisers.py:2988 documents/views.py:4811
#: documents/serialisers.py:2988 documents/views.py:4787
#, python-format
msgid "Documents not found: %(ids)s"
msgstr ""
@@ -1913,44 +1913,59 @@ msgstr ""
msgid "As a final step, please complete the following form:"
msgstr ""
#: documents/validators.py:24
#, python-brace-format
msgid "Unable to parse URI {value}, missing scheme"
msgstr ""
#: documents/validators.py:29
#, python-brace-format
msgid "Unable to parse URI {value}, missing net location or path"
msgstr ""
#: documents/validators.py:36
msgid ", "
msgid "URI scheme '{parts.scheme}' is not allowed. Allowed schemes: {', '.join(allowed_schemes)}"
msgstr ""
#: documents/views.py:318
msgid "Specify only one of text, title_search, query, or more_like_id."
#: documents/validators.py:45
#, python-brace-format
msgid "Unable to parse URI {value}"
msgstr ""
#: documents/views.py:356 documents/views.py:2765
#: documents/views.py:336 documents/views.py:2729
msgid "Invalid more_like_id"
msgstr ""
#: documents/views.py:1703
#: documents/views.py:1676
msgid "Invalid AI configuration."
msgstr ""
#: documents/views.py:1714
#: documents/views.py:1687
msgid "AI backend request timed out."
msgstr ""
#: documents/views.py:1726
#: documents/views.py:1699
msgid "AI backend rejected the request. Check logs for details."
msgstr ""
#: documents/views.py:4827
#: documents/views.py:2554 documents/views.py:2870
msgid "Specify only one of text, title_search, query, or more_like_id."
msgstr ""
#: documents/views.py:4800
#, python-format
msgid "Insufficient permissions to share document %(id)s."
msgstr ""
#: documents/views.py:4874
#: documents/views.py:4846
msgid "Bundle is already being processed."
msgstr ""
#: documents/views.py:4938
#: documents/views.py:4910
msgid "The share link bundle is still being prepared. Please try again later."
msgstr ""
#: documents/views.py:4952
#: documents/views.py:4924
msgid "The share link bundle is unavailable."
msgstr ""
@@ -2242,151 +2257,151 @@ msgstr ""
msgid "paperless application settings"
msgstr ""
#: paperless/settings/__init__.py:562
#: paperless/settings/__init__.py:561
msgid "English (US)"
msgstr "Englanti (US)"
#: paperless/settings/__init__.py:563
#: paperless/settings/__init__.py:562
msgid "Arabic"
msgstr "Arabialainen"
#: paperless/settings/__init__.py:564
#: paperless/settings/__init__.py:563
msgid "Afrikaans"
msgstr ""
#: paperless/settings/__init__.py:565
#: paperless/settings/__init__.py:564
msgid "Belarusian"
msgstr "valkovenäjä"
#: paperless/settings/__init__.py:566
#: paperless/settings/__init__.py:565
msgid "Bulgarian"
msgstr ""
#: paperless/settings/__init__.py:567
#: paperless/settings/__init__.py:566
msgid "Catalan"
msgstr "Katalaani"
#: paperless/settings/__init__.py:568
#: paperless/settings/__init__.py:567
msgid "Czech"
msgstr "Tšekki"
#: paperless/settings/__init__.py:569
#: paperless/settings/__init__.py:568
msgid "Danish"
msgstr "Tanska"
#: paperless/settings/__init__.py:570
#: paperless/settings/__init__.py:569
msgid "German"
msgstr "Saksa"
#: paperless/settings/__init__.py:571
#: paperless/settings/__init__.py:570
msgid "Greek"
msgstr "Kreikka"
#: paperless/settings/__init__.py:572
#: paperless/settings/__init__.py:571
msgid "English (GB)"
msgstr "Englanti (US)"
#: paperless/settings/__init__.py:573
#: paperless/settings/__init__.py:572
msgid "Spanish"
msgstr "Espanja"
#: paperless/settings/__init__.py:574
#: paperless/settings/__init__.py:573
msgid "Persian"
msgstr ""
#: paperless/settings/__init__.py:575
#: paperless/settings/__init__.py:574
msgid "Finnish"
msgstr "Suomi"
#: paperless/settings/__init__.py:576
#: paperless/settings/__init__.py:575
msgid "French"
msgstr "Ranska"
#: paperless/settings/__init__.py:577
#: paperless/settings/__init__.py:576
msgid "Hungarian"
msgstr ""
#: paperless/settings/__init__.py:578
#: paperless/settings/__init__.py:577
msgid "Indonesian"
msgstr ""
#: paperless/settings/__init__.py:579
#: paperless/settings/__init__.py:578
msgid "Italian"
msgstr "Italia"
#: paperless/settings/__init__.py:580
#: paperless/settings/__init__.py:579
msgid "Japanese"
msgstr ""
#: paperless/settings/__init__.py:581
#: paperless/settings/__init__.py:580
msgid "Korean"
msgstr ""
#: paperless/settings/__init__.py:582
#: paperless/settings/__init__.py:581
msgid "Luxembourgish"
msgstr "Luxemburg"
#: paperless/settings/__init__.py:583
#: paperless/settings/__init__.py:582
msgid "Norwegian"
msgstr "Norja"
#: paperless/settings/__init__.py:584
#: paperless/settings/__init__.py:583
msgid "Dutch"
msgstr "Hollanti"
#: paperless/settings/__init__.py:585
#: paperless/settings/__init__.py:584
msgid "Polish"
msgstr "puola"
#: paperless/settings/__init__.py:586
#: paperless/settings/__init__.py:585
msgid "Portuguese (Brazil)"
msgstr "portugali (Brasilia)"
#: paperless/settings/__init__.py:587
#: paperless/settings/__init__.py:586
msgid "Portuguese"
msgstr "portugali"
#: paperless/settings/__init__.py:588
#: paperless/settings/__init__.py:587
msgid "Romanian"
msgstr "romania"
#: paperless/settings/__init__.py:589
#: paperless/settings/__init__.py:588
msgid "Russian"
msgstr "venäjä"
#: paperless/settings/__init__.py:590
#: paperless/settings/__init__.py:589
msgid "Slovak"
msgstr "Slovakia"
#: paperless/settings/__init__.py:591
#: paperless/settings/__init__.py:590
msgid "Slovenian"
msgstr "Slovenia"
#: paperless/settings/__init__.py:592
#: paperless/settings/__init__.py:591
msgid "Serbian"
msgstr "Serbia"
#: paperless/settings/__init__.py:593
#: paperless/settings/__init__.py:592
msgid "Swedish"
msgstr "ruotsi"
#: paperless/settings/__init__.py:594
#: paperless/settings/__init__.py:593
msgid "Turkish"
msgstr "Turkki"
#: paperless/settings/__init__.py:595
#: paperless/settings/__init__.py:594
msgid "Ukrainian"
msgstr "Ukraina"
#: paperless/settings/__init__.py:596
#: paperless/settings/__init__.py:595
msgid "Vietnamese"
msgstr ""
#: paperless/settings/__init__.py:597
#: paperless/settings/__init__.py:596
msgid "Chinese Simplified"
msgstr "Kiina (yksinkertaistettu)"
#: paperless/settings/__init__.py:598
#: paperless/settings/__init__.py:597
msgid "Chinese Traditional"
msgstr ""
+78 -63
View File
@@ -2,8 +2,8 @@ msgid ""
msgstr ""
"Project-Id-Version: paperless-ngx\n"
"Report-Msgid-Bugs-To: \n"
"POT-Creation-Date: 2026-10-14 15:18+0000\n"
"PO-Revision-Date: 2026-10-14 15:19\n"
"POT-Creation-Date: 2026-10-05 16:26+0000\n"
"PO-Revision-Date: 2026-10-05 16:27\n"
"Last-Translator: \n"
"Language-Team: French\n"
"Language: fr_FR\n"
@@ -21,39 +21,39 @@ msgstr ""
msgid "Documents"
msgstr "Documents"
#: documents/filters.py:464
#: documents/filters.py:463
msgid "Value must be valid JSON."
msgstr "La valeur doit être un JSON valide."
#: documents/filters.py:483
#: documents/filters.py:482
msgid "Invalid custom field query expression"
msgstr "Requête de champ personnalisé invalide"
#: documents/filters.py:493
#: documents/filters.py:492
msgid "Invalid expression list. Must be nonempty."
msgstr "Liste d'expressions invalide. Doit être non vide."
#: documents/filters.py:514
#: documents/filters.py:513
msgid "Invalid logical operator {op!r}"
msgstr "Opérateur logique {op!r} invalide"
#: documents/filters.py:528
#: documents/filters.py:527
msgid "Maximum number of query conditions exceeded."
msgstr "Nombre maximum de conditions dans la requête dépassé."
#: documents/filters.py:592
#: documents/filters.py:591
msgid "{name!r} is not a valid custom field."
msgstr "{name!r} n'est pas un champ personnalisé valide."
#: documents/filters.py:629
#: documents/filters.py:628
msgid "{data_type} does not support query expr {expr!r}."
msgstr "{data_type} ne supporte pas l'expression {expr!r}."
#: documents/filters.py:748 documents/models.py:137
#: documents/filters.py:747 documents/models.py:137
msgid "Maximum nesting depth exceeded."
msgstr "Profondeur de récursion maximale dépassée."
#: documents/filters.py:1125
#: documents/filters.py:1109
msgid "Custom field not found"
msgstr "Champ personnalisé non trouvé"
@@ -1636,7 +1636,7 @@ msgid "workflow runs"
msgstr "le flux de travail s'exécute"
#: documents/serialisers.py:515 documents/serialisers.py:872
#: documents/serialisers.py:2902 documents/views.py:363 documents/views.py:2768
#: documents/serialisers.py:2902 documents/views.py:343 documents/views.py:2732
#: paperless_mail/serialisers.py:156
msgid "Insufficient permissions."
msgstr "Droits insuffisants."
@@ -1676,7 +1676,7 @@ msgstr "Variable invalide détectée."
msgid "Duplicate document identifiers are not allowed."
msgstr "Les identificateurs de document en double ne sont pas autorisés."
#: documents/serialisers.py:2988 documents/views.py:4811
#: documents/serialisers.py:2988 documents/views.py:4787
#, python-format
msgid "Documents not found: %(ids)s"
msgstr "Documents introuvables : %(ids)s"
@@ -1912,44 +1912,59 @@ msgstr "Vous vous apprêtez à utiliser votre compte %(provider_name)s pour vous
msgid "As a final step, please complete the following form:"
msgstr "Pour finir, veuillez remplir le formulaire suivant :"
#: documents/validators.py:24
#, python-brace-format
msgid "Unable to parse URI {value}, missing scheme"
msgstr "Impossible d'analyser l'URI {value}, schéma manquant"
#: documents/validators.py:29
#, python-brace-format
msgid "Unable to parse URI {value}, missing net location or path"
msgstr "Impossible d'analyser l'URI {value}, emplacement réseau ou chemin manquant"
#: documents/validators.py:36
msgid ", "
msgstr ""
msgid "URI scheme '{parts.scheme}' is not allowed. Allowed schemes: {', '.join(allowed_schemes)}"
msgstr "Le schéma d'URI « {parts.scheme} » n'est pas autorisé. Schémas autorisés : {', '.join(allowed_schemes)}"
#: documents/views.py:318
msgid "Specify only one of text, title_search, query, or more_like_id."
msgstr "Spécifiez seulement un texte, titre, recherche ou more_like_id."
#: documents/validators.py:45
#, python-brace-format
msgid "Unable to parse URI {value}"
msgstr "Impossible d'analyser l'URI {value}"
#: documents/views.py:356 documents/views.py:2765
#: documents/views.py:336 documents/views.py:2729
msgid "Invalid more_like_id"
msgstr "More_like_id invalide"
#: documents/views.py:1703
#: documents/views.py:1676
msgid "Invalid AI configuration."
msgstr "Configuration IA invalide."
#: documents/views.py:1714
#: documents/views.py:1687
msgid "AI backend request timed out."
msgstr "La requête d'arrière-plan IA a expiré."
#: documents/views.py:1726
#: documents/views.py:1699
msgid "AI backend rejected the request. Check logs for details."
msgstr ""
#: documents/views.py:4827
#: documents/views.py:2554 documents/views.py:2870
msgid "Specify only one of text, title_search, query, or more_like_id."
msgstr "Spécifiez seulement un texte, titre, recherche ou more_like_id."
#: documents/views.py:4800
#, python-format
msgid "Insufficient permissions to share document %(id)s."
msgstr "Droits d'accès insuffisant pour partager %(id)s document."
#: documents/views.py:4874
#: documents/views.py:4846
msgid "Bundle is already being processed."
msgstr "Le paquet est déjà en cours de traitement."
#: documents/views.py:4938
#: documents/views.py:4910
msgid "The share link bundle is still being prepared. Please try again later."
msgstr "Le lot de liens de partage est en cours de préparation. Veuillez réessayer plus tard."
#: documents/views.py:4952
#: documents/views.py:4924
msgid "The share link bundle is unavailable."
msgstr "Le lot de liens de partage n'est pas disponible."
@@ -2241,151 +2256,151 @@ msgstr "Définit le délai d'attente du LLM en secondes"
msgid "paperless application settings"
msgstr "paramètres de l'application paperless"
#: paperless/settings/__init__.py:562
#: paperless/settings/__init__.py:561
msgid "English (US)"
msgstr "Anglais (US)"
#: paperless/settings/__init__.py:563
#: paperless/settings/__init__.py:562
msgid "Arabic"
msgstr "Arabe"
#: paperless/settings/__init__.py:564
#: paperless/settings/__init__.py:563
msgid "Afrikaans"
msgstr "Afrikaans"
#: paperless/settings/__init__.py:565
#: paperless/settings/__init__.py:564
msgid "Belarusian"
msgstr "Biélorusse"
#: paperless/settings/__init__.py:566
#: paperless/settings/__init__.py:565
msgid "Bulgarian"
msgstr "Bulgare"
#: paperless/settings/__init__.py:567
#: paperless/settings/__init__.py:566
msgid "Catalan"
msgstr "Catalan"
#: paperless/settings/__init__.py:568
#: paperless/settings/__init__.py:567
msgid "Czech"
msgstr "Tchèque"
#: paperless/settings/__init__.py:569
#: paperless/settings/__init__.py:568
msgid "Danish"
msgstr "Danois"
#: paperless/settings/__init__.py:570
#: paperless/settings/__init__.py:569
msgid "German"
msgstr "Allemand"
#: paperless/settings/__init__.py:571
#: paperless/settings/__init__.py:570
msgid "Greek"
msgstr "Grec"
#: paperless/settings/__init__.py:572
#: paperless/settings/__init__.py:571
msgid "English (GB)"
msgstr "Anglais (GB)"
#: paperless/settings/__init__.py:573
#: paperless/settings/__init__.py:572
msgid "Spanish"
msgstr "Espagnol"
#: paperless/settings/__init__.py:574
#: paperless/settings/__init__.py:573
msgid "Persian"
msgstr "Persan"
#: paperless/settings/__init__.py:575
#: paperless/settings/__init__.py:574
msgid "Finnish"
msgstr "Finnois"
#: paperless/settings/__init__.py:576
#: paperless/settings/__init__.py:575
msgid "French"
msgstr "Français"
#: paperless/settings/__init__.py:577
#: paperless/settings/__init__.py:576
msgid "Hungarian"
msgstr "Hongrois"
#: paperless/settings/__init__.py:578
#: paperless/settings/__init__.py:577
msgid "Indonesian"
msgstr "Indonésien"
#: paperless/settings/__init__.py:579
#: paperless/settings/__init__.py:578
msgid "Italian"
msgstr "Italien"
#: paperless/settings/__init__.py:580
#: paperless/settings/__init__.py:579
msgid "Japanese"
msgstr "Japonais"
#: paperless/settings/__init__.py:581
#: paperless/settings/__init__.py:580
msgid "Korean"
msgstr "Coréen"
#: paperless/settings/__init__.py:582
#: paperless/settings/__init__.py:581
msgid "Luxembourgish"
msgstr "Luxembourgeois"
#: paperless/settings/__init__.py:583
#: paperless/settings/__init__.py:582
msgid "Norwegian"
msgstr "Norvégien"
#: paperless/settings/__init__.py:584
#: paperless/settings/__init__.py:583
msgid "Dutch"
msgstr "Néerlandais"
#: paperless/settings/__init__.py:585
#: paperless/settings/__init__.py:584
msgid "Polish"
msgstr "Polonais"
#: paperless/settings/__init__.py:586
#: paperless/settings/__init__.py:585
msgid "Portuguese (Brazil)"
msgstr "Portugais (Brésil)"
#: paperless/settings/__init__.py:587
#: paperless/settings/__init__.py:586
msgid "Portuguese"
msgstr "Portugais"
#: paperless/settings/__init__.py:588
#: paperless/settings/__init__.py:587
msgid "Romanian"
msgstr "Roumain"
#: paperless/settings/__init__.py:589
#: paperless/settings/__init__.py:588
msgid "Russian"
msgstr "Russe"
#: paperless/settings/__init__.py:590
#: paperless/settings/__init__.py:589
msgid "Slovak"
msgstr "Solvaque"
#: paperless/settings/__init__.py:591
#: paperless/settings/__init__.py:590
msgid "Slovenian"
msgstr "Slovène"
#: paperless/settings/__init__.py:592
#: paperless/settings/__init__.py:591
msgid "Serbian"
msgstr "Serbe"
#: paperless/settings/__init__.py:593
#: paperless/settings/__init__.py:592
msgid "Swedish"
msgstr "Suédois"
#: paperless/settings/__init__.py:594
#: paperless/settings/__init__.py:593
msgid "Turkish"
msgstr "Turc"
#: paperless/settings/__init__.py:595
#: paperless/settings/__init__.py:594
msgid "Ukrainian"
msgstr "Ukrainien"
#: paperless/settings/__init__.py:596
#: paperless/settings/__init__.py:595
msgid "Vietnamese"
msgstr "Vietnamien"
#: paperless/settings/__init__.py:597
#: paperless/settings/__init__.py:596
msgid "Chinese Simplified"
msgstr "Chinois simplifié"
#: paperless/settings/__init__.py:598
#: paperless/settings/__init__.py:597
msgid "Chinese Traditional"
msgstr "Chinois traditionnel"
+78 -63
View File
@@ -2,8 +2,8 @@ msgid ""
msgstr ""
"Project-Id-Version: paperless-ngx\n"
"Report-Msgid-Bugs-To: \n"
"POT-Creation-Date: 2026-10-14 15:18+0000\n"
"PO-Revision-Date: 2026-10-14 15:19\n"
"POT-Creation-Date: 2026-10-05 16:26+0000\n"
"PO-Revision-Date: 2026-10-05 16:27\n"
"Last-Translator: \n"
"Language-Team: Hebrew\n"
"Language: he_IL\n"
@@ -21,39 +21,39 @@ msgstr ""
msgid "Documents"
msgstr "מסמכים"
#: documents/filters.py:464
#: documents/filters.py:463
msgid "Value must be valid JSON."
msgstr "ערך חייב להיות JSON תקין."
#: documents/filters.py:483
#: documents/filters.py:482
msgid "Invalid custom field query expression"
msgstr "ביטוי שאילתה לא חוקי של שדה מותאם אישית"
#: documents/filters.py:493
#: documents/filters.py:492
msgid "Invalid expression list. Must be nonempty."
msgstr "רשימת ביטויים לא חוקית. חייב לכלול ערך."
#: documents/filters.py:514
#: documents/filters.py:513
msgid "Invalid logical operator {op!r}"
msgstr "סימן פעולה לוגית לא חוקי {op!r}"
#: documents/filters.py:528
#: documents/filters.py:527
msgid "Maximum number of query conditions exceeded."
msgstr "חריגה ממספר תנאי השאילתה המרבי."
#: documents/filters.py:592
#: documents/filters.py:591
msgid "{name!r} is not a valid custom field."
msgstr "{name!r} הוא לא שדה מותאם אישית חוקי."
#: documents/filters.py:629
#: documents/filters.py:628
msgid "{data_type} does not support query expr {expr!r}."
msgstr "{data_type} לא תומך בביטוי שאילתה {expr!r}."
#: documents/filters.py:748 documents/models.py:137
#: documents/filters.py:747 documents/models.py:137
msgid "Maximum nesting depth exceeded."
msgstr "חריגה מעומק הקינון המרבי."
#: documents/filters.py:1125
#: documents/filters.py:1109
msgid "Custom field not found"
msgstr "שדה מותאם אישית לא נמצא"
@@ -1637,7 +1637,7 @@ msgid "workflow runs"
msgstr "הרצות זרימת עבודה"
#: documents/serialisers.py:515 documents/serialisers.py:872
#: documents/serialisers.py:2902 documents/views.py:363 documents/views.py:2768
#: documents/serialisers.py:2902 documents/views.py:343 documents/views.py:2732
#: paperless_mail/serialisers.py:156
msgid "Insufficient permissions."
msgstr "הרשאות אינן מספיקות."
@@ -1677,7 +1677,7 @@ msgstr "משתנה לא חוקי זוהה."
msgid "Duplicate document identifiers are not allowed."
msgstr "מזהי מסמכים כפולים אינם מורשים."
#: documents/serialisers.py:2988 documents/views.py:4811
#: documents/serialisers.py:2988 documents/views.py:4787
#, python-format
msgid "Documents not found: %(ids)s"
msgstr "מסמכים לא נמצאו: %(ids)s"
@@ -1914,44 +1914,59 @@ msgstr "שלך כדי להתחבר %(provider_name)s אתה עומד להשתמ
msgid "As a final step, please complete the following form:"
msgstr ": כצעד אחרון, אנא מלא את הטופס הבא:"
#: documents/validators.py:24
#, python-brace-format
msgid "Unable to parse URI {value}, missing scheme"
msgstr "לא ניתן לפענח את ה-URI ‏{value}, חסר פרוטוקול (scheme)"
#: documents/validators.py:29
#, python-brace-format
msgid "Unable to parse URI {value}, missing net location or path"
msgstr "לא ניתן לפענח את ה-URI ‏{value}, חסר מיקום רשת (net location) או נתיב"
#: documents/validators.py:36
msgid ", "
msgstr ""
msgid "URI scheme '{parts.scheme}' is not allowed. Allowed schemes: {', '.join(allowed_schemes)}"
msgstr "פרוטוקול ה-URI ‏'{parts.scheme}' אינו מורשה. הפרוטוקולים המורשים הם: {', '.join(allowed_schemes)}"
#: documents/views.py:318
msgid "Specify only one of text, title_search, query, or more_like_id."
msgstr "יש לציין רק אחד מהבאים: text‏, title_search‏, query או more_like_id."
#: documents/validators.py:45
#, python-brace-format
msgid "Unable to parse URI {value}"
msgstr "לא ניתן לפענח את ה URI ‏{value}"
#: documents/views.py:356 documents/views.py:2765
#: documents/views.py:336 documents/views.py:2729
msgid "Invalid more_like_id"
msgstr "מזהה more_like_id אינו תקין"
#: documents/views.py:1703
#: documents/views.py:1676
msgid "Invalid AI configuration."
msgstr "הגדרות בינה מלאכותית שגויות."
#: documents/views.py:1714
#: documents/views.py:1687
msgid "AI backend request timed out."
msgstr ""
#: documents/views.py:1726
#: documents/views.py:1699
msgid "AI backend rejected the request. Check logs for details."
msgstr ""
#: documents/views.py:4827
#: documents/views.py:2554 documents/views.py:2870
msgid "Specify only one of text, title_search, query, or more_like_id."
msgstr "יש לציין רק אחד מהבאים: text‏, title_search‏, query או more_like_id."
#: documents/views.py:4800
#, python-format
msgid "Insufficient permissions to share document %(id)s."
msgstr "הרשאות לא מספיקות לשיתוף מסמך %(id)s."
#: documents/views.py:4874
#: documents/views.py:4846
msgid "Bundle is already being processed."
msgstr "החבילה (Bundle) כבר נמצאת בתהליך עיבוד."
#: documents/views.py:4938
#: documents/views.py:4910
msgid "The share link bundle is still being prepared. Please try again later."
msgstr "חבילת קישור השיתוף עדיין בהכנה. נא לנסות שוב מאוחר יותר."
#: documents/views.py:4952
#: documents/views.py:4924
msgid "The share link bundle is unavailable."
msgstr "חבילת קישור השיתוף אינה זמינה."
@@ -2243,151 +2258,151 @@ msgstr ""
msgid "paperless application settings"
msgstr "הגדרות יישום paperless"
#: paperless/settings/__init__.py:562
#: paperless/settings/__init__.py:561
msgid "English (US)"
msgstr "אנגלית (ארה״ב)"
#: paperless/settings/__init__.py:563
#: paperless/settings/__init__.py:562
msgid "Arabic"
msgstr "ערבית"
#: paperless/settings/__init__.py:564
#: paperless/settings/__init__.py:563
msgid "Afrikaans"
msgstr "אפריקאנס"
#: paperless/settings/__init__.py:565
#: paperless/settings/__init__.py:564
msgid "Belarusian"
msgstr "בלרוסית"
#: paperless/settings/__init__.py:566
#: paperless/settings/__init__.py:565
msgid "Bulgarian"
msgstr "בולגרית"
#: paperless/settings/__init__.py:567
#: paperless/settings/__init__.py:566
msgid "Catalan"
msgstr "קטלאנית"
#: paperless/settings/__init__.py:568
#: paperless/settings/__init__.py:567
msgid "Czech"
msgstr "צ'כית"
#: paperless/settings/__init__.py:569
#: paperless/settings/__init__.py:568
msgid "Danish"
msgstr "דנית"
#: paperless/settings/__init__.py:570
#: paperless/settings/__init__.py:569
msgid "German"
msgstr "גרמנית"
#: paperless/settings/__init__.py:571
#: paperless/settings/__init__.py:570
msgid "Greek"
msgstr "יוונית"
#: paperless/settings/__init__.py:572
#: paperless/settings/__init__.py:571
msgid "English (GB)"
msgstr "אנגלית (בריטניה)"
#: paperless/settings/__init__.py:573
#: paperless/settings/__init__.py:572
msgid "Spanish"
msgstr "ספרדית"
#: paperless/settings/__init__.py:574
#: paperless/settings/__init__.py:573
msgid "Persian"
msgstr "פרסית"
#: paperless/settings/__init__.py:575
#: paperless/settings/__init__.py:574
msgid "Finnish"
msgstr "פינית"
#: paperless/settings/__init__.py:576
#: paperless/settings/__init__.py:575
msgid "French"
msgstr "צרפתית"
#: paperless/settings/__init__.py:577
#: paperless/settings/__init__.py:576
msgid "Hungarian"
msgstr "הונגרית"
#: paperless/settings/__init__.py:578
#: paperless/settings/__init__.py:577
msgid "Indonesian"
msgstr "אינדונזית"
#: paperless/settings/__init__.py:579
#: paperless/settings/__init__.py:578
msgid "Italian"
msgstr "איטלקית"
#: paperless/settings/__init__.py:580
#: paperless/settings/__init__.py:579
msgid "Japanese"
msgstr "יפנית"
#: paperless/settings/__init__.py:581
#: paperless/settings/__init__.py:580
msgid "Korean"
msgstr "קוריאנית"
#: paperless/settings/__init__.py:582
#: paperless/settings/__init__.py:581
msgid "Luxembourgish"
msgstr "לוקסמבורגית"
#: paperless/settings/__init__.py:583
#: paperless/settings/__init__.py:582
msgid "Norwegian"
msgstr "נורווגית"
#: paperless/settings/__init__.py:584
#: paperless/settings/__init__.py:583
msgid "Dutch"
msgstr "הולנדית"
#: paperless/settings/__init__.py:585
#: paperless/settings/__init__.py:584
msgid "Polish"
msgstr "פולנית"
#: paperless/settings/__init__.py:586
#: paperless/settings/__init__.py:585
msgid "Portuguese (Brazil)"
msgstr "פורטוגלית ברזילאית"
#: paperless/settings/__init__.py:587
#: paperless/settings/__init__.py:586
msgid "Portuguese"
msgstr "פורטוגלית"
#: paperless/settings/__init__.py:588
#: paperless/settings/__init__.py:587
msgid "Romanian"
msgstr "רומנית"
#: paperless/settings/__init__.py:589
#: paperless/settings/__init__.py:588
msgid "Russian"
msgstr "רוסית"
#: paperless/settings/__init__.py:590
#: paperless/settings/__init__.py:589
msgid "Slovak"
msgstr "סלובקית"
#: paperless/settings/__init__.py:591
#: paperless/settings/__init__.py:590
msgid "Slovenian"
msgstr "סלובנית"
#: paperless/settings/__init__.py:592
#: paperless/settings/__init__.py:591
msgid "Serbian"
msgstr "סרבית"
#: paperless/settings/__init__.py:593
#: paperless/settings/__init__.py:592
msgid "Swedish"
msgstr "שוודית"
#: paperless/settings/__init__.py:594
#: paperless/settings/__init__.py:593
msgid "Turkish"
msgstr "טורקית"
#: paperless/settings/__init__.py:595
#: paperless/settings/__init__.py:594
msgid "Ukrainian"
msgstr "אוקראינית"
#: paperless/settings/__init__.py:596
#: paperless/settings/__init__.py:595
msgid "Vietnamese"
msgstr "ווייטנאמית"
#: paperless/settings/__init__.py:597
#: paperless/settings/__init__.py:596
msgid "Chinese Simplified"
msgstr "סינית מפושטת"
#: paperless/settings/__init__.py:598
#: paperless/settings/__init__.py:597
msgid "Chinese Traditional"
msgstr "סינית מסורתית"
+76 -61
View File
@@ -2,8 +2,8 @@ msgid ""
msgstr ""
"Project-Id-Version: paperless-ngx\n"
"Report-Msgid-Bugs-To: \n"
"POT-Creation-Date: 2026-10-14 15:18+0000\n"
"PO-Revision-Date: 2026-10-14 15:19\n"
"POT-Creation-Date: 2026-10-05 16:26+0000\n"
"PO-Revision-Date: 2026-10-05 16:27\n"
"Last-Translator: \n"
"Language-Team: Hindi\n"
"Language: hi_IN\n"
@@ -21,39 +21,39 @@ msgstr ""
msgid "Documents"
msgstr "दस्तावेज़"
#: documents/filters.py:464
#: documents/filters.py:463
msgid "Value must be valid JSON."
msgstr "मान वैध JSON होना चाहिए."
#: documents/filters.py:483
#: documents/filters.py:482
msgid "Invalid custom field query expression"
msgstr "अमान्य कस्टम फ़ील्ड क्वेरी एक्सप्रेशन"
#: documents/filters.py:493
#: documents/filters.py:492
msgid "Invalid expression list. Must be nonempty."
msgstr "अमान्य एक्सप्रेशन सूची। खाली नहीं होनी चाहिए।"
#: documents/filters.py:514
#: documents/filters.py:513
msgid "Invalid logical operator {op!r}"
msgstr "अमान्य लॉजिकल ऑपरेटर {op!r}"
#: documents/filters.py:528
#: documents/filters.py:527
msgid "Maximum number of query conditions exceeded."
msgstr "क्वेरी शर्तों की अधिकतम संख्या पार हो गई है।"
#: documents/filters.py:592
#: documents/filters.py:591
msgid "{name!r} is not a valid custom field."
msgstr "{name!r} यह एक वैध कस्टम फ़ील्ड नहीं है।"
#: documents/filters.py:629
#: documents/filters.py:628
msgid "{data_type} does not support query expr {expr!r}."
msgstr "{data_type} क्वेरी एक्सप्रेशन {expr!r} का समर्थन नहीं करता है।"
#: documents/filters.py:748 documents/models.py:137
#: documents/filters.py:747 documents/models.py:137
msgid "Maximum nesting depth exceeded."
msgstr "अधिकतम नेस्टिंग डेप्थ पार हो गई है।"
#: documents/filters.py:1125
#: documents/filters.py:1109
msgid "Custom field not found"
msgstr "कस्टम फ़ील्ड नहीं मिला"
@@ -1636,7 +1636,7 @@ msgid "workflow runs"
msgstr ""
#: documents/serialisers.py:515 documents/serialisers.py:872
#: documents/serialisers.py:2902 documents/views.py:363 documents/views.py:2768
#: documents/serialisers.py:2902 documents/views.py:343 documents/views.py:2732
#: paperless_mail/serialisers.py:156
msgid "Insufficient permissions."
msgstr ""
@@ -1676,7 +1676,7 @@ msgstr ""
msgid "Duplicate document identifiers are not allowed."
msgstr ""
#: documents/serialisers.py:2988 documents/views.py:4811
#: documents/serialisers.py:2988 documents/views.py:4787
#, python-format
msgid "Documents not found: %(ids)s"
msgstr ""
@@ -1912,44 +1912,59 @@ msgstr ""
msgid "As a final step, please complete the following form:"
msgstr ""
#: documents/validators.py:24
#, python-brace-format
msgid "Unable to parse URI {value}, missing scheme"
msgstr ""
#: documents/validators.py:29
#, python-brace-format
msgid "Unable to parse URI {value}, missing net location or path"
msgstr ""
#: documents/validators.py:36
msgid ", "
msgid "URI scheme '{parts.scheme}' is not allowed. Allowed schemes: {', '.join(allowed_schemes)}"
msgstr ""
#: documents/views.py:318
msgid "Specify only one of text, title_search, query, or more_like_id."
#: documents/validators.py:45
#, python-brace-format
msgid "Unable to parse URI {value}"
msgstr ""
#: documents/views.py:356 documents/views.py:2765
#: documents/views.py:336 documents/views.py:2729
msgid "Invalid more_like_id"
msgstr ""
#: documents/views.py:1703
#: documents/views.py:1676
msgid "Invalid AI configuration."
msgstr ""
#: documents/views.py:1714
#: documents/views.py:1687
msgid "AI backend request timed out."
msgstr ""
#: documents/views.py:1726
#: documents/views.py:1699
msgid "AI backend rejected the request. Check logs for details."
msgstr ""
#: documents/views.py:4827
#: documents/views.py:2554 documents/views.py:2870
msgid "Specify only one of text, title_search, query, or more_like_id."
msgstr ""
#: documents/views.py:4800
#, python-format
msgid "Insufficient permissions to share document %(id)s."
msgstr ""
#: documents/views.py:4874
#: documents/views.py:4846
msgid "Bundle is already being processed."
msgstr ""
#: documents/views.py:4938
#: documents/views.py:4910
msgid "The share link bundle is still being prepared. Please try again later."
msgstr ""
#: documents/views.py:4952
#: documents/views.py:4924
msgid "The share link bundle is unavailable."
msgstr ""
@@ -2241,151 +2256,151 @@ msgstr ""
msgid "paperless application settings"
msgstr ""
#: paperless/settings/__init__.py:562
#: paperless/settings/__init__.py:561
msgid "English (US)"
msgstr ""
#: paperless/settings/__init__.py:563
#: paperless/settings/__init__.py:562
msgid "Arabic"
msgstr ""
#: paperless/settings/__init__.py:564
#: paperless/settings/__init__.py:563
msgid "Afrikaans"
msgstr ""
#: paperless/settings/__init__.py:565
#: paperless/settings/__init__.py:564
msgid "Belarusian"
msgstr ""
#: paperless/settings/__init__.py:566
#: paperless/settings/__init__.py:565
msgid "Bulgarian"
msgstr ""
#: paperless/settings/__init__.py:567
#: paperless/settings/__init__.py:566
msgid "Catalan"
msgstr ""
#: paperless/settings/__init__.py:568
#: paperless/settings/__init__.py:567
msgid "Czech"
msgstr ""
#: paperless/settings/__init__.py:569
#: paperless/settings/__init__.py:568
msgid "Danish"
msgstr ""
#: paperless/settings/__init__.py:570
#: paperless/settings/__init__.py:569
msgid "German"
msgstr ""
#: paperless/settings/__init__.py:571
#: paperless/settings/__init__.py:570
msgid "Greek"
msgstr ""
#: paperless/settings/__init__.py:572
#: paperless/settings/__init__.py:571
msgid "English (GB)"
msgstr ""
#: paperless/settings/__init__.py:573
#: paperless/settings/__init__.py:572
msgid "Spanish"
msgstr ""
#: paperless/settings/__init__.py:574
#: paperless/settings/__init__.py:573
msgid "Persian"
msgstr ""
#: paperless/settings/__init__.py:575
#: paperless/settings/__init__.py:574
msgid "Finnish"
msgstr ""
#: paperless/settings/__init__.py:576
#: paperless/settings/__init__.py:575
msgid "French"
msgstr ""
#: paperless/settings/__init__.py:577
#: paperless/settings/__init__.py:576
msgid "Hungarian"
msgstr ""
#: paperless/settings/__init__.py:578
#: paperless/settings/__init__.py:577
msgid "Indonesian"
msgstr ""
#: paperless/settings/__init__.py:579
#: paperless/settings/__init__.py:578
msgid "Italian"
msgstr ""
#: paperless/settings/__init__.py:580
#: paperless/settings/__init__.py:579
msgid "Japanese"
msgstr ""
#: paperless/settings/__init__.py:581
#: paperless/settings/__init__.py:580
msgid "Korean"
msgstr ""
#: paperless/settings/__init__.py:582
#: paperless/settings/__init__.py:581
msgid "Luxembourgish"
msgstr ""
#: paperless/settings/__init__.py:583
#: paperless/settings/__init__.py:582
msgid "Norwegian"
msgstr ""
#: paperless/settings/__init__.py:584
#: paperless/settings/__init__.py:583
msgid "Dutch"
msgstr ""
#: paperless/settings/__init__.py:585
#: paperless/settings/__init__.py:584
msgid "Polish"
msgstr ""
#: paperless/settings/__init__.py:586
#: paperless/settings/__init__.py:585
msgid "Portuguese (Brazil)"
msgstr ""
#: paperless/settings/__init__.py:587
#: paperless/settings/__init__.py:586
msgid "Portuguese"
msgstr ""
#: paperless/settings/__init__.py:588
#: paperless/settings/__init__.py:587
msgid "Romanian"
msgstr ""
#: paperless/settings/__init__.py:589
#: paperless/settings/__init__.py:588
msgid "Russian"
msgstr ""
#: paperless/settings/__init__.py:590
#: paperless/settings/__init__.py:589
msgid "Slovak"
msgstr ""
#: paperless/settings/__init__.py:591
#: paperless/settings/__init__.py:590
msgid "Slovenian"
msgstr ""
#: paperless/settings/__init__.py:592
#: paperless/settings/__init__.py:591
msgid "Serbian"
msgstr ""
#: paperless/settings/__init__.py:593
#: paperless/settings/__init__.py:592
msgid "Swedish"
msgstr ""
#: paperless/settings/__init__.py:594
#: paperless/settings/__init__.py:593
msgid "Turkish"
msgstr ""
#: paperless/settings/__init__.py:595
#: paperless/settings/__init__.py:594
msgid "Ukrainian"
msgstr ""
#: paperless/settings/__init__.py:596
#: paperless/settings/__init__.py:595
msgid "Vietnamese"
msgstr ""
#: paperless/settings/__init__.py:597
#: paperless/settings/__init__.py:596
msgid "Chinese Simplified"
msgstr ""
#: paperless/settings/__init__.py:598
#: paperless/settings/__init__.py:597
msgid "Chinese Traditional"
msgstr ""
+78 -63
View File
@@ -2,8 +2,8 @@ msgid ""
msgstr ""
"Project-Id-Version: paperless-ngx\n"
"Report-Msgid-Bugs-To: \n"
"POT-Creation-Date: 2026-10-14 15:18+0000\n"
"PO-Revision-Date: 2026-10-14 15:19\n"
"POT-Creation-Date: 2026-10-05 16:26+0000\n"
"PO-Revision-Date: 2026-10-05 16:27\n"
"Last-Translator: \n"
"Language-Team: Croatian\n"
"Language: hr_HR\n"
@@ -21,39 +21,39 @@ msgstr ""
msgid "Documents"
msgstr "Dokumenti"
#: documents/filters.py:464
#: documents/filters.py:463
msgid "Value must be valid JSON."
msgstr "Vrijednost mora biti važeći JSON."
#: documents/filters.py:483
#: documents/filters.py:482
msgid "Invalid custom field query expression"
msgstr "Nevažeći izraz upita prilagođenog polja"
#: documents/filters.py:493
#: documents/filters.py:492
msgid "Invalid expression list. Must be nonempty."
msgstr "Nevažeći popis izraza. Ne smije biti prazno."
#: documents/filters.py:514
#: documents/filters.py:513
msgid "Invalid logical operator {op!r}"
msgstr "Nevažeći logički operator {op!r}"
#: documents/filters.py:528
#: documents/filters.py:527
msgid "Maximum number of query conditions exceeded."
msgstr "Previše uvjeta u upitu."
#: documents/filters.py:592
#: documents/filters.py:591
msgid "{name!r} is not a valid custom field."
msgstr "{name!r} nije važeće prilagođeno polje."
#: documents/filters.py:629
#: documents/filters.py:628
msgid "{data_type} does not support query expr {expr!r}."
msgstr "{data_type} ne podržava upit izraz {expr!r}."
#: documents/filters.py:748 documents/models.py:137
#: documents/filters.py:747 documents/models.py:137
msgid "Maximum nesting depth exceeded."
msgstr "Premašena je najveća razina ugniježđivanja."
#: documents/filters.py:1125
#: documents/filters.py:1109
msgid "Custom field not found"
msgstr "Prilagođeno polje nije pronađeno"
@@ -1636,7 +1636,7 @@ msgid "workflow runs"
msgstr "tijek rada pokrenut"
#: documents/serialisers.py:515 documents/serialisers.py:872
#: documents/serialisers.py:2902 documents/views.py:363 documents/views.py:2768
#: documents/serialisers.py:2902 documents/views.py:343 documents/views.py:2732
#: paperless_mail/serialisers.py:156
msgid "Insufficient permissions."
msgstr "Nedovoljne ovlasti."
@@ -1676,7 +1676,7 @@ msgstr "Otkrivena je nevaljana vrsta datoteke."
msgid "Duplicate document identifiers are not allowed."
msgstr "Duplicirani identifikatori dokumenata nisu dopušteni."
#: documents/serialisers.py:2988 documents/views.py:4811
#: documents/serialisers.py:2988 documents/views.py:4787
#, python-format
msgid "Documents not found: %(ids)s"
msgstr "Dokumenti nisu pronađeni: %(ids)s"
@@ -1913,44 +1913,59 @@ msgstr "Upravo ćete koristiti svoj račun %(provider_name)s za prijavu."
msgid "As a final step, please complete the following form:"
msgstr "Kao posljednji korak ispunite sljedeći obrazac:"
#: documents/validators.py:24
#, python-brace-format
msgid "Unable to parse URI {value}, missing scheme"
msgstr "Nije moguće analizirati URI {value}, nedostaje shema"
#: documents/validators.py:29
#, python-brace-format
msgid "Unable to parse URI {value}, missing net location or path"
msgstr "Nije moguće analizirati URI {value}, nedostaje mrežna lokacija ili put"
#: documents/validators.py:36
msgid ", "
msgstr ""
msgid "URI scheme '{parts.scheme}' is not allowed. Allowed schemes: {', '.join(allowed_schemes)}"
msgstr "URI shema '{parts.scheme}' nije dopuštena. Dopuštene sheme: {', '.join(allowed_schemes)}"
#: documents/views.py:318
msgid "Specify only one of text, title_search, query, or more_like_id."
msgstr "Navedite samo jedno od: text, title_search, query ili more_like_id."
#: documents/validators.py:45
#, python-brace-format
msgid "Unable to parse URI {value}"
msgstr "Nije moguće raščlaniti URI {value}"
#: documents/views.py:356 documents/views.py:2765
#: documents/views.py:336 documents/views.py:2729
msgid "Invalid more_like_id"
msgstr "Nevažeći more_like_id"
#: documents/views.py:1703
#: documents/views.py:1676
msgid "Invalid AI configuration."
msgstr "Nevažeća AI konfiguracija."
#: documents/views.py:1714
#: documents/views.py:1687
msgid "AI backend request timed out."
msgstr "Zahtjev prema AI pozadinskom sustavu je istekao."
#: documents/views.py:1726
#: documents/views.py:1699
msgid "AI backend rejected the request. Check logs for details."
msgstr "AI pozadinski sustav je odbio zahtjev. Provjerite zapise (logs) za više detalja."
#: documents/views.py:4827
#: documents/views.py:2554 documents/views.py:2870
msgid "Specify only one of text, title_search, query, or more_like_id."
msgstr "Navedite samo jedno od: text, title_search, query ili more_like_id."
#: documents/views.py:4800
#, python-format
msgid "Insufficient permissions to share document %(id)s."
msgstr "Nedovoljne ovlasti za dijeljenje dokumenta %(id)s."
#: documents/views.py:4874
#: documents/views.py:4846
msgid "Bundle is already being processed."
msgstr "Paket se već obrađuje."
#: documents/views.py:4938
#: documents/views.py:4910
msgid "The share link bundle is still being prepared. Please try again later."
msgstr "Paket linka za dijeljenje se još priprema. Pokušajte ponovo kasnije."
#: documents/views.py:4952
#: documents/views.py:4924
msgid "The share link bundle is unavailable."
msgstr "Paket linka za dijeljenje nije dostupan."
@@ -2242,151 +2257,151 @@ msgstr "LLM timeout (u sekundama)"
msgid "paperless application settings"
msgstr "postavke paperless aplikacije"
#: paperless/settings/__init__.py:562
#: paperless/settings/__init__.py:561
msgid "English (US)"
msgstr "Engleski (US)"
#: paperless/settings/__init__.py:563
#: paperless/settings/__init__.py:562
msgid "Arabic"
msgstr "Arapski"
#: paperless/settings/__init__.py:564
#: paperless/settings/__init__.py:563
msgid "Afrikaans"
msgstr "afrički"
#: paperless/settings/__init__.py:565
#: paperless/settings/__init__.py:564
msgid "Belarusian"
msgstr "Bjeloruski"
#: paperless/settings/__init__.py:566
#: paperless/settings/__init__.py:565
msgid "Bulgarian"
msgstr "bugarski"
#: paperless/settings/__init__.py:567
#: paperless/settings/__init__.py:566
msgid "Catalan"
msgstr "katalonski"
#: paperless/settings/__init__.py:568
#: paperless/settings/__init__.py:567
msgid "Czech"
msgstr "Češki"
#: paperless/settings/__init__.py:569
#: paperless/settings/__init__.py:568
msgid "Danish"
msgstr "Danski"
#: paperless/settings/__init__.py:570
#: paperless/settings/__init__.py:569
msgid "German"
msgstr "Njemački"
#: paperless/settings/__init__.py:571
#: paperless/settings/__init__.py:570
msgid "Greek"
msgstr "grčki"
#: paperless/settings/__init__.py:572
#: paperless/settings/__init__.py:571
msgid "English (GB)"
msgstr "Engleski (GB)"
#: paperless/settings/__init__.py:573
#: paperless/settings/__init__.py:572
msgid "Spanish"
msgstr "Španjolski"
#: paperless/settings/__init__.py:574
#: paperless/settings/__init__.py:573
msgid "Persian"
msgstr "perzijski"
#: paperless/settings/__init__.py:575
#: paperless/settings/__init__.py:574
msgid "Finnish"
msgstr "finski"
#: paperless/settings/__init__.py:576
#: paperless/settings/__init__.py:575
msgid "French"
msgstr "Francuski"
#: paperless/settings/__init__.py:577
#: paperless/settings/__init__.py:576
msgid "Hungarian"
msgstr "mađarski"
#: paperless/settings/__init__.py:578
#: paperless/settings/__init__.py:577
msgid "Indonesian"
msgstr "Iidonezijski"
#: paperless/settings/__init__.py:579
#: paperless/settings/__init__.py:578
msgid "Italian"
msgstr "Talijanski"
#: paperless/settings/__init__.py:580
#: paperless/settings/__init__.py:579
msgid "Japanese"
msgstr "japanski"
#: paperless/settings/__init__.py:581
#: paperless/settings/__init__.py:580
msgid "Korean"
msgstr "koreanski"
#: paperless/settings/__init__.py:582
#: paperless/settings/__init__.py:581
msgid "Luxembourgish"
msgstr "Luksemburški"
#: paperless/settings/__init__.py:583
#: paperless/settings/__init__.py:582
msgid "Norwegian"
msgstr "norveški"
#: paperless/settings/__init__.py:584
#: paperless/settings/__init__.py:583
msgid "Dutch"
msgstr "Nizozemski"
#: paperless/settings/__init__.py:585
#: paperless/settings/__init__.py:584
msgid "Polish"
msgstr "Poljski"
#: paperless/settings/__init__.py:586
#: paperless/settings/__init__.py:585
msgid "Portuguese (Brazil)"
msgstr "Portugalski (Brazil)"
#: paperless/settings/__init__.py:587
#: paperless/settings/__init__.py:586
msgid "Portuguese"
msgstr "Portugalski"
#: paperless/settings/__init__.py:588
#: paperless/settings/__init__.py:587
msgid "Romanian"
msgstr "Rumunjski"
#: paperless/settings/__init__.py:589
#: paperless/settings/__init__.py:588
msgid "Russian"
msgstr "Ruski"
#: paperless/settings/__init__.py:590
#: paperless/settings/__init__.py:589
msgid "Slovak"
msgstr "slovački"
#: paperless/settings/__init__.py:591
#: paperless/settings/__init__.py:590
msgid "Slovenian"
msgstr "Slovenski"
#: paperless/settings/__init__.py:592
#: paperless/settings/__init__.py:591
msgid "Serbian"
msgstr "Srpski"
#: paperless/settings/__init__.py:593
#: paperless/settings/__init__.py:592
msgid "Swedish"
msgstr "Švedski"
#: paperless/settings/__init__.py:594
#: paperless/settings/__init__.py:593
msgid "Turkish"
msgstr "Turski"
#: paperless/settings/__init__.py:595
#: paperless/settings/__init__.py:594
msgid "Ukrainian"
msgstr "ukrajinski"
#: paperless/settings/__init__.py:596
#: paperless/settings/__init__.py:595
msgid "Vietnamese"
msgstr "vijetnamski"
#: paperless/settings/__init__.py:597
#: paperless/settings/__init__.py:596
msgid "Chinese Simplified"
msgstr "Pojednostavljeni kineski"
#: paperless/settings/__init__.py:598
#: paperless/settings/__init__.py:597
msgid "Chinese Traditional"
msgstr "Kineski tradicionalni"
+78 -63
View File
@@ -2,8 +2,8 @@ msgid ""
msgstr ""
"Project-Id-Version: paperless-ngx\n"
"Report-Msgid-Bugs-To: \n"
"POT-Creation-Date: 2026-10-14 15:18+0000\n"
"PO-Revision-Date: 2026-10-14 15:19\n"
"POT-Creation-Date: 2026-10-05 16:26+0000\n"
"PO-Revision-Date: 2026-10-05 16:27\n"
"Last-Translator: \n"
"Language-Team: Hungarian\n"
"Language: hu_HU\n"
@@ -21,39 +21,39 @@ msgstr ""
msgid "Documents"
msgstr "Dokumentumok"
#: documents/filters.py:464
#: documents/filters.py:463
msgid "Value must be valid JSON."
msgstr "Érvényes JSON érték szükséges."
#: documents/filters.py:483
#: documents/filters.py:482
msgid "Invalid custom field query expression"
msgstr "Érvénytelen egyéni mező lekérdezési kifejezés"
#: documents/filters.py:493
#: documents/filters.py:492
msgid "Invalid expression list. Must be nonempty."
msgstr "Érvénytelen kifejezéslista. Nem lehet üres."
#: documents/filters.py:514
#: documents/filters.py:513
msgid "Invalid logical operator {op!r}"
msgstr "Érvénytelen logikai operátor {op!r}"
#: documents/filters.py:528
#: documents/filters.py:527
msgid "Maximum number of query conditions exceeded."
msgstr "Maximum lekérdezési feltételszám átlépve."
#: documents/filters.py:592
#: documents/filters.py:591
msgid "{name!r} is not a valid custom field."
msgstr "{name!r} nem érvényes egyéni mező."
#: documents/filters.py:629
#: documents/filters.py:628
msgid "{data_type} does not support query expr {expr!r}."
msgstr "A(z) {data_type} nem támogatja a {expr!r} kifejezés lekérdezést."
#: documents/filters.py:748 documents/models.py:137
#: documents/filters.py:747 documents/models.py:137
msgid "Maximum nesting depth exceeded."
msgstr "Maximum beágyazási mélység túllépve."
#: documents/filters.py:1125
#: documents/filters.py:1109
msgid "Custom field not found"
msgstr "Az egyéni mező nem található"
@@ -1636,7 +1636,7 @@ msgid "workflow runs"
msgstr "munkafolyamat futtatások"
#: documents/serialisers.py:515 documents/serialisers.py:872
#: documents/serialisers.py:2902 documents/views.py:363 documents/views.py:2768
#: documents/serialisers.py:2902 documents/views.py:343 documents/views.py:2732
#: paperless_mail/serialisers.py:156
msgid "Insufficient permissions."
msgstr "Nincs jogosúltsága."
@@ -1676,7 +1676,7 @@ msgstr "Érvénytelen változó észlelve."
msgid "Duplicate document identifiers are not allowed."
msgstr "A dokumentumazonosítók duplikálása nem megengedett."
#: documents/serialisers.py:2988 documents/views.py:4811
#: documents/serialisers.py:2988 documents/views.py:4787
#, python-format
msgid "Documents not found: %(ids)s"
msgstr "Dokumentumok nem találhatók: %(ids)s"
@@ -1913,44 +1913,59 @@ msgstr "A %(provider_name)s felhasználói fiókkal fogsz belépni."
msgid "As a final step, please complete the following form:"
msgstr "Utolsó lépésként kérjük válaszoljon az alábbi kérdésekre:"
#: documents/validators.py:24
#, python-brace-format
msgid "Unable to parse URI {value}, missing scheme"
msgstr "A {value} URI értelmezése sikertelen, hiányzó séma"
#: documents/validators.py:29
#, python-brace-format
msgid "Unable to parse URI {value}, missing net location or path"
msgstr "A {value} URI értelmezése sikertelen, hiányzó hálózati vagy elérési útvonal"
#: documents/validators.py:36
msgid ", "
msgstr ""
msgid "URI scheme '{parts.scheme}' is not allowed. Allowed schemes: {', '.join(allowed_schemes)}"
msgstr "A '{parts.scheme}' séma nem engedélyezett. Engedélyezett sémák: {', '.join(allowed_schemes)}"
#: documents/views.py:318
msgid "Specify only one of text, title_search, query, or more_like_id."
msgstr "A text, title_search, query, vagy more_like_id közül csak egyet adjon meg."
#: documents/validators.py:45
#, python-brace-format
msgid "Unable to parse URI {value}"
msgstr "A {value} URI értelmezése sikertelen"
#: documents/views.py:356 documents/views.py:2765
#: documents/views.py:336 documents/views.py:2729
msgid "Invalid more_like_id"
msgstr "Érvénytelen more_like_id"
#: documents/views.py:1703
#: documents/views.py:1676
msgid "Invalid AI configuration."
msgstr "Érvénytelen MI konfiguráció."
#: documents/views.py:1714
#: documents/views.py:1687
msgid "AI backend request timed out."
msgstr ""
#: documents/views.py:1726
#: documents/views.py:1699
msgid "AI backend rejected the request. Check logs for details."
msgstr ""
#: documents/views.py:4827
#: documents/views.py:2554 documents/views.py:2870
msgid "Specify only one of text, title_search, query, or more_like_id."
msgstr "A text, title_search, query, vagy more_like_id közül csak egyet adjon meg."
#: documents/views.py:4800
#, python-format
msgid "Insufficient permissions to share document %(id)s."
msgstr "Nincs megfelelő jogosultság a %(id)s dokumentum megosztásához."
#: documents/views.py:4874
#: documents/views.py:4846
msgid "Bundle is already being processed."
msgstr "A csomag feldolgozása már folyamatban van."
#: documents/views.py:4938
#: documents/views.py:4910
msgid "The share link bundle is still being prepared. Please try again later."
msgstr "A megosztási linkcsomag készítése folyamatban. Kérjük, próbálja meg később."
#: documents/views.py:4952
#: documents/views.py:4924
msgid "The share link bundle is unavailable."
msgstr "A megosztási linkcsomag nem elérhető."
@@ -2242,151 +2257,151 @@ msgstr ""
msgid "paperless application settings"
msgstr "paperless alkalmazás beállítások"
#: paperless/settings/__init__.py:562
#: paperless/settings/__init__.py:561
msgid "English (US)"
msgstr "Angol (US)"
#: paperless/settings/__init__.py:563
#: paperless/settings/__init__.py:562
msgid "Arabic"
msgstr "Arab"
#: paperless/settings/__init__.py:564
#: paperless/settings/__init__.py:563
msgid "Afrikaans"
msgstr "Afrikai"
#: paperless/settings/__init__.py:565
#: paperless/settings/__init__.py:564
msgid "Belarusian"
msgstr "Fehérorosz"
#: paperless/settings/__init__.py:566
#: paperless/settings/__init__.py:565
msgid "Bulgarian"
msgstr "Bolgár"
#: paperless/settings/__init__.py:567
#: paperless/settings/__init__.py:566
msgid "Catalan"
msgstr "Katalán"
#: paperless/settings/__init__.py:568
#: paperless/settings/__init__.py:567
msgid "Czech"
msgstr "Cseh"
#: paperless/settings/__init__.py:569
#: paperless/settings/__init__.py:568
msgid "Danish"
msgstr "Dán"
#: paperless/settings/__init__.py:570
#: paperless/settings/__init__.py:569
msgid "German"
msgstr "Német"
#: paperless/settings/__init__.py:571
#: paperless/settings/__init__.py:570
msgid "Greek"
msgstr "Görög"
#: paperless/settings/__init__.py:572
#: paperless/settings/__init__.py:571
msgid "English (GB)"
msgstr "Angol (GB)"
#: paperless/settings/__init__.py:573
#: paperless/settings/__init__.py:572
msgid "Spanish"
msgstr "Spanyol"
#: paperless/settings/__init__.py:574
#: paperless/settings/__init__.py:573
msgid "Persian"
msgstr "Perzsa"
#: paperless/settings/__init__.py:575
#: paperless/settings/__init__.py:574
msgid "Finnish"
msgstr "Finn"
#: paperless/settings/__init__.py:576
#: paperless/settings/__init__.py:575
msgid "French"
msgstr "Francia"
#: paperless/settings/__init__.py:577
#: paperless/settings/__init__.py:576
msgid "Hungarian"
msgstr "Magyar"
#: paperless/settings/__init__.py:578
#: paperless/settings/__init__.py:577
msgid "Indonesian"
msgstr "Indonéz"
#: paperless/settings/__init__.py:579
#: paperless/settings/__init__.py:578
msgid "Italian"
msgstr "Olasz"
#: paperless/settings/__init__.py:580
#: paperless/settings/__init__.py:579
msgid "Japanese"
msgstr "Japán"
#: paperless/settings/__init__.py:581
#: paperless/settings/__init__.py:580
msgid "Korean"
msgstr "Koreai"
#: paperless/settings/__init__.py:582
#: paperless/settings/__init__.py:581
msgid "Luxembourgish"
msgstr "Luxemburgi"
#: paperless/settings/__init__.py:583
#: paperless/settings/__init__.py:582
msgid "Norwegian"
msgstr "Norvég"
#: paperless/settings/__init__.py:584
#: paperless/settings/__init__.py:583
msgid "Dutch"
msgstr "Holland"
#: paperless/settings/__init__.py:585
#: paperless/settings/__init__.py:584
msgid "Polish"
msgstr "Lengyel"
#: paperless/settings/__init__.py:586
#: paperless/settings/__init__.py:585
msgid "Portuguese (Brazil)"
msgstr "Portugál (Brazília)"
#: paperless/settings/__init__.py:587
#: paperless/settings/__init__.py:586
msgid "Portuguese"
msgstr "Portugál"
#: paperless/settings/__init__.py:588
#: paperless/settings/__init__.py:587
msgid "Romanian"
msgstr "Román"
#: paperless/settings/__init__.py:589
#: paperless/settings/__init__.py:588
msgid "Russian"
msgstr "Orosz"
#: paperless/settings/__init__.py:590
#: paperless/settings/__init__.py:589
msgid "Slovak"
msgstr "Szlovák"
#: paperless/settings/__init__.py:591
#: paperless/settings/__init__.py:590
msgid "Slovenian"
msgstr "Szlovén"
#: paperless/settings/__init__.py:592
#: paperless/settings/__init__.py:591
msgid "Serbian"
msgstr "Szerb"
#: paperless/settings/__init__.py:593
#: paperless/settings/__init__.py:592
msgid "Swedish"
msgstr "Svéd"
#: paperless/settings/__init__.py:594
#: paperless/settings/__init__.py:593
msgid "Turkish"
msgstr "Török"
#: paperless/settings/__init__.py:595
#: paperless/settings/__init__.py:594
msgid "Ukrainian"
msgstr "Ukrán"
#: paperless/settings/__init__.py:596
#: paperless/settings/__init__.py:595
msgid "Vietnamese"
msgstr "Vietnámi"
#: paperless/settings/__init__.py:597
#: paperless/settings/__init__.py:596
msgid "Chinese Simplified"
msgstr "Kínai egyszerűsített"
#: paperless/settings/__init__.py:598
#: paperless/settings/__init__.py:597
msgid "Chinese Traditional"
msgstr "Tradicionális kínai"
+78 -63
View File
@@ -2,8 +2,8 @@ msgid ""
msgstr ""
"Project-Id-Version: paperless-ngx\n"
"Report-Msgid-Bugs-To: \n"
"POT-Creation-Date: 2026-10-14 15:18+0000\n"
"PO-Revision-Date: 2026-10-14 15:19\n"
"POT-Creation-Date: 2026-10-05 16:26+0000\n"
"PO-Revision-Date: 2026-10-05 16:27\n"
"Last-Translator: \n"
"Language-Team: Indonesian\n"
"Language: id_ID\n"
@@ -21,39 +21,39 @@ msgstr ""
msgid "Documents"
msgstr "Dokumen"
#: documents/filters.py:464
#: documents/filters.py:463
msgid "Value must be valid JSON."
msgstr "Nilai harus berupa JSON yang valid."
#: documents/filters.py:483
#: documents/filters.py:482
msgid "Invalid custom field query expression"
msgstr "Ekspresi pencarian bidang khusus tidak valid"
#: documents/filters.py:493
#: documents/filters.py:492
msgid "Invalid expression list. Must be nonempty."
msgstr "Daftar ekspresi tidak valid. Tidak boleh kosong."
#: documents/filters.py:514
#: documents/filters.py:513
msgid "Invalid logical operator {op!r}"
msgstr "Operator logika {op!r} tidak valid"
#: documents/filters.py:528
#: documents/filters.py:527
msgid "Maximum number of query conditions exceeded."
msgstr "Jumlah maksimal kondisi pencarian terlampaui."
#: documents/filters.py:592
#: documents/filters.py:591
msgid "{name!r} is not a valid custom field."
msgstr "{name!r} bukan bidang khusus yang valid."
#: documents/filters.py:629
#: documents/filters.py:628
msgid "{data_type} does not support query expr {expr!r}."
msgstr "{data_type} tidak mendukung ekspresi pencarian expr {expr!r}."
#: documents/filters.py:748 documents/models.py:137
#: documents/filters.py:747 documents/models.py:137
msgid "Maximum nesting depth exceeded."
msgstr "Kedalaman susunan maksimal terlampaui."
#: documents/filters.py:1125
#: documents/filters.py:1109
msgid "Custom field not found"
msgstr "Bidang khusus tidak ditemukan"
@@ -1636,7 +1636,7 @@ msgid "workflow runs"
msgstr "daftar jalankan alur kerja"
#: documents/serialisers.py:515 documents/serialisers.py:872
#: documents/serialisers.py:2902 documents/views.py:363 documents/views.py:2768
#: documents/serialisers.py:2902 documents/views.py:343 documents/views.py:2732
#: paperless_mail/serialisers.py:156
msgid "Insufficient permissions."
msgstr "Izin tidak mencukupi"
@@ -1676,7 +1676,7 @@ msgstr "Variabel ilegal terdeteksi."
msgid "Duplicate document identifiers are not allowed."
msgstr "Penggunaan pengenal dokumen ganda tidak diperbolehkan."
#: documents/serialisers.py:2988 documents/views.py:4811
#: documents/serialisers.py:2988 documents/views.py:4787
#, python-format
msgid "Documents not found: %(ids)s"
msgstr "Dokumen tidak ditemukan: %(ids)s"
@@ -1913,44 +1913,59 @@ msgstr "Anda akan menggunakan akun %(provider_name)s Anda untuk masuk."
msgid "As a final step, please complete the following form:"
msgstr "Sebagai langkah terakhir, mohon formulir berikut:"
#: documents/validators.py:24
#, python-brace-format
msgid "Unable to parse URI {value}, missing scheme"
msgstr "Gagal membaca URI {value}, skema tidak ditemukan"
#: documents/validators.py:29
#, python-brace-format
msgid "Unable to parse URI {value}, missing net location or path"
msgstr "Gagal membaca URI {value}, lokasi jaringan atau path tidak ditemukan"
#: documents/validators.py:36
msgid ", "
msgstr ""
msgid "URI scheme '{parts.scheme}' is not allowed. Allowed schemes: {', '.join(allowed_schemes)}"
msgstr "Skema URI '{parts.scheme}' tidak diizinkan. Skema yang diizinkan: {', '.join(allowed_schemes)}"
#: documents/views.py:318
msgid "Specify only one of text, title_search, query, or more_like_id."
msgstr ""
#: documents/validators.py:45
#, python-brace-format
msgid "Unable to parse URI {value}"
msgstr "Gagal membaca URI {value}"
#: documents/views.py:356 documents/views.py:2765
#: documents/views.py:336 documents/views.py:2729
msgid "Invalid more_like_id"
msgstr ""
#: documents/views.py:1703
#: documents/views.py:1676
msgid "Invalid AI configuration."
msgstr ""
#: documents/views.py:1714
#: documents/views.py:1687
msgid "AI backend request timed out."
msgstr ""
#: documents/views.py:1726
#: documents/views.py:1699
msgid "AI backend rejected the request. Check logs for details."
msgstr ""
#: documents/views.py:4827
#: documents/views.py:2554 documents/views.py:2870
msgid "Specify only one of text, title_search, query, or more_like_id."
msgstr ""
#: documents/views.py:4800
#, python-format
msgid "Insufficient permissions to share document %(id)s."
msgstr "Izin tidak mencukupi untuk berbagi dokumen %(id)s"
#: documents/views.py:4874
#: documents/views.py:4846
msgid "Bundle is already being processed."
msgstr "Paket sedang diproses."
#: documents/views.py:4938
#: documents/views.py:4910
msgid "The share link bundle is still being prepared. Please try again later."
msgstr "Bundel tautan berbagi masih dalam proses persiapan. Silakan coba lagi nanti."
#: documents/views.py:4952
#: documents/views.py:4924
msgid "The share link bundle is unavailable."
msgstr "Bundel tautan berbagi tidak tersedia."
@@ -2242,151 +2257,151 @@ msgstr ""
msgid "paperless application settings"
msgstr "pengaturan aplikasi paperless"
#: paperless/settings/__init__.py:562
#: paperless/settings/__init__.py:561
msgid "English (US)"
msgstr "Inggris (AS)"
#: paperless/settings/__init__.py:563
#: paperless/settings/__init__.py:562
msgid "Arabic"
msgstr "Arab"
#: paperless/settings/__init__.py:564
#: paperless/settings/__init__.py:563
msgid "Afrikaans"
msgstr "Bahasa Afrika"
#: paperless/settings/__init__.py:565
#: paperless/settings/__init__.py:564
msgid "Belarusian"
msgstr "Belarusia"
#: paperless/settings/__init__.py:566
#: paperless/settings/__init__.py:565
msgid "Bulgarian"
msgstr "Bahasa Bulgaria"
#: paperless/settings/__init__.py:567
#: paperless/settings/__init__.py:566
msgid "Catalan"
msgstr "Katalan"
#: paperless/settings/__init__.py:568
#: paperless/settings/__init__.py:567
msgid "Czech"
msgstr "Bahasa Ceko"
#: paperless/settings/__init__.py:569
#: paperless/settings/__init__.py:568
msgid "Danish"
msgstr "Denmark"
#: paperless/settings/__init__.py:570
#: paperless/settings/__init__.py:569
msgid "German"
msgstr "Jerman"
#: paperless/settings/__init__.py:571
#: paperless/settings/__init__.py:570
msgid "Greek"
msgstr "Yunani"
#: paperless/settings/__init__.py:572
#: paperless/settings/__init__.py:571
msgid "English (GB)"
msgstr "Inggris (GB)"
#: paperless/settings/__init__.py:573
#: paperless/settings/__init__.py:572
msgid "Spanish"
msgstr "Spanyol"
#: paperless/settings/__init__.py:574
#: paperless/settings/__init__.py:573
msgid "Persian"
msgstr "Persia"
#: paperless/settings/__init__.py:575
#: paperless/settings/__init__.py:574
msgid "Finnish"
msgstr "Finlandia"
#: paperless/settings/__init__.py:576
#: paperless/settings/__init__.py:575
msgid "French"
msgstr "Prancis"
#: paperless/settings/__init__.py:577
#: paperless/settings/__init__.py:576
msgid "Hungarian"
msgstr "Hungaria"
#: paperless/settings/__init__.py:578
#: paperless/settings/__init__.py:577
msgid "Indonesian"
msgstr "Indonesia"
#: paperless/settings/__init__.py:579
#: paperless/settings/__init__.py:578
msgid "Italian"
msgstr "Italia"
#: paperless/settings/__init__.py:580
#: paperless/settings/__init__.py:579
msgid "Japanese"
msgstr "Bahasa Jepang"
#: paperless/settings/__init__.py:581
#: paperless/settings/__init__.py:580
msgid "Korean"
msgstr "Bahasa Korea"
#: paperless/settings/__init__.py:582
#: paperless/settings/__init__.py:581
msgid "Luxembourgish"
msgstr "Luksemburg"
#: paperless/settings/__init__.py:583
#: paperless/settings/__init__.py:582
msgid "Norwegian"
msgstr "Norwegia"
#: paperless/settings/__init__.py:584
#: paperless/settings/__init__.py:583
msgid "Dutch"
msgstr "Belanda"
#: paperless/settings/__init__.py:585
#: paperless/settings/__init__.py:584
msgid "Polish"
msgstr "Polandia"
#: paperless/settings/__init__.py:586
#: paperless/settings/__init__.py:585
msgid "Portuguese (Brazil)"
msgstr "Portugis (Brasil)"
#: paperless/settings/__init__.py:587
#: paperless/settings/__init__.py:586
msgid "Portuguese"
msgstr "Portugis"
#: paperless/settings/__init__.py:588
#: paperless/settings/__init__.py:587
msgid "Romanian"
msgstr "Rumania"
#: paperless/settings/__init__.py:589
#: paperless/settings/__init__.py:588
msgid "Russian"
msgstr "Rusia"
#: paperless/settings/__init__.py:590
#: paperless/settings/__init__.py:589
msgid "Slovak"
msgstr "Slovakia"
#: paperless/settings/__init__.py:591
#: paperless/settings/__init__.py:590
msgid "Slovenian"
msgstr "Slovenia"
#: paperless/settings/__init__.py:592
#: paperless/settings/__init__.py:591
msgid "Serbian"
msgstr "Serbia"
#: paperless/settings/__init__.py:593
#: paperless/settings/__init__.py:592
msgid "Swedish"
msgstr "Swedia"
#: paperless/settings/__init__.py:594
#: paperless/settings/__init__.py:593
msgid "Turkish"
msgstr "Turki"
#: paperless/settings/__init__.py:595
#: paperless/settings/__init__.py:594
msgid "Ukrainian"
msgstr "Ukraina"
#: paperless/settings/__init__.py:596
#: paperless/settings/__init__.py:595
msgid "Vietnamese"
msgstr "Vietnam"
#: paperless/settings/__init__.py:597
#: paperless/settings/__init__.py:596
msgid "Chinese Simplified"
msgstr "Mandarin Sederhana"
#: paperless/settings/__init__.py:598
#: paperless/settings/__init__.py:597
msgid "Chinese Traditional"
msgstr "Tionghoa Tradisional"
+87 -72
View File
@@ -2,8 +2,8 @@ msgid ""
msgstr ""
"Project-Id-Version: paperless-ngx\n"
"Report-Msgid-Bugs-To: \n"
"POT-Creation-Date: 2026-10-14 15:18+0000\n"
"PO-Revision-Date: 2026-10-14 15:19\n"
"POT-Creation-Date: 2026-10-05 16:26+0000\n"
"PO-Revision-Date: 2026-10-05 16:27\n"
"Last-Translator: \n"
"Language-Team: Italian\n"
"Language: it_IT\n"
@@ -21,39 +21,39 @@ msgstr ""
msgid "Documents"
msgstr "Documenti"
#: documents/filters.py:464
#: documents/filters.py:463
msgid "Value must be valid JSON."
msgstr "Il valore deve essere un JSON valido."
#: documents/filters.py:483
#: documents/filters.py:482
msgid "Invalid custom field query expression"
msgstr "Campo personalizzato della query non valido"
#: documents/filters.py:493
#: documents/filters.py:492
msgid "Invalid expression list. Must be nonempty."
msgstr "Elenco delle espressioni non valido. Deve essere non vuoto."
#: documents/filters.py:514
#: documents/filters.py:513
msgid "Invalid logical operator {op!r}"
msgstr "Operatore logico non valido {op!r}"
#: documents/filters.py:528
#: documents/filters.py:527
msgid "Maximum number of query conditions exceeded."
msgstr "Numero massimo di condizioni di query superato."
#: documents/filters.py:592
#: documents/filters.py:591
msgid "{name!r} is not a valid custom field."
msgstr "{name!r} non è un campo personalizzato valido."
#: documents/filters.py:629
#: documents/filters.py:628
msgid "{data_type} does not support query expr {expr!r}."
msgstr "{data_type} Non supporta la jQuery Expo {Expo!r}."
#: documents/filters.py:748 documents/models.py:137
#: documents/filters.py:747 documents/models.py:137
msgid "Maximum nesting depth exceeded."
msgstr "Profondità massima di nidificazione superata."
#: documents/filters.py:1125
#: documents/filters.py:1109
msgid "Custom field not found"
msgstr "Campo personalizzato non trovato"
@@ -253,7 +253,7 @@ msgstr "documento radice per questa versione"
#: documents/models.py:325
msgid "version index"
msgstr "indice versione"
msgstr "indice della versione"
#: documents/models.py:329
msgid "Index of this version within the root document."
@@ -261,11 +261,11 @@ msgstr "Indice di questa versione all'interno del documento radice."
#: documents/models.py:333
msgid "version label"
msgstr "etichetta versione"
msgstr "etichetta della versione"
#: documents/models.py:337
msgid "Optional short label for a document version."
msgstr "Etichetta abbreviata facoltativa per una versione del documento."
msgstr "Etichetta breve facoltativa per una versione del documento."
#: documents/models.py:342 documents/models.py:961 documents/models.py:992
#: documents/models.py:1096 documents/models.py:2126
@@ -1006,23 +1006,23 @@ msgstr "note"
#: documents/models.py:996
msgid "page"
msgstr "pagina"
msgstr ""
#: documents/models.py:997
msgid "Page of the original file, starting at 1"
msgstr "Pagina del file originale, partendo da 1"
msgstr ""
#: documents/models.py:1052
msgid "format"
msgstr "formato"
msgstr ""
#: documents/models.py:1056
msgid "document barcode"
msgstr "codice a barre del documento"
msgstr ""
#: documents/models.py:1057
msgid "document barcodes"
msgstr "codici a barre del documento"
msgstr ""
#: documents/models.py:1066
msgid "Original"
@@ -1636,7 +1636,7 @@ msgid "workflow runs"
msgstr "esecuzioni del flusso di lavoro"
#: documents/serialisers.py:515 documents/serialisers.py:872
#: documents/serialisers.py:2902 documents/views.py:363 documents/views.py:2768
#: documents/serialisers.py:2902 documents/views.py:343 documents/views.py:2732
#: paperless_mail/serialisers.py:156
msgid "Insufficient permissions."
msgstr "Autorizzazioni insufficienti."
@@ -1676,7 +1676,7 @@ msgstr "Variabile non valida rilevata."
msgid "Duplicate document identifiers are not allowed."
msgstr "Non sono consentiti identificatori di documenti duplicati."
#: documents/serialisers.py:2988 documents/views.py:4811
#: documents/serialisers.py:2988 documents/views.py:4787
#, python-format
msgid "Documents not found: %(ids)s"
msgstr "Documenti non trovati: %(ids)s"
@@ -1913,44 +1913,59 @@ msgstr "Stai per utilizzare il tuo account %(provider_name)s per effettuare il l
msgid "As a final step, please complete the following form:"
msgstr "Come ultimo passo, compila il seguente modulo:"
#: documents/validators.py:24
#, python-brace-format
msgid "Unable to parse URI {value}, missing scheme"
msgstr "Impossibile analizzare l'URI {value}, schema mancante"
#: documents/validators.py:29
#, python-brace-format
msgid "Unable to parse URI {value}, missing net location or path"
msgstr "Impossibile analizzare l'URI {value}, posizione o percorso di rete mancante"
#: documents/validators.py:36
msgid ", "
msgstr ", "
msgid "URI scheme '{parts.scheme}' is not allowed. Allowed schemes: {', '.join(allowed_schemes)}"
msgstr "Lo schema URI '{parts.scheme}' non è consentito. Schemi consentiti: {', '.join(allowed_schemes)}"
#: documents/views.py:318
msgid "Specify only one of text, title_search, query, or more_like_id."
msgstr "Specificare solo uno tra text, title_search, query o more_like_id."
#: documents/validators.py:45
#, python-brace-format
msgid "Unable to parse URI {value}"
msgstr "Impossibile analizzare l'URI {value}"
#: documents/views.py:356 documents/views.py:2765
#: documents/views.py:336 documents/views.py:2729
msgid "Invalid more_like_id"
msgstr "more_like_id non valido"
#: documents/views.py:1703
#: documents/views.py:1676
msgid "Invalid AI configuration."
msgstr "Configurazione AI non valida."
#: documents/views.py:1714
#: documents/views.py:1687
msgid "AI backend request timed out."
msgstr "Richiesta di backend AI scaduta."
#: documents/views.py:1726
#: documents/views.py:1699
msgid "AI backend rejected the request. Check logs for details."
msgstr "Il backend IA ha rifiutato la richiesta. Controlla i log per i dettagli."
#: documents/views.py:4827
#: documents/views.py:2554 documents/views.py:2870
msgid "Specify only one of text, title_search, query, or more_like_id."
msgstr "Specificare solo uno tra text, title_search, query o more_like_id."
#: documents/views.py:4800
#, python-format
msgid "Insufficient permissions to share document %(id)s."
msgstr "Autorizzazioni insufficienti per condividere il documento %(id)s."
#: documents/views.py:4874
#: documents/views.py:4846
msgid "Bundle is already being processed."
msgstr "Il pacchetto è già in fase di elaborazione."
#: documents/views.py:4938
#: documents/views.py:4910
msgid "The share link bundle is still being prepared. Please try again later."
msgstr "Il pacchetto di link di condivisione è ancora in fase di preparazione. Riprova più tardi."
#: documents/views.py:4952
#: documents/views.py:4924
msgid "The share link bundle is unavailable."
msgstr "Il pacchetto di link di condivisione non è disponibile."
@@ -2168,7 +2183,7 @@ msgstr "Abilita la suddivisione sui codici a barre dei tag"
#: paperless/models.py:308
msgid "Stores the values of detected barcodes"
msgstr "Memorizza i valori dei codici a barre individuati"
msgstr ""
#: paperless/models.py:318
msgid "Sets the remote OCR engine"
@@ -2242,151 +2257,151 @@ msgstr "Impostare il timeout dell’LLM in secondi"
msgid "paperless application settings"
msgstr "impostazioni dell'applicazione paperless"
#: paperless/settings/__init__.py:562
#: paperless/settings/__init__.py:561
msgid "English (US)"
msgstr "Inglese (US)"
#: paperless/settings/__init__.py:563
#: paperless/settings/__init__.py:562
msgid "Arabic"
msgstr "Arabo"
#: paperless/settings/__init__.py:564
#: paperless/settings/__init__.py:563
msgid "Afrikaans"
msgstr "Afrikaans"
#: paperless/settings/__init__.py:565
#: paperless/settings/__init__.py:564
msgid "Belarusian"
msgstr "Bielorusso"
#: paperless/settings/__init__.py:566
#: paperless/settings/__init__.py:565
msgid "Bulgarian"
msgstr "Bulgaro"
#: paperless/settings/__init__.py:567
#: paperless/settings/__init__.py:566
msgid "Catalan"
msgstr "Catalano"
#: paperless/settings/__init__.py:568
#: paperless/settings/__init__.py:567
msgid "Czech"
msgstr "Ceco"
#: paperless/settings/__init__.py:569
#: paperless/settings/__init__.py:568
msgid "Danish"
msgstr "Danese"
#: paperless/settings/__init__.py:570
#: paperless/settings/__init__.py:569
msgid "German"
msgstr "Tedesco"
#: paperless/settings/__init__.py:571
#: paperless/settings/__init__.py:570
msgid "Greek"
msgstr "Greco"
#: paperless/settings/__init__.py:572
#: paperless/settings/__init__.py:571
msgid "English (GB)"
msgstr "Inglese (GB)"
#: paperless/settings/__init__.py:573
#: paperless/settings/__init__.py:572
msgid "Spanish"
msgstr "Spagnolo"
#: paperless/settings/__init__.py:574
#: paperless/settings/__init__.py:573
msgid "Persian"
msgstr "Persiano"
#: paperless/settings/__init__.py:575
#: paperless/settings/__init__.py:574
msgid "Finnish"
msgstr "Finlandese"
#: paperless/settings/__init__.py:576
#: paperless/settings/__init__.py:575
msgid "French"
msgstr "Francese"
#: paperless/settings/__init__.py:577
#: paperless/settings/__init__.py:576
msgid "Hungarian"
msgstr "Ungherese"
#: paperless/settings/__init__.py:578
#: paperless/settings/__init__.py:577
msgid "Indonesian"
msgstr "Indonesiano"
#: paperless/settings/__init__.py:579
#: paperless/settings/__init__.py:578
msgid "Italian"
msgstr "Italiano"
#: paperless/settings/__init__.py:580
#: paperless/settings/__init__.py:579
msgid "Japanese"
msgstr "Giapponese"
#: paperless/settings/__init__.py:581
#: paperless/settings/__init__.py:580
msgid "Korean"
msgstr "Coreano"
#: paperless/settings/__init__.py:582
#: paperless/settings/__init__.py:581
msgid "Luxembourgish"
msgstr "Lussemburghese"
#: paperless/settings/__init__.py:583
#: paperless/settings/__init__.py:582
msgid "Norwegian"
msgstr "Norvegese"
#: paperless/settings/__init__.py:584
#: paperless/settings/__init__.py:583
msgid "Dutch"
msgstr "Olandese"
#: paperless/settings/__init__.py:585
#: paperless/settings/__init__.py:584
msgid "Polish"
msgstr "Polacco"
#: paperless/settings/__init__.py:586
#: paperless/settings/__init__.py:585
msgid "Portuguese (Brazil)"
msgstr "Portoghese (Brasile)"
#: paperless/settings/__init__.py:587
#: paperless/settings/__init__.py:586
msgid "Portuguese"
msgstr "Portoghese"
#: paperless/settings/__init__.py:588
#: paperless/settings/__init__.py:587
msgid "Romanian"
msgstr "Rumeno"
#: paperless/settings/__init__.py:589
#: paperless/settings/__init__.py:588
msgid "Russian"
msgstr "Russo"
#: paperless/settings/__init__.py:590
#: paperless/settings/__init__.py:589
msgid "Slovak"
msgstr "Slovacco"
#: paperless/settings/__init__.py:591
#: paperless/settings/__init__.py:590
msgid "Slovenian"
msgstr "Sloveno"
#: paperless/settings/__init__.py:592
#: paperless/settings/__init__.py:591
msgid "Serbian"
msgstr "Serbo"
#: paperless/settings/__init__.py:593
#: paperless/settings/__init__.py:592
msgid "Swedish"
msgstr "Svedese"
#: paperless/settings/__init__.py:594
#: paperless/settings/__init__.py:593
msgid "Turkish"
msgstr "Turco"
#: paperless/settings/__init__.py:595
#: paperless/settings/__init__.py:594
msgid "Ukrainian"
msgstr "Ucraino"
#: paperless/settings/__init__.py:596
#: paperless/settings/__init__.py:595
msgid "Vietnamese"
msgstr "Vietnamita"
#: paperless/settings/__init__.py:597
#: paperless/settings/__init__.py:596
msgid "Chinese Simplified"
msgstr "Cinese semplificato"
#: paperless/settings/__init__.py:598
#: paperless/settings/__init__.py:597
msgid "Chinese Traditional"
msgstr "Cinese tradizionale"
+122 -107
View File
@@ -2,8 +2,8 @@ msgid ""
msgstr ""
"Project-Id-Version: paperless-ngx\n"
"Report-Msgid-Bugs-To: \n"
"POT-Creation-Date: 2026-10-14 15:18+0000\n"
"PO-Revision-Date: 2026-10-15 12:29\n"
"POT-Creation-Date: 2026-10-05 16:26+0000\n"
"PO-Revision-Date: 2026-10-05 16:27\n"
"Last-Translator: \n"
"Language-Team: Japanese\n"
"Language: ja_JP\n"
@@ -21,39 +21,39 @@ msgstr ""
msgid "Documents"
msgstr "ドキュメント"
#: documents/filters.py:464
#: documents/filters.py:463
msgid "Value must be valid JSON."
msgstr "値は有効なJSONである必要があります。"
#: documents/filters.py:483
#: documents/filters.py:482
msgid "Invalid custom field query expression"
msgstr "無効なカスタムフィールドクエリ式"
#: documents/filters.py:493
#: documents/filters.py:492
msgid "Invalid expression list. Must be nonempty."
msgstr "無効な式リストです。空であってはなりません。"
#: documents/filters.py:514
#: documents/filters.py:513
msgid "Invalid logical operator {op!r}"
msgstr "無効な論理演算子 {op!r}"
#: documents/filters.py:528
#: documents/filters.py:527
msgid "Maximum number of query conditions exceeded."
msgstr "クエリ条件の最大数を超えました。"
#: documents/filters.py:592
#: documents/filters.py:591
msgid "{name!r} is not a valid custom field."
msgstr "{name!r} は有効なカスタムフィールドではありません。"
#: documents/filters.py:629
#: documents/filters.py:628
msgid "{data_type} does not support query expr {expr!r}."
msgstr "{data_type} はクエリ expr {expr!r} をサポートしていません。"
#: documents/filters.py:748 documents/models.py:137
#: documents/filters.py:747 documents/models.py:137
msgid "Maximum nesting depth exceeded."
msgstr "最大ネストの深さを超えました。"
#: documents/filters.py:1125
#: documents/filters.py:1109
msgid "Custom field not found"
msgstr "カスタムフィールドが見つかりません"
@@ -136,7 +136,7 @@ msgstr "タグ"
#: documents/models.py:125
msgid "Cannot set itself as parent."
msgstr "親として設定することはできません。"
msgstr ""
#: documents/models.py:127
msgid "Cannot set parent to a descendant."
@@ -249,23 +249,23 @@ msgstr "物理的なドキュメントアーカイブ内での、このドキュ
#: documents/models.py:321
msgid "root document for this version"
msgstr "このバージョンのルートドキュメント"
msgstr ""
#: documents/models.py:325
msgid "version index"
msgstr "バージョンのインデックス"
msgstr ""
#: documents/models.py:329
msgid "Index of this version within the root document."
msgstr "ルートドキュメント内における、このバージョンのインデックス"
msgstr ""
#: documents/models.py:333
msgid "version label"
msgstr "バージョンラベル"
msgstr ""
#: documents/models.py:337
msgid "Optional short label for a document version."
msgstr "ドキュメントバージョンの任意の短いラベル。"
msgstr ""
#: documents/models.py:342 documents/models.py:961 documents/models.py:992
#: documents/models.py:1096 documents/models.py:2126
@@ -282,119 +282,119 @@ msgstr "アーカイブ"
#: documents/models.py:563
msgid "Bank"
msgstr "銀行"
msgstr ""
#: documents/models.py:564
msgid "Basket"
msgstr "買い物かご"
msgstr ""
#: documents/models.py:565
msgid "Bell"
msgstr "ベル"
msgstr ""
#: documents/models.py:566
msgid "Bookmark"
msgstr "ブックマーク"
msgstr ""
#: documents/models.py:567
msgid "Boxes"
msgstr "箱"
msgstr ""
#: documents/models.py:568
msgid "Briefcase"
msgstr "ブリーフケース"
msgstr ""
#: documents/models.py:569
msgid "Building"
msgstr "建物"
msgstr ""
#: documents/models.py:570
msgid "Calculator"
msgstr "電卓"
msgstr ""
#: documents/models.py:571
msgid "Calendar"
msgstr "カレンダー"
msgstr ""
#: documents/models.py:572
msgid "Camera"
msgstr "カメラ"
msgstr ""
#: documents/models.py:573
msgid "Checklist"
msgstr "チェックリスト"
msgstr ""
#: documents/models.py:574
msgid "Cash"
msgstr "現金"
msgstr ""
#: documents/models.py:575
msgid "Chat"
msgstr "チャット"
msgstr ""
#: documents/models.py:576
msgid "Check"
msgstr "確認"
msgstr ""
#: documents/models.py:577
msgid "Clipboard"
msgstr "クリップボード"
msgstr ""
#: documents/models.py:578
msgid "Clock"
msgstr "時計"
msgstr ""
#: documents/models.py:579
msgid "Credit card"
msgstr "クレジットカード"
msgstr ""
#: documents/models.py:580
msgid "Download"
msgstr "ダウンロード"
msgstr ""
#: documents/models.py:581
msgid "Envelope"
msgstr "封筒"
msgstr ""
#: documents/models.py:582
msgid "Warning"
msgstr "警告"
msgstr ""
#: documents/models.py:583
msgid "File"
msgstr "ファイル"
msgstr ""
#: documents/models.py:584
msgid "Checked file"
msgstr "チェック済みファイル"
msgstr ""
#: documents/models.py:585
msgid "Locked file"
msgstr "ロックされたファイル"
msgstr ""
#: documents/models.py:586
msgid "Medical file"
msgstr "医療ファイル"
msgstr ""
#: documents/models.py:587
msgid "Person file"
msgstr "個人ファイル"
msgstr ""
#: documents/models.py:590
msgid "Spreadsheet"
msgstr "スプレッドシート"
msgstr ""
#: documents/models.py:592
msgid "Text file"
msgstr "テキストファイル"
msgstr ""
#: documents/models.py:593
msgid "Files"
msgstr "ファイル"
msgstr ""
#: documents/models.py:594
msgid "Folder"
msgstr "フォルダー"
msgstr ""
#: documents/models.py:595 paperless_mail/admin.py:58
msgid "Filter"
@@ -406,11 +406,11 @@ msgstr ""
#: documents/models.py:597
msgid "Globe"
msgstr "地球儀"
msgstr ""
#: documents/models.py:598
msgid "Hash"
msgstr "ハッシュ"
msgstr ""
#: documents/models.py:599
msgid "Heart"
@@ -418,27 +418,27 @@ msgstr ""
#: documents/models.py:600
msgid "House"
msgstr "家"
msgstr ""
#: documents/models.py:601
msgid "Inbox"
msgstr "受信トレイ"
msgstr ""
#: documents/models.py:602
msgid "Journals"
msgstr "日記"
msgstr ""
#: documents/models.py:603
msgid "Task list"
msgstr "タスクリスト"
msgstr ""
#: documents/models.py:604
msgid "Newspaper"
msgstr "新聞"
msgstr ""
#: documents/models.py:605
msgid "Attachment"
msgstr "添付ファイル"
msgstr ""
#: documents/models.py:606
msgid "People"
@@ -446,15 +446,15 @@ msgstr ""
#: documents/models.py:607
msgid "Person"
msgstr "人物"
msgstr ""
#: documents/models.py:608
msgid "Printer"
msgstr "プリンター"
msgstr ""
#: documents/models.py:609
msgid "Receipt"
msgstr "領収書"
msgstr ""
#: documents/models.py:610
msgid "Safe"
@@ -1636,7 +1636,7 @@ msgid "workflow runs"
msgstr "ワークフローの実行"
#: documents/serialisers.py:515 documents/serialisers.py:872
#: documents/serialisers.py:2902 documents/views.py:363 documents/views.py:2768
#: documents/serialisers.py:2902 documents/views.py:343 documents/views.py:2732
#: paperless_mail/serialisers.py:156
msgid "Insufficient permissions."
msgstr ""
@@ -1676,7 +1676,7 @@ msgstr "無効な変数を検出しました"
msgid "Duplicate document identifiers are not allowed."
msgstr ""
#: documents/serialisers.py:2988 documents/views.py:4811
#: documents/serialisers.py:2988 documents/views.py:4787
#, python-format
msgid "Documents not found: %(ids)s"
msgstr ""
@@ -1913,44 +1913,59 @@ msgstr "%(provider_name)s アカウントでログインしようとしていま
msgid "As a final step, please complete the following form:"
msgstr "最後のステップとして、以下のフォームに記入してください"
#: documents/validators.py:24
#, python-brace-format
msgid "Unable to parse URI {value}, missing scheme"
msgstr ""
#: documents/validators.py:29
#, python-brace-format
msgid "Unable to parse URI {value}, missing net location or path"
msgstr ""
#: documents/validators.py:36
msgid ", "
msgid "URI scheme '{parts.scheme}' is not allowed. Allowed schemes: {', '.join(allowed_schemes)}"
msgstr ""
#: documents/views.py:318
msgid "Specify only one of text, title_search, query, or more_like_id."
#: documents/validators.py:45
#, python-brace-format
msgid "Unable to parse URI {value}"
msgstr ""
#: documents/views.py:356 documents/views.py:2765
#: documents/views.py:336 documents/views.py:2729
msgid "Invalid more_like_id"
msgstr ""
#: documents/views.py:1703
#: documents/views.py:1676
msgid "Invalid AI configuration."
msgstr ""
#: documents/views.py:1714
#: documents/views.py:1687
msgid "AI backend request timed out."
msgstr ""
#: documents/views.py:1726
#: documents/views.py:1699
msgid "AI backend rejected the request. Check logs for details."
msgstr ""
#: documents/views.py:4827
#: documents/views.py:2554 documents/views.py:2870
msgid "Specify only one of text, title_search, query, or more_like_id."
msgstr ""
#: documents/views.py:4800
#, python-format
msgid "Insufficient permissions to share document %(id)s."
msgstr ""
#: documents/views.py:4874
#: documents/views.py:4846
msgid "Bundle is already being processed."
msgstr ""
#: documents/views.py:4938
#: documents/views.py:4910
msgid "The share link bundle is still being prepared. Please try again later."
msgstr ""
#: documents/views.py:4952
#: documents/views.py:4924
msgid "The share link bundle is unavailable."
msgstr ""
@@ -2242,151 +2257,151 @@ msgstr ""
msgid "paperless application settings"
msgstr "Paperless アプリケーションの設定"
#: paperless/settings/__init__.py:562
#: paperless/settings/__init__.py:561
msgid "English (US)"
msgstr "英語 (米国)"
#: paperless/settings/__init__.py:563
#: paperless/settings/__init__.py:562
msgid "Arabic"
msgstr "アラビア語"
#: paperless/settings/__init__.py:564
#: paperless/settings/__init__.py:563
msgid "Afrikaans"
msgstr "アフリカーンス語"
#: paperless/settings/__init__.py:565
#: paperless/settings/__init__.py:564
msgid "Belarusian"
msgstr "ベラルーシ語"
#: paperless/settings/__init__.py:566
#: paperless/settings/__init__.py:565
msgid "Bulgarian"
msgstr "ブルガリア語"
#: paperless/settings/__init__.py:567
#: paperless/settings/__init__.py:566
msgid "Catalan"
msgstr "カタロニア語"
#: paperless/settings/__init__.py:568
#: paperless/settings/__init__.py:567
msgid "Czech"
msgstr "チェコ語"
#: paperless/settings/__init__.py:569
#: paperless/settings/__init__.py:568
msgid "Danish"
msgstr "デンマーク語"
#: paperless/settings/__init__.py:570
#: paperless/settings/__init__.py:569
msgid "German"
msgstr "ドイツ語"
#: paperless/settings/__init__.py:571
#: paperless/settings/__init__.py:570
msgid "Greek"
msgstr "ギリシャ語"
#: paperless/settings/__init__.py:572
#: paperless/settings/__init__.py:571
msgid "English (GB)"
msgstr "英語 (英国)"
#: paperless/settings/__init__.py:573
#: paperless/settings/__init__.py:572
msgid "Spanish"
msgstr "スペイン語"
#: paperless/settings/__init__.py:574
#: paperless/settings/__init__.py:573
msgid "Persian"
msgstr ""
#: paperless/settings/__init__.py:575
#: paperless/settings/__init__.py:574
msgid "Finnish"
msgstr "フィンランド語"
#: paperless/settings/__init__.py:576
#: paperless/settings/__init__.py:575
msgid "French"
msgstr "フランス語"
#: paperless/settings/__init__.py:577
#: paperless/settings/__init__.py:576
msgid "Hungarian"
msgstr "ハンガリー語"
#: paperless/settings/__init__.py:578
#: paperless/settings/__init__.py:577
msgid "Indonesian"
msgstr ""
#: paperless/settings/__init__.py:579
#: paperless/settings/__init__.py:578
msgid "Italian"
msgstr "イタリア語"
#: paperless/settings/__init__.py:580
#: paperless/settings/__init__.py:579
msgid "Japanese"
msgstr "日本語"
#: paperless/settings/__init__.py:581
#: paperless/settings/__init__.py:580
msgid "Korean"
msgstr "韓国語"
#: paperless/settings/__init__.py:582
#: paperless/settings/__init__.py:581
msgid "Luxembourgish"
msgstr "ルクセンブルク語"
#: paperless/settings/__init__.py:583
#: paperless/settings/__init__.py:582
msgid "Norwegian"
msgstr "ノルウェー語"
#: paperless/settings/__init__.py:584
#: paperless/settings/__init__.py:583
msgid "Dutch"
msgstr "オランダ語"
#: paperless/settings/__init__.py:585
#: paperless/settings/__init__.py:584
msgid "Polish"
msgstr "ポーランド語"
#: paperless/settings/__init__.py:586
#: paperless/settings/__init__.py:585
msgid "Portuguese (Brazil)"
msgstr "ポルトガル語 (ブラジル)"
#: paperless/settings/__init__.py:587
#: paperless/settings/__init__.py:586
msgid "Portuguese"
msgstr "ポルトガル語"
#: paperless/settings/__init__.py:588
#: paperless/settings/__init__.py:587
msgid "Romanian"
msgstr "ルーマニア語"
#: paperless/settings/__init__.py:589
#: paperless/settings/__init__.py:588
msgid "Russian"
msgstr "ロシア語"
#: paperless/settings/__init__.py:590
#: paperless/settings/__init__.py:589
msgid "Slovak"
msgstr "スロバキア語"
#: paperless/settings/__init__.py:591
#: paperless/settings/__init__.py:590
msgid "Slovenian"
msgstr "スロベニア語"
#: paperless/settings/__init__.py:592
#: paperless/settings/__init__.py:591
msgid "Serbian"
msgstr "セルビア語"
#: paperless/settings/__init__.py:593
#: paperless/settings/__init__.py:592
msgid "Swedish"
msgstr "スウェーデン語"
#: paperless/settings/__init__.py:594
#: paperless/settings/__init__.py:593
msgid "Turkish"
msgstr "トルコ語"
#: paperless/settings/__init__.py:595
#: paperless/settings/__init__.py:594
msgid "Ukrainian"
msgstr "ウクライナ語"
#: paperless/settings/__init__.py:596
#: paperless/settings/__init__.py:595
msgid "Vietnamese"
msgstr ""
#: paperless/settings/__init__.py:597
#: paperless/settings/__init__.py:596
msgid "Chinese Simplified"
msgstr "中国語 (簡体字)"
#: paperless/settings/__init__.py:598
#: paperless/settings/__init__.py:597
msgid "Chinese Traditional"
msgstr "中国語 (繁体)"
+78 -63
View File
@@ -2,8 +2,8 @@ msgid ""
msgstr ""
"Project-Id-Version: paperless-ngx\n"
"Report-Msgid-Bugs-To: \n"
"POT-Creation-Date: 2026-10-14 15:18+0000\n"
"PO-Revision-Date: 2026-10-14 15:19\n"
"POT-Creation-Date: 2026-10-05 16:26+0000\n"
"PO-Revision-Date: 2026-10-05 16:27\n"
"Last-Translator: \n"
"Language-Team: Korean\n"
"Language: ko_KR\n"
@@ -21,39 +21,39 @@ msgstr ""
msgid "Documents"
msgstr "문서"
#: documents/filters.py:464
#: documents/filters.py:463
msgid "Value must be valid JSON."
msgstr "값은 유효한 JSON이어야 합니다."
#: documents/filters.py:483
#: documents/filters.py:482
msgid "Invalid custom field query expression"
msgstr "잘못된 사용자 정의 필드 쿼리 표현식"
#: documents/filters.py:493
#: documents/filters.py:492
msgid "Invalid expression list. Must be nonempty."
msgstr "잘못된 표현식 목록입니다. 비어 있지 않아야 합니다."
#: documents/filters.py:514
#: documents/filters.py:513
msgid "Invalid logical operator {op!r}"
msgstr "잘못된 논리 연산자 {op!r}"
#: documents/filters.py:528
#: documents/filters.py:527
msgid "Maximum number of query conditions exceeded."
msgstr "쿼리 조건의 최대 개수를 초과했습니다."
#: documents/filters.py:592
#: documents/filters.py:591
msgid "{name!r} is not a valid custom field."
msgstr "{name!r} 은 잘못된 사용자 정의 필드입니다."
#: documents/filters.py:629
#: documents/filters.py:628
msgid "{data_type} does not support query expr {expr!r}."
msgstr "{data_type}은 쿼리 표현식 {expr!r}을(를) 지원하지 않습니다."
#: documents/filters.py:748 documents/models.py:137
#: documents/filters.py:747 documents/models.py:137
msgid "Maximum nesting depth exceeded."
msgstr "최대 중첩 깊이를 초과했습니다."
#: documents/filters.py:1125
#: documents/filters.py:1109
msgid "Custom field not found"
msgstr "사용자 지정 필드를 찾을 수 없음"
@@ -1636,7 +1636,7 @@ msgid "workflow runs"
msgstr "워크플로우 실행"
#: documents/serialisers.py:515 documents/serialisers.py:872
#: documents/serialisers.py:2902 documents/views.py:363 documents/views.py:2768
#: documents/serialisers.py:2902 documents/views.py:343 documents/views.py:2732
#: paperless_mail/serialisers.py:156
msgid "Insufficient permissions."
msgstr ""
@@ -1676,7 +1676,7 @@ msgstr "잘못된 변수가 감지되었습니다."
msgid "Duplicate document identifiers are not allowed."
msgstr ""
#: documents/serialisers.py:2988 documents/views.py:4811
#: documents/serialisers.py:2988 documents/views.py:4787
#, python-format
msgid "Documents not found: %(ids)s"
msgstr ""
@@ -1913,44 +1913,59 @@ msgstr "%(provider_name)s 의 계정을 사용하여 로그인하려고 합니
msgid "As a final step, please complete the following form:"
msgstr "마지막 단계로 다음 양식을 작성해 주세요:"
#: documents/validators.py:24
#, python-brace-format
msgid "Unable to parse URI {value}, missing scheme"
msgstr "{value} URI를 파싱할 수 없습니다: 스킴이 누락되었습니다."
#: documents/validators.py:29
#, python-brace-format
msgid "Unable to parse URI {value}, missing net location or path"
msgstr "{value} URI를 파싱할 수 없습니다: 네트워크 위치 또는 경로가 누락되었습니다."
#: documents/validators.py:36
msgid ", "
msgstr ""
msgid "URI scheme '{parts.scheme}' is not allowed. Allowed schemes: {', '.join(allowed_schemes)}"
msgstr "URI 스킴 '{parts.scheme}'는 허용되지 않습니다. 허용된 스킴: {', '.join(allowed_schemes)}"
#: documents/views.py:318
msgid "Specify only one of text, title_search, query, or more_like_id."
msgstr ""
#: documents/validators.py:45
#, python-brace-format
msgid "Unable to parse URI {value}"
msgstr "{value} URI를 파싱할 수 없음"
#: documents/views.py:356 documents/views.py:2765
#: documents/views.py:336 documents/views.py:2729
msgid "Invalid more_like_id"
msgstr ""
#: documents/views.py:1703
#: documents/views.py:1676
msgid "Invalid AI configuration."
msgstr ""
#: documents/views.py:1714
#: documents/views.py:1687
msgid "AI backend request timed out."
msgstr ""
#: documents/views.py:1726
#: documents/views.py:1699
msgid "AI backend rejected the request. Check logs for details."
msgstr ""
#: documents/views.py:4827
#: documents/views.py:2554 documents/views.py:2870
msgid "Specify only one of text, title_search, query, or more_like_id."
msgstr ""
#: documents/views.py:4800
#, python-format
msgid "Insufficient permissions to share document %(id)s."
msgstr ""
#: documents/views.py:4874
#: documents/views.py:4846
msgid "Bundle is already being processed."
msgstr ""
#: documents/views.py:4938
#: documents/views.py:4910
msgid "The share link bundle is still being prepared. Please try again later."
msgstr ""
#: documents/views.py:4952
#: documents/views.py:4924
msgid "The share link bundle is unavailable."
msgstr ""
@@ -2242,151 +2257,151 @@ msgstr ""
msgid "paperless application settings"
msgstr "페이퍼리스 애플리케이션 설정"
#: paperless/settings/__init__.py:562
#: paperless/settings/__init__.py:561
msgid "English (US)"
msgstr "영어 (미국)"
#: paperless/settings/__init__.py:563
#: paperless/settings/__init__.py:562
msgid "Arabic"
msgstr "아랍어"
#: paperless/settings/__init__.py:564
#: paperless/settings/__init__.py:563
msgid "Afrikaans"
msgstr "아프리칸스어"
#: paperless/settings/__init__.py:565
#: paperless/settings/__init__.py:564
msgid "Belarusian"
msgstr "벨라루스어"
#: paperless/settings/__init__.py:566
#: paperless/settings/__init__.py:565
msgid "Bulgarian"
msgstr "불가리어"
#: paperless/settings/__init__.py:567
#: paperless/settings/__init__.py:566
msgid "Catalan"
msgstr "카탈로니아어"
#: paperless/settings/__init__.py:568
#: paperless/settings/__init__.py:567
msgid "Czech"
msgstr "체코어"
#: paperless/settings/__init__.py:569
#: paperless/settings/__init__.py:568
msgid "Danish"
msgstr "덴마크어"
#: paperless/settings/__init__.py:570
#: paperless/settings/__init__.py:569
msgid "German"
msgstr "독일어"
#: paperless/settings/__init__.py:571
#: paperless/settings/__init__.py:570
msgid "Greek"
msgstr "그리스어"
#: paperless/settings/__init__.py:572
#: paperless/settings/__init__.py:571
msgid "English (GB)"
msgstr "영어 (영국)"
#: paperless/settings/__init__.py:573
#: paperless/settings/__init__.py:572
msgid "Spanish"
msgstr "스페인어"
#: paperless/settings/__init__.py:574
#: paperless/settings/__init__.py:573
msgid "Persian"
msgstr "페르시아어"
#: paperless/settings/__init__.py:575
#: paperless/settings/__init__.py:574
msgid "Finnish"
msgstr "핀란드어"
#: paperless/settings/__init__.py:576
#: paperless/settings/__init__.py:575
msgid "French"
msgstr "프랑스어"
#: paperless/settings/__init__.py:577
#: paperless/settings/__init__.py:576
msgid "Hungarian"
msgstr "헝가리어"
#: paperless/settings/__init__.py:578
#: paperless/settings/__init__.py:577
msgid "Indonesian"
msgstr ""
#: paperless/settings/__init__.py:579
#: paperless/settings/__init__.py:578
msgid "Italian"
msgstr "이탈리아어"
#: paperless/settings/__init__.py:580
#: paperless/settings/__init__.py:579
msgid "Japanese"
msgstr "일본어"
#: paperless/settings/__init__.py:581
#: paperless/settings/__init__.py:580
msgid "Korean"
msgstr "한국어"
#: paperless/settings/__init__.py:582
#: paperless/settings/__init__.py:581
msgid "Luxembourgish"
msgstr "룩셈부르크어"
#: paperless/settings/__init__.py:583
#: paperless/settings/__init__.py:582
msgid "Norwegian"
msgstr "노르웨이어"
#: paperless/settings/__init__.py:584
#: paperless/settings/__init__.py:583
msgid "Dutch"
msgstr "네덜란드어"
#: paperless/settings/__init__.py:585
#: paperless/settings/__init__.py:584
msgid "Polish"
msgstr "폴란드어"
#: paperless/settings/__init__.py:586
#: paperless/settings/__init__.py:585
msgid "Portuguese (Brazil)"
msgstr "포르투갈어 (브라질)"
#: paperless/settings/__init__.py:587
#: paperless/settings/__init__.py:586
msgid "Portuguese"
msgstr "포르투갈어"
#: paperless/settings/__init__.py:588
#: paperless/settings/__init__.py:587
msgid "Romanian"
msgstr "루마니아어"
#: paperless/settings/__init__.py:589
#: paperless/settings/__init__.py:588
msgid "Russian"
msgstr "러시아어"
#: paperless/settings/__init__.py:590
#: paperless/settings/__init__.py:589
msgid "Slovak"
msgstr "슬로바키아어"
#: paperless/settings/__init__.py:591
#: paperless/settings/__init__.py:590
msgid "Slovenian"
msgstr "슬로베니아어"
#: paperless/settings/__init__.py:592
#: paperless/settings/__init__.py:591
msgid "Serbian"
msgstr "세르비아어"
#: paperless/settings/__init__.py:593
#: paperless/settings/__init__.py:592
msgid "Swedish"
msgstr "스웨덴어"
#: paperless/settings/__init__.py:594
#: paperless/settings/__init__.py:593
msgid "Turkish"
msgstr "튀르키예어"
#: paperless/settings/__init__.py:595
#: paperless/settings/__init__.py:594
msgid "Ukrainian"
msgstr "우크라이나어"
#: paperless/settings/__init__.py:596
#: paperless/settings/__init__.py:595
msgid "Vietnamese"
msgstr "베트남어"
#: paperless/settings/__init__.py:597
#: paperless/settings/__init__.py:596
msgid "Chinese Simplified"
msgstr "중국어 간체"
#: paperless/settings/__init__.py:598
#: paperless/settings/__init__.py:597
msgid "Chinese Traditional"
msgstr "중국어 번체"
+76 -61
View File
@@ -2,8 +2,8 @@ msgid ""
msgstr ""
"Project-Id-Version: paperless-ngx\n"
"Report-Msgid-Bugs-To: \n"
"POT-Creation-Date: 2026-10-14 15:18+0000\n"
"PO-Revision-Date: 2026-10-14 15:19\n"
"POT-Creation-Date: 2026-10-05 16:26+0000\n"
"PO-Revision-Date: 2026-10-05 16:27\n"
"Last-Translator: \n"
"Language-Team: Luxembourgish\n"
"Language: lb_LU\n"
@@ -21,39 +21,39 @@ msgstr ""
msgid "Documents"
msgstr "Dokumenter"
#: documents/filters.py:464
#: documents/filters.py:463
msgid "Value must be valid JSON."
msgstr ""
#: documents/filters.py:483
#: documents/filters.py:482
msgid "Invalid custom field query expression"
msgstr ""
#: documents/filters.py:493
#: documents/filters.py:492
msgid "Invalid expression list. Must be nonempty."
msgstr ""
#: documents/filters.py:514
#: documents/filters.py:513
msgid "Invalid logical operator {op!r}"
msgstr ""
#: documents/filters.py:528
#: documents/filters.py:527
msgid "Maximum number of query conditions exceeded."
msgstr ""
#: documents/filters.py:592
#: documents/filters.py:591
msgid "{name!r} is not a valid custom field."
msgstr ""
#: documents/filters.py:629
#: documents/filters.py:628
msgid "{data_type} does not support query expr {expr!r}."
msgstr ""
#: documents/filters.py:748 documents/models.py:137
#: documents/filters.py:747 documents/models.py:137
msgid "Maximum nesting depth exceeded."
msgstr ""
#: documents/filters.py:1125
#: documents/filters.py:1109
msgid "Custom field not found"
msgstr ""
@@ -1636,7 +1636,7 @@ msgid "workflow runs"
msgstr ""
#: documents/serialisers.py:515 documents/serialisers.py:872
#: documents/serialisers.py:2902 documents/views.py:363 documents/views.py:2768
#: documents/serialisers.py:2902 documents/views.py:343 documents/views.py:2732
#: paperless_mail/serialisers.py:156
msgid "Insufficient permissions."
msgstr ""
@@ -1676,7 +1676,7 @@ msgstr "Ongëlteg Zeechen detektéiert."
msgid "Duplicate document identifiers are not allowed."
msgstr ""
#: documents/serialisers.py:2988 documents/views.py:4811
#: documents/serialisers.py:2988 documents/views.py:4787
#, python-format
msgid "Documents not found: %(ids)s"
msgstr ""
@@ -1912,44 +1912,59 @@ msgstr ""
msgid "As a final step, please complete the following form:"
msgstr ""
#: documents/validators.py:24
#, python-brace-format
msgid "Unable to parse URI {value}, missing scheme"
msgstr ""
#: documents/validators.py:29
#, python-brace-format
msgid "Unable to parse URI {value}, missing net location or path"
msgstr ""
#: documents/validators.py:36
msgid ", "
msgid "URI scheme '{parts.scheme}' is not allowed. Allowed schemes: {', '.join(allowed_schemes)}"
msgstr ""
#: documents/views.py:318
msgid "Specify only one of text, title_search, query, or more_like_id."
#: documents/validators.py:45
#, python-brace-format
msgid "Unable to parse URI {value}"
msgstr ""
#: documents/views.py:356 documents/views.py:2765
#: documents/views.py:336 documents/views.py:2729
msgid "Invalid more_like_id"
msgstr ""
#: documents/views.py:1703
#: documents/views.py:1676
msgid "Invalid AI configuration."
msgstr ""
#: documents/views.py:1714
#: documents/views.py:1687
msgid "AI backend request timed out."
msgstr ""
#: documents/views.py:1726
#: documents/views.py:1699
msgid "AI backend rejected the request. Check logs for details."
msgstr ""
#: documents/views.py:4827
#: documents/views.py:2554 documents/views.py:2870
msgid "Specify only one of text, title_search, query, or more_like_id."
msgstr ""
#: documents/views.py:4800
#, python-format
msgid "Insufficient permissions to share document %(id)s."
msgstr ""
#: documents/views.py:4874
#: documents/views.py:4846
msgid "Bundle is already being processed."
msgstr ""
#: documents/views.py:4938
#: documents/views.py:4910
msgid "The share link bundle is still being prepared. Please try again later."
msgstr ""
#: documents/views.py:4952
#: documents/views.py:4924
msgid "The share link bundle is unavailable."
msgstr ""
@@ -2241,151 +2256,151 @@ msgstr ""
msgid "paperless application settings"
msgstr ""
#: paperless/settings/__init__.py:562
#: paperless/settings/__init__.py:561
msgid "English (US)"
msgstr "Englesch (USA)"
#: paperless/settings/__init__.py:563
#: paperless/settings/__init__.py:562
msgid "Arabic"
msgstr ""
#: paperless/settings/__init__.py:564
#: paperless/settings/__init__.py:563
msgid "Afrikaans"
msgstr ""
#: paperless/settings/__init__.py:565
#: paperless/settings/__init__.py:564
msgid "Belarusian"
msgstr "Belarusesch"
#: paperless/settings/__init__.py:566
#: paperless/settings/__init__.py:565
msgid "Bulgarian"
msgstr ""
#: paperless/settings/__init__.py:567
#: paperless/settings/__init__.py:566
msgid "Catalan"
msgstr ""
#: paperless/settings/__init__.py:568
#: paperless/settings/__init__.py:567
msgid "Czech"
msgstr "Tschechesch"
#: paperless/settings/__init__.py:569
#: paperless/settings/__init__.py:568
msgid "Danish"
msgstr "Dänesch"
#: paperless/settings/__init__.py:570
#: paperless/settings/__init__.py:569
msgid "German"
msgstr "Däitsch"
#: paperless/settings/__init__.py:571
#: paperless/settings/__init__.py:570
msgid "Greek"
msgstr ""
#: paperless/settings/__init__.py:572
#: paperless/settings/__init__.py:571
msgid "English (GB)"
msgstr "Englesch (GB)"
#: paperless/settings/__init__.py:573
#: paperless/settings/__init__.py:572
msgid "Spanish"
msgstr "Spuenesch"
#: paperless/settings/__init__.py:574
#: paperless/settings/__init__.py:573
msgid "Persian"
msgstr ""
#: paperless/settings/__init__.py:575
#: paperless/settings/__init__.py:574
msgid "Finnish"
msgstr ""
#: paperless/settings/__init__.py:576
#: paperless/settings/__init__.py:575
msgid "French"
msgstr "Franséisch"
#: paperless/settings/__init__.py:577
#: paperless/settings/__init__.py:576
msgid "Hungarian"
msgstr ""
#: paperless/settings/__init__.py:578
#: paperless/settings/__init__.py:577
msgid "Indonesian"
msgstr ""
#: paperless/settings/__init__.py:579
#: paperless/settings/__init__.py:578
msgid "Italian"
msgstr "Italienesch"
#: paperless/settings/__init__.py:580
#: paperless/settings/__init__.py:579
msgid "Japanese"
msgstr ""
#: paperless/settings/__init__.py:581
#: paperless/settings/__init__.py:580
msgid "Korean"
msgstr ""
#: paperless/settings/__init__.py:582
#: paperless/settings/__init__.py:581
msgid "Luxembourgish"
msgstr "Lëtzebuergesch"
#: paperless/settings/__init__.py:583
#: paperless/settings/__init__.py:582
msgid "Norwegian"
msgstr ""
#: paperless/settings/__init__.py:584
#: paperless/settings/__init__.py:583
msgid "Dutch"
msgstr "Hollännesch"
#: paperless/settings/__init__.py:585
#: paperless/settings/__init__.py:584
msgid "Polish"
msgstr "Polnesch"
#: paperless/settings/__init__.py:586
#: paperless/settings/__init__.py:585
msgid "Portuguese (Brazil)"
msgstr "Portugisesch (Brasilien)"
#: paperless/settings/__init__.py:587
#: paperless/settings/__init__.py:586
msgid "Portuguese"
msgstr "Portugisesch"
#: paperless/settings/__init__.py:588
#: paperless/settings/__init__.py:587
msgid "Romanian"
msgstr "Rumänesch"
#: paperless/settings/__init__.py:589
#: paperless/settings/__init__.py:588
msgid "Russian"
msgstr "Russesch"
#: paperless/settings/__init__.py:590
#: paperless/settings/__init__.py:589
msgid "Slovak"
msgstr ""
#: paperless/settings/__init__.py:591
#: paperless/settings/__init__.py:590
msgid "Slovenian"
msgstr "Slowenesch"
#: paperless/settings/__init__.py:592
#: paperless/settings/__init__.py:591
msgid "Serbian"
msgstr "Serbesch"
#: paperless/settings/__init__.py:593
#: paperless/settings/__init__.py:592
msgid "Swedish"
msgstr "Schwedesch"
#: paperless/settings/__init__.py:594
#: paperless/settings/__init__.py:593
msgid "Turkish"
msgstr "Tierkesch"
#: paperless/settings/__init__.py:595
#: paperless/settings/__init__.py:594
msgid "Ukrainian"
msgstr ""
#: paperless/settings/__init__.py:596
#: paperless/settings/__init__.py:595
msgid "Vietnamese"
msgstr ""
#: paperless/settings/__init__.py:597
#: paperless/settings/__init__.py:596
msgid "Chinese Simplified"
msgstr "Chinesesch (Vereinfacht)"
#: paperless/settings/__init__.py:598
#: paperless/settings/__init__.py:597
msgid "Chinese Traditional"
msgstr ""
+78 -63
View File
@@ -2,8 +2,8 @@ msgid ""
msgstr ""
"Project-Id-Version: paperless-ngx\n"
"Report-Msgid-Bugs-To: \n"
"POT-Creation-Date: 2026-10-14 15:18+0000\n"
"PO-Revision-Date: 2026-10-14 15:19\n"
"POT-Creation-Date: 2026-10-05 16:26+0000\n"
"PO-Revision-Date: 2026-10-05 16:27\n"
"Last-Translator: \n"
"Language-Team: Lithuanian\n"
"Language: lt_LT\n"
@@ -21,39 +21,39 @@ msgstr ""
msgid "Documents"
msgstr "Dokumentai"
#: documents/filters.py:464
#: documents/filters.py:463
msgid "Value must be valid JSON."
msgstr "Reikšmė turi būti galiojantis JSON."
#: documents/filters.py:483
#: documents/filters.py:482
msgid "Invalid custom field query expression"
msgstr "Neteisinga pasirinktinio lauko užklausos išraiška"
#: documents/filters.py:493
#: documents/filters.py:492
msgid "Invalid expression list. Must be nonempty."
msgstr "Neteisingas išraiškos sąrašas. Jis turi būti netuščias."
#: documents/filters.py:514
#: documents/filters.py:513
msgid "Invalid logical operator {op!r}"
msgstr "Neteisingas loginis operatorius {op!r}"
#: documents/filters.py:528
#: documents/filters.py:527
msgid "Maximum number of query conditions exceeded."
msgstr "Viršytas maksimalus užklausos sąlygų skaičius."
#: documents/filters.py:592
#: documents/filters.py:591
msgid "{name!r} is not a valid custom field."
msgstr "{name!r} nėra galiojantis pasirinktas laukas."
#: documents/filters.py:629
#: documents/filters.py:628
msgid "{data_type} does not support query expr {expr!r}."
msgstr "{data_type} nepalaiko užklausos išraiškos {expr!r}."
#: documents/filters.py:748 documents/models.py:137
#: documents/filters.py:747 documents/models.py:137
msgid "Maximum nesting depth exceeded."
msgstr "Viršytas maksimalus įdėjimo gylis."
#: documents/filters.py:1125
#: documents/filters.py:1109
msgid "Custom field not found"
msgstr "Pasirinktinis laukas nerastas"
@@ -1636,7 +1636,7 @@ msgid "workflow runs"
msgstr ""
#: documents/serialisers.py:515 documents/serialisers.py:872
#: documents/serialisers.py:2902 documents/views.py:363 documents/views.py:2768
#: documents/serialisers.py:2902 documents/views.py:343 documents/views.py:2732
#: paperless_mail/serialisers.py:156
msgid "Insufficient permissions."
msgstr ""
@@ -1676,7 +1676,7 @@ msgstr ""
msgid "Duplicate document identifiers are not allowed."
msgstr ""
#: documents/serialisers.py:2988 documents/views.py:4811
#: documents/serialisers.py:2988 documents/views.py:4787
#, python-format
msgid "Documents not found: %(ids)s"
msgstr ""
@@ -1912,44 +1912,59 @@ msgstr "Ketinate prisijungimui naudoti savo %(provider_name)s paskyrą."
msgid "As a final step, please complete the following form:"
msgstr "Galiausiai užpildykite šią formą:"
#: documents/validators.py:24
#, python-brace-format
msgid "Unable to parse URI {value}, missing scheme"
msgstr "Nepavyko apdoroti URI {value}, trūksta schemos"
#: documents/validators.py:29
#, python-brace-format
msgid "Unable to parse URI {value}, missing net location or path"
msgstr "Nepavyko apdoroti URI {value}, trūksta tinklo vietos arba kelio"
#: documents/validators.py:36
msgid ", "
msgstr ""
msgid "URI scheme '{parts.scheme}' is not allowed. Allowed schemes: {', '.join(allowed_schemes)}"
msgstr "URI schema '{parts.scheme}' nėra leistina. Galimos schemos: {', '.join(allowed_schemes)}"
#: documents/views.py:318
msgid "Specify only one of text, title_search, query, or more_like_id."
msgstr ""
#: documents/validators.py:45
#, python-brace-format
msgid "Unable to parse URI {value}"
msgstr "Nepavyko apdoroti URI {value}"
#: documents/views.py:356 documents/views.py:2765
#: documents/views.py:336 documents/views.py:2729
msgid "Invalid more_like_id"
msgstr ""
#: documents/views.py:1703
#: documents/views.py:1676
msgid "Invalid AI configuration."
msgstr ""
#: documents/views.py:1714
#: documents/views.py:1687
msgid "AI backend request timed out."
msgstr ""
#: documents/views.py:1726
#: documents/views.py:1699
msgid "AI backend rejected the request. Check logs for details."
msgstr ""
#: documents/views.py:4827
#: documents/views.py:2554 documents/views.py:2870
msgid "Specify only one of text, title_search, query, or more_like_id."
msgstr ""
#: documents/views.py:4800
#, python-format
msgid "Insufficient permissions to share document %(id)s."
msgstr "Nepakanka leidimų bendrinti dokumentą %(id)s."
#: documents/views.py:4874
#: documents/views.py:4846
msgid "Bundle is already being processed."
msgstr "Rinkinys jau apdorojamas."
#: documents/views.py:4938
#: documents/views.py:4910
msgid "The share link bundle is still being prepared. Please try again later."
msgstr "Bendrinimo nuorodų rinkinys vis dar ruošiamas. Bandykite dar kartą vėliau."
#: documents/views.py:4952
#: documents/views.py:4924
msgid "The share link bundle is unavailable."
msgstr "Dalinimos nuorodų rinkinys yra nepasiekiamas."
@@ -2241,151 +2256,151 @@ msgstr ""
msgid "paperless application settings"
msgstr ""
#: paperless/settings/__init__.py:562
#: paperless/settings/__init__.py:561
msgid "English (US)"
msgstr ""
#: paperless/settings/__init__.py:563
#: paperless/settings/__init__.py:562
msgid "Arabic"
msgstr ""
#: paperless/settings/__init__.py:564
#: paperless/settings/__init__.py:563
msgid "Afrikaans"
msgstr ""
#: paperless/settings/__init__.py:565
#: paperless/settings/__init__.py:564
msgid "Belarusian"
msgstr ""
#: paperless/settings/__init__.py:566
#: paperless/settings/__init__.py:565
msgid "Bulgarian"
msgstr ""
#: paperless/settings/__init__.py:567
#: paperless/settings/__init__.py:566
msgid "Catalan"
msgstr ""
#: paperless/settings/__init__.py:568
#: paperless/settings/__init__.py:567
msgid "Czech"
msgstr ""
#: paperless/settings/__init__.py:569
#: paperless/settings/__init__.py:568
msgid "Danish"
msgstr "Daniškai"
#: paperless/settings/__init__.py:570
#: paperless/settings/__init__.py:569
msgid "German"
msgstr "Vokiškai"
#: paperless/settings/__init__.py:571
#: paperless/settings/__init__.py:570
msgid "Greek"
msgstr "Graikų"
#: paperless/settings/__init__.py:572
#: paperless/settings/__init__.py:571
msgid "English (GB)"
msgstr "Anglų (GB)"
#: paperless/settings/__init__.py:573
#: paperless/settings/__init__.py:572
msgid "Spanish"
msgstr "Ispanų"
#: paperless/settings/__init__.py:574
#: paperless/settings/__init__.py:573
msgid "Persian"
msgstr "Persų"
#: paperless/settings/__init__.py:575
#: paperless/settings/__init__.py:574
msgid "Finnish"
msgstr "Suomių"
#: paperless/settings/__init__.py:576
#: paperless/settings/__init__.py:575
msgid "French"
msgstr "Prancūzų"
#: paperless/settings/__init__.py:577
#: paperless/settings/__init__.py:576
msgid "Hungarian"
msgstr "Vengrų"
#: paperless/settings/__init__.py:578
#: paperless/settings/__init__.py:577
msgid "Indonesian"
msgstr "Indoneziečių"
#: paperless/settings/__init__.py:579
#: paperless/settings/__init__.py:578
msgid "Italian"
msgstr "Italų"
#: paperless/settings/__init__.py:580
#: paperless/settings/__init__.py:579
msgid "Japanese"
msgstr "Japonų"
#: paperless/settings/__init__.py:581
#: paperless/settings/__init__.py:580
msgid "Korean"
msgstr "Korėjiečių"
#: paperless/settings/__init__.py:582
#: paperless/settings/__init__.py:581
msgid "Luxembourgish"
msgstr "Liuksemburgiečių"
#: paperless/settings/__init__.py:583
#: paperless/settings/__init__.py:582
msgid "Norwegian"
msgstr "Norvegų"
#: paperless/settings/__init__.py:584
#: paperless/settings/__init__.py:583
msgid "Dutch"
msgstr "Olandų"
#: paperless/settings/__init__.py:585
#: paperless/settings/__init__.py:584
msgid "Polish"
msgstr "Lenkų"
#: paperless/settings/__init__.py:586
#: paperless/settings/__init__.py:585
msgid "Portuguese (Brazil)"
msgstr "Portugalų (Brazilija)"
#: paperless/settings/__init__.py:587
#: paperless/settings/__init__.py:586
msgid "Portuguese"
msgstr "Portugalų"
#: paperless/settings/__init__.py:588
#: paperless/settings/__init__.py:587
msgid "Romanian"
msgstr "Rumunų"
#: paperless/settings/__init__.py:589
#: paperless/settings/__init__.py:588
msgid "Russian"
msgstr "Rusų"
#: paperless/settings/__init__.py:590
#: paperless/settings/__init__.py:589
msgid "Slovak"
msgstr "Slovakų"
#: paperless/settings/__init__.py:591
#: paperless/settings/__init__.py:590
msgid "Slovenian"
msgstr "Slovėnų"
#: paperless/settings/__init__.py:592
#: paperless/settings/__init__.py:591
msgid "Serbian"
msgstr "Serbų"
#: paperless/settings/__init__.py:593
#: paperless/settings/__init__.py:592
msgid "Swedish"
msgstr "Švedų"
#: paperless/settings/__init__.py:594
#: paperless/settings/__init__.py:593
msgid "Turkish"
msgstr "Turkų"
#: paperless/settings/__init__.py:595
#: paperless/settings/__init__.py:594
msgid "Ukrainian"
msgstr "Ukrainiečių"
#: paperless/settings/__init__.py:596
#: paperless/settings/__init__.py:595
msgid "Vietnamese"
msgstr "Vietnamiečių"
#: paperless/settings/__init__.py:597
#: paperless/settings/__init__.py:596
msgid "Chinese Simplified"
msgstr "Kinų supaprastinta"
#: paperless/settings/__init__.py:598
#: paperless/settings/__init__.py:597
msgid "Chinese Traditional"
msgstr "Kinų tradicinė"
+76 -61
View File
@@ -2,8 +2,8 @@ msgid ""
msgstr ""
"Project-Id-Version: paperless-ngx\n"
"Report-Msgid-Bugs-To: \n"
"POT-Creation-Date: 2026-10-14 15:18+0000\n"
"PO-Revision-Date: 2026-10-14 15:19\n"
"POT-Creation-Date: 2026-10-05 16:26+0000\n"
"PO-Revision-Date: 2026-10-05 16:27\n"
"Last-Translator: \n"
"Language-Team: Latvian\n"
"Language: lv_LV\n"
@@ -21,39 +21,39 @@ msgstr ""
msgid "Documents"
msgstr "Dokuments"
#: documents/filters.py:464
#: documents/filters.py:463
msgid "Value must be valid JSON."
msgstr ""
#: documents/filters.py:483
#: documents/filters.py:482
msgid "Invalid custom field query expression"
msgstr ""
#: documents/filters.py:493
#: documents/filters.py:492
msgid "Invalid expression list. Must be nonempty."
msgstr ""
#: documents/filters.py:514
#: documents/filters.py:513
msgid "Invalid logical operator {op!r}"
msgstr ""
#: documents/filters.py:528
#: documents/filters.py:527
msgid "Maximum number of query conditions exceeded."
msgstr ""
#: documents/filters.py:592
#: documents/filters.py:591
msgid "{name!r} is not a valid custom field."
msgstr ""
#: documents/filters.py:629
#: documents/filters.py:628
msgid "{data_type} does not support query expr {expr!r}."
msgstr ""
#: documents/filters.py:748 documents/models.py:137
#: documents/filters.py:747 documents/models.py:137
msgid "Maximum nesting depth exceeded."
msgstr ""
#: documents/filters.py:1125
#: documents/filters.py:1109
msgid "Custom field not found"
msgstr ""
@@ -1636,7 +1636,7 @@ msgid "workflow runs"
msgstr ""
#: documents/serialisers.py:515 documents/serialisers.py:872
#: documents/serialisers.py:2902 documents/views.py:363 documents/views.py:2768
#: documents/serialisers.py:2902 documents/views.py:343 documents/views.py:2732
#: paperless_mail/serialisers.py:156
msgid "Insufficient permissions."
msgstr ""
@@ -1676,7 +1676,7 @@ msgstr ""
msgid "Duplicate document identifiers are not allowed."
msgstr ""
#: documents/serialisers.py:2988 documents/views.py:4811
#: documents/serialisers.py:2988 documents/views.py:4787
#, python-format
msgid "Documents not found: %(ids)s"
msgstr ""
@@ -1912,44 +1912,59 @@ msgstr ""
msgid "As a final step, please complete the following form:"
msgstr ""
#: documents/validators.py:24
#, python-brace-format
msgid "Unable to parse URI {value}, missing scheme"
msgstr ""
#: documents/validators.py:29
#, python-brace-format
msgid "Unable to parse URI {value}, missing net location or path"
msgstr ""
#: documents/validators.py:36
msgid ", "
msgid "URI scheme '{parts.scheme}' is not allowed. Allowed schemes: {', '.join(allowed_schemes)}"
msgstr ""
#: documents/views.py:318
msgid "Specify only one of text, title_search, query, or more_like_id."
#: documents/validators.py:45
#, python-brace-format
msgid "Unable to parse URI {value}"
msgstr ""
#: documents/views.py:356 documents/views.py:2765
#: documents/views.py:336 documents/views.py:2729
msgid "Invalid more_like_id"
msgstr ""
#: documents/views.py:1703
#: documents/views.py:1676
msgid "Invalid AI configuration."
msgstr ""
#: documents/views.py:1714
#: documents/views.py:1687
msgid "AI backend request timed out."
msgstr ""
#: documents/views.py:1726
#: documents/views.py:1699
msgid "AI backend rejected the request. Check logs for details."
msgstr ""
#: documents/views.py:4827
#: documents/views.py:2554 documents/views.py:2870
msgid "Specify only one of text, title_search, query, or more_like_id."
msgstr ""
#: documents/views.py:4800
#, python-format
msgid "Insufficient permissions to share document %(id)s."
msgstr ""
#: documents/views.py:4874
#: documents/views.py:4846
msgid "Bundle is already being processed."
msgstr ""
#: documents/views.py:4938
#: documents/views.py:4910
msgid "The share link bundle is still being prepared. Please try again later."
msgstr ""
#: documents/views.py:4952
#: documents/views.py:4924
msgid "The share link bundle is unavailable."
msgstr ""
@@ -2241,151 +2256,151 @@ msgstr ""
msgid "paperless application settings"
msgstr ""
#: paperless/settings/__init__.py:562
#: paperless/settings/__init__.py:561
msgid "English (US)"
msgstr "Angļu (ASV)"
#: paperless/settings/__init__.py:563
#: paperless/settings/__init__.py:562
msgid "Arabic"
msgstr "Arābu"
#: paperless/settings/__init__.py:564
#: paperless/settings/__init__.py:563
msgid "Afrikaans"
msgstr "Āfrikāņu"
#: paperless/settings/__init__.py:565
#: paperless/settings/__init__.py:564
msgid "Belarusian"
msgstr "Baltkrievu"
#: paperless/settings/__init__.py:566
#: paperless/settings/__init__.py:565
msgid "Bulgarian"
msgstr "Bulgāru"
#: paperless/settings/__init__.py:567
#: paperless/settings/__init__.py:566
msgid "Catalan"
msgstr "Kataloniešu"
#: paperless/settings/__init__.py:568
#: paperless/settings/__init__.py:567
msgid "Czech"
msgstr "Čehu"
#: paperless/settings/__init__.py:569
#: paperless/settings/__init__.py:568
msgid "Danish"
msgstr "Dāņu"
#: paperless/settings/__init__.py:570
#: paperless/settings/__init__.py:569
msgid "German"
msgstr "Vācu"
#: paperless/settings/__init__.py:571
#: paperless/settings/__init__.py:570
msgid "Greek"
msgstr "Grieķu"
#: paperless/settings/__init__.py:572
#: paperless/settings/__init__.py:571
msgid "English (GB)"
msgstr "Angļu (ASV)"
#: paperless/settings/__init__.py:573
#: paperless/settings/__init__.py:572
msgid "Spanish"
msgstr "Spāņu"
#: paperless/settings/__init__.py:574
#: paperless/settings/__init__.py:573
msgid "Persian"
msgstr ""
#: paperless/settings/__init__.py:575
#: paperless/settings/__init__.py:574
msgid "Finnish"
msgstr "Somu"
#: paperless/settings/__init__.py:576
#: paperless/settings/__init__.py:575
msgid "French"
msgstr "Franču"
#: paperless/settings/__init__.py:577
#: paperless/settings/__init__.py:576
msgid "Hungarian"
msgstr "Ungāru"
#: paperless/settings/__init__.py:578
#: paperless/settings/__init__.py:577
msgid "Indonesian"
msgstr ""
#: paperless/settings/__init__.py:579
#: paperless/settings/__init__.py:578
msgid "Italian"
msgstr "Itāļu"
#: paperless/settings/__init__.py:580
#: paperless/settings/__init__.py:579
msgid "Japanese"
msgstr "Japāņu"
#: paperless/settings/__init__.py:581
#: paperless/settings/__init__.py:580
msgid "Korean"
msgstr ""
#: paperless/settings/__init__.py:582
#: paperless/settings/__init__.py:581
msgid "Luxembourgish"
msgstr "Luksemburgiešu"
#: paperless/settings/__init__.py:583
#: paperless/settings/__init__.py:582
msgid "Norwegian"
msgstr "Norvēģu"
#: paperless/settings/__init__.py:584
#: paperless/settings/__init__.py:583
msgid "Dutch"
msgstr "Holandiešu"
#: paperless/settings/__init__.py:585
#: paperless/settings/__init__.py:584
msgid "Polish"
msgstr "Poļu"
#: paperless/settings/__init__.py:586
#: paperless/settings/__init__.py:585
msgid "Portuguese (Brazil)"
msgstr "Portugāļu (Brazīlija)"
#: paperless/settings/__init__.py:587
#: paperless/settings/__init__.py:586
msgid "Portuguese"
msgstr "Portugāļu"
#: paperless/settings/__init__.py:588
#: paperless/settings/__init__.py:587
msgid "Romanian"
msgstr "Rumāņu"
#: paperless/settings/__init__.py:589
#: paperless/settings/__init__.py:588
msgid "Russian"
msgstr "Krievu"
#: paperless/settings/__init__.py:590
#: paperless/settings/__init__.py:589
msgid "Slovak"
msgstr "Slovāku"
#: paperless/settings/__init__.py:591
#: paperless/settings/__init__.py:590
msgid "Slovenian"
msgstr "Slovēņu"
#: paperless/settings/__init__.py:592
#: paperless/settings/__init__.py:591
msgid "Serbian"
msgstr "Sērbu"
#: paperless/settings/__init__.py:593
#: paperless/settings/__init__.py:592
msgid "Swedish"
msgstr "Zviedru"
#: paperless/settings/__init__.py:594
#: paperless/settings/__init__.py:593
msgid "Turkish"
msgstr "Turku"
#: paperless/settings/__init__.py:595
#: paperless/settings/__init__.py:594
msgid "Ukrainian"
msgstr "Ukraiņu"
#: paperless/settings/__init__.py:596
#: paperless/settings/__init__.py:595
msgid "Vietnamese"
msgstr ""
#: paperless/settings/__init__.py:597
#: paperless/settings/__init__.py:596
msgid "Chinese Simplified"
msgstr "Ķīniešu (vienkāršota)"
#: paperless/settings/__init__.py:598
#: paperless/settings/__init__.py:597
msgid "Chinese Traditional"
msgstr ""
+76 -61
View File
@@ -2,8 +2,8 @@ msgid ""
msgstr ""
"Project-Id-Version: paperless-ngx\n"
"Report-Msgid-Bugs-To: \n"
"POT-Creation-Date: 2026-10-14 15:18+0000\n"
"PO-Revision-Date: 2026-10-14 15:19\n"
"POT-Creation-Date: 2026-10-05 16:26+0000\n"
"PO-Revision-Date: 2026-10-05 16:27\n"
"Last-Translator: \n"
"Language-Team: Macedonian\n"
"Language: mk_MK\n"
@@ -21,39 +21,39 @@ msgstr ""
msgid "Documents"
msgstr ""
#: documents/filters.py:464
#: documents/filters.py:463
msgid "Value must be valid JSON."
msgstr ""
#: documents/filters.py:483
#: documents/filters.py:482
msgid "Invalid custom field query expression"
msgstr ""
#: documents/filters.py:493
#: documents/filters.py:492
msgid "Invalid expression list. Must be nonempty."
msgstr ""
#: documents/filters.py:514
#: documents/filters.py:513
msgid "Invalid logical operator {op!r}"
msgstr ""
#: documents/filters.py:528
#: documents/filters.py:527
msgid "Maximum number of query conditions exceeded."
msgstr ""
#: documents/filters.py:592
#: documents/filters.py:591
msgid "{name!r} is not a valid custom field."
msgstr ""
#: documents/filters.py:629
#: documents/filters.py:628
msgid "{data_type} does not support query expr {expr!r}."
msgstr ""
#: documents/filters.py:748 documents/models.py:137
#: documents/filters.py:747 documents/models.py:137
msgid "Maximum nesting depth exceeded."
msgstr ""
#: documents/filters.py:1125
#: documents/filters.py:1109
msgid "Custom field not found"
msgstr ""
@@ -1636,7 +1636,7 @@ msgid "workflow runs"
msgstr ""
#: documents/serialisers.py:515 documents/serialisers.py:872
#: documents/serialisers.py:2902 documents/views.py:363 documents/views.py:2768
#: documents/serialisers.py:2902 documents/views.py:343 documents/views.py:2732
#: paperless_mail/serialisers.py:156
msgid "Insufficient permissions."
msgstr ""
@@ -1676,7 +1676,7 @@ msgstr ""
msgid "Duplicate document identifiers are not allowed."
msgstr ""
#: documents/serialisers.py:2988 documents/views.py:4811
#: documents/serialisers.py:2988 documents/views.py:4787
#, python-format
msgid "Documents not found: %(ids)s"
msgstr ""
@@ -1912,44 +1912,59 @@ msgstr ""
msgid "As a final step, please complete the following form:"
msgstr ""
#: documents/validators.py:24
#, python-brace-format
msgid "Unable to parse URI {value}, missing scheme"
msgstr ""
#: documents/validators.py:29
#, python-brace-format
msgid "Unable to parse URI {value}, missing net location or path"
msgstr ""
#: documents/validators.py:36
msgid ", "
msgid "URI scheme '{parts.scheme}' is not allowed. Allowed schemes: {', '.join(allowed_schemes)}"
msgstr ""
#: documents/views.py:318
msgid "Specify only one of text, title_search, query, or more_like_id."
#: documents/validators.py:45
#, python-brace-format
msgid "Unable to parse URI {value}"
msgstr ""
#: documents/views.py:356 documents/views.py:2765
#: documents/views.py:336 documents/views.py:2729
msgid "Invalid more_like_id"
msgstr ""
#: documents/views.py:1703
#: documents/views.py:1676
msgid "Invalid AI configuration."
msgstr ""
#: documents/views.py:1714
#: documents/views.py:1687
msgid "AI backend request timed out."
msgstr ""
#: documents/views.py:1726
#: documents/views.py:1699
msgid "AI backend rejected the request. Check logs for details."
msgstr ""
#: documents/views.py:4827
#: documents/views.py:2554 documents/views.py:2870
msgid "Specify only one of text, title_search, query, or more_like_id."
msgstr ""
#: documents/views.py:4800
#, python-format
msgid "Insufficient permissions to share document %(id)s."
msgstr ""
#: documents/views.py:4874
#: documents/views.py:4846
msgid "Bundle is already being processed."
msgstr ""
#: documents/views.py:4938
#: documents/views.py:4910
msgid "The share link bundle is still being prepared. Please try again later."
msgstr ""
#: documents/views.py:4952
#: documents/views.py:4924
msgid "The share link bundle is unavailable."
msgstr ""
@@ -2241,151 +2256,151 @@ msgstr ""
msgid "paperless application settings"
msgstr ""
#: paperless/settings/__init__.py:562
#: paperless/settings/__init__.py:561
msgid "English (US)"
msgstr ""
#: paperless/settings/__init__.py:563
#: paperless/settings/__init__.py:562
msgid "Arabic"
msgstr ""
#: paperless/settings/__init__.py:564
#: paperless/settings/__init__.py:563
msgid "Afrikaans"
msgstr ""
#: paperless/settings/__init__.py:565
#: paperless/settings/__init__.py:564
msgid "Belarusian"
msgstr ""
#: paperless/settings/__init__.py:566
#: paperless/settings/__init__.py:565
msgid "Bulgarian"
msgstr ""
#: paperless/settings/__init__.py:567
#: paperless/settings/__init__.py:566
msgid "Catalan"
msgstr ""
#: paperless/settings/__init__.py:568
#: paperless/settings/__init__.py:567
msgid "Czech"
msgstr ""
#: paperless/settings/__init__.py:569
#: paperless/settings/__init__.py:568
msgid "Danish"
msgstr ""
#: paperless/settings/__init__.py:570
#: paperless/settings/__init__.py:569
msgid "German"
msgstr ""
#: paperless/settings/__init__.py:571
#: paperless/settings/__init__.py:570
msgid "Greek"
msgstr ""
#: paperless/settings/__init__.py:572
#: paperless/settings/__init__.py:571
msgid "English (GB)"
msgstr ""
#: paperless/settings/__init__.py:573
#: paperless/settings/__init__.py:572
msgid "Spanish"
msgstr ""
#: paperless/settings/__init__.py:574
#: paperless/settings/__init__.py:573
msgid "Persian"
msgstr ""
#: paperless/settings/__init__.py:575
#: paperless/settings/__init__.py:574
msgid "Finnish"
msgstr ""
#: paperless/settings/__init__.py:576
#: paperless/settings/__init__.py:575
msgid "French"
msgstr ""
#: paperless/settings/__init__.py:577
#: paperless/settings/__init__.py:576
msgid "Hungarian"
msgstr ""
#: paperless/settings/__init__.py:578
#: paperless/settings/__init__.py:577
msgid "Indonesian"
msgstr ""
#: paperless/settings/__init__.py:579
#: paperless/settings/__init__.py:578
msgid "Italian"
msgstr ""
#: paperless/settings/__init__.py:580
#: paperless/settings/__init__.py:579
msgid "Japanese"
msgstr ""
#: paperless/settings/__init__.py:581
#: paperless/settings/__init__.py:580
msgid "Korean"
msgstr ""
#: paperless/settings/__init__.py:582
#: paperless/settings/__init__.py:581
msgid "Luxembourgish"
msgstr ""
#: paperless/settings/__init__.py:583
#: paperless/settings/__init__.py:582
msgid "Norwegian"
msgstr ""
#: paperless/settings/__init__.py:584
#: paperless/settings/__init__.py:583
msgid "Dutch"
msgstr ""
#: paperless/settings/__init__.py:585
#: paperless/settings/__init__.py:584
msgid "Polish"
msgstr ""
#: paperless/settings/__init__.py:586
#: paperless/settings/__init__.py:585
msgid "Portuguese (Brazil)"
msgstr ""
#: paperless/settings/__init__.py:587
#: paperless/settings/__init__.py:586
msgid "Portuguese"
msgstr ""
#: paperless/settings/__init__.py:588
#: paperless/settings/__init__.py:587
msgid "Romanian"
msgstr ""
#: paperless/settings/__init__.py:589
#: paperless/settings/__init__.py:588
msgid "Russian"
msgstr ""
#: paperless/settings/__init__.py:590
#: paperless/settings/__init__.py:589
msgid "Slovak"
msgstr ""
#: paperless/settings/__init__.py:591
#: paperless/settings/__init__.py:590
msgid "Slovenian"
msgstr ""
#: paperless/settings/__init__.py:592
#: paperless/settings/__init__.py:591
msgid "Serbian"
msgstr ""
#: paperless/settings/__init__.py:593
#: paperless/settings/__init__.py:592
msgid "Swedish"
msgstr ""
#: paperless/settings/__init__.py:594
#: paperless/settings/__init__.py:593
msgid "Turkish"
msgstr ""
#: paperless/settings/__init__.py:595
#: paperless/settings/__init__.py:594
msgid "Ukrainian"
msgstr ""
#: paperless/settings/__init__.py:596
#: paperless/settings/__init__.py:595
msgid "Vietnamese"
msgstr ""
#: paperless/settings/__init__.py:597
#: paperless/settings/__init__.py:596
msgid "Chinese Simplified"
msgstr ""
#: paperless/settings/__init__.py:598
#: paperless/settings/__init__.py:597
msgid "Chinese Traditional"
msgstr ""
Loaded 100 of 138 files, more files were not shown because too many files have changed in this diff. Show more