Compare commits

...
Author SHA1 Message Date
stumpylog b3e0cf0e21 chore(profiling): confirm Stage 2 loop-resolution reduces query count and wall time at scale 2026-07-28 16:36:44 -07:00
stumpylog 5b63a7bc41 chore(profiling): record Stage 1 after-profile, confirm speedup and no query-count regression 2026-07-27 21:20:55 -07:00
stumpylog fb99b3defb profiling(stage1): re-capture baseline with realistic document ownership
Guardian permission subplans now actually execute (previously
'never executed' due to unowned seed documents short-circuiting the
owner_id IS NULL branch). best_seconds rose from 0.0251s to 31.4648s,
confirming the varchar-cast nested-loop-semi-join pathology is real
and now measured under realistic conditions.
2026-07-27 19:02:30 -07:00
stumpylog e80ede4cb0 fix(profiling): assign realistic document ownership so seed data exercises the guardian permission path 2026-07-27 17:25:48 -07:00
stumpylog e0902c63d6 chore(profiling): record Stage 1 baseline for get_objects_for_user_owner_aware 2026-07-27 16:03:15 -07:00
stumpylogandClaude Sonnet 5 0506dcad05 chore(profiling): add append_profiling_history function for persistent profiling records
Adds two new functions to harness.py:
- _current_git_ref(): Gets the current git short SHA
- append_profiling_history(): Appends JSON line to profiling/results/history.jsonl

This enables profiling numbers to persist across sessions/dates, with every run
appended to an immutable timeline rather than overwriting per-stage snapshots.

Also adds corresponding test to verify the function writes valid JSON lines.

Co-Authored-By: Claude Sonnet 5 <noreply@anthropic.com>
2026-07-27 15:49:14 -07:00
stumpylog 91647eecb5 chore(profiling): add throwaway-Postgres helper and typed profiling harness
Adds standalone profiling tooling (never merged into dev/main): a
persistent, self-healing Postgres 18 container helper
(run_with_postgres.sh/stop_postgres.sh), a scale-profile dataset seeder
(seed.py) whose document counts and guardian permission-row ratios
mirror real bug reports (#13276, #13161), and a typed profiling harness
(harness.py) for timing/query-count comparisons and EXPLAIN ANALYZE
capture, gated by require_postgres() so it never silently runs on
SQLite.

seed.py samples distinct (subject, document) pairs up front rather than
drawing with replacement, since guardian's assign_perm() dedupes on the
(subject, object, permission) triple -- with-replacement sampling
against a small group pool collides heavily (birthday paradox) and
undercounts the target permission-row ratios otherwise.
2026-07-27 15:08:23 -07:00
GitHub Actions 693a111c5a Auto translate strings 2026-07-27 19:35:15 +00:00
Trenton HandGitHub b19edd0b74 Fix: dedupe permission-visible documents when combined with multi-tag ALL filtering (#13331) (#13345)
The permission filter OR'd three querysets together on top of a
queryset that could already carry two independent tags__id__all
joins, letting a document that matched more than one branch (e.g.
unowned + group-permissioned) come back twice. Replaced it with a
single id__in filter against the existing permitted_document_ids
helper, which is join-free and can't hit this.
2026-07-27 19:33:26 +00:00
Trenton HandGitHub 0e98a7f1ce Performance: Scope llm index updates to actually modified documents (#13322)
* Perf: scope bulk_update_documents' LLM index refresh to the edited document ids instead of the whole library

* Perf: select_related/prefetch_related for the scoped LLM index batch

* Perf: select_related/prefetch_related for the full LLM index rebuild path

* Fix: address Copilot review findings on LLM index scoping
2026-07-27 10:23:43 -07:00
GitHub Actions 14517062c4 Auto translate strings 2026-07-27 16:53:33 +00:00
shamoonandGitHub 0c0faf7f80 Fixhancement: pass LLM output language to chat if specified (#13340) 2026-07-27 16:51:31 +00:00
SandroandGitHub eda79603fe Documentation: fix PAPERLESS_AI_LLM_OUTPUT_LANGUAGE heading level (#13341) 2026-07-27 09:37:09 -07:00
shamoonandGitHub 8f017942d9 Chore: resolve npm provenance issues with chokidar and semver (#13323) 2026-07-26 16:25:49 -07:00
GitHub Actions f4e7a2e9e4 Auto translate strings 2026-07-26 22:38:16 +00:00
shamoonandGitHub 317e534aa0 Fix: ensure preview reload on live changes (#13321) 2026-07-26 22:36:03 +00:00
Trenton HandGitHub 3ba6d0325a Fix: clamp out-of-range MailRule.order and ApplicationConfiguration DPI/page fields before smallint migration (#13316) 2026-07-26 22:11:27 +00:00
Trenton HandGitHub 318520a0f1 Fix: add docstring to DocumentClassifierSchema for cleaner LLM tool description (#13315) 2026-07-26 22:00:06 +00:00
Trenton HandGitHub ea1f3653a9 Fix: guard build_document_node against stale FK on deleted correspondent/doc type (#13318) 2026-07-26 21:45:59 +00:00
shamoonandGitHub 423d4b9f2d Fix: prevent search filter loss when closing document with Escape key (#13317) 2026-07-26 14:17:26 -07:00
shamoonandGitHub 8bc4e5ee94 Fix: fix frontend permissions display for stats/system perms (#13305) 2026-07-26 02:56:06 -07:00
aa90f79c21 New Crowdin translations by GitHub Action (#13297)
Co-authored-by: Crowdin Bot <support+bot@crowdin.com>
2026-07-25 16:31:40 -07:00
e704bf88dc New Crowdin translations by GitHub Action (#13239)
Co-authored-by: Crowdin Bot <support+bot@crowdin.com>
2026-07-25 16:30:17 -07:00
Trenton HandGitHub 1646756c6c Docs: warn bare-metal users about stale files when upgrading (#13296) 2026-07-25 14:06:31 -07:00
shamoon 48d6ff13f2 Tweak: use css grid for navbar 2026-07-25 09:13:34 -07:00
GitHub Actions bfe2d92619 Auto translate strings 2026-07-25 07:13:46 +00:00
shamoonandGitHub 4f0845b094 Fixhancement: PAPERLESS_ALLAUTH_TRUSTED_PROXY_COUNT (#13281) 2026-07-25 00:12:12 -07:00
shamoonandGitHub dee568e2a6 Tweak: adjust top navbar wrapping when AI chat button visible (#13280) 2026-07-24 23:50:10 -07:00
shamoon f60a2af841 Merge branch 'main' into dev 2026-07-24 19:08:23 -07:00
Trenton HandGitHub 33cd48a17f Fix: preserve document fields during Gotenberg conversion (#13271)
Gotenberg's LibreOffice route enables updateIndexes by default, which refreshes dynamic fields (e.g. auto-dates) to the current date. Disable it so field values are preserved as authored.
2026-07-24 13:59:51 -07:00
github-actions[bot]GitHubgithub-actions <41898282+github-actions[bot]@users.noreply.github.com>
ed714b8a5a Changelog v3.0.2 - GHA (#13244)
Co-authored-by: github-actions <41898282+github-actions[bot]@users.noreply.github.com>
2026-07-23 18:56:06 -07:00
shamoon e0ab6a2e75 Merge branch 'dev' 2026-07-23 18:13:49 -07:00
github-actions[bot]GitHubgithub-actions <41898282+github-actions[bot]@users.noreply.github.com>
90ea4f27c4 Changelog v3.0.1 - GHA (#13240)
Co-authored-by: github-actions <41898282+github-actions[bot]@users.noreply.github.com>
2026-07-23 17:59:34 -07:00
104 changed files with 3639 additions and 2202 deletions
+17
View File
@@ -151,6 +151,23 @@ the background.
### Bare Metal Route {#bare-metal-updating}
!!! warning
Extracting a new release archive on top of an existing installation
(e.g. `tar -xf paperless-ngx-vX.Y.Z.tar.xz -C /opt/paperless`) only adds
and overwrites files -- it does not remove files that were deleted in
the new release. Leftover files from an old version, such as
superseded database migrations, can remain on disk and cause errors
like `NodeNotFoundError` during `manage.py migrate`.
Before unpacking a new release over an existing bare-metal
installation, remove the previous source tree first (everything
except your `media`, `data`, and `consume` directories and your
`paperless.conf`/`.env`), or unpack into a fresh directory and move
your persistent data and configuration over. Installations updated via
`git pull` on a clean checkout are not affected, since Git removes
files that no longer exist upstream.
After grabbing the new release and unpacking the contents, do the
following:
+59
View File
@@ -1,5 +1,64 @@
# Changelog
## paperless-ngx 3.0.2
### Bug Fixes
- Fix: fix broken migration in 3.0.1 [@shamoon](https://github.com/shamoon) ([#13242](https://github.com/paperless-ngx/paperless-ngx/pull/13242))
### All App Changes
- Fix: fix broken migration in 3.0.1 [@shamoon](https://github.com/shamoon) ([#13242](https://github.com/paperless-ngx/paperless-ngx/pull/13242))
## paperless-ngx 3.0.1
### Bug Fixes
- Fix: selection\_data re-derives the filtered document set 5 times over [@stumpylog](https://github.com/stumpylog) ([#13229](https://github.com/paperless-ngx/paperless-ngx/pull/13229))
- Fix: exclude source document from its own RAG similarity results [@stumpylog](https://github.com/stumpylog) ([#13233](https://github.com/paperless-ngx/paperless-ngx/pull/13233))
- Fix: split mailrule maximum\_age clamp into its own migration [@stumpylog](https://github.com/stumpylog) ([#13231](https://github.com/paperless-ngx/paperless-ngx/pull/13231))
- Chore: mark yes in confirm button for translation [@shamoon](https://github.com/shamoon) ([#13225](https://github.com/paperless-ngx/paperless-ngx/pull/13225))
- Fix: correct URL for W001 check [@shamoon](https://github.com/shamoon) ([#13220](https://github.com/paperless-ngx/paperless-ngx/pull/13220))
- Fix: ensure create dialog uses correct attribute type [@shamoon](https://github.com/shamoon) ([#13221](https://github.com/paperless-ngx/paperless-ngx/pull/13221))
- Fix: correct database engine from postgres to postgresql [@OberstVonGatow](https://github.com/OberstVonGatow) ([#13213](https://github.com/paperless-ngx/paperless-ngx/pull/13213))
- Fix: remove unnecessary .distinct() dominating document list queries [@stumpylog](https://github.com/stumpylog) ([#13205](https://github.com/paperless-ngx/paperless-ngx/pull/13205))
- Fix: also wrap non-breaking words in chat messages, handle whitespace [@shamoon](https://github.com/shamoon) ([#13211](https://github.com/paperless-ngx/paperless-ngx/pull/13211))
- Fix: tag/custom-field document\_count scales badly with tag count [@stumpylog](https://github.com/stumpylog) ([#13203](https://github.com/paperless-ngx/paperless-ngx/pull/13203))
- Fix: batch document user\_can\_change checks to avoid per-row N+1 [@stumpylog](https://github.com/stumpylog) ([#13204](https://github.com/paperless-ngx/paperless-ngx/pull/13204))
- Fix: fix app title restoration [@shamoon](https://github.com/shamoon) ([#13208](https://github.com/paperless-ngx/paperless-ngx/pull/13208))
- Fix: handle long wrapping titles in AI chat document list [@shamoon](https://github.com/shamoon) ([#13206](https://github.com/paperless-ngx/paperless-ngx/pull/13206))
### Dependencies
- Chore(deps-dev): Bump postcss from 8.5.6 to 8.5.22 in /src/paperless\_mail/templates in the npm\_and\_yarn group across 1 directory @[dependabot[bot]](https://github.com/apps/dependabot) ([#13236](https://github.com/paperless-ngx/paperless-ngx/pull/13236))
- Chore(deps): Bump pyasn1 from 0.6.3 to 0.6.4 in the uv group across 1 directory @[dependabot[bot]](https://github.com/apps/dependabot) ([#13237](https://github.com/paperless-ngx/paperless-ngx/pull/13237))
- Chore(deps): Bump the uv group across 1 directory with 8 updates @[dependabot[bot]](https://github.com/apps/dependabot) ([#13189](https://github.com/paperless-ngx/paperless-ngx/pull/13189))
### All App Changes
<details>
<summary>17 changes</summary>
- Chore(deps-dev): Bump postcss from 8.5.6 to 8.5.22 in /src/paperless\_mail/templates in the npm\_and\_yarn group across 1 directory @[dependabot[bot]](https://github.com/apps/dependabot) ([#13236](https://github.com/paperless-ngx/paperless-ngx/pull/13236))
- Fix: selection\_data re-derives the filtered document set 5 times over [@stumpylog](https://github.com/stumpylog) ([#13229](https://github.com/paperless-ngx/paperless-ngx/pull/13229))
- Chore: reword "Settings > Default permissions" description for clarity [@NotaInutilis](https://github.com/NotaInutilis) ([#13232](https://github.com/paperless-ngx/paperless-ngx/pull/13232))
- Chore(deps): Bump pyasn1 from 0.6.3 to 0.6.4 in the uv group across 1 directory @[dependabot[bot]](https://github.com/apps/dependabot) ([#13237](https://github.com/paperless-ngx/paperless-ngx/pull/13237))
- Chore(deps): Bump the uv group across 1 directory with 8 updates @[dependabot[bot]](https://github.com/apps/dependabot) ([#13189](https://github.com/paperless-ngx/paperless-ngx/pull/13189))
- Fix: exclude source document from its own RAG similarity results [@stumpylog](https://github.com/stumpylog) ([#13233](https://github.com/paperless-ngx/paperless-ngx/pull/13233))
- Fix: split mailrule maximum\_age clamp into its own migration [@stumpylog](https://github.com/stumpylog) ([#13231](https://github.com/paperless-ngx/paperless-ngx/pull/13231))
- Chore: mark yes in confirm button for translation [@shamoon](https://github.com/shamoon) ([#13225](https://github.com/paperless-ngx/paperless-ngx/pull/13225))
- Fix: correct URL for W001 check [@shamoon](https://github.com/shamoon) ([#13220](https://github.com/paperless-ngx/paperless-ngx/pull/13220))
- Fix: ensure create dialog uses correct attribute type [@shamoon](https://github.com/shamoon) ([#13221](https://github.com/paperless-ngx/paperless-ngx/pull/13221))
- Fix: correct database engine from postgres to postgresql [@OberstVonGatow](https://github.com/OberstVonGatow) ([#13213](https://github.com/paperless-ngx/paperless-ngx/pull/13213))
- Fix: remove unnecessary .distinct() dominating document list queries [@stumpylog](https://github.com/stumpylog) ([#13205](https://github.com/paperless-ngx/paperless-ngx/pull/13205))
- Fix: also wrap non-breaking words in chat messages, handle whitespace [@shamoon](https://github.com/shamoon) ([#13211](https://github.com/paperless-ngx/paperless-ngx/pull/13211))
- Fix: tag/custom-field document\_count scales badly with tag count [@stumpylog](https://github.com/stumpylog) ([#13203](https://github.com/paperless-ngx/paperless-ngx/pull/13203))
- Fix: batch document user\_can\_change checks to avoid per-row N+1 [@stumpylog](https://github.com/stumpylog) ([#13204](https://github.com/paperless-ngx/paperless-ngx/pull/13204))
- Fix: fix app title restoration [@shamoon](https://github.com/shamoon) ([#13208](https://github.com/paperless-ngx/paperless-ngx/pull/13208))
- Fix: handle long wrapping titles in AI chat document list [@shamoon](https://github.com/shamoon) ([#13206](https://github.com/paperless-ngx/paperless-ngx/pull/13206))
</details>
## paperless-ngx 3.0.0
### Breaking Changes
+22 -8
View File
@@ -522,22 +522,36 @@ do CORS calls. Set this to your public domain name.
fail2ban with log entries for failed authorization attempts. Value should be
IP address(es).
This setting also controls allauth's
[`ALLAUTH_TRUSTED_PROXY_COUNT`](https://docs.allauth.org/en/latest/account/configuration.html),
which is set to the number of proxies listed here. Without this,
allauth cannot determine the client IP address for rate limiting when
running behind a reverse proxy, resulting in a `403 Forbidden` on login.
By default, this setting also controls allauth's trusted proxy count,
which is set to the number of proxies listed here. Override that default
with [`PAPERLESS_ALLAUTH_TRUSTED_PROXY_COUNT`](#PAPERLESS_ALLAUTH_TRUSTED_PROXY_COUNT)
when the list length does not match the number of proxy hops.
Defaults to empty string.
#### [`PAPERLESS_ALLAUTH_TRUSTED_PROXY_COUNT=<integer>`](#PAPERLESS_ALLAUTH_TRUSTED_PROXY_COUNT) {#PAPERLESS_ALLAUTH_TRUSTED_PROXY_COUNT}
: Sets allauth's
[`ALLAUTH_TRUSTED_PROXY_COUNT`](https://docs.allauth.org/en/latest/common/rate_limits.html#configuration).
This is the number of trusted proxy **hops** represented in each
`X-Forwarded-For` header, not the number of IP addresses through which those
proxies may be reached. For example, a single dual-stack proxy is one hop even
when its IPv4 and IPv6 addresses are both listed in
[`PAPERLESS_TRUSTED_PROXIES`](#PAPERLESS_TRUSTED_PROXIES).
Only trust `X-Forwarded-For` when untrusted clients cannot connect directly
to Paperless-ngx.
Defaults to the number of entries in `PAPERLESS_TRUSTED_PROXIES`.
#### [`PAPERLESS_ALLAUTH_TRUSTED_CLIENT_IP_HEADER=<header-name>`](#PAPERLESS_ALLAUTH_TRUSTED_CLIENT_IP_HEADER) {#PAPERLESS_ALLAUTH_TRUSTED_CLIENT_IP_HEADER}
: Sets allauth's
[`ALLAUTH_TRUSTED_CLIENT_IP_HEADER`](https://docs.allauth.org/en/latest/account/configuration.html).
[`ALLAUTH_TRUSTED_CLIENT_IP_HEADER`](https://docs.allauth.org/en/latest/common/rate_limits.html#configuration).
Use this when your reverse proxy sets a dedicated header for the real
client IP instead of `X-Forwarded-For`, for example `X-Real-IP` (nginx)
or `CF-Connecting-IP` (Cloudflare). When set, this takes precedence over
[`PAPERLESS_TRUSTED_PROXIES`](#PAPERLESS_TRUSTED_PROXIES).
`PAPERLESS_ALLAUTH_TRUSTED_PROXY_COUNT`.
Defaults to none.
@@ -2121,7 +2135,7 @@ used with the OpenAI-compatible backend to target a custom provider or local gat
Defaults to None.
### [`PAPERLESS_AI_LLM_OUTPUT_LANGUAGE=<str>`](#PAPERLESS_AI_LLM_OUTPUT_LANGUAGE) {#PAPERLESS_AI_LLM_OUTPUT_LANGUAGE}
#### [`PAPERLESS_AI_LLM_OUTPUT_LANGUAGE=<str>`](#PAPERLESS_AI_LLM_OUTPUT_LANGUAGE) {#PAPERLESS_AI_LLM_OUTPUT_LANGUAGE}
: The language to use for AI suggestions (results may vary by LLM model). If not supplied, defaults to the user's UI language setting or None.
+4 -1
View File
@@ -324,8 +324,11 @@ option since v1.8.0.
Allauth changed how it determines the client IP address for login rate limiting. Users running
behind a reverse proxy may need to set
[`PAPERLESS_TRUSTED_PROXIES`](configuration.md#PAPERLESS_TRUSTED_PROXIES),
[`PAPERLESS_ALLAUTH_TRUSTED_PROXY_COUNT`](configuration.md#PAPERLESS_ALLAUTH_TRUSTED_PROXY_COUNT),
[`PAPERLESS_ALLAUTH_TRUSTED_CLIENT_IP_HEADER`](configuration.md#PAPERLESS_ALLAUTH_TRUSTED_CLIENT_IP_HEADER),
or both, to avoid `403 Forbidden` errors on login.
or a combination of these settings to avoid `403 Forbidden` errors on login.
The proxy count is the number of proxy hops in `X-Forwarded-For`, which may
differ from the number of configured proxy IP addresses.
## Minimum CPU Requirements (NumPy Baseline)
+8
View File
@@ -262,6 +262,14 @@ to a positive number to enable polling and disable native filesystem notificatio
and copy the contents to the home directory of the user you created
earlier (`/opt/paperless`).
!!! note
If you are updating an existing bare-metal installation rather than
installing for the first time, see the
[bare metal update instructions](administration.md#bare-metal-updating)
instead -- extracting a new release on top of an old one can leave
behind stale files from the previous version.
Optional: If you cloned the Git repository, you will need to
compile the frontend yourself. See [here](development.md#front-end-development)
and use the `build` step, not `serve`.
View File
+123
View File
@@ -0,0 +1,123 @@
# profiling/harness.py
from __future__ import annotations
import json
import subprocess
import time
from dataclasses import dataclass
from datetime import UTC
from datetime import datetime
from pathlib import Path
from typing import TYPE_CHECKING
from typing import Any
from typing import Generic
from typing import TypeVar
import pytest
from django.db import connection
from django.test.utils import CaptureQueriesContext
if TYPE_CHECKING:
from collections.abc import Callable
from django.db.models import QuerySet
from profiling.seed import ScaleProfile
T = TypeVar("T")
def require_postgres() -> None:
if connection.vendor != "postgresql":
pytest.skip(
"Profiling requires PostgreSQL to reflect production query "
"planning; SQLite does not reproduce the varchar-cast planner "
"pathology this work fixes.",
)
@dataclass(frozen=True, slots=True)
class ProfileResult(Generic[T]):
best_seconds: float
all_seconds: tuple[float, ...]
query_count: int
result: T
def run_profile(fn: Callable[[], T], *, repeat: int = 5) -> ProfileResult[T]:
require_postgres()
all_seconds: list[float] = []
result: T | None = None
query_count = 0
for i in range(repeat):
with CaptureQueriesContext(connection) as ctx:
start = time.perf_counter()
result = fn()
all_seconds.append(time.perf_counter() - start)
if i == repeat - 1:
query_count = len(ctx.captured_queries)
assert result is not None # repeat >= 1 guarantees at least one assignment
return ProfileResult(
best_seconds=min(all_seconds),
all_seconds=tuple(all_seconds),
query_count=query_count,
result=result,
)
def capture_explain_analyze(queryset: QuerySet[Any]) -> str:
if connection.vendor != "postgresql":
raise RuntimeError("EXPLAIN ANALYZE capture is Postgres-only")
sql, params = queryset.query.sql_with_params()
with connection.cursor() as cur:
cur.execute(f"EXPLAIN ANALYZE {sql}", params)
return "\n".join(row[0] for row in cur.fetchall())
def _current_git_ref() -> str:
result = subprocess.run(
["git", "rev-parse", "--short", "HEAD"],
capture_output=True,
text=True,
check=False,
)
return result.stdout.strip() or "unknown"
def append_profiling_history(
*,
stage: str,
scenario: str,
best_seconds: float,
query_count: int,
scale: ScaleProfile,
code_ref: str | None = None,
) -> None:
"""
Append one line to profiling/results/history.jsonl -- an append-only,
cross-session record of every profiling run. Unlike the per-stage
before/after snapshot JSON files (which the next run of the same stage
overwrites), this never gets clobbered, so a profiling effort picked
back up days later has a full timeline to resume from instead of only
the single most recent comparison.
``code_ref`` should identify the *production* code under test (a short
SHA on the feature branch, not this `profiling` branch) -- pass it
explicitly when known. Left as ``None``, it falls back to this repo's
current ``git rev-parse --short HEAD``, which is only meaningful if
you're actually running from a checkout where that reflects the code
being measured.
"""
results_dir = Path(__file__).parent / "results"
results_dir.mkdir(exist_ok=True)
entry = {
"timestamp": datetime.now(UTC).isoformat(),
"code_ref": code_ref or _current_git_ref(),
"stage": stage,
"scenario": scenario,
"scale": scale,
"best_seconds": best_seconds,
"query_count": query_count,
}
with (results_dir / "history.jsonl").open("a") as f:
f.write(json.dumps(entry) + "\n")
+18
View File
@@ -0,0 +1,18 @@
[tool.pytest]
ini_options.pythonpath = [ "../src", "..", "." ]
ini_options.markers = [
"""\
profiling: Profiling scripts comparing old vs new query patterns; require a throwaway PostgreSQL container, not run \
as part of the normal test suite\
""",
]
ini_options.DJANGO_SETTINGS_MODULE = "paperless.settings"
[tool.pytest_env]
# Standalone config: this directory must be independently runnable without
# the rest of the dev stack (Redis, etc) present -- only Postgres is required,
# via run_with_postgres.sh.
PAPERLESS_SECRET_KEY = "profiling-only-insecure-key"
PAPERLESS_DISABLE_DBHANDLER = "true"
PAPERLESS_CACHE_BACKEND = "django.core.cache.backends.locmem.LocMemCache"
PAPERLESS_CHANNELS_BACKEND = "channels.layers.InMemoryChannelLayer"
+8
View File
@@ -0,0 +1,8 @@
{"timestamp": "2026-07-27T22:47:46.677504+00:00", "code_ref": "test-run", "stage": "self-check", "scenario": "test_append_profiling_history_writes_a_valid_json_line", "scale": "medium", "best_seconds": 0.001, "query_count": 0}
{"timestamp": "2026-07-27T22:49:03.762638+00:00", "code_ref": "test-run", "stage": "self-check", "scenario": "test_append_profiling_history_writes_a_valid_json_line", "scale": "medium", "best_seconds": 0.001, "query_count": 0}
{"timestamp": "2026-07-27T23:01:49.777269+00:00", "code_ref": "0506dcad0", "stage": "stage1", "scenario": "get_objects_for_user_owner_aware_document_baseline", "scale": "medium", "best_seconds": 0.025123266968876123, "query_count": 1}
{"timestamp": "2026-07-28T01:38:32.706519+00:00", "code_ref": "e80ede4cb", "stage": "stage1", "scenario": "get_objects_for_user_owner_aware_document_baseline", "scale": "medium", "best_seconds": 31.46481539506931, "query_count": 1}
{"timestamp": "2026-07-28T03:53:46.770669+00:00", "code_ref": "d4fa85237", "stage": "stage1", "scenario": "get_objects_for_user_owner_aware_document_baseline", "scale": "medium", "best_seconds": 31.671881378046237, "query_count": 1}
{"timestamp": "2026-07-28T04:02:41.942168+00:00", "code_ref": "d4fa85237", "stage": "stage1", "scenario": "permitted_document_ids_after_stage1", "scale": "medium", "best_seconds": 0.07956207206007093, "query_count": 1}
{"timestamp": "2026-07-28T23:30:28.602501+00:00", "code_ref": "86846255f", "stage": "stage2", "scenario": "per_row_checker_vs_resolved_set_old", "scale": "medium", "best_seconds": 3.4628250940004364, "query_count": 692}
{"timestamp": "2026-07-28T23:30:28.606987+00:00", "code_ref": "86846255f", "stage": "stage2", "scenario": "per_row_checker_vs_resolved_set_new", "scale": "medium", "best_seconds": 0.10436739504802972, "query_count": 1}
+9
View File
@@ -0,0 +1,9 @@
{
"permitted_document_ids": {
"best_seconds": 0.07956207206007093,
"query_count": 1
},
"baseline_best_seconds": 31.671881378046237,
"baseline_query_count": 1,
"speedup_x": 398.07763370131113
}
@@ -0,0 +1,58 @@
Index Scan Backward using documents_document_created_bedd0818 on documents_document v0 (cost=91.31..99.33 rows=1 width=2900) (actual time=68.340..77.517 rows=12024.00 loops=1)
Filter: ((deleted_at IS NULL) AND ((owner_id = 12) OR (owner_id IS NULL) OR (ANY (id = (hashed SubPlan 1).col1))))
Rows Removed by Filter: 7976
Index Searches: 1
Buffers: shared hit=74978
SubPlan 1
-> Unique (cost=91.04..91.05 rows=2 width=4) (actual time=64.698..66.622 rows=9136.00 loops=1)
Buffers: shared hit=73487
-> Sort (cost=91.04..91.05 rows=2 width=4) (actual time=64.697..65.202 rows=9262.00 loops=1)
Sort Key: ((u0.object_pk)::integer)
Sort Method: quicksort Memory: 385kB
Buffers: shared hit=73487
-> Append (cost=0.27..91.03 rows=2 width=4) (actual time=0.026..63.201 rows=9262.00 loops=1)
Buffers: shared hit=73487
-> Nested Loop (cost=0.27..12.79 rows=1 width=4) (actual time=0.026..1.834 rows=237.00 loops=1)
Join Filter: (u0.permission_id = u1.id)
Buffers: shared hit=696
-> Index Only Scan using guardian_userobjectpermi_user_id_permission_id_ob_b0b3d2fc_uniq on guardian_userobjectpermission u0 (cost=0.27..8.29 rows=1 width=520) (actual time=0.012..0.131 rows=237.00 loops=1)
Index Cond: (user_id = 12)
Heap Fetches: 237
Index Searches: 1
Buffers: shared hit=222
-> Seq Scan on auth_permission u1 (cost=0.00..4.49 rows=1 width=4) (actual time=0.006..0.006 rows=1.00 loops=237)
Filter: (((codename)::text = 'view_document'::text) AND (content_type_id = 17))
Rows Removed by Filter: 67
Buffers: shared hit=474
-> Nested Loop (cost=4.73..78.23 rows=1 width=4) (actual time=1.119..60.528 rows=9025.00 loops=1)
Buffers: shared hit=72791
-> Nested Loop (cost=4.59..78.05 rows=1 width=524) (actual time=1.115..50.521 rows=9025.00 loops=1)
Buffers: shared hit=54741
-> Nested Loop (cost=4.44..73.62 rows=24 width=520) (actual time=1.109..13.226 rows=45387.00 loops=1)
Buffers: shared hit=329
-> Seq Scan on auth_permission u4 (cost=0.00..4.49 rows=1 width=4) (actual time=0.008..0.017 rows=1.00 loops=1)
Filter: (((codename)::text = 'view_document'::text) AND (content_type_id = 17))
Rows Removed by Filter: 165
Buffers: shared hit=2
-> Bitmap Heap Scan on guardian_groupobjectpermission u0_1 (cost=4.44..68.93 rows=20 width=524) (actual time=1.100..8.095 rows=45387.00 loops=1)
Recheck Cond: (permission_id = u4.id)
Heap Blocks: exact=290
Buffers: shared hit=327
-> Bitmap Index Scan on guardian_groupobjectpermission_permission_id_36572738 (cost=0.00..4.43 rows=20 width=0) (actual time=1.052..1.053 rows=45387.00 loops=1)
Index Cond: (permission_id = u4.id)
Index Searches: 1
Buffers: shared hit=37
-> Index Only Scan using auth_user_groups_user_id_group_id_94350c0c_uniq on auth_user_groups u2 (cost=0.15..0.18 rows=1 width=4) (actual time=0.001..0.001 rows=0.20 loops=45387)
Index Cond: ((user_id = 12) AND (group_id = u0_1.group_id))
Heap Fetches: 9025
Index Searches: 45387
Buffers: shared hit=54412
-> Index Only Scan using auth_group_pkey on auth_group u1_1 (cost=0.14..0.17 rows=1 width=4) (actual time=0.001..0.001 rows=1.00 loops=9025)
Index Cond: (id = u0_1.group_id)
Heap Fetches: 9025
Index Searches: 9025
Buffers: shared hit=18050
Planning:
Buffers: shared hit=2
Planning Time: 1.089 ms
Execution Time: 78.020 ms
+6
View File
@@ -0,0 +1,6 @@
{
"get_objects_for_user_owner_aware_document": {
"best_seconds": 31.671881378046237,
"query_count": 1
}
}
@@ -0,0 +1,68 @@
Sort (cost=3790.80..3790.82 rows=9 width=2900) (actual time=39120.166..39120.831 rows=12024.00 loops=1)
Sort Key: documents_document.created DESC
Sort Method: quicksort Memory: 3230kB
Buffers: shared hit=8598270
-> Seq Scan on documents_document (cost=2550.72..3790.65 rows=9 width=2900) (actual time=0.009..39114.720 rows=12024.00 loops=1)
Filter: ((deleted_at IS NULL) AND ((owner_id = 2) OR (owner_id IS NULL) OR (ANY (id = (hashed SubPlan 1).col1)) OR (ANY (id = (hashed SubPlan 2).col1))))
Rows Removed by Filter: 7976
Buffers: shared hit=8598270
SubPlan 1
-> Nested Loop Semi Join (cost=0.00..1245.63 rows=1 width=8) (actual time=4.254..969.033 rows=237.00 loops=1)
Join Filter: ((((v0.object_pk)::bigint)::character varying)::text = (((u0.id)::bigint)::character varying)::text)
Rows Removed by Join Filter: 2539276
Buffers: shared hit=214835
-> Nested Loop (cost=0.00..23.30 rows=1 width=516) (actual time=0.031..2.425 rows=237.00 loops=1)
Join Filter: (v0.permission_id = v2.id)
Buffers: shared hit=490
-> Seq Scan on guardian_userobjectpermission v0 (cost=0.00..18.80 rows=1 width=520) (actual time=0.021..0.424 rows=237.00 loops=1)
Filter: (user_id = 2)
Rows Removed by Filter: 2120
Buffers: shared hit=16
-> Seq Scan on auth_permission v2 (cost=0.00..4.49 rows=1 width=4) (actual time=0.006..0.006 rows=1.00 loops=237)
Filter: ((content_type_id = 17) AND ((codename)::text = 'view_document'::text))
Rows Removed by Filter: 67
Buffers: shared hit=474
-> Seq Scan on documents_document u0 (cost=0.00..1221.96 rows=12 width=4) (actual time=0.002..1.917 rows=10715.24 loops=237)
Filter: (deleted_at IS NULL)
Buffers: shared hit=214345
SubPlan 2
-> Nested Loop Semi Join (cost=4.73..1305.09 rows=1 width=8) (actual time=6.729..38127.912 rows=9025.00 loops=1)
Join Filter: ((((v0_1.object_pk)::bigint)::character varying)::text = (((u0_2.id)::bigint)::character varying)::text)
Rows Removed by Join Filter: 98955406
Buffers: shared hit=8382237
-> Nested Loop Semi Join (cost=4.73..82.77 rows=1 width=516) (actual time=1.109..137.661 rows=9025.00 loops=1)
Buffers: shared hit=145515
-> Nested Loop (cost=4.44..73.62 rows=24 width=520) (actual time=1.090..18.002 rows=45387.00 loops=1)
Buffers: shared hit=329
-> Seq Scan on auth_permission v2_1 (cost=0.00..4.49 rows=1 width=4) (actual time=0.011..0.023 rows=1.00 loops=1)
Filter: (((codename)::text = 'view_document'::text) AND (content_type_id = 17))
Rows Removed by Filter: 165
Buffers: shared hit=2
-> Bitmap Heap Scan on guardian_groupobjectpermission v0_1 (cost=4.44..68.93 rows=20 width=524) (actual time=1.077..10.777 rows=45387.00 loops=1)
Recheck Cond: (permission_id = v2_1.id)
Heap Blocks: exact=290
Buffers: shared hit=327
-> Bitmap Index Scan on guardian_groupobjectpermission_permission_id_36572738 (cost=0.00..4.43 rows=20 width=0) (actual time=1.026..1.026 rows=45387.00 loops=1)
Index Cond: (permission_id = v2_1.id)
Index Searches: 1
Buffers: shared hit=37
-> Nested Loop (cost=0.30..0.37 rows=1 width=8) (actual time=0.002..0.002 rows=0.20 loops=45387)
Join Filter: (u0_1.id = u1.group_id)
Buffers: shared hit=145186
-> Index Only Scan using auth_group_pkey on auth_group u0_1 (cost=0.14..0.17 rows=1 width=4) (actual time=0.001..0.001 rows=1.00 loops=45387)
Index Cond: (id = v0_1.group_id)
Heap Fetches: 45387
Index Searches: 45387
Buffers: shared hit=90774
-> Index Only Scan using auth_user_groups_user_id_group_id_94350c0c_uniq on auth_user_groups u1 (cost=0.15..0.18 rows=1 width=4) (actual time=0.001..0.001 rows=0.20 loops=45387)
Index Cond: ((user_id = 2) AND (group_id = v0_1.group_id))
Heap Fetches: 9025
Index Searches: 45387
Buffers: shared hit=54412
-> Seq Scan on documents_document u0_2 (cost=0.00..1221.96 rows=12 width=4) (actual time=0.002..1.956 rows=10965.59 loops=9025)
Filter: (deleted_at IS NULL)
Buffers: shared hit=8236722
Planning:
Buffers: shared hit=3
Planning Time: 1.119 ms
Execution Time: 39121.312 ms
+48
View File
@@ -0,0 +1,48 @@
#!/usr/bin/env bash
# profiling/run_with_postgres.sh
#
# Starts a PostgreSQL 18 container (matching
# docker/compose/docker-compose.postgres.yml's image) if one isn't already
# running, waits for it to accept connections, force-terminates any
# leftover connections from a previous run that crashed or was killed, then
# runs the given command against it with the right PAPERLESS_DB* env vars
# set. The container is intentionally left running afterward -- see
# stop_postgres.sh to tear it down explicitly once you're done profiling
# for the session.
set -euo pipefail
CONTAINER_NAME="pngx-profiling-pg"
HOST_PORT="55432"
if ! docker inspect "$CONTAINER_NAME" >/dev/null 2>&1; then
docker run --rm -d \
--name "$CONTAINER_NAME" \
-e POSTGRES_DB=paperless \
-e POSTGRES_USER=paperless \
-e POSTGRES_PASSWORD=paperless \
-p "${HOST_PORT}:5432" \
docker.io/library/postgres:18 >/dev/null
echo "Started profiling Postgres container '$CONTAINER_NAME' on port $HOST_PORT (left running -- see profiling/stop_postgres.sh)." >&2
fi
until docker exec "$CONTAINER_NAME" pg_isready -U paperless >/dev/null 2>&1; do
sleep 1
done
# Reap any connections left over from a previous run that crashed, was
# killed, or timed out mid-query -- without this, a persistent container
# can accumulate stuck backends that block later test-database
# create/drop operations indefinitely.
docker exec "$CONTAINER_NAME" psql -U paperless -d paperless -v ON_ERROR_STOP=0 -c "
SELECT pg_terminate_backend(pid)
FROM pg_stat_activity
WHERE datname IN ('paperless', 'test_paperless')
AND pid <> pg_backend_pid();
" >/dev/null 2>&1 || true
PAPERLESS_DBHOST=localhost \
PAPERLESS_DBNAME=paperless \
PAPERLESS_DBUSER=paperless \
PAPERLESS_DBPASS=paperless \
PAPERLESS_DBPORT="${HOST_PORT}" \
"$@"
+199
View File
@@ -0,0 +1,199 @@
# profiling/seed.py
from __future__ import annotations
import random
from dataclasses import dataclass
from typing import TYPE_CHECKING
from typing import Literal
from django.contrib.auth.models import Group
from django.contrib.auth.models import User
from guardian.shortcuts import assign_perm
from documents.models import Document
from documents.tests.factories import CorrespondentFactory
from documents.tests.factories import DocumentFactory
from documents.tests.factories import DocumentTypeFactory
from documents.tests.factories import StoragePathFactory
from documents.tests.factories import TagFactory
if TYPE_CHECKING:
from documents.models import Correspondent
from documents.models import DocumentType
from documents.models import StoragePath
from documents.models import Tag
ScaleProfile = Literal["medium", "large"]
# Fraction of seeded documents given a real owner; the remainder stays
# owner=None, mirroring a real install's mix of owned and legacy/imported
# unowned documents.
_OWNED_FRACTION = 0.9
class _ScaleCounts:
__slots__ = (
"correspondents",
"document_types",
"documents",
"groups",
"storage_paths",
"tags",
"users",
)
def __init__(
self,
*,
documents: int,
tags: int,
correspondents: int,
document_types: int,
storage_paths: int,
users: int,
groups: int,
) -> None:
self.documents = documents
self.tags = tags
self.correspondents = correspondents
self.document_types = document_types
self.storage_paths = storage_paths
self.users = users
self.groups = groups
_SCALE_PROFILES: dict[ScaleProfile, _ScaleCounts] = {
"medium": _ScaleCounts(
documents=20_000,
tags=100,
correspondents=300,
document_types=50,
storage_paths=20,
users=10,
groups=5,
),
"large": _ScaleCounts(
documents=360_000,
tags=1_000,
correspondents=5_000,
document_types=300,
storage_paths=50,
users=25,
groups=10,
),
}
# Ratios measured from a real install (discussion #13276): 1,414 user-perm
# rows / 27,232 group-perm rows over 12,000 documents.
_USER_PERM_ROWS_PER_DOC = 1_414 / 12_000
_GROUP_PERM_ROWS_PER_DOC = 27_232 / 12_000
def _sample_distinct_pairs(
rng: random.Random,
n_subjects: int,
n_objects: int,
count: int,
) -> set[tuple[int, int]]:
"""
Rejection-sample `count` distinct (subject_index, object_index) pairs.
`count` is always well under `n_subjects * n_objects` for every scale
profile, so this terminates quickly.
"""
if count > n_subjects * n_objects:
msg = (
f"cannot sample {count} distinct pairs from only "
f"{n_subjects * n_objects} possible (subject, object) slots"
)
raise ValueError(msg)
pairs: set[tuple[int, int]] = set()
while len(pairs) < count:
pairs.add((rng.randrange(n_subjects), rng.randrange(n_objects)))
return pairs
@dataclass(frozen=True, slots=True)
class SeededData:
users: tuple[User, ...]
groups: tuple[Group, ...]
documents: tuple[Document, ...]
tags: tuple[Tag, ...]
correspondents: tuple[Correspondent, ...]
document_types: tuple[DocumentType, ...]
storage_paths: tuple[StoragePath, ...]
def seed_permission_dataset(
scale: ScaleProfile = "medium",
*,
seed: int = 1337,
) -> SeededData:
"""
Build a dataset whose document count and guardian-permission-row ratios
mirror real bug reports, so profiling results are representative of
actual large installs rather than an arbitrary small fixture.
"""
counts = _SCALE_PROFILES[scale]
rng = random.Random(seed)
users = tuple(
User.objects.create_user(username=f"profile_user_{i}")
for i in range(counts.users)
)
groups = tuple(
Group.objects.create(name=f"profile_group_{i}") for i in range(counts.groups)
)
for user in users:
user.groups.add(rng.choice(groups))
documents = list(DocumentFactory.create_batch(counts.documents))
# Assign realistic ownership -- without this, every document stays
# owner=None and the "owned or unowned" visibility clause is trivially
# true for every row, so no guardian permission check ever needs to run
# (see the amendment note above this code block).
owned_documents = []
for document in documents:
if rng.random() < _OWNED_FRACTION:
document.owner = rng.choice(users)
owned_documents.append(document)
Document.objects.bulk_update(owned_documents, ["owner"], batch_size=2_000)
documents = tuple(documents)
tags = tuple(TagFactory.create_batch(counts.tags))
correspondents = tuple(CorrespondentFactory.create_batch(counts.correspondents))
document_types = tuple(DocumentTypeFactory.create_batch(counts.document_types))
storage_paths = tuple(StoragePathFactory.create_batch(counts.storage_paths))
n_user_perms = round(counts.documents * _USER_PERM_ROWS_PER_DOC)
n_group_perms = round(counts.documents * _GROUP_PERM_ROWS_PER_DOC)
# Grant permissions only on OWNED documents -- a grant on an already-
# unowned document is a no-op for visibility (unowned documents are
# visible to everyone regardless), so restricting the pool here is what
# makes each assign_perm() call actually matter for someone, and is
# what exercises the guardian-permission-join code path this profiling
# effort exists to measure.
for user_idx, owned_idx in _sample_distinct_pairs(
rng,
len(users),
len(owned_documents),
n_user_perms,
):
assign_perm("view_document", users[user_idx], owned_documents[owned_idx])
for group_idx, owned_idx in _sample_distinct_pairs(
rng,
len(groups),
len(owned_documents),
n_group_perms,
):
assign_perm("view_document", groups[group_idx], owned_documents[owned_idx])
return SeededData(
users=users,
groups=groups,
documents=documents,
tags=tags,
correspondents=correspondents,
document_types=document_types,
storage_paths=storage_paths,
)
+24
View File
@@ -0,0 +1,24 @@
#!/usr/bin/env bash
# profiling/stop_postgres.sh
#
# Explicit, manual teardown of the profiling Postgres container. Not called
# automatically by run_with_postgres.sh -- run this yourself once you're
# done with a profiling session, so a seeded `large`-scale dataset can be
# reused across several script runs first. Terminates any active backends
# before stopping, so a stuck query can't stall `docker stop` waiting for
# a graceful Postgres shutdown that never comes.
set -euo pipefail
CONTAINER_NAME="pngx-profiling-pg"
if docker inspect "$CONTAINER_NAME" >/dev/null 2>&1; then
docker exec "$CONTAINER_NAME" psql -U paperless -d paperless -v ON_ERROR_STOP=0 -c "
SELECT pg_terminate_backend(pid)
FROM pg_stat_activity
WHERE pid <> pg_backend_pid();
" >/dev/null 2>&1 || true
docker stop "$CONTAINER_NAME" >/dev/null
echo "Stopped and removed profiling Postgres container."
else
echo "No profiling Postgres container was running."
fi
+74
View File
@@ -0,0 +1,74 @@
# profiling/test_harness_self_check.py
from __future__ import annotations
import json
from pathlib import Path
import pytest
from profiling.harness import append_profiling_history
from profiling.harness import require_postgres
from profiling.harness import run_profile
from profiling.seed import seed_permission_dataset
@pytest.mark.profiling
@pytest.mark.django_db
def test_seed_medium_scale_produces_expected_counts() -> None:
require_postgres()
data = seed_permission_dataset(scale="medium")
assert len(data.documents) == 20_000
assert len(data.tags) == 100
assert len(data.correspondents) == 300
assert len(data.document_types) == 50
assert len(data.storage_paths) == 20
from guardian.models import GroupObjectPermission
from guardian.models import UserObjectPermission
user_perm_count = UserObjectPermission.objects.count()
group_perm_count = GroupObjectPermission.objects.count()
# within 5% of the ratio-derived target -- exact counts depend on random
# sampling without replacement, see seed.py
assert 2_242 <= user_perm_count <= 2_478
assert 43_111 <= group_perm_count <= 47_649
@pytest.mark.profiling
@pytest.mark.django_db
def test_run_profile_reports_query_count_and_timing() -> None:
require_postgres()
def trivial() -> list[int]:
from documents.models import Document
return list(Document.objects.values_list("id", flat=True)[:1])
result = run_profile(trivial, repeat=3)
assert result.best_seconds >= 0
assert len(result.all_seconds) == 3
assert result.query_count >= 1
def test_append_profiling_history_writes_a_valid_json_line() -> None:
history_path = Path(__file__).parent / "results" / "history.jsonl"
before_lines = (
history_path.read_text().splitlines() if history_path.exists() else []
)
append_profiling_history(
stage="self-check",
scenario="test_append_profiling_history_writes_a_valid_json_line",
best_seconds=0.001,
query_count=0,
scale="medium",
code_ref="test-run",
)
after_lines = history_path.read_text().splitlines()
assert len(after_lines) == len(before_lines) + 1
entry = json.loads(after_lines[-1])
assert entry["stage"] == "self-check"
assert entry["code_ref"] == "test-run"
assert entry["scale"] == "medium"
assert "timestamp" in entry
+125
View File
@@ -0,0 +1,125 @@
from __future__ import annotations
import json
from pathlib import Path
import pytest
from documents.models import Document
from documents.permissions import get_objects_for_user_owner_aware
from documents.permissions import permitted_document_ids
from profiling.harness import append_profiling_history
from profiling.harness import capture_explain_analyze
from profiling.harness import require_postgres
from profiling.harness import run_profile
from profiling.seed import seed_permission_dataset
RESULTS_DIR = Path(__file__).parent / "results"
@pytest.mark.profiling
@pytest.mark.django_db
def test_profile_get_objects_for_user_owner_aware_document_baseline() -> None:
require_postgres()
data = seed_permission_dataset(scale="medium")
user = data.users[0]
def call() -> list[int]:
return list(
get_objects_for_user_owner_aware(
user,
"documents.view_document",
Document,
).values_list("id", flat=True),
)
profile = run_profile(call, repeat=3)
plan = capture_explain_analyze(
get_objects_for_user_owner_aware(user, "documents.view_document", Document),
)
RESULTS_DIR.mkdir(exist_ok=True)
(RESULTS_DIR / "stage1_baseline.json").write_text(
json.dumps(
{
"get_objects_for_user_owner_aware_document": {
"best_seconds": profile.best_seconds,
"query_count": profile.query_count,
},
},
indent=2,
),
)
(RESULTS_DIR / "stage1_baseline_explain.txt").write_text(plan)
append_profiling_history(
stage="stage1",
scenario="get_objects_for_user_owner_aware_document_baseline",
best_seconds=profile.best_seconds,
query_count=profile.query_count,
scale="medium",
)
print(f"\nBASELINE best={profile.best_seconds:.4f}s queries={profile.query_count}") # noqa: T201
print(plan) # noqa: T201
@pytest.mark.profiling
@pytest.mark.django_db
def test_profile_permitted_document_ids_after_stage1() -> None:
require_postgres()
data = seed_permission_dataset(scale="medium")
user = data.users[0]
def call():
return list(
Document.objects.filter(id__in=permitted_document_ids(user)).values_list(
"id",
flat=True,
),
)
profile = run_profile(call, repeat=3)
plan = capture_explain_analyze(
Document.objects.filter(id__in=permitted_document_ids(user)),
)
baseline = json.loads((RESULTS_DIR / "stage1_baseline.json").read_text())
baseline_seconds = baseline["get_objects_for_user_owner_aware_document"][
"best_seconds"
]
baseline_queries = baseline["get_objects_for_user_owner_aware_document"][
"query_count"
]
(RESULTS_DIR / "stage1_after.json").write_text(
json.dumps(
{
"permitted_document_ids": {
"best_seconds": profile.best_seconds,
"query_count": profile.query_count,
},
"baseline_best_seconds": baseline_seconds,
"baseline_query_count": baseline_queries,
"speedup_x": baseline_seconds / profile.best_seconds
if profile.best_seconds
else None,
},
indent=2,
),
)
(RESULTS_DIR / "stage1_after_explain.txt").write_text(plan)
append_profiling_history(
stage="stage1",
scenario="permitted_document_ids_after_stage1",
best_seconds=profile.best_seconds,
query_count=profile.query_count,
scale="medium",
)
print(f"\nBEFORE best={baseline_seconds:.4f}s queries={baseline_queries}") # noqa: T201
print(f"AFTER best={profile.best_seconds:.4f}s queries={profile.query_count}") # noqa: T201
# Hard gate: must not be a regression, and should be meaningfully faster
# at this scale (the whole point of this stage).
assert profile.best_seconds < baseline_seconds
assert profile.query_count <= baseline_queries
+64
View File
@@ -0,0 +1,64 @@
# profiling/test_stage2_document_loops.py
from __future__ import annotations
import pytest
from documents.permissions import has_perms_owner_aware
from documents.permissions import permitted_document_ids
from profiling.harness import append_profiling_history
from profiling.harness import require_postgres
from profiling.harness import run_profile
from profiling.seed import seed_permission_dataset
@pytest.mark.profiling
@pytest.mark.django_db
def test_profile_per_row_checker_vs_resolved_set_for_bulk_operation() -> None:
require_postgres()
data = seed_permission_dataset(scale="medium")
user = data.users[0]
# simulate a bulk operation over 500 documents the user can actually see
# (bulk-edit/share/trash all operate on a user's own selection) -- built
# from confirmed-visible documents so all() can't short-circuit unfairly
# in either old_style or new_style, see amendment note above
permitted_ids = set(permitted_document_ids(user))
batch = [doc for doc in data.documents if doc.pk in permitted_ids][:500]
assert len(batch) == 500, (
f"expected at least 500 visible documents to build a fair batch, "
f"got {len(batch)} -- scale profile or seed ratios may need adjusting"
)
def old_style():
return all(has_perms_owner_aware(user, "view_document", doc) for doc in batch)
def new_style():
permitted = set(permitted_document_ids(user))
return all(doc.pk in permitted for doc in batch)
old_profile = run_profile(old_style, repeat=3)
new_profile = run_profile(new_style, repeat=3)
append_profiling_history(
stage="stage2",
scenario="per_row_checker_vs_resolved_set_old",
best_seconds=old_profile.best_seconds,
query_count=old_profile.query_count,
scale="medium",
)
append_profiling_history(
stage="stage2",
scenario="per_row_checker_vs_resolved_set_new",
best_seconds=new_profile.best_seconds,
query_count=new_profile.query_count,
scale="medium",
)
print( # noqa: T201
f"\nOLD (per-row checker): best={old_profile.best_seconds:.4f}s queries={old_profile.query_count}",
)
print( # noqa: T201
f"NEW (resolved set): best={new_profile.best_seconds:.4f}s queries={new_profile.query_count}",
)
assert new_profile.query_count < old_profile.query_count
assert new_profile.best_seconds < old_profile.best_seconds
@@ -1,4 +1,4 @@
import { expect, test } from '@playwright/test'
import { expect, test, type WebSocketRoute } from '@playwright/test'
import path from 'node:path'
const REQUESTS_HAR = path.join(__dirname, 'requests/api-document-detail.har')
@@ -95,3 +95,60 @@ test('should support quick filters', async ({ page }) => {
.click()
await expect(page).toHaveURL(/tags__id__all=4&sort=created&reverse=1&page=1/)
})
test('should finish reloading the preview after a remote document update', async ({
page,
}) => {
let resolveStatusSocket: (socket: WebSocketRoute) => void
const statusSocketReady = new Promise<WebSocketRoute>((resolve) => {
resolveStatusSocket = resolve
})
await page.routeWebSocket(/\/ws\/status\/$/, (socket) => {
resolveStatusSocket(socket)
})
await page.routeFromHAR(REQUESTS_HAR, { notFound: 'fallback' })
let previewRequestCount = 0
page.on('request', (request) => {
if (request.url().includes('/api/documents/175/preview/')) {
previewRequestCount++
}
})
await page.goto('/documents/175/details')
await page.locator('pngx-document-detail').waitFor()
await expect(page.getByTitle('Storage path', { exact: true })).toHaveText(
/\w+/
)
const previewWasLoaded = await page.evaluate(() => {
const detail = document.querySelector('pngx-document-detail')
const component = (window as any).ng.getComponent(detail)
component.pdfPreviewLoaded({ numPages: 1 })
return component.previewLoaded()
})
expect(previewWasLoaded).toBe(true)
const previewRequestsBeforeReload = previewRequestCount
const statusSocket = await statusSocketReady
const documentReloaded = page.waitForResponse(
(response) =>
response.url().includes('/api/documents/175/?full_perms=true') &&
response.request().method() === 'GET'
)
statusSocket.send(
JSON.stringify({
type: 'document_updated',
data: {
document_id: 175,
modified: '2026-07-26T20:00:00Z',
},
})
)
await documentReloaded
await expect(
page.getByText('Document reloaded with latest changes.').first()
).toBeVisible()
await expect
.poll(() => previewRequestCount)
.toBeGreaterThan(previewRequestsBeforeReload + 1)
})
+49 -49
View File
@@ -1277,7 +1277,7 @@
</context-group>
<context-group purpose="location">
<context context-type="sourcefile">src/app/components/document-detail/document-detail.component.ts</context>
<context context-type="linenumber">1787</context>
<context context-type="linenumber">1791</context>
</context-group>
</trans-unit>
<trans-unit id="1577733187050997705" datatype="html">
@@ -2184,7 +2184,7 @@
</context-group>
<context-group purpose="location">
<context context-type="sourcefile">src/app/components/document-detail/document-detail.component.ts</context>
<context context-type="linenumber">653</context>
<context context-type="linenumber">657</context>
</context-group>
<context-group purpose="location">
<context context-type="sourcefile">src/app/components/document-detail/document-version-dropdown/document-version-dropdown.component.html</context>
@@ -3087,11 +3087,11 @@
</context-group>
<context-group purpose="location">
<context context-type="sourcefile">src/app/components/document-detail/document-detail.component.ts</context>
<context context-type="linenumber">1405</context>
<context context-type="linenumber">1409</context>
</context-group>
<context-group purpose="location">
<context context-type="sourcefile">src/app/components/document-detail/document-detail.component.ts</context>
<context context-type="linenumber">1788</context>
<context context-type="linenumber">1792</context>
</context-group>
<context-group purpose="location">
<context context-type="sourcefile">src/app/components/document-list/bulk-editor/bulk-editor.component.ts</context>
@@ -3688,7 +3688,7 @@
</context-group>
<context-group purpose="location">
<context context-type="sourcefile">src/app/components/document-detail/document-detail.component.ts</context>
<context context-type="linenumber">1358</context>
<context context-type="linenumber">1362</context>
</context-group>
<context-group purpose="location">
<context context-type="sourcefile">src/app/components/document-list/bulk-editor/bulk-editor.component.ts</context>
@@ -3800,7 +3800,7 @@
</context-group>
<context-group purpose="location">
<context context-type="sourcefile">src/app/components/document-detail/document-detail.component.ts</context>
<context context-type="linenumber">1841</context>
<context context-type="linenumber">1845</context>
</context-group>
</trans-unit>
<trans-unit id="6661109599266152398" datatype="html">
@@ -3811,7 +3811,7 @@
</context-group>
<context-group purpose="location">
<context context-type="sourcefile">src/app/components/document-detail/document-detail.component.ts</context>
<context context-type="linenumber">1842</context>
<context context-type="linenumber">1846</context>
</context-group>
</trans-unit>
<trans-unit id="5162686434580248853" datatype="html">
@@ -3822,7 +3822,7 @@
</context-group>
<context-group purpose="location">
<context context-type="sourcefile">src/app/components/document-detail/document-detail.component.ts</context>
<context context-type="linenumber">1843</context>
<context context-type="linenumber">1847</context>
</context-group>
</trans-unit>
<trans-unit id="8157388568390631653" datatype="html">
@@ -5724,7 +5724,7 @@
</context-group>
<context-group purpose="location">
<context context-type="sourcefile">src/app/components/document-detail/document-detail.component.ts</context>
<context context-type="linenumber">1362</context>
<context context-type="linenumber">1366</context>
</context-group>
<context-group purpose="location">
<context context-type="sourcefile">src/app/components/document-list/bulk-editor/bulk-editor.component.ts</context>
@@ -7966,88 +7966,88 @@
<source>Enter Password</source>
<context-group purpose="location">
<context context-type="sourcefile">src/app/components/document-detail/document-detail.component.html</context>
<context context-type="linenumber">512</context>
<context context-type="linenumber">513</context>
</context-group>
</trans-unit>
<trans-unit id="5758784066858623886" datatype="html">
<source>Error retrieving metadata</source>
<context-group purpose="location">
<context context-type="sourcefile">src/app/components/document-detail/document-detail.component.ts</context>
<context context-type="linenumber">423</context>
<context context-type="linenumber">424</context>
</context-group>
</trans-unit>
<trans-unit id="2218903673684131427" datatype="html">
<source>An error occurred loading content: <x id="PH" equiv-text="err.message ?? err.toString()"/></source>
<context-group purpose="location">
<context context-type="sourcefile">src/app/components/document-detail/document-detail.component.ts</context>
<context context-type="linenumber">525,527</context>
<context context-type="linenumber">526,528</context>
</context-group>
<context-group purpose="location">
<context context-type="sourcefile">src/app/components/document-detail/document-detail.component.ts</context>
<context context-type="linenumber">982,984</context>
<context context-type="linenumber">986,988</context>
</context-group>
</trans-unit>
<trans-unit id="6357361810318120957" datatype="html">
<source>Document was updated</source>
<context-group purpose="location">
<context context-type="sourcefile">src/app/components/document-detail/document-detail.component.ts</context>
<context context-type="linenumber">648</context>
<context context-type="linenumber">652</context>
</context-group>
</trans-unit>
<trans-unit id="5154064822428631306" datatype="html">
<source>Document was updated at <x id="PH" equiv-text="formattedModified"/>.</source>
<context-group purpose="location">
<context context-type="sourcefile">src/app/components/document-detail/document-detail.component.ts</context>
<context context-type="linenumber">649</context>
<context context-type="linenumber">653</context>
</context-group>
</trans-unit>
<trans-unit id="8462497568316256794" datatype="html">
<source>Reload to discard your local unsaved edits and load the latest remote version.</source>
<context-group purpose="location">
<context context-type="sourcefile">src/app/components/document-detail/document-detail.component.ts</context>
<context context-type="linenumber">650</context>
<context context-type="linenumber">654</context>
</context-group>
</trans-unit>
<trans-unit id="7967484035994732534" datatype="html">
<source>Reload</source>
<context-group purpose="location">
<context context-type="sourcefile">src/app/components/document-detail/document-detail.component.ts</context>
<context context-type="linenumber">652</context>
<context context-type="linenumber">656</context>
</context-group>
</trans-unit>
<trans-unit id="2907037627372942104" datatype="html">
<source>Document reloaded with latest changes.</source>
<context-group purpose="location">
<context context-type="sourcefile">src/app/components/document-detail/document-detail.component.ts</context>
<context context-type="linenumber">708</context>
<context context-type="linenumber">712</context>
</context-group>
</trans-unit>
<trans-unit id="6435639868943916539" datatype="html">
<source>Document reloaded.</source>
<context-group purpose="location">
<context context-type="sourcefile">src/app/components/document-detail/document-detail.component.ts</context>
<context context-type="linenumber">719</context>
<context context-type="linenumber">723</context>
</context-group>
</trans-unit>
<trans-unit id="6142395741265832184" datatype="html">
<source>Next document</source>
<context-group purpose="location">
<context context-type="sourcefile">src/app/components/document-detail/document-detail.component.ts</context>
<context context-type="linenumber">821</context>
<context context-type="linenumber">825</context>
</context-group>
</trans-unit>
<trans-unit id="651985345816518480" datatype="html">
<source>Previous document</source>
<context-group purpose="location">
<context context-type="sourcefile">src/app/components/document-detail/document-detail.component.ts</context>
<context context-type="linenumber">831</context>
<context context-type="linenumber">835</context>
</context-group>
</trans-unit>
<trans-unit id="2885986061416655600" datatype="html">
<source>Close document</source>
<context-group purpose="location">
<context context-type="sourcefile">src/app/components/document-detail/document-detail.component.ts</context>
<context context-type="linenumber">839</context>
<context context-type="linenumber">843</context>
</context-group>
<context-group purpose="location">
<context context-type="sourcefile">src/app/services/open-documents.service.ts</context>
@@ -8058,67 +8058,67 @@
<source>Save document</source>
<context-group purpose="location">
<context context-type="sourcefile">src/app/components/document-detail/document-detail.component.ts</context>
<context context-type="linenumber">846</context>
<context context-type="linenumber">850</context>
</context-group>
</trans-unit>
<trans-unit id="1784543155727940353" datatype="html">
<source>Save and close / next</source>
<context-group purpose="location">
<context context-type="sourcefile">src/app/components/document-detail/document-detail.component.ts</context>
<context context-type="linenumber">855</context>
<context context-type="linenumber">859</context>
</context-group>
</trans-unit>
<trans-unit id="7427704425579737895" datatype="html">
<source>Error retrieving version content</source>
<context-group purpose="location">
<context context-type="sourcefile">src/app/components/document-detail/document-detail.component.ts</context>
<context context-type="linenumber">965</context>
<context context-type="linenumber">969</context>
</context-group>
</trans-unit>
<trans-unit id="3456881259945295697" datatype="html">
<source>Error retrieving suggestions.</source>
<context-group purpose="location">
<context context-type="sourcefile">src/app/components/document-detail/document-detail.component.ts</context>
<context context-type="linenumber">1026</context>
<context context-type="linenumber">1030</context>
</context-group>
</trans-unit>
<trans-unit id="2194092841814123758" datatype="html">
<source>Document &quot;<x id="PH" equiv-text="newValues.title"/>&quot; saved successfully.</source>
<context-group purpose="location">
<context context-type="sourcefile">src/app/components/document-detail/document-detail.component.ts</context>
<context context-type="linenumber">1238</context>
<context context-type="linenumber">1242</context>
</context-group>
<context-group purpose="location">
<context context-type="sourcefile">src/app/components/document-detail/document-detail.component.ts</context>
<context context-type="linenumber">1265</context>
<context context-type="linenumber">1269</context>
</context-group>
</trans-unit>
<trans-unit id="6626387786259219838" datatype="html">
<source>Error saving document &quot;<x id="PH" equiv-text="this.document().title"/>&quot;</source>
<context-group purpose="location">
<context context-type="sourcefile">src/app/components/document-detail/document-detail.component.ts</context>
<context context-type="linenumber">1271</context>
<context context-type="linenumber">1275</context>
</context-group>
</trans-unit>
<trans-unit id="448882439049417053" datatype="html">
<source>Error saving document</source>
<context-group purpose="location">
<context context-type="sourcefile">src/app/components/document-detail/document-detail.component.ts</context>
<context context-type="linenumber">1326</context>
<context context-type="linenumber">1330</context>
</context-group>
</trans-unit>
<trans-unit id="8410796510716511826" datatype="html">
<source>Do you really want to move the document &quot;<x id="PH" equiv-text="this.document().title"/>&quot; to the trash?</source>
<context-group purpose="location">
<context context-type="sourcefile">src/app/components/document-detail/document-detail.component.ts</context>
<context context-type="linenumber">1359</context>
<context context-type="linenumber">1363</context>
</context-group>
</trans-unit>
<trans-unit id="282586936710748252" datatype="html">
<source>Documents can be restored prior to permanent deletion.</source>
<context-group purpose="location">
<context context-type="sourcefile">src/app/components/document-detail/document-detail.component.ts</context>
<context context-type="linenumber">1360</context>
<context context-type="linenumber">1364</context>
</context-group>
<context-group purpose="location">
<context context-type="sourcefile">src/app/components/document-list/bulk-editor/bulk-editor.component.ts</context>
@@ -8129,14 +8129,14 @@
<source>Error deleting document</source>
<context-group purpose="location">
<context context-type="sourcefile">src/app/components/document-detail/document-detail.component.ts</context>
<context context-type="linenumber">1381</context>
<context context-type="linenumber">1385</context>
</context-group>
</trans-unit>
<trans-unit id="619486176823357521" datatype="html">
<source>Reprocess confirm</source>
<context-group purpose="location">
<context context-type="sourcefile">src/app/components/document-detail/document-detail.component.ts</context>
<context context-type="linenumber">1401</context>
<context context-type="linenumber">1405</context>
</context-group>
<context-group purpose="location">
<context context-type="sourcefile">src/app/components/document-list/bulk-editor/bulk-editor.component.ts</context>
@@ -8147,102 +8147,102 @@
<source>This operation will permanently recreate the archive file for this document.</source>
<context-group purpose="location">
<context context-type="sourcefile">src/app/components/document-detail/document-detail.component.ts</context>
<context context-type="linenumber">1402</context>
<context context-type="linenumber">1406</context>
</context-group>
</trans-unit>
<trans-unit id="302054111564709516" datatype="html">
<source>The archive file will be re-generated with the current settings.</source>
<context-group purpose="location">
<context context-type="sourcefile">src/app/components/document-detail/document-detail.component.ts</context>
<context context-type="linenumber">1403</context>
<context context-type="linenumber">1407</context>
</context-group>
</trans-unit>
<trans-unit id="4700389117298802932" datatype="html">
<source>Reprocess operation for &quot;<x id="PH" equiv-text="this.document().title"/>&quot; will begin in the background.</source>
<context-group purpose="location">
<context context-type="sourcefile">src/app/components/document-detail/document-detail.component.ts</context>
<context context-type="linenumber">1413</context>
<context context-type="linenumber">1417</context>
</context-group>
</trans-unit>
<trans-unit id="4409560272830824468" datatype="html">
<source>Error executing operation</source>
<context-group purpose="location">
<context context-type="sourcefile">src/app/components/document-detail/document-detail.component.ts</context>
<context context-type="linenumber">1424</context>
<context context-type="linenumber">1428</context>
</context-group>
</trans-unit>
<trans-unit id="6030453331794586802" datatype="html">
<source>Error downloading document</source>
<context-group purpose="location">
<context context-type="sourcefile">src/app/components/document-detail/document-detail.component.ts</context>
<context context-type="linenumber">1487</context>
<context context-type="linenumber">1491</context>
</context-group>
</trans-unit>
<trans-unit id="4458954481601077369" datatype="html">
<source>Page Fit</source>
<context-group purpose="location">
<context context-type="sourcefile">src/app/components/document-detail/document-detail.component.ts</context>
<context context-type="linenumber">1565</context>
<context context-type="linenumber">1569</context>
</context-group>
</trans-unit>
<trans-unit id="4663705961777238777" datatype="html">
<source>PDF edit operation for &quot;<x id="PH" equiv-text="this.document().title"/>&quot; will begin in the background.</source>
<context-group purpose="location">
<context context-type="sourcefile">src/app/components/document-detail/document-detail.component.ts</context>
<context context-type="linenumber">1808</context>
<context context-type="linenumber">1812</context>
</context-group>
</trans-unit>
<trans-unit id="9043972994040261999" datatype="html">
<source>Error executing PDF edit operation</source>
<context-group purpose="location">
<context context-type="sourcefile">src/app/components/document-detail/document-detail.component.ts</context>
<context context-type="linenumber">1820</context>
<context context-type="linenumber">1824</context>
</context-group>
</trans-unit>
<trans-unit id="6172690334763056188" datatype="html">
<source>Please enter the current password before attempting to remove it.</source>
<context-group purpose="location">
<context context-type="sourcefile">src/app/components/document-detail/document-detail.component.ts</context>
<context context-type="linenumber">1831</context>
<context context-type="linenumber">1835</context>
</context-group>
</trans-unit>
<trans-unit id="968660764814228922" datatype="html">
<source>Password removal operation for &quot;<x id="PH" equiv-text="this.document().title"/>&quot; will begin in the background.</source>
<context-group purpose="location">
<context context-type="sourcefile">src/app/components/document-detail/document-detail.component.ts</context>
<context context-type="linenumber">1865</context>
<context context-type="linenumber">1869</context>
</context-group>
</trans-unit>
<trans-unit id="2282118435712883014" datatype="html">
<source>Error executing password removal operation</source>
<context-group purpose="location">
<context context-type="sourcefile">src/app/components/document-detail/document-detail.component.ts</context>
<context context-type="linenumber">1879</context>
<context context-type="linenumber">1883</context>
</context-group>
</trans-unit>
<trans-unit id="3740891324955700797" datatype="html">
<source>Print failed.</source>
<context-group purpose="location">
<context context-type="sourcefile">src/app/components/document-detail/document-detail.component.ts</context>
<context context-type="linenumber">1925</context>
<context context-type="linenumber">1929</context>
</context-group>
</trans-unit>
<trans-unit id="6457245677384603573" datatype="html">
<source>Error loading document for printing.</source>
<context-group purpose="location">
<context context-type="sourcefile">src/app/components/document-detail/document-detail.component.ts</context>
<context context-type="linenumber">1938</context>
<context context-type="linenumber">1942</context>
</context-group>
</trans-unit>
<trans-unit id="6085793215710522488" datatype="html">
<source>An error occurred loading tiff: <x id="PH" equiv-text="err.toString()"/></source>
<context-group purpose="location">
<context context-type="sourcefile">src/app/components/document-detail/document-detail.component.ts</context>
<context context-type="linenumber">2008</context>
<context context-type="linenumber">2012</context>
</context-group>
<context-group purpose="location">
<context context-type="sourcefile">src/app/components/document-detail/document-detail.component.ts</context>
<context context-type="linenumber">2014</context>
<context context-type="linenumber">2018</context>
</context-group>
</trans-unit>
<trans-unit id="4958946940233632319" datatype="html">
+3
View File
@@ -2,6 +2,9 @@ packages:
- "."
minimumReleaseAge: 10080
trustPolicy: no-downgrade
trustPolicyExclude:
- "chokidar@4.0.3"
- "semver@6.3.1 || 5.7.2"
allowBuilds:
"@parcel/watcher": true
canvas: true
@@ -280,10 +280,52 @@ main {
}
}
@media screen and (min-width: 376px) and (max-width: 768px) {
@media screen and (max-width: 575.98px) {
.navbar {
display: grid;
grid-template-columns: 1fr auto 1fr;
grid-template-areas:
"toggler brand actions"
"search search search";
}
.navbar-toggler {
// compensate for 2 buttons on the right
margin-right: 45px;
grid-area: toggler;
text-align: left;
}
.navbar-brand {
grid-area: brand;
min-width: 0;
max-width: 100%;
justify-self: center;
overflow: hidden;
> div,
.custom-title {
min-width: 0;
max-width: 100%;
overflow: hidden;
}
.title,
.byline {
max-width: 100%;
overflow: hidden;
text-overflow: ellipsis;
white-space: nowrap;
}
}
.search-container {
grid-area: search;
width: 100%;
}
.navbar > ul {
grid-area: actions;
justify-self: end;
flex-wrap: nowrap;
}
}
@@ -293,13 +335,6 @@ main {
}
}
@media screen and (max-width: 345px) {
.custom-title {
max-width: 110px;
overflow: hidden;
}
}
:host ::ng-deep .dropdown.show .dropdown-toggle,
:host ::ng-deep .dropdown-toggle:hover {
opacity: 0.7;
@@ -283,6 +283,22 @@ describe('PngxPdfViewerComponent', () => {
expect(mockViewer.currentPageNumber).toBe(1)
})
it('reloads when the source revision changes', () => {
const resetSpy = jest.spyOn(component as any, 'resetViewerState')
const loadSpy = jest
.spyOn(component as any, 'loadDocument')
.mockImplementation(() => {})
component.src = 'test.pdf'
component.sourceRevision = 1
component.ngOnChanges({
sourceRevision: new SimpleChange(0, 1, false),
})
expect(resetSpy).toHaveBeenCalled()
expect(loadSpy).toHaveBeenCalled()
})
it('applies viewer state after view init when already loaded', () => {
const applySpy = jest.spyOn(component as any, 'applyViewerState')
;(component as any).hasLoaded = true
@@ -43,6 +43,7 @@ export class PngxPdfViewerComponent
private readonly document = inject<Document>(DOCUMENT)
@Input() src!: string
@Input() sourceRevision = 0
@Input() password?: string
@Input() page?: number
@Output() pageChange = new EventEmitter<number>()
@@ -93,7 +94,7 @@ export class PngxPdfViewerComponent
}
ngOnChanges(changes: SimpleChanges): void {
if (changes['src'] || changes['password']) {
if (changes['src'] || changes['sourceRevision'] || changes['password']) {
this.resetViewerState()
if (this.src) {
this.loadDocument()
@@ -472,6 +472,7 @@
<div class="preview-sticky pdf-viewer-container">
<pngx-pdf-viewer
[src]="pdfSource()"
[sourceRevision]="previewRevision()"
[password]="pdfPassword()"
[renderMode]="PdfRenderMode.All"
[page]="previewCurrentPage()" (pageChange)="previewCurrentPage.set($event)"
@@ -1602,6 +1602,7 @@ describe('DocumentDetailComponent', () => {
expect(openDoc.__changedFields).toEqual([])
expect(setDirtySpy).toHaveBeenCalledWith(openDoc, false)
expect(saveSpy).toHaveBeenCalled()
expect(component.previewRevision()).toBe(1)
})
it('should ignore incoming update for a different document id', () => {
@@ -249,6 +249,7 @@ export class DocumentDetailComponent
titleSubject: Subject<string> = new Subject()
readonly previewUrl = signal<string>(undefined)
readonly pdfSource = signal<string>(undefined)
readonly previewRevision = signal(0)
readonly pdfPassword = signal<string>(undefined)
readonly thumbUrl = signal<string>(undefined)
readonly previewText = signal<string>(undefined)
@@ -609,6 +610,9 @@ export class DocumentDetailComponent
.subscribe()
}
this.updateComponent(useDoc)
if (forceRemote) {
this.previewRevision.update((revision) => revision + 1)
}
this.titleSubject
.pipe(
debounceTime(1000),
@@ -25,7 +25,7 @@
<input #textFilterInput class="form-control form-control-sm" type="text"
[disabled]="textFilterModifierIsNull"
[(ngModel)]="textFilter"
(keyup)="textFilterKeyup($event)"
(keydown)="textFilterKeydown($event)"
[ngbTypeahead]="searchAutoComplete"
(selectItem)="itemSelected($event)"
[readonly]="textFilterTarget === 'fulltext-morelike'">
@@ -2180,17 +2180,17 @@ describe('FilterEditorComponent', () => {
it('should support Enter / Esc key on text field', () => {
component.textFilterInput.nativeElement.value = 'foo'
component.textFilterInput.nativeElement.dispatchEvent(
new KeyboardEvent('keyup', { key: 'Enter' })
new KeyboardEvent('keydown', { key: 'Enter' })
)
expect(component.textFilter).toEqual('foo')
component.textFilterInput.nativeElement.value = 'foo bar'
component.textFilterInput.nativeElement.dispatchEvent(
new KeyboardEvent('keyup', { key: 'Escape' })
new KeyboardEvent('keydown', { key: 'Escape' })
)
expect(component.textFilter).toEqual('')
const blurSpy = jest.spyOn(component.textFilterInput.nativeElement, 'blur')
component.textFilterInput.nativeElement.dispatchEvent(
new KeyboardEvent('keyup', { key: 'Escape' })
new KeyboardEvent('keydown', { key: 'Escape' })
)
expect(blurSpy).toHaveBeenCalled()
})
@@ -1312,7 +1312,7 @@ export class FilterEditorComponent
}
}
textFilterKeyup(event: KeyboardEvent) {
textFilterKeydown(event: KeyboardEvent) {
if (event.key == 'Enter') {
const filterString = (
this.textFilterInput.nativeElement as HTMLInputElement
@@ -108,6 +108,18 @@ describe('PermissionsService', () => {
actionKey: 'View', // PermissionAction.View
typeKey: 'Document', // PermissionType.Document
})
expect(
permissionsService.getPermissionKeys('view_global_statistics')
).toEqual({
actionKey: 'View', // PermissionAction.View
typeKey: 'GlobalStatistics', // PermissionType.GlobalStatistics
})
expect(
permissionsService.getPermissionKeys('view_system_monitoring')
).toEqual({
actionKey: 'View', // PermissionAction.View
typeKey: 'SystemMonitoring', // PermissionType.SystemMonitoring
})
})
it('correctly checks explicit global permissions', () => {
+7 -10
View File
@@ -110,19 +110,16 @@ export class PermissionsService {
actionKey: string
typeKey: string
} {
const matches = permissionStr.match(/(.+)_/)
let typeKey
let actionKey
if (matches?.length > 0) {
const action = matches[1]
const actionIndex = Object.values(PermissionAction).indexOf(
action as PermissionAction
)
if (actionIndex > -1) {
actionKey = Object.keys(PermissionAction)[actionIndex]
}
const actionIndex = Object.values(PermissionAction).findIndex((action) =>
permissionStr.startsWith(`${action}_`)
)
if (actionIndex > -1) {
const action = Object.values(PermissionAction)[actionIndex]
actionKey = Object.keys(PermissionAction)[actionIndex]
const typeIndex = Object.values(PermissionType).indexOf(
permissionStr.replace(action, '%s') as PermissionType
permissionStr.replace(`${action}_`, '%s_') as PermissionType
)
if (typeIndex > -1) {
typeKey = Object.keys(PermissionType)[typeIndex]
+4 -4
View File
@@ -1996,7 +1996,7 @@
<context context-type="sourcefile">src/app/components/admin/tasks/tasks.component.html</context>
<context context-type="linenumber">15</context>
</context-group>
<target state="needs-translation">Dismiss all</target>
<target state="translated">Descarta-ho tot</target>
</trans-unit>
<trans-unit id="1616102757855967475" datatype="html">
<source>All</source>
@@ -2076,7 +2076,7 @@
<context context-type="sourcefile">src/app/components/admin/tasks/tasks.component.html</context>
<context context-type="linenumber">96</context>
</context-group>
<target state="needs-translation">Search tasks</target>
<target state="translated">Cerca tasques</target>
</trans-unit>
<trans-unit id="6849725902312323996" datatype="html">
<source>Reset filters</source>
@@ -2696,7 +2696,7 @@
<context context-type="sourcefile">src/app/components/admin/tasks/tasks.component.ts</context>
<context context-type="linenumber">348</context>
</context-group>
<target state="needs-translation">Confirm Dismiss All</target>
<target state="translated">Confirma Descarta Tot</target>
</trans-unit>
<trans-unit id="4157200209636243740" datatype="html">
<source>Dismiss all <x id="PH" equiv-text="this.totalTasks()"/> tasks?</source>
@@ -2704,7 +2704,7 @@
<context context-type="sourcefile">src/app/components/admin/tasks/tasks.component.ts</context>
<context context-type="linenumber">349</context>
</context-group>
<target state="needs-translation">Dismiss all <x id="PH" equiv-text="this.totalTasks()"/> tasks?</target>
<target state="translated"/>
</trans-unit>
<trans-unit id="8149502458056418229" datatype="html">
<source>Success. New document id <x id="PH" equiv-text="documentId"/> created</source>
+87 -87
View File
@@ -828,7 +828,7 @@
<context context-type="sourcefile">src/app/components/admin/logs/logs.component.html</context>
<context context-type="linenumber">18</context>
</context-group>
<target state="translated">řádky</target>
<target state="translated">řádků</target>
</trans-unit>
<trans-unit id="8838884664569764142" datatype="html">
<source>Auto refresh</source>
@@ -1352,7 +1352,7 @@
<context context-type="sourcefile">src/app/components/admin/settings/settings.component.html</context>
<context context-type="linenumber">248</context>
</context-group>
<target state="needs-translation">Built-in fields to show:</target>
<target state="translated">Vestavěná pole k zobrazení:</target>
</trans-unit>
<trans-unit id="3467966318201103991" datatype="html">
<source>Uncheck fields to hide them on the document details page.</source>
@@ -1360,7 +1360,7 @@
<context context-type="sourcefile">src/app/components/admin/settings/settings.component.html</context>
<context context-type="linenumber">260</context>
</context-group>
<target state="needs-translation">Uncheck fields to hide them on the document details page.</target>
<target state="translated">Zrušte zaškrtnutí polí pro jejich skrytí na stránce s podrobnostmi o dokumentu.</target>
</trans-unit>
<trans-unit id="8508424367627989968" datatype="html" approved="yes">
<source>Bulk editing</source>
@@ -1400,7 +1400,7 @@
<context context-type="sourcefile">src/app/components/document-detail/document-detail.component.ts</context>
<context context-type="linenumber">1787</context>
</context-group>
<target state="translated">PDF editor</target>
<target state="translated">Editor PDF</target>
</trans-unit>
<trans-unit id="1577733187050997705" datatype="html">
<source>Default editing mode</source>
@@ -1964,7 +1964,7 @@
<context context-type="sourcefile">src/app/components/app-frame/app-frame.component.html</context>
<context context-type="linenumber">298</context>
</context-group>
<target state="needs-translation">Tasks</target>
<target state="translated">Úlohy</target>
</trans-unit>
<trans-unit id="8492095365580052820" datatype="html">
<source>Tasks shows detailed information about document consumption and system tasks.</source>
@@ -1972,7 +1972,7 @@
<context context-type="sourcefile">src/app/components/admin/tasks/tasks.component.html</context>
<context context-type="linenumber">4</context>
</context-group>
<target state="needs-translation">Tasks shows detailed information about document consumption and system tasks.</target>
<target state="translated">Úlohy zobrazují podrobné informace o zpracování dokumentů a systémových úlohách.</target>
</trans-unit>
<trans-unit id="103921551219467537" datatype="html">
<source>Clear selection</source>
@@ -1996,7 +1996,7 @@
<context context-type="sourcefile">src/app/components/admin/tasks/tasks.component.html</context>
<context context-type="linenumber">15</context>
</context-group>
<target state="needs-translation">Dismiss all</target>
<target state="translated">Zahodit vše</target>
</trans-unit>
<trans-unit id="1616102757855967475" datatype="html" approved="yes">
<source>All</source>
@@ -2056,7 +2056,7 @@
<context context-type="sourcefile">src/app/components/admin/tasks/tasks.component.ts</context>
<context context-type="linenumber">215</context>
</context-group>
<target state="needs-translation">All types</target>
<target state="translated">Všechny typy</target>
</trans-unit>
<trans-unit id="131016739441837046" datatype="html">
<source>All sources</source>
@@ -2068,7 +2068,7 @@
<context context-type="sourcefile">src/app/components/admin/tasks/tasks.component.ts</context>
<context context-type="linenumber">227</context>
</context-group>
<target state="needs-translation">All sources</target>
<target state="translated">Všechny zdroje</target>
</trans-unit>
<trans-unit id="3570013039254960445" datatype="html">
<source>Search tasks</source>
@@ -2100,7 +2100,7 @@
<context context-type="sourcefile">src/app/components/admin/tasks/tasks.component.html</context>
<context context-type="linenumber">126</context>
</context-group>
<target state="needs-translation">{VAR_PLURAL, plural, =1 {1 task} other {<x id="INTERPOLATION"/> tasks}}</target>
<target state="translated">{VAR_PLURAL, plural, few {<x id="INTERPOLATION"/> úlohy} many {<x id="INTERPOLATION"/> úloh}=1 {1 úloha} other {<x id="INTERPOLATION"/> úloh}}</target>
</trans-unit>
<trans-unit id="8953033926734869941" datatype="html" approved="yes">
<source>Name</source>
@@ -2444,7 +2444,7 @@
<context context-type="sourcefile">src/app/components/admin/tasks/tasks.component.html</context>
<context context-type="linenumber">289</context>
</context-group>
<target state="needs-translation">No tasks match the current filters.</target>
<target state="translated">Zvoleným filtrům neodpovídají žádné úlohy.</target>
</trans-unit>
<trans-unit id="2525230676386818985" datatype="html">
<source>Result</source>
@@ -2460,7 +2460,7 @@
<context context-type="sourcefile">src/app/components/admin/tasks/tasks.component.ts</context>
<context context-type="linenumber">55</context>
</context-group>
<target state="needs-translation">Needs attention</target>
<target state="translated">Vyžaduje pozornost</target>
</trans-unit>
<trans-unit id="3307214558906712688" datatype="html">
<source>In progress</source>
@@ -2468,7 +2468,7 @@
<context context-type="sourcefile">src/app/components/admin/tasks/tasks.component.ts</context>
<context context-type="linenumber">56</context>
</context-group>
<target state="needs-translation">In progress</target>
<target state="translated">Probíhá</target>
</trans-unit>
<trans-unit id="1371178633976505412" datatype="html">
<source>Recently completed</source>
@@ -2476,7 +2476,7 @@
<context context-type="sourcefile">src/app/components/admin/tasks/tasks.component.ts</context>
<context context-type="linenumber">57</context>
</context-group>
<target state="needs-translation">Recently completed</target>
<target state="translated">Nedávno dokončené</target>
</trans-unit>
<trans-unit id="2936452645673957909" datatype="html">
<source>Consume File</source>
@@ -2484,7 +2484,7 @@
<context context-type="sourcefile">src/app/components/admin/tasks/tasks.component.ts</context>
<context context-type="linenumber">66</context>
</context-group>
<target state="needs-translation">Consume File</target>
<target state="translated">Zpracování souboru</target>
</trans-unit>
<trans-unit id="5622386857946132209" datatype="html">
<source>Train Classifier</source>
@@ -2492,7 +2492,7 @@
<context context-type="sourcefile">src/app/components/admin/tasks/tasks.component.ts</context>
<context context-type="linenumber">70</context>
</context-group>
<target state="needs-translation">Train Classifier</target>
<target state="translated">Trénování klasifikátoru</target>
</trans-unit>
<trans-unit id="776309955507105337" datatype="html">
<source>Sanity Check</source>
@@ -2500,7 +2500,7 @@
<context context-type="sourcefile">src/app/components/admin/tasks/tasks.component.ts</context>
<context context-type="linenumber">74</context>
</context-group>
<target state="needs-translation">Sanity Check</target>
<target state="translated">Kontrola zdraví</target>
</trans-unit>
<trans-unit id="7502272564743467653" datatype="html">
<source>Mail Fetch</source>
@@ -2520,7 +2520,7 @@
<context context-type="sourcefile">src/app/components/admin/tasks/tasks.component.ts</context>
<context context-type="linenumber">77</context>
</context-group>
<target state="needs-translation">LLM Index</target>
<target state="translated">Index LLM</target>
</trans-unit>
<trans-unit id="6402092370576716734" datatype="html">
<source>Empty Trash</source>
@@ -2528,7 +2528,7 @@
<context context-type="sourcefile">src/app/components/admin/tasks/tasks.component.ts</context>
<context context-type="linenumber">80</context>
</context-group>
<target state="needs-translation">Empty Trash</target>
<target state="translated">Vyprázdnění koše</target>
</trans-unit>
<trans-unit id="4173754487295857311" datatype="html">
<source>Check Workflows</source>
@@ -2536,7 +2536,7 @@
<context context-type="sourcefile">src/app/components/admin/tasks/tasks.component.ts</context>
<context context-type="linenumber">84</context>
</context-group>
<target state="needs-translation">Check Workflows</target>
<target state="translated">Kontrola postupů</target>
</trans-unit>
<trans-unit id="2065831805515896240" datatype="html">
<source>Bulk Update</source>
@@ -2544,7 +2544,7 @@
<context context-type="sourcefile">src/app/components/admin/tasks/tasks.component.ts</context>
<context context-type="linenumber">88</context>
</context-group>
<target state="needs-translation">Bulk Update</target>
<target state="translated">Hromadná aktualizace</target>
</trans-unit>
<trans-unit id="5062348912423871240" datatype="html">
<source>Reprocess Document</source>
@@ -2552,7 +2552,7 @@
<context context-type="sourcefile">src/app/components/admin/tasks/tasks.component.ts</context>
<context context-type="linenumber">92</context>
</context-group>
<target state="needs-translation">Reprocess Document</target>
<target state="translated">Opětovné zpracování dokumentu</target>
</trans-unit>
<trans-unit id="6903696804811148799" datatype="html">
<source>Build Share Link</source>
@@ -2560,7 +2560,7 @@
<context context-type="sourcefile">src/app/components/admin/tasks/tasks.component.ts</context>
<context context-type="linenumber">96</context>
</context-group>
<target state="needs-translation">Build Share Link</target>
<target state="translated">Sestavení odkazu ke sdílení</target>
</trans-unit>
<trans-unit id="6581973658756561124" datatype="html">
<source>Bulk Delete</source>
@@ -2568,7 +2568,7 @@
<context context-type="sourcefile">src/app/components/admin/tasks/tasks.component.ts</context>
<context context-type="linenumber">100</context>
</context-group>
<target state="needs-translation">Bulk Delete</target>
<target state="translated">Hromadné smazání</target>
</trans-unit>
<trans-unit id="9172233176401579786" datatype="html">
<source>Scheduled</source>
@@ -2612,7 +2612,7 @@
<context context-type="sourcefile">src/app/components/admin/tasks/tasks.component.ts</context>
<context context-type="linenumber">119</context>
</context-group>
<target state="needs-translation">Folder Consume</target>
<target state="translated">Zpracování složky</target>
</trans-unit>
<trans-unit id="1456901843819961615" datatype="html">
<source>Email Consume</source>
@@ -2620,7 +2620,7 @@
<context context-type="sourcefile">src/app/components/admin/tasks/tasks.component.ts</context>
<context context-type="linenumber">123</context>
</context-group>
<target state="needs-translation">Email Consume</target>
<target state="translated">Zpracování e-mailu</target>
</trans-unit>
<trans-unit id="29832309535656200" datatype="html">
<source>System</source>
@@ -2628,7 +2628,7 @@
<context context-type="sourcefile">src/app/components/admin/tasks/tasks.component.ts</context>
<context context-type="linenumber">125</context>
</context-group>
<target state="needs-translation">System</target>
<target state="translated">Systém</target>
</trans-unit>
<trans-unit id="2233560223291461480" datatype="html">
<source>Manual</source>
@@ -2636,7 +2636,7 @@
<context context-type="sourcefile">src/app/components/admin/tasks/tasks.component.ts</context>
<context context-type="linenumber">126</context>
</context-group>
<target state="needs-translation">Manual</target>
<target state="translated">Ruční</target>
</trans-unit>
<trans-unit id="5404910960991552159" datatype="html">
<source>Dismiss selected</source>
@@ -2652,7 +2652,7 @@
<context context-type="sourcefile">src/app/components/admin/tasks/tasks.component.ts</context>
<context context-type="linenumber">240</context>
</context-group>
<target state="needs-translation">Dismiss visible</target>
<target state="translated">Zahodit viditelné</target>
</trans-unit>
<trans-unit id="3169751690815214293" datatype="html">
<source>Confirm Dismiss</source>
@@ -2696,7 +2696,7 @@
<context context-type="sourcefile">src/app/components/admin/tasks/tasks.component.ts</context>
<context context-type="linenumber">348</context>
</context-group>
<target state="needs-translation">Confirm Dismiss All</target>
<target state="translated">Potvrdit zahození všech</target>
</trans-unit>
<trans-unit id="4157200209636243740" datatype="html">
<source>Dismiss all <x id="PH" equiv-text="this.totalTasks()"/> tasks?</source>
@@ -2704,7 +2704,7 @@
<context context-type="sourcefile">src/app/components/admin/tasks/tasks.component.ts</context>
<context context-type="linenumber">349</context>
</context-group>
<target state="needs-translation">Dismiss all <x id="PH" equiv-text="this.totalTasks()"/> tasks?</target>
<target state="translated">Zahodit všech <x id="PH" equiv-text="this.totalTasks()"/> úloh?</target>
</trans-unit>
<trans-unit id="8149502458056418229" datatype="html">
<source>Success. New document id <x id="PH" equiv-text="documentId"/> created</source>
@@ -2712,7 +2712,7 @@
<context context-type="sourcefile">src/app/components/admin/tasks/tasks.component.ts</context>
<context context-type="linenumber">408</context>
</context-group>
<target state="needs-translation">Success. New document id <x id="PH" equiv-text="documentId"/> created</target>
<target state="translated">Úspěch. Vytvořen nový dokument s ID <x id="PH" equiv-text="documentId"/></target>
</trans-unit>
<trans-unit id="8760066891202884337" datatype="html">
<source>Duplicate of document #<x id="PH" equiv-text="duplicateOf"/></source>
@@ -3540,7 +3540,7 @@
<context context-type="sourcefile">src/app/components/app-frame/app-frame.component.html</context>
<context context-type="linenumber">183</context>
</context-group>
<target state="needs-translation">Attributes</target>
<target state="translated">Atributy</target>
</trans-unit>
<trans-unit id="7437910965833684826" datatype="html" approved="yes">
<source>Correspondents</source>
@@ -3572,7 +3572,7 @@
<context context-type="sourcefile">src/app/components/manage/document-attributes/document-attributes.component.ts</context>
<context context-type="linenumber">105</context>
</context-group>
<target state="needs-translation">Document types</target>
<target state="translated">Typy dokumentů</target>
</trans-unit>
<trans-unit id="8835528846812581148" datatype="html">
<source>Storage paths</source>
@@ -3584,7 +3584,7 @@
<context context-type="sourcefile">src/app/components/manage/document-attributes/document-attributes.component.ts</context>
<context context-type="linenumber">115</context>
</context-group>
<target state="needs-translation">Storage paths</target>
<target state="translated">Cesty úložiště</target>
</trans-unit>
<trans-unit id="9149498548977462220" datatype="html">
<source>Custom fields</source>
@@ -5540,7 +5540,7 @@
<context context-type="sourcefile">src/app/components/common/edit-dialog/user-edit-dialog/user-edit-dialog.component.html</context>
<context context-type="linenumber">26</context>
</context-group>
<target state="needs-translation">Access system status, logs, Django backend</target>
<target state="translated">Přístup ke stavu systému, protokolům, backendu Django</target>
</trans-unit>
<trans-unit id="1808271538028523977" datatype="html">
<source>Superuser</source>
@@ -5556,7 +5556,7 @@
<context context-type="sourcefile">src/app/components/common/edit-dialog/user-edit-dialog/user-edit-dialog.component.html</context>
<context context-type="linenumber">30</context>
</context-group>
<target state="needs-translation">Grants all permissions and can view all objects</target>
<target state="translated">Uděluje všechna oprávnění a může zobrazovat všechny objekty</target>
</trans-unit>
<trans-unit id="8900662509426586619" datatype="html">
<source>Two-factor Authentication</source>
@@ -6344,7 +6344,7 @@
<context context-type="sourcefile">src/app/components/common/edit-dialog/workflow-edit-dialog/workflow-edit-dialog.component.ts</context>
<context context-type="linenumber">271</context>
</context-group>
<target state="needs-translation">Has any of these document types</target>
<target state="translated">Má kterýkoli z následujících typů dokumentů</target>
</trans-unit>
<trans-unit id="1507843981661822403" datatype="html">
<source>Does not have document types</source>
@@ -7546,7 +7546,7 @@
<context context-type="sourcefile">src/app/components/document-list/bulk-editor/bulk-editor.component.html</context>
<context context-type="linenumber">116</context>
</context-group>
<target state="needs-translation">Manage share link bundles</target>
<target state="translated">Spravovat balíčky sdílení odkazů</target>
</trans-unit>
<trans-unit id="1070687661569746428" datatype="html">
<source>Create share link bundle</source>
@@ -7554,7 +7554,7 @@
<context context-type="sourcefile">src/app/components/common/share-link-bundle-dialog/share-link-bundle-dialog.component.ts</context>
<context context-type="linenumber">61</context>
</context-group>
<target state="needs-translation">Create share link bundle</target>
<target state="translated">Vytvořit balíček sdílení odkazů</target>
</trans-unit>
<trans-unit id="2362798555008696742" datatype="html">
<source>Create link</source>
@@ -7590,7 +7590,7 @@
<context context-type="sourcefile">src/app/components/common/share-link-bundle-manage-dialog/share-link-bundle-manage-dialog.component.html</context>
<context context-type="linenumber">21</context>
</context-group>
<target state="needs-translation">Status updates every few seconds while bundles are being prepared.</target>
<target state="translated">Aktualizace stavu každých pár sekund během přípravy balíčků.</target>
</trans-unit>
<trans-unit id="5194711788228004418" datatype="html">
<source>No share link bundles currently exist.</source>
@@ -7598,7 +7598,7 @@
<context context-type="sourcefile">src/app/components/common/share-link-bundle-manage-dialog/share-link-bundle-manage-dialog.component.html</context>
<context context-type="linenumber">25</context>
</context-group>
<target state="needs-translation">No share link bundles currently exist.</target>
<target state="translated">V současné době neexistují žádné balíčky.</target>
</trans-unit>
<trans-unit id="2841249062294860035" datatype="html">
<source>Built:</source>
@@ -7650,7 +7650,7 @@
<context context-type="sourcefile">src/app/components/common/share-link-bundle-manage-dialog/share-link-bundle-manage-dialog.component.ts</context>
<context context-type="linenumber">42</context>
</context-group>
<target state="needs-translation">Share link bundles</target>
<target state="translated">Balíčky sdílení odkazů</target>
</trans-unit>
<trans-unit id="1541995860059283227" datatype="html">
<source>Failed to load share link bundles.</source>
@@ -7658,7 +7658,7 @@
<context context-type="sourcefile">src/app/components/common/share-link-bundle-manage-dialog/share-link-bundle-manage-dialog.component.ts</context>
<context context-type="linenumber">65</context>
</context-group>
<target state="needs-translation">Failed to load share link bundles.</target>
<target state="translated">Nepodařilo se načíst balíčky sdílení odkazů.</target>
</trans-unit>
<trans-unit id="5417797597565486403" datatype="html">
<source>Error retrieving share link bundles.</source>
@@ -7942,7 +7942,7 @@
<context context-type="sourcefile">src/app/components/common/system-status-dialog/system-status-dialog.component.html</context>
<context context-type="linenumber">147</context>
</context-group>
<target state="needs-translation">Recent Task Activity <x id="START_TAG_SPAN" ctype="x-span" equiv-text="&lt;span class=&quot;small text-muted fw-light&quot;&gt;"/>(<x id="INTERPOLATION" equiv-text="{{status().tasks.summary.days}}"/> days)<x id="CLOSE_TAG_SPAN" ctype="x-span" equiv-text="&lt;/span&gt;"/></target>
<target state="translated">Nedávná aktivita úloh <x id="START_TAG_SPAN" ctype="x-span" equiv-text="&lt;span class=&quot;small text-muted fw-light&quot;&gt;"/>(<x id="INTERPOLATION" equiv-text="{{status().tasks.summary.days}}"/> days)<x id="CLOSE_TAG_SPAN" ctype="x-span" equiv-text="&lt;/span&gt;"/></target>
</trans-unit>
<trans-unit id="3448462145758383019" datatype="html">
<source>Total</source>
@@ -7950,7 +7950,7 @@
<context context-type="sourcefile">src/app/components/common/system-status-dialog/system-status-dialog.component.html</context>
<context context-type="linenumber">152</context>
</context-group>
<target state="needs-translation">Total</target>
<target state="translated">Celkem</target>
</trans-unit>
<trans-unit id="3521084103654700903" datatype="html">
<source>Successful</source>
@@ -7958,7 +7958,7 @@
<context context-type="sourcefile">src/app/components/common/system-status-dialog/system-status-dialog.component.html</context>
<context context-type="linenumber">156</context>
</context-group>
<target state="needs-translation">Successful</target>
<target state="translated">Úspěšných</target>
</trans-unit>
<trans-unit id="7256395947475975935" datatype="html">
<source>Failed</source>
@@ -7970,7 +7970,7 @@
<context context-type="sourcefile">src/app/data/share-link-bundle.ts</context>
<context context-type="linenumber">44</context>
</context-group>
<target state="needs-translation">Failed</target>
<target state="translated">Selhané</target>
</trans-unit>
<trans-unit id="4416413576346763682" datatype="html">
<source>Pending</source>
@@ -7982,7 +7982,7 @@
<context context-type="sourcefile">src/app/data/share-link-bundle.ts</context>
<context context-type="linenumber">41</context>
</context-group>
<target state="needs-translation">Pending</target>
<target state="translated">Čekající</target>
</trans-unit>
<trans-unit id="2000433102211963975" datatype="html">
<source>No recent tasks</source>
@@ -7990,7 +7990,7 @@
<context context-type="sourcefile">src/app/components/common/system-status-dialog/system-status-dialog.component.html</context>
<context context-type="linenumber">169</context>
</context-group>
<target state="needs-translation">No recent tasks</target>
<target state="translated">Žádné nedávné úlohy</target>
</trans-unit>
<trans-unit id="2041675390931385838" datatype="html">
<source>Health</source>
@@ -8090,7 +8090,7 @@
<context context-type="sourcefile">src/app/components/common/system-status-dialog/system-status-dialog.component.html</context>
<context context-type="linenumber">283</context>
</context-group>
<target state="needs-translation">AI Index</target>
<target state="translated">Index AI</target>
</trans-unit>
<trans-unit id="6732151329960766506" datatype="html">
<source>Copy Raw Error</source>
@@ -8660,7 +8660,7 @@
<context context-type="sourcefile">src/app/components/document-detail/document-detail.component.html</context>
<context context-type="linenumber">318</context>
</context-group>
<target state="needs-translation">Original SHA256 checksum</target>
<target state="translated">Původní kontrolní součet SHA256</target>
</trans-unit>
<trans-unit id="5888243105821763422" datatype="html" approved="yes">
<source>Original file size</source>
@@ -8684,7 +8684,7 @@
<context context-type="sourcefile">src/app/components/document-detail/document-detail.component.html</context>
<context context-type="linenumber">331</context>
</context-group>
<target state="needs-translation">Archive SHA256 checksum</target>
<target state="translated">Archivní kontrolní součet SHA256</target>
</trans-unit>
<trans-unit id="6033581412811562084" datatype="html" approved="yes">
<source>Archive file size</source>
@@ -8716,7 +8716,7 @@
<context context-type="sourcefile">src/app/components/document-detail/document-detail.component.html</context>
<context context-type="linenumber">368,371</context>
</context-group>
<target state="needs-translation">Notes <x id="START_BLOCK_IF" equiv-text="@if (document()?.notes.length) {"/><x id="START_TAG_SPAN" ctype="x-span" equiv-text="&lt;span class=&quot;badge text-bg-secondary ms-1&quot;&gt;"/><x id="INTERPOLATION" equiv-text="length}}"/><x id="CLOSE_TAG_SPAN" ctype="x-span"/><x id="CLOSE_BLOCK_IF" equiv-text="}"/></target>
<target state="translated">Poznámky <x id="START_BLOCK_IF" equiv-text="@if (document()?.notes.length) {"/><x id="START_TAG_SPAN" ctype="x-span" equiv-text="&lt;span class=&quot;badge text-bg-secondary ms-1&quot;&gt;"/><x id="INTERPOLATION" equiv-text="length}}"/><x id="CLOSE_TAG_SPAN" ctype="x-span"/><x id="CLOSE_BLOCK_IF" equiv-text="}"/></target>
</trans-unit>
<trans-unit id="186236568870281953" datatype="html">
<source>History</source>
@@ -9116,7 +9116,7 @@
<context context-type="sourcefile">src/app/components/document-detail/document-version-dropdown/document-version-dropdown.component.html</context>
<context context-type="linenumber">4</context>
</context-group>
<target state="needs-translation">Versions</target>
<target state="translated">Verze</target>
</trans-unit>
<trans-unit id="4077520913910941990" datatype="html">
<source>Label</source>
@@ -9124,7 +9124,7 @@
<context context-type="sourcefile">src/app/components/document-detail/document-version-dropdown/document-version-dropdown.component.html</context>
<context context-type="linenumber">10</context>
</context-group>
<target state="needs-translation">Label</target>
<target state="translated">Označení</target>
</trans-unit>
<trans-unit id="3915966149686975421" datatype="html">
<source>Optional</source>
@@ -9132,7 +9132,7 @@
<context context-type="sourcefile">src/app/components/document-detail/document-version-dropdown/document-version-dropdown.component.html</context>
<context context-type="linenumber">17</context>
</context-group>
<target state="needs-translation">Optional</target>
<target state="translated">Volitelné</target>
</trans-unit>
<trans-unit id="787787001194154763" datatype="html">
<source>Add new version</source>
@@ -9140,7 +9140,7 @@
<context context-type="sourcefile">src/app/components/document-detail/document-version-dropdown/document-version-dropdown.component.html</context>
<context context-type="linenumber">32</context>
</context-group>
<target state="needs-translation">Add new version</target>
<target state="translated">Přidat novou verzi</target>
</trans-unit>
<trans-unit id="3119565892291077820" datatype="html">
<source>Uploading version...</source>
@@ -9164,7 +9164,7 @@
<context context-type="sourcefile">src/app/components/document-detail/document-version-dropdown/document-version-dropdown.component.html</context>
<context context-type="linenumber">50</context>
</context-group>
<target state="needs-translation">Version upload failed.</target>
<target state="translated">Nepodařilo se nahrát verzi.</target>
</trans-unit>
<trans-unit id="6328986243040954523" datatype="html">
<source>Version label</source>
@@ -9176,7 +9176,7 @@
<context context-type="sourcefile">src/app/components/document-detail/document-version-dropdown/document-version-dropdown.component.html</context>
<context context-type="linenumber">85</context>
</context-group>
<target state="needs-translation">Version label</target>
<target state="translated">Označení verze</target>
</trans-unit>
<trans-unit id="2724055831234181057" datatype="html">
<source>Version</source>
@@ -9184,7 +9184,7 @@
<context context-type="sourcefile">src/app/components/document-detail/document-version-dropdown/document-version-dropdown.component.html</context>
<context context-type="linenumber">96</context>
</context-group>
<target state="needs-translation">Version</target>
<target state="translated">Verze</target>
</trans-unit>
<trans-unit id="2491751767883178298" datatype="html">
<source>Delete this version?</source>
@@ -9216,7 +9216,7 @@
<context context-type="sourcefile">src/app/components/document-detail/document-version-dropdown/document-version-dropdown.component.ts</context>
<context context-type="linenumber">189</context>
</context-group>
<target state="needs-translation">Error updating version label</target>
<target state="translated">Chyba při aktualizaci označení verze</target>
</trans-unit>
<trans-unit id="3567158019134759286" datatype="html">
<source>Uploading new version. Processing will happen in the background.</source>
@@ -9244,7 +9244,7 @@
<context context-type="sourcefile">src/app/components/document-detail/document-version-dropdown/document-version-dropdown.component.ts</context>
<context context-type="linenumber">271</context>
</context-group>
<target state="needs-translation">Upload failed.</target>
<target state="translated">Nahrání selhalo.</target>
</trans-unit>
<trans-unit id="8350861980330256599" datatype="html">
<source>Error uploading new version</source>
@@ -9348,7 +9348,7 @@
<context context-type="sourcefile">src/app/components/document-list/bulk-editor/bulk-editor.component.html</context>
<context context-type="linenumber">113</context>
</context-group>
<target state="needs-translation">Create a share link bundle</target>
<target state="translated">Vytvořit balíček sdílení odkazů</target>
</trans-unit>
<trans-unit id="1015374532025907183" datatype="html">
<source>Include:</source>
@@ -9755,7 +9755,7 @@
<context context-type="sourcefile">src/app/components/document-list/document-card-small/document-card-small.component.html</context>
<context context-type="linenumber">95,96</context>
</context-group>
<target state="needs-translation">Created: <x id="INTERPOLATION" equiv-text="{{ document().created | customDate }}"/></target>
<target state="translated">Vytvořeno: <x id="INTERPOLATION" equiv-text="{{ document().created | customDate }}"/></target>
</trans-unit>
<trans-unit id="2030261243264601523" datatype="html">
<source>Added: <x id="INTERPOLATION" equiv-text="{{ document().added | customDate }}"/></source>
@@ -9771,7 +9771,7 @@
<context context-type="sourcefile">src/app/components/document-list/document-card-small/document-card-small.component.html</context>
<context context-type="linenumber">96,97</context>
</context-group>
<target state="needs-translation">Added: <x id="INTERPOLATION" equiv-text="{{ document().added | customDate }}"/></target>
<target state="translated">Přidáno: <x id="INTERPOLATION" equiv-text="{{ document().added | customDate }}"/></target>
</trans-unit>
<trans-unit id="4235671847487610290" datatype="html">
<source>Modified: <x id="INTERPOLATION" equiv-text="{{ document().modified | customDate }}"/></source>
@@ -10247,7 +10247,7 @@
<context context-type="sourcefile">src/app/components/document-list/document-list.component.ts</context>
<context context-type="linenumber">497</context>
</context-group>
<target state="needs-translation">View "<x id="PH" equiv-text="savedView.name"/>" created successfully, but could not update visibility settings.</target>
<target state="translated">Pohled „<x id="PH" equiv-text="savedView.name"/>“ úspěšně vytvořen, nepodařilo se ale aktualizovat nastavení viditelnosti.</target>
</trans-unit>
<trans-unit id="739880801667335279" datatype="html">
<source>Dates</source>
@@ -11367,7 +11367,7 @@
<context context-type="sourcefile">src/app/components/manage/saved-views/saved-views.component.html</context>
<context context-type="linenumber">35</context>
</context-group>
<target state="needs-translation"><x id="START_TAG_I_BS" ctype="x-i_bs" equiv-text="bs class=&quot;me-1&quot; name=&quot;person-fill-lock&quot;&gt;"/><x id="CLOSE_TAG_I_BS" ctype="x-i_bs" equiv-text="Permissions&lt;"/>Permissions</target>
<target state="translated"><x id="START_TAG_I_BS" ctype="x-i_bs" equiv-text="bs class=&quot;me-1&quot; name=&quot;person-fill-lock&quot;&gt;"/><x id="CLOSE_TAG_I_BS" ctype="x-i_bs" equiv-text="Oprávnění&lt;"/>Oprávnění</target>
</trans-unit>
<trans-unit id="6338800642797811873" datatype="html">
<source>Documents page size</source>
@@ -11415,7 +11415,7 @@
<context context-type="sourcefile">src/app/components/manage/saved-views/saved-views.component.html</context>
<context context-type="linenumber">62</context>
</context-group>
<target state="needs-translation">Note: ordering is not preserved</target>
<target state="translated">Upozornění: pořadí nebude zachováno</target>
</trans-unit>
<trans-unit id="7877440816920439876" datatype="html" approved="yes">
<source>No saved views defined.</source>
@@ -11864,7 +11864,7 @@
<context context-type="sourcefile">src/app/data/paperless-config.ts</context>
<context context-type="linenumber">54</context>
</context-group>
<target state="needs-translation">AI Settings</target>
<target state="translated">Nastavení AI</target>
</trans-unit>
<trans-unit id="1313137480169642057" datatype="html">
<source>Output Type</source>
@@ -11896,7 +11896,7 @@
<context context-type="sourcefile">src/app/data/paperless-config.ts</context>
<context context-type="linenumber">120</context>
</context-group>
<target state="needs-translation">Archive File Generation</target>
<target state="translated">Generování archivních souborů</target>
</trans-unit>
<trans-unit id="1115402553541327390" datatype="html">
<source>Image DPI</source>
@@ -12072,7 +12072,7 @@
<context context-type="sourcefile">src/app/data/paperless-config.ts</context>
<context context-type="linenumber">277</context>
</context-group>
<target state="needs-translation">Split on Tag Barcodes</target>
<target state="translated">Rozdělení podle čárových kódů štítků</target>
</trans-unit>
<trans-unit id="7011909364081812031" datatype="html">
<source>AI Enabled</source>
@@ -12080,7 +12080,7 @@
<context context-type="sourcefile">src/app/data/paperless-config.ts</context>
<context context-type="linenumber">284</context>
</context-group>
<target state="needs-translation">AI Enabled</target>
<target state="translated">AI povoleno</target>
</trans-unit>
<trans-unit id="8028880048909383956" datatype="html">
<source>Consider privacy implications when enabling AI features, especially if using a remote model.</source>
@@ -12088,7 +12088,7 @@
<context context-type="sourcefile">src/app/data/paperless-config.ts</context>
<context context-type="linenumber">288</context>
</context-group>
<target state="needs-translation">Consider privacy implications when enabling AI features, especially if using a remote model.</target>
<target state="translated">Při aktivaci funkcí umělé inteligence zvažte dopady na ochranu osobních údajů, zejména pokud používáte vzdálený model.</target>
</trans-unit>
<trans-unit id="8131374115579345652" datatype="html">
<source>LLM Embedding Backend</source>
@@ -12096,7 +12096,7 @@
<context context-type="sourcefile">src/app/data/paperless-config.ts</context>
<context context-type="linenumber">292</context>
</context-group>
<target state="needs-translation">LLM Embedding Backend</target>
<target state="translated">Backend pro vkládání LLM</target>
</trans-unit>
<trans-unit id="6647708571891295756" datatype="html">
<source>LLM Embedding Model</source>
@@ -12104,7 +12104,7 @@
<context context-type="sourcefile">src/app/data/paperless-config.ts</context>
<context context-type="linenumber">300</context>
</context-group>
<target state="needs-translation">LLM Embedding Model</target>
<target state="translated">Model vkládání LLM</target>
</trans-unit>
<trans-unit id="3554114880473286122" datatype="html">
<source>LLM Embedding Endpoint</source>
@@ -12112,7 +12112,7 @@
<context context-type="sourcefile">src/app/data/paperless-config.ts</context>
<context context-type="linenumber">307</context>
</context-group>
<target state="needs-translation">LLM Embedding Endpoint</target>
<target state="translated">Koncový bod vkládání LLM</target>
</trans-unit>
<trans-unit id="1044242175651289991" datatype="html">
<source>LLM Embedding Chunk Size</source>
@@ -12120,7 +12120,7 @@
<context context-type="sourcefile">src/app/data/paperless-config.ts</context>
<context context-type="linenumber">314</context>
</context-group>
<target state="needs-translation">LLM Embedding Chunk Size</target>
<target state="translated">Velikost bloku vkládání LLM</target>
</trans-unit>
<trans-unit id="7218245223139363113" datatype="html">
<source>LLM Context Size</source>
@@ -12128,7 +12128,7 @@
<context context-type="sourcefile">src/app/data/paperless-config.ts</context>
<context context-type="linenumber">321</context>
</context-group>
<target state="needs-translation">LLM Context Size</target>
<target state="translated">Velikost kontextu LLM</target>
</trans-unit>
<trans-unit id="4234495692726214397" datatype="html">
<source>LLM Backend</source>
@@ -12136,7 +12136,7 @@
<context context-type="sourcefile">src/app/data/paperless-config.ts</context>
<context context-type="linenumber">328</context>
</context-group>
<target state="needs-translation">LLM Backend</target>
<target state="translated">Backend LLM</target>
</trans-unit>
<trans-unit id="7935234833834000002" datatype="html">
<source>LLM Model</source>
@@ -12144,7 +12144,7 @@
<context context-type="sourcefile">src/app/data/paperless-config.ts</context>
<context context-type="linenumber">336</context>
</context-group>
<target state="needs-translation">LLM Model</target>
<target state="translated">Model LLM</target>
</trans-unit>
<trans-unit id="1980550530387803165" datatype="html">
<source>LLM API Key</source>
@@ -12152,7 +12152,7 @@
<context context-type="sourcefile">src/app/data/paperless-config.ts</context>
<context context-type="linenumber">343</context>
</context-group>
<target state="needs-translation">LLM API Key</target>
<target state="translated">Klíč API LLM</target>
</trans-unit>
<trans-unit id="6126617860376156501" datatype="html">
<source>LLM Endpoint</source>
@@ -12160,7 +12160,7 @@
<context context-type="sourcefile">src/app/data/paperless-config.ts</context>
<context context-type="linenumber">350</context>
</context-group>
<target state="needs-translation">LLM Endpoint</target>
<target state="translated">Koncový bod LLM</target>
</trans-unit>
<trans-unit id="6572826277249350975" datatype="html">
<source>LLM Output Language</source>
@@ -12168,7 +12168,7 @@
<context context-type="sourcefile">src/app/data/paperless-config.ts</context>
<context context-type="linenumber">357</context>
</context-group>
<target state="needs-translation">LLM Output Language</target>
<target state="translated">Výstupní jazyk LLM</target>
</trans-unit>
<trans-unit id="3284403507172415792" datatype="html">
<source>Language to use for generated AI suggestions. When unset, AI suggestions use the user&apos;s display language if explicitly set.</source>
@@ -12176,7 +12176,7 @@
<context context-type="sourcefile">src/app/data/paperless-config.ts</context>
<context context-type="linenumber">361</context>
</context-group>
<target state="needs-translation">Language to use for generated AI suggestions. When unset, AI suggestions use the user's display language if explicitly set.</target>
<target state="translated">Jazyk, který se má použít pro návrhy generované AI. Pokud není nastaveno, návrhy AI použijí jazyk zobrazení uživatele, je-li explicitně nastaven.</target>
</trans-unit>
<trans-unit id="4493921125434706859" datatype="html">
<source>LLM Request Timeout</source>
@@ -12184,7 +12184,7 @@
<context context-type="sourcefile">src/app/data/paperless-config.ts</context>
<context context-type="linenumber">365</context>
</context-group>
<target state="needs-translation">LLM Request Timeout</target>
<target state="translated">Čawsový limit žádosti LLM</target>
</trans-unit>
<trans-unit id="483994032066441287" datatype="html">
<source>Timeout in seconds for LLM requests.</source>
@@ -12192,7 +12192,7 @@
<context context-type="sourcefile">src/app/data/paperless-config.ts</context>
<context context-type="linenumber">369</context>
</context-group>
<target state="needs-translation">Timeout in seconds for LLM requests.</target>
<target state="translated">Časový limit v sekundách pro žádosti LLM.</target>
</trans-unit>
<trans-unit id="9155387182259025015" datatype="html">
<source>Processing</source>
+1 -1
View File
@@ -1528,7 +1528,7 @@
<context context-type="sourcefile">src/app/components/admin/settings/settings.component.html</context>
<context context-type="linenumber">306,308</context>
</context-group>
<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>
<target state="translated"> Die Einstellungen gelten für dieses Benutzerkonto in Bezug auf Objekte (Tags, E-Mail-Regeln usw.), die über die Weboberfläche erstellt wurden. Diese Einstellungen gelten nicht für Dokumente. </target>
</trans-unit>
<trans-unit id="4292903881380648974" datatype="html" approved="yes">
<source>Default Owner</source>
+10 -10
View File
@@ -1528,7 +1528,7 @@
<context context-type="sourcefile">src/app/components/admin/settings/settings.component.html</context>
<context context-type="linenumber">306,308</context>
</context-group>
<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>
<target state="translated"> Innstillinger gjelder denne brukerkontoen for objekter (Etiketter, postregler, etc.) som er opprettet via web-grensesnittet. Disse innstillingene gjelder ikke for dokumenter. </target>
</trans-unit>
<trans-unit id="4292903881380648974" datatype="html">
<source>Default Owner</source>
@@ -2076,7 +2076,7 @@
<context context-type="sourcefile">src/app/components/admin/tasks/tasks.component.html</context>
<context context-type="linenumber">96</context>
</context-group>
<target state="needs-translation">Search tasks</target>
<target state="translated">Søk oppgaver</target>
</trans-unit>
<trans-unit id="6849725902312323996" datatype="html">
<source>Reset filters</source>
@@ -2620,7 +2620,7 @@
<context context-type="sourcefile">src/app/components/admin/tasks/tasks.component.ts</context>
<context context-type="linenumber">123</context>
</context-group>
<target state="translated">E-postforbruk</target>
<target state="translated">E-post-import</target>
</trans-unit>
<trans-unit id="29832309535656200" datatype="html">
<source>System</source>
@@ -4924,7 +4924,7 @@
<context context-type="sourcefile">src/app/components/common/edit-dialog/mail-rule-edit-dialog/mail-rule-edit-dialog.component.html</context>
<context context-type="linenumber">32</context>
</context-group>
<target state="translated">Paperløst vil bare behandle e-poster som passer til <x id="START_EMPHASISED_TEXT" ctype="x-em" equiv-text="&lt;em&gt;"/>hele<x id="CLOSE_EMPHASISED_TEXT" ctype="x-em" equiv-text="&lt;/em&gt;"/> av kriteriene som er angitt nedenfor.</target>
<target state="translated">Paperless vil bare behandle e-poster som passer til <x id="START_EMPHASISED_TEXT" ctype="x-em" equiv-text="&lt;em&gt;"/>hele<x id="CLOSE_EMPHASISED_TEXT" ctype="x-em" equiv-text="&lt;/em&gt;"/> av kriteriene som er angitt nedenfor.</target>
</trans-unit>
<trans-unit id="7046259383943324039" datatype="html">
<source>Folder</source>
@@ -6810,7 +6810,7 @@
<context context-type="sourcefile">src/app/components/common/input/tags/tags.component.html</context>
<context context-type="linenumber">56</context>
</context-group>
<target state="translated">Filtrer dokumenter med disse Etikettene</target>
<target state="translated">Filtrer dokumenter med disse etikettene</target>
</trans-unit>
<trans-unit id="1400555558847223243" datatype="html">
<source>Suggestion:</source>
@@ -7478,7 +7478,7 @@
<context context-type="sourcefile">src/app/components/common/share-link-bundle-dialog/share-link-bundle-dialog.component.html</context>
<context context-type="linenumber">68</context>
</context-group>
<target state="needs-translation">Share link</target>
<target state="translated">Del kobling</target>
</trans-unit>
<trans-unit id="2618101617221155143" datatype="html">
<source>Copy link</source>
@@ -8416,7 +8416,7 @@
<context context-type="sourcefile">src/app/components/document-asn/document-asn.component.html</context>
<context context-type="linenumber">1</context>
</context-group>
<target state="needs-translation">Searching document with asn <x id="INTERPOLATION" equiv-text="{{asn()}}"/></target>
<target state="translated">Søker etter dokument med asn<x id="INTERPOLATION" equiv-text="{{asn()}}"/></target>
</trans-unit>
<trans-unit id="1407560924967345762" datatype="html">
<source>Page</source>
@@ -9720,7 +9720,7 @@
<context context-type="sourcefile">src/app/components/document-list/document-card-small/document-card-small.component.html</context>
<context context-type="linenumber">8</context>
</context-group>
<target state="needs-translation"><x id="INTERPOLATION" equiv-text="document().title | documentTitle }}"/> thumbnail</target>
<target state="translated"><x id="INTERPOLATION" equiv-text="document().title | documentTitle }}"/> miniatyr</target>
</trans-unit>
<trans-unit id="2784168796433474565" datatype="html">
<source>Filter by tag</source>
@@ -10008,7 +10008,7 @@
<context context-type="sourcefile">src/app/components/document-list/document-list.component.html</context>
<context context-type="linenumber">135</context>
</context-group>
<target state="translated">{VAR_PLURAL, plural, one {}=1 {1 dokument} other {E-post <x id="INTERPOLATION"/> dokumenter}}</target>
<target state="translated">{VAR_PLURAL, plural, one {}=1 {1 dokument} other {<x id="INTERPOLATION"/> dokumenter}}</target>
</trans-unit>
<trans-unit id="2243770355958919528" datatype="html">
<source>(filtered)</source>
@@ -11328,7 +11328,7 @@
<context context-type="sourcefile">src/app/components/manage/mail/processed-mail-dialog/processed-mail-dialog.component.html</context>
<context context-type="linenumber">29</context>
</context-group>
<target state="needs-translation">Select all processed email messages</target>
<target state="translated">Velg alle behandlede e-postmeldinger</target>
</trans-unit>
<trans-unit id="8691920320483720007" datatype="html">
<source>Received</source>
+23 -23
View File
@@ -1528,7 +1528,7 @@
<context context-type="sourcefile">src/app/components/admin/settings/settings.component.html</context>
<context context-type="linenumber">306,308</context>
</context-group>
<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>
<target state="translated"> Nastavitve veljajo za ta uporabniški račun za objekte (oznake, pravila za pošto itd.), ustvarjene prek spletnega uporabniškega vmesnika. Te nastavitve ne veljajo za dokumente. </target>
</trans-unit>
<trans-unit id="4292903881380648974" datatype="html">
<source>Default Owner</source>
@@ -2076,7 +2076,7 @@
<context context-type="sourcefile">src/app/components/admin/tasks/tasks.component.html</context>
<context context-type="linenumber">96</context>
</context-group>
<target state="needs-translation">Search tasks</target>
<target state="translated">Iskanje nalog</target>
</trans-unit>
<trans-unit id="6849725902312323996" datatype="html">
<source>Reset filters</source>
@@ -2704,7 +2704,7 @@
<context context-type="sourcefile">src/app/components/admin/tasks/tasks.component.ts</context>
<context context-type="linenumber">349</context>
</context-group>
<target state="needs-translation">Dismiss all <x id="PH" equiv-text="this.totalTasks()"/> tasks?</target>
<target state="translated">Opustim vse naloge <x id="PH" equiv-text="this.totalTasks()"/>?</target>
</trans-unit>
<trans-unit id="8149502458056418229" datatype="html">
<source>Success. New document id <x id="PH" equiv-text="documentId"/> created</source>
@@ -7378,7 +7378,7 @@
<context context-type="sourcefile">src/app/components/common/share-link-bundle-dialog/share-link-bundle-dialog.component.html</context>
<context context-type="linenumber">22</context>
</context-group>
<target state="needs-translation">+ <x id="INTERPOLATION" equiv-text="{{ selectionCount() - documentPreview().length }}"/> more…</target>
<target state="translated">+ <x id="INTERPOLATION" equiv-text="{{ selectionCount() - documentPreview().length }}"/> več…</target>
</trans-unit>
<trans-unit id="8037476586059399916" datatype="html">
<source>Expires</source>
@@ -7478,7 +7478,7 @@
<context context-type="sourcefile">src/app/components/common/share-link-bundle-dialog/share-link-bundle-dialog.component.html</context>
<context context-type="linenumber">68</context>
</context-group>
<target state="needs-translation">Share link</target>
<target state="translated">Deli povezavo</target>
</trans-unit>
<trans-unit id="2618101617221155143" datatype="html">
<source>Copy link</source>
@@ -7942,7 +7942,7 @@
<context context-type="sourcefile">src/app/components/common/system-status-dialog/system-status-dialog.component.html</context>
<context context-type="linenumber">147</context>
</context-group>
<target state="needs-translation">Recent Task Activity <x id="START_TAG_SPAN" ctype="x-span" equiv-text="&lt;span class=&quot;small text-muted fw-light&quot;&gt;"/>(<x id="INTERPOLATION" equiv-text="{{status().tasks.summary.days}}"/> days)<x id="CLOSE_TAG_SPAN" ctype="x-span" equiv-text="&lt;/span&gt;"/></target>
<target state="translated">Nedavna aktivnost opravila <x id="START_TAG_SPAN" ctype="x-span" equiv-text="&lt;span class=&quot;small text-muted fw-light&quot;&gt;"/>(<x id="INTERPOLATION" equiv-text="{{status().tasks.summary.days}}"/> dni)<x id="CLOSE_TAG_SPAN" ctype="x-span" equiv-text="&lt;/span&gt;"/></target>
</trans-unit>
<trans-unit id="3448462145758383019" datatype="html">
<source>Total</source>
@@ -8416,7 +8416,7 @@
<context context-type="sourcefile">src/app/components/document-asn/document-asn.component.html</context>
<context context-type="linenumber">1</context>
</context-group>
<target state="needs-translation">Searching document with asn <x id="INTERPOLATION" equiv-text="{{asn()}}"/></target>
<target state="translated">Iskanje dokumenta z asn <x id="INTERPOLATION" equiv-text="{{asn()}}"/></target>
</trans-unit>
<trans-unit id="1407560924967345762" datatype="html">
<source>Page</source>
@@ -8440,7 +8440,7 @@
<context context-type="sourcefile">src/app/components/document-detail/document-detail.component.html</context>
<context context-type="linenumber">7,8</context>
</context-group>
<target state="needs-translation">of <x id="INTERPOLATION" equiv-text="{{previewNumPages()}}"/></target>
<target state="translated">od <x id="INTERPOLATION" equiv-text="{{previewNumPages()}}"/></target>
</trans-unit>
<trans-unit id="8590109102084543521" datatype="html">
<source>-</source>
@@ -8660,7 +8660,7 @@
<context context-type="sourcefile">src/app/components/document-detail/document-detail.component.html</context>
<context context-type="linenumber">318</context>
</context-group>
<target state="needs-translation">Original SHA256 checksum</target>
<target state="translated">Izvirna kontrolna vsota SHA256</target>
</trans-unit>
<trans-unit id="5888243105821763422" datatype="html">
<source>Original file size</source>
@@ -8684,7 +8684,7 @@
<context context-type="sourcefile">src/app/components/document-detail/document-detail.component.html</context>
<context context-type="linenumber">331</context>
</context-group>
<target state="needs-translation">Archive SHA256 checksum</target>
<target state="translated">Arhivska kontrolna vsota SHA256</target>
</trans-unit>
<trans-unit id="6033581412811562084" datatype="html">
<source>Archive file size</source>
@@ -8716,7 +8716,7 @@
<context context-type="sourcefile">src/app/components/document-detail/document-detail.component.html</context>
<context context-type="linenumber">368,371</context>
</context-group>
<target state="needs-translation">Notes <x id="START_BLOCK_IF" equiv-text="@if (document()?.notes.length) {"/><x id="START_TAG_SPAN" ctype="x-span" equiv-text="&lt;span class=&quot;badge text-bg-secondary ms-1&quot;&gt;"/><x id="INTERPOLATION" equiv-text="length}}"/><x id="CLOSE_TAG_SPAN" ctype="x-span"/><x id="CLOSE_BLOCK_IF" equiv-text="}"/></target>
<target state="translated">Opombe <x id="START_BLOCK_IF" equiv-text="@if (document()?.notes.length) {"/><x id="START_TAG_SPAN" ctype="x-span" equiv-text="&lt;span class=&quot;badge text-bg-secondary ms-1&quot;&gt;"/><x id="INTERPOLATION" equiv-text="length}}"/><x id="CLOSE_TAG_SPAN" ctype="x-span"/><x id="CLOSE_BLOCK_IF" equiv-text="}"/></target>
</trans-unit>
<trans-unit id="186236568870281953" datatype="html">
<source>History</source>
@@ -8732,7 +8732,7 @@
<context context-type="sourcefile">src/app/components/document-detail/document-detail.component.html</context>
<context context-type="linenumber">401,405</context>
</context-group>
<target state="needs-translation"> Duplicates <x id="START_TAG_SPAN" ctype="x-span" equiv-text="&lt;span class=&quot;badge text-bg-secondary ms-1&quot;&gt;"/><x id="INTERPOLATION" equiv-text="cate_documents.length }}"/><x id="CLOSE_TAG_SPAN" ctype="x-span"/></target>
<target state="translated"> Dvojniki <x id="START_TAG_SPAN" ctype="x-span" equiv-text="&lt;span class=&quot;badge text-bg-secondary ms-1&quot;&gt;"/><x id="INTERPOLATION" equiv-text="cate_documents.length }}"/><x id="CLOSE_TAG_SPAN" ctype="x-span"/></target>
</trans-unit>
<trans-unit id="6449374629822973702" datatype="html">
<source>Duplicate documents detected:</source>
@@ -8936,7 +8936,7 @@
<context context-type="sourcefile">src/app/components/document-detail/document-detail.component.ts</context>
<context context-type="linenumber">1271</context>
</context-group>
<target state="needs-translation">Error saving document "<x id="PH" equiv-text="this.document().title"/>"</target>
<target state="translated">Napaka pri shranjevanju dokumenta "<x id="PH" equiv-text="this.document().title"/>"</target>
</trans-unit>
<trans-unit id="448882439049417053" datatype="html">
<source>Error saving document</source>
@@ -8952,7 +8952,7 @@
<context context-type="sourcefile">src/app/components/document-detail/document-detail.component.ts</context>
<context context-type="linenumber">1359</context>
</context-group>
<target state="needs-translation">Do you really want to move the document "<x id="PH" equiv-text="this.document().title"/>" to the trash?</target>
<target state="translated">Ali res želite premakniti dokument "<x id="PH" equiv-text="this.document().title"/>" v koš?</target>
</trans-unit>
<trans-unit id="282586936710748252" datatype="html">
<source>Documents can be restored prior to permanent deletion.</source>
@@ -9008,7 +9008,7 @@
<context context-type="sourcefile">src/app/components/document-detail/document-detail.component.ts</context>
<context context-type="linenumber">1413</context>
</context-group>
<target state="needs-translation">Reprocess operation for "<x id="PH" equiv-text="this.document().title"/>" will begin in the background.</target>
<target state="translated">V ozadju se bo začel postopek ponovne obdelave za "<x id="PH" equiv-text="this.document().title"/>".</target>
</trans-unit>
<trans-unit id="4409560272830824468" datatype="html">
<source>Error executing operation</source>
@@ -9040,7 +9040,7 @@
<context context-type="sourcefile">src/app/components/document-detail/document-detail.component.ts</context>
<context context-type="linenumber">1808</context>
</context-group>
<target state="needs-translation">PDF edit operation for "<x id="PH" equiv-text="this.document().title"/>" will begin in the background.</target>
<target state="translated">Urejanje PDF-ja za "<x id="PH" equiv-text="this.document().title"/>" se bo začelo v ozadju.</target>
</trans-unit>
<trans-unit id="9043972994040261999" datatype="html">
<source>Error executing PDF edit operation</source>
@@ -9064,7 +9064,7 @@
<context context-type="sourcefile">src/app/components/document-detail/document-detail.component.ts</context>
<context context-type="linenumber">1865</context>
</context-group>
<target state="needs-translation">Password removal operation for "<x id="PH" equiv-text="this.document().title"/>" will begin in the background.</target>
<target state="translated">Operacija odstranitve gesla za "<x id="PH" equiv-text="this.document().title"/>" se bo začela v ozadju.</target>
</trans-unit>
<trans-unit id="2282118435712883014" datatype="html">
<source>Error executing password removal operation</source>
@@ -9720,7 +9720,7 @@
<context context-type="sourcefile">src/app/components/document-list/document-card-small/document-card-small.component.html</context>
<context context-type="linenumber">8</context>
</context-group>
<target state="needs-translation"><x id="INTERPOLATION" equiv-text="document().title | documentTitle }}"/> thumbnail</target>
<target state="translated"><x id="INTERPOLATION" equiv-text="document().title | documentTitle }}"/> sličica</target>
</trans-unit>
<trans-unit id="2784168796433474565" datatype="html">
<source>Filter by tag</source>
@@ -9756,7 +9756,7 @@
<context context-type="sourcefile">src/app/components/document-list/document-card-small/document-card-small.component.html</context>
<context context-type="linenumber">95,96</context>
</context-group>
<target state="needs-translation">Created: <x id="INTERPOLATION" equiv-text="{{ document().created | customDate }}"/></target>
<target state="translated">Ustvarjeno: <x id="INTERPOLATION" equiv-text="{{ document().created | customDate }}"/></target>
</trans-unit>
<trans-unit id="2030261243264601523" datatype="html">
<source>Added: <x id="INTERPOLATION" equiv-text="{{ document().added | customDate }}"/></source>
@@ -9772,7 +9772,7 @@
<context context-type="sourcefile">src/app/components/document-list/document-card-small/document-card-small.component.html</context>
<context context-type="linenumber">96,97</context>
</context-group>
<target state="needs-translation">Added: <x id="INTERPOLATION" equiv-text="{{ document().added | customDate }}"/></target>
<target state="translated">Dodano: <x id="INTERPOLATION" equiv-text="{{ document().added | customDate }}"/></target>
</trans-unit>
<trans-unit id="4235671847487610290" datatype="html">
<source>Modified: <x id="INTERPOLATION" equiv-text="{{ document().modified | customDate }}"/></source>
@@ -9788,7 +9788,7 @@
<context context-type="sourcefile">src/app/components/document-list/document-card-small/document-card-small.component.html</context>
<context context-type="linenumber">97,98</context>
</context-group>
<target state="needs-translation">Modified: <x id="INTERPOLATION" equiv-text="{{ document().modified | customDate }}"/></target>
<target state="translated">Spremenjeno: <x id="INTERPOLATION" equiv-text="{{ document().modified | customDate }}"/></target>
</trans-unit>
<trans-unit id="197162226430950645" datatype="html">
<source>{VAR_PLURAL, plural, =1 {1 page} other {<x id="INTERPOLATION"/> pages}}</source>
@@ -11312,7 +11312,7 @@
<context context-type="sourcefile">src/app/components/manage/mail/processed-mail-dialog/processed-mail-dialog.component.html</context>
<context context-type="linenumber">2</context>
</context-group>
<target state="needs-translation">Processed Mail for <x id="START_EMPHASISED_TEXT" ctype="x-em" equiv-text="&lt;em&gt;"/><x id="INTERPOLATION" equiv-text="{{ rule().name }}"/><x id="CLOSE_EMPHASISED_TEXT" ctype="x-em" equiv-text="&lt;/em&gt;"/></target>
<target state="translated">Obdelana pošta za <x id="START_EMPHASISED_TEXT" ctype="x-em" equiv-text="&lt;em&gt;"/><x id="INTERPOLATION" equiv-text="{{ rule().name }}"/><x id="CLOSE_EMPHASISED_TEXT" ctype="x-em" equiv-text="&lt;/em&gt;"/></target>
</trans-unit>
<trans-unit id="1991019495862291373" datatype="html">
<source>No processed email messages found.</source>
@@ -11328,7 +11328,7 @@
<context context-type="sourcefile">src/app/components/manage/mail/processed-mail-dialog/processed-mail-dialog.component.html</context>
<context context-type="linenumber">29</context>
</context-group>
<target state="needs-translation">Select all processed email messages</target>
<target state="translated">Izberi vsa obdelana e-poštna sporočila</target>
</trans-unit>
<trans-unit id="8691920320483720007" datatype="html">
<source>Received</source>
+27
View File
@@ -37,6 +37,7 @@ from drf_spectacular.utils import extend_schema_field
from guardian.utils import get_group_obj_perms_model
from guardian.utils import get_user_obj_perms_model
from rest_framework import serializers
from rest_framework.filters import BaseFilterBackend
from rest_framework.filters import OrderingFilter
from rest_framework_guardian.filters import ObjectPermissionsFilter
@@ -50,6 +51,7 @@ from documents.models import ShareLink
from documents.models import ShareLinkBundle
from documents.models import StoragePath
from documents.models import Tag
from documents.permissions import permitted_document_ids
if TYPE_CHECKING:
from collections.abc import Callable
@@ -1038,6 +1040,31 @@ class ObjectOwnedOrGrantedPermissionsFilter(ObjectPermissionsFilter):
return objects_with_perms | objects_owned | objects_unowned
class DocumentPermissionsFilter(BaseFilterBackend):
"""
A filter backend limiting Document results to those the requesting user
owns, are unowned, or has explicit (user- or group-level) view
permission on.
Unlike ``ObjectOwnedOrGrantedPermissionsFilter``, this does not build an
``objects_with_perms | objects_owned | objects_unowned`` union of
querysets derived from the same base queryset. When that base queryset
already carries independent joins on a multi-valued relation (e.g. two
separate joins from ``tags__id__all`` filtering on two tags), each
OR-ed branch can end up pairing those joins' aliases differently,
letting more than one row out of the join's cross product satisfy the
combined WHERE -- returning the same document more than once. Filtering
via a single ``id__in`` against ``permitted_document_ids`` (a plain
subquery, not a join) sidesteps that entirely and is also cheaper than
guardian's join-based permission check.
"""
def filter_queryset(self, request, queryset, view):
if request.user.is_superuser:
return queryset
return queryset.filter(id__in=permitted_document_ids(request.user))
class ObjectOwnedPermissionsFilter(ObjectPermissionsFilter):
"""
A filter backend that limits results to those where the requesting user
+3 -3
View File
@@ -163,7 +163,7 @@ def set_permissions_for_object(
)
def _permitted_document_ids(user):
def permitted_document_ids(user):
"""
Return a queryset of document IDs the user may view, limited to non-deleted
documents. This intentionally avoids ``get_objects_for_user`` to keep the
@@ -220,7 +220,7 @@ def get_document_count_filter_for_user(user, related_name: str = "documents"):
# Superuser: no permission filtering needed
return Q(**{f"{related_name}__deleted_at__isnull": True})
permitted_ids = _permitted_document_ids(user)
permitted_ids = permitted_document_ids(user)
return Q(**{f"{related_name}__id__in": permitted_ids})
@@ -311,7 +311,7 @@ def annotate_document_count_for_related_queryset(
queryset,
through_model=through_model,
related_object_field=related_object_field,
document_ids=_permitted_document_ids(user),
document_ids=permitted_document_ids(user),
target_field=target_field,
)
+2
View File
@@ -311,6 +311,7 @@ def sanity_check(*, raise_on_error: bool = True) -> str:
def bulk_update_documents(document_ids) -> None:
from documents.search import get_backend
document_ids = list(document_ids)
documents = Document.objects.filter(id__in=document_ids)
for doc in documents:
@@ -331,6 +332,7 @@ def bulk_update_documents(document_ids) -> None:
if ai_config.llm_index_enabled:
update_llm_index(
rebuild=False,
document_ids=document_ids,
)
+88
View File
@@ -14,6 +14,7 @@ from unittest import mock
import celery
from dateutil import parser
from django.conf import settings
from django.contrib.auth.models import Group
from django.contrib.auth.models import Permission
from django.contrib.auth.models import User
from django.core import mail
@@ -47,6 +48,8 @@ from documents.models import Workflow
from documents.models import WorkflowAction
from documents.models import WorkflowTrigger
from documents.signals.handlers import run_workflows
from documents.tests.factories import DocumentFactory
from documents.tests.factories import TagFactory
from documents.tests.utils import ConsumeTaskMixin
from documents.tests.utils import DirectoriesMixin
from documents.tests.utils import read_streaming_response
@@ -1212,6 +1215,91 @@ class TestDocumentApi(DirectoriesMixin, ConsumeTaskMixin, APITestCase):
[u1_doc1.id],
)
def test_document_owned_and_group_shared_not_duplicated_when_filtering_by_tags(
self,
) -> None:
"""
GIVEN:
- A document owned by a user and also shared with a group the user belongs to
WHEN:
- The user filters documents by more than one tag (tags__id__all)
THEN:
- The document is returned exactly once, not once per permission path
(regression test for https://github.com/paperless-ngx/paperless-ngx/issues/13331)
"""
user = User.objects.create_user("user1")
user.user_permissions.add(*Permission.objects.filter(codename="view_document"))
group = Group.objects.create(name="group1")
user.groups.add(group)
tag1 = TagFactory()
tag2 = TagFactory()
doc = DocumentFactory(title="shared", owner=user)
doc.tags.add(tag1, tag2)
assign_perm("view_document", group, doc)
self.client.force_authenticate(user=user)
response = self.client.get(
f"/api/documents/?tags__id__all={tag1.id},{tag2.id}",
)
self.assertEqual(response.status_code, status.HTTP_200_OK)
self.assertEqual(response.data["count"], 1)
self.assertEqual(response.data["results"][0]["id"], doc.id)
def test_document_permission_filter_excludes_unrelated_documents(self) -> None:
"""
GIVEN:
- A document owned by one user, with no permission granted to another user
WHEN:
- The unrelated user requests the document list
THEN:
- The document does not appear in their results
"""
owner = User.objects.create_user("owner1")
stranger = User.objects.create_user("stranger1")
stranger.user_permissions.add(
*Permission.objects.filter(codename="view_document"),
)
DocumentFactory(title="private", owner=owner)
self.client.force_authenticate(user=stranger)
response = self.client.get("/api/documents/")
self.assertEqual(response.status_code, status.HTTP_200_OK)
self.assertEqual(response.data["count"], 0)
def test_document_permission_filter_only_visible_to_group_members(self) -> None:
"""
GIVEN:
- A document shared with a group via object permissions
WHEN:
- A group member and a non-member both request the document list
THEN:
- Only the group member sees the document
"""
owner = User.objects.create_user("owner2")
member = User.objects.create_user("member1")
non_member = User.objects.create_user("nonmember1")
for u in (member, non_member):
u.user_permissions.add(*Permission.objects.filter(codename="view_document"))
group = Group.objects.create(name="group2")
member.groups.add(group)
doc = DocumentFactory(title="shared2", owner=owner)
assign_perm("view_document", group, doc)
self.client.force_authenticate(user=member)
response = self.client.get("/api/documents/")
self.assertEqual(response.status_code, status.HTTP_200_OK)
self.assertEqual(response.data["count"], 1)
self.assertEqual(response.data["results"][0]["id"], doc.id)
self.client.force_authenticate(user=non_member)
response = self.client.get("/api/documents/")
self.assertEqual(response.status_code, status.HTTP_200_OK)
self.assertEqual(response.data["count"], 0)
def test_pagination_results(self) -> None:
"""
GIVEN:
+6 -2
View File
@@ -401,6 +401,10 @@ class TestAIIndex(DirectoriesMixin, TestCase):
"documents.tasks.update_llm_index",
) as update_llm_index,
):
tasks.bulk_update_documents([doc.pk for doc in docs])
doc_ids = [doc.pk for doc in docs]
tasks.bulk_update_documents(doc_ids)
self.assertEqual(update_document_in_llm_index.apply_async.call_count, 0)
update_llm_index.assert_called_once()
update_llm_index.assert_called_once_with(
rebuild=False,
document_ids=doc_ids,
)
+31
View File
@@ -625,6 +625,37 @@ class TestAIChatStreamingView(DirectoriesMixin, TestCase):
)
self.assertEqual(response.status_code, 200)
self.assertEqual(response["Content-Type"], "text/event-stream")
mock_stream_chat.assert_called_once_with(
query_str="question",
documents=[self.document],
output_language=None,
)
@patch("documents.views.stream_chat_with_documents")
@patch("documents.views.get_objects_for_user_owner_aware")
@override_settings(AI_ENABLED=True)
def test_post_uses_user_display_language(
self,
mock_get_objects,
mock_stream_chat,
) -> None:
UiSettings.objects.create(user=self.user, settings={"language": "de-de"})
self.grant_view_document_permission()
mock_get_objects.return_value = [self.document]
mock_stream_chat.return_value = iter([b"data"])
response = self.client.post(
self.ENDPOINT,
data='{"q": "question"}',
content_type="application/json",
)
self.assertEqual(response.status_code, 200)
mock_stream_chat.assert_called_once_with(
query_str="question",
documents=[self.document],
output_language="de-de",
)
@patch("documents.views.stream_chat_with_documents")
@override_settings(AI_ENABLED=True)
+24 -12
View File
@@ -133,6 +133,7 @@ from documents.file_handling import format_filename
from documents.filters import CorrespondentFilterSet
from documents.filters import CustomFieldFilterSet
from documents.filters import DocumentFilterSet
from documents.filters import DocumentPermissionsFilter
from documents.filters import DocumentsOrderingFilter
from documents.filters import DocumentTypeFilterSet
from documents.filters import ObjectOwnedOrGrantedPermissionsFilter
@@ -653,6 +654,20 @@ class TagViewSet(PermissionsAwareDocumentCountMixin, ModelViewSet[Tag]):
update_document_parent_tags(tag, new_parent)
def _get_llm_output_language(ai_config: AIConfig, request) -> str | None:
output_language = ai_config.llm_output_language
if (
not output_language
and hasattr(request.user, "ui_settings")
and isinstance(
request.user.ui_settings.settings,
dict,
)
):
output_language = request.user.ui_settings.settings.get("language")
return output_language
@extend_schema_view(**generate_object_with_permissions_schema(DocumentTypeSerializer))
class DocumentTypeViewSet(
PermissionsAwareDocumentCountMixin,
@@ -972,7 +987,7 @@ class DocumentViewSet(
DjangoFilterBackend,
SearchFilter,
DocumentsOrderingFilter,
ObjectOwnedOrGrantedPermissionsFilter,
DocumentPermissionsFilter,
)
filterset_class = DocumentFilterSet
search_fields = ("title", "correspondent__name", "effective_content")
@@ -1514,16 +1529,7 @@ class DocumentViewSet(
if not ai_config.ai_enabled:
return HttpResponseBadRequest("AI is required for this feature")
output_language = ai_config.llm_output_language
if (
not output_language
and hasattr(request.user, "ui_settings")
and isinstance(
request.user.ui_settings.settings,
dict,
)
):
output_language = request.user.ui_settings.settings.get("language") or None
output_language = _get_llm_output_language(ai_config=ai_config, request=request)
llm_cache_backend = (
f"{ai_config.llm_backend}:{output_language}"
if output_language
@@ -2265,8 +2271,14 @@ class ChatStreamingView(GenericAPIView[Any]):
Document,
)
output_language = _get_llm_output_language(ai_config=ai_config, request=request)
response = StreamingHttpResponse(
stream_chat_with_documents(query_str=question, documents=documents),
stream_chat_with_documents(
query_str=question,
documents=documents,
output_language=output_language,
),
content_type="text/event-stream",
)
return response
+39 -39
View File
@@ -2,8 +2,8 @@ msgid ""
msgstr ""
"Project-Id-Version: paperless-ngx\n"
"Report-Msgid-Bugs-To: \n"
"POT-Creation-Date: 2026-07-23 19:21+0000\n"
"PO-Revision-Date: 2026-07-23 19:23\n"
"POT-Creation-Date: 2026-07-25 07:12+0000\n"
"PO-Revision-Date: 2026-07-25 07:14\n"
"Last-Translator: \n"
"Language-Team: Afrikaans\n"
"Language: af_ZA\n"
@@ -1919,151 +1919,151 @@ msgstr ""
msgid "paperless application settings"
msgstr ""
#: paperless/settings/__init__.py:545
#: paperless/settings/__init__.py:556
msgid "English (US)"
msgstr "Engels (VS)"
#: paperless/settings/__init__.py:546
#: paperless/settings/__init__.py:557
msgid "Arabic"
msgstr "Arabies"
#: paperless/settings/__init__.py:547
#: paperless/settings/__init__.py:558
msgid "Afrikaans"
msgstr ""
#: paperless/settings/__init__.py:548
#: paperless/settings/__init__.py:559
msgid "Belarusian"
msgstr "Belorussies"
#: paperless/settings/__init__.py:549
#: paperless/settings/__init__.py:560
msgid "Bulgarian"
msgstr ""
#: paperless/settings/__init__.py:550
#: paperless/settings/__init__.py:561
msgid "Catalan"
msgstr "Katalaans"
#: paperless/settings/__init__.py:551
#: paperless/settings/__init__.py:562
msgid "Czech"
msgstr "Tsjeggies"
#: paperless/settings/__init__.py:552
#: paperless/settings/__init__.py:563
msgid "Danish"
msgstr "Deens"
#: paperless/settings/__init__.py:553
#: paperless/settings/__init__.py:564
msgid "German"
msgstr "Duits"
#: paperless/settings/__init__.py:554
#: paperless/settings/__init__.py:565
msgid "Greek"
msgstr ""
#: paperless/settings/__init__.py:555
#: paperless/settings/__init__.py:566
msgid "English (GB)"
msgstr "Engels (GB)"
#: paperless/settings/__init__.py:556
#: paperless/settings/__init__.py:567
msgid "Spanish"
msgstr "Spaans"
#: paperless/settings/__init__.py:557
#: paperless/settings/__init__.py:568
msgid "Persian"
msgstr ""
#: paperless/settings/__init__.py:558
#: paperless/settings/__init__.py:569
msgid "Finnish"
msgstr "Fins"
#: paperless/settings/__init__.py:559
#: paperless/settings/__init__.py:570
msgid "French"
msgstr "Frans"
#: paperless/settings/__init__.py:560
#: paperless/settings/__init__.py:571
msgid "Hungarian"
msgstr ""
#: paperless/settings/__init__.py:561
#: paperless/settings/__init__.py:572
msgid "Indonesian"
msgstr ""
#: paperless/settings/__init__.py:562
#: paperless/settings/__init__.py:573
msgid "Italian"
msgstr "Italiaans"
#: paperless/settings/__init__.py:563
#: paperless/settings/__init__.py:574
msgid "Japanese"
msgstr ""
#: paperless/settings/__init__.py:564
#: paperless/settings/__init__.py:575
msgid "Korean"
msgstr ""
#: paperless/settings/__init__.py:565
#: paperless/settings/__init__.py:576
msgid "Luxembourgish"
msgstr "Luxemburgs"
#: paperless/settings/__init__.py:566
#: paperless/settings/__init__.py:577
msgid "Norwegian"
msgstr ""
#: paperless/settings/__init__.py:567
#: paperless/settings/__init__.py:578
msgid "Dutch"
msgstr "Nederlands"
#: paperless/settings/__init__.py:568
#: paperless/settings/__init__.py:579
msgid "Polish"
msgstr "Pools"
#: paperless/settings/__init__.py:569
#: paperless/settings/__init__.py:580
msgid "Portuguese (Brazil)"
msgstr "Portugees (Brasilië)"
#: paperless/settings/__init__.py:570
#: paperless/settings/__init__.py:581
msgid "Portuguese"
msgstr "Portugees"
#: paperless/settings/__init__.py:571
#: paperless/settings/__init__.py:582
msgid "Romanian"
msgstr "Roemeens"
#: paperless/settings/__init__.py:572
#: paperless/settings/__init__.py:583
msgid "Russian"
msgstr "Russies"
#: paperless/settings/__init__.py:573
#: paperless/settings/__init__.py:584
msgid "Slovak"
msgstr ""
#: paperless/settings/__init__.py:574
#: paperless/settings/__init__.py:585
msgid "Slovenian"
msgstr "Sloweens"
#: paperless/settings/__init__.py:575
#: paperless/settings/__init__.py:586
msgid "Serbian"
msgstr "Serwies"
#: paperless/settings/__init__.py:576
#: paperless/settings/__init__.py:587
msgid "Swedish"
msgstr "Sweeds"
#: paperless/settings/__init__.py:577
#: paperless/settings/__init__.py:588
msgid "Turkish"
msgstr "Turks"
#: paperless/settings/__init__.py:578
#: paperless/settings/__init__.py:589
msgid "Ukrainian"
msgstr ""
#: paperless/settings/__init__.py:579
#: paperless/settings/__init__.py:590
msgid "Vietnamese"
msgstr ""
#: paperless/settings/__init__.py:580
#: paperless/settings/__init__.py:591
msgid "Chinese Simplified"
msgstr "Vereenvoudigde Sjinees"
#: paperless/settings/__init__.py:581
#: paperless/settings/__init__.py:592
msgid "Chinese Traditional"
msgstr ""
+39 -39
View File
@@ -2,8 +2,8 @@ msgid ""
msgstr ""
"Project-Id-Version: paperless-ngx\n"
"Report-Msgid-Bugs-To: \n"
"POT-Creation-Date: 2026-07-23 19:21+0000\n"
"PO-Revision-Date: 2026-07-23 19:23\n"
"POT-Creation-Date: 2026-07-25 07:12+0000\n"
"PO-Revision-Date: 2026-07-25 07:14\n"
"Last-Translator: \n"
"Language-Team: Amharic\n"
"Language: am_ET\n"
@@ -1919,151 +1919,151 @@ msgstr ""
msgid "paperless application settings"
msgstr ""
#: paperless/settings/__init__.py:545
#: paperless/settings/__init__.py:556
msgid "English (US)"
msgstr ""
#: paperless/settings/__init__.py:546
#: paperless/settings/__init__.py:557
msgid "Arabic"
msgstr ""
#: paperless/settings/__init__.py:547
#: paperless/settings/__init__.py:558
msgid "Afrikaans"
msgstr ""
#: paperless/settings/__init__.py:548
#: paperless/settings/__init__.py:559
msgid "Belarusian"
msgstr ""
#: paperless/settings/__init__.py:549
#: paperless/settings/__init__.py:560
msgid "Bulgarian"
msgstr ""
#: paperless/settings/__init__.py:550
#: paperless/settings/__init__.py:561
msgid "Catalan"
msgstr ""
#: paperless/settings/__init__.py:551
#: paperless/settings/__init__.py:562
msgid "Czech"
msgstr ""
#: paperless/settings/__init__.py:552
#: paperless/settings/__init__.py:563
msgid "Danish"
msgstr ""
#: paperless/settings/__init__.py:553
#: paperless/settings/__init__.py:564
msgid "German"
msgstr ""
#: paperless/settings/__init__.py:554
#: paperless/settings/__init__.py:565
msgid "Greek"
msgstr ""
#: paperless/settings/__init__.py:555
#: paperless/settings/__init__.py:566
msgid "English (GB)"
msgstr ""
#: paperless/settings/__init__.py:556
#: paperless/settings/__init__.py:567
msgid "Spanish"
msgstr ""
#: paperless/settings/__init__.py:557
#: paperless/settings/__init__.py:568
msgid "Persian"
msgstr ""
#: paperless/settings/__init__.py:558
#: paperless/settings/__init__.py:569
msgid "Finnish"
msgstr ""
#: paperless/settings/__init__.py:559
#: paperless/settings/__init__.py:570
msgid "French"
msgstr ""
#: paperless/settings/__init__.py:560
#: paperless/settings/__init__.py:571
msgid "Hungarian"
msgstr ""
#: paperless/settings/__init__.py:561
#: paperless/settings/__init__.py:572
msgid "Indonesian"
msgstr ""
#: paperless/settings/__init__.py:562
#: paperless/settings/__init__.py:573
msgid "Italian"
msgstr ""
#: paperless/settings/__init__.py:563
#: paperless/settings/__init__.py:574
msgid "Japanese"
msgstr ""
#: paperless/settings/__init__.py:564
#: paperless/settings/__init__.py:575
msgid "Korean"
msgstr ""
#: paperless/settings/__init__.py:565
#: paperless/settings/__init__.py:576
msgid "Luxembourgish"
msgstr ""
#: paperless/settings/__init__.py:566
#: paperless/settings/__init__.py:577
msgid "Norwegian"
msgstr ""
#: paperless/settings/__init__.py:567
#: paperless/settings/__init__.py:578
msgid "Dutch"
msgstr ""
#: paperless/settings/__init__.py:568
#: paperless/settings/__init__.py:579
msgid "Polish"
msgstr ""
#: paperless/settings/__init__.py:569
#: paperless/settings/__init__.py:580
msgid "Portuguese (Brazil)"
msgstr ""
#: paperless/settings/__init__.py:570
#: paperless/settings/__init__.py:581
msgid "Portuguese"
msgstr ""
#: paperless/settings/__init__.py:571
#: paperless/settings/__init__.py:582
msgid "Romanian"
msgstr ""
#: paperless/settings/__init__.py:572
#: paperless/settings/__init__.py:583
msgid "Russian"
msgstr ""
#: paperless/settings/__init__.py:573
#: paperless/settings/__init__.py:584
msgid "Slovak"
msgstr ""
#: paperless/settings/__init__.py:574
#: paperless/settings/__init__.py:585
msgid "Slovenian"
msgstr ""
#: paperless/settings/__init__.py:575
#: paperless/settings/__init__.py:586
msgid "Serbian"
msgstr ""
#: paperless/settings/__init__.py:576
#: paperless/settings/__init__.py:587
msgid "Swedish"
msgstr ""
#: paperless/settings/__init__.py:577
#: paperless/settings/__init__.py:588
msgid "Turkish"
msgstr ""
#: paperless/settings/__init__.py:578
#: paperless/settings/__init__.py:589
msgid "Ukrainian"
msgstr ""
#: paperless/settings/__init__.py:579
#: paperless/settings/__init__.py:590
msgid "Vietnamese"
msgstr ""
#: paperless/settings/__init__.py:580
#: paperless/settings/__init__.py:591
msgid "Chinese Simplified"
msgstr ""
#: paperless/settings/__init__.py:581
#: paperless/settings/__init__.py:592
msgid "Chinese Traditional"
msgstr ""
+39 -39
View File
@@ -2,8 +2,8 @@ msgid ""
msgstr ""
"Project-Id-Version: paperless-ngx\n"
"Report-Msgid-Bugs-To: \n"
"POT-Creation-Date: 2026-07-23 19:21+0000\n"
"PO-Revision-Date: 2026-07-23 19:23\n"
"POT-Creation-Date: 2026-07-25 07:12+0000\n"
"PO-Revision-Date: 2026-07-25 07:14\n"
"Last-Translator: \n"
"Language-Team: Arabic\n"
"Language: ar_SA\n"
@@ -1920,151 +1920,151 @@ msgstr ""
msgid "paperless application settings"
msgstr "إعدادات التطبيق paperless"
#: paperless/settings/__init__.py:545
#: paperless/settings/__init__.py:556
msgid "English (US)"
msgstr "الإنجليزية (الولايات المتحدة)"
#: paperless/settings/__init__.py:546
#: paperless/settings/__init__.py:557
msgid "Arabic"
msgstr "العربية"
#: paperless/settings/__init__.py:547
#: paperless/settings/__init__.py:558
msgid "Afrikaans"
msgstr "اللغة الأفريقانية"
#: paperless/settings/__init__.py:548
#: paperless/settings/__init__.py:559
msgid "Belarusian"
msgstr "البيلاروسية"
#: paperless/settings/__init__.py:549
#: paperless/settings/__init__.py:560
msgid "Bulgarian"
msgstr "البلغارية"
#: paperless/settings/__init__.py:550
#: paperless/settings/__init__.py:561
msgid "Catalan"
msgstr "اللغة الكتالونية"
#: paperless/settings/__init__.py:551
#: paperless/settings/__init__.py:562
msgid "Czech"
msgstr "التشيكية"
#: paperless/settings/__init__.py:552
#: paperless/settings/__init__.py:563
msgid "Danish"
msgstr "الدانماركية"
#: paperless/settings/__init__.py:553
#: paperless/settings/__init__.py:564
msgid "German"
msgstr "الألمانية"
#: paperless/settings/__init__.py:554
#: paperless/settings/__init__.py:565
msgid "Greek"
msgstr "اليونانية"
#: paperless/settings/__init__.py:555
#: paperless/settings/__init__.py:566
msgid "English (GB)"
msgstr "الإنجليزية (المملكة المتحدة)"
#: paperless/settings/__init__.py:556
#: paperless/settings/__init__.py:567
msgid "Spanish"
msgstr "الإسبانية"
#: paperless/settings/__init__.py:557
#: paperless/settings/__init__.py:568
msgid "Persian"
msgstr ""
#: paperless/settings/__init__.py:558
#: paperless/settings/__init__.py:569
msgid "Finnish"
msgstr "الفنلندية"
#: paperless/settings/__init__.py:559
#: paperless/settings/__init__.py:570
msgid "French"
msgstr "الفرنسية"
#: paperless/settings/__init__.py:560
#: paperless/settings/__init__.py:571
msgid "Hungarian"
msgstr "المجرية"
#: paperless/settings/__init__.py:561
#: paperless/settings/__init__.py:572
msgid "Indonesian"
msgstr ""
#: paperless/settings/__init__.py:562
#: paperless/settings/__init__.py:573
msgid "Italian"
msgstr "الإيطالية"
#: paperless/settings/__init__.py:563
#: paperless/settings/__init__.py:574
msgid "Japanese"
msgstr "اليابانية"
#: paperless/settings/__init__.py:564
#: paperless/settings/__init__.py:575
msgid "Korean"
msgstr ""
#: paperless/settings/__init__.py:565
#: paperless/settings/__init__.py:576
msgid "Luxembourgish"
msgstr "اللوكسمبرجية"
#: paperless/settings/__init__.py:566
#: paperless/settings/__init__.py:577
msgid "Norwegian"
msgstr "النرويجية"
#: paperless/settings/__init__.py:567
#: paperless/settings/__init__.py:578
msgid "Dutch"
msgstr "الهولندية"
#: paperless/settings/__init__.py:568
#: paperless/settings/__init__.py:579
msgid "Polish"
msgstr "البولندية"
#: paperless/settings/__init__.py:569
#: paperless/settings/__init__.py:580
msgid "Portuguese (Brazil)"
msgstr "البرتغالية (البرازيل)"
#: paperless/settings/__init__.py:570
#: paperless/settings/__init__.py:581
msgid "Portuguese"
msgstr "البرتغالية"
#: paperless/settings/__init__.py:571
#: paperless/settings/__init__.py:582
msgid "Romanian"
msgstr "الرومانية"
#: paperless/settings/__init__.py:572
#: paperless/settings/__init__.py:583
msgid "Russian"
msgstr "الروسية"
#: paperless/settings/__init__.py:573
#: paperless/settings/__init__.py:584
msgid "Slovak"
msgstr "السلوفاكية"
#: paperless/settings/__init__.py:574
#: paperless/settings/__init__.py:585
msgid "Slovenian"
msgstr "السلوفانية"
#: paperless/settings/__init__.py:575
#: paperless/settings/__init__.py:586
msgid "Serbian"
msgstr "الصربية"
#: paperless/settings/__init__.py:576
#: paperless/settings/__init__.py:587
msgid "Swedish"
msgstr "السويدية"
#: paperless/settings/__init__.py:577
#: paperless/settings/__init__.py:588
msgid "Turkish"
msgstr "التركية"
#: paperless/settings/__init__.py:578
#: paperless/settings/__init__.py:589
msgid "Ukrainian"
msgstr "الأوكرانية"
#: paperless/settings/__init__.py:579
#: paperless/settings/__init__.py:590
msgid "Vietnamese"
msgstr ""
#: paperless/settings/__init__.py:580
#: paperless/settings/__init__.py:591
msgid "Chinese Simplified"
msgstr "الصينية المبسطة"
#: paperless/settings/__init__.py:581
#: paperless/settings/__init__.py:592
msgid "Chinese Traditional"
msgstr ""
+39 -39
View File
@@ -2,8 +2,8 @@ msgid ""
msgstr ""
"Project-Id-Version: paperless-ngx\n"
"Report-Msgid-Bugs-To: \n"
"POT-Creation-Date: 2026-07-23 19:21+0000\n"
"PO-Revision-Date: 2026-07-23 19:23\n"
"POT-Creation-Date: 2026-07-25 07:12+0000\n"
"PO-Revision-Date: 2026-07-25 07:14\n"
"Last-Translator: \n"
"Language-Team: Belarusian\n"
"Language: be_BY\n"
@@ -1919,151 +1919,151 @@ msgstr ""
msgid "paperless application settings"
msgstr ""
#: paperless/settings/__init__.py:545
#: paperless/settings/__init__.py:556
msgid "English (US)"
msgstr "Англійская (ЗША)"
#: paperless/settings/__init__.py:546
#: paperless/settings/__init__.py:557
msgid "Arabic"
msgstr ""
#: paperless/settings/__init__.py:547
#: paperless/settings/__init__.py:558
msgid "Afrikaans"
msgstr ""
#: paperless/settings/__init__.py:548
#: paperless/settings/__init__.py:559
msgid "Belarusian"
msgstr "Беларуская"
#: paperless/settings/__init__.py:549
#: paperless/settings/__init__.py:560
msgid "Bulgarian"
msgstr ""
#: paperless/settings/__init__.py:550
#: paperless/settings/__init__.py:561
msgid "Catalan"
msgstr ""
#: paperless/settings/__init__.py:551
#: paperless/settings/__init__.py:562
msgid "Czech"
msgstr "Чэшская"
#: paperless/settings/__init__.py:552
#: paperless/settings/__init__.py:563
msgid "Danish"
msgstr "Дацкая"
#: paperless/settings/__init__.py:553
#: paperless/settings/__init__.py:564
msgid "German"
msgstr "Нямецкая"
#: paperless/settings/__init__.py:554
#: paperless/settings/__init__.py:565
msgid "Greek"
msgstr ""
#: paperless/settings/__init__.py:555
#: paperless/settings/__init__.py:566
msgid "English (GB)"
msgstr "Англійская (Вялікабрытанія)"
#: paperless/settings/__init__.py:556
#: paperless/settings/__init__.py:567
msgid "Spanish"
msgstr "Іспанская"
#: paperless/settings/__init__.py:557
#: paperless/settings/__init__.py:568
msgid "Persian"
msgstr ""
#: paperless/settings/__init__.py:558
#: paperless/settings/__init__.py:569
msgid "Finnish"
msgstr ""
#: paperless/settings/__init__.py:559
#: paperless/settings/__init__.py:570
msgid "French"
msgstr "Французская"
#: paperless/settings/__init__.py:560
#: paperless/settings/__init__.py:571
msgid "Hungarian"
msgstr ""
#: paperless/settings/__init__.py:561
#: paperless/settings/__init__.py:572
msgid "Indonesian"
msgstr ""
#: paperless/settings/__init__.py:562
#: paperless/settings/__init__.py:573
msgid "Italian"
msgstr "Італьянская"
#: paperless/settings/__init__.py:563
#: paperless/settings/__init__.py:574
msgid "Japanese"
msgstr ""
#: paperless/settings/__init__.py:564
#: paperless/settings/__init__.py:575
msgid "Korean"
msgstr ""
#: paperless/settings/__init__.py:565
#: paperless/settings/__init__.py:576
msgid "Luxembourgish"
msgstr "Люксембургская"
#: paperless/settings/__init__.py:566
#: paperless/settings/__init__.py:577
msgid "Norwegian"
msgstr ""
#: paperless/settings/__init__.py:567
#: paperless/settings/__init__.py:578
msgid "Dutch"
msgstr "Нідэрландская"
#: paperless/settings/__init__.py:568
#: paperless/settings/__init__.py:579
msgid "Polish"
msgstr "Польская"
#: paperless/settings/__init__.py:569
#: paperless/settings/__init__.py:580
msgid "Portuguese (Brazil)"
msgstr "Партугальская (Бразілія)"
#: paperless/settings/__init__.py:570
#: paperless/settings/__init__.py:581
msgid "Portuguese"
msgstr "Партугальская"
#: paperless/settings/__init__.py:571
#: paperless/settings/__init__.py:582
msgid "Romanian"
msgstr "Румынская"
#: paperless/settings/__init__.py:572
#: paperless/settings/__init__.py:583
msgid "Russian"
msgstr "Руская"
#: paperless/settings/__init__.py:573
#: paperless/settings/__init__.py:584
msgid "Slovak"
msgstr ""
#: paperless/settings/__init__.py:574
#: paperless/settings/__init__.py:585
msgid "Slovenian"
msgstr "Славенская"
#: paperless/settings/__init__.py:575
#: paperless/settings/__init__.py:586
msgid "Serbian"
msgstr "Сербская"
#: paperless/settings/__init__.py:576
#: paperless/settings/__init__.py:587
msgid "Swedish"
msgstr "Шведская"
#: paperless/settings/__init__.py:577
#: paperless/settings/__init__.py:588
msgid "Turkish"
msgstr "Турэцкая"
#: paperless/settings/__init__.py:578
#: paperless/settings/__init__.py:589
msgid "Ukrainian"
msgstr ""
#: paperless/settings/__init__.py:579
#: paperless/settings/__init__.py:590
msgid "Vietnamese"
msgstr ""
#: paperless/settings/__init__.py:580
#: paperless/settings/__init__.py:591
msgid "Chinese Simplified"
msgstr "Кітайская спрошчаная"
#: paperless/settings/__init__.py:581
#: paperless/settings/__init__.py:592
msgid "Chinese Traditional"
msgstr ""
+39 -39
View File
@@ -2,8 +2,8 @@ msgid ""
msgstr ""
"Project-Id-Version: paperless-ngx\n"
"Report-Msgid-Bugs-To: \n"
"POT-Creation-Date: 2026-07-23 19:21+0000\n"
"PO-Revision-Date: 2026-07-23 19:23\n"
"POT-Creation-Date: 2026-07-25 07:12+0000\n"
"PO-Revision-Date: 2026-07-25 07:14\n"
"Last-Translator: \n"
"Language-Team: Bulgarian\n"
"Language: bg_BG\n"
@@ -1920,151 +1920,151 @@ msgstr ""
msgid "paperless application settings"
msgstr "настройки на софтуера"
#: paperless/settings/__init__.py:545
#: paperless/settings/__init__.py:556
msgid "English (US)"
msgstr "Английски (САЩ)"
#: paperless/settings/__init__.py:546
#: paperless/settings/__init__.py:557
msgid "Arabic"
msgstr "Арабски"
#: paperless/settings/__init__.py:547
#: paperless/settings/__init__.py:558
msgid "Afrikaans"
msgstr "Африканс"
#: paperless/settings/__init__.py:548
#: paperless/settings/__init__.py:559
msgid "Belarusian"
msgstr "Беларуски"
#: paperless/settings/__init__.py:549
#: paperless/settings/__init__.py:560
msgid "Bulgarian"
msgstr "Български"
#: paperless/settings/__init__.py:550
#: paperless/settings/__init__.py:561
msgid "Catalan"
msgstr "Каталунски"
#: paperless/settings/__init__.py:551
#: paperless/settings/__init__.py:562
msgid "Czech"
msgstr "Чешки"
#: paperless/settings/__init__.py:552
#: paperless/settings/__init__.py:563
msgid "Danish"
msgstr "Датски"
#: paperless/settings/__init__.py:553
#: paperless/settings/__init__.py:564
msgid "German"
msgstr "Немски"
#: paperless/settings/__init__.py:554
#: paperless/settings/__init__.py:565
msgid "Greek"
msgstr "Гръцки"
#: paperless/settings/__init__.py:555
#: paperless/settings/__init__.py:566
msgid "English (GB)"
msgstr "Английски (Великобритания)"
#: paperless/settings/__init__.py:556
#: paperless/settings/__init__.py:567
msgid "Spanish"
msgstr "Испански"
#: paperless/settings/__init__.py:557
#: paperless/settings/__init__.py:568
msgid "Persian"
msgstr ""
#: paperless/settings/__init__.py:558
#: paperless/settings/__init__.py:569
msgid "Finnish"
msgstr "Финландски"
#: paperless/settings/__init__.py:559
#: paperless/settings/__init__.py:570
msgid "French"
msgstr "Френски"
#: paperless/settings/__init__.py:560
#: paperless/settings/__init__.py:571
msgid "Hungarian"
msgstr "Унгарски"
#: paperless/settings/__init__.py:561
#: paperless/settings/__init__.py:572
msgid "Indonesian"
msgstr ""
#: paperless/settings/__init__.py:562
#: paperless/settings/__init__.py:573
msgid "Italian"
msgstr "Италиански"
#: paperless/settings/__init__.py:563
#: paperless/settings/__init__.py:574
msgid "Japanese"
msgstr "Японски"
#: paperless/settings/__init__.py:564
#: paperless/settings/__init__.py:575
msgid "Korean"
msgstr "Корейски"
#: paperless/settings/__init__.py:565
#: paperless/settings/__init__.py:576
msgid "Luxembourgish"
msgstr "Люксембургски"
#: paperless/settings/__init__.py:566
#: paperless/settings/__init__.py:577
msgid "Norwegian"
msgstr "Норвежки"
#: paperless/settings/__init__.py:567
#: paperless/settings/__init__.py:578
msgid "Dutch"
msgstr "Холандски"
#: paperless/settings/__init__.py:568
#: paperless/settings/__init__.py:579
msgid "Polish"
msgstr "Полски"
#: paperless/settings/__init__.py:569
#: paperless/settings/__init__.py:580
msgid "Portuguese (Brazil)"
msgstr "Португалски (Бразилия)"
#: paperless/settings/__init__.py:570
#: paperless/settings/__init__.py:581
msgid "Portuguese"
msgstr "Португалски"
#: paperless/settings/__init__.py:571
#: paperless/settings/__init__.py:582
msgid "Romanian"
msgstr "Румънски"
#: paperless/settings/__init__.py:572
#: paperless/settings/__init__.py:583
msgid "Russian"
msgstr "Руски"
#: paperless/settings/__init__.py:573
#: paperless/settings/__init__.py:584
msgid "Slovak"
msgstr "Словашки"
#: paperless/settings/__init__.py:574
#: paperless/settings/__init__.py:585
msgid "Slovenian"
msgstr "Словенски"
#: paperless/settings/__init__.py:575
#: paperless/settings/__init__.py:586
msgid "Serbian"
msgstr "Сръбски"
#: paperless/settings/__init__.py:576
#: paperless/settings/__init__.py:587
msgid "Swedish"
msgstr "Шведски"
#: paperless/settings/__init__.py:577
#: paperless/settings/__init__.py:588
msgid "Turkish"
msgstr "Турски"
#: paperless/settings/__init__.py:578
#: paperless/settings/__init__.py:589
msgid "Ukrainian"
msgstr "Украински"
#: paperless/settings/__init__.py:579
#: paperless/settings/__init__.py:590
msgid "Vietnamese"
msgstr ""
#: paperless/settings/__init__.py:580
#: paperless/settings/__init__.py:591
msgid "Chinese Simplified"
msgstr "Китайски опростен"
#: paperless/settings/__init__.py:581
#: paperless/settings/__init__.py:592
msgid "Chinese Traditional"
msgstr "Китайски традиционен"
+41 -41
View File
@@ -2,8 +2,8 @@ msgid ""
msgstr ""
"Project-Id-Version: paperless-ngx\n"
"Report-Msgid-Bugs-To: \n"
"POT-Creation-Date: 2026-07-23 19:21+0000\n"
"PO-Revision-Date: 2026-07-23 19:23\n"
"POT-Creation-Date: 2026-07-25 07:12+0000\n"
"PO-Revision-Date: 2026-07-25 07:14\n"
"Last-Translator: \n"
"Language-Team: Catalan\n"
"Language: ca_ES\n"
@@ -1914,157 +1914,157 @@ msgstr "Estableix l'idioma de sortida de LLM"
#: paperless/models.py:370
msgid "Sets the LLM timeout in seconds"
msgstr ""
msgstr "Estableix temps d'espera en segons"
#: paperless/models.py:376
msgid "paperless application settings"
msgstr "configuració de l'aplicació paperless"
#: paperless/settings/__init__.py:545
#: paperless/settings/__init__.py:556
msgid "English (US)"
msgstr "Anglès (US)"
#: paperless/settings/__init__.py:546
#: paperless/settings/__init__.py:557
msgid "Arabic"
msgstr "Àrab"
#: paperless/settings/__init__.py:547
#: paperless/settings/__init__.py:558
msgid "Afrikaans"
msgstr "Africà"
#: paperless/settings/__init__.py:548
#: paperless/settings/__init__.py:559
msgid "Belarusian"
msgstr "Bielorús"
#: paperless/settings/__init__.py:549
#: paperless/settings/__init__.py:560
msgid "Bulgarian"
msgstr "Búlgar"
#: paperless/settings/__init__.py:550
#: paperless/settings/__init__.py:561
msgid "Catalan"
msgstr "Català"
#: paperless/settings/__init__.py:551
#: paperless/settings/__init__.py:562
msgid "Czech"
msgstr "Txec"
#: paperless/settings/__init__.py:552
#: paperless/settings/__init__.py:563
msgid "Danish"
msgstr "Danès"
#: paperless/settings/__init__.py:553
#: paperless/settings/__init__.py:564
msgid "German"
msgstr "Alemany"
#: paperless/settings/__init__.py:554
#: paperless/settings/__init__.py:565
msgid "Greek"
msgstr "Grec"
#: paperless/settings/__init__.py:555
#: paperless/settings/__init__.py:566
msgid "English (GB)"
msgstr "Anglès (GB)"
#: paperless/settings/__init__.py:556
#: paperless/settings/__init__.py:567
msgid "Spanish"
msgstr "Espanyol"
#: paperless/settings/__init__.py:557
#: paperless/settings/__init__.py:568
msgid "Persian"
msgstr "Persa"
#: paperless/settings/__init__.py:558
#: paperless/settings/__init__.py:569
msgid "Finnish"
msgstr "Finès"
#: paperless/settings/__init__.py:559
#: paperless/settings/__init__.py:570
msgid "French"
msgstr "Francès"
#: paperless/settings/__init__.py:560
#: paperless/settings/__init__.py:571
msgid "Hungarian"
msgstr "Hongarès"
#: paperless/settings/__init__.py:561
#: paperless/settings/__init__.py:572
msgid "Indonesian"
msgstr "Indonesi"
#: paperless/settings/__init__.py:562
#: paperless/settings/__init__.py:573
msgid "Italian"
msgstr "Italià"
#: paperless/settings/__init__.py:563
#: paperless/settings/__init__.py:574
msgid "Japanese"
msgstr "Japonès"
#: paperless/settings/__init__.py:564
#: paperless/settings/__init__.py:575
msgid "Korean"
msgstr "Coreà"
#: paperless/settings/__init__.py:565
#: paperless/settings/__init__.py:576
msgid "Luxembourgish"
msgstr "Luxemburguès"
#: paperless/settings/__init__.py:566
#: paperless/settings/__init__.py:577
msgid "Norwegian"
msgstr "Noruec"
#: paperless/settings/__init__.py:567
#: paperless/settings/__init__.py:578
msgid "Dutch"
msgstr "Holandès"
#: paperless/settings/__init__.py:568
#: paperless/settings/__init__.py:579
msgid "Polish"
msgstr "Polonès"
#: paperless/settings/__init__.py:569
#: paperless/settings/__init__.py:580
msgid "Portuguese (Brazil)"
msgstr "Portuguès (Brasil)"
#: paperless/settings/__init__.py:570
#: paperless/settings/__init__.py:581
msgid "Portuguese"
msgstr "Portuguès"
#: paperless/settings/__init__.py:571
#: paperless/settings/__init__.py:582
msgid "Romanian"
msgstr "Romanès"
#: paperless/settings/__init__.py:572
#: paperless/settings/__init__.py:583
msgid "Russian"
msgstr "Rus"
#: paperless/settings/__init__.py:573
#: paperless/settings/__init__.py:584
msgid "Slovak"
msgstr "Eslovac"
#: paperless/settings/__init__.py:574
#: paperless/settings/__init__.py:585
msgid "Slovenian"
msgstr "Eslovè"
#: paperless/settings/__init__.py:575
#: paperless/settings/__init__.py:586
msgid "Serbian"
msgstr "Serbi"
#: paperless/settings/__init__.py:576
#: paperless/settings/__init__.py:587
msgid "Swedish"
msgstr "Suec"
#: paperless/settings/__init__.py:577
#: paperless/settings/__init__.py:588
msgid "Turkish"
msgstr "Turc"
#: paperless/settings/__init__.py:578
#: paperless/settings/__init__.py:589
msgid "Ukrainian"
msgstr "Ucranià"
#: paperless/settings/__init__.py:579
#: paperless/settings/__init__.py:590
msgid "Vietnamese"
msgstr "Vietnamita"
#: paperless/settings/__init__.py:580
#: paperless/settings/__init__.py:591
msgid "Chinese Simplified"
msgstr "Xinès Simplificat"
#: paperless/settings/__init__.py:581
#: paperless/settings/__init__.py:592
msgid "Chinese Traditional"
msgstr "Xinès tradicional"
@@ -2386,7 +2386,7 @@ msgstr "uid"
#: paperless_mail/models.py:342
msgid "uid validity"
msgstr ""
msgstr "validació uid"
#: paperless_mail/models.py:350
msgid "subject"
+74 -74
View File
@@ -2,8 +2,8 @@ msgid ""
msgstr ""
"Project-Id-Version: paperless-ngx\n"
"Report-Msgid-Bugs-To: \n"
"POT-Creation-Date: 2026-07-23 19:21+0000\n"
"PO-Revision-Date: 2026-07-23 19:23\n"
"POT-Creation-Date: 2026-07-25 07:12+0000\n"
"PO-Revision-Date: 2026-07-25 07:14\n"
"Last-Translator: \n"
"Language-Team: Czech\n"
"Language: cs_CZ\n"
@@ -261,11 +261,11 @@ msgstr ""
#: documents/models.py:331
msgid "version label"
msgstr ""
msgstr "označení verze"
#: documents/models.py:335
msgid "Optional short label for a document version."
msgstr ""
msgstr "Volitelné krátké označení verze dokumentu."
#: documents/models.py:340 documents/models.py:851 documents/models.py:905
#: documents/models.py:1892
@@ -582,7 +582,7 @@ msgstr "filtrovací pravidla"
#: documents/models.py:679 documents/models.py:934
msgid "Pending"
msgstr ""
msgstr "Čekající"
#: documents/models.py:680 documents/models.py:757
msgid "Started"
@@ -602,7 +602,7 @@ msgstr ""
#: documents/models.py:686
msgid "Consume File"
msgstr "Soubor zpracování"
msgstr "Zpracování souboru"
#: documents/models.py:687
msgid "Train Classifier"
@@ -610,7 +610,7 @@ msgstr "Trénovací klasifikátor"
#: documents/models.py:688
msgid "Sanity Check"
msgstr ""
msgstr "Kontrola zdraví"
#: documents/models.py:689
msgid "Index Optimize"
@@ -622,31 +622,31 @@ msgstr "Načíst poštu"
#: documents/models.py:691
msgid "LLM Index"
msgstr ""
msgstr "Index LLM"
#: documents/models.py:692
msgid "Empty Trash"
msgstr ""
msgstr "Vyprázdnění koše"
#: documents/models.py:693
msgid "Check Workflows"
msgstr ""
msgstr "Kontrola postupů"
#: documents/models.py:694
msgid "Bulk Update"
msgstr ""
msgstr "Hromadná aktualizace"
#: documents/models.py:695
msgid "Reprocess Document"
msgstr ""
msgstr "Opětovné zpracování dokumentu"
#: documents/models.py:696
msgid "Build Share Link"
msgstr ""
msgstr "Sestavení odkazu ke sdílení"
#: documents/models.py:697
msgid "Bulk Delete"
msgstr ""
msgstr "Hromadné smazání"
#: documents/models.py:706 documents/models.py:1277
msgid "Scheduled"
@@ -662,19 +662,19 @@ msgstr ""
#: documents/models.py:709
msgid "Folder Consume"
msgstr ""
msgstr "Zpracování složky"
#: documents/models.py:710
msgid "Email Consume"
msgstr ""
msgstr "Zpracování e-mailu"
#: documents/models.py:711
msgid "System"
msgstr ""
msgstr "Systém"
#: documents/models.py:712
msgid "Manual"
msgstr ""
msgstr "Ruční"
#: documents/models.py:718
msgid "Task ID"
@@ -750,7 +750,7 @@ msgstr ""
#: documents/models.py:806
msgid "Tasks"
msgstr ""
msgstr "Úlohy"
#: documents/models.py:836
msgid "Note for the document"
@@ -802,7 +802,7 @@ msgstr ""
#: documents/models.py:937
msgid "Failed"
msgstr ""
msgstr "Selhané"
#: documents/models.py:984
msgid "size (bytes)"
@@ -826,7 +826,7 @@ msgstr ""
#: documents/models.py:1017
msgid "share link bundles"
msgstr ""
msgstr "balíčky sdílení odkazů"
#: documents/models.py:1020
#, python-format
@@ -971,7 +971,7 @@ msgstr "má tento typ dokumentu"
#: documents/models.py:1377
msgid "has one of these document types"
msgstr ""
msgstr "má jeden z následujících typů dokumentů"
#: documents/models.py:1384
msgid "does not have these document type(s)"
@@ -1342,7 +1342,7 @@ msgstr "spuštění pracovních postupů"
#: documents/serialisers.py:2763 documents/views.py:298 documents/views.py:2541
#: paperless_mail/serialisers.py:155
msgid "Insufficient permissions."
msgstr ""
msgstr "Nedostatečná oprávnění."
#: documents/serialisers.py:710
msgid "Invalid color."
@@ -1655,7 +1655,7 @@ msgstr ""
#: documents/views.py:4512
#, python-format
msgid "Insufficient permissions to share document %(id)s."
msgstr ""
msgstr "Nedostatečná oprávnění ke sdílení dokumentu %(id)s."
#: documents/views.py:4558
msgid "Bundle is already being processed."
@@ -1779,7 +1779,7 @@ msgstr "Nastaví režim OCR"
#: paperless/models.py:131
msgid "Controls archive file generation"
msgstr ""
msgstr "Ovládá generování archivních souborů"
#: paperless/models.py:139
msgid "Sets image DPI fallback value"
@@ -1867,7 +1867,7 @@ msgstr "Nastaví mapování čárových kódů na štítky"
#: paperless/models.py:285
msgid "Enables splitting on tag barcodes"
msgstr ""
msgstr "Umožňuje rozdělení podle čárových kódů štítků"
#: paperless/models.py:294
msgid "Enables AI features"
@@ -1875,197 +1875,197 @@ msgstr ""
#: paperless/models.py:300
msgid "Sets the LLM embedding backend"
msgstr ""
msgstr "Nastaví backend pro vkládání LLM"
#: paperless/models.py:308
msgid "Sets the LLM embedding model"
msgstr ""
msgstr "Nastaví model vkládání LLM"
#: paperless/models.py:315
msgid "Sets the LLM embedding endpoint, optional"
msgstr ""
msgstr "Nastaví koncový bod vkládání LLM, volitelné"
#: paperless/models.py:322
msgid "Sets the LLM embedding chunk size"
msgstr ""
msgstr "Nastaví velikost bloků vkládání LLM"
#: paperless/models.py:328
msgid "Sets the LLM context size"
msgstr ""
msgstr "Nastaví velikost kontextu LLM"
#: paperless/models.py:334
msgid "Sets the LLM backend"
msgstr ""
msgstr "Nastaví backend LLM"
#: paperless/models.py:342
msgid "Sets the LLM model"
msgstr ""
msgstr "Nastaví model LLM"
#: paperless/models.py:349
msgid "Sets the LLM API key"
msgstr ""
msgstr "Nastaví klíč API LLM"
#: paperless/models.py:356
msgid "Sets the LLM endpoint, optional"
msgstr ""
msgstr "Nastaví koncový bod LLM, volitelné"
#: paperless/models.py:363
msgid "Sets the LLM output language"
msgstr ""
msgstr "Nastaví výstupní jazyk LLM"
#: paperless/models.py:370
msgid "Sets the LLM timeout in seconds"
msgstr ""
msgstr "Nastaví časový limit LLM v sekundách"
#: paperless/models.py:376
msgid "paperless application settings"
msgstr "nastavení aplikace paperless"
#: paperless/settings/__init__.py:545
#: paperless/settings/__init__.py:556
msgid "English (US)"
msgstr "Angličtina (US)"
#: paperless/settings/__init__.py:546
#: paperless/settings/__init__.py:557
msgid "Arabic"
msgstr "Arabština"
#: paperless/settings/__init__.py:547
#: paperless/settings/__init__.py:558
msgid "Afrikaans"
msgstr "Afrikánština"
#: paperless/settings/__init__.py:548
#: paperless/settings/__init__.py:559
msgid "Belarusian"
msgstr "Běloruština"
#: paperless/settings/__init__.py:549
#: paperless/settings/__init__.py:560
msgid "Bulgarian"
msgstr "Bulharština"
#: paperless/settings/__init__.py:550
#: paperless/settings/__init__.py:561
msgid "Catalan"
msgstr "Katalánština"
#: paperless/settings/__init__.py:551
#: paperless/settings/__init__.py:562
msgid "Czech"
msgstr "Čeština"
#: paperless/settings/__init__.py:552
#: paperless/settings/__init__.py:563
msgid "Danish"
msgstr "Dánština"
#: paperless/settings/__init__.py:553
#: paperless/settings/__init__.py:564
msgid "German"
msgstr "Němčina"
#: paperless/settings/__init__.py:554
#: paperless/settings/__init__.py:565
msgid "Greek"
msgstr "Řečtina"
#: paperless/settings/__init__.py:555
#: paperless/settings/__init__.py:566
msgid "English (GB)"
msgstr "Angličtina (GB)"
#: paperless/settings/__init__.py:556
#: paperless/settings/__init__.py:567
msgid "Spanish"
msgstr "Španělština"
#: paperless/settings/__init__.py:557
#: paperless/settings/__init__.py:568
msgid "Persian"
msgstr "Perština"
#: paperless/settings/__init__.py:558
#: paperless/settings/__init__.py:569
msgid "Finnish"
msgstr "Finština"
#: paperless/settings/__init__.py:559
#: paperless/settings/__init__.py:570
msgid "French"
msgstr "Francouzština"
#: paperless/settings/__init__.py:560
#: paperless/settings/__init__.py:571
msgid "Hungarian"
msgstr "Maďarština"
#: paperless/settings/__init__.py:561
#: paperless/settings/__init__.py:572
msgid "Indonesian"
msgstr "Indonéština"
#: paperless/settings/__init__.py:562
#: paperless/settings/__init__.py:573
msgid "Italian"
msgstr "Italština"
#: paperless/settings/__init__.py:563
#: paperless/settings/__init__.py:574
msgid "Japanese"
msgstr "Japonština"
#: paperless/settings/__init__.py:564
#: paperless/settings/__init__.py:575
msgid "Korean"
msgstr "Korejština"
#: paperless/settings/__init__.py:565
#: paperless/settings/__init__.py:576
msgid "Luxembourgish"
msgstr "Lucemburština"
#: paperless/settings/__init__.py:566
#: paperless/settings/__init__.py:577
msgid "Norwegian"
msgstr "Norština"
#: paperless/settings/__init__.py:567
#: paperless/settings/__init__.py:578
msgid "Dutch"
msgstr "Holandština"
#: paperless/settings/__init__.py:568
#: paperless/settings/__init__.py:579
msgid "Polish"
msgstr "Polština"
#: paperless/settings/__init__.py:569
#: paperless/settings/__init__.py:580
msgid "Portuguese (Brazil)"
msgstr "Portugalština (Brazílie)"
#: paperless/settings/__init__.py:570
#: paperless/settings/__init__.py:581
msgid "Portuguese"
msgstr "Portugalština"
#: paperless/settings/__init__.py:571
#: paperless/settings/__init__.py:582
msgid "Romanian"
msgstr "Rumunština"
#: paperless/settings/__init__.py:572
#: paperless/settings/__init__.py:583
msgid "Russian"
msgstr "Ruština"
#: paperless/settings/__init__.py:573
#: paperless/settings/__init__.py:584
msgid "Slovak"
msgstr "Slovenština"
#: paperless/settings/__init__.py:574
#: paperless/settings/__init__.py:585
msgid "Slovenian"
msgstr "Slovinština"
#: paperless/settings/__init__.py:575
#: paperless/settings/__init__.py:586
msgid "Serbian"
msgstr "Srbština"
#: paperless/settings/__init__.py:576
#: paperless/settings/__init__.py:587
msgid "Swedish"
msgstr "Švédština"
#: paperless/settings/__init__.py:577
#: paperless/settings/__init__.py:588
msgid "Turkish"
msgstr "Turečtina"
#: paperless/settings/__init__.py:578
#: paperless/settings/__init__.py:589
msgid "Ukrainian"
msgstr "Ukrajinština"
#: paperless/settings/__init__.py:579
#: paperless/settings/__init__.py:590
msgid "Vietnamese"
msgstr "Vietnamština"
#: paperless/settings/__init__.py:580
#: paperless/settings/__init__.py:591
msgid "Chinese Simplified"
msgstr "Čínština (zjednodušená)"
#: paperless/settings/__init__.py:581
#: paperless/settings/__init__.py:592
msgid "Chinese Traditional"
msgstr "Čínština (tradiční)"
+39 -39
View File
@@ -2,8 +2,8 @@ msgid ""
msgstr ""
"Project-Id-Version: paperless-ngx\n"
"Report-Msgid-Bugs-To: \n"
"POT-Creation-Date: 2026-07-23 19:21+0000\n"
"PO-Revision-Date: 2026-07-23 19:23\n"
"POT-Creation-Date: 2026-07-25 07:12+0000\n"
"PO-Revision-Date: 2026-07-25 07:14\n"
"Last-Translator: \n"
"Language-Team: Danish\n"
"Language: da_DK\n"
@@ -1920,151 +1920,151 @@ msgstr ""
msgid "paperless application settings"
msgstr "paperless-applikationsindstillinger"
#: paperless/settings/__init__.py:545
#: paperless/settings/__init__.py:556
msgid "English (US)"
msgstr "Engelsk (USA)"
#: paperless/settings/__init__.py:546
#: paperless/settings/__init__.py:557
msgid "Arabic"
msgstr ""
#: paperless/settings/__init__.py:547
#: paperless/settings/__init__.py:558
msgid "Afrikaans"
msgstr "Afrikaans"
#: paperless/settings/__init__.py:548
#: paperless/settings/__init__.py:559
msgid "Belarusian"
msgstr "Hviderussisk"
#: paperless/settings/__init__.py:549
#: paperless/settings/__init__.py:560
msgid "Bulgarian"
msgstr "Bulgarsk"
#: paperless/settings/__init__.py:550
#: paperless/settings/__init__.py:561
msgid "Catalan"
msgstr "Katalansk"
#: paperless/settings/__init__.py:551
#: paperless/settings/__init__.py:562
msgid "Czech"
msgstr "Tjekkisk"
#: paperless/settings/__init__.py:552
#: paperless/settings/__init__.py:563
msgid "Danish"
msgstr "Dansk"
#: paperless/settings/__init__.py:553
#: paperless/settings/__init__.py:564
msgid "German"
msgstr "Tysk"
#: paperless/settings/__init__.py:554
#: paperless/settings/__init__.py:565
msgid "Greek"
msgstr "Græsk"
#: paperless/settings/__init__.py:555
#: paperless/settings/__init__.py:566
msgid "English (GB)"
msgstr "Engelsk (GB)"
#: paperless/settings/__init__.py:556
#: paperless/settings/__init__.py:567
msgid "Spanish"
msgstr "Spansk"
#: paperless/settings/__init__.py:557
#: paperless/settings/__init__.py:568
msgid "Persian"
msgstr ""
#: paperless/settings/__init__.py:558
#: paperless/settings/__init__.py:569
msgid "Finnish"
msgstr "Finsk"
#: paperless/settings/__init__.py:559
#: paperless/settings/__init__.py:570
msgid "French"
msgstr "Fransk"
#: paperless/settings/__init__.py:560
#: paperless/settings/__init__.py:571
msgid "Hungarian"
msgstr "Ungarsk"
#: paperless/settings/__init__.py:561
#: paperless/settings/__init__.py:572
msgid "Indonesian"
msgstr ""
#: paperless/settings/__init__.py:562
#: paperless/settings/__init__.py:573
msgid "Italian"
msgstr "Italiensk"
#: paperless/settings/__init__.py:563
#: paperless/settings/__init__.py:574
msgid "Japanese"
msgstr "Japansk"
#: paperless/settings/__init__.py:564
#: paperless/settings/__init__.py:575
msgid "Korean"
msgstr "Koreansk"
#: paperless/settings/__init__.py:565
#: paperless/settings/__init__.py:576
msgid "Luxembourgish"
msgstr "Luxemburgsk"
#: paperless/settings/__init__.py:566
#: paperless/settings/__init__.py:577
msgid "Norwegian"
msgstr "Norsk"
#: paperless/settings/__init__.py:567
#: paperless/settings/__init__.py:578
msgid "Dutch"
msgstr "Hollandsk"
#: paperless/settings/__init__.py:568
#: paperless/settings/__init__.py:579
msgid "Polish"
msgstr "Polsk"
#: paperless/settings/__init__.py:569
#: paperless/settings/__init__.py:580
msgid "Portuguese (Brazil)"
msgstr "Portugisisk (Brasilien)"
#: paperless/settings/__init__.py:570
#: paperless/settings/__init__.py:581
msgid "Portuguese"
msgstr "Portugisisk"
#: paperless/settings/__init__.py:571
#: paperless/settings/__init__.py:582
msgid "Romanian"
msgstr "Romansk"
#: paperless/settings/__init__.py:572
#: paperless/settings/__init__.py:583
msgid "Russian"
msgstr "Russisk"
#: paperless/settings/__init__.py:573
#: paperless/settings/__init__.py:584
msgid "Slovak"
msgstr "Slovakisk"
#: paperless/settings/__init__.py:574
#: paperless/settings/__init__.py:585
msgid "Slovenian"
msgstr "Slovensk"
#: paperless/settings/__init__.py:575
#: paperless/settings/__init__.py:586
msgid "Serbian"
msgstr "Serbisk"
#: paperless/settings/__init__.py:576
#: paperless/settings/__init__.py:587
msgid "Swedish"
msgstr "Svensk"
#: paperless/settings/__init__.py:577
#: paperless/settings/__init__.py:588
msgid "Turkish"
msgstr "Tyrkisk"
#: paperless/settings/__init__.py:578
#: paperless/settings/__init__.py:589
msgid "Ukrainian"
msgstr "Ukrainsk"
#: paperless/settings/__init__.py:579
#: paperless/settings/__init__.py:590
msgid "Vietnamese"
msgstr ""
#: paperless/settings/__init__.py:580
#: paperless/settings/__init__.py:591
msgid "Chinese Simplified"
msgstr "Kinesisk, forenklet"
#: paperless/settings/__init__.py:581
#: paperless/settings/__init__.py:592
msgid "Chinese Traditional"
msgstr "Kinesisk, traditionelt"
+39 -39
View File
@@ -2,8 +2,8 @@ msgid ""
msgstr ""
"Project-Id-Version: paperless-ngx\n"
"Report-Msgid-Bugs-To: \n"
"POT-Creation-Date: 2026-07-23 19:21+0000\n"
"PO-Revision-Date: 2026-07-23 19:23\n"
"POT-Creation-Date: 2026-07-25 07:12+0000\n"
"PO-Revision-Date: 2026-07-25 07:14\n"
"Last-Translator: \n"
"Language-Team: German, Switzerland\n"
"Language: de_CH\n"
@@ -1920,151 +1920,151 @@ msgstr ""
msgid "paperless application settings"
msgstr "Paperless-ngx-Anwendungseinstellungen"
#: paperless/settings/__init__.py:545
#: paperless/settings/__init__.py:556
msgid "English (US)"
msgstr "Englisch (US)"
#: paperless/settings/__init__.py:546
#: paperless/settings/__init__.py:557
msgid "Arabic"
msgstr "Arabisch"
#: paperless/settings/__init__.py:547
#: paperless/settings/__init__.py:558
msgid "Afrikaans"
msgstr "Afrikanisch"
#: paperless/settings/__init__.py:548
#: paperless/settings/__init__.py:559
msgid "Belarusian"
msgstr "Belarussisch"
#: paperless/settings/__init__.py:549
#: paperless/settings/__init__.py:560
msgid "Bulgarian"
msgstr "Bulgarisch"
#: paperless/settings/__init__.py:550
#: paperless/settings/__init__.py:561
msgid "Catalan"
msgstr "Katalanisch"
#: paperless/settings/__init__.py:551
#: paperless/settings/__init__.py:562
msgid "Czech"
msgstr "Tschechisch"
#: paperless/settings/__init__.py:552
#: paperless/settings/__init__.py:563
msgid "Danish"
msgstr "Dänisch"
#: paperless/settings/__init__.py:553
#: paperless/settings/__init__.py:564
msgid "German"
msgstr "Deutsch"
#: paperless/settings/__init__.py:554
#: paperless/settings/__init__.py:565
msgid "Greek"
msgstr "Griechisch"
#: paperless/settings/__init__.py:555
#: paperless/settings/__init__.py:566
msgid "English (GB)"
msgstr "Englisch (UK)"
#: paperless/settings/__init__.py:556
#: paperless/settings/__init__.py:567
msgid "Spanish"
msgstr "Spanisch"
#: paperless/settings/__init__.py:557
#: paperless/settings/__init__.py:568
msgid "Persian"
msgstr "Persisch"
#: paperless/settings/__init__.py:558
#: paperless/settings/__init__.py:569
msgid "Finnish"
msgstr "Finnisch"
#: paperless/settings/__init__.py:559
#: paperless/settings/__init__.py:570
msgid "French"
msgstr "Französisch"
#: paperless/settings/__init__.py:560
#: paperless/settings/__init__.py:571
msgid "Hungarian"
msgstr "Ungarisch"
#: paperless/settings/__init__.py:561
#: paperless/settings/__init__.py:572
msgid "Indonesian"
msgstr "Indonesisch"
#: paperless/settings/__init__.py:562
#: paperless/settings/__init__.py:573
msgid "Italian"
msgstr "Italienisch"
#: paperless/settings/__init__.py:563
#: paperless/settings/__init__.py:574
msgid "Japanese"
msgstr "Japanisch"
#: paperless/settings/__init__.py:564
#: paperless/settings/__init__.py:575
msgid "Korean"
msgstr "Koreanisch"
#: paperless/settings/__init__.py:565
#: paperless/settings/__init__.py:576
msgid "Luxembourgish"
msgstr "Luxemburgisch"
#: paperless/settings/__init__.py:566
#: paperless/settings/__init__.py:577
msgid "Norwegian"
msgstr "Norwegisch"
#: paperless/settings/__init__.py:567
#: paperless/settings/__init__.py:578
msgid "Dutch"
msgstr "Niederländisch"
#: paperless/settings/__init__.py:568
#: paperless/settings/__init__.py:579
msgid "Polish"
msgstr "Polnisch"
#: paperless/settings/__init__.py:569
#: paperless/settings/__init__.py:580
msgid "Portuguese (Brazil)"
msgstr "Portugiesisch (Brasilien)"
#: paperless/settings/__init__.py:570
#: paperless/settings/__init__.py:581
msgid "Portuguese"
msgstr "Portugiesisch"
#: paperless/settings/__init__.py:571
#: paperless/settings/__init__.py:582
msgid "Romanian"
msgstr "Rumänisch"
#: paperless/settings/__init__.py:572
#: paperless/settings/__init__.py:583
msgid "Russian"
msgstr "Russisch"
#: paperless/settings/__init__.py:573
#: paperless/settings/__init__.py:584
msgid "Slovak"
msgstr "Slowakisch"
#: paperless/settings/__init__.py:574
#: paperless/settings/__init__.py:585
msgid "Slovenian"
msgstr "Slowenisch"
#: paperless/settings/__init__.py:575
#: paperless/settings/__init__.py:586
msgid "Serbian"
msgstr "Serbisch"
#: paperless/settings/__init__.py:576
#: paperless/settings/__init__.py:587
msgid "Swedish"
msgstr "Schwedisch"
#: paperless/settings/__init__.py:577
#: paperless/settings/__init__.py:588
msgid "Turkish"
msgstr "Türkisch"
#: paperless/settings/__init__.py:578
#: paperless/settings/__init__.py:589
msgid "Ukrainian"
msgstr "Ukrainisch"
#: paperless/settings/__init__.py:579
#: paperless/settings/__init__.py:590
msgid "Vietnamese"
msgstr "Vietnamesisch"
#: paperless/settings/__init__.py:580
#: paperless/settings/__init__.py:591
msgid "Chinese Simplified"
msgstr "Chinesisch (vereinfacht)"
#: paperless/settings/__init__.py:581
#: paperless/settings/__init__.py:592
msgid "Chinese Traditional"
msgstr "Chinesisch (traditionell)"
+39 -39
View File
@@ -2,8 +2,8 @@ msgid ""
msgstr ""
"Project-Id-Version: paperless-ngx\n"
"Report-Msgid-Bugs-To: \n"
"POT-Creation-Date: 2026-07-23 19:21+0000\n"
"PO-Revision-Date: 2026-07-23 19:23\n"
"POT-Creation-Date: 2026-07-25 07:12+0000\n"
"PO-Revision-Date: 2026-07-25 07:14\n"
"Last-Translator: \n"
"Language-Team: German\n"
"Language: de_DE\n"
@@ -1920,151 +1920,151 @@ msgstr "Legt das LLM-Zeitlimit in Sekunden fest"
msgid "paperless application settings"
msgstr "Paperless-ngx-Anwendungseinstellungen"
#: paperless/settings/__init__.py:545
#: paperless/settings/__init__.py:556
msgid "English (US)"
msgstr "Englisch (US)"
#: paperless/settings/__init__.py:546
#: paperless/settings/__init__.py:557
msgid "Arabic"
msgstr "Arabisch"
#: paperless/settings/__init__.py:547
#: paperless/settings/__init__.py:558
msgid "Afrikaans"
msgstr "Afrikanisch"
#: paperless/settings/__init__.py:548
#: paperless/settings/__init__.py:559
msgid "Belarusian"
msgstr "Belarussisch"
#: paperless/settings/__init__.py:549
#: paperless/settings/__init__.py:560
msgid "Bulgarian"
msgstr "Bulgarisch"
#: paperless/settings/__init__.py:550
#: paperless/settings/__init__.py:561
msgid "Catalan"
msgstr "Katalanisch"
#: paperless/settings/__init__.py:551
#: paperless/settings/__init__.py:562
msgid "Czech"
msgstr "Tschechisch"
#: paperless/settings/__init__.py:552
#: paperless/settings/__init__.py:563
msgid "Danish"
msgstr "Dänisch"
#: paperless/settings/__init__.py:553
#: paperless/settings/__init__.py:564
msgid "German"
msgstr "Deutsch"
#: paperless/settings/__init__.py:554
#: paperless/settings/__init__.py:565
msgid "Greek"
msgstr "Griechisch"
#: paperless/settings/__init__.py:555
#: paperless/settings/__init__.py:566
msgid "English (GB)"
msgstr "Englisch (UK)"
#: paperless/settings/__init__.py:556
#: paperless/settings/__init__.py:567
msgid "Spanish"
msgstr "Spanisch"
#: paperless/settings/__init__.py:557
#: paperless/settings/__init__.py:568
msgid "Persian"
msgstr "Persisch"
#: paperless/settings/__init__.py:558
#: paperless/settings/__init__.py:569
msgid "Finnish"
msgstr "Finnisch"
#: paperless/settings/__init__.py:559
#: paperless/settings/__init__.py:570
msgid "French"
msgstr "Französisch"
#: paperless/settings/__init__.py:560
#: paperless/settings/__init__.py:571
msgid "Hungarian"
msgstr "Ungarisch"
#: paperless/settings/__init__.py:561
#: paperless/settings/__init__.py:572
msgid "Indonesian"
msgstr "Indonesisch"
#: paperless/settings/__init__.py:562
#: paperless/settings/__init__.py:573
msgid "Italian"
msgstr "Italienisch"
#: paperless/settings/__init__.py:563
#: paperless/settings/__init__.py:574
msgid "Japanese"
msgstr "Japanisch"
#: paperless/settings/__init__.py:564
#: paperless/settings/__init__.py:575
msgid "Korean"
msgstr "Koreanisch"
#: paperless/settings/__init__.py:565
#: paperless/settings/__init__.py:576
msgid "Luxembourgish"
msgstr "Luxemburgisch"
#: paperless/settings/__init__.py:566
#: paperless/settings/__init__.py:577
msgid "Norwegian"
msgstr "Norwegisch"
#: paperless/settings/__init__.py:567
#: paperless/settings/__init__.py:578
msgid "Dutch"
msgstr "Niederländisch"
#: paperless/settings/__init__.py:568
#: paperless/settings/__init__.py:579
msgid "Polish"
msgstr "Polnisch"
#: paperless/settings/__init__.py:569
#: paperless/settings/__init__.py:580
msgid "Portuguese (Brazil)"
msgstr "Portugiesisch (Brasilien)"
#: paperless/settings/__init__.py:570
#: paperless/settings/__init__.py:581
msgid "Portuguese"
msgstr "Portugiesisch"
#: paperless/settings/__init__.py:571
#: paperless/settings/__init__.py:582
msgid "Romanian"
msgstr "Rumänisch"
#: paperless/settings/__init__.py:572
#: paperless/settings/__init__.py:583
msgid "Russian"
msgstr "Russisch"
#: paperless/settings/__init__.py:573
#: paperless/settings/__init__.py:584
msgid "Slovak"
msgstr "Slowakisch"
#: paperless/settings/__init__.py:574
#: paperless/settings/__init__.py:585
msgid "Slovenian"
msgstr "Slowenisch"
#: paperless/settings/__init__.py:575
#: paperless/settings/__init__.py:586
msgid "Serbian"
msgstr "Serbisch"
#: paperless/settings/__init__.py:576
#: paperless/settings/__init__.py:587
msgid "Swedish"
msgstr "Schwedisch"
#: paperless/settings/__init__.py:577
#: paperless/settings/__init__.py:588
msgid "Turkish"
msgstr "Türkisch"
#: paperless/settings/__init__.py:578
#: paperless/settings/__init__.py:589
msgid "Ukrainian"
msgstr "Ukrainisch"
#: paperless/settings/__init__.py:579
#: paperless/settings/__init__.py:590
msgid "Vietnamese"
msgstr "Vietnamesisch"
#: paperless/settings/__init__.py:580
#: paperless/settings/__init__.py:591
msgid "Chinese Simplified"
msgstr "Chinesisch (vereinfacht)"
#: paperless/settings/__init__.py:581
#: paperless/settings/__init__.py:592
msgid "Chinese Traditional"
msgstr "Chinesisch (traditionell)"
+39 -39
View File
@@ -2,8 +2,8 @@ msgid ""
msgstr ""
"Project-Id-Version: paperless-ngx\n"
"Report-Msgid-Bugs-To: \n"
"POT-Creation-Date: 2026-07-23 19:21+0000\n"
"PO-Revision-Date: 2026-07-23 19:23\n"
"POT-Creation-Date: 2026-07-25 07:12+0000\n"
"PO-Revision-Date: 2026-07-25 07:14\n"
"Last-Translator: \n"
"Language-Team: Greek\n"
"Language: el_GR\n"
@@ -1920,151 +1920,151 @@ msgstr ""
msgid "paperless application settings"
msgstr "ρυθμίσεις εφαρμογής paperless"
#: paperless/settings/__init__.py:545
#: paperless/settings/__init__.py:556
msgid "English (US)"
msgstr "Αγγλικά (ΗΠΑ)"
#: paperless/settings/__init__.py:546
#: paperless/settings/__init__.py:557
msgid "Arabic"
msgstr "Αραβικά"
#: paperless/settings/__init__.py:547
#: paperless/settings/__init__.py:558
msgid "Afrikaans"
msgstr "Αφρικανικά"
#: paperless/settings/__init__.py:548
#: paperless/settings/__init__.py:559
msgid "Belarusian"
msgstr "Λευκορωσικά"
#: paperless/settings/__init__.py:549
#: paperless/settings/__init__.py:560
msgid "Bulgarian"
msgstr "Βουλγαρικά"
#: paperless/settings/__init__.py:550
#: paperless/settings/__init__.py:561
msgid "Catalan"
msgstr "Καταλανικά"
#: paperless/settings/__init__.py:551
#: paperless/settings/__init__.py:562
msgid "Czech"
msgstr "Τσέχικα"
#: paperless/settings/__init__.py:552
#: paperless/settings/__init__.py:563
msgid "Danish"
msgstr "Δανέζικα"
#: paperless/settings/__init__.py:553
#: paperless/settings/__init__.py:564
msgid "German"
msgstr "Γερμανικά"
#: paperless/settings/__init__.py:554
#: paperless/settings/__init__.py:565
msgid "Greek"
msgstr "Ελληνικά"
#: paperless/settings/__init__.py:555
#: paperless/settings/__init__.py:566
msgid "English (GB)"
msgstr "Αγγλικά (Ηνωμένο Βασίλειο)"
#: paperless/settings/__init__.py:556
#: paperless/settings/__init__.py:567
msgid "Spanish"
msgstr "Ισπανικά"
#: paperless/settings/__init__.py:557
#: paperless/settings/__init__.py:568
msgid "Persian"
msgstr ""
#: paperless/settings/__init__.py:558
#: paperless/settings/__init__.py:569
msgid "Finnish"
msgstr "Φινλανδικά"
#: paperless/settings/__init__.py:559
#: paperless/settings/__init__.py:570
msgid "French"
msgstr "Γαλλικά"
#: paperless/settings/__init__.py:560
#: paperless/settings/__init__.py:571
msgid "Hungarian"
msgstr "Ουγγρικά"
#: paperless/settings/__init__.py:561
#: paperless/settings/__init__.py:572
msgid "Indonesian"
msgstr ""
#: paperless/settings/__init__.py:562
#: paperless/settings/__init__.py:573
msgid "Italian"
msgstr "Ιταλικά"
#: paperless/settings/__init__.py:563
#: paperless/settings/__init__.py:574
msgid "Japanese"
msgstr "Ιαπωνικά"
#: paperless/settings/__init__.py:564
#: paperless/settings/__init__.py:575
msgid "Korean"
msgstr "Κορεάτικα"
#: paperless/settings/__init__.py:565
#: paperless/settings/__init__.py:576
msgid "Luxembourgish"
msgstr "Λουξεμβουργικά"
#: paperless/settings/__init__.py:566
#: paperless/settings/__init__.py:577
msgid "Norwegian"
msgstr "Νορβηγικά"
#: paperless/settings/__init__.py:567
#: paperless/settings/__init__.py:578
msgid "Dutch"
msgstr "Ολλανδικά"
#: paperless/settings/__init__.py:568
#: paperless/settings/__init__.py:579
msgid "Polish"
msgstr "Πολωνικά"
#: paperless/settings/__init__.py:569
#: paperless/settings/__init__.py:580
msgid "Portuguese (Brazil)"
msgstr "Πορτογαλικά (Βραζιλίας)"
#: paperless/settings/__init__.py:570
#: paperless/settings/__init__.py:581
msgid "Portuguese"
msgstr "Πορτογαλικά"
#: paperless/settings/__init__.py:571
#: paperless/settings/__init__.py:582
msgid "Romanian"
msgstr "Ρουμάνικα"
#: paperless/settings/__init__.py:572
#: paperless/settings/__init__.py:583
msgid "Russian"
msgstr "Ρωσικά"
#: paperless/settings/__init__.py:573
#: paperless/settings/__init__.py:584
msgid "Slovak"
msgstr "Σλοβακικά"
#: paperless/settings/__init__.py:574
#: paperless/settings/__init__.py:585
msgid "Slovenian"
msgstr "Σλοβενικά"
#: paperless/settings/__init__.py:575
#: paperless/settings/__init__.py:586
msgid "Serbian"
msgstr "Σερβικά"
#: paperless/settings/__init__.py:576
#: paperless/settings/__init__.py:587
msgid "Swedish"
msgstr "Σουηδικά"
#: paperless/settings/__init__.py:577
#: paperless/settings/__init__.py:588
msgid "Turkish"
msgstr "Τούρκικα"
#: paperless/settings/__init__.py:578
#: paperless/settings/__init__.py:589
msgid "Ukrainian"
msgstr "Ουκρανικά"
#: paperless/settings/__init__.py:579
#: paperless/settings/__init__.py:590
msgid "Vietnamese"
msgstr ""
#: paperless/settings/__init__.py:580
#: paperless/settings/__init__.py:591
msgid "Chinese Simplified"
msgstr "Κινέζικα Απλοποιημένα"
#: paperless/settings/__init__.py:581
#: paperless/settings/__init__.py:592
msgid "Chinese Traditional"
msgstr "Κινεζικά Παραδοσιακά"
+57 -57
View File
@@ -2,7 +2,7 @@ msgid ""
msgstr ""
"Project-Id-Version: paperless-ngx\n"
"Report-Msgid-Bugs-To: \n"
"POT-Creation-Date: 2026-07-23 19:21+0000\n"
"POT-Creation-Date: 2026-07-27 19:34+0000\n"
"PO-Revision-Date: 2022-02-17 04:17\n"
"Last-Translator: \n"
"Language-Team: English\n"
@@ -21,39 +21,39 @@ msgstr ""
msgid "Documents"
msgstr ""
#: documents/filters.py:470
#: documents/filters.py:472
msgid "Value must be valid JSON."
msgstr ""
#: documents/filters.py:489
#: documents/filters.py:491
msgid "Invalid custom field query expression"
msgstr ""
#: documents/filters.py:499
#: documents/filters.py:501
msgid "Invalid expression list. Must be nonempty."
msgstr ""
#: documents/filters.py:520
#: documents/filters.py:522
msgid "Invalid logical operator {op!r}"
msgstr ""
#: documents/filters.py:534
#: documents/filters.py:536
msgid "Maximum number of query conditions exceeded."
msgstr ""
#: documents/filters.py:598
#: documents/filters.py:600
msgid "{name!r} is not a valid custom field."
msgstr ""
#: documents/filters.py:635
#: documents/filters.py:637
msgid "{data_type} does not support query expr {expr!r}."
msgstr ""
#: documents/filters.py:750 documents/models.py:136
#: documents/filters.py:752 documents/models.py:136
msgid "Maximum nesting depth exceeded."
msgstr ""
#: documents/filters.py:1067
#: documents/filters.py:1094
msgid "Custom field not found"
msgstr ""
@@ -1352,7 +1352,7 @@ msgid "workflow runs"
msgstr ""
#: documents/serialisers.py:522 documents/serialisers.py:874
#: documents/serialisers.py:2763 documents/views.py:298 documents/views.py:2541
#: documents/serialisers.py:2763 documents/views.py:299 documents/views.py:2553
#: paperless_mail/serialisers.py:155
msgid "Insufficient permissions."
msgstr ""
@@ -1393,7 +1393,7 @@ msgstr ""
msgid "Duplicate document identifiers are not allowed."
msgstr ""
#: documents/serialisers.py:2849 documents/views.py:4500
#: documents/serialisers.py:2849 documents/views.py:4512
#, python-format
msgid "Documents not found: %(ids)s"
msgstr ""
@@ -1661,36 +1661,36 @@ msgstr ""
msgid "Unable to parse URI {value}"
msgstr ""
#: documents/views.py:291 documents/views.py:2538
#: documents/views.py:292 documents/views.py:2550
msgid "Invalid more_like_id"
msgstr ""
#: documents/views.py:1556
#: documents/views.py:1562
msgid "Invalid AI configuration."
msgstr ""
#: documents/views.py:1565
#: documents/views.py:1571
msgid "AI backend request timed out."
msgstr ""
#: documents/views.py:2363 documents/views.py:2684
#: documents/views.py:2375 documents/views.py:2696
msgid "Specify only one of text, title_search, query, or more_like_id."
msgstr ""
#: documents/views.py:4512
#: documents/views.py:4524
#, python-format
msgid "Insufficient permissions to share document %(id)s."
msgstr ""
#: documents/views.py:4558
#: documents/views.py:4570
msgid "Bundle is already being processed."
msgstr ""
#: documents/views.py:4619
#: documents/views.py:4631
msgid "The share link bundle is still being prepared. Please try again later."
msgstr ""
#: documents/views.py:4629
#: documents/views.py:4641
msgid "The share link bundle is unavailable."
msgstr ""
@@ -1946,151 +1946,151 @@ msgstr ""
msgid "paperless application settings"
msgstr ""
#: paperless/settings/__init__.py:545
#: paperless/settings/__init__.py:556
msgid "English (US)"
msgstr ""
#: paperless/settings/__init__.py:546
#: paperless/settings/__init__.py:557
msgid "Arabic"
msgstr ""
#: paperless/settings/__init__.py:547
#: paperless/settings/__init__.py:558
msgid "Afrikaans"
msgstr ""
#: paperless/settings/__init__.py:548
#: paperless/settings/__init__.py:559
msgid "Belarusian"
msgstr ""
#: paperless/settings/__init__.py:549
#: paperless/settings/__init__.py:560
msgid "Bulgarian"
msgstr ""
#: paperless/settings/__init__.py:550
#: paperless/settings/__init__.py:561
msgid "Catalan"
msgstr ""
#: paperless/settings/__init__.py:551
#: paperless/settings/__init__.py:562
msgid "Czech"
msgstr ""
#: paperless/settings/__init__.py:552
#: paperless/settings/__init__.py:563
msgid "Danish"
msgstr ""
#: paperless/settings/__init__.py:553
#: paperless/settings/__init__.py:564
msgid "German"
msgstr ""
#: paperless/settings/__init__.py:554
#: paperless/settings/__init__.py:565
msgid "Greek"
msgstr ""
#: paperless/settings/__init__.py:555
#: paperless/settings/__init__.py:566
msgid "English (GB)"
msgstr ""
#: paperless/settings/__init__.py:556
#: paperless/settings/__init__.py:567
msgid "Spanish"
msgstr ""
#: paperless/settings/__init__.py:557
#: paperless/settings/__init__.py:568
msgid "Persian"
msgstr ""
#: paperless/settings/__init__.py:558
#: paperless/settings/__init__.py:569
msgid "Finnish"
msgstr ""
#: paperless/settings/__init__.py:559
#: paperless/settings/__init__.py:570
msgid "French"
msgstr ""
#: paperless/settings/__init__.py:560
#: paperless/settings/__init__.py:571
msgid "Hungarian"
msgstr ""
#: paperless/settings/__init__.py:561
#: paperless/settings/__init__.py:572
msgid "Indonesian"
msgstr ""
#: paperless/settings/__init__.py:562
#: paperless/settings/__init__.py:573
msgid "Italian"
msgstr ""
#: paperless/settings/__init__.py:563
#: paperless/settings/__init__.py:574
msgid "Japanese"
msgstr ""
#: paperless/settings/__init__.py:564
#: paperless/settings/__init__.py:575
msgid "Korean"
msgstr ""
#: paperless/settings/__init__.py:565
#: paperless/settings/__init__.py:576
msgid "Luxembourgish"
msgstr ""
#: paperless/settings/__init__.py:566
#: paperless/settings/__init__.py:577
msgid "Norwegian"
msgstr ""
#: paperless/settings/__init__.py:567
#: paperless/settings/__init__.py:578
msgid "Dutch"
msgstr ""
#: paperless/settings/__init__.py:568
#: paperless/settings/__init__.py:579
msgid "Polish"
msgstr ""
#: paperless/settings/__init__.py:569
#: paperless/settings/__init__.py:580
msgid "Portuguese (Brazil)"
msgstr ""
#: paperless/settings/__init__.py:570
#: paperless/settings/__init__.py:581
msgid "Portuguese"
msgstr ""
#: paperless/settings/__init__.py:571
#: paperless/settings/__init__.py:582
msgid "Romanian"
msgstr ""
#: paperless/settings/__init__.py:572
#: paperless/settings/__init__.py:583
msgid "Russian"
msgstr ""
#: paperless/settings/__init__.py:573
#: paperless/settings/__init__.py:584
msgid "Slovak"
msgstr ""
#: paperless/settings/__init__.py:574
#: paperless/settings/__init__.py:585
msgid "Slovenian"
msgstr ""
#: paperless/settings/__init__.py:575
#: paperless/settings/__init__.py:586
msgid "Serbian"
msgstr ""
#: paperless/settings/__init__.py:576
#: paperless/settings/__init__.py:587
msgid "Swedish"
msgstr ""
#: paperless/settings/__init__.py:577
#: paperless/settings/__init__.py:588
msgid "Turkish"
msgstr ""
#: paperless/settings/__init__.py:578
#: paperless/settings/__init__.py:589
msgid "Ukrainian"
msgstr ""
#: paperless/settings/__init__.py:579
#: paperless/settings/__init__.py:590
msgid "Vietnamese"
msgstr ""
#: paperless/settings/__init__.py:580
#: paperless/settings/__init__.py:591
msgid "Chinese Simplified"
msgstr ""
#: paperless/settings/__init__.py:581
#: paperless/settings/__init__.py:592
msgid "Chinese Traditional"
msgstr ""
+39 -39
View File
@@ -2,8 +2,8 @@ msgid ""
msgstr ""
"Project-Id-Version: paperless-ngx\n"
"Report-Msgid-Bugs-To: \n"
"POT-Creation-Date: 2026-07-23 19:21+0000\n"
"PO-Revision-Date: 2026-07-23 19:23\n"
"POT-Creation-Date: 2026-07-25 07:12+0000\n"
"PO-Revision-Date: 2026-07-25 07:14\n"
"Last-Translator: \n"
"Language-Team: Spanish\n"
"Language: es_ES\n"
@@ -1920,151 +1920,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:545
#: paperless/settings/__init__.py:556
msgid "English (US)"
msgstr "Inglés (US)"
#: paperless/settings/__init__.py:546
#: paperless/settings/__init__.py:557
msgid "Arabic"
msgstr "Árabe"
#: paperless/settings/__init__.py:547
#: paperless/settings/__init__.py:558
msgid "Afrikaans"
msgstr "Africano"
#: paperless/settings/__init__.py:548
#: paperless/settings/__init__.py:559
msgid "Belarusian"
msgstr "Bielorruso"
#: paperless/settings/__init__.py:549
#: paperless/settings/__init__.py:560
msgid "Bulgarian"
msgstr "Búlgaro"
#: paperless/settings/__init__.py:550
#: paperless/settings/__init__.py:561
msgid "Catalan"
msgstr "Catalán"
#: paperless/settings/__init__.py:551
#: paperless/settings/__init__.py:562
msgid "Czech"
msgstr "Checo"
#: paperless/settings/__init__.py:552
#: paperless/settings/__init__.py:563
msgid "Danish"
msgstr "Danés"
#: paperless/settings/__init__.py:553
#: paperless/settings/__init__.py:564
msgid "German"
msgstr "Alemán"
#: paperless/settings/__init__.py:554
#: paperless/settings/__init__.py:565
msgid "Greek"
msgstr "Griego"
#: paperless/settings/__init__.py:555
#: paperless/settings/__init__.py:566
msgid "English (GB)"
msgstr "Inglés (Gran Bretaña)"
#: paperless/settings/__init__.py:556
#: paperless/settings/__init__.py:567
msgid "Spanish"
msgstr "Español"
#: paperless/settings/__init__.py:557
#: paperless/settings/__init__.py:568
msgid "Persian"
msgstr "Persa"
#: paperless/settings/__init__.py:558
#: paperless/settings/__init__.py:569
msgid "Finnish"
msgstr "Finlandés"
#: paperless/settings/__init__.py:559
#: paperless/settings/__init__.py:570
msgid "French"
msgstr "Francés"
#: paperless/settings/__init__.py:560
#: paperless/settings/__init__.py:571
msgid "Hungarian"
msgstr "Húngaro"
#: paperless/settings/__init__.py:561
#: paperless/settings/__init__.py:572
msgid "Indonesian"
msgstr "Indonesio"
#: paperless/settings/__init__.py:562
#: paperless/settings/__init__.py:573
msgid "Italian"
msgstr "Italiano"
#: paperless/settings/__init__.py:563
#: paperless/settings/__init__.py:574
msgid "Japanese"
msgstr "Japonés"
#: paperless/settings/__init__.py:564
#: paperless/settings/__init__.py:575
msgid "Korean"
msgstr "Coreano"
#: paperless/settings/__init__.py:565
#: paperless/settings/__init__.py:576
msgid "Luxembourgish"
msgstr "Luxemburgués"
#: paperless/settings/__init__.py:566
#: paperless/settings/__init__.py:577
msgid "Norwegian"
msgstr "Noruego"
#: paperless/settings/__init__.py:567
#: paperless/settings/__init__.py:578
msgid "Dutch"
msgstr "Alemán"
#: paperless/settings/__init__.py:568
#: paperless/settings/__init__.py:579
msgid "Polish"
msgstr "Polaco"
#: paperless/settings/__init__.py:569
#: paperless/settings/__init__.py:580
msgid "Portuguese (Brazil)"
msgstr "Portugués (Brasil)"
#: paperless/settings/__init__.py:570
#: paperless/settings/__init__.py:581
msgid "Portuguese"
msgstr "Portugués"
#: paperless/settings/__init__.py:571
#: paperless/settings/__init__.py:582
msgid "Romanian"
msgstr "Rumano"
#: paperless/settings/__init__.py:572
#: paperless/settings/__init__.py:583
msgid "Russian"
msgstr "Ruso"
#: paperless/settings/__init__.py:573
#: paperless/settings/__init__.py:584
msgid "Slovak"
msgstr "Eslovaco"
#: paperless/settings/__init__.py:574
#: paperless/settings/__init__.py:585
msgid "Slovenian"
msgstr "Esloveno"
#: paperless/settings/__init__.py:575
#: paperless/settings/__init__.py:586
msgid "Serbian"
msgstr "Serbio"
#: paperless/settings/__init__.py:576
#: paperless/settings/__init__.py:587
msgid "Swedish"
msgstr "Sueco"
#: paperless/settings/__init__.py:577
#: paperless/settings/__init__.py:588
msgid "Turkish"
msgstr "Turco"
#: paperless/settings/__init__.py:578
#: paperless/settings/__init__.py:589
msgid "Ukrainian"
msgstr "Ucraniano"
#: paperless/settings/__init__.py:579
#: paperless/settings/__init__.py:590
msgid "Vietnamese"
msgstr "Vietnamita"
#: paperless/settings/__init__.py:580
#: paperless/settings/__init__.py:591
msgid "Chinese Simplified"
msgstr "Chino simplificado"
#: paperless/settings/__init__.py:581
#: paperless/settings/__init__.py:592
msgid "Chinese Traditional"
msgstr "Chino tradicional"
+39 -39
View File
@@ -2,8 +2,8 @@ msgid ""
msgstr ""
"Project-Id-Version: paperless-ngx\n"
"Report-Msgid-Bugs-To: \n"
"POT-Creation-Date: 2026-07-23 19:21+0000\n"
"PO-Revision-Date: 2026-07-23 19:23\n"
"POT-Creation-Date: 2026-07-25 07:12+0000\n"
"PO-Revision-Date: 2026-07-25 07:14\n"
"Last-Translator: \n"
"Language-Team: Estonian\n"
"Language: et_EE\n"
@@ -1919,151 +1919,151 @@ msgstr ""
msgid "paperless application settings"
msgstr ""
#: paperless/settings/__init__.py:545
#: paperless/settings/__init__.py:556
msgid "English (US)"
msgstr ""
#: paperless/settings/__init__.py:546
#: paperless/settings/__init__.py:557
msgid "Arabic"
msgstr ""
#: paperless/settings/__init__.py:547
#: paperless/settings/__init__.py:558
msgid "Afrikaans"
msgstr ""
#: paperless/settings/__init__.py:548
#: paperless/settings/__init__.py:559
msgid "Belarusian"
msgstr ""
#: paperless/settings/__init__.py:549
#: paperless/settings/__init__.py:560
msgid "Bulgarian"
msgstr ""
#: paperless/settings/__init__.py:550
#: paperless/settings/__init__.py:561
msgid "Catalan"
msgstr ""
#: paperless/settings/__init__.py:551
#: paperless/settings/__init__.py:562
msgid "Czech"
msgstr ""
#: paperless/settings/__init__.py:552
#: paperless/settings/__init__.py:563
msgid "Danish"
msgstr ""
#: paperless/settings/__init__.py:553
#: paperless/settings/__init__.py:564
msgid "German"
msgstr ""
#: paperless/settings/__init__.py:554
#: paperless/settings/__init__.py:565
msgid "Greek"
msgstr ""
#: paperless/settings/__init__.py:555
#: paperless/settings/__init__.py:566
msgid "English (GB)"
msgstr ""
#: paperless/settings/__init__.py:556
#: paperless/settings/__init__.py:567
msgid "Spanish"
msgstr ""
#: paperless/settings/__init__.py:557
#: paperless/settings/__init__.py:568
msgid "Persian"
msgstr ""
#: paperless/settings/__init__.py:558
#: paperless/settings/__init__.py:569
msgid "Finnish"
msgstr ""
#: paperless/settings/__init__.py:559
#: paperless/settings/__init__.py:570
msgid "French"
msgstr ""
#: paperless/settings/__init__.py:560
#: paperless/settings/__init__.py:571
msgid "Hungarian"
msgstr ""
#: paperless/settings/__init__.py:561
#: paperless/settings/__init__.py:572
msgid "Indonesian"
msgstr ""
#: paperless/settings/__init__.py:562
#: paperless/settings/__init__.py:573
msgid "Italian"
msgstr ""
#: paperless/settings/__init__.py:563
#: paperless/settings/__init__.py:574
msgid "Japanese"
msgstr ""
#: paperless/settings/__init__.py:564
#: paperless/settings/__init__.py:575
msgid "Korean"
msgstr ""
#: paperless/settings/__init__.py:565
#: paperless/settings/__init__.py:576
msgid "Luxembourgish"
msgstr ""
#: paperless/settings/__init__.py:566
#: paperless/settings/__init__.py:577
msgid "Norwegian"
msgstr ""
#: paperless/settings/__init__.py:567
#: paperless/settings/__init__.py:578
msgid "Dutch"
msgstr ""
#: paperless/settings/__init__.py:568
#: paperless/settings/__init__.py:579
msgid "Polish"
msgstr ""
#: paperless/settings/__init__.py:569
#: paperless/settings/__init__.py:580
msgid "Portuguese (Brazil)"
msgstr ""
#: paperless/settings/__init__.py:570
#: paperless/settings/__init__.py:581
msgid "Portuguese"
msgstr ""
#: paperless/settings/__init__.py:571
#: paperless/settings/__init__.py:582
msgid "Romanian"
msgstr ""
#: paperless/settings/__init__.py:572
#: paperless/settings/__init__.py:583
msgid "Russian"
msgstr ""
#: paperless/settings/__init__.py:573
#: paperless/settings/__init__.py:584
msgid "Slovak"
msgstr ""
#: paperless/settings/__init__.py:574
#: paperless/settings/__init__.py:585
msgid "Slovenian"
msgstr ""
#: paperless/settings/__init__.py:575
#: paperless/settings/__init__.py:586
msgid "Serbian"
msgstr ""
#: paperless/settings/__init__.py:576
#: paperless/settings/__init__.py:587
msgid "Swedish"
msgstr ""
#: paperless/settings/__init__.py:577
#: paperless/settings/__init__.py:588
msgid "Turkish"
msgstr ""
#: paperless/settings/__init__.py:578
#: paperless/settings/__init__.py:589
msgid "Ukrainian"
msgstr ""
#: paperless/settings/__init__.py:579
#: paperless/settings/__init__.py:590
msgid "Vietnamese"
msgstr ""
#: paperless/settings/__init__.py:580
#: paperless/settings/__init__.py:591
msgid "Chinese Simplified"
msgstr ""
#: paperless/settings/__init__.py:581
#: paperless/settings/__init__.py:592
msgid "Chinese Traditional"
msgstr ""
+39 -39
View File
@@ -2,8 +2,8 @@ msgid ""
msgstr ""
"Project-Id-Version: paperless-ngx\n"
"Report-Msgid-Bugs-To: \n"
"POT-Creation-Date: 2026-07-23 19:21+0000\n"
"PO-Revision-Date: 2026-07-23 19:23\n"
"POT-Creation-Date: 2026-07-25 07:12+0000\n"
"PO-Revision-Date: 2026-07-25 07:14\n"
"Last-Translator: \n"
"Language-Team: Persian\n"
"Language: fa_IR\n"
@@ -1919,151 +1919,151 @@ msgstr ""
msgid "paperless application settings"
msgstr "تنظیمات برنامه بدون کاغذ"
#: paperless/settings/__init__.py:545
#: paperless/settings/__init__.py:556
msgid "English (US)"
msgstr "انگلیسی (ایالات متحده)"
#: paperless/settings/__init__.py:546
#: paperless/settings/__init__.py:557
msgid "Arabic"
msgstr "عربی"
#: paperless/settings/__init__.py:547
#: paperless/settings/__init__.py:558
msgid "Afrikaans"
msgstr "افریکان"
#: paperless/settings/__init__.py:548
#: paperless/settings/__init__.py:559
msgid "Belarusian"
msgstr "وابسته به بلروس"
#: paperless/settings/__init__.py:549
#: paperless/settings/__init__.py:560
msgid "Bulgarian"
msgstr "وابسته به بلغاری"
#: paperless/settings/__init__.py:550
#: paperless/settings/__init__.py:561
msgid "Catalan"
msgstr "کاتالان"
#: paperless/settings/__init__.py:551
#: paperless/settings/__init__.py:562
msgid "Czech"
msgstr "وابسته به چک"
#: paperless/settings/__init__.py:552
#: paperless/settings/__init__.py:563
msgid "Danish"
msgstr "وابسته به دانمارکی"
#: paperless/settings/__init__.py:553
#: paperless/settings/__init__.py:564
msgid "German"
msgstr "آلمانی"
#: paperless/settings/__init__.py:554
#: paperless/settings/__init__.py:565
msgid "Greek"
msgstr "یونانی"
#: paperless/settings/__init__.py:555
#: paperless/settings/__init__.py:566
msgid "English (GB)"
msgstr "انگلیسی (GB)"
#: paperless/settings/__init__.py:556
#: paperless/settings/__init__.py:567
msgid "Spanish"
msgstr "اسپانیایی"
#: paperless/settings/__init__.py:557
#: paperless/settings/__init__.py:568
msgid "Persian"
msgstr "فارسی"
#: paperless/settings/__init__.py:558
#: paperless/settings/__init__.py:569
msgid "Finnish"
msgstr "فنلاندی"
#: paperless/settings/__init__.py:559
#: paperless/settings/__init__.py:570
msgid "French"
msgstr "فرانسوی"
#: paperless/settings/__init__.py:560
#: paperless/settings/__init__.py:571
msgid "Hungarian"
msgstr "مجارستانی"
#: paperless/settings/__init__.py:561
#: paperless/settings/__init__.py:572
msgid "Indonesian"
msgstr ""
#: paperless/settings/__init__.py:562
#: paperless/settings/__init__.py:573
msgid "Italian"
msgstr "ایتالیایی"
#: paperless/settings/__init__.py:563
#: paperless/settings/__init__.py:574
msgid "Japanese"
msgstr "وابسته به ژاپنی"
#: paperless/settings/__init__.py:564
#: paperless/settings/__init__.py:575
msgid "Korean"
msgstr "کره ای"
#: paperless/settings/__init__.py:565
#: paperless/settings/__init__.py:576
msgid "Luxembourgish"
msgstr "وابسته به لوکس"
#: paperless/settings/__init__.py:566
#: paperless/settings/__init__.py:577
msgid "Norwegian"
msgstr "نروژی"
#: paperless/settings/__init__.py:567
#: paperless/settings/__init__.py:578
msgid "Dutch"
msgstr "هلندی"
#: paperless/settings/__init__.py:568
#: paperless/settings/__init__.py:579
msgid "Polish"
msgstr "صیقل دادن"
#: paperless/settings/__init__.py:569
#: paperless/settings/__init__.py:580
msgid "Portuguese (Brazil)"
msgstr "پرتغالی (برزیل)"
#: paperless/settings/__init__.py:570
#: paperless/settings/__init__.py:581
msgid "Portuguese"
msgstr "وابسته به پرتغالی"
#: paperless/settings/__init__.py:571
#: paperless/settings/__init__.py:582
msgid "Romanian"
msgstr "وابسته به رومانی"
#: paperless/settings/__init__.py:572
#: paperless/settings/__init__.py:583
msgid "Russian"
msgstr "روسی"
#: paperless/settings/__init__.py:573
#: paperless/settings/__init__.py:584
msgid "Slovak"
msgstr "لگن"
#: paperless/settings/__init__.py:574
#: paperless/settings/__init__.py:585
msgid "Slovenian"
msgstr "وابسته به اسلوونی"
#: paperless/settings/__init__.py:575
#: paperless/settings/__init__.py:586
msgid "Serbian"
msgstr "صرب"
#: paperless/settings/__init__.py:576
#: paperless/settings/__init__.py:587
msgid "Swedish"
msgstr "سوئدی"
#: paperless/settings/__init__.py:577
#: paperless/settings/__init__.py:588
msgid "Turkish"
msgstr "ترکی"
#: paperless/settings/__init__.py:578
#: paperless/settings/__init__.py:589
msgid "Ukrainian"
msgstr "وابسته به اوکراینی"
#: paperless/settings/__init__.py:579
#: paperless/settings/__init__.py:590
msgid "Vietnamese"
msgstr ""
#: paperless/settings/__init__.py:580
#: paperless/settings/__init__.py:591
msgid "Chinese Simplified"
msgstr "چینی ساده شد"
#: paperless/settings/__init__.py:581
#: paperless/settings/__init__.py:592
msgid "Chinese Traditional"
msgstr "چینی سنتی"
+39 -39
View File
@@ -2,8 +2,8 @@ msgid ""
msgstr ""
"Project-Id-Version: paperless-ngx\n"
"Report-Msgid-Bugs-To: \n"
"POT-Creation-Date: 2026-07-23 19:21+0000\n"
"PO-Revision-Date: 2026-07-23 19:23\n"
"POT-Creation-Date: 2026-07-25 07:12+0000\n"
"PO-Revision-Date: 2026-07-25 07:14\n"
"Last-Translator: \n"
"Language-Team: Finnish\n"
"Language: fi_FI\n"
@@ -1920,151 +1920,151 @@ msgstr ""
msgid "paperless application settings"
msgstr ""
#: paperless/settings/__init__.py:545
#: paperless/settings/__init__.py:556
msgid "English (US)"
msgstr "Englanti (US)"
#: paperless/settings/__init__.py:546
#: paperless/settings/__init__.py:557
msgid "Arabic"
msgstr "Arabialainen"
#: paperless/settings/__init__.py:547
#: paperless/settings/__init__.py:558
msgid "Afrikaans"
msgstr ""
#: paperless/settings/__init__.py:548
#: paperless/settings/__init__.py:559
msgid "Belarusian"
msgstr "valkovenäjä"
#: paperless/settings/__init__.py:549
#: paperless/settings/__init__.py:560
msgid "Bulgarian"
msgstr ""
#: paperless/settings/__init__.py:550
#: paperless/settings/__init__.py:561
msgid "Catalan"
msgstr "Katalaani"
#: paperless/settings/__init__.py:551
#: paperless/settings/__init__.py:562
msgid "Czech"
msgstr "Tšekki"
#: paperless/settings/__init__.py:552
#: paperless/settings/__init__.py:563
msgid "Danish"
msgstr "Tanska"
#: paperless/settings/__init__.py:553
#: paperless/settings/__init__.py:564
msgid "German"
msgstr "Saksa"
#: paperless/settings/__init__.py:554
#: paperless/settings/__init__.py:565
msgid "Greek"
msgstr "Kreikka"
#: paperless/settings/__init__.py:555
#: paperless/settings/__init__.py:566
msgid "English (GB)"
msgstr "Englanti (US)"
#: paperless/settings/__init__.py:556
#: paperless/settings/__init__.py:567
msgid "Spanish"
msgstr "Espanja"
#: paperless/settings/__init__.py:557
#: paperless/settings/__init__.py:568
msgid "Persian"
msgstr ""
#: paperless/settings/__init__.py:558
#: paperless/settings/__init__.py:569
msgid "Finnish"
msgstr "Suomi"
#: paperless/settings/__init__.py:559
#: paperless/settings/__init__.py:570
msgid "French"
msgstr "Ranska"
#: paperless/settings/__init__.py:560
#: paperless/settings/__init__.py:571
msgid "Hungarian"
msgstr ""
#: paperless/settings/__init__.py:561
#: paperless/settings/__init__.py:572
msgid "Indonesian"
msgstr ""
#: paperless/settings/__init__.py:562
#: paperless/settings/__init__.py:573
msgid "Italian"
msgstr "Italia"
#: paperless/settings/__init__.py:563
#: paperless/settings/__init__.py:574
msgid "Japanese"
msgstr ""
#: paperless/settings/__init__.py:564
#: paperless/settings/__init__.py:575
msgid "Korean"
msgstr ""
#: paperless/settings/__init__.py:565
#: paperless/settings/__init__.py:576
msgid "Luxembourgish"
msgstr "Luxemburg"
#: paperless/settings/__init__.py:566
#: paperless/settings/__init__.py:577
msgid "Norwegian"
msgstr "Norja"
#: paperless/settings/__init__.py:567
#: paperless/settings/__init__.py:578
msgid "Dutch"
msgstr "Hollanti"
#: paperless/settings/__init__.py:568
#: paperless/settings/__init__.py:579
msgid "Polish"
msgstr "puola"
#: paperless/settings/__init__.py:569
#: paperless/settings/__init__.py:580
msgid "Portuguese (Brazil)"
msgstr "portugali (Brasilia)"
#: paperless/settings/__init__.py:570
#: paperless/settings/__init__.py:581
msgid "Portuguese"
msgstr "portugali"
#: paperless/settings/__init__.py:571
#: paperless/settings/__init__.py:582
msgid "Romanian"
msgstr "romania"
#: paperless/settings/__init__.py:572
#: paperless/settings/__init__.py:583
msgid "Russian"
msgstr "venäjä"
#: paperless/settings/__init__.py:573
#: paperless/settings/__init__.py:584
msgid "Slovak"
msgstr "Slovakia"
#: paperless/settings/__init__.py:574
#: paperless/settings/__init__.py:585
msgid "Slovenian"
msgstr "Slovenia"
#: paperless/settings/__init__.py:575
#: paperless/settings/__init__.py:586
msgid "Serbian"
msgstr "Serbia"
#: paperless/settings/__init__.py:576
#: paperless/settings/__init__.py:587
msgid "Swedish"
msgstr "ruotsi"
#: paperless/settings/__init__.py:577
#: paperless/settings/__init__.py:588
msgid "Turkish"
msgstr "Turkki"
#: paperless/settings/__init__.py:578
#: paperless/settings/__init__.py:589
msgid "Ukrainian"
msgstr "Ukraina"
#: paperless/settings/__init__.py:579
#: paperless/settings/__init__.py:590
msgid "Vietnamese"
msgstr ""
#: paperless/settings/__init__.py:580
#: paperless/settings/__init__.py:591
msgid "Chinese Simplified"
msgstr "Kiina (yksinkertaistettu)"
#: paperless/settings/__init__.py:581
#: paperless/settings/__init__.py:592
msgid "Chinese Traditional"
msgstr ""
+39 -39
View File
@@ -2,8 +2,8 @@ msgid ""
msgstr ""
"Project-Id-Version: paperless-ngx\n"
"Report-Msgid-Bugs-To: \n"
"POT-Creation-Date: 2026-07-23 19:21+0000\n"
"PO-Revision-Date: 2026-07-23 19:23\n"
"POT-Creation-Date: 2026-07-25 07:12+0000\n"
"PO-Revision-Date: 2026-07-25 07:14\n"
"Last-Translator: \n"
"Language-Team: French\n"
"Language: fr_FR\n"
@@ -1919,151 +1919,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:545
#: paperless/settings/__init__.py:556
msgid "English (US)"
msgstr "Anglais (US)"
#: paperless/settings/__init__.py:546
#: paperless/settings/__init__.py:557
msgid "Arabic"
msgstr "Arabe"
#: paperless/settings/__init__.py:547
#: paperless/settings/__init__.py:558
msgid "Afrikaans"
msgstr "Afrikaans"
#: paperless/settings/__init__.py:548
#: paperless/settings/__init__.py:559
msgid "Belarusian"
msgstr "Biélorusse"
#: paperless/settings/__init__.py:549
#: paperless/settings/__init__.py:560
msgid "Bulgarian"
msgstr "Bulgare"
#: paperless/settings/__init__.py:550
#: paperless/settings/__init__.py:561
msgid "Catalan"
msgstr "Catalan"
#: paperless/settings/__init__.py:551
#: paperless/settings/__init__.py:562
msgid "Czech"
msgstr "Tchèque"
#: paperless/settings/__init__.py:552
#: paperless/settings/__init__.py:563
msgid "Danish"
msgstr "Danois"
#: paperless/settings/__init__.py:553
#: paperless/settings/__init__.py:564
msgid "German"
msgstr "Allemand"
#: paperless/settings/__init__.py:554
#: paperless/settings/__init__.py:565
msgid "Greek"
msgstr "Grec"
#: paperless/settings/__init__.py:555
#: paperless/settings/__init__.py:566
msgid "English (GB)"
msgstr "Anglais (GB)"
#: paperless/settings/__init__.py:556
#: paperless/settings/__init__.py:567
msgid "Spanish"
msgstr "Espagnol"
#: paperless/settings/__init__.py:557
#: paperless/settings/__init__.py:568
msgid "Persian"
msgstr "Persan"
#: paperless/settings/__init__.py:558
#: paperless/settings/__init__.py:569
msgid "Finnish"
msgstr "Finnois"
#: paperless/settings/__init__.py:559
#: paperless/settings/__init__.py:570
msgid "French"
msgstr "Français"
#: paperless/settings/__init__.py:560
#: paperless/settings/__init__.py:571
msgid "Hungarian"
msgstr "Hongrois"
#: paperless/settings/__init__.py:561
#: paperless/settings/__init__.py:572
msgid "Indonesian"
msgstr "Indonésien"
#: paperless/settings/__init__.py:562
#: paperless/settings/__init__.py:573
msgid "Italian"
msgstr "Italien"
#: paperless/settings/__init__.py:563
#: paperless/settings/__init__.py:574
msgid "Japanese"
msgstr "Japonais"
#: paperless/settings/__init__.py:564
#: paperless/settings/__init__.py:575
msgid "Korean"
msgstr "Coréen"
#: paperless/settings/__init__.py:565
#: paperless/settings/__init__.py:576
msgid "Luxembourgish"
msgstr "Luxembourgeois"
#: paperless/settings/__init__.py:566
#: paperless/settings/__init__.py:577
msgid "Norwegian"
msgstr "Norvégien"
#: paperless/settings/__init__.py:567
#: paperless/settings/__init__.py:578
msgid "Dutch"
msgstr "Néerlandais"
#: paperless/settings/__init__.py:568
#: paperless/settings/__init__.py:579
msgid "Polish"
msgstr "Polonais"
#: paperless/settings/__init__.py:569
#: paperless/settings/__init__.py:580
msgid "Portuguese (Brazil)"
msgstr "Portugais (Brésil)"
#: paperless/settings/__init__.py:570
#: paperless/settings/__init__.py:581
msgid "Portuguese"
msgstr "Portugais"
#: paperless/settings/__init__.py:571
#: paperless/settings/__init__.py:582
msgid "Romanian"
msgstr "Roumain"
#: paperless/settings/__init__.py:572
#: paperless/settings/__init__.py:583
msgid "Russian"
msgstr "Russe"
#: paperless/settings/__init__.py:573
#: paperless/settings/__init__.py:584
msgid "Slovak"
msgstr "Solvaque"
#: paperless/settings/__init__.py:574
#: paperless/settings/__init__.py:585
msgid "Slovenian"
msgstr "Slovène"
#: paperless/settings/__init__.py:575
#: paperless/settings/__init__.py:586
msgid "Serbian"
msgstr "Serbe"
#: paperless/settings/__init__.py:576
#: paperless/settings/__init__.py:587
msgid "Swedish"
msgstr "Suédois"
#: paperless/settings/__init__.py:577
#: paperless/settings/__init__.py:588
msgid "Turkish"
msgstr "Turc"
#: paperless/settings/__init__.py:578
#: paperless/settings/__init__.py:589
msgid "Ukrainian"
msgstr "Ukrainien"
#: paperless/settings/__init__.py:579
#: paperless/settings/__init__.py:590
msgid "Vietnamese"
msgstr "Vietnamien"
#: paperless/settings/__init__.py:580
#: paperless/settings/__init__.py:591
msgid "Chinese Simplified"
msgstr "Chinois simplifié"
#: paperless/settings/__init__.py:581
#: paperless/settings/__init__.py:592
msgid "Chinese Traditional"
msgstr "Chinois traditionnel"
+39 -39
View File
@@ -2,8 +2,8 @@ msgid ""
msgstr ""
"Project-Id-Version: paperless-ngx\n"
"Report-Msgid-Bugs-To: \n"
"POT-Creation-Date: 2026-07-23 19:21+0000\n"
"PO-Revision-Date: 2026-07-23 19:23\n"
"POT-Creation-Date: 2026-07-25 07:12+0000\n"
"PO-Revision-Date: 2026-07-25 07:14\n"
"Last-Translator: \n"
"Language-Team: Hebrew\n"
"Language: he_IL\n"
@@ -1921,151 +1921,151 @@ msgstr ""
msgid "paperless application settings"
msgstr "הגדרות יישום paperless"
#: paperless/settings/__init__.py:545
#: paperless/settings/__init__.py:556
msgid "English (US)"
msgstr "אנגלית (ארה״ב)"
#: paperless/settings/__init__.py:546
#: paperless/settings/__init__.py:557
msgid "Arabic"
msgstr "ערבית"
#: paperless/settings/__init__.py:547
#: paperless/settings/__init__.py:558
msgid "Afrikaans"
msgstr "אפריקאנס"
#: paperless/settings/__init__.py:548
#: paperless/settings/__init__.py:559
msgid "Belarusian"
msgstr "בלרוסית"
#: paperless/settings/__init__.py:549
#: paperless/settings/__init__.py:560
msgid "Bulgarian"
msgstr "בולגרית"
#: paperless/settings/__init__.py:550
#: paperless/settings/__init__.py:561
msgid "Catalan"
msgstr "קטלאנית"
#: paperless/settings/__init__.py:551
#: paperless/settings/__init__.py:562
msgid "Czech"
msgstr "צ'כית"
#: paperless/settings/__init__.py:552
#: paperless/settings/__init__.py:563
msgid "Danish"
msgstr "דנית"
#: paperless/settings/__init__.py:553
#: paperless/settings/__init__.py:564
msgid "German"
msgstr "גרמנית"
#: paperless/settings/__init__.py:554
#: paperless/settings/__init__.py:565
msgid "Greek"
msgstr "יוונית"
#: paperless/settings/__init__.py:555
#: paperless/settings/__init__.py:566
msgid "English (GB)"
msgstr "אנגלית (בריטניה)"
#: paperless/settings/__init__.py:556
#: paperless/settings/__init__.py:567
msgid "Spanish"
msgstr "ספרדית"
#: paperless/settings/__init__.py:557
#: paperless/settings/__init__.py:568
msgid "Persian"
msgstr "פרסית"
#: paperless/settings/__init__.py:558
#: paperless/settings/__init__.py:569
msgid "Finnish"
msgstr "פינית"
#: paperless/settings/__init__.py:559
#: paperless/settings/__init__.py:570
msgid "French"
msgstr "צרפתית"
#: paperless/settings/__init__.py:560
#: paperless/settings/__init__.py:571
msgid "Hungarian"
msgstr "הונגרית"
#: paperless/settings/__init__.py:561
#: paperless/settings/__init__.py:572
msgid "Indonesian"
msgstr "אינדונזית"
#: paperless/settings/__init__.py:562
#: paperless/settings/__init__.py:573
msgid "Italian"
msgstr "איטלקית"
#: paperless/settings/__init__.py:563
#: paperless/settings/__init__.py:574
msgid "Japanese"
msgstr "יפנית"
#: paperless/settings/__init__.py:564
#: paperless/settings/__init__.py:575
msgid "Korean"
msgstr "קוריאנית"
#: paperless/settings/__init__.py:565
#: paperless/settings/__init__.py:576
msgid "Luxembourgish"
msgstr "לוקסמבורגית"
#: paperless/settings/__init__.py:566
#: paperless/settings/__init__.py:577
msgid "Norwegian"
msgstr "נורווגית"
#: paperless/settings/__init__.py:567
#: paperless/settings/__init__.py:578
msgid "Dutch"
msgstr "הולנדית"
#: paperless/settings/__init__.py:568
#: paperless/settings/__init__.py:579
msgid "Polish"
msgstr "פולנית"
#: paperless/settings/__init__.py:569
#: paperless/settings/__init__.py:580
msgid "Portuguese (Brazil)"
msgstr "פורטוגלית ברזילאית"
#: paperless/settings/__init__.py:570
#: paperless/settings/__init__.py:581
msgid "Portuguese"
msgstr "פורטוגלית"
#: paperless/settings/__init__.py:571
#: paperless/settings/__init__.py:582
msgid "Romanian"
msgstr "רומנית"
#: paperless/settings/__init__.py:572
#: paperless/settings/__init__.py:583
msgid "Russian"
msgstr "רוסית"
#: paperless/settings/__init__.py:573
#: paperless/settings/__init__.py:584
msgid "Slovak"
msgstr "סלובקית"
#: paperless/settings/__init__.py:574
#: paperless/settings/__init__.py:585
msgid "Slovenian"
msgstr "סלובנית"
#: paperless/settings/__init__.py:575
#: paperless/settings/__init__.py:586
msgid "Serbian"
msgstr "סרבית"
#: paperless/settings/__init__.py:576
#: paperless/settings/__init__.py:587
msgid "Swedish"
msgstr "שוודית"
#: paperless/settings/__init__.py:577
#: paperless/settings/__init__.py:588
msgid "Turkish"
msgstr "טורקית"
#: paperless/settings/__init__.py:578
#: paperless/settings/__init__.py:589
msgid "Ukrainian"
msgstr "אוקראינית"
#: paperless/settings/__init__.py:579
#: paperless/settings/__init__.py:590
msgid "Vietnamese"
msgstr "ווייטנאמית"
#: paperless/settings/__init__.py:580
#: paperless/settings/__init__.py:591
msgid "Chinese Simplified"
msgstr "סינית מפושטת"
#: paperless/settings/__init__.py:581
#: paperless/settings/__init__.py:592
msgid "Chinese Traditional"
msgstr "סינית מסורתית"
+39 -39
View File
@@ -2,8 +2,8 @@ msgid ""
msgstr ""
"Project-Id-Version: paperless-ngx\n"
"Report-Msgid-Bugs-To: \n"
"POT-Creation-Date: 2026-07-23 19:21+0000\n"
"PO-Revision-Date: 2026-07-23 19:23\n"
"POT-Creation-Date: 2026-07-25 07:12+0000\n"
"PO-Revision-Date: 2026-07-25 07:14\n"
"Last-Translator: \n"
"Language-Team: Hindi\n"
"Language: hi_IN\n"
@@ -1919,151 +1919,151 @@ msgstr ""
msgid "paperless application settings"
msgstr ""
#: paperless/settings/__init__.py:545
#: paperless/settings/__init__.py:556
msgid "English (US)"
msgstr ""
#: paperless/settings/__init__.py:546
#: paperless/settings/__init__.py:557
msgid "Arabic"
msgstr ""
#: paperless/settings/__init__.py:547
#: paperless/settings/__init__.py:558
msgid "Afrikaans"
msgstr ""
#: paperless/settings/__init__.py:548
#: paperless/settings/__init__.py:559
msgid "Belarusian"
msgstr ""
#: paperless/settings/__init__.py:549
#: paperless/settings/__init__.py:560
msgid "Bulgarian"
msgstr ""
#: paperless/settings/__init__.py:550
#: paperless/settings/__init__.py:561
msgid "Catalan"
msgstr ""
#: paperless/settings/__init__.py:551
#: paperless/settings/__init__.py:562
msgid "Czech"
msgstr ""
#: paperless/settings/__init__.py:552
#: paperless/settings/__init__.py:563
msgid "Danish"
msgstr ""
#: paperless/settings/__init__.py:553
#: paperless/settings/__init__.py:564
msgid "German"
msgstr ""
#: paperless/settings/__init__.py:554
#: paperless/settings/__init__.py:565
msgid "Greek"
msgstr ""
#: paperless/settings/__init__.py:555
#: paperless/settings/__init__.py:566
msgid "English (GB)"
msgstr ""
#: paperless/settings/__init__.py:556
#: paperless/settings/__init__.py:567
msgid "Spanish"
msgstr ""
#: paperless/settings/__init__.py:557
#: paperless/settings/__init__.py:568
msgid "Persian"
msgstr ""
#: paperless/settings/__init__.py:558
#: paperless/settings/__init__.py:569
msgid "Finnish"
msgstr ""
#: paperless/settings/__init__.py:559
#: paperless/settings/__init__.py:570
msgid "French"
msgstr ""
#: paperless/settings/__init__.py:560
#: paperless/settings/__init__.py:571
msgid "Hungarian"
msgstr ""
#: paperless/settings/__init__.py:561
#: paperless/settings/__init__.py:572
msgid "Indonesian"
msgstr ""
#: paperless/settings/__init__.py:562
#: paperless/settings/__init__.py:573
msgid "Italian"
msgstr ""
#: paperless/settings/__init__.py:563
#: paperless/settings/__init__.py:574
msgid "Japanese"
msgstr ""
#: paperless/settings/__init__.py:564
#: paperless/settings/__init__.py:575
msgid "Korean"
msgstr ""
#: paperless/settings/__init__.py:565
#: paperless/settings/__init__.py:576
msgid "Luxembourgish"
msgstr ""
#: paperless/settings/__init__.py:566
#: paperless/settings/__init__.py:577
msgid "Norwegian"
msgstr ""
#: paperless/settings/__init__.py:567
#: paperless/settings/__init__.py:578
msgid "Dutch"
msgstr ""
#: paperless/settings/__init__.py:568
#: paperless/settings/__init__.py:579
msgid "Polish"
msgstr ""
#: paperless/settings/__init__.py:569
#: paperless/settings/__init__.py:580
msgid "Portuguese (Brazil)"
msgstr ""
#: paperless/settings/__init__.py:570
#: paperless/settings/__init__.py:581
msgid "Portuguese"
msgstr ""
#: paperless/settings/__init__.py:571
#: paperless/settings/__init__.py:582
msgid "Romanian"
msgstr ""
#: paperless/settings/__init__.py:572
#: paperless/settings/__init__.py:583
msgid "Russian"
msgstr ""
#: paperless/settings/__init__.py:573
#: paperless/settings/__init__.py:584
msgid "Slovak"
msgstr ""
#: paperless/settings/__init__.py:574
#: paperless/settings/__init__.py:585
msgid "Slovenian"
msgstr ""
#: paperless/settings/__init__.py:575
#: paperless/settings/__init__.py:586
msgid "Serbian"
msgstr ""
#: paperless/settings/__init__.py:576
#: paperless/settings/__init__.py:587
msgid "Swedish"
msgstr ""
#: paperless/settings/__init__.py:577
#: paperless/settings/__init__.py:588
msgid "Turkish"
msgstr ""
#: paperless/settings/__init__.py:578
#: paperless/settings/__init__.py:589
msgid "Ukrainian"
msgstr ""
#: paperless/settings/__init__.py:579
#: paperless/settings/__init__.py:590
msgid "Vietnamese"
msgstr ""
#: paperless/settings/__init__.py:580
#: paperless/settings/__init__.py:591
msgid "Chinese Simplified"
msgstr ""
#: paperless/settings/__init__.py:581
#: paperless/settings/__init__.py:592
msgid "Chinese Traditional"
msgstr ""
+39 -39
View File
@@ -2,8 +2,8 @@ msgid ""
msgstr ""
"Project-Id-Version: paperless-ngx\n"
"Report-Msgid-Bugs-To: \n"
"POT-Creation-Date: 2026-07-23 19:21+0000\n"
"PO-Revision-Date: 2026-07-23 19:23\n"
"POT-Creation-Date: 2026-07-25 07:12+0000\n"
"PO-Revision-Date: 2026-07-25 07:14\n"
"Last-Translator: \n"
"Language-Team: Croatian\n"
"Language: hr_HR\n"
@@ -1920,151 +1920,151 @@ msgstr ""
msgid "paperless application settings"
msgstr "postavke paperless aplikacije"
#: paperless/settings/__init__.py:545
#: paperless/settings/__init__.py:556
msgid "English (US)"
msgstr "Engleski (US)"
#: paperless/settings/__init__.py:546
#: paperless/settings/__init__.py:557
msgid "Arabic"
msgstr "Arapski"
#: paperless/settings/__init__.py:547
#: paperless/settings/__init__.py:558
msgid "Afrikaans"
msgstr "afrički"
#: paperless/settings/__init__.py:548
#: paperless/settings/__init__.py:559
msgid "Belarusian"
msgstr "Bjeloruski"
#: paperless/settings/__init__.py:549
#: paperless/settings/__init__.py:560
msgid "Bulgarian"
msgstr "bugarski"
#: paperless/settings/__init__.py:550
#: paperless/settings/__init__.py:561
msgid "Catalan"
msgstr "katalonski"
#: paperless/settings/__init__.py:551
#: paperless/settings/__init__.py:562
msgid "Czech"
msgstr "Češki"
#: paperless/settings/__init__.py:552
#: paperless/settings/__init__.py:563
msgid "Danish"
msgstr "Danski"
#: paperless/settings/__init__.py:553
#: paperless/settings/__init__.py:564
msgid "German"
msgstr "Njemački"
#: paperless/settings/__init__.py:554
#: paperless/settings/__init__.py:565
msgid "Greek"
msgstr "grčki"
#: paperless/settings/__init__.py:555
#: paperless/settings/__init__.py:566
msgid "English (GB)"
msgstr "Engleski (GB)"
#: paperless/settings/__init__.py:556
#: paperless/settings/__init__.py:567
msgid "Spanish"
msgstr "Španjolski"
#: paperless/settings/__init__.py:557
#: paperless/settings/__init__.py:568
msgid "Persian"
msgstr "perzijski"
#: paperless/settings/__init__.py:558
#: paperless/settings/__init__.py:569
msgid "Finnish"
msgstr "finski"
#: paperless/settings/__init__.py:559
#: paperless/settings/__init__.py:570
msgid "French"
msgstr "Francuski"
#: paperless/settings/__init__.py:560
#: paperless/settings/__init__.py:571
msgid "Hungarian"
msgstr "mađarski"
#: paperless/settings/__init__.py:561
#: paperless/settings/__init__.py:572
msgid "Indonesian"
msgstr "Iidonezijski"
#: paperless/settings/__init__.py:562
#: paperless/settings/__init__.py:573
msgid "Italian"
msgstr "Talijanski"
#: paperless/settings/__init__.py:563
#: paperless/settings/__init__.py:574
msgid "Japanese"
msgstr "japanski"
#: paperless/settings/__init__.py:564
#: paperless/settings/__init__.py:575
msgid "Korean"
msgstr "koreanski"
#: paperless/settings/__init__.py:565
#: paperless/settings/__init__.py:576
msgid "Luxembourgish"
msgstr "Luksemburški"
#: paperless/settings/__init__.py:566
#: paperless/settings/__init__.py:577
msgid "Norwegian"
msgstr "norveški"
#: paperless/settings/__init__.py:567
#: paperless/settings/__init__.py:578
msgid "Dutch"
msgstr "Nizozemski"
#: paperless/settings/__init__.py:568
#: paperless/settings/__init__.py:579
msgid "Polish"
msgstr "Poljski"
#: paperless/settings/__init__.py:569
#: paperless/settings/__init__.py:580
msgid "Portuguese (Brazil)"
msgstr "Portugalski (Brazil)"
#: paperless/settings/__init__.py:570
#: paperless/settings/__init__.py:581
msgid "Portuguese"
msgstr "Portugalski"
#: paperless/settings/__init__.py:571
#: paperless/settings/__init__.py:582
msgid "Romanian"
msgstr "Rumunjski"
#: paperless/settings/__init__.py:572
#: paperless/settings/__init__.py:583
msgid "Russian"
msgstr "Ruski"
#: paperless/settings/__init__.py:573
#: paperless/settings/__init__.py:584
msgid "Slovak"
msgstr "slovački"
#: paperless/settings/__init__.py:574
#: paperless/settings/__init__.py:585
msgid "Slovenian"
msgstr "Slovenski"
#: paperless/settings/__init__.py:575
#: paperless/settings/__init__.py:586
msgid "Serbian"
msgstr "Srpski"
#: paperless/settings/__init__.py:576
#: paperless/settings/__init__.py:587
msgid "Swedish"
msgstr "Švedski"
#: paperless/settings/__init__.py:577
#: paperless/settings/__init__.py:588
msgid "Turkish"
msgstr "Turski"
#: paperless/settings/__init__.py:578
#: paperless/settings/__init__.py:589
msgid "Ukrainian"
msgstr "ukrajinski"
#: paperless/settings/__init__.py:579
#: paperless/settings/__init__.py:590
msgid "Vietnamese"
msgstr "vijetnamski"
#: paperless/settings/__init__.py:580
#: paperless/settings/__init__.py:591
msgid "Chinese Simplified"
msgstr "Pojednostavljeni kineski"
#: paperless/settings/__init__.py:581
#: paperless/settings/__init__.py:592
msgid "Chinese Traditional"
msgstr "Kineski tradicionalni"
+39 -39
View File
@@ -2,8 +2,8 @@ msgid ""
msgstr ""
"Project-Id-Version: paperless-ngx\n"
"Report-Msgid-Bugs-To: \n"
"POT-Creation-Date: 2026-07-23 19:21+0000\n"
"PO-Revision-Date: 2026-07-23 19:23\n"
"POT-Creation-Date: 2026-07-25 07:12+0000\n"
"PO-Revision-Date: 2026-07-25 07:14\n"
"Last-Translator: \n"
"Language-Team: Hungarian\n"
"Language: hu_HU\n"
@@ -1920,151 +1920,151 @@ msgstr ""
msgid "paperless application settings"
msgstr "paperless alkalmazás beállítások"
#: paperless/settings/__init__.py:545
#: paperless/settings/__init__.py:556
msgid "English (US)"
msgstr "Angol (US)"
#: paperless/settings/__init__.py:546
#: paperless/settings/__init__.py:557
msgid "Arabic"
msgstr "Arab"
#: paperless/settings/__init__.py:547
#: paperless/settings/__init__.py:558
msgid "Afrikaans"
msgstr "Afrikai"
#: paperless/settings/__init__.py:548
#: paperless/settings/__init__.py:559
msgid "Belarusian"
msgstr "Fehérorosz"
#: paperless/settings/__init__.py:549
#: paperless/settings/__init__.py:560
msgid "Bulgarian"
msgstr "Bolgár"
#: paperless/settings/__init__.py:550
#: paperless/settings/__init__.py:561
msgid "Catalan"
msgstr "Katalán"
#: paperless/settings/__init__.py:551
#: paperless/settings/__init__.py:562
msgid "Czech"
msgstr "Cseh"
#: paperless/settings/__init__.py:552
#: paperless/settings/__init__.py:563
msgid "Danish"
msgstr "Dán"
#: paperless/settings/__init__.py:553
#: paperless/settings/__init__.py:564
msgid "German"
msgstr "Német"
#: paperless/settings/__init__.py:554
#: paperless/settings/__init__.py:565
msgid "Greek"
msgstr "Görög"
#: paperless/settings/__init__.py:555
#: paperless/settings/__init__.py:566
msgid "English (GB)"
msgstr "Angol (GB)"
#: paperless/settings/__init__.py:556
#: paperless/settings/__init__.py:567
msgid "Spanish"
msgstr "Spanyol"
#: paperless/settings/__init__.py:557
#: paperless/settings/__init__.py:568
msgid "Persian"
msgstr "Perzsa"
#: paperless/settings/__init__.py:558
#: paperless/settings/__init__.py:569
msgid "Finnish"
msgstr "Finn"
#: paperless/settings/__init__.py:559
#: paperless/settings/__init__.py:570
msgid "French"
msgstr "Francia"
#: paperless/settings/__init__.py:560
#: paperless/settings/__init__.py:571
msgid "Hungarian"
msgstr "Magyar"
#: paperless/settings/__init__.py:561
#: paperless/settings/__init__.py:572
msgid "Indonesian"
msgstr "Indonéz"
#: paperless/settings/__init__.py:562
#: paperless/settings/__init__.py:573
msgid "Italian"
msgstr "Olasz"
#: paperless/settings/__init__.py:563
#: paperless/settings/__init__.py:574
msgid "Japanese"
msgstr "Japán"
#: paperless/settings/__init__.py:564
#: paperless/settings/__init__.py:575
msgid "Korean"
msgstr "Koreai"
#: paperless/settings/__init__.py:565
#: paperless/settings/__init__.py:576
msgid "Luxembourgish"
msgstr "Luxemburgi"
#: paperless/settings/__init__.py:566
#: paperless/settings/__init__.py:577
msgid "Norwegian"
msgstr "Norvég"
#: paperless/settings/__init__.py:567
#: paperless/settings/__init__.py:578
msgid "Dutch"
msgstr "Holland"
#: paperless/settings/__init__.py:568
#: paperless/settings/__init__.py:579
msgid "Polish"
msgstr "Lengyel"
#: paperless/settings/__init__.py:569
#: paperless/settings/__init__.py:580
msgid "Portuguese (Brazil)"
msgstr "Portugál (Brazília)"
#: paperless/settings/__init__.py:570
#: paperless/settings/__init__.py:581
msgid "Portuguese"
msgstr "Portugál"
#: paperless/settings/__init__.py:571
#: paperless/settings/__init__.py:582
msgid "Romanian"
msgstr "Román"
#: paperless/settings/__init__.py:572
#: paperless/settings/__init__.py:583
msgid "Russian"
msgstr "Orosz"
#: paperless/settings/__init__.py:573
#: paperless/settings/__init__.py:584
msgid "Slovak"
msgstr "Szlovák"
#: paperless/settings/__init__.py:574
#: paperless/settings/__init__.py:585
msgid "Slovenian"
msgstr "Szlovén"
#: paperless/settings/__init__.py:575
#: paperless/settings/__init__.py:586
msgid "Serbian"
msgstr "Szerb"
#: paperless/settings/__init__.py:576
#: paperless/settings/__init__.py:587
msgid "Swedish"
msgstr "Svéd"
#: paperless/settings/__init__.py:577
#: paperless/settings/__init__.py:588
msgid "Turkish"
msgstr "Török"
#: paperless/settings/__init__.py:578
#: paperless/settings/__init__.py:589
msgid "Ukrainian"
msgstr "Ukrán"
#: paperless/settings/__init__.py:579
#: paperless/settings/__init__.py:590
msgid "Vietnamese"
msgstr "Vietnámi"
#: paperless/settings/__init__.py:580
#: paperless/settings/__init__.py:591
msgid "Chinese Simplified"
msgstr "Kínai egyszerűsített"
#: paperless/settings/__init__.py:581
#: paperless/settings/__init__.py:592
msgid "Chinese Traditional"
msgstr "Tradicionális kínai"
+39 -39
View File
@@ -2,8 +2,8 @@ msgid ""
msgstr ""
"Project-Id-Version: paperless-ngx\n"
"Report-Msgid-Bugs-To: \n"
"POT-Creation-Date: 2026-07-23 19:21+0000\n"
"PO-Revision-Date: 2026-07-23 19:23\n"
"POT-Creation-Date: 2026-07-25 07:12+0000\n"
"PO-Revision-Date: 2026-07-25 07:14\n"
"Last-Translator: \n"
"Language-Team: Indonesian\n"
"Language: id_ID\n"
@@ -1920,151 +1920,151 @@ msgstr ""
msgid "paperless application settings"
msgstr "pengaturan aplikasi paperless"
#: paperless/settings/__init__.py:545
#: paperless/settings/__init__.py:556
msgid "English (US)"
msgstr "Inggris (AS)"
#: paperless/settings/__init__.py:546
#: paperless/settings/__init__.py:557
msgid "Arabic"
msgstr "Arab"
#: paperless/settings/__init__.py:547
#: paperless/settings/__init__.py:558
msgid "Afrikaans"
msgstr "Bahasa Afrika"
#: paperless/settings/__init__.py:548
#: paperless/settings/__init__.py:559
msgid "Belarusian"
msgstr "Belarusia"
#: paperless/settings/__init__.py:549
#: paperless/settings/__init__.py:560
msgid "Bulgarian"
msgstr "Bahasa Bulgaria"
#: paperless/settings/__init__.py:550
#: paperless/settings/__init__.py:561
msgid "Catalan"
msgstr "Katalan"
#: paperless/settings/__init__.py:551
#: paperless/settings/__init__.py:562
msgid "Czech"
msgstr "Bahasa Ceko"
#: paperless/settings/__init__.py:552
#: paperless/settings/__init__.py:563
msgid "Danish"
msgstr "Denmark"
#: paperless/settings/__init__.py:553
#: paperless/settings/__init__.py:564
msgid "German"
msgstr "Jerman"
#: paperless/settings/__init__.py:554
#: paperless/settings/__init__.py:565
msgid "Greek"
msgstr "Yunani"
#: paperless/settings/__init__.py:555
#: paperless/settings/__init__.py:566
msgid "English (GB)"
msgstr "Inggris (GB)"
#: paperless/settings/__init__.py:556
#: paperless/settings/__init__.py:567
msgid "Spanish"
msgstr "Spanyol"
#: paperless/settings/__init__.py:557
#: paperless/settings/__init__.py:568
msgid "Persian"
msgstr "Persia"
#: paperless/settings/__init__.py:558
#: paperless/settings/__init__.py:569
msgid "Finnish"
msgstr "Finlandia"
#: paperless/settings/__init__.py:559
#: paperless/settings/__init__.py:570
msgid "French"
msgstr "Prancis"
#: paperless/settings/__init__.py:560
#: paperless/settings/__init__.py:571
msgid "Hungarian"
msgstr "Hungaria"
#: paperless/settings/__init__.py:561
#: paperless/settings/__init__.py:572
msgid "Indonesian"
msgstr "Indonesia"
#: paperless/settings/__init__.py:562
#: paperless/settings/__init__.py:573
msgid "Italian"
msgstr "Italia"
#: paperless/settings/__init__.py:563
#: paperless/settings/__init__.py:574
msgid "Japanese"
msgstr "Bahasa Jepang"
#: paperless/settings/__init__.py:564
#: paperless/settings/__init__.py:575
msgid "Korean"
msgstr "Bahasa Korea"
#: paperless/settings/__init__.py:565
#: paperless/settings/__init__.py:576
msgid "Luxembourgish"
msgstr "Luksemburg"
#: paperless/settings/__init__.py:566
#: paperless/settings/__init__.py:577
msgid "Norwegian"
msgstr "Norwegia"
#: paperless/settings/__init__.py:567
#: paperless/settings/__init__.py:578
msgid "Dutch"
msgstr "Belanda"
#: paperless/settings/__init__.py:568
#: paperless/settings/__init__.py:579
msgid "Polish"
msgstr "Polandia"
#: paperless/settings/__init__.py:569
#: paperless/settings/__init__.py:580
msgid "Portuguese (Brazil)"
msgstr "Portugis (Brasil)"
#: paperless/settings/__init__.py:570
#: paperless/settings/__init__.py:581
msgid "Portuguese"
msgstr "Portugis"
#: paperless/settings/__init__.py:571
#: paperless/settings/__init__.py:582
msgid "Romanian"
msgstr "Rumania"
#: paperless/settings/__init__.py:572
#: paperless/settings/__init__.py:583
msgid "Russian"
msgstr "Rusia"
#: paperless/settings/__init__.py:573
#: paperless/settings/__init__.py:584
msgid "Slovak"
msgstr "Slovakia"
#: paperless/settings/__init__.py:574
#: paperless/settings/__init__.py:585
msgid "Slovenian"
msgstr "Slovenia"
#: paperless/settings/__init__.py:575
#: paperless/settings/__init__.py:586
msgid "Serbian"
msgstr "Serbia"
#: paperless/settings/__init__.py:576
#: paperless/settings/__init__.py:587
msgid "Swedish"
msgstr "Swedia"
#: paperless/settings/__init__.py:577
#: paperless/settings/__init__.py:588
msgid "Turkish"
msgstr "Turki"
#: paperless/settings/__init__.py:578
#: paperless/settings/__init__.py:589
msgid "Ukrainian"
msgstr "Ukraina"
#: paperless/settings/__init__.py:579
#: paperless/settings/__init__.py:590
msgid "Vietnamese"
msgstr "Vietnam"
#: paperless/settings/__init__.py:580
#: paperless/settings/__init__.py:591
msgid "Chinese Simplified"
msgstr "Mandarin Sederhana"
#: paperless/settings/__init__.py:581
#: paperless/settings/__init__.py:592
msgid "Chinese Traditional"
msgstr "Tionghoa Tradisional"
+39 -39
View File
@@ -2,8 +2,8 @@ msgid ""
msgstr ""
"Project-Id-Version: paperless-ngx\n"
"Report-Msgid-Bugs-To: \n"
"POT-Creation-Date: 2026-07-23 19:21+0000\n"
"PO-Revision-Date: 2026-07-23 19:23\n"
"POT-Creation-Date: 2026-07-25 07:12+0000\n"
"PO-Revision-Date: 2026-07-25 07:14\n"
"Last-Translator: \n"
"Language-Team: Italian\n"
"Language: it_IT\n"
@@ -1920,151 +1920,151 @@ msgstr "Impostare il timeout dellLLM in secondi"
msgid "paperless application settings"
msgstr "impostazioni dell'applicazione paperless"
#: paperless/settings/__init__.py:545
#: paperless/settings/__init__.py:556
msgid "English (US)"
msgstr "Inglese (US)"
#: paperless/settings/__init__.py:546
#: paperless/settings/__init__.py:557
msgid "Arabic"
msgstr "Arabo"
#: paperless/settings/__init__.py:547
#: paperless/settings/__init__.py:558
msgid "Afrikaans"
msgstr "Afrikaans"
#: paperless/settings/__init__.py:548
#: paperless/settings/__init__.py:559
msgid "Belarusian"
msgstr "Bielorusso"
#: paperless/settings/__init__.py:549
#: paperless/settings/__init__.py:560
msgid "Bulgarian"
msgstr "Bulgaro"
#: paperless/settings/__init__.py:550
#: paperless/settings/__init__.py:561
msgid "Catalan"
msgstr "Catalano"
#: paperless/settings/__init__.py:551
#: paperless/settings/__init__.py:562
msgid "Czech"
msgstr "Ceco"
#: paperless/settings/__init__.py:552
#: paperless/settings/__init__.py:563
msgid "Danish"
msgstr "Danese"
#: paperless/settings/__init__.py:553
#: paperless/settings/__init__.py:564
msgid "German"
msgstr "Tedesco"
#: paperless/settings/__init__.py:554
#: paperless/settings/__init__.py:565
msgid "Greek"
msgstr "Greco"
#: paperless/settings/__init__.py:555
#: paperless/settings/__init__.py:566
msgid "English (GB)"
msgstr "Inglese (GB)"
#: paperless/settings/__init__.py:556
#: paperless/settings/__init__.py:567
msgid "Spanish"
msgstr "Spagnolo"
#: paperless/settings/__init__.py:557
#: paperless/settings/__init__.py:568
msgid "Persian"
msgstr "Persiano"
#: paperless/settings/__init__.py:558
#: paperless/settings/__init__.py:569
msgid "Finnish"
msgstr "Finlandese"
#: paperless/settings/__init__.py:559
#: paperless/settings/__init__.py:570
msgid "French"
msgstr "Francese"
#: paperless/settings/__init__.py:560
#: paperless/settings/__init__.py:571
msgid "Hungarian"
msgstr "Ungherese"
#: paperless/settings/__init__.py:561
#: paperless/settings/__init__.py:572
msgid "Indonesian"
msgstr "Indonesiano"
#: paperless/settings/__init__.py:562
#: paperless/settings/__init__.py:573
msgid "Italian"
msgstr "Italiano"
#: paperless/settings/__init__.py:563
#: paperless/settings/__init__.py:574
msgid "Japanese"
msgstr "Giapponese"
#: paperless/settings/__init__.py:564
#: paperless/settings/__init__.py:575
msgid "Korean"
msgstr "Coreano"
#: paperless/settings/__init__.py:565
#: paperless/settings/__init__.py:576
msgid "Luxembourgish"
msgstr "Lussemburghese"
#: paperless/settings/__init__.py:566
#: paperless/settings/__init__.py:577
msgid "Norwegian"
msgstr "Norvegese"
#: paperless/settings/__init__.py:567
#: paperless/settings/__init__.py:578
msgid "Dutch"
msgstr "Olandese"
#: paperless/settings/__init__.py:568
#: paperless/settings/__init__.py:579
msgid "Polish"
msgstr "Polacco"
#: paperless/settings/__init__.py:569
#: paperless/settings/__init__.py:580
msgid "Portuguese (Brazil)"
msgstr "Portoghese (Brasile)"
#: paperless/settings/__init__.py:570
#: paperless/settings/__init__.py:581
msgid "Portuguese"
msgstr "Portoghese"
#: paperless/settings/__init__.py:571
#: paperless/settings/__init__.py:582
msgid "Romanian"
msgstr "Rumeno"
#: paperless/settings/__init__.py:572
#: paperless/settings/__init__.py:583
msgid "Russian"
msgstr "Russo"
#: paperless/settings/__init__.py:573
#: paperless/settings/__init__.py:584
msgid "Slovak"
msgstr "Slovacco"
#: paperless/settings/__init__.py:574
#: paperless/settings/__init__.py:585
msgid "Slovenian"
msgstr "Sloveno"
#: paperless/settings/__init__.py:575
#: paperless/settings/__init__.py:586
msgid "Serbian"
msgstr "Serbo"
#: paperless/settings/__init__.py:576
#: paperless/settings/__init__.py:587
msgid "Swedish"
msgstr "Svedese"
#: paperless/settings/__init__.py:577
#: paperless/settings/__init__.py:588
msgid "Turkish"
msgstr "Turco"
#: paperless/settings/__init__.py:578
#: paperless/settings/__init__.py:589
msgid "Ukrainian"
msgstr "Ucraino"
#: paperless/settings/__init__.py:579
#: paperless/settings/__init__.py:590
msgid "Vietnamese"
msgstr "Vietnamita"
#: paperless/settings/__init__.py:580
#: paperless/settings/__init__.py:591
msgid "Chinese Simplified"
msgstr "Cinese semplificato"
#: paperless/settings/__init__.py:581
#: paperless/settings/__init__.py:592
msgid "Chinese Traditional"
msgstr "Cinese tradizionale"
+39 -39
View File
@@ -2,8 +2,8 @@ msgid ""
msgstr ""
"Project-Id-Version: paperless-ngx\n"
"Report-Msgid-Bugs-To: \n"
"POT-Creation-Date: 2026-07-23 19:21+0000\n"
"PO-Revision-Date: 2026-07-23 19:23\n"
"POT-Creation-Date: 2026-07-25 07:12+0000\n"
"PO-Revision-Date: 2026-07-25 07:14\n"
"Last-Translator: \n"
"Language-Team: Japanese\n"
"Language: ja_JP\n"
@@ -1920,151 +1920,151 @@ msgstr ""
msgid "paperless application settings"
msgstr "Paperless アプリケーションの設定"
#: paperless/settings/__init__.py:545
#: paperless/settings/__init__.py:556
msgid "English (US)"
msgstr "英語 (米国)"
#: paperless/settings/__init__.py:546
#: paperless/settings/__init__.py:557
msgid "Arabic"
msgstr "アラビア語"
#: paperless/settings/__init__.py:547
#: paperless/settings/__init__.py:558
msgid "Afrikaans"
msgstr "アフリカーンス語"
#: paperless/settings/__init__.py:548
#: paperless/settings/__init__.py:559
msgid "Belarusian"
msgstr "ベラルーシ語"
#: paperless/settings/__init__.py:549
#: paperless/settings/__init__.py:560
msgid "Bulgarian"
msgstr "ブルガリア語"
#: paperless/settings/__init__.py:550
#: paperless/settings/__init__.py:561
msgid "Catalan"
msgstr "カタロニア語"
#: paperless/settings/__init__.py:551
#: paperless/settings/__init__.py:562
msgid "Czech"
msgstr "チェコ語"
#: paperless/settings/__init__.py:552
#: paperless/settings/__init__.py:563
msgid "Danish"
msgstr "デンマーク語"
#: paperless/settings/__init__.py:553
#: paperless/settings/__init__.py:564
msgid "German"
msgstr "ドイツ語"
#: paperless/settings/__init__.py:554
#: paperless/settings/__init__.py:565
msgid "Greek"
msgstr "ギリシャ語"
#: paperless/settings/__init__.py:555
#: paperless/settings/__init__.py:566
msgid "English (GB)"
msgstr "英語 (英国)"
#: paperless/settings/__init__.py:556
#: paperless/settings/__init__.py:567
msgid "Spanish"
msgstr "スペイン語"
#: paperless/settings/__init__.py:557
#: paperless/settings/__init__.py:568
msgid "Persian"
msgstr ""
#: paperless/settings/__init__.py:558
#: paperless/settings/__init__.py:569
msgid "Finnish"
msgstr "フィンランド語"
#: paperless/settings/__init__.py:559
#: paperless/settings/__init__.py:570
msgid "French"
msgstr "フランス語"
#: paperless/settings/__init__.py:560
#: paperless/settings/__init__.py:571
msgid "Hungarian"
msgstr "ハンガリー語"
#: paperless/settings/__init__.py:561
#: paperless/settings/__init__.py:572
msgid "Indonesian"
msgstr ""
#: paperless/settings/__init__.py:562
#: paperless/settings/__init__.py:573
msgid "Italian"
msgstr "イタリア語"
#: paperless/settings/__init__.py:563
#: paperless/settings/__init__.py:574
msgid "Japanese"
msgstr "日本語"
#: paperless/settings/__init__.py:564
#: paperless/settings/__init__.py:575
msgid "Korean"
msgstr "韓国語"
#: paperless/settings/__init__.py:565
#: paperless/settings/__init__.py:576
msgid "Luxembourgish"
msgstr "ルクセンブルク語"
#: paperless/settings/__init__.py:566
#: paperless/settings/__init__.py:577
msgid "Norwegian"
msgstr "ノルウェー語"
#: paperless/settings/__init__.py:567
#: paperless/settings/__init__.py:578
msgid "Dutch"
msgstr "オランダ語"
#: paperless/settings/__init__.py:568
#: paperless/settings/__init__.py:579
msgid "Polish"
msgstr "ポーランド語"
#: paperless/settings/__init__.py:569
#: paperless/settings/__init__.py:580
msgid "Portuguese (Brazil)"
msgstr "ポルトガル語 (ブラジル)"
#: paperless/settings/__init__.py:570
#: paperless/settings/__init__.py:581
msgid "Portuguese"
msgstr "ポルトガル語"
#: paperless/settings/__init__.py:571
#: paperless/settings/__init__.py:582
msgid "Romanian"
msgstr "ルーマニア語"
#: paperless/settings/__init__.py:572
#: paperless/settings/__init__.py:583
msgid "Russian"
msgstr "ロシア語"
#: paperless/settings/__init__.py:573
#: paperless/settings/__init__.py:584
msgid "Slovak"
msgstr "スロバキア語"
#: paperless/settings/__init__.py:574
#: paperless/settings/__init__.py:585
msgid "Slovenian"
msgstr "スロベニア語"
#: paperless/settings/__init__.py:575
#: paperless/settings/__init__.py:586
msgid "Serbian"
msgstr "セルビア語"
#: paperless/settings/__init__.py:576
#: paperless/settings/__init__.py:587
msgid "Swedish"
msgstr "スウェーデン語"
#: paperless/settings/__init__.py:577
#: paperless/settings/__init__.py:588
msgid "Turkish"
msgstr "トルコ語"
#: paperless/settings/__init__.py:578
#: paperless/settings/__init__.py:589
msgid "Ukrainian"
msgstr "ウクライナ語"
#: paperless/settings/__init__.py:579
#: paperless/settings/__init__.py:590
msgid "Vietnamese"
msgstr ""
#: paperless/settings/__init__.py:580
#: paperless/settings/__init__.py:591
msgid "Chinese Simplified"
msgstr "中国語 (簡体字)"
#: paperless/settings/__init__.py:581
#: paperless/settings/__init__.py:592
msgid "Chinese Traditional"
msgstr "中国語 (繁体)"
+39 -39
View File
@@ -2,8 +2,8 @@ msgid ""
msgstr ""
"Project-Id-Version: paperless-ngx\n"
"Report-Msgid-Bugs-To: \n"
"POT-Creation-Date: 2026-07-23 19:21+0000\n"
"PO-Revision-Date: 2026-07-23 19:23\n"
"POT-Creation-Date: 2026-07-25 07:12+0000\n"
"PO-Revision-Date: 2026-07-25 07:14\n"
"Last-Translator: \n"
"Language-Team: Korean\n"
"Language: ko_KR\n"
@@ -1920,151 +1920,151 @@ msgstr ""
msgid "paperless application settings"
msgstr "페이퍼리스 애플리케이션 설정"
#: paperless/settings/__init__.py:545
#: paperless/settings/__init__.py:556
msgid "English (US)"
msgstr "영어 (미국)"
#: paperless/settings/__init__.py:546
#: paperless/settings/__init__.py:557
msgid "Arabic"
msgstr "아랍어"
#: paperless/settings/__init__.py:547
#: paperless/settings/__init__.py:558
msgid "Afrikaans"
msgstr "아프리칸스어"
#: paperless/settings/__init__.py:548
#: paperless/settings/__init__.py:559
msgid "Belarusian"
msgstr "벨라루스어"
#: paperless/settings/__init__.py:549
#: paperless/settings/__init__.py:560
msgid "Bulgarian"
msgstr "불가리어"
#: paperless/settings/__init__.py:550
#: paperless/settings/__init__.py:561
msgid "Catalan"
msgstr "카탈로니아어"
#: paperless/settings/__init__.py:551
#: paperless/settings/__init__.py:562
msgid "Czech"
msgstr "체코어"
#: paperless/settings/__init__.py:552
#: paperless/settings/__init__.py:563
msgid "Danish"
msgstr "덴마크어"
#: paperless/settings/__init__.py:553
#: paperless/settings/__init__.py:564
msgid "German"
msgstr "독일어"
#: paperless/settings/__init__.py:554
#: paperless/settings/__init__.py:565
msgid "Greek"
msgstr "그리스어"
#: paperless/settings/__init__.py:555
#: paperless/settings/__init__.py:566
msgid "English (GB)"
msgstr "영어 (영국)"
#: paperless/settings/__init__.py:556
#: paperless/settings/__init__.py:567
msgid "Spanish"
msgstr "스페인어"
#: paperless/settings/__init__.py:557
#: paperless/settings/__init__.py:568
msgid "Persian"
msgstr "페르시아어"
#: paperless/settings/__init__.py:558
#: paperless/settings/__init__.py:569
msgid "Finnish"
msgstr "핀란드어"
#: paperless/settings/__init__.py:559
#: paperless/settings/__init__.py:570
msgid "French"
msgstr "프랑스어"
#: paperless/settings/__init__.py:560
#: paperless/settings/__init__.py:571
msgid "Hungarian"
msgstr "헝가리어"
#: paperless/settings/__init__.py:561
#: paperless/settings/__init__.py:572
msgid "Indonesian"
msgstr ""
#: paperless/settings/__init__.py:562
#: paperless/settings/__init__.py:573
msgid "Italian"
msgstr "이탈리아어"
#: paperless/settings/__init__.py:563
#: paperless/settings/__init__.py:574
msgid "Japanese"
msgstr "일본어"
#: paperless/settings/__init__.py:564
#: paperless/settings/__init__.py:575
msgid "Korean"
msgstr "한국어"
#: paperless/settings/__init__.py:565
#: paperless/settings/__init__.py:576
msgid "Luxembourgish"
msgstr "룩셈부르크어"
#: paperless/settings/__init__.py:566
#: paperless/settings/__init__.py:577
msgid "Norwegian"
msgstr "노르웨이어"
#: paperless/settings/__init__.py:567
#: paperless/settings/__init__.py:578
msgid "Dutch"
msgstr "네덜란드어"
#: paperless/settings/__init__.py:568
#: paperless/settings/__init__.py:579
msgid "Polish"
msgstr "폴란드어"
#: paperless/settings/__init__.py:569
#: paperless/settings/__init__.py:580
msgid "Portuguese (Brazil)"
msgstr "포르투갈어 (브라질)"
#: paperless/settings/__init__.py:570
#: paperless/settings/__init__.py:581
msgid "Portuguese"
msgstr "포르투갈어"
#: paperless/settings/__init__.py:571
#: paperless/settings/__init__.py:582
msgid "Romanian"
msgstr "루마니아어"
#: paperless/settings/__init__.py:572
#: paperless/settings/__init__.py:583
msgid "Russian"
msgstr "러시아어"
#: paperless/settings/__init__.py:573
#: paperless/settings/__init__.py:584
msgid "Slovak"
msgstr "슬로바키아어"
#: paperless/settings/__init__.py:574
#: paperless/settings/__init__.py:585
msgid "Slovenian"
msgstr "슬로베니아어"
#: paperless/settings/__init__.py:575
#: paperless/settings/__init__.py:586
msgid "Serbian"
msgstr "세르비아어"
#: paperless/settings/__init__.py:576
#: paperless/settings/__init__.py:587
msgid "Swedish"
msgstr "스웨덴어"
#: paperless/settings/__init__.py:577
#: paperless/settings/__init__.py:588
msgid "Turkish"
msgstr "튀르키예어"
#: paperless/settings/__init__.py:578
#: paperless/settings/__init__.py:589
msgid "Ukrainian"
msgstr "우크라이나어"
#: paperless/settings/__init__.py:579
#: paperless/settings/__init__.py:590
msgid "Vietnamese"
msgstr "베트남어"
#: paperless/settings/__init__.py:580
#: paperless/settings/__init__.py:591
msgid "Chinese Simplified"
msgstr "중국어 간체"
#: paperless/settings/__init__.py:581
#: paperless/settings/__init__.py:592
msgid "Chinese Traditional"
msgstr "중국어 번체"
+39 -39
View File
@@ -2,8 +2,8 @@ msgid ""
msgstr ""
"Project-Id-Version: paperless-ngx\n"
"Report-Msgid-Bugs-To: \n"
"POT-Creation-Date: 2026-07-23 19:21+0000\n"
"PO-Revision-Date: 2026-07-23 19:23\n"
"POT-Creation-Date: 2026-07-25 07:12+0000\n"
"PO-Revision-Date: 2026-07-25 07:14\n"
"Last-Translator: \n"
"Language-Team: Luxembourgish\n"
"Language: lb_LU\n"
@@ -1919,151 +1919,151 @@ msgstr ""
msgid "paperless application settings"
msgstr ""
#: paperless/settings/__init__.py:545
#: paperless/settings/__init__.py:556
msgid "English (US)"
msgstr "Englesch (USA)"
#: paperless/settings/__init__.py:546
#: paperless/settings/__init__.py:557
msgid "Arabic"
msgstr ""
#: paperless/settings/__init__.py:547
#: paperless/settings/__init__.py:558
msgid "Afrikaans"
msgstr ""
#: paperless/settings/__init__.py:548
#: paperless/settings/__init__.py:559
msgid "Belarusian"
msgstr "Belarusesch"
#: paperless/settings/__init__.py:549
#: paperless/settings/__init__.py:560
msgid "Bulgarian"
msgstr ""
#: paperless/settings/__init__.py:550
#: paperless/settings/__init__.py:561
msgid "Catalan"
msgstr ""
#: paperless/settings/__init__.py:551
#: paperless/settings/__init__.py:562
msgid "Czech"
msgstr "Tschechesch"
#: paperless/settings/__init__.py:552
#: paperless/settings/__init__.py:563
msgid "Danish"
msgstr "Dänesch"
#: paperless/settings/__init__.py:553
#: paperless/settings/__init__.py:564
msgid "German"
msgstr "Däitsch"
#: paperless/settings/__init__.py:554
#: paperless/settings/__init__.py:565
msgid "Greek"
msgstr ""
#: paperless/settings/__init__.py:555
#: paperless/settings/__init__.py:566
msgid "English (GB)"
msgstr "Englesch (GB)"
#: paperless/settings/__init__.py:556
#: paperless/settings/__init__.py:567
msgid "Spanish"
msgstr "Spuenesch"
#: paperless/settings/__init__.py:557
#: paperless/settings/__init__.py:568
msgid "Persian"
msgstr ""
#: paperless/settings/__init__.py:558
#: paperless/settings/__init__.py:569
msgid "Finnish"
msgstr ""
#: paperless/settings/__init__.py:559
#: paperless/settings/__init__.py:570
msgid "French"
msgstr "Franséisch"
#: paperless/settings/__init__.py:560
#: paperless/settings/__init__.py:571
msgid "Hungarian"
msgstr ""
#: paperless/settings/__init__.py:561
#: paperless/settings/__init__.py:572
msgid "Indonesian"
msgstr ""
#: paperless/settings/__init__.py:562
#: paperless/settings/__init__.py:573
msgid "Italian"
msgstr "Italienesch"
#: paperless/settings/__init__.py:563
#: paperless/settings/__init__.py:574
msgid "Japanese"
msgstr ""
#: paperless/settings/__init__.py:564
#: paperless/settings/__init__.py:575
msgid "Korean"
msgstr ""
#: paperless/settings/__init__.py:565
#: paperless/settings/__init__.py:576
msgid "Luxembourgish"
msgstr "Lëtzebuergesch"
#: paperless/settings/__init__.py:566
#: paperless/settings/__init__.py:577
msgid "Norwegian"
msgstr ""
#: paperless/settings/__init__.py:567
#: paperless/settings/__init__.py:578
msgid "Dutch"
msgstr "Hollännesch"
#: paperless/settings/__init__.py:568
#: paperless/settings/__init__.py:579
msgid "Polish"
msgstr "Polnesch"
#: paperless/settings/__init__.py:569
#: paperless/settings/__init__.py:580
msgid "Portuguese (Brazil)"
msgstr "Portugisesch (Brasilien)"
#: paperless/settings/__init__.py:570
#: paperless/settings/__init__.py:581
msgid "Portuguese"
msgstr "Portugisesch"
#: paperless/settings/__init__.py:571
#: paperless/settings/__init__.py:582
msgid "Romanian"
msgstr "Rumänesch"
#: paperless/settings/__init__.py:572
#: paperless/settings/__init__.py:583
msgid "Russian"
msgstr "Russesch"
#: paperless/settings/__init__.py:573
#: paperless/settings/__init__.py:584
msgid "Slovak"
msgstr ""
#: paperless/settings/__init__.py:574
#: paperless/settings/__init__.py:585
msgid "Slovenian"
msgstr "Slowenesch"
#: paperless/settings/__init__.py:575
#: paperless/settings/__init__.py:586
msgid "Serbian"
msgstr "Serbesch"
#: paperless/settings/__init__.py:576
#: paperless/settings/__init__.py:587
msgid "Swedish"
msgstr "Schwedesch"
#: paperless/settings/__init__.py:577
#: paperless/settings/__init__.py:588
msgid "Turkish"
msgstr "Tierkesch"
#: paperless/settings/__init__.py:578
#: paperless/settings/__init__.py:589
msgid "Ukrainian"
msgstr ""
#: paperless/settings/__init__.py:579
#: paperless/settings/__init__.py:590
msgid "Vietnamese"
msgstr ""
#: paperless/settings/__init__.py:580
#: paperless/settings/__init__.py:591
msgid "Chinese Simplified"
msgstr "Chinesesch (Vereinfacht)"
#: paperless/settings/__init__.py:581
#: paperless/settings/__init__.py:592
msgid "Chinese Traditional"
msgstr ""
+39 -39
View File
@@ -2,8 +2,8 @@ msgid ""
msgstr ""
"Project-Id-Version: paperless-ngx\n"
"Report-Msgid-Bugs-To: \n"
"POT-Creation-Date: 2026-07-23 19:21+0000\n"
"PO-Revision-Date: 2026-07-23 19:23\n"
"POT-Creation-Date: 2026-07-25 07:12+0000\n"
"PO-Revision-Date: 2026-07-25 07:14\n"
"Last-Translator: \n"
"Language-Team: Lithuanian\n"
"Language: lt_LT\n"
@@ -1919,151 +1919,151 @@ msgstr ""
msgid "paperless application settings"
msgstr ""
#: paperless/settings/__init__.py:545
#: paperless/settings/__init__.py:556
msgid "English (US)"
msgstr ""
#: paperless/settings/__init__.py:546
#: paperless/settings/__init__.py:557
msgid "Arabic"
msgstr ""
#: paperless/settings/__init__.py:547
#: paperless/settings/__init__.py:558
msgid "Afrikaans"
msgstr ""
#: paperless/settings/__init__.py:548
#: paperless/settings/__init__.py:559
msgid "Belarusian"
msgstr ""
#: paperless/settings/__init__.py:549
#: paperless/settings/__init__.py:560
msgid "Bulgarian"
msgstr ""
#: paperless/settings/__init__.py:550
#: paperless/settings/__init__.py:561
msgid "Catalan"
msgstr ""
#: paperless/settings/__init__.py:551
#: paperless/settings/__init__.py:562
msgid "Czech"
msgstr ""
#: paperless/settings/__init__.py:552
#: paperless/settings/__init__.py:563
msgid "Danish"
msgstr "Daniškai"
#: paperless/settings/__init__.py:553
#: paperless/settings/__init__.py:564
msgid "German"
msgstr "Vokiškai"
#: paperless/settings/__init__.py:554
#: paperless/settings/__init__.py:565
msgid "Greek"
msgstr "Graikų"
#: paperless/settings/__init__.py:555
#: paperless/settings/__init__.py:566
msgid "English (GB)"
msgstr "Anglų (GB)"
#: paperless/settings/__init__.py:556
#: paperless/settings/__init__.py:567
msgid "Spanish"
msgstr "Ispanų"
#: paperless/settings/__init__.py:557
#: paperless/settings/__init__.py:568
msgid "Persian"
msgstr "Persų"
#: paperless/settings/__init__.py:558
#: paperless/settings/__init__.py:569
msgid "Finnish"
msgstr "Suomių"
#: paperless/settings/__init__.py:559
#: paperless/settings/__init__.py:570
msgid "French"
msgstr "Prancūzų"
#: paperless/settings/__init__.py:560
#: paperless/settings/__init__.py:571
msgid "Hungarian"
msgstr "Vengrų"
#: paperless/settings/__init__.py:561
#: paperless/settings/__init__.py:572
msgid "Indonesian"
msgstr "Indoneziečių"
#: paperless/settings/__init__.py:562
#: paperless/settings/__init__.py:573
msgid "Italian"
msgstr "Italų"
#: paperless/settings/__init__.py:563
#: paperless/settings/__init__.py:574
msgid "Japanese"
msgstr "Japonų"
#: paperless/settings/__init__.py:564
#: paperless/settings/__init__.py:575
msgid "Korean"
msgstr "Korėjiečių"
#: paperless/settings/__init__.py:565
#: paperless/settings/__init__.py:576
msgid "Luxembourgish"
msgstr "Liuksemburgiečių"
#: paperless/settings/__init__.py:566
#: paperless/settings/__init__.py:577
msgid "Norwegian"
msgstr "Norvegų"
#: paperless/settings/__init__.py:567
#: paperless/settings/__init__.py:578
msgid "Dutch"
msgstr "Olandų"
#: paperless/settings/__init__.py:568
#: paperless/settings/__init__.py:579
msgid "Polish"
msgstr "Lenkų"
#: paperless/settings/__init__.py:569
#: paperless/settings/__init__.py:580
msgid "Portuguese (Brazil)"
msgstr "Portugalų (Brazilija)"
#: paperless/settings/__init__.py:570
#: paperless/settings/__init__.py:581
msgid "Portuguese"
msgstr "Portugalų"
#: paperless/settings/__init__.py:571
#: paperless/settings/__init__.py:582
msgid "Romanian"
msgstr "Rumunų"
#: paperless/settings/__init__.py:572
#: paperless/settings/__init__.py:583
msgid "Russian"
msgstr "Rusų"
#: paperless/settings/__init__.py:573
#: paperless/settings/__init__.py:584
msgid "Slovak"
msgstr "Slovakų"
#: paperless/settings/__init__.py:574
#: paperless/settings/__init__.py:585
msgid "Slovenian"
msgstr "Slovėnų"
#: paperless/settings/__init__.py:575
#: paperless/settings/__init__.py:586
msgid "Serbian"
msgstr "Serbų"
#: paperless/settings/__init__.py:576
#: paperless/settings/__init__.py:587
msgid "Swedish"
msgstr "Švedų"
#: paperless/settings/__init__.py:577
#: paperless/settings/__init__.py:588
msgid "Turkish"
msgstr "Turkų"
#: paperless/settings/__init__.py:578
#: paperless/settings/__init__.py:589
msgid "Ukrainian"
msgstr "Ukrainiečių"
#: paperless/settings/__init__.py:579
#: paperless/settings/__init__.py:590
msgid "Vietnamese"
msgstr "Vietnamiečių"
#: paperless/settings/__init__.py:580
#: paperless/settings/__init__.py:591
msgid "Chinese Simplified"
msgstr "Kinų supaprastinta"
#: paperless/settings/__init__.py:581
#: paperless/settings/__init__.py:592
msgid "Chinese Traditional"
msgstr "Kinų tradicinė"
+39 -39
View File
@@ -2,8 +2,8 @@ msgid ""
msgstr ""
"Project-Id-Version: paperless-ngx\n"
"Report-Msgid-Bugs-To: \n"
"POT-Creation-Date: 2026-07-23 19:21+0000\n"
"PO-Revision-Date: 2026-07-23 19:23\n"
"POT-Creation-Date: 2026-07-25 07:12+0000\n"
"PO-Revision-Date: 2026-07-25 07:14\n"
"Last-Translator: \n"
"Language-Team: Latvian\n"
"Language: lv_LV\n"
@@ -1919,151 +1919,151 @@ msgstr ""
msgid "paperless application settings"
msgstr ""
#: paperless/settings/__init__.py:545
#: paperless/settings/__init__.py:556
msgid "English (US)"
msgstr "Angļu (ASV)"
#: paperless/settings/__init__.py:546
#: paperless/settings/__init__.py:557
msgid "Arabic"
msgstr "Arābu"
#: paperless/settings/__init__.py:547
#: paperless/settings/__init__.py:558
msgid "Afrikaans"
msgstr "Āfrikāņu"
#: paperless/settings/__init__.py:548
#: paperless/settings/__init__.py:559
msgid "Belarusian"
msgstr "Baltkrievu"
#: paperless/settings/__init__.py:549
#: paperless/settings/__init__.py:560
msgid "Bulgarian"
msgstr "Bulgāru"
#: paperless/settings/__init__.py:550
#: paperless/settings/__init__.py:561
msgid "Catalan"
msgstr "Kataloniešu"
#: paperless/settings/__init__.py:551
#: paperless/settings/__init__.py:562
msgid "Czech"
msgstr "Čehu"
#: paperless/settings/__init__.py:552
#: paperless/settings/__init__.py:563
msgid "Danish"
msgstr "Dāņu"
#: paperless/settings/__init__.py:553
#: paperless/settings/__init__.py:564
msgid "German"
msgstr "Vācu"
#: paperless/settings/__init__.py:554
#: paperless/settings/__init__.py:565
msgid "Greek"
msgstr "Grieķu"
#: paperless/settings/__init__.py:555
#: paperless/settings/__init__.py:566
msgid "English (GB)"
msgstr "Angļu (ASV)"
#: paperless/settings/__init__.py:556
#: paperless/settings/__init__.py:567
msgid "Spanish"
msgstr "Spāņu"
#: paperless/settings/__init__.py:557
#: paperless/settings/__init__.py:568
msgid "Persian"
msgstr ""
#: paperless/settings/__init__.py:558
#: paperless/settings/__init__.py:569
msgid "Finnish"
msgstr "Somu"
#: paperless/settings/__init__.py:559
#: paperless/settings/__init__.py:570
msgid "French"
msgstr "Franču"
#: paperless/settings/__init__.py:560
#: paperless/settings/__init__.py:571
msgid "Hungarian"
msgstr "Ungāru"
#: paperless/settings/__init__.py:561
#: paperless/settings/__init__.py:572
msgid "Indonesian"
msgstr ""
#: paperless/settings/__init__.py:562
#: paperless/settings/__init__.py:573
msgid "Italian"
msgstr "Itāļu"
#: paperless/settings/__init__.py:563
#: paperless/settings/__init__.py:574
msgid "Japanese"
msgstr "Japāņu"
#: paperless/settings/__init__.py:564
#: paperless/settings/__init__.py:575
msgid "Korean"
msgstr ""
#: paperless/settings/__init__.py:565
#: paperless/settings/__init__.py:576
msgid "Luxembourgish"
msgstr "Luksemburgiešu"
#: paperless/settings/__init__.py:566
#: paperless/settings/__init__.py:577
msgid "Norwegian"
msgstr "Norvēģu"
#: paperless/settings/__init__.py:567
#: paperless/settings/__init__.py:578
msgid "Dutch"
msgstr "Holandiešu"
#: paperless/settings/__init__.py:568
#: paperless/settings/__init__.py:579
msgid "Polish"
msgstr "Poļu"
#: paperless/settings/__init__.py:569
#: paperless/settings/__init__.py:580
msgid "Portuguese (Brazil)"
msgstr "Portugāļu (Brazīlija)"
#: paperless/settings/__init__.py:570
#: paperless/settings/__init__.py:581
msgid "Portuguese"
msgstr "Portugāļu"
#: paperless/settings/__init__.py:571
#: paperless/settings/__init__.py:582
msgid "Romanian"
msgstr "Rumāņu"
#: paperless/settings/__init__.py:572
#: paperless/settings/__init__.py:583
msgid "Russian"
msgstr "Krievu"
#: paperless/settings/__init__.py:573
#: paperless/settings/__init__.py:584
msgid "Slovak"
msgstr "Slovāku"
#: paperless/settings/__init__.py:574
#: paperless/settings/__init__.py:585
msgid "Slovenian"
msgstr "Slovēņu"
#: paperless/settings/__init__.py:575
#: paperless/settings/__init__.py:586
msgid "Serbian"
msgstr "Sērbu"
#: paperless/settings/__init__.py:576
#: paperless/settings/__init__.py:587
msgid "Swedish"
msgstr "Zviedru"
#: paperless/settings/__init__.py:577
#: paperless/settings/__init__.py:588
msgid "Turkish"
msgstr "Turku"
#: paperless/settings/__init__.py:578
#: paperless/settings/__init__.py:589
msgid "Ukrainian"
msgstr "Ukraiņu"
#: paperless/settings/__init__.py:579
#: paperless/settings/__init__.py:590
msgid "Vietnamese"
msgstr ""
#: paperless/settings/__init__.py:580
#: paperless/settings/__init__.py:591
msgid "Chinese Simplified"
msgstr "Ķīniešu (vienkāršota)"
#: paperless/settings/__init__.py:581
#: paperless/settings/__init__.py:592
msgid "Chinese Traditional"
msgstr ""
+39 -39
View File
@@ -2,8 +2,8 @@ msgid ""
msgstr ""
"Project-Id-Version: paperless-ngx\n"
"Report-Msgid-Bugs-To: \n"
"POT-Creation-Date: 2026-07-23 19:21+0000\n"
"PO-Revision-Date: 2026-07-23 19:23\n"
"POT-Creation-Date: 2026-07-25 07:12+0000\n"
"PO-Revision-Date: 2026-07-25 07:14\n"
"Last-Translator: \n"
"Language-Team: Macedonian\n"
"Language: mk_MK\n"
@@ -1919,151 +1919,151 @@ msgstr ""
msgid "paperless application settings"
msgstr ""
#: paperless/settings/__init__.py:545
#: paperless/settings/__init__.py:556
msgid "English (US)"
msgstr ""
#: paperless/settings/__init__.py:546
#: paperless/settings/__init__.py:557
msgid "Arabic"
msgstr ""
#: paperless/settings/__init__.py:547
#: paperless/settings/__init__.py:558
msgid "Afrikaans"
msgstr ""
#: paperless/settings/__init__.py:548
#: paperless/settings/__init__.py:559
msgid "Belarusian"
msgstr ""
#: paperless/settings/__init__.py:549
#: paperless/settings/__init__.py:560
msgid "Bulgarian"
msgstr ""
#: paperless/settings/__init__.py:550
#: paperless/settings/__init__.py:561
msgid "Catalan"
msgstr ""
#: paperless/settings/__init__.py:551
#: paperless/settings/__init__.py:562
msgid "Czech"
msgstr ""
#: paperless/settings/__init__.py:552
#: paperless/settings/__init__.py:563
msgid "Danish"
msgstr ""
#: paperless/settings/__init__.py:553
#: paperless/settings/__init__.py:564
msgid "German"
msgstr ""
#: paperless/settings/__init__.py:554
#: paperless/settings/__init__.py:565
msgid "Greek"
msgstr ""
#: paperless/settings/__init__.py:555
#: paperless/settings/__init__.py:566
msgid "English (GB)"
msgstr ""
#: paperless/settings/__init__.py:556
#: paperless/settings/__init__.py:567
msgid "Spanish"
msgstr ""
#: paperless/settings/__init__.py:557
#: paperless/settings/__init__.py:568
msgid "Persian"
msgstr ""
#: paperless/settings/__init__.py:558
#: paperless/settings/__init__.py:569
msgid "Finnish"
msgstr ""
#: paperless/settings/__init__.py:559
#: paperless/settings/__init__.py:570
msgid "French"
msgstr ""
#: paperless/settings/__init__.py:560
#: paperless/settings/__init__.py:571
msgid "Hungarian"
msgstr ""
#: paperless/settings/__init__.py:561
#: paperless/settings/__init__.py:572
msgid "Indonesian"
msgstr ""
#: paperless/settings/__init__.py:562
#: paperless/settings/__init__.py:573
msgid "Italian"
msgstr ""
#: paperless/settings/__init__.py:563
#: paperless/settings/__init__.py:574
msgid "Japanese"
msgstr ""
#: paperless/settings/__init__.py:564
#: paperless/settings/__init__.py:575
msgid "Korean"
msgstr ""
#: paperless/settings/__init__.py:565
#: paperless/settings/__init__.py:576
msgid "Luxembourgish"
msgstr ""
#: paperless/settings/__init__.py:566
#: paperless/settings/__init__.py:577
msgid "Norwegian"
msgstr ""
#: paperless/settings/__init__.py:567
#: paperless/settings/__init__.py:578
msgid "Dutch"
msgstr ""
#: paperless/settings/__init__.py:568
#: paperless/settings/__init__.py:579
msgid "Polish"
msgstr ""
#: paperless/settings/__init__.py:569
#: paperless/settings/__init__.py:580
msgid "Portuguese (Brazil)"
msgstr ""
#: paperless/settings/__init__.py:570
#: paperless/settings/__init__.py:581
msgid "Portuguese"
msgstr ""
#: paperless/settings/__init__.py:571
#: paperless/settings/__init__.py:582
msgid "Romanian"
msgstr ""
#: paperless/settings/__init__.py:572
#: paperless/settings/__init__.py:583
msgid "Russian"
msgstr ""
#: paperless/settings/__init__.py:573
#: paperless/settings/__init__.py:584
msgid "Slovak"
msgstr ""
#: paperless/settings/__init__.py:574
#: paperless/settings/__init__.py:585
msgid "Slovenian"
msgstr ""
#: paperless/settings/__init__.py:575
#: paperless/settings/__init__.py:586
msgid "Serbian"
msgstr ""
#: paperless/settings/__init__.py:576
#: paperless/settings/__init__.py:587
msgid "Swedish"
msgstr ""
#: paperless/settings/__init__.py:577
#: paperless/settings/__init__.py:588
msgid "Turkish"
msgstr ""
#: paperless/settings/__init__.py:578
#: paperless/settings/__init__.py:589
msgid "Ukrainian"
msgstr ""
#: paperless/settings/__init__.py:579
#: paperless/settings/__init__.py:590
msgid "Vietnamese"
msgstr ""
#: paperless/settings/__init__.py:580
#: paperless/settings/__init__.py:591
msgid "Chinese Simplified"
msgstr ""
#: paperless/settings/__init__.py:581
#: paperless/settings/__init__.py:592
msgid "Chinese Traditional"
msgstr ""
+39 -39
View File
@@ -2,8 +2,8 @@ msgid ""
msgstr ""
"Project-Id-Version: paperless-ngx\n"
"Report-Msgid-Bugs-To: \n"
"POT-Creation-Date: 2026-07-23 19:21+0000\n"
"PO-Revision-Date: 2026-07-23 19:23\n"
"POT-Creation-Date: 2026-07-25 07:12+0000\n"
"PO-Revision-Date: 2026-07-25 07:14\n"
"Last-Translator: \n"
"Language-Team: Malay\n"
"Language: ms_MY\n"
@@ -1919,151 +1919,151 @@ msgstr ""
msgid "paperless application settings"
msgstr ""
#: paperless/settings/__init__.py:545
#: paperless/settings/__init__.py:556
msgid "English (US)"
msgstr ""
#: paperless/settings/__init__.py:546
#: paperless/settings/__init__.py:557
msgid "Arabic"
msgstr ""
#: paperless/settings/__init__.py:547
#: paperless/settings/__init__.py:558
msgid "Afrikaans"
msgstr ""
#: paperless/settings/__init__.py:548
#: paperless/settings/__init__.py:559
msgid "Belarusian"
msgstr ""
#: paperless/settings/__init__.py:549
#: paperless/settings/__init__.py:560
msgid "Bulgarian"
msgstr ""
#: paperless/settings/__init__.py:550
#: paperless/settings/__init__.py:561
msgid "Catalan"
msgstr ""
#: paperless/settings/__init__.py:551
#: paperless/settings/__init__.py:562
msgid "Czech"
msgstr ""
#: paperless/settings/__init__.py:552
#: paperless/settings/__init__.py:563
msgid "Danish"
msgstr ""
#: paperless/settings/__init__.py:553
#: paperless/settings/__init__.py:564
msgid "German"
msgstr ""
#: paperless/settings/__init__.py:554
#: paperless/settings/__init__.py:565
msgid "Greek"
msgstr ""
#: paperless/settings/__init__.py:555
#: paperless/settings/__init__.py:566
msgid "English (GB)"
msgstr ""
#: paperless/settings/__init__.py:556
#: paperless/settings/__init__.py:567
msgid "Spanish"
msgstr ""
#: paperless/settings/__init__.py:557
#: paperless/settings/__init__.py:568
msgid "Persian"
msgstr ""
#: paperless/settings/__init__.py:558
#: paperless/settings/__init__.py:569
msgid "Finnish"
msgstr ""
#: paperless/settings/__init__.py:559
#: paperless/settings/__init__.py:570
msgid "French"
msgstr ""
#: paperless/settings/__init__.py:560
#: paperless/settings/__init__.py:571
msgid "Hungarian"
msgstr ""
#: paperless/settings/__init__.py:561
#: paperless/settings/__init__.py:572
msgid "Indonesian"
msgstr ""
#: paperless/settings/__init__.py:562
#: paperless/settings/__init__.py:573
msgid "Italian"
msgstr ""
#: paperless/settings/__init__.py:563
#: paperless/settings/__init__.py:574
msgid "Japanese"
msgstr ""
#: paperless/settings/__init__.py:564
#: paperless/settings/__init__.py:575
msgid "Korean"
msgstr ""
#: paperless/settings/__init__.py:565
#: paperless/settings/__init__.py:576
msgid "Luxembourgish"
msgstr ""
#: paperless/settings/__init__.py:566
#: paperless/settings/__init__.py:577
msgid "Norwegian"
msgstr ""
#: paperless/settings/__init__.py:567
#: paperless/settings/__init__.py:578
msgid "Dutch"
msgstr ""
#: paperless/settings/__init__.py:568
#: paperless/settings/__init__.py:579
msgid "Polish"
msgstr ""
#: paperless/settings/__init__.py:569
#: paperless/settings/__init__.py:580
msgid "Portuguese (Brazil)"
msgstr ""
#: paperless/settings/__init__.py:570
#: paperless/settings/__init__.py:581
msgid "Portuguese"
msgstr ""
#: paperless/settings/__init__.py:571
#: paperless/settings/__init__.py:582
msgid "Romanian"
msgstr ""
#: paperless/settings/__init__.py:572
#: paperless/settings/__init__.py:583
msgid "Russian"
msgstr ""
#: paperless/settings/__init__.py:573
#: paperless/settings/__init__.py:584
msgid "Slovak"
msgstr ""
#: paperless/settings/__init__.py:574
#: paperless/settings/__init__.py:585
msgid "Slovenian"
msgstr ""
#: paperless/settings/__init__.py:575
#: paperless/settings/__init__.py:586
msgid "Serbian"
msgstr ""
#: paperless/settings/__init__.py:576
#: paperless/settings/__init__.py:587
msgid "Swedish"
msgstr ""
#: paperless/settings/__init__.py:577
#: paperless/settings/__init__.py:588
msgid "Turkish"
msgstr ""
#: paperless/settings/__init__.py:578
#: paperless/settings/__init__.py:589
msgid "Ukrainian"
msgstr ""
#: paperless/settings/__init__.py:579
#: paperless/settings/__init__.py:590
msgid "Vietnamese"
msgstr ""
#: paperless/settings/__init__.py:580
#: paperless/settings/__init__.py:591
msgid "Chinese Simplified"
msgstr ""
#: paperless/settings/__init__.py:581
#: paperless/settings/__init__.py:592
msgid "Chinese Traditional"
msgstr ""
+68 -68
View File
@@ -2,8 +2,8 @@ msgid ""
msgstr ""
"Project-Id-Version: paperless-ngx\n"
"Report-Msgid-Bugs-To: \n"
"POT-Creation-Date: 2026-07-23 19:21+0000\n"
"PO-Revision-Date: 2026-07-23 19:23\n"
"POT-Creation-Date: 2026-07-25 07:12+0000\n"
"PO-Revision-Date: 2026-07-25 07:14\n"
"Last-Translator: \n"
"Language-Team: Dutch\n"
"Language: nl_NL\n"
@@ -558,11 +558,11 @@ msgstr "mimetype is"
#: documents/models.py:632
msgid "simple title search"
msgstr ""
msgstr "eenvoudige titel zoeken"
#: documents/models.py:633
msgid "simple text search"
msgstr ""
msgstr "eenvoudige tekst zoeken"
#: documents/models.py:643
msgid "rule type"
@@ -586,19 +586,19 @@ msgstr "In behandeling"
#: documents/models.py:680 documents/models.py:757
msgid "Started"
msgstr ""
msgstr "Gestart"
#: documents/models.py:681
msgid "Success"
msgstr ""
msgstr "Geslaagd"
#: documents/models.py:682
msgid "Failure"
msgstr ""
msgstr "Mislukt"
#: documents/models.py:683
msgid "Revoked"
msgstr ""
msgstr "Ingetrokken"
#: documents/models.py:686
msgid "Consume File"
@@ -606,15 +606,15 @@ msgstr "Gebruik bestand"
#: documents/models.py:687
msgid "Train Classifier"
msgstr ""
msgstr "Train Classifier"
#: documents/models.py:688
msgid "Sanity Check"
msgstr ""
msgstr "Gezondheidscheck"
#: documents/models.py:689
msgid "Index Optimize"
msgstr ""
msgstr "Index Optimaliseren"
#: documents/models.py:690 documents/models.py:1282
msgid "Mail Fetch"
@@ -622,23 +622,23 @@ msgstr "E-mails ophalen"
#: documents/models.py:691
msgid "LLM Index"
msgstr ""
msgstr "LLM Index"
#: documents/models.py:692
msgid "Empty Trash"
msgstr ""
msgstr "Prullenbak legen"
#: documents/models.py:693
msgid "Check Workflows"
msgstr ""
msgstr "Controleer Workflows"
#: documents/models.py:694
msgid "Bulk Update"
msgstr ""
msgstr "Bulk bijwerken"
#: documents/models.py:695
msgid "Reprocess Document"
msgstr ""
msgstr "Document opnieuw verwerken"
#: documents/models.py:696
msgid "Build Share Link"
@@ -646,7 +646,7 @@ msgstr "Bouw Deel Link"
#: documents/models.py:697
msgid "Bulk Delete"
msgstr ""
msgstr "Bulk verwijderen"
#: documents/models.py:706 documents/models.py:1277
msgid "Scheduled"
@@ -658,23 +658,23 @@ msgstr "Web interface"
#: documents/models.py:708
msgid "API Upload"
msgstr ""
msgstr "API Upload"
#: documents/models.py:709
msgid "Folder Consume"
msgstr ""
msgstr "Map inlezen"
#: documents/models.py:710
msgid "Email Consume"
msgstr ""
msgstr "Email Inlezen"
#: documents/models.py:711
msgid "System"
msgstr ""
msgstr "Systeem"
#: documents/models.py:712
msgid "Manual"
msgstr ""
msgstr "Handmatig"
#: documents/models.py:718
msgid "Task ID"
@@ -682,7 +682,7 @@ msgstr "Taak ID"
#: documents/models.py:719
msgid "Celery task ID"
msgstr ""
msgstr "Celery taak ID"
#: documents/models.py:725
msgid "Task Type"
@@ -690,35 +690,35 @@ msgstr "Taak type"
#: documents/models.py:726
msgid "The kind of work being performed"
msgstr ""
msgstr "Het soort werk dat wordt uitgevoerd"
#: documents/models.py:733
msgid "Trigger Source"
msgstr ""
msgstr "Trigger bron"
#: documents/models.py:734
msgid "What initiated this task"
msgstr ""
msgstr "Wat begon deze taak"
#: documents/models.py:743
msgid "Status"
msgstr ""
msgstr "Status"
#: documents/models.py:763
msgid "Completed"
msgstr ""
msgstr "Voltooid"
#: documents/models.py:771
msgid "Duration (seconds)"
msgstr ""
msgstr "Duur (seconden)"
#: documents/models.py:772
msgid "Elapsed time from start to completion"
msgstr ""
msgstr "Verstreken tijd van begin tot voltooiing"
#: documents/models.py:778
msgid "Wait Time (seconds)"
msgstr ""
msgstr "Wachttijd (seconden)"
#: documents/models.py:779
msgid "Time from task creation to worker pickup"
@@ -1920,151 +1920,151 @@ msgstr ""
msgid "paperless application settings"
msgstr "paperless applicatie instellingen"
#: paperless/settings/__init__.py:545
#: paperless/settings/__init__.py:556
msgid "English (US)"
msgstr "Engels (US)"
#: paperless/settings/__init__.py:546
#: paperless/settings/__init__.py:557
msgid "Arabic"
msgstr "Arabisch"
#: paperless/settings/__init__.py:547
#: paperless/settings/__init__.py:558
msgid "Afrikaans"
msgstr "Afrikaans"
#: paperless/settings/__init__.py:548
#: paperless/settings/__init__.py:559
msgid "Belarusian"
msgstr "Wit-Russisch"
#: paperless/settings/__init__.py:549
#: paperless/settings/__init__.py:560
msgid "Bulgarian"
msgstr "Bulgaars"
#: paperless/settings/__init__.py:550
#: paperless/settings/__init__.py:561
msgid "Catalan"
msgstr "Catalaans"
#: paperless/settings/__init__.py:551
#: paperless/settings/__init__.py:562
msgid "Czech"
msgstr "Tsjechisch"
#: paperless/settings/__init__.py:552
#: paperless/settings/__init__.py:563
msgid "Danish"
msgstr "Deens"
#: paperless/settings/__init__.py:553
#: paperless/settings/__init__.py:564
msgid "German"
msgstr "Duits"
#: paperless/settings/__init__.py:554
#: paperless/settings/__init__.py:565
msgid "Greek"
msgstr "Grieks"
#: paperless/settings/__init__.py:555
#: paperless/settings/__init__.py:566
msgid "English (GB)"
msgstr "Engels (Brits)"
#: paperless/settings/__init__.py:556
#: paperless/settings/__init__.py:567
msgid "Spanish"
msgstr "Spaans"
#: paperless/settings/__init__.py:557
#: paperless/settings/__init__.py:568
msgid "Persian"
msgstr "Perzisch"
#: paperless/settings/__init__.py:558
#: paperless/settings/__init__.py:569
msgid "Finnish"
msgstr "Fins"
#: paperless/settings/__init__.py:559
#: paperless/settings/__init__.py:570
msgid "French"
msgstr "Frans"
#: paperless/settings/__init__.py:560
#: paperless/settings/__init__.py:571
msgid "Hungarian"
msgstr "Hongaars"
#: paperless/settings/__init__.py:561
#: paperless/settings/__init__.py:572
msgid "Indonesian"
msgstr ""
#: paperless/settings/__init__.py:562
#: paperless/settings/__init__.py:573
msgid "Italian"
msgstr "Italiaans"
#: paperless/settings/__init__.py:563
#: paperless/settings/__init__.py:574
msgid "Japanese"
msgstr "Japans"
#: paperless/settings/__init__.py:564
#: paperless/settings/__init__.py:575
msgid "Korean"
msgstr "Koreaans"
#: paperless/settings/__init__.py:565
#: paperless/settings/__init__.py:576
msgid "Luxembourgish"
msgstr "Luxemburgs"
#: paperless/settings/__init__.py:566
#: paperless/settings/__init__.py:577
msgid "Norwegian"
msgstr "Noors"
#: paperless/settings/__init__.py:567
#: paperless/settings/__init__.py:578
msgid "Dutch"
msgstr "Nederlands"
#: paperless/settings/__init__.py:568
#: paperless/settings/__init__.py:579
msgid "Polish"
msgstr "Pools"
#: paperless/settings/__init__.py:569
#: paperless/settings/__init__.py:580
msgid "Portuguese (Brazil)"
msgstr "Portugees (Brazilië)"
#: paperless/settings/__init__.py:570
#: paperless/settings/__init__.py:581
msgid "Portuguese"
msgstr "Portugees"
#: paperless/settings/__init__.py:571
#: paperless/settings/__init__.py:582
msgid "Romanian"
msgstr "Roemeens"
#: paperless/settings/__init__.py:572
#: paperless/settings/__init__.py:583
msgid "Russian"
msgstr "Russisch"
#: paperless/settings/__init__.py:573
#: paperless/settings/__init__.py:584
msgid "Slovak"
msgstr "Slowaaks"
#: paperless/settings/__init__.py:574
#: paperless/settings/__init__.py:585
msgid "Slovenian"
msgstr "Sloveens"
#: paperless/settings/__init__.py:575
#: paperless/settings/__init__.py:586
msgid "Serbian"
msgstr "Servisch"
#: paperless/settings/__init__.py:576
#: paperless/settings/__init__.py:587
msgid "Swedish"
msgstr "Zweeds"
#: paperless/settings/__init__.py:577
#: paperless/settings/__init__.py:588
msgid "Turkish"
msgstr "Turks"
#: paperless/settings/__init__.py:578
#: paperless/settings/__init__.py:589
msgid "Ukrainian"
msgstr "Oekraïens"
#: paperless/settings/__init__.py:579
#: paperless/settings/__init__.py:590
msgid "Vietnamese"
msgstr "Vietnamees"
#: paperless/settings/__init__.py:580
#: paperless/settings/__init__.py:591
msgid "Chinese Simplified"
msgstr "Chinees (vereenvoudigd)"
#: paperless/settings/__init__.py:581
#: paperless/settings/__init__.py:592
msgid "Chinese Traditional"
msgstr ""
+40 -40
View File
@@ -2,8 +2,8 @@ msgid ""
msgstr ""
"Project-Id-Version: paperless-ngx\n"
"Report-Msgid-Bugs-To: \n"
"POT-Creation-Date: 2026-07-23 19:21+0000\n"
"PO-Revision-Date: 2026-07-23 19:23\n"
"POT-Creation-Date: 2026-07-25 07:12+0000\n"
"PO-Revision-Date: 2026-07-25 23:30\n"
"Last-Translator: \n"
"Language-Team: Norwegian\n"
"Language: no_NO\n"
@@ -1920,151 +1920,151 @@ msgstr "Setter tidsavbrudd for LLM i sekunder"
msgid "paperless application settings"
msgstr "paperless application settings (NO)"
#: paperless/settings/__init__.py:545
#: paperless/settings/__init__.py:556
msgid "English (US)"
msgstr "Engelsk (US)"
#: paperless/settings/__init__.py:546
#: paperless/settings/__init__.py:557
msgid "Arabic"
msgstr "Arabisk"
#: paperless/settings/__init__.py:547
#: paperless/settings/__init__.py:558
msgid "Afrikaans"
msgstr "Afrikansk"
#: paperless/settings/__init__.py:548
#: paperless/settings/__init__.py:559
msgid "Belarusian"
msgstr "Hviterussisk"
#: paperless/settings/__init__.py:549
#: paperless/settings/__init__.py:560
msgid "Bulgarian"
msgstr "Bulgarian (NO)"
#: paperless/settings/__init__.py:550
#: paperless/settings/__init__.py:561
msgid "Catalan"
msgstr "Katalansk"
#: paperless/settings/__init__.py:551
#: paperless/settings/__init__.py:562
msgid "Czech"
msgstr "Tsjekkisk"
#: paperless/settings/__init__.py:552
#: paperless/settings/__init__.py:563
msgid "Danish"
msgstr "Dansk"
#: paperless/settings/__init__.py:553
#: paperless/settings/__init__.py:564
msgid "German"
msgstr "Tysk"
#: paperless/settings/__init__.py:554
#: paperless/settings/__init__.py:565
msgid "Greek"
msgstr "Gresk"
#: paperless/settings/__init__.py:555
#: paperless/settings/__init__.py:566
msgid "English (GB)"
msgstr "Engelsk (GB)"
#: paperless/settings/__init__.py:556
#: paperless/settings/__init__.py:567
msgid "Spanish"
msgstr "Spansk"
#: paperless/settings/__init__.py:557
#: paperless/settings/__init__.py:568
msgid "Persian"
msgstr "Persian (NO)"
#: paperless/settings/__init__.py:558
#: paperless/settings/__init__.py:569
msgid "Finnish"
msgstr "Finsk"
#: paperless/settings/__init__.py:559
#: paperless/settings/__init__.py:570
msgid "French"
msgstr "Fransk"
#: paperless/settings/__init__.py:560
#: paperless/settings/__init__.py:571
msgid "Hungarian"
msgstr "Hungarian (NO)"
#: paperless/settings/__init__.py:561
#: paperless/settings/__init__.py:572
msgid "Indonesian"
msgstr "Indonesian (NO)"
#: paperless/settings/__init__.py:562
#: paperless/settings/__init__.py:573
msgid "Italian"
msgstr "Italiensk"
#: paperless/settings/__init__.py:563
#: paperless/settings/__init__.py:574
msgid "Japanese"
msgstr "Japanese (NO)"
#: paperless/settings/__init__.py:564
#: paperless/settings/__init__.py:575
msgid "Korean"
msgstr "Korean (NO)"
#: paperless/settings/__init__.py:565
#: paperless/settings/__init__.py:576
msgid "Luxembourgish"
msgstr "Luxembourgsk"
#: paperless/settings/__init__.py:566
#: paperless/settings/__init__.py:577
msgid "Norwegian"
msgstr "Norsk"
#: paperless/settings/__init__.py:567
#: paperless/settings/__init__.py:578
msgid "Dutch"
msgstr "Nederlandsk"
#: paperless/settings/__init__.py:568
#: paperless/settings/__init__.py:579
msgid "Polish"
msgstr "Polsk"
#: paperless/settings/__init__.py:569
#: paperless/settings/__init__.py:580
msgid "Portuguese (Brazil)"
msgstr "Portugisisk (Brasil)"
#: paperless/settings/__init__.py:570
#: paperless/settings/__init__.py:581
msgid "Portuguese"
msgstr "Portugisisk"
#: paperless/settings/__init__.py:571
#: paperless/settings/__init__.py:582
msgid "Romanian"
msgstr "Rumensk"
#: paperless/settings/__init__.py:572
#: paperless/settings/__init__.py:583
msgid "Russian"
msgstr "Russisk"
#: paperless/settings/__init__.py:573
#: paperless/settings/__init__.py:584
msgid "Slovak"
msgstr "Slovakisk"
#: paperless/settings/__init__.py:574
#: paperless/settings/__init__.py:585
msgid "Slovenian"
msgstr "Slovenian (NO)"
#: paperless/settings/__init__.py:575
#: paperless/settings/__init__.py:586
msgid "Serbian"
msgstr "Serbisk"
#: paperless/settings/__init__.py:576
#: paperless/settings/__init__.py:587
msgid "Swedish"
msgstr "Svensk"
#: paperless/settings/__init__.py:577
#: paperless/settings/__init__.py:588
msgid "Turkish"
msgstr "Tyrkisk"
#: paperless/settings/__init__.py:578
#: paperless/settings/__init__.py:589
msgid "Ukrainian"
msgstr "Ukrainsk"
#: paperless/settings/__init__.py:579
#: paperless/settings/__init__.py:590
msgid "Vietnamese"
msgstr "Vietnamese (NO)"
#: paperless/settings/__init__.py:580
#: paperless/settings/__init__.py:591
msgid "Chinese Simplified"
msgstr "Kinesisk forenklet"
#: paperless/settings/__init__.py:581
#: paperless/settings/__init__.py:592
msgid "Chinese Traditional"
msgstr "Chinese Traditional (NO)"
@@ -2386,7 +2386,7 @@ msgstr "uid (NO)"
#: paperless_mail/models.py:342
msgid "uid validity"
msgstr ""
msgstr "uid gyldighet"
#: paperless_mail/models.py:350
msgid "subject"
+39 -39
View File
@@ -2,8 +2,8 @@ msgid ""
msgstr ""
"Project-Id-Version: paperless-ngx\n"
"Report-Msgid-Bugs-To: \n"
"POT-Creation-Date: 2026-07-23 19:21+0000\n"
"PO-Revision-Date: 2026-07-23 19:23\n"
"POT-Creation-Date: 2026-07-25 07:12+0000\n"
"PO-Revision-Date: 2026-07-25 07:14\n"
"Last-Translator: \n"
"Language-Team: Polish\n"
"Language: pl_PL\n"
@@ -1920,151 +1920,151 @@ msgstr ""
msgid "paperless application settings"
msgstr "paperless ustawienia aplikacji"
#: paperless/settings/__init__.py:545
#: paperless/settings/__init__.py:556
msgid "English (US)"
msgstr "Angielski (USA)"
#: paperless/settings/__init__.py:546
#: paperless/settings/__init__.py:557
msgid "Arabic"
msgstr "arabski"
#: paperless/settings/__init__.py:547
#: paperless/settings/__init__.py:558
msgid "Afrikaans"
msgstr "Afrykanerski"
#: paperless/settings/__init__.py:548
#: paperless/settings/__init__.py:559
msgid "Belarusian"
msgstr "Białoruski"
#: paperless/settings/__init__.py:549
#: paperless/settings/__init__.py:560
msgid "Bulgarian"
msgstr "Bułgarski"
#: paperless/settings/__init__.py:550
#: paperless/settings/__init__.py:561
msgid "Catalan"
msgstr "Kataloński"
#: paperless/settings/__init__.py:551
#: paperless/settings/__init__.py:562
msgid "Czech"
msgstr "Czeski"
#: paperless/settings/__init__.py:552
#: paperless/settings/__init__.py:563
msgid "Danish"
msgstr "Duński"
#: paperless/settings/__init__.py:553
#: paperless/settings/__init__.py:564
msgid "German"
msgstr "Niemiecki"
#: paperless/settings/__init__.py:554
#: paperless/settings/__init__.py:565
msgid "Greek"
msgstr "Grecki"
#: paperless/settings/__init__.py:555
#: paperless/settings/__init__.py:566
msgid "English (GB)"
msgstr "Angielski (Wielka Brytania)"
#: paperless/settings/__init__.py:556
#: paperless/settings/__init__.py:567
msgid "Spanish"
msgstr "Hiszpański"
#: paperless/settings/__init__.py:557
#: paperless/settings/__init__.py:568
msgid "Persian"
msgstr "perski"
#: paperless/settings/__init__.py:558
#: paperless/settings/__init__.py:569
msgid "Finnish"
msgstr "Fiński"
#: paperless/settings/__init__.py:559
#: paperless/settings/__init__.py:570
msgid "French"
msgstr "Francuski"
#: paperless/settings/__init__.py:560
#: paperless/settings/__init__.py:571
msgid "Hungarian"
msgstr "Węgierski"
#: paperless/settings/__init__.py:561
#: paperless/settings/__init__.py:572
msgid "Indonesian"
msgstr "Indonezyjski"
#: paperless/settings/__init__.py:562
#: paperless/settings/__init__.py:573
msgid "Italian"
msgstr "Włoski"
#: paperless/settings/__init__.py:563
#: paperless/settings/__init__.py:574
msgid "Japanese"
msgstr "Japoński"
#: paperless/settings/__init__.py:564
#: paperless/settings/__init__.py:575
msgid "Korean"
msgstr "Koreański"
#: paperless/settings/__init__.py:565
#: paperless/settings/__init__.py:576
msgid "Luxembourgish"
msgstr "Luksemburski"
#: paperless/settings/__init__.py:566
#: paperless/settings/__init__.py:577
msgid "Norwegian"
msgstr "Norweski"
#: paperless/settings/__init__.py:567
#: paperless/settings/__init__.py:578
msgid "Dutch"
msgstr "Holenderski"
#: paperless/settings/__init__.py:568
#: paperless/settings/__init__.py:579
msgid "Polish"
msgstr "Polski"
#: paperless/settings/__init__.py:569
#: paperless/settings/__init__.py:580
msgid "Portuguese (Brazil)"
msgstr "Portugalski (Brazylia)"
#: paperless/settings/__init__.py:570
#: paperless/settings/__init__.py:581
msgid "Portuguese"
msgstr "Portugalski"
#: paperless/settings/__init__.py:571
#: paperless/settings/__init__.py:582
msgid "Romanian"
msgstr "Rumuński"
#: paperless/settings/__init__.py:572
#: paperless/settings/__init__.py:583
msgid "Russian"
msgstr "Rosyjski"
#: paperless/settings/__init__.py:573
#: paperless/settings/__init__.py:584
msgid "Slovak"
msgstr "Słowacki"
#: paperless/settings/__init__.py:574
#: paperless/settings/__init__.py:585
msgid "Slovenian"
msgstr "Słoweński"
#: paperless/settings/__init__.py:575
#: paperless/settings/__init__.py:586
msgid "Serbian"
msgstr "Serbski"
#: paperless/settings/__init__.py:576
#: paperless/settings/__init__.py:587
msgid "Swedish"
msgstr "Szwedzki"
#: paperless/settings/__init__.py:577
#: paperless/settings/__init__.py:588
msgid "Turkish"
msgstr "Turecki"
#: paperless/settings/__init__.py:578
#: paperless/settings/__init__.py:589
msgid "Ukrainian"
msgstr "Ukraiński"
#: paperless/settings/__init__.py:579
#: paperless/settings/__init__.py:590
msgid "Vietnamese"
msgstr "Wietnamski"
#: paperless/settings/__init__.py:580
#: paperless/settings/__init__.py:591
msgid "Chinese Simplified"
msgstr "Chiński uproszczony"
#: paperless/settings/__init__.py:581
#: paperless/settings/__init__.py:592
msgid "Chinese Traditional"
msgstr "chiński tradycyjny"
+39 -39
View File
@@ -2,8 +2,8 @@ msgid ""
msgstr ""
"Project-Id-Version: paperless-ngx\n"
"Report-Msgid-Bugs-To: \n"
"POT-Creation-Date: 2026-07-23 19:21+0000\n"
"PO-Revision-Date: 2026-07-23 19:23\n"
"POT-Creation-Date: 2026-07-25 07:12+0000\n"
"PO-Revision-Date: 2026-07-25 07:14\n"
"Last-Translator: \n"
"Language-Team: Portuguese, Brazilian\n"
"Language: pt_BR\n"
@@ -1922,151 +1922,151 @@ msgstr ""
msgid "paperless application settings"
msgstr "configurações do aplicativo paperless"
#: paperless/settings/__init__.py:545
#: paperless/settings/__init__.py:556
msgid "English (US)"
msgstr "Inglês (EUA)"
#: paperless/settings/__init__.py:546
#: paperless/settings/__init__.py:557
msgid "Arabic"
msgstr "Árabe"
#: paperless/settings/__init__.py:547
#: paperless/settings/__init__.py:558
msgid "Afrikaans"
msgstr "Africanês"
#: paperless/settings/__init__.py:548
#: paperless/settings/__init__.py:559
msgid "Belarusian"
msgstr "Bielorrusso"
#: paperless/settings/__init__.py:549
#: paperless/settings/__init__.py:560
msgid "Bulgarian"
msgstr "Búlgaro"
#: paperless/settings/__init__.py:550
#: paperless/settings/__init__.py:561
msgid "Catalan"
msgstr "Catalão"
#: paperless/settings/__init__.py:551
#: paperless/settings/__init__.py:562
msgid "Czech"
msgstr "Tcheco"
#: paperless/settings/__init__.py:552
#: paperless/settings/__init__.py:563
msgid "Danish"
msgstr "Dinamarquês"
#: paperless/settings/__init__.py:553
#: paperless/settings/__init__.py:564
msgid "German"
msgstr "Alemão"
#: paperless/settings/__init__.py:554
#: paperless/settings/__init__.py:565
msgid "Greek"
msgstr "Grego"
#: paperless/settings/__init__.py:555
#: paperless/settings/__init__.py:566
msgid "English (GB)"
msgstr "Inglês (GB)"
#: paperless/settings/__init__.py:556
#: paperless/settings/__init__.py:567
msgid "Spanish"
msgstr "Espanhol"
#: paperless/settings/__init__.py:557
#: paperless/settings/__init__.py:568
msgid "Persian"
msgstr "Persa"
#: paperless/settings/__init__.py:558
#: paperless/settings/__init__.py:569
msgid "Finnish"
msgstr "Finlandês"
#: paperless/settings/__init__.py:559
#: paperless/settings/__init__.py:570
msgid "French"
msgstr "Francês"
#: paperless/settings/__init__.py:560
#: paperless/settings/__init__.py:571
msgid "Hungarian"
msgstr "Húngaro"
#: paperless/settings/__init__.py:561
#: paperless/settings/__init__.py:572
msgid "Indonesian"
msgstr "Indonésio"
#: paperless/settings/__init__.py:562
#: paperless/settings/__init__.py:573
msgid "Italian"
msgstr "Italiano"
#: paperless/settings/__init__.py:563
#: paperless/settings/__init__.py:574
msgid "Japanese"
msgstr "Japonês"
#: paperless/settings/__init__.py:564
#: paperless/settings/__init__.py:575
msgid "Korean"
msgstr "Coreano"
#: paperless/settings/__init__.py:565
#: paperless/settings/__init__.py:576
msgid "Luxembourgish"
msgstr "Luxemburguês"
#: paperless/settings/__init__.py:566
#: paperless/settings/__init__.py:577
msgid "Norwegian"
msgstr "Norueguês"
#: paperless/settings/__init__.py:567
#: paperless/settings/__init__.py:578
msgid "Dutch"
msgstr "Holandês"
#: paperless/settings/__init__.py:568
#: paperless/settings/__init__.py:579
msgid "Polish"
msgstr "Polonês"
#: paperless/settings/__init__.py:569
#: paperless/settings/__init__.py:580
msgid "Portuguese (Brazil)"
msgstr "Português (Brasil)"
#: paperless/settings/__init__.py:570
#: paperless/settings/__init__.py:581
msgid "Portuguese"
msgstr "Português"
#: paperless/settings/__init__.py:571
#: paperless/settings/__init__.py:582
msgid "Romanian"
msgstr "Romeno"
#: paperless/settings/__init__.py:572
#: paperless/settings/__init__.py:583
msgid "Russian"
msgstr "Russo"
#: paperless/settings/__init__.py:573
#: paperless/settings/__init__.py:584
msgid "Slovak"
msgstr "Eslovaco"
#: paperless/settings/__init__.py:574
#: paperless/settings/__init__.py:585
msgid "Slovenian"
msgstr "Esloveno"
#: paperless/settings/__init__.py:575
#: paperless/settings/__init__.py:586
msgid "Serbian"
msgstr "Sérvio"
#: paperless/settings/__init__.py:576
#: paperless/settings/__init__.py:587
msgid "Swedish"
msgstr "Sueco"
#: paperless/settings/__init__.py:577
#: paperless/settings/__init__.py:588
msgid "Turkish"
msgstr "Turco"
#: paperless/settings/__init__.py:578
#: paperless/settings/__init__.py:589
msgid "Ukrainian"
msgstr "Ucraniano"
#: paperless/settings/__init__.py:579
#: paperless/settings/__init__.py:590
msgid "Vietnamese"
msgstr "vietnamita"
#: paperless/settings/__init__.py:580
#: paperless/settings/__init__.py:591
msgid "Chinese Simplified"
msgstr "Chinês Simplificado"
#: paperless/settings/__init__.py:581
#: paperless/settings/__init__.py:592
msgid "Chinese Traditional"
msgstr "Chinês Tradicional"
+39 -39
View File
@@ -2,8 +2,8 @@ msgid ""
msgstr ""
"Project-Id-Version: paperless-ngx\n"
"Report-Msgid-Bugs-To: \n"
"POT-Creation-Date: 2026-07-23 19:21+0000\n"
"PO-Revision-Date: 2026-07-23 19:23\n"
"POT-Creation-Date: 2026-07-25 07:12+0000\n"
"PO-Revision-Date: 2026-07-25 07:14\n"
"Last-Translator: \n"
"Language-Team: Portuguese\n"
"Language: pt_PT\n"
@@ -1920,151 +1920,151 @@ msgstr ""
msgid "paperless application settings"
msgstr "configurações do paperless"
#: paperless/settings/__init__.py:545
#: paperless/settings/__init__.py:556
msgid "English (US)"
msgstr "Inglês (EUA)"
#: paperless/settings/__init__.py:546
#: paperless/settings/__init__.py:557
msgid "Arabic"
msgstr "Árabe"
#: paperless/settings/__init__.py:547
#: paperless/settings/__init__.py:558
msgid "Afrikaans"
msgstr "Africano"
#: paperless/settings/__init__.py:548
#: paperless/settings/__init__.py:559
msgid "Belarusian"
msgstr "Bielorrusso"
#: paperless/settings/__init__.py:549
#: paperless/settings/__init__.py:560
msgid "Bulgarian"
msgstr "Búlgaro"
#: paperless/settings/__init__.py:550
#: paperless/settings/__init__.py:561
msgid "Catalan"
msgstr "Catalão"
#: paperless/settings/__init__.py:551
#: paperless/settings/__init__.py:562
msgid "Czech"
msgstr "Checo"
#: paperless/settings/__init__.py:552
#: paperless/settings/__init__.py:563
msgid "Danish"
msgstr "Dinamarquês"
#: paperless/settings/__init__.py:553
#: paperless/settings/__init__.py:564
msgid "German"
msgstr "Deutsch"
#: paperless/settings/__init__.py:554
#: paperless/settings/__init__.py:565
msgid "Greek"
msgstr "Grego"
#: paperless/settings/__init__.py:555
#: paperless/settings/__init__.py:566
msgid "English (GB)"
msgstr "Inglês (GB)"
#: paperless/settings/__init__.py:556
#: paperless/settings/__init__.py:567
msgid "Spanish"
msgstr "Espanhol"
#: paperless/settings/__init__.py:557
#: paperless/settings/__init__.py:568
msgid "Persian"
msgstr "Persa"
#: paperless/settings/__init__.py:558
#: paperless/settings/__init__.py:569
msgid "Finnish"
msgstr "Finlandês"
#: paperless/settings/__init__.py:559
#: paperless/settings/__init__.py:570
msgid "French"
msgstr "Français"
#: paperless/settings/__init__.py:560
#: paperless/settings/__init__.py:571
msgid "Hungarian"
msgstr "Húngaro"
#: paperless/settings/__init__.py:561
#: paperless/settings/__init__.py:572
msgid "Indonesian"
msgstr ""
#: paperless/settings/__init__.py:562
#: paperless/settings/__init__.py:573
msgid "Italian"
msgstr "Italiano"
#: paperless/settings/__init__.py:563
#: paperless/settings/__init__.py:574
msgid "Japanese"
msgstr "Japonês"
#: paperless/settings/__init__.py:564
#: paperless/settings/__init__.py:575
msgid "Korean"
msgstr "Coreano"
#: paperless/settings/__init__.py:565
#: paperless/settings/__init__.py:576
msgid "Luxembourgish"
msgstr "Luxemburguês"
#: paperless/settings/__init__.py:566
#: paperless/settings/__init__.py:577
msgid "Norwegian"
msgstr "Norueguês"
#: paperless/settings/__init__.py:567
#: paperless/settings/__init__.py:578
msgid "Dutch"
msgstr "Nederlandse"
#: paperless/settings/__init__.py:568
#: paperless/settings/__init__.py:579
msgid "Polish"
msgstr "Polaco"
#: paperless/settings/__init__.py:569
#: paperless/settings/__init__.py:580
msgid "Portuguese (Brazil)"
msgstr "Português (Brasil)"
#: paperless/settings/__init__.py:570
#: paperless/settings/__init__.py:581
msgid "Portuguese"
msgstr "Português"
#: paperless/settings/__init__.py:571
#: paperless/settings/__init__.py:582
msgid "Romanian"
msgstr "Romeno"
#: paperless/settings/__init__.py:572
#: paperless/settings/__init__.py:583
msgid "Russian"
msgstr "Russo"
#: paperless/settings/__init__.py:573
#: paperless/settings/__init__.py:584
msgid "Slovak"
msgstr "Eslovaco"
#: paperless/settings/__init__.py:574
#: paperless/settings/__init__.py:585
msgid "Slovenian"
msgstr "Esloveno"
#: paperless/settings/__init__.py:575
#: paperless/settings/__init__.py:586
msgid "Serbian"
msgstr "Sérvio"
#: paperless/settings/__init__.py:576
#: paperless/settings/__init__.py:587
msgid "Swedish"
msgstr "Sueco"
#: paperless/settings/__init__.py:577
#: paperless/settings/__init__.py:588
msgid "Turkish"
msgstr "Turco"
#: paperless/settings/__init__.py:578
#: paperless/settings/__init__.py:589
msgid "Ukrainian"
msgstr "Ucraniano"
#: paperless/settings/__init__.py:579
#: paperless/settings/__init__.py:590
msgid "Vietnamese"
msgstr "Vietnamita"
#: paperless/settings/__init__.py:580
#: paperless/settings/__init__.py:591
msgid "Chinese Simplified"
msgstr "Chinês Simplificado"
#: paperless/settings/__init__.py:581
#: paperless/settings/__init__.py:592
msgid "Chinese Traditional"
msgstr ""
+39 -39
View File
@@ -2,8 +2,8 @@ msgid ""
msgstr ""
"Project-Id-Version: paperless-ngx\n"
"Report-Msgid-Bugs-To: \n"
"POT-Creation-Date: 2026-07-23 19:21+0000\n"
"PO-Revision-Date: 2026-07-23 19:23\n"
"POT-Creation-Date: 2026-07-25 07:12+0000\n"
"PO-Revision-Date: 2026-07-25 07:14\n"
"Last-Translator: \n"
"Language-Team: Romanian\n"
"Language: ro_RO\n"
@@ -1920,151 +1920,151 @@ msgstr ""
msgid "paperless application settings"
msgstr "setări ale aplicației paperless"
#: paperless/settings/__init__.py:545
#: paperless/settings/__init__.py:556
msgid "English (US)"
msgstr "Engleză (Americană)"
#: paperless/settings/__init__.py:546
#: paperless/settings/__init__.py:557
msgid "Arabic"
msgstr "Arabă"
#: paperless/settings/__init__.py:547
#: paperless/settings/__init__.py:558
msgid "Afrikaans"
msgstr "Africană"
#: paperless/settings/__init__.py:548
#: paperless/settings/__init__.py:559
msgid "Belarusian"
msgstr "Bielorusă"
#: paperless/settings/__init__.py:549
#: paperless/settings/__init__.py:560
msgid "Bulgarian"
msgstr "Bulgară"
#: paperless/settings/__init__.py:550
#: paperless/settings/__init__.py:561
msgid "Catalan"
msgstr "Catalană"
#: paperless/settings/__init__.py:551
#: paperless/settings/__init__.py:562
msgid "Czech"
msgstr "Cehă"
#: paperless/settings/__init__.py:552
#: paperless/settings/__init__.py:563
msgid "Danish"
msgstr "Daneză"
#: paperless/settings/__init__.py:553
#: paperless/settings/__init__.py:564
msgid "German"
msgstr "Germană"
#: paperless/settings/__init__.py:554
#: paperless/settings/__init__.py:565
msgid "Greek"
msgstr "Greacă"
#: paperless/settings/__init__.py:555
#: paperless/settings/__init__.py:566
msgid "English (GB)"
msgstr "Engleză (Britanică)"
#: paperless/settings/__init__.py:556
#: paperless/settings/__init__.py:567
msgid "Spanish"
msgstr "Spaniolă"
#: paperless/settings/__init__.py:557
#: paperless/settings/__init__.py:568
msgid "Persian"
msgstr "Persană"
#: paperless/settings/__init__.py:558
#: paperless/settings/__init__.py:569
msgid "Finnish"
msgstr "Finlandeză"
#: paperless/settings/__init__.py:559
#: paperless/settings/__init__.py:570
msgid "French"
msgstr "Franceză"
#: paperless/settings/__init__.py:560
#: paperless/settings/__init__.py:571
msgid "Hungarian"
msgstr "Maghiară"
#: paperless/settings/__init__.py:561
#: paperless/settings/__init__.py:572
msgid "Indonesian"
msgstr "Indoneziană"
#: paperless/settings/__init__.py:562
#: paperless/settings/__init__.py:573
msgid "Italian"
msgstr "Italiană"
#: paperless/settings/__init__.py:563
#: paperless/settings/__init__.py:574
msgid "Japanese"
msgstr "Japoneză"
#: paperless/settings/__init__.py:564
#: paperless/settings/__init__.py:575
msgid "Korean"
msgstr "Coreeană"
#: paperless/settings/__init__.py:565
#: paperless/settings/__init__.py:576
msgid "Luxembourgish"
msgstr "Luxemburgheză"
#: paperless/settings/__init__.py:566
#: paperless/settings/__init__.py:577
msgid "Norwegian"
msgstr "Norvegiană"
#: paperless/settings/__init__.py:567
#: paperless/settings/__init__.py:578
msgid "Dutch"
msgstr "Olandeză"
#: paperless/settings/__init__.py:568
#: paperless/settings/__init__.py:579
msgid "Polish"
msgstr "Poloneză"
#: paperless/settings/__init__.py:569
#: paperless/settings/__init__.py:580
msgid "Portuguese (Brazil)"
msgstr "Portugheză (Brazilia)"
#: paperless/settings/__init__.py:570
#: paperless/settings/__init__.py:581
msgid "Portuguese"
msgstr "Portugheză"
#: paperless/settings/__init__.py:571
#: paperless/settings/__init__.py:582
msgid "Romanian"
msgstr "Română"
#: paperless/settings/__init__.py:572
#: paperless/settings/__init__.py:583
msgid "Russian"
msgstr "Rusă"
#: paperless/settings/__init__.py:573
#: paperless/settings/__init__.py:584
msgid "Slovak"
msgstr "Slovacă"
#: paperless/settings/__init__.py:574
#: paperless/settings/__init__.py:585
msgid "Slovenian"
msgstr "Slovenă"
#: paperless/settings/__init__.py:575
#: paperless/settings/__init__.py:586
msgid "Serbian"
msgstr "Sârbă"
#: paperless/settings/__init__.py:576
#: paperless/settings/__init__.py:587
msgid "Swedish"
msgstr "Suedeză"
#: paperless/settings/__init__.py:577
#: paperless/settings/__init__.py:588
msgid "Turkish"
msgstr "Turcă"
#: paperless/settings/__init__.py:578
#: paperless/settings/__init__.py:589
msgid "Ukrainian"
msgstr "Ucrainiană"
#: paperless/settings/__init__.py:579
#: paperless/settings/__init__.py:590
msgid "Vietnamese"
msgstr "Vietnameză"
#: paperless/settings/__init__.py:580
#: paperless/settings/__init__.py:591
msgid "Chinese Simplified"
msgstr "Chineză simplificată"
#: paperless/settings/__init__.py:581
#: paperless/settings/__init__.py:592
msgid "Chinese Traditional"
msgstr "Chineză Tradițională"
+39 -39
View File
@@ -2,8 +2,8 @@ msgid ""
msgstr ""
"Project-Id-Version: paperless-ngx\n"
"Report-Msgid-Bugs-To: \n"
"POT-Creation-Date: 2026-07-23 19:21+0000\n"
"PO-Revision-Date: 2026-07-23 19:23\n"
"POT-Creation-Date: 2026-07-25 07:12+0000\n"
"PO-Revision-Date: 2026-07-25 07:14\n"
"Last-Translator: \n"
"Language-Team: Russian\n"
"Language: ru_RU\n"
@@ -1920,151 +1920,151 @@ msgstr ""
msgid "paperless application settings"
msgstr "настройки приложения paperless"
#: paperless/settings/__init__.py:545
#: paperless/settings/__init__.py:556
msgid "English (US)"
msgstr "Английский (США)"
#: paperless/settings/__init__.py:546
#: paperless/settings/__init__.py:557
msgid "Arabic"
msgstr "Арабский"
#: paperless/settings/__init__.py:547
#: paperless/settings/__init__.py:558
msgid "Afrikaans"
msgstr "Африкаанс"
#: paperless/settings/__init__.py:548
#: paperless/settings/__init__.py:559
msgid "Belarusian"
msgstr "Белорусский"
#: paperless/settings/__init__.py:549
#: paperless/settings/__init__.py:560
msgid "Bulgarian"
msgstr "Болгарский"
#: paperless/settings/__init__.py:550
#: paperless/settings/__init__.py:561
msgid "Catalan"
msgstr "Каталонский"
#: paperless/settings/__init__.py:551
#: paperless/settings/__init__.py:562
msgid "Czech"
msgstr "Чешский"
#: paperless/settings/__init__.py:552
#: paperless/settings/__init__.py:563
msgid "Danish"
msgstr "Датский"
#: paperless/settings/__init__.py:553
#: paperless/settings/__init__.py:564
msgid "German"
msgstr "Немецкий"
#: paperless/settings/__init__.py:554
#: paperless/settings/__init__.py:565
msgid "Greek"
msgstr "Греческий"
#: paperless/settings/__init__.py:555
#: paperless/settings/__init__.py:566
msgid "English (GB)"
msgstr "Английский (Великобритании)"
#: paperless/settings/__init__.py:556
#: paperless/settings/__init__.py:567
msgid "Spanish"
msgstr "Испанский"
#: paperless/settings/__init__.py:557
#: paperless/settings/__init__.py:568
msgid "Persian"
msgstr "Персидский"
#: paperless/settings/__init__.py:558
#: paperless/settings/__init__.py:569
msgid "Finnish"
msgstr "Финский"
#: paperless/settings/__init__.py:559
#: paperless/settings/__init__.py:570
msgid "French"
msgstr "Французский"
#: paperless/settings/__init__.py:560
#: paperless/settings/__init__.py:571
msgid "Hungarian"
msgstr "Венгерский"
#: paperless/settings/__init__.py:561
#: paperless/settings/__init__.py:572
msgid "Indonesian"
msgstr ""
#: paperless/settings/__init__.py:562
#: paperless/settings/__init__.py:573
msgid "Italian"
msgstr "Итальянский"
#: paperless/settings/__init__.py:563
#: paperless/settings/__init__.py:574
msgid "Japanese"
msgstr "Японский"
#: paperless/settings/__init__.py:564
#: paperless/settings/__init__.py:575
msgid "Korean"
msgstr "Корейский"
#: paperless/settings/__init__.py:565
#: paperless/settings/__init__.py:576
msgid "Luxembourgish"
msgstr "Люксембургский"
#: paperless/settings/__init__.py:566
#: paperless/settings/__init__.py:577
msgid "Norwegian"
msgstr "Норвежский"
#: paperless/settings/__init__.py:567
#: paperless/settings/__init__.py:578
msgid "Dutch"
msgstr "Датский"
#: paperless/settings/__init__.py:568
#: paperless/settings/__init__.py:579
msgid "Polish"
msgstr "Польский"
#: paperless/settings/__init__.py:569
#: paperless/settings/__init__.py:580
msgid "Portuguese (Brazil)"
msgstr "Португальский (Бразилия)"
#: paperless/settings/__init__.py:570
#: paperless/settings/__init__.py:581
msgid "Portuguese"
msgstr "Португальский"
#: paperless/settings/__init__.py:571
#: paperless/settings/__init__.py:582
msgid "Romanian"
msgstr "Румынский"
#: paperless/settings/__init__.py:572
#: paperless/settings/__init__.py:583
msgid "Russian"
msgstr "Русский"
#: paperless/settings/__init__.py:573
#: paperless/settings/__init__.py:584
msgid "Slovak"
msgstr "Словацкий"
#: paperless/settings/__init__.py:574
#: paperless/settings/__init__.py:585
msgid "Slovenian"
msgstr "Словенский"
#: paperless/settings/__init__.py:575
#: paperless/settings/__init__.py:586
msgid "Serbian"
msgstr "Сербский"
#: paperless/settings/__init__.py:576
#: paperless/settings/__init__.py:587
msgid "Swedish"
msgstr "Шведский"
#: paperless/settings/__init__.py:577
#: paperless/settings/__init__.py:588
msgid "Turkish"
msgstr "Турецкий"
#: paperless/settings/__init__.py:578
#: paperless/settings/__init__.py:589
msgid "Ukrainian"
msgstr "Украинский"
#: paperless/settings/__init__.py:579
#: paperless/settings/__init__.py:590
msgid "Vietnamese"
msgstr "Вьетнамский"
#: paperless/settings/__init__.py:580
#: paperless/settings/__init__.py:591
msgid "Chinese Simplified"
msgstr "Китайский упрощенный"
#: paperless/settings/__init__.py:581
#: paperless/settings/__init__.py:592
msgid "Chinese Traditional"
msgstr "Китайский (традиционный)"
+39 -39
View File
@@ -2,8 +2,8 @@ msgid ""
msgstr ""
"Project-Id-Version: paperless-ngx\n"
"Report-Msgid-Bugs-To: \n"
"POT-Creation-Date: 2026-07-23 19:21+0000\n"
"PO-Revision-Date: 2026-07-23 19:23\n"
"POT-Creation-Date: 2026-07-25 07:12+0000\n"
"PO-Revision-Date: 2026-07-25 07:14\n"
"Last-Translator: \n"
"Language-Team: Slovak\n"
"Language: sk_SK\n"
@@ -1920,151 +1920,151 @@ msgstr ""
msgid "paperless application settings"
msgstr ""
#: paperless/settings/__init__.py:545
#: paperless/settings/__init__.py:556
msgid "English (US)"
msgstr "Angličtina (US)"
#: paperless/settings/__init__.py:546
#: paperless/settings/__init__.py:557
msgid "Arabic"
msgstr "Arabčina"
#: paperless/settings/__init__.py:547
#: paperless/settings/__init__.py:558
msgid "Afrikaans"
msgstr ""
#: paperless/settings/__init__.py:548
#: paperless/settings/__init__.py:559
msgid "Belarusian"
msgstr "Bieloruština"
#: paperless/settings/__init__.py:549
#: paperless/settings/__init__.py:560
msgid "Bulgarian"
msgstr ""
#: paperless/settings/__init__.py:550
#: paperless/settings/__init__.py:561
msgid "Catalan"
msgstr "Catalan"
#: paperless/settings/__init__.py:551
#: paperless/settings/__init__.py:562
msgid "Czech"
msgstr "Čeština"
#: paperless/settings/__init__.py:552
#: paperless/settings/__init__.py:563
msgid "Danish"
msgstr "Dánčina"
#: paperless/settings/__init__.py:553
#: paperless/settings/__init__.py:564
msgid "German"
msgstr "Nemčina"
#: paperless/settings/__init__.py:554
#: paperless/settings/__init__.py:565
msgid "Greek"
msgstr ""
#: paperless/settings/__init__.py:555
#: paperless/settings/__init__.py:566
msgid "English (GB)"
msgstr "Angličtina (GB)"
#: paperless/settings/__init__.py:556
#: paperless/settings/__init__.py:567
msgid "Spanish"
msgstr "Španielčina"
#: paperless/settings/__init__.py:557
#: paperless/settings/__init__.py:568
msgid "Persian"
msgstr ""
#: paperless/settings/__init__.py:558
#: paperless/settings/__init__.py:569
msgid "Finnish"
msgstr "Finnish"
#: paperless/settings/__init__.py:559
#: paperless/settings/__init__.py:570
msgid "French"
msgstr "Francúzština"
#: paperless/settings/__init__.py:560
#: paperless/settings/__init__.py:571
msgid "Hungarian"
msgstr ""
#: paperless/settings/__init__.py:561
#: paperless/settings/__init__.py:572
msgid "Indonesian"
msgstr ""
#: paperless/settings/__init__.py:562
#: paperless/settings/__init__.py:573
msgid "Italian"
msgstr "Taliančina"
#: paperless/settings/__init__.py:563
#: paperless/settings/__init__.py:574
msgid "Japanese"
msgstr ""
#: paperless/settings/__init__.py:564
#: paperless/settings/__init__.py:575
msgid "Korean"
msgstr ""
#: paperless/settings/__init__.py:565
#: paperless/settings/__init__.py:576
msgid "Luxembourgish"
msgstr "Luxemburčina"
#: paperless/settings/__init__.py:566
#: paperless/settings/__init__.py:577
msgid "Norwegian"
msgstr ""
#: paperless/settings/__init__.py:567
#: paperless/settings/__init__.py:578
msgid "Dutch"
msgstr "Holandčina"
#: paperless/settings/__init__.py:568
#: paperless/settings/__init__.py:579
msgid "Polish"
msgstr "Polština"
#: paperless/settings/__init__.py:569
#: paperless/settings/__init__.py:580
msgid "Portuguese (Brazil)"
msgstr "Portugalčina (Brazília)"
#: paperless/settings/__init__.py:570
#: paperless/settings/__init__.py:581
msgid "Portuguese"
msgstr "Portugalčina"
#: paperless/settings/__init__.py:571
#: paperless/settings/__init__.py:582
msgid "Romanian"
msgstr "Rumunčina"
#: paperless/settings/__init__.py:572
#: paperless/settings/__init__.py:583
msgid "Russian"
msgstr "Ruština"
#: paperless/settings/__init__.py:573
#: paperless/settings/__init__.py:584
msgid "Slovak"
msgstr "Slovenčina"
#: paperless/settings/__init__.py:574
#: paperless/settings/__init__.py:585
msgid "Slovenian"
msgstr "Slovinčina"
#: paperless/settings/__init__.py:575
#: paperless/settings/__init__.py:586
msgid "Serbian"
msgstr "Srbčina"
#: paperless/settings/__init__.py:576
#: paperless/settings/__init__.py:587
msgid "Swedish"
msgstr "Švédčina"
#: paperless/settings/__init__.py:577
#: paperless/settings/__init__.py:588
msgid "Turkish"
msgstr "Turečtina"
#: paperless/settings/__init__.py:578
#: paperless/settings/__init__.py:589
msgid "Ukrainian"
msgstr ""
#: paperless/settings/__init__.py:579
#: paperless/settings/__init__.py:590
msgid "Vietnamese"
msgstr ""
#: paperless/settings/__init__.py:580
#: paperless/settings/__init__.py:591
msgid "Chinese Simplified"
msgstr "Čínština (zjednodušená)"
#: paperless/settings/__init__.py:581
#: paperless/settings/__init__.py:592
msgid "Chinese Traditional"
msgstr ""
+40 -40
View File
@@ -2,8 +2,8 @@ msgid ""
msgstr ""
"Project-Id-Version: paperless-ngx\n"
"Report-Msgid-Bugs-To: \n"
"POT-Creation-Date: 2026-07-23 19:21+0000\n"
"PO-Revision-Date: 2026-07-23 19:23\n"
"POT-Creation-Date: 2026-07-25 07:12+0000\n"
"PO-Revision-Date: 2026-07-25 07:14\n"
"Last-Translator: \n"
"Language-Team: Slovenian\n"
"Language: sl_SI\n"
@@ -1920,151 +1920,151 @@ msgstr "Nastavi časovno omejitev LLM v sekundah"
msgid "paperless application settings"
msgstr "aplikacijske nastavitve paperless"
#: paperless/settings/__init__.py:545
#: paperless/settings/__init__.py:556
msgid "English (US)"
msgstr "Angleščina (ZDA)"
#: paperless/settings/__init__.py:546
#: paperless/settings/__init__.py:557
msgid "Arabic"
msgstr "Arabščina"
#: paperless/settings/__init__.py:547
#: paperless/settings/__init__.py:558
msgid "Afrikaans"
msgstr "Afrikanščina"
#: paperless/settings/__init__.py:548
#: paperless/settings/__init__.py:559
msgid "Belarusian"
msgstr "Beloruščina"
#: paperless/settings/__init__.py:549
#: paperless/settings/__init__.py:560
msgid "Bulgarian"
msgstr "Bolgarščina"
#: paperless/settings/__init__.py:550
#: paperless/settings/__init__.py:561
msgid "Catalan"
msgstr "Katalonščina"
#: paperless/settings/__init__.py:551
#: paperless/settings/__init__.py:562
msgid "Czech"
msgstr "Češčina"
#: paperless/settings/__init__.py:552
#: paperless/settings/__init__.py:563
msgid "Danish"
msgstr "Danščina"
#: paperless/settings/__init__.py:553
#: paperless/settings/__init__.py:564
msgid "German"
msgstr "Nemščina"
#: paperless/settings/__init__.py:554
#: paperless/settings/__init__.py:565
msgid "Greek"
msgstr "Grščina"
#: paperless/settings/__init__.py:555
#: paperless/settings/__init__.py:566
msgid "English (GB)"
msgstr "Angleščina (GB)"
#: paperless/settings/__init__.py:556
#: paperless/settings/__init__.py:567
msgid "Spanish"
msgstr "Španščina"
#: paperless/settings/__init__.py:557
#: paperless/settings/__init__.py:568
msgid "Persian"
msgstr "Perzijščina"
#: paperless/settings/__init__.py:558
#: paperless/settings/__init__.py:569
msgid "Finnish"
msgstr "Finščina"
#: paperless/settings/__init__.py:559
#: paperless/settings/__init__.py:570
msgid "French"
msgstr "Francoščina"
#: paperless/settings/__init__.py:560
#: paperless/settings/__init__.py:571
msgid "Hungarian"
msgstr "Madžarščina"
#: paperless/settings/__init__.py:561
#: paperless/settings/__init__.py:572
msgid "Indonesian"
msgstr "Indonezijščina"
#: paperless/settings/__init__.py:562
#: paperless/settings/__init__.py:573
msgid "Italian"
msgstr "Italijanščina"
#: paperless/settings/__init__.py:563
#: paperless/settings/__init__.py:574
msgid "Japanese"
msgstr "japonščina"
#: paperless/settings/__init__.py:564
#: paperless/settings/__init__.py:575
msgid "Korean"
msgstr "Korejščina"
#: paperless/settings/__init__.py:565
#: paperless/settings/__init__.py:576
msgid "Luxembourgish"
msgstr "Luksemburški"
#: paperless/settings/__init__.py:566
#: paperless/settings/__init__.py:577
msgid "Norwegian"
msgstr "Norveščina"
#: paperless/settings/__init__.py:567
#: paperless/settings/__init__.py:578
msgid "Dutch"
msgstr "Nizozemščina"
#: paperless/settings/__init__.py:568
#: paperless/settings/__init__.py:579
msgid "Polish"
msgstr "Poljščina"
#: paperless/settings/__init__.py:569
#: paperless/settings/__init__.py:580
msgid "Portuguese (Brazil)"
msgstr "Portugalščina (Brazilija)"
#: paperless/settings/__init__.py:570
#: paperless/settings/__init__.py:581
msgid "Portuguese"
msgstr "Portugalščina"
#: paperless/settings/__init__.py:571
#: paperless/settings/__init__.py:582
msgid "Romanian"
msgstr "Romunščina"
#: paperless/settings/__init__.py:572
#: paperless/settings/__init__.py:583
msgid "Russian"
msgstr "Ruščina"
#: paperless/settings/__init__.py:573
#: paperless/settings/__init__.py:584
msgid "Slovak"
msgstr "Slovaščina"
#: paperless/settings/__init__.py:574
#: paperless/settings/__init__.py:585
msgid "Slovenian"
msgstr "Slovenščina"
#: paperless/settings/__init__.py:575
#: paperless/settings/__init__.py:586
msgid "Serbian"
msgstr "Srbščina"
#: paperless/settings/__init__.py:576
#: paperless/settings/__init__.py:587
msgid "Swedish"
msgstr "Švedščina"
#: paperless/settings/__init__.py:577
#: paperless/settings/__init__.py:588
msgid "Turkish"
msgstr "Turščina"
#: paperless/settings/__init__.py:578
#: paperless/settings/__init__.py:589
msgid "Ukrainian"
msgstr "Ukrajinščina"
#: paperless/settings/__init__.py:579
#: paperless/settings/__init__.py:590
msgid "Vietnamese"
msgstr "Vietnamščina"
#: paperless/settings/__init__.py:580
#: paperless/settings/__init__.py:591
msgid "Chinese Simplified"
msgstr "Poenostavljena kitajščina"
#: paperless/settings/__init__.py:581
#: paperless/settings/__init__.py:592
msgid "Chinese Traditional"
msgstr "Tradicionalna kitajščina"
@@ -2386,7 +2386,7 @@ msgstr "uid"
#: paperless_mail/models.py:342
msgid "uid validity"
msgstr ""
msgstr "veljavnost uid-a"
#: paperless_mail/models.py:350
msgid "subject"
+39 -39
View File
@@ -2,8 +2,8 @@ msgid ""
msgstr ""
"Project-Id-Version: paperless-ngx\n"
"Report-Msgid-Bugs-To: \n"
"POT-Creation-Date: 2026-07-23 19:21+0000\n"
"PO-Revision-Date: 2026-07-23 19:23\n"
"POT-Creation-Date: 2026-07-25 07:12+0000\n"
"PO-Revision-Date: 2026-07-25 07:14\n"
"Last-Translator: \n"
"Language-Team: Albanian\n"
"Language: sq_AL\n"
@@ -1920,151 +1920,151 @@ msgstr ""
msgid "paperless application settings"
msgstr "[SQ] paperless application settings"
#: paperless/settings/__init__.py:545
#: paperless/settings/__init__.py:556
msgid "English (US)"
msgstr "[SQ] English (US)"
#: paperless/settings/__init__.py:546
#: paperless/settings/__init__.py:557
msgid "Arabic"
msgstr "[SQ] Arabic"
#: paperless/settings/__init__.py:547
#: paperless/settings/__init__.py:558
msgid "Afrikaans"
msgstr "[SQ] Afrikaans"
#: paperless/settings/__init__.py:548
#: paperless/settings/__init__.py:559
msgid "Belarusian"
msgstr "[SQ] Belarusian"
#: paperless/settings/__init__.py:549
#: paperless/settings/__init__.py:560
msgid "Bulgarian"
msgstr "[SQ] Bulgarian"
#: paperless/settings/__init__.py:550
#: paperless/settings/__init__.py:561
msgid "Catalan"
msgstr "[SQ] Catalan"
#: paperless/settings/__init__.py:551
#: paperless/settings/__init__.py:562
msgid "Czech"
msgstr "[SQ] Czech"
#: paperless/settings/__init__.py:552
#: paperless/settings/__init__.py:563
msgid "Danish"
msgstr "[SQ] Danish"
#: paperless/settings/__init__.py:553
#: paperless/settings/__init__.py:564
msgid "German"
msgstr "[SQ] German"
#: paperless/settings/__init__.py:554
#: paperless/settings/__init__.py:565
msgid "Greek"
msgstr "[SQ] Greek"
#: paperless/settings/__init__.py:555
#: paperless/settings/__init__.py:566
msgid "English (GB)"
msgstr "[SQ] English (GB)"
#: paperless/settings/__init__.py:556
#: paperless/settings/__init__.py:567
msgid "Spanish"
msgstr "[SQ] Spanish"
#: paperless/settings/__init__.py:557
#: paperless/settings/__init__.py:568
msgid "Persian"
msgstr "[SQ] Persian"
#: paperless/settings/__init__.py:558
#: paperless/settings/__init__.py:569
msgid "Finnish"
msgstr "[SQ] Finnish"
#: paperless/settings/__init__.py:559
#: paperless/settings/__init__.py:570
msgid "French"
msgstr "[SQ] French"
#: paperless/settings/__init__.py:560
#: paperless/settings/__init__.py:571
msgid "Hungarian"
msgstr "[SQ] Hungarian"
#: paperless/settings/__init__.py:561
#: paperless/settings/__init__.py:572
msgid "Indonesian"
msgstr "[SQ] Indonesian"
#: paperless/settings/__init__.py:562
#: paperless/settings/__init__.py:573
msgid "Italian"
msgstr "[SQ] Italian"
#: paperless/settings/__init__.py:563
#: paperless/settings/__init__.py:574
msgid "Japanese"
msgstr "[SQ] Japanese"
#: paperless/settings/__init__.py:564
#: paperless/settings/__init__.py:575
msgid "Korean"
msgstr "[SQ] Korean"
#: paperless/settings/__init__.py:565
#: paperless/settings/__init__.py:576
msgid "Luxembourgish"
msgstr "[SQ] Luxembourgish"
#: paperless/settings/__init__.py:566
#: paperless/settings/__init__.py:577
msgid "Norwegian"
msgstr "[SQ] Norwegian"
#: paperless/settings/__init__.py:567
#: paperless/settings/__init__.py:578
msgid "Dutch"
msgstr "[SQ] Dutch"
#: paperless/settings/__init__.py:568
#: paperless/settings/__init__.py:579
msgid "Polish"
msgstr "[SQ] Polish"
#: paperless/settings/__init__.py:569
#: paperless/settings/__init__.py:580
msgid "Portuguese (Brazil)"
msgstr "[SQ] Portuguese (Brazil)"
#: paperless/settings/__init__.py:570
#: paperless/settings/__init__.py:581
msgid "Portuguese"
msgstr "[SQ] Portuguese"
#: paperless/settings/__init__.py:571
#: paperless/settings/__init__.py:582
msgid "Romanian"
msgstr "[SQ] Romanian"
#: paperless/settings/__init__.py:572
#: paperless/settings/__init__.py:583
msgid "Russian"
msgstr "[SQ] Russian"
#: paperless/settings/__init__.py:573
#: paperless/settings/__init__.py:584
msgid "Slovak"
msgstr "[SQ] Slovak"
#: paperless/settings/__init__.py:574
#: paperless/settings/__init__.py:585
msgid "Slovenian"
msgstr "[SQ] Slovenian"
#: paperless/settings/__init__.py:575
#: paperless/settings/__init__.py:586
msgid "Serbian"
msgstr "[SQ] Serbian"
#: paperless/settings/__init__.py:576
#: paperless/settings/__init__.py:587
msgid "Swedish"
msgstr "[SQ] Swedish"
#: paperless/settings/__init__.py:577
#: paperless/settings/__init__.py:588
msgid "Turkish"
msgstr "[SQ] Turkish"
#: paperless/settings/__init__.py:578
#: paperless/settings/__init__.py:589
msgid "Ukrainian"
msgstr "[SQ] Ukrainian"
#: paperless/settings/__init__.py:579
#: paperless/settings/__init__.py:590
msgid "Vietnamese"
msgstr "[SQ] Vietnamese"
#: paperless/settings/__init__.py:580
#: paperless/settings/__init__.py:591
msgid "Chinese Simplified"
msgstr "[SQ] Chinese Simplified"
#: paperless/settings/__init__.py:581
#: paperless/settings/__init__.py:592
msgid "Chinese Traditional"
msgstr "[SQ] Chinese Traditional"
+39 -39
View File
@@ -2,8 +2,8 @@ msgid ""
msgstr ""
"Project-Id-Version: paperless-ngx\n"
"Report-Msgid-Bugs-To: \n"
"POT-Creation-Date: 2026-07-23 19:21+0000\n"
"PO-Revision-Date: 2026-07-23 19:23\n"
"POT-Creation-Date: 2026-07-25 07:12+0000\n"
"PO-Revision-Date: 2026-07-25 07:14\n"
"Last-Translator: \n"
"Language-Team: Serbian (Latin)\n"
"Language: sr_CS\n"
@@ -1920,151 +1920,151 @@ msgstr ""
msgid "paperless application settings"
msgstr "podešavanje paperless aplikacije"
#: paperless/settings/__init__.py:545
#: paperless/settings/__init__.py:556
msgid "English (US)"
msgstr "Engleski (US)"
#: paperless/settings/__init__.py:546
#: paperless/settings/__init__.py:557
msgid "Arabic"
msgstr "Arapski"
#: paperless/settings/__init__.py:547
#: paperless/settings/__init__.py:558
msgid "Afrikaans"
msgstr "Afrički"
#: paperless/settings/__init__.py:548
#: paperless/settings/__init__.py:559
msgid "Belarusian"
msgstr "Beloruski"
#: paperless/settings/__init__.py:549
#: paperless/settings/__init__.py:560
msgid "Bulgarian"
msgstr "Bugarski"
#: paperless/settings/__init__.py:550
#: paperless/settings/__init__.py:561
msgid "Catalan"
msgstr "Katalonski"
#: paperless/settings/__init__.py:551
#: paperless/settings/__init__.py:562
msgid "Czech"
msgstr "Češki"
#: paperless/settings/__init__.py:552
#: paperless/settings/__init__.py:563
msgid "Danish"
msgstr "Danski"
#: paperless/settings/__init__.py:553
#: paperless/settings/__init__.py:564
msgid "German"
msgstr "Nemački"
#: paperless/settings/__init__.py:554
#: paperless/settings/__init__.py:565
msgid "Greek"
msgstr "Grčki"
#: paperless/settings/__init__.py:555
#: paperless/settings/__init__.py:566
msgid "English (GB)"
msgstr "Engleski (UK)"
#: paperless/settings/__init__.py:556
#: paperless/settings/__init__.py:567
msgid "Spanish"
msgstr "Španski"
#: paperless/settings/__init__.py:557
#: paperless/settings/__init__.py:568
msgid "Persian"
msgstr "Persijski"
#: paperless/settings/__init__.py:558
#: paperless/settings/__init__.py:569
msgid "Finnish"
msgstr "Finski"
#: paperless/settings/__init__.py:559
#: paperless/settings/__init__.py:570
msgid "French"
msgstr "Francuski"
#: paperless/settings/__init__.py:560
#: paperless/settings/__init__.py:571
msgid "Hungarian"
msgstr "Mađarski"
#: paperless/settings/__init__.py:561
#: paperless/settings/__init__.py:572
msgid "Indonesian"
msgstr "Indonežanski"
#: paperless/settings/__init__.py:562
#: paperless/settings/__init__.py:573
msgid "Italian"
msgstr "Italijanski"
#: paperless/settings/__init__.py:563
#: paperless/settings/__init__.py:574
msgid "Japanese"
msgstr "Japanski"
#: paperless/settings/__init__.py:564
#: paperless/settings/__init__.py:575
msgid "Korean"
msgstr "Korejski"
#: paperless/settings/__init__.py:565
#: paperless/settings/__init__.py:576
msgid "Luxembourgish"
msgstr "Luksemburški"
#: paperless/settings/__init__.py:566
#: paperless/settings/__init__.py:577
msgid "Norwegian"
msgstr "Norveški"
#: paperless/settings/__init__.py:567
#: paperless/settings/__init__.py:578
msgid "Dutch"
msgstr "Holandski"
#: paperless/settings/__init__.py:568
#: paperless/settings/__init__.py:579
msgid "Polish"
msgstr "Poljski"
#: paperless/settings/__init__.py:569
#: paperless/settings/__init__.py:580
msgid "Portuguese (Brazil)"
msgstr "Portugalski (Brazil)"
#: paperless/settings/__init__.py:570
#: paperless/settings/__init__.py:581
msgid "Portuguese"
msgstr "Portugalski"
#: paperless/settings/__init__.py:571
#: paperless/settings/__init__.py:582
msgid "Romanian"
msgstr "Rumunski"
#: paperless/settings/__init__.py:572
#: paperless/settings/__init__.py:583
msgid "Russian"
msgstr "Ruski"
#: paperless/settings/__init__.py:573
#: paperless/settings/__init__.py:584
msgid "Slovak"
msgstr "Slovački"
#: paperless/settings/__init__.py:574
#: paperless/settings/__init__.py:585
msgid "Slovenian"
msgstr "Slovenački"
#: paperless/settings/__init__.py:575
#: paperless/settings/__init__.py:586
msgid "Serbian"
msgstr "Srpski"
#: paperless/settings/__init__.py:576
#: paperless/settings/__init__.py:587
msgid "Swedish"
msgstr "Švedski"
#: paperless/settings/__init__.py:577
#: paperless/settings/__init__.py:588
msgid "Turkish"
msgstr "Turski"
#: paperless/settings/__init__.py:578
#: paperless/settings/__init__.py:589
msgid "Ukrainian"
msgstr "Ukrajinski"
#: paperless/settings/__init__.py:579
#: paperless/settings/__init__.py:590
msgid "Vietnamese"
msgstr "Vijetnamski"
#: paperless/settings/__init__.py:580
#: paperless/settings/__init__.py:591
msgid "Chinese Simplified"
msgstr "Kineski pojednostavljen"
#: paperless/settings/__init__.py:581
#: paperless/settings/__init__.py:592
msgid "Chinese Traditional"
msgstr "Tradicionalni kineski"
+39 -39
View File
@@ -2,8 +2,8 @@ msgid ""
msgstr ""
"Project-Id-Version: paperless-ngx\n"
"Report-Msgid-Bugs-To: \n"
"POT-Creation-Date: 2026-07-23 19:21+0000\n"
"PO-Revision-Date: 2026-07-23 19:23\n"
"POT-Creation-Date: 2026-07-25 07:12+0000\n"
"PO-Revision-Date: 2026-07-25 07:14\n"
"Last-Translator: \n"
"Language-Team: Swedish\n"
"Language: sv_SE\n"
@@ -1920,151 +1920,151 @@ msgstr ""
msgid "paperless application settings"
msgstr ""
#: paperless/settings/__init__.py:545
#: paperless/settings/__init__.py:556
msgid "English (US)"
msgstr "Engelska (USA)"
#: paperless/settings/__init__.py:546
#: paperless/settings/__init__.py:557
msgid "Arabic"
msgstr "Arabiska"
#: paperless/settings/__init__.py:547
#: paperless/settings/__init__.py:558
msgid "Afrikaans"
msgstr "Afrikaans"
#: paperless/settings/__init__.py:548
#: paperless/settings/__init__.py:559
msgid "Belarusian"
msgstr "Belarusiska"
#: paperless/settings/__init__.py:549
#: paperless/settings/__init__.py:560
msgid "Bulgarian"
msgstr "Bulgariska"
#: paperless/settings/__init__.py:550
#: paperless/settings/__init__.py:561
msgid "Catalan"
msgstr "Kataloniska"
#: paperless/settings/__init__.py:551
#: paperless/settings/__init__.py:562
msgid "Czech"
msgstr "Tjeckiska"
#: paperless/settings/__init__.py:552
#: paperless/settings/__init__.py:563
msgid "Danish"
msgstr "Danska"
#: paperless/settings/__init__.py:553
#: paperless/settings/__init__.py:564
msgid "German"
msgstr "Tyska"
#: paperless/settings/__init__.py:554
#: paperless/settings/__init__.py:565
msgid "Greek"
msgstr "Grekiska"
#: paperless/settings/__init__.py:555
#: paperless/settings/__init__.py:566
msgid "English (GB)"
msgstr "Engelska (GB)"
#: paperless/settings/__init__.py:556
#: paperless/settings/__init__.py:567
msgid "Spanish"
msgstr "Spanska"
#: paperless/settings/__init__.py:557
#: paperless/settings/__init__.py:568
msgid "Persian"
msgstr "Persiska"
#: paperless/settings/__init__.py:558
#: paperless/settings/__init__.py:569
msgid "Finnish"
msgstr "Finska"
#: paperless/settings/__init__.py:559
#: paperless/settings/__init__.py:570
msgid "French"
msgstr "Franska"
#: paperless/settings/__init__.py:560
#: paperless/settings/__init__.py:571
msgid "Hungarian"
msgstr "Ungerska"
#: paperless/settings/__init__.py:561
#: paperless/settings/__init__.py:572
msgid "Indonesian"
msgstr "Indonesiska"
#: paperless/settings/__init__.py:562
#: paperless/settings/__init__.py:573
msgid "Italian"
msgstr "Italienska"
#: paperless/settings/__init__.py:563
#: paperless/settings/__init__.py:574
msgid "Japanese"
msgstr "Japanska"
#: paperless/settings/__init__.py:564
#: paperless/settings/__init__.py:575
msgid "Korean"
msgstr "Koreanska"
#: paperless/settings/__init__.py:565
#: paperless/settings/__init__.py:576
msgid "Luxembourgish"
msgstr "Luxemburgiska"
#: paperless/settings/__init__.py:566
#: paperless/settings/__init__.py:577
msgid "Norwegian"
msgstr "Norska"
#: paperless/settings/__init__.py:567
#: paperless/settings/__init__.py:578
msgid "Dutch"
msgstr "Holländska"
#: paperless/settings/__init__.py:568
#: paperless/settings/__init__.py:579
msgid "Polish"
msgstr "Polska"
#: paperless/settings/__init__.py:569
#: paperless/settings/__init__.py:580
msgid "Portuguese (Brazil)"
msgstr "Portugisiska (Brasilien)"
#: paperless/settings/__init__.py:570
#: paperless/settings/__init__.py:581
msgid "Portuguese"
msgstr "Portugisiska"
#: paperless/settings/__init__.py:571
#: paperless/settings/__init__.py:582
msgid "Romanian"
msgstr "Rumänska"
#: paperless/settings/__init__.py:572
#: paperless/settings/__init__.py:583
msgid "Russian"
msgstr "Ryska"
#: paperless/settings/__init__.py:573
#: paperless/settings/__init__.py:584
msgid "Slovak"
msgstr "Slovakiska"
#: paperless/settings/__init__.py:574
#: paperless/settings/__init__.py:585
msgid "Slovenian"
msgstr "Slovenska"
#: paperless/settings/__init__.py:575
#: paperless/settings/__init__.py:586
msgid "Serbian"
msgstr "Serbiska"
#: paperless/settings/__init__.py:576
#: paperless/settings/__init__.py:587
msgid "Swedish"
msgstr "Svenska"
#: paperless/settings/__init__.py:577
#: paperless/settings/__init__.py:588
msgid "Turkish"
msgstr "Turkiska"
#: paperless/settings/__init__.py:578
#: paperless/settings/__init__.py:589
msgid "Ukrainian"
msgstr "Ukrainiska"
#: paperless/settings/__init__.py:579
#: paperless/settings/__init__.py:590
msgid "Vietnamese"
msgstr "Vietnamesiska"
#: paperless/settings/__init__.py:580
#: paperless/settings/__init__.py:591
msgid "Chinese Simplified"
msgstr "Kinesiska (förenklad)"
#: paperless/settings/__init__.py:581
#: paperless/settings/__init__.py:592
msgid "Chinese Traditional"
msgstr "Kinesiska traditionell"
+39 -39
View File
@@ -2,8 +2,8 @@ msgid ""
msgstr ""
"Project-Id-Version: paperless-ngx\n"
"Report-Msgid-Bugs-To: \n"
"POT-Creation-Date: 2026-07-23 19:21+0000\n"
"PO-Revision-Date: 2026-07-23 19:23\n"
"POT-Creation-Date: 2026-07-25 07:12+0000\n"
"PO-Revision-Date: 2026-07-25 07:14\n"
"Last-Translator: \n"
"Language-Team: Thai\n"
"Language: th_TH\n"
@@ -1919,151 +1919,151 @@ msgstr ""
msgid "paperless application settings"
msgstr ""
#: paperless/settings/__init__.py:545
#: paperless/settings/__init__.py:556
msgid "English (US)"
msgstr "ภาษาอังกฤษ (สหรัฐฯ)"
#: paperless/settings/__init__.py:546
#: paperless/settings/__init__.py:557
msgid "Arabic"
msgstr "ภาษาอาหรับ"
#: paperless/settings/__init__.py:547
#: paperless/settings/__init__.py:558
msgid "Afrikaans"
msgstr "ภาษาอาฟรีกานส์"
#: paperless/settings/__init__.py:548
#: paperless/settings/__init__.py:559
msgid "Belarusian"
msgstr "ภาษาเบลารุส"
#: paperless/settings/__init__.py:549
#: paperless/settings/__init__.py:560
msgid "Bulgarian"
msgstr ""
#: paperless/settings/__init__.py:550
#: paperless/settings/__init__.py:561
msgid "Catalan"
msgstr "ภาษาคาตาลัน"
#: paperless/settings/__init__.py:551
#: paperless/settings/__init__.py:562
msgid "Czech"
msgstr "ภาษาเช็ก"
#: paperless/settings/__init__.py:552
#: paperless/settings/__init__.py:563
msgid "Danish"
msgstr "ภาษาเดนมาร์ก"
#: paperless/settings/__init__.py:553
#: paperless/settings/__init__.py:564
msgid "German"
msgstr "ภาษาเยอรมัน"
#: paperless/settings/__init__.py:554
#: paperless/settings/__init__.py:565
msgid "Greek"
msgstr "ภาษากรีก"
#: paperless/settings/__init__.py:555
#: paperless/settings/__init__.py:566
msgid "English (GB)"
msgstr "ภาษาอังกฤษ (สหราชอาณาจักร)"
#: paperless/settings/__init__.py:556
#: paperless/settings/__init__.py:567
msgid "Spanish"
msgstr "ภาษาสเปน"
#: paperless/settings/__init__.py:557
#: paperless/settings/__init__.py:568
msgid "Persian"
msgstr ""
#: paperless/settings/__init__.py:558
#: paperless/settings/__init__.py:569
msgid "Finnish"
msgstr "ภาษาฟินแลนด์"
#: paperless/settings/__init__.py:559
#: paperless/settings/__init__.py:570
msgid "French"
msgstr "ภาษาฝรั่งเศส"
#: paperless/settings/__init__.py:560
#: paperless/settings/__init__.py:571
msgid "Hungarian"
msgstr ""
#: paperless/settings/__init__.py:561
#: paperless/settings/__init__.py:572
msgid "Indonesian"
msgstr ""
#: paperless/settings/__init__.py:562
#: paperless/settings/__init__.py:573
msgid "Italian"
msgstr "ภาษาอิตาลี"
#: paperless/settings/__init__.py:563
#: paperless/settings/__init__.py:574
msgid "Japanese"
msgstr ""
#: paperless/settings/__init__.py:564
#: paperless/settings/__init__.py:575
msgid "Korean"
msgstr ""
#: paperless/settings/__init__.py:565
#: paperless/settings/__init__.py:576
msgid "Luxembourgish"
msgstr "ภาษาลักเซมเบิร์ก"
#: paperless/settings/__init__.py:566
#: paperless/settings/__init__.py:577
msgid "Norwegian"
msgstr "ภาษานอร์เวย์"
#: paperless/settings/__init__.py:567
#: paperless/settings/__init__.py:578
msgid "Dutch"
msgstr "ภาษาดัตช์"
#: paperless/settings/__init__.py:568
#: paperless/settings/__init__.py:579
msgid "Polish"
msgstr "ภาษาโปแลนด์"
#: paperless/settings/__init__.py:569
#: paperless/settings/__init__.py:580
msgid "Portuguese (Brazil)"
msgstr "ภาษาโปรตุเกส (บราซิล)"
#: paperless/settings/__init__.py:570
#: paperless/settings/__init__.py:581
msgid "Portuguese"
msgstr "ภาษาโปรตุเกส"
#: paperless/settings/__init__.py:571
#: paperless/settings/__init__.py:582
msgid "Romanian"
msgstr "ภาษาโรมาเนีย"
#: paperless/settings/__init__.py:572
#: paperless/settings/__init__.py:583
msgid "Russian"
msgstr "ภาษารัสเซีย"
#: paperless/settings/__init__.py:573
#: paperless/settings/__init__.py:584
msgid "Slovak"
msgstr "ภาษาสโลวาเกีย"
#: paperless/settings/__init__.py:574
#: paperless/settings/__init__.py:585
msgid "Slovenian"
msgstr "ภาษาสโลเวเนีย"
#: paperless/settings/__init__.py:575
#: paperless/settings/__init__.py:586
msgid "Serbian"
msgstr "ภาษาเซอร์เบีย"
#: paperless/settings/__init__.py:576
#: paperless/settings/__init__.py:587
msgid "Swedish"
msgstr "ภาษาสวีเดน"
#: paperless/settings/__init__.py:577
#: paperless/settings/__init__.py:588
msgid "Turkish"
msgstr "ภาษาตุรกี"
#: paperless/settings/__init__.py:578
#: paperless/settings/__init__.py:589
msgid "Ukrainian"
msgstr "ภาษายูเครน"
#: paperless/settings/__init__.py:579
#: paperless/settings/__init__.py:590
msgid "Vietnamese"
msgstr ""
#: paperless/settings/__init__.py:580
#: paperless/settings/__init__.py:591
msgid "Chinese Simplified"
msgstr "ภาษาจีน (ตัวย่อ)"
#: paperless/settings/__init__.py:581
#: paperless/settings/__init__.py:592
msgid "Chinese Traditional"
msgstr ""
+39 -39
View File
@@ -2,8 +2,8 @@ msgid ""
msgstr ""
"Project-Id-Version: paperless-ngx\n"
"Report-Msgid-Bugs-To: \n"
"POT-Creation-Date: 2026-07-23 19:21+0000\n"
"PO-Revision-Date: 2026-07-23 19:23\n"
"POT-Creation-Date: 2026-07-25 07:12+0000\n"
"PO-Revision-Date: 2026-07-25 07:14\n"
"Last-Translator: \n"
"Language-Team: Turkish\n"
"Language: tr_TR\n"
@@ -1920,151 +1920,151 @@ msgstr ""
msgid "paperless application settings"
msgstr "paperless uygulama ayarları"
#: paperless/settings/__init__.py:545
#: paperless/settings/__init__.py:556
msgid "English (US)"
msgstr "İngilizce (Birleşik Devletler)"
#: paperless/settings/__init__.py:546
#: paperless/settings/__init__.py:557
msgid "Arabic"
msgstr "Arapça"
#: paperless/settings/__init__.py:547
#: paperless/settings/__init__.py:558
msgid "Afrikaans"
msgstr "Afrika dili"
#: paperless/settings/__init__.py:548
#: paperless/settings/__init__.py:559
msgid "Belarusian"
msgstr "Belarusça"
#: paperless/settings/__init__.py:549
#: paperless/settings/__init__.py:560
msgid "Bulgarian"
msgstr "Bulgarca"
#: paperless/settings/__init__.py:550
#: paperless/settings/__init__.py:561
msgid "Catalan"
msgstr "Katalanca"
#: paperless/settings/__init__.py:551
#: paperless/settings/__init__.py:562
msgid "Czech"
msgstr "Çekçe"
#: paperless/settings/__init__.py:552
#: paperless/settings/__init__.py:563
msgid "Danish"
msgstr "Danca"
#: paperless/settings/__init__.py:553
#: paperless/settings/__init__.py:564
msgid "German"
msgstr "Almanca"
#: paperless/settings/__init__.py:554
#: paperless/settings/__init__.py:565
msgid "Greek"
msgstr "Yunanca"
#: paperless/settings/__init__.py:555
#: paperless/settings/__init__.py:566
msgid "English (GB)"
msgstr "İngilizce (GB)"
#: paperless/settings/__init__.py:556
#: paperless/settings/__init__.py:567
msgid "Spanish"
msgstr "İspanyolca"
#: paperless/settings/__init__.py:557
#: paperless/settings/__init__.py:568
msgid "Persian"
msgstr "Farsça"
#: paperless/settings/__init__.py:558
#: paperless/settings/__init__.py:569
msgid "Finnish"
msgstr "Fince"
#: paperless/settings/__init__.py:559
#: paperless/settings/__init__.py:570
msgid "French"
msgstr "Fransızca"
#: paperless/settings/__init__.py:560
#: paperless/settings/__init__.py:571
msgid "Hungarian"
msgstr "Macarca"
#: paperless/settings/__init__.py:561
#: paperless/settings/__init__.py:572
msgid "Indonesian"
msgstr ""
#: paperless/settings/__init__.py:562
#: paperless/settings/__init__.py:573
msgid "Italian"
msgstr "İtalyanca"
#: paperless/settings/__init__.py:563
#: paperless/settings/__init__.py:574
msgid "Japanese"
msgstr "Japonca"
#: paperless/settings/__init__.py:564
#: paperless/settings/__init__.py:575
msgid "Korean"
msgstr "Korece"
#: paperless/settings/__init__.py:565
#: paperless/settings/__init__.py:576
msgid "Luxembourgish"
msgstr "Lüksemburgca"
#: paperless/settings/__init__.py:566
#: paperless/settings/__init__.py:577
msgid "Norwegian"
msgstr "Norveçce"
#: paperless/settings/__init__.py:567
#: paperless/settings/__init__.py:578
msgid "Dutch"
msgstr "Hollandaca"
#: paperless/settings/__init__.py:568
#: paperless/settings/__init__.py:579
msgid "Polish"
msgstr "Polonyaca"
#: paperless/settings/__init__.py:569
#: paperless/settings/__init__.py:580
msgid "Portuguese (Brazil)"
msgstr "Portekizce (Brezilya)"
#: paperless/settings/__init__.py:570
#: paperless/settings/__init__.py:581
msgid "Portuguese"
msgstr "Portekizce"
#: paperless/settings/__init__.py:571
#: paperless/settings/__init__.py:582
msgid "Romanian"
msgstr "Romence"
#: paperless/settings/__init__.py:572
#: paperless/settings/__init__.py:583
msgid "Russian"
msgstr "Rusça"
#: paperless/settings/__init__.py:573
#: paperless/settings/__init__.py:584
msgid "Slovak"
msgstr "Slovakça"
#: paperless/settings/__init__.py:574
#: paperless/settings/__init__.py:585
msgid "Slovenian"
msgstr "Slovakça"
#: paperless/settings/__init__.py:575
#: paperless/settings/__init__.py:586
msgid "Serbian"
msgstr "Sırpça"
#: paperless/settings/__init__.py:576
#: paperless/settings/__init__.py:587
msgid "Swedish"
msgstr "İsveççe"
#: paperless/settings/__init__.py:577
#: paperless/settings/__init__.py:588
msgid "Turkish"
msgstr "Türkçe"
#: paperless/settings/__init__.py:578
#: paperless/settings/__init__.py:589
msgid "Ukrainian"
msgstr "Ukraynaca"
#: paperless/settings/__init__.py:579
#: paperless/settings/__init__.py:590
msgid "Vietnamese"
msgstr "Vietnamca"
#: paperless/settings/__init__.py:580
#: paperless/settings/__init__.py:591
msgid "Chinese Simplified"
msgstr "Basitleştirilmiş Çince"
#: paperless/settings/__init__.py:581
#: paperless/settings/__init__.py:592
msgid "Chinese Traditional"
msgstr "Geleneksel Çince"
+39 -39
View File
@@ -2,8 +2,8 @@ msgid ""
msgstr ""
"Project-Id-Version: paperless-ngx\n"
"Report-Msgid-Bugs-To: \n"
"POT-Creation-Date: 2026-07-23 19:21+0000\n"
"PO-Revision-Date: 2026-07-23 19:23\n"
"POT-Creation-Date: 2026-07-25 07:12+0000\n"
"PO-Revision-Date: 2026-07-25 07:14\n"
"Last-Translator: \n"
"Language-Team: Ukrainian\n"
"Language: uk_UA\n"
@@ -1920,151 +1920,151 @@ msgstr ""
msgid "paperless application settings"
msgstr "налаштування програми документообігу"
#: paperless/settings/__init__.py:545
#: paperless/settings/__init__.py:556
msgid "English (US)"
msgstr "Англійська (США)"
#: paperless/settings/__init__.py:546
#: paperless/settings/__init__.py:557
msgid "Arabic"
msgstr "Арабська"
#: paperless/settings/__init__.py:547
#: paperless/settings/__init__.py:558
msgid "Afrikaans"
msgstr "Африкаанс"
#: paperless/settings/__init__.py:548
#: paperless/settings/__init__.py:559
msgid "Belarusian"
msgstr "Білоруська"
#: paperless/settings/__init__.py:549
#: paperless/settings/__init__.py:560
msgid "Bulgarian"
msgstr "Болгарська"
#: paperless/settings/__init__.py:550
#: paperless/settings/__init__.py:561
msgid "Catalan"
msgstr "Каталонська"
#: paperless/settings/__init__.py:551
#: paperless/settings/__init__.py:562
msgid "Czech"
msgstr "Чеська"
#: paperless/settings/__init__.py:552
#: paperless/settings/__init__.py:563
msgid "Danish"
msgstr "Данська"
#: paperless/settings/__init__.py:553
#: paperless/settings/__init__.py:564
msgid "German"
msgstr "Німецька"
#: paperless/settings/__init__.py:554
#: paperless/settings/__init__.py:565
msgid "Greek"
msgstr "Грецька"
#: paperless/settings/__init__.py:555
#: paperless/settings/__init__.py:566
msgid "English (GB)"
msgstr "Англійська (Велика Британія)"
#: paperless/settings/__init__.py:556
#: paperless/settings/__init__.py:567
msgid "Spanish"
msgstr "Іспанська"
#: paperless/settings/__init__.py:557
#: paperless/settings/__init__.py:568
msgid "Persian"
msgstr ""
#: paperless/settings/__init__.py:558
#: paperless/settings/__init__.py:569
msgid "Finnish"
msgstr "Фінська"
#: paperless/settings/__init__.py:559
#: paperless/settings/__init__.py:570
msgid "French"
msgstr "Французька"
#: paperless/settings/__init__.py:560
#: paperless/settings/__init__.py:571
msgid "Hungarian"
msgstr "Угорська"
#: paperless/settings/__init__.py:561
#: paperless/settings/__init__.py:572
msgid "Indonesian"
msgstr ""
#: paperless/settings/__init__.py:562
#: paperless/settings/__init__.py:573
msgid "Italian"
msgstr "Італійська"
#: paperless/settings/__init__.py:563
#: paperless/settings/__init__.py:574
msgid "Japanese"
msgstr "Японська"
#: paperless/settings/__init__.py:564
#: paperless/settings/__init__.py:575
msgid "Korean"
msgstr "Корейська"
#: paperless/settings/__init__.py:565
#: paperless/settings/__init__.py:576
msgid "Luxembourgish"
msgstr "Люксембурзька"
#: paperless/settings/__init__.py:566
#: paperless/settings/__init__.py:577
msgid "Norwegian"
msgstr "Норвезька"
#: paperless/settings/__init__.py:567
#: paperless/settings/__init__.py:578
msgid "Dutch"
msgstr "Нідерландська"
#: paperless/settings/__init__.py:568
#: paperless/settings/__init__.py:579
msgid "Polish"
msgstr "Польська"
#: paperless/settings/__init__.py:569
#: paperless/settings/__init__.py:580
msgid "Portuguese (Brazil)"
msgstr "Португальська (Бразилія)"
#: paperless/settings/__init__.py:570
#: paperless/settings/__init__.py:581
msgid "Portuguese"
msgstr "Португальська"
#: paperless/settings/__init__.py:571
#: paperless/settings/__init__.py:582
msgid "Romanian"
msgstr "Румунська"
#: paperless/settings/__init__.py:572
#: paperless/settings/__init__.py:583
msgid "Russian"
msgstr "Російська"
#: paperless/settings/__init__.py:573
#: paperless/settings/__init__.py:584
msgid "Slovak"
msgstr "Словацька"
#: paperless/settings/__init__.py:574
#: paperless/settings/__init__.py:585
msgid "Slovenian"
msgstr "Словенська"
#: paperless/settings/__init__.py:575
#: paperless/settings/__init__.py:586
msgid "Serbian"
msgstr "Сербська"
#: paperless/settings/__init__.py:576
#: paperless/settings/__init__.py:587
msgid "Swedish"
msgstr "Шведська"
#: paperless/settings/__init__.py:577
#: paperless/settings/__init__.py:588
msgid "Turkish"
msgstr "Турецька"
#: paperless/settings/__init__.py:578
#: paperless/settings/__init__.py:589
msgid "Ukrainian"
msgstr "Українська"
#: paperless/settings/__init__.py:579
#: paperless/settings/__init__.py:590
msgid "Vietnamese"
msgstr ""
#: paperless/settings/__init__.py:580
#: paperless/settings/__init__.py:591
msgid "Chinese Simplified"
msgstr "Китайська спрощена"
#: paperless/settings/__init__.py:581
#: paperless/settings/__init__.py:592
msgid "Chinese Traditional"
msgstr ""
+39 -39
View File
@@ -2,8 +2,8 @@ msgid ""
msgstr ""
"Project-Id-Version: paperless-ngx\n"
"Report-Msgid-Bugs-To: \n"
"POT-Creation-Date: 2026-07-23 19:21+0000\n"
"PO-Revision-Date: 2026-07-23 19:23\n"
"POT-Creation-Date: 2026-07-25 07:12+0000\n"
"PO-Revision-Date: 2026-07-25 07:14\n"
"Last-Translator: \n"
"Language-Team: Vietnamese\n"
"Language: vi_VN\n"
@@ -1920,151 +1920,151 @@ msgstr ""
msgid "paperless application settings"
msgstr "thiết đặt ứng dụng không cần giấy tờ"
#: paperless/settings/__init__.py:545
#: paperless/settings/__init__.py:556
msgid "English (US)"
msgstr "Tiếng Anh (Hoa Kỳ)"
#: paperless/settings/__init__.py:546
#: paperless/settings/__init__.py:557
msgid "Arabic"
msgstr "Tiếng Ả Rập"
#: paperless/settings/__init__.py:547
#: paperless/settings/__init__.py:558
msgid "Afrikaans"
msgstr "Tiếng Afrikaans"
#: paperless/settings/__init__.py:548
#: paperless/settings/__init__.py:559
msgid "Belarusian"
msgstr "Tiếng Belarus"
#: paperless/settings/__init__.py:549
#: paperless/settings/__init__.py:560
msgid "Bulgarian"
msgstr "Tiếng Bulgaria"
#: paperless/settings/__init__.py:550
#: paperless/settings/__init__.py:561
msgid "Catalan"
msgstr "Tiếng Catalan"
#: paperless/settings/__init__.py:551
#: paperless/settings/__init__.py:562
msgid "Czech"
msgstr "Séc"
#: paperless/settings/__init__.py:552
#: paperless/settings/__init__.py:563
msgid "Danish"
msgstr "Đan Mạch"
#: paperless/settings/__init__.py:553
#: paperless/settings/__init__.py:564
msgid "German"
msgstr "Tiếng Đức"
#: paperless/settings/__init__.py:554
#: paperless/settings/__init__.py:565
msgid "Greek"
msgstr "Tiếng Hy Lạp"
#: paperless/settings/__init__.py:555
#: paperless/settings/__init__.py:566
msgid "English (GB)"
msgstr "Tiếng Anh (GB)"
#: paperless/settings/__init__.py:556
#: paperless/settings/__init__.py:567
msgid "Spanish"
msgstr "Tiếng Tây Ban Nha"
#: paperless/settings/__init__.py:557
#: paperless/settings/__init__.py:568
msgid "Persian"
msgstr "Tiếng Ba Tư"
#: paperless/settings/__init__.py:558
#: paperless/settings/__init__.py:569
msgid "Finnish"
msgstr "Tiếng Phần Lan"
#: paperless/settings/__init__.py:559
#: paperless/settings/__init__.py:570
msgid "French"
msgstr "Tiếng Pháp"
#: paperless/settings/__init__.py:560
#: paperless/settings/__init__.py:571
msgid "Hungarian"
msgstr "Tiếng Hungary"
#: paperless/settings/__init__.py:561
#: paperless/settings/__init__.py:572
msgid "Indonesian"
msgstr "Tiếng Indonesia"
#: paperless/settings/__init__.py:562
#: paperless/settings/__init__.py:573
msgid "Italian"
msgstr "Tiếng Ý"
#: paperless/settings/__init__.py:563
#: paperless/settings/__init__.py:574
msgid "Japanese"
msgstr "Tiếng Nhật"
#: paperless/settings/__init__.py:564
#: paperless/settings/__init__.py:575
msgid "Korean"
msgstr "Tiếng Hàn"
#: paperless/settings/__init__.py:565
#: paperless/settings/__init__.py:576
msgid "Luxembourgish"
msgstr "Luxembourgish"
#: paperless/settings/__init__.py:566
#: paperless/settings/__init__.py:577
msgid "Norwegian"
msgstr "Tiếng Na Uy"
#: paperless/settings/__init__.py:567
#: paperless/settings/__init__.py:578
msgid "Dutch"
msgstr "Tiếng Hà Lan"
#: paperless/settings/__init__.py:568
#: paperless/settings/__init__.py:579
msgid "Polish"
msgstr "Tiếng Ba Lan"
#: paperless/settings/__init__.py:569
#: paperless/settings/__init__.py:580
msgid "Portuguese (Brazil)"
msgstr "Tiếng Bồ Đào Nha (Brazil)"
#: paperless/settings/__init__.py:570
#: paperless/settings/__init__.py:581
msgid "Portuguese"
msgstr "Tiếng Bồ Đào Nha"
#: paperless/settings/__init__.py:571
#: paperless/settings/__init__.py:582
msgid "Romanian"
msgstr "Tiếng Romania"
#: paperless/settings/__init__.py:572
#: paperless/settings/__init__.py:583
msgid "Russian"
msgstr "Tiếng Nga"
#: paperless/settings/__init__.py:573
#: paperless/settings/__init__.py:584
msgid "Slovak"
msgstr "Tiếng Slovakia"
#: paperless/settings/__init__.py:574
#: paperless/settings/__init__.py:585
msgid "Slovenian"
msgstr "Tiếng Slovenia"
#: paperless/settings/__init__.py:575
#: paperless/settings/__init__.py:586
msgid "Serbian"
msgstr "Tiếng Serbia"
#: paperless/settings/__init__.py:576
#: paperless/settings/__init__.py:587
msgid "Swedish"
msgstr "Tiếng Thụy Điển"
#: paperless/settings/__init__.py:577
#: paperless/settings/__init__.py:588
msgid "Turkish"
msgstr "Thổ Nhĩ Kỳ"
#: paperless/settings/__init__.py:578
#: paperless/settings/__init__.py:589
msgid "Ukrainian"
msgstr "Ukraine"
#: paperless/settings/__init__.py:579
#: paperless/settings/__init__.py:590
msgid "Vietnamese"
msgstr "Tiếng Việt"
#: paperless/settings/__init__.py:580
#: paperless/settings/__init__.py:591
msgid "Chinese Simplified"
msgstr "Tiếng Trung Giản thể"
#: paperless/settings/__init__.py:581
#: paperless/settings/__init__.py:592
msgid "Chinese Traditional"
msgstr "Tiếng Trung (Phồn thể)"
+39 -39
View File
@@ -2,8 +2,8 @@ msgid ""
msgstr ""
"Project-Id-Version: paperless-ngx\n"
"Report-Msgid-Bugs-To: \n"
"POT-Creation-Date: 2026-07-23 19:21+0000\n"
"PO-Revision-Date: 2026-07-23 19:23\n"
"POT-Creation-Date: 2026-07-25 07:12+0000\n"
"PO-Revision-Date: 2026-07-25 07:14\n"
"Last-Translator: \n"
"Language-Team: Chinese Simplified\n"
"Language: zh_CN\n"
@@ -1920,151 +1920,151 @@ msgstr "设置 LLM 超时时间(秒)"
msgid "paperless application settings"
msgstr "paperless 应用设置"
#: paperless/settings/__init__.py:545
#: paperless/settings/__init__.py:556
msgid "English (US)"
msgstr "英语(美国)"
#: paperless/settings/__init__.py:546
#: paperless/settings/__init__.py:557
msgid "Arabic"
msgstr "阿拉伯语"
#: paperless/settings/__init__.py:547
#: paperless/settings/__init__.py:558
msgid "Afrikaans"
msgstr "Afrikaans 荷兰语"
#: paperless/settings/__init__.py:548
#: paperless/settings/__init__.py:559
msgid "Belarusian"
msgstr "白俄罗斯语"
#: paperless/settings/__init__.py:549
#: paperless/settings/__init__.py:560
msgid "Bulgarian"
msgstr "保加利亚语"
#: paperless/settings/__init__.py:550
#: paperless/settings/__init__.py:561
msgid "Catalan"
msgstr "Catalan 加泰罗尼亚语"
#: paperless/settings/__init__.py:551
#: paperless/settings/__init__.py:562
msgid "Czech"
msgstr "捷克语"
#: paperless/settings/__init__.py:552
#: paperless/settings/__init__.py:563
msgid "Danish"
msgstr "丹麦语"
#: paperless/settings/__init__.py:553
#: paperless/settings/__init__.py:564
msgid "German"
msgstr "德语"
#: paperless/settings/__init__.py:554
#: paperless/settings/__init__.py:565
msgid "Greek"
msgstr "Greek 希腊语"
#: paperless/settings/__init__.py:555
#: paperless/settings/__init__.py:566
msgid "English (GB)"
msgstr "英语(英国)"
#: paperless/settings/__init__.py:556
#: paperless/settings/__init__.py:567
msgid "Spanish"
msgstr "西班牙语"
#: paperless/settings/__init__.py:557
#: paperless/settings/__init__.py:568
msgid "Persian"
msgstr "波斯文"
#: paperless/settings/__init__.py:558
#: paperless/settings/__init__.py:569
msgid "Finnish"
msgstr "已完成"
#: paperless/settings/__init__.py:559
#: paperless/settings/__init__.py:570
msgid "French"
msgstr "法语"
#: paperless/settings/__init__.py:560
#: paperless/settings/__init__.py:571
msgid "Hungarian"
msgstr "匈牙利语"
#: paperless/settings/__init__.py:561
#: paperless/settings/__init__.py:572
msgid "Indonesian"
msgstr "印度尼西亚语"
#: paperless/settings/__init__.py:562
#: paperless/settings/__init__.py:573
msgid "Italian"
msgstr "意大利语"
#: paperless/settings/__init__.py:563
#: paperless/settings/__init__.py:574
msgid "Japanese"
msgstr "日语"
#: paperless/settings/__init__.py:564
#: paperless/settings/__init__.py:575
msgid "Korean"
msgstr "韩语"
#: paperless/settings/__init__.py:565
#: paperless/settings/__init__.py:576
msgid "Luxembourgish"
msgstr "卢森堡语"
#: paperless/settings/__init__.py:566
#: paperless/settings/__init__.py:577
msgid "Norwegian"
msgstr "Norwegian 挪威语"
#: paperless/settings/__init__.py:567
#: paperless/settings/__init__.py:578
msgid "Dutch"
msgstr "荷兰语"
#: paperless/settings/__init__.py:568
#: paperless/settings/__init__.py:579
msgid "Polish"
msgstr "波兰语"
#: paperless/settings/__init__.py:569
#: paperless/settings/__init__.py:580
msgid "Portuguese (Brazil)"
msgstr "葡萄牙语 (巴西)"
#: paperless/settings/__init__.py:570
#: paperless/settings/__init__.py:581
msgid "Portuguese"
msgstr "葡萄牙语"
#: paperless/settings/__init__.py:571
#: paperless/settings/__init__.py:582
msgid "Romanian"
msgstr "罗马尼亚语"
#: paperless/settings/__init__.py:572
#: paperless/settings/__init__.py:583
msgid "Russian"
msgstr "俄语"
#: paperless/settings/__init__.py:573
#: paperless/settings/__init__.py:584
msgid "Slovak"
msgstr "斯洛伐克语"
#: paperless/settings/__init__.py:574
#: paperless/settings/__init__.py:585
msgid "Slovenian"
msgstr "斯洛语尼亚语"
#: paperless/settings/__init__.py:575
#: paperless/settings/__init__.py:586
msgid "Serbian"
msgstr "塞尔维亚语"
#: paperless/settings/__init__.py:576
#: paperless/settings/__init__.py:587
msgid "Swedish"
msgstr "瑞典语"
#: paperless/settings/__init__.py:577
#: paperless/settings/__init__.py:588
msgid "Turkish"
msgstr "土耳其语"
#: paperless/settings/__init__.py:578
#: paperless/settings/__init__.py:589
msgid "Ukrainian"
msgstr "乌克兰语"
#: paperless/settings/__init__.py:579
#: paperless/settings/__init__.py:590
msgid "Vietnamese"
msgstr "越南语"
#: paperless/settings/__init__.py:580
#: paperless/settings/__init__.py:591
msgid "Chinese Simplified"
msgstr "简体中文"
#: paperless/settings/__init__.py:581
#: paperless/settings/__init__.py:592
msgid "Chinese Traditional"
msgstr "繁体中文"
+39 -39
View File
@@ -2,8 +2,8 @@ msgid ""
msgstr ""
"Project-Id-Version: paperless-ngx\n"
"Report-Msgid-Bugs-To: \n"
"POT-Creation-Date: 2026-07-23 19:21+0000\n"
"PO-Revision-Date: 2026-07-23 19:23\n"
"POT-Creation-Date: 2026-07-25 07:12+0000\n"
"PO-Revision-Date: 2026-07-25 07:14\n"
"Last-Translator: \n"
"Language-Team: Chinese Traditional\n"
"Language: zh_TW\n"
@@ -1920,151 +1920,151 @@ msgstr ""
msgid "paperless application settings"
msgstr "Paperless 應用程式設定"
#: paperless/settings/__init__.py:545
#: paperless/settings/__init__.py:556
msgid "English (US)"
msgstr "英文(美國)"
#: paperless/settings/__init__.py:546
#: paperless/settings/__init__.py:557
msgid "Arabic"
msgstr "阿拉伯文"
#: paperless/settings/__init__.py:547
#: paperless/settings/__init__.py:558
msgid "Afrikaans"
msgstr "南非荷蘭文"
#: paperless/settings/__init__.py:548
#: paperless/settings/__init__.py:559
msgid "Belarusian"
msgstr "白俄羅斯文"
#: paperless/settings/__init__.py:549
#: paperless/settings/__init__.py:560
msgid "Bulgarian"
msgstr "保加利亞文"
#: paperless/settings/__init__.py:550
#: paperless/settings/__init__.py:561
msgid "Catalan"
msgstr "加泰羅尼亞文"
#: paperless/settings/__init__.py:551
#: paperless/settings/__init__.py:562
msgid "Czech"
msgstr "捷克文"
#: paperless/settings/__init__.py:552
#: paperless/settings/__init__.py:563
msgid "Danish"
msgstr "丹麥文"
#: paperless/settings/__init__.py:553
#: paperless/settings/__init__.py:564
msgid "German"
msgstr "德文"
#: paperless/settings/__init__.py:554
#: paperless/settings/__init__.py:565
msgid "Greek"
msgstr "希臘文"
#: paperless/settings/__init__.py:555
#: paperless/settings/__init__.py:566
msgid "English (GB)"
msgstr "英文(英國)"
#: paperless/settings/__init__.py:556
#: paperless/settings/__init__.py:567
msgid "Spanish"
msgstr "西班牙文"
#: paperless/settings/__init__.py:557
#: paperless/settings/__init__.py:568
msgid "Persian"
msgstr "波斯文"
#: paperless/settings/__init__.py:558
#: paperless/settings/__init__.py:569
msgid "Finnish"
msgstr "芬蘭文"
#: paperless/settings/__init__.py:559
#: paperless/settings/__init__.py:570
msgid "French"
msgstr "法文"
#: paperless/settings/__init__.py:560
#: paperless/settings/__init__.py:571
msgid "Hungarian"
msgstr "匈牙利文"
#: paperless/settings/__init__.py:561
#: paperless/settings/__init__.py:572
msgid "Indonesian"
msgstr ""
#: paperless/settings/__init__.py:562
#: paperless/settings/__init__.py:573
msgid "Italian"
msgstr "義大利文"
#: paperless/settings/__init__.py:563
#: paperless/settings/__init__.py:574
msgid "Japanese"
msgstr "日文"
#: paperless/settings/__init__.py:564
#: paperless/settings/__init__.py:575
msgid "Korean"
msgstr "韓文"
#: paperless/settings/__init__.py:565
#: paperless/settings/__init__.py:576
msgid "Luxembourgish"
msgstr "盧森堡文"
#: paperless/settings/__init__.py:566
#: paperless/settings/__init__.py:577
msgid "Norwegian"
msgstr "挪威文"
#: paperless/settings/__init__.py:567
#: paperless/settings/__init__.py:578
msgid "Dutch"
msgstr "荷蘭文"
#: paperless/settings/__init__.py:568
#: paperless/settings/__init__.py:579
msgid "Polish"
msgstr "波蘭文"
#: paperless/settings/__init__.py:569
#: paperless/settings/__init__.py:580
msgid "Portuguese (Brazil)"
msgstr "葡萄牙文(巴西)"
#: paperless/settings/__init__.py:570
#: paperless/settings/__init__.py:581
msgid "Portuguese"
msgstr "葡萄牙文"
#: paperless/settings/__init__.py:571
#: paperless/settings/__init__.py:582
msgid "Romanian"
msgstr "羅馬尼亞文"
#: paperless/settings/__init__.py:572
#: paperless/settings/__init__.py:583
msgid "Russian"
msgstr "俄文"
#: paperless/settings/__init__.py:573
#: paperless/settings/__init__.py:584
msgid "Slovak"
msgstr "斯洛伐克文"
#: paperless/settings/__init__.py:574
#: paperless/settings/__init__.py:585
msgid "Slovenian"
msgstr "斯洛維尼亞文"
#: paperless/settings/__init__.py:575
#: paperless/settings/__init__.py:586
msgid "Serbian"
msgstr "塞爾維亞文"
#: paperless/settings/__init__.py:576
#: paperless/settings/__init__.py:587
msgid "Swedish"
msgstr "瑞典文"
#: paperless/settings/__init__.py:577
#: paperless/settings/__init__.py:588
msgid "Turkish"
msgstr "土耳其文"
#: paperless/settings/__init__.py:578
#: paperless/settings/__init__.py:589
msgid "Ukrainian"
msgstr "烏克蘭文"
#: paperless/settings/__init__.py:579
#: paperless/settings/__init__.py:590
msgid "Vietnamese"
msgstr "越南文"
#: paperless/settings/__init__.py:580
#: paperless/settings/__init__.py:591
msgid "Chinese Simplified"
msgstr "簡體中文"
#: paperless/settings/__init__.py:581
#: paperless/settings/__init__.py:592
msgid "Chinese Traditional"
msgstr "繁體中文"
@@ -5,12 +5,30 @@ from django.db import migrations
from django.db import models
def clamp_applicationconfiguration_integer_fields(apps, schema_editor):
# Clamp barcode_dpi, barcode_max_pages, image_dpi and pages because of
# PositiveIntegerField --> PositiveSmallIntegerField
ApplicationConfiguration = apps.get_model("paperless", "ApplicationConfiguration")
ApplicationConfiguration.objects.filter(barcode_dpi__gt=32767).update(
barcode_dpi=32767,
)
ApplicationConfiguration.objects.filter(barcode_max_pages__gt=32767).update(
barcode_max_pages=32767,
)
ApplicationConfiguration.objects.filter(image_dpi__gt=32767).update(image_dpi=32767)
ApplicationConfiguration.objects.filter(pages__gt=32767).update(pages=32767)
class Migration(migrations.Migration):
dependencies = [
("paperless", "0006_applicationconfiguration_barcode_tag_split"),
]
operations = [
migrations.RunPython(
clamp_applicationconfiguration_integer_fields,
migrations.RunPython.noop,
),
migrations.AlterField(
model_name="applicationconfiguration",
name="barcode_dpi",
+5
View File
@@ -421,6 +421,11 @@ class TikaDocumentParser:
logger.info("Converting %s to PDF as %s", document_path, pdf_path)
with self._gotenberg_client.libre_office.to_pdf() as route:
# Preserve document fields as authored. updateIndexes (Gotenberg's
# default) triggers a refresh() that rewrites dynamic fields like
# auto-dates to the current date.
route.update_indexes(update_indexes=False)
# Set the output format of the resulting PDF.
# OutputTypeConfig reads the database-stored ApplicationConfiguration
# first, then falls back to the PAPERLESS_OCR_OUTPUT_TYPE env var.
+14 -3
View File
@@ -460,11 +460,22 @@ def _parse_paperless_url():
PAPERLESS_URL = _parse_paperless_url()
def _get_allauth_trusted_proxy_count(trusted_proxies: list[str]) -> int:
count = get_int_from_env(
"PAPERLESS_ALLAUTH_TRUSTED_PROXY_COUNT",
len(trusted_proxies),
)
if count < 0:
raise ImproperlyConfigured(
"PAPERLESS_ALLAUTH_TRUSTED_PROXY_COUNT must be zero or greater",
)
return count
# For use with trusted proxies
TRUSTED_PROXIES = get_list_from_env("PAPERLESS_TRUSTED_PROXIES")
# Derive allauth's proxy count from the same list so X-Forwarded-For is trusted
# correctly when users have configured PAPERLESS_TRUSTED_PROXIES.
ALLAUTH_TRUSTED_PROXY_COUNT = len(TRUSTED_PROXIES)
ALLAUTH_TRUSTED_PROXY_COUNT = _get_allauth_trusted_proxy_count(TRUSTED_PROXIES)
ALLAUTH_TRUSTED_CLIENT_IP_HEADER = os.getenv(
"PAPERLESS_ALLAUTH_TRUSTED_CLIENT_IP_HEADER",
)
@@ -223,4 +223,11 @@ class TestTikaParser:
assert form_field_found
# Field updates must be disabled so LibreOffice preserves document
# fields (e.g. auto-date fields) as authored rather than refreshing
# them to the current date.
assert any(
b'name="updateIndexes"' in part and b"false" in part for part in parts
)
httpx_mock.reset()
@@ -3,7 +3,9 @@ from unittest import TestCase
from unittest import mock
import pytest
from django.core.exceptions import ImproperlyConfigured
from paperless.settings import _get_allauth_trusted_proxy_count
from paperless.settings import _get_search_language_setting
from paperless.settings import _parse_paperless_url
from paperless.settings import default_threads_per_worker
@@ -35,6 +37,31 @@ class TestThreadCalculation(TestCase):
self.assertLessEqual(default_workers * default_threads, i)
def test_allauth_trusted_proxy_count_defaults_to_trusted_proxies(
monkeypatch: pytest.MonkeyPatch,
) -> None:
monkeypatch.delenv("PAPERLESS_ALLAUTH_TRUSTED_PROXY_COUNT", raising=False)
assert _get_allauth_trusted_proxy_count(["proxy-v4", "proxy-v6"]) == 2
def test_allauth_trusted_proxy_count_can_be_overridden(
monkeypatch: pytest.MonkeyPatch,
) -> None:
monkeypatch.setenv("PAPERLESS_ALLAUTH_TRUSTED_PROXY_COUNT", "1")
assert _get_allauth_trusted_proxy_count(["proxy-v4", "proxy-v6"]) == 1
def test_allauth_trusted_proxy_count_rejects_negative_values(
monkeypatch: pytest.MonkeyPatch,
) -> None:
monkeypatch.setenv("PAPERLESS_ALLAUTH_TRUSTED_PROXY_COUNT", "-1")
with pytest.raises(ImproperlyConfigured, match="must be zero or greater"):
_get_allauth_trusted_proxy_count([])
@pytest.mark.parametrize(
("env_value", "expected"),
[
+2
View File
@@ -2,6 +2,8 @@ from pydantic import BaseModel
class DocumentClassifierSchema(BaseModel):
"""Schema for document classification suggestions."""
title: str
tags: list[str]
correspondents: list[str]
+27 -4
View File
@@ -28,11 +28,22 @@ CHAT_PROMPT_TMPL = (
"---------------------\n"
"Using only the context above, answer the query. "
"Do not use prior knowledge.\n"
"{output_language_line}"
"Query: {query_str}\n"
"Answer:"
)
def _build_chat_prompt(output_language: str | None) -> str:
output_language_line = (
f"Respond in {output_language}.\n" if output_language is not None else ""
)
return CHAT_PROMPT_TMPL.replace(
"{output_language_line}",
output_language_line,
)
def _build_document_reference(
document: Document,
title: str | None = None,
@@ -79,15 +90,27 @@ def _format_chat_metadata_trailer(references: list[dict[str, int | str]]) -> str
)
def stream_chat_with_documents(query_str: str, documents: list[Document]):
def stream_chat_with_documents(
query_str: str,
documents: list[Document],
output_language: str | None = None,
):
try:
yield from _stream_chat_with_documents(query_str, documents)
yield from _stream_chat_with_documents(
query_str,
documents,
output_language=output_language,
)
except Exception as e:
logger.exception("Failed to stream document chat response: %s", e)
yield CHAT_ERROR_MESSAGE
def _stream_chat_with_documents(query_str: str, documents: list[Document]):
def _stream_chat_with_documents(
query_str: str,
documents: list[Document],
output_language: str | None = None,
):
if not documents:
yield CHAT_NO_CONTENT_MESSAGE
return
@@ -125,7 +148,7 @@ def _stream_chat_with_documents(query_str: str, documents: list[Document]):
references = _get_document_references(documents, top_nodes)
prompt_template = PromptTemplate(template=CHAT_PROMPT_TMPL)
prompt_template = PromptTemplate(template=_build_chat_prompt(output_language))
response_synthesizer = get_response_synthesizer(
llm=client.llm,
prompt_helper=get_rag_prompt_helper(

Some files were not shown because too many files have changed in this diff Show More