Compare commits

..
Author SHA1 Message Date
Crowdin Bot b4d4059f76 New Crowdin translations by GitHub Action 2026-09-27 01:01:48 +00:00
shamoon 7b98085b31 Fix: prevent dev pdf viewer link flash (#14268) 2026-09-26 07:02:49 -07:00
shamoon b3bf220f56 Fix: rest of PDF link fix 2026-09-25 20:08:36 -07:00
shamoon d4429c3cc7 Fix: allow pointer events for pdf links in pngx viewer (#14264) 2026-09-25 18:35:21 -07:00
Trenton H 4f777d7438 Feature: propagate resolved secrets to interactive container shells (#14254)
docker exec bash bypasses s6, so *_FILE secrets resolved by init-env-file
into /run/s6/container_environment aren't visible even though s6 services
and management wrappers already see them via with-contenv.

Add /etc/profile.d/contenv.sh, sourced by both login and non-login
interactive bash shells, to export those resolved values into the shell.
2026-09-24 13:07:41 -07:00
150 changed files with 16230 additions and 15809 deletions
+320 -343
View File
@@ -451,174 +451,166 @@ src/documents/search/_backend.py:0: error: Tuple index out of range [misc]
src/documents/search/_backend.py:0: error: Tuple index out of range [misc] src/documents/search/_backend.py:0: error: Tuple index out of range [misc]
src/documents/search/_query.py:0: error: Argument 3 to "regex_phrase_query" of "Query" has incompatible type "list[str]"; expected "list[str | tuple[int, str]]" [arg-type] src/documents/search/_query.py:0: error: Argument 3 to "regex_phrase_query" of "Query" has incompatible type "list[str]"; expected "list[str | tuple[int, str]]" [arg-type]
src/documents/search/_query.py:0: error: Library stubs not installed for "regex" [import-untyped] src/documents/search/_query.py:0: error: Library stubs not installed for "regex" [import-untyped]
src/documents/serialisers/base.py:0: error: "type[_MT?]" has no attribute "_meta" [attr-defined] src/documents/serialisers.py:0: error: "type[_MT?]" has no attribute "objects" [attr-defined]
src/documents/serialisers/base.py:0: error: "type[_MT?]" has no attribute "objects" [attr-defined] src/documents/serialisers.py:0: error: "type[_MT?]" has no attribute "objects" [attr-defined]
src/documents/serialisers/base.py:0: error: "type[_MT?]" has no attribute "objects" [attr-defined] src/documents/serialisers.py:0: error: "type[_MT?]" has no attribute "objects" [attr-defined]
src/documents/serialisers/base.py:0: error: "type[_MT?]" has no attribute "objects" [attr-defined] src/documents/serialisers.py:0: error: Argument "choices" to "ChoiceField" has incompatible type "type[FieldDataType]"; expected "Sequence[Any]" [arg-type]
src/documents/serialisers/base.py:0: error: Function is missing a return type annotation [no-untyped-def] src/documents/serialisers.py:0: error: Argument "default" to "MultipleChoiceField" has incompatible type "set[DocumentSource]"; expected "set[str | int] | set[str] | set[int] | Callable[[], set[str | int] | set[str] | set[int]] | _Empty | None" [arg-type]
src/documents/serialisers/base.py:0: error: Function is missing a return type annotation [no-untyped-def] src/documents/serialisers.py:0: error: Argument 1 of "get_value" is incompatible with supertype "rest_framework.fields.Field"; supertype defines the argument type as "Mapping[Any, Any]" [override]
src/documents/serialisers/base.py:0: error: Function is missing a type annotation [no-untyped-def] src/documents/serialisers.py:0: error: Argument 1 of "update" is incompatible with supertype "rest_framework.serializers.BaseSerializer"; supertype defines the argument type as "dict[str, Any]" [override]
src/documents/serialisers/base.py:0: error: Function is missing a type annotation [no-untyped-def] src/documents/serialisers.py:0: error: Argument 1 to "get_value_field_name" of "CustomFieldInstance" has incompatible type "str"; expected "FieldDataType" [arg-type]
src/documents/serialisers/base.py:0: error: Function is missing a type annotation [no-untyped-def] src/documents/serialisers.py:0: error: Argument 1 to "int" has incompatible type "Any | Collection[str]"; expected "str | Buffer | SupportsInt | SupportsIndex | SupportsTrunc" [arg-type]
src/documents/serialisers/base.py:0: error: Function is missing a type annotation [no-untyped-def] src/documents/serialisers.py:0: error: Argument 1 to "list" has incompatible type "QuerySet[Document, TypedDict({'id': int, 'title': str, 'deleted_at': datetime | None})]"; expected "Iterable[dict[str, Any]]" [arg-type]
src/documents/serialisers/base.py:0: error: Function is missing a type annotation [no-untyped-def] src/documents/serialisers.py:0: error: Expected iterable as variadic argument [misc]
src/documents/serialisers/base.py:0: error: Function is missing a type annotation [no-untyped-def] src/documents/serialisers.py:0: error: Function is missing a return type annotation [no-untyped-def]
src/documents/serialisers/base.py:0: error: Function is missing a type annotation [no-untyped-def] src/documents/serialisers.py:0: error: Function is missing a return type annotation [no-untyped-def]
src/documents/serialisers/base.py:0: error: Function is missing a type annotation [no-untyped-def] src/documents/serialisers.py:0: error: Function is missing a return type annotation [no-untyped-def]
src/documents/serialisers/base.py:0: error: Function is missing a type annotation [no-untyped-def] src/documents/serialisers.py:0: error: Function is missing a return type annotation [no-untyped-def]
src/documents/serialisers/base.py:0: error: Function is missing a type annotation [no-untyped-def] src/documents/serialisers.py:0: error: Function is missing a return type annotation [no-untyped-def]
src/documents/serialisers/base.py:0: error: Function is missing a type annotation [no-untyped-def] src/documents/serialisers.py:0: error: Function is missing a return type annotation [no-untyped-def]
src/documents/serialisers/base.py:0: error: Function is missing a type annotation [no-untyped-def] src/documents/serialisers.py:0: error: Function is missing a return type annotation [no-untyped-def]
src/documents/serialisers/base.py:0: error: Function is missing a type annotation [no-untyped-def] src/documents/serialisers.py:0: error: Function is missing a return type annotation [no-untyped-def]
src/documents/serialisers/base.py:0: error: Function is missing a type annotation [no-untyped-def] src/documents/serialisers.py:0: error: Function is missing a type annotation [no-untyped-def]
src/documents/serialisers/base.py:0: error: Function is missing a type annotation for one or more parameters [no-untyped-def] src/documents/serialisers.py:0: error: Function is missing a type annotation [no-untyped-def]
src/documents/serialisers/base.py:0: error: Function is missing a type annotation for one or more parameters [no-untyped-def] src/documents/serialisers.py:0: error: Function is missing a type annotation [no-untyped-def]
src/documents/serialisers/base.py:0: error: Function is missing a type annotation for one or more parameters [no-untyped-def] src/documents/serialisers.py:0: error: Function is missing a type annotation [no-untyped-def]
src/documents/serialisers/base.py:0: error: Function is missing a type annotation for one or more parameters [no-untyped-def] src/documents/serialisers.py:0: error: Function is missing a type annotation [no-untyped-def]
src/documents/serialisers/base.py:0: error: Function is missing a type annotation for one or more parameters [no-untyped-def] src/documents/serialisers.py:0: error: Function is missing a type annotation [no-untyped-def]
src/documents/serialisers/base.py:0: error: Function is missing a type annotation for one or more parameters [no-untyped-def] src/documents/serialisers.py:0: error: Function is missing a type annotation [no-untyped-def]
src/documents/serialisers/base.py:0: error: Function is missing a type annotation for one or more parameters [no-untyped-def] src/documents/serialisers.py:0: error: Function is missing a type annotation [no-untyped-def]
src/documents/serialisers/base.py:0: error: Function is missing a type annotation for one or more parameters [no-untyped-def] src/documents/serialisers.py:0: error: Function is missing a type annotation [no-untyped-def]
src/documents/serialisers/base.py:0: error: Function is missing a type annotation for one or more parameters [no-untyped-def] src/documents/serialisers.py:0: error: Function is missing a type annotation [no-untyped-def]
src/documents/serialisers/base.py:0: error: Function is missing a type annotation for one or more parameters [no-untyped-def] src/documents/serialisers.py:0: error: Function is missing a type annotation [no-untyped-def]
src/documents/serialisers/base.py:0: error: Function is missing a type annotation for one or more parameters [no-untyped-def] src/documents/serialisers.py:0: error: Function is missing a type annotation [no-untyped-def]
src/documents/serialisers/base.py:0: error: Function is missing a type annotation for one or more parameters [no-untyped-def] src/documents/serialisers.py:0: error: Function is missing a type annotation [no-untyped-def]
src/documents/serialisers/base.py:0: error: Item "Field[Any, Any, Any, Any]" of "Field[Any, Any, Any, Any] | None" has no attribute "get_shared_object_pks" [union-attr] src/documents/serialisers.py:0: error: Function is missing a type annotation [no-untyped-def]
src/documents/serialisers/base.py:0: error: Item "None" of "Any | None" has no attribute "name" [union-attr] src/documents/serialisers.py:0: error: Function is missing a type annotation [no-untyped-def]
src/documents/serialisers/base.py:0: error: Item "None" of "Any | None" has no attribute "pk" [union-attr] src/documents/serialisers.py:0: error: Function is missing a type annotation [no-untyped-def]
src/documents/serialisers/base.py:0: error: Item "None" of "Field[Any, Any, Any, Any] | None" has no attribute "context" [union-attr] src/documents/serialisers.py:0: error: Function is missing a type annotation [no-untyped-def]
src/documents/serialisers/base.py:0: error: Item "None" of "Field[Any, Any, Any, Any] | None" has no attribute "get_shared_object_pks" [union-attr] src/documents/serialisers.py:0: error: Function is missing a type annotation [no-untyped-def]
src/documents/serialisers/base.py:0: error: Item "list[str]" of "Any | list[str]" has no attribute "values_list" [union-attr] src/documents/serialisers.py:0: error: Function is missing a type annotation [no-untyped-def]
src/documents/serialisers/base.py:0: error: Missing type arguments for generic type "Iterable" [type-arg] src/documents/serialisers.py:0: error: Function is missing a type annotation [no-untyped-def]
src/documents/serialisers/base.py:0: error: Missing type arguments for generic type "dict" [type-arg] src/documents/serialisers.py:0: error: Function is missing a type annotation [no-untyped-def]
src/documents/serialisers/base.py:0: error: Need type annotation for "permissions_dict" [var-annotated] src/documents/serialisers.py:0: error: Function is missing a type annotation [no-untyped-def]
src/documents/serialisers/bulk_edit.py:0: error: Function is missing a type annotation [no-untyped-def] src/documents/serialisers.py:0: error: Function is missing a type annotation [no-untyped-def]
src/documents/serialisers/bulk_edit.py:0: error: Function is missing a type annotation [no-untyped-def] src/documents/serialisers.py:0: error: Function is missing a type annotation [no-untyped-def]
src/documents/serialisers/bulk_edit.py:0: error: Function is missing a type annotation [no-untyped-def] src/documents/serialisers.py:0: error: Function is missing a type annotation [no-untyped-def]
src/documents/serialisers/bulk_edit.py:0: error: Function is missing a type annotation [no-untyped-def] src/documents/serialisers.py:0: error: Function is missing a type annotation [no-untyped-def]
src/documents/serialisers/bulk_edit.py:0: error: Function is missing a type annotation [no-untyped-def] src/documents/serialisers.py:0: error: Function is missing a type annotation [no-untyped-def]
src/documents/serialisers/bulk_edit.py:0: error: Function is missing a type annotation [no-untyped-def] src/documents/serialisers.py:0: error: Function is missing a type annotation [no-untyped-def]
src/documents/serialisers/bulk_edit.py:0: error: Function is missing a type annotation [no-untyped-def] src/documents/serialisers.py:0: error: Function is missing a type annotation [no-untyped-def]
src/documents/serialisers/bulk_edit.py:0: error: Function is missing a type annotation [no-untyped-def] src/documents/serialisers.py:0: error: Function is missing a type annotation [no-untyped-def]
src/documents/serialisers/bulk_edit.py:0: error: Function is missing a type annotation [no-untyped-def] src/documents/serialisers.py:0: error: Function is missing a type annotation [no-untyped-def]
src/documents/serialisers/bulk_edit.py:0: error: Function is missing a type annotation [no-untyped-def] src/documents/serialisers.py:0: error: Function is missing a type annotation [no-untyped-def]
src/documents/serialisers/bulk_edit.py:0: error: Function is missing a type annotation [no-untyped-def] src/documents/serialisers.py:0: error: Function is missing a type annotation [no-untyped-def]
src/documents/serialisers/bulk_edit.py:0: error: Function is missing a type annotation for one or more parameters [no-untyped-def] src/documents/serialisers.py:0: error: Function is missing a type annotation [no-untyped-def]
src/documents/serialisers/bulk_edit.py:0: error: Function is missing a type annotation for one or more parameters [no-untyped-def] src/documents/serialisers.py:0: error: Function is missing a type annotation [no-untyped-def]
src/documents/serialisers/bulk_edit.py:0: error: Function is missing a type annotation for one or more parameters [no-untyped-def] src/documents/serialisers.py:0: error: Function is missing a type annotation [no-untyped-def]
src/documents/serialisers/bulk_edit.py:0: error: Function is missing a type annotation for one or more parameters [no-untyped-def] src/documents/serialisers.py:0: error: Function is missing a type annotation [no-untyped-def]
src/documents/serialisers/bulk_edit.py:0: error: Function is missing a type annotation for one or more parameters [no-untyped-def] src/documents/serialisers.py:0: error: Function is missing a type annotation [no-untyped-def]
src/documents/serialisers/bulk_edit.py:0: error: Function is missing a type annotation for one or more parameters [no-untyped-def] src/documents/serialisers.py:0: error: Function is missing a type annotation [no-untyped-def]
src/documents/serialisers/bulk_edit.py:0: error: Function is missing a type annotation for one or more parameters [no-untyped-def] src/documents/serialisers.py:0: error: Function is missing a type annotation [no-untyped-def]
src/documents/serialisers/bulk_edit.py:0: error: Function is missing a type annotation for one or more parameters [no-untyped-def] src/documents/serialisers.py:0: error: Function is missing a type annotation [no-untyped-def]
src/documents/serialisers/bulk_edit.py:0: error: Function is missing a type annotation for one or more parameters [no-untyped-def] src/documents/serialisers.py:0: error: Function is missing a type annotation [no-untyped-def]
src/documents/serialisers/bulk_edit.py:0: error: Function is missing a type annotation for one or more parameters [no-untyped-def] src/documents/serialisers.py:0: error: Function is missing a type annotation [no-untyped-def]
src/documents/serialisers/bulk_edit.py:0: error: Function is missing a type annotation for one or more parameters [no-untyped-def] src/documents/serialisers.py:0: error: Function is missing a type annotation [no-untyped-def]
src/documents/serialisers/bulk_edit.py:0: error: Function is missing a type annotation for one or more parameters [no-untyped-def] src/documents/serialisers.py:0: error: Function is missing a type annotation [no-untyped-def]
src/documents/serialisers/bulk_edit.py:0: error: Function is missing a type annotation for one or more parameters [no-untyped-def] src/documents/serialisers.py:0: error: Function is missing a type annotation [no-untyped-def]
src/documents/serialisers/bulk_edit.py:0: error: Function is missing a type annotation for one or more parameters [no-untyped-def] src/documents/serialisers.py:0: error: Function is missing a type annotation [no-untyped-def]
src/documents/serialisers/bulk_edit.py:0: error: Function is missing a type annotation for one or more parameters [no-untyped-def] src/documents/serialisers.py:0: error: Function is missing a type annotation [no-untyped-def]
src/documents/serialisers/bulk_edit.py:0: error: Function is missing a type annotation for one or more parameters [no-untyped-def] src/documents/serialisers.py:0: error: Function is missing a type annotation [no-untyped-def]
src/documents/serialisers/bulk_edit.py:0: error: Function is missing a type annotation for one or more parameters [no-untyped-def] src/documents/serialisers.py:0: error: Function is missing a type annotation [no-untyped-def]
src/documents/serialisers/bulk_edit.py:0: error: Function is missing a type annotation for one or more parameters [no-untyped-def] src/documents/serialisers.py:0: error: Function is missing a type annotation [no-untyped-def]
src/documents/serialisers/bulk_edit.py:0: error: Incompatible types in assignment (expression has type "type[Correspondent]", variable has type "type[Tag] | None") [assignment] src/documents/serialisers.py:0: error: Function is missing a type annotation [no-untyped-def]
src/documents/serialisers/bulk_edit.py:0: error: Incompatible types in assignment (expression has type "type[DocumentType]", variable has type "type[Tag] | None") [assignment] src/documents/serialisers.py:0: error: Function is missing a type annotation [no-untyped-def]
src/documents/serialisers/bulk_edit.py:0: error: Incompatible types in assignment (expression has type "type[StoragePath]", variable has type "type[Tag] | None") [assignment] src/documents/serialisers.py:0: error: Function is missing a type annotation [no-untyped-def]
src/documents/serialisers/bulk_edit.py:0: error: Missing type arguments for generic type "dict" [type-arg] src/documents/serialisers.py:0: error: Function is missing a type annotation [no-untyped-def]
src/documents/serialisers/documents.py:0: error: Argument 1 of "update" is incompatible with supertype "rest_framework.serializers.BaseSerializer"; supertype defines the argument type as "dict[str, Any]" [override] src/documents/serialisers.py:0: error: Function is missing a type annotation [no-untyped-def]
src/documents/serialisers/documents.py:0: error: Function is missing a return type annotation [no-untyped-def] src/documents/serialisers.py:0: error: Function is missing a type annotation [no-untyped-def]
src/documents/serialisers/documents.py:0: error: Function is missing a type annotation [no-untyped-def] src/documents/serialisers.py:0: error: Function is missing a type annotation [no-untyped-def]
src/documents/serialisers/documents.py:0: error: Function is missing a type annotation [no-untyped-def] src/documents/serialisers.py:0: error: Function is missing a type annotation [no-untyped-def]
src/documents/serialisers/documents.py:0: error: Function is missing a type annotation [no-untyped-def] src/documents/serialisers.py:0: error: Function is missing a type annotation [no-untyped-def]
src/documents/serialisers/documents.py:0: error: Function is missing a type annotation [no-untyped-def] src/documents/serialisers.py:0: error: Function is missing a type annotation [no-untyped-def]
src/documents/serialisers/documents.py:0: error: Function is missing a type annotation [no-untyped-def] src/documents/serialisers.py:0: error: Function is missing a type annotation [no-untyped-def]
src/documents/serialisers/documents.py:0: error: Function is missing a type annotation [no-untyped-def] src/documents/serialisers.py:0: error: Function is missing a type annotation [no-untyped-def]
src/documents/serialisers/documents.py:0: error: Function is missing a type annotation [no-untyped-def] src/documents/serialisers.py:0: error: Function is missing a type annotation [no-untyped-def]
src/documents/serialisers/documents.py:0: error: Function is missing a type annotation [no-untyped-def] src/documents/serialisers.py:0: error: Function is missing a type annotation [no-untyped-def]
src/documents/serialisers/documents.py:0: error: Function is missing a type annotation [no-untyped-def] src/documents/serialisers.py:0: error: Function is missing a type annotation [no-untyped-def]
src/documents/serialisers/documents.py:0: error: Function is missing a type annotation for one or more parameters [no-untyped-def] src/documents/serialisers.py:0: error: Function is missing a type annotation for one or more parameters [no-untyped-def]
src/documents/serialisers/documents.py:0: error: Function is missing a type annotation for one or more parameters [no-untyped-def] src/documents/serialisers.py:0: error: Function is missing a type annotation for one or more parameters [no-untyped-def]
src/documents/serialisers/documents.py:0: error: Function is missing a type annotation for one or more parameters [no-untyped-def] src/documents/serialisers.py:0: error: Function is missing a type annotation for one or more parameters [no-untyped-def]
src/documents/serialisers/documents.py:0: error: Function is missing a type annotation for one or more parameters [no-untyped-def] src/documents/serialisers.py:0: error: Function is missing a type annotation for one or more parameters [no-untyped-def]
src/documents/serialisers/documents.py:0: error: Function is missing a type annotation for one or more parameters [no-untyped-def] src/documents/serialisers.py:0: error: Function is missing a type annotation for one or more parameters [no-untyped-def]
src/documents/serialisers/documents.py:0: error: Incompatible types in assignment (expression has type "type[SearchResultListSerializer]", base class "Meta" defined the type as "type[OwnedObjectListSerializer]") [assignment] src/documents/serialisers.py:0: error: Function is missing a type annotation for one or more parameters [no-untyped-def]
src/documents/serialisers/documents.py:0: error: Item "Field[Any, Any, Any, Any]" of "Field[Any, Any, Any, Any] | None" has no attribute "fetch_documents" [union-attr] src/documents/serialisers.py:0: error: Function is missing a type annotation for one or more parameters [no-untyped-def]
src/documents/serialisers/documents.py:0: error: Item "Field[Any, Any, Any, Any]" of "Field[Any, Any, Any, Any] | None" has no attribute "get_shared_object_pks" [union-attr] src/documents/serialisers.py:0: error: Function is missing a type annotation for one or more parameters [no-untyped-def]
src/documents/serialisers/documents.py:0: error: Item "None" of "Field[Any, Any, Any, Any] | None" has no attribute "context" [union-attr] src/documents/serialisers.py:0: error: Function is missing a type annotation for one or more parameters [no-untyped-def]
src/documents/serialisers/documents.py:0: error: Item "None" of "Field[Any, Any, Any, Any] | None" has no attribute "context" [union-attr] src/documents/serialisers.py:0: error: Function is missing a type annotation for one or more parameters [no-untyped-def]
src/documents/serialisers/documents.py:0: error: Item "None" of "Field[Any, Any, Any, Any] | None" has no attribute "fetch_documents" [union-attr] src/documents/serialisers.py:0: error: Function is missing a type annotation for one or more parameters [no-untyped-def]
src/documents/serialisers/documents.py:0: error: Item "None" of "Field[Any, Any, Any, Any] | None" has no attribute "get_shared_object_pks" [union-attr] src/documents/serialisers.py:0: error: Function is missing a type annotation for one or more parameters [no-untyped-def]
src/documents/serialisers/documents.py:0: error: Skipping analyzing "auditlog.context": module is installed, but missing library stubs or py.typed marker [import-untyped] src/documents/serialisers.py:0: error: Function is missing a type annotation for one or more parameters [no-untyped-def]
src/documents/serialisers/documents.py:0: error: Value of type "Any | None" is not indexable [index] src/documents/serialisers.py:0: error: Function is missing a type annotation for one or more parameters [no-untyped-def]
src/documents/serialisers/metadata.py:0: error: Argument "choices" to "ChoiceField" has incompatible type "type[FieldDataType]"; expected "Sequence[Any]" [arg-type] src/documents/serialisers.py:0: error: Function is missing a type annotation for one or more parameters [no-untyped-def]
src/documents/serialisers/metadata.py:0: error: Argument 1 of "get_value" is incompatible with supertype "rest_framework.fields.Field"; supertype defines the argument type as "Mapping[Any, Any]" [override] src/documents/serialisers.py:0: error: Function is missing a type annotation for one or more parameters [no-untyped-def]
src/documents/serialisers/metadata.py:0: error: Argument 1 to "get_value_field_name" of "CustomFieldInstance" has incompatible type "str"; expected "FieldDataType" [arg-type] src/documents/serialisers.py:0: error: Function is missing a type annotation for one or more parameters [no-untyped-def]
src/documents/serialisers/metadata.py:0: error: Expected iterable as variadic argument [misc] src/documents/serialisers.py:0: error: Function is missing a type annotation for one or more parameters [no-untyped-def]
src/documents/serialisers/metadata.py:0: error: Function is missing a return type annotation [no-untyped-def] src/documents/serialisers.py:0: error: Function is missing a type annotation for one or more parameters [no-untyped-def]
src/documents/serialisers/metadata.py:0: error: Function is missing a return type annotation [no-untyped-def] src/documents/serialisers.py:0: error: Function is missing a type annotation for one or more parameters [no-untyped-def]
src/documents/serialisers/metadata.py:0: error: Function is missing a return type annotation [no-untyped-def] src/documents/serialisers.py:0: error: Function is missing a type annotation for one or more parameters [no-untyped-def]
src/documents/serialisers/metadata.py:0: error: Function is missing a return type annotation [no-untyped-def] src/documents/serialisers.py:0: error: Function is missing a type annotation for one or more parameters [no-untyped-def]
src/documents/serialisers/metadata.py:0: error: Function is missing a return type annotation [no-untyped-def] src/documents/serialisers.py:0: error: Function is missing a type annotation for one or more parameters [no-untyped-def]
src/documents/serialisers/metadata.py:0: error: Function is missing a type annotation [no-untyped-def] src/documents/serialisers.py:0: error: Function is missing a type annotation for one or more parameters [no-untyped-def]
src/documents/serialisers/metadata.py:0: error: Function is missing a type annotation [no-untyped-def] src/documents/serialisers.py:0: error: Function is missing a type annotation for one or more parameters [no-untyped-def]
src/documents/serialisers/metadata.py:0: error: Function is missing a type annotation [no-untyped-def] src/documents/serialisers.py:0: error: Function is missing a type annotation for one or more parameters [no-untyped-def]
src/documents/serialisers/metadata.py:0: error: Function is missing a type annotation [no-untyped-def] src/documents/serialisers.py:0: error: Function is missing a type annotation for one or more parameters [no-untyped-def]
src/documents/serialisers/metadata.py:0: error: Function is missing a type annotation [no-untyped-def] src/documents/serialisers.py:0: error: Function is missing a type annotation for one or more parameters [no-untyped-def]
src/documents/serialisers/metadata.py:0: error: Function is missing a type annotation [no-untyped-def] src/documents/serialisers.py:0: error: Function is missing a type annotation for one or more parameters [no-untyped-def]
src/documents/serialisers/metadata.py:0: error: Function is missing a type annotation [no-untyped-def] src/documents/serialisers.py:0: error: Function is missing a type annotation for one or more parameters [no-untyped-def]
src/documents/serialisers/metadata.py:0: error: Function is missing a type annotation [no-untyped-def] src/documents/serialisers.py:0: error: Function is missing a type annotation for one or more parameters [no-untyped-def]
src/documents/serialisers/metadata.py:0: error: Function is missing a type annotation [no-untyped-def] src/documents/serialisers.py:0: error: Function is missing a type annotation for one or more parameters [no-untyped-def]
src/documents/serialisers/metadata.py:0: error: Function is missing a type annotation [no-untyped-def] src/documents/serialisers.py:0: error: Function is missing a type annotation for one or more parameters [no-untyped-def]
src/documents/serialisers/metadata.py:0: error: Function is missing a type annotation for one or more parameters [no-untyped-def] src/documents/serialisers.py:0: error: Function is missing a type annotation for one or more parameters [no-untyped-def]
src/documents/serialisers/metadata.py:0: error: Incompatible types in assignment (expression has type "PrimaryKeyRelatedField[Tag]", base class "Field" defined the type as "BaseSerializer[Any]") [assignment] src/documents/serialisers.py:0: error: Function is missing a type annotation for one or more parameters [no-untyped-def]
src/documents/serialisers/metadata.py:0: error: Incompatible types in assignment (expression has type "Sequence[str] | tuple[Lower]", variable has type "Sequence[str] | None") [assignment] src/documents/serialisers.py:0: error: Function is missing a type annotation for one or more parameters [no-untyped-def]
src/documents/serialisers/metadata.py:0: error: Item "None" of "CustomField | None" has no attribute "name" [union-attr] src/documents/serialisers.py:0: error: Function is missing a type annotation for one or more parameters [no-untyped-def]
src/documents/serialisers/metadata.py:0: error: Missing type arguments for generic type "Field" [type-arg] src/documents/serialisers.py:0: error: Function is missing a type annotation for one or more parameters [no-untyped-def]
src/documents/serialisers/metadata.py:0: error: Missing type arguments for generic type "dict" [type-arg] src/documents/serialisers.py:0: error: Incompatible types in assignment (expression has type "PrimaryKeyRelatedField[Tag]", base class "Field" defined the type as "BaseSerializer[Any]") [assignment]
src/documents/serialisers/metadata.py:0: error: Need type annotation for "document" [var-annotated] src/documents/serialisers.py:0: error: Incompatible types in assignment (expression has type "QuerySet[Any, Any]", variable has type "UnknownQuerySet[Document, Document]") [assignment]
src/documents/serialisers/metadata.py:0: error: Value of type "Any | None" is not indexable [index] src/documents/serialisers.py:0: error: Incompatible types in assignment (expression has type "Sequence[str] | tuple[Lower]", variable has type "Sequence[str] | None") [assignment]
src/documents/serialisers/saved_views.py:0: error: Argument 1 to "int" has incompatible type "Any | Collection[str]"; expected "str | Buffer | SupportsInt | SupportsIndex | SupportsTrunc" [arg-type] src/documents/serialisers.py:0: error: Incompatible types in assignment (expression has type "WorkflowActionWebhookSerializer", variable has type "WorkflowActionEmailSerializer") [assignment]
src/documents/serialisers/saved_views.py:0: error: Function is missing a type annotation [no-untyped-def] src/documents/serialisers.py:0: error: Incompatible types in assignment (expression has type "type[Correspondent]", variable has type "type[Tag] | None") [assignment]
src/documents/serialisers/saved_views.py:0: error: Function is missing a type annotation [no-untyped-def] src/documents/serialisers.py:0: error: Incompatible types in assignment (expression has type "type[DocumentType]", variable has type "type[Tag] | None") [assignment]
src/documents/serialisers/saved_views.py:0: error: Function is missing a type annotation [no-untyped-def] src/documents/serialisers.py:0: error: Incompatible types in assignment (expression has type "type[SearchResultListSerializer]", base class "Meta" defined the type as "type[OwnedObjectListSerializer]") [assignment]
src/documents/serialisers/saved_views.py:0: error: Function is missing a type annotation [no-untyped-def] src/documents/serialisers.py:0: error: Incompatible types in assignment (expression has type "type[StoragePath]", variable has type "type[Tag] | None") [assignment]
src/documents/serialisers/saved_views.py:0: error: Function is missing a type annotation [no-untyped-def] src/documents/serialisers.py:0: error: Item "Field[Any, Any, Any, Any]" of "Field[Any, Any, Any, Any] | None" has no attribute "fetch_documents" [union-attr]
src/documents/serialisers/saved_views.py:0: error: Value of type "Match[str] | None" is not indexable [index] src/documents/serialisers.py:0: error: Item "Field[Any, Any, Any, Any]" of "Field[Any, Any, Any, Any] | None" has no attribute "get_shared_object_pks" [union-attr]
src/documents/serialisers/sharing.py:0: error: Function is missing a type annotation [no-untyped-def] src/documents/serialisers.py:0: error: Item "Field[Any, Any, Any, Any]" of "Field[Any, Any, Any, Any] | None" has no attribute "get_shared_object_pks" [union-attr]
src/documents/serialisers/sharing.py:0: error: Function is missing a type annotation [no-untyped-def] src/documents/serialisers.py:0: error: Item "None" of "Any | None" has no attribute "name" [union-attr]
src/documents/serialisers/sharing.py:0: error: Function is missing a type annotation [no-untyped-def] src/documents/serialisers.py:0: error: Item "None" of "Any | None" has no attribute "pk" [union-attr]
src/documents/serialisers/sharing.py:0: error: Function is missing a type annotation [no-untyped-def] src/documents/serialisers.py:0: error: Item "None" of "CustomField | None" has no attribute "name" [union-attr]
src/documents/serialisers/sharing.py:0: error: Function is missing a type annotation [no-untyped-def] src/documents/serialisers.py:0: error: Item "None" of "Field[Any, Any, Any, Any] | None" has no attribute "context" [union-attr]
src/documents/serialisers/sharing.py:0: error: Function is missing a type annotation [no-untyped-def] src/documents/serialisers.py:0: error: Item "None" of "Field[Any, Any, Any, Any] | None" has no attribute "context" [union-attr]
src/documents/serialisers/sharing.py:0: error: Need type annotation for "documents" [var-annotated] src/documents/serialisers.py:0: error: Item "None" of "Field[Any, Any, Any, Any] | None" has no attribute "context" [union-attr]
src/documents/serialisers/system.py:0: error: Function is missing a type annotation [no-untyped-def] src/documents/serialisers.py:0: error: Item "None" of "Field[Any, Any, Any, Any] | None" has no attribute "fetch_documents" [union-attr]
src/documents/serialisers/system.py:0: error: Function is missing a type annotation [no-untyped-def] src/documents/serialisers.py:0: error: Item "None" of "Field[Any, Any, Any, Any] | None" has no attribute "get_shared_object_pks" [union-attr]
src/documents/serialisers/tasks.py:0: error: Argument 1 to "list" has incompatible type "QuerySet[Document, TypedDict({'id': int, 'title': str, 'deleted_at': datetime | None})]"; expected "Iterable[dict[str, Any]]" [arg-type] src/documents/serialisers.py:0: error: Item "None" of "Field[Any, Any, Any, Any] | None" has no attribute "get_shared_object_pks" [union-attr]
src/documents/serialisers/tasks.py:0: error: Function is missing a type annotation [no-untyped-def] src/documents/serialisers.py:0: error: Item "None" of "ObjectPermissionChecker | None" has no attribute "has_perm" [union-attr]
src/documents/serialisers/tasks.py:0: error: Function is missing a type annotation [no-untyped-def] src/documents/serialisers.py:0: error: Item "list[str]" of "Any | list[str]" has no attribute "values_list" [union-attr]
src/documents/serialisers/tasks.py:0: error: Function is missing a type annotation for one or more parameters [no-untyped-def] src/documents/serialisers.py:0: error: Missing type arguments for generic type "Field" [type-arg]
src/documents/serialisers/tasks.py:0: error: No overload variant of "get" of "dict" matches argument types "str", "str" [call-overload] src/documents/serialisers.py:0: error: Missing type arguments for generic type "Iterable" [type-arg]
src/documents/serialisers/tasks.py:0: error: No overload variant of "get" of "dict" matches argument types "str", "str" [call-overload] src/documents/serialisers.py:0: error: Missing type arguments for generic type "dict" [type-arg]
src/documents/serialisers/tasks.py:0: error: No overload variant of "get" of "dict" matches argument types "str", "str" [call-overload] src/documents/serialisers.py:0: error: Missing type arguments for generic type "dict" [type-arg]
src/documents/serialisers/upload.py:0: error: Function is missing a type annotation [no-untyped-def] src/documents/serialisers.py:0: error: Need type annotation for "document" [var-annotated]
src/documents/serialisers/upload.py:0: error: Function is missing a type annotation [no-untyped-def] src/documents/serialisers.py:0: error: Need type annotation for "documents" [var-annotated]
src/documents/serialisers/upload.py:0: error: Function is missing a type annotation [no-untyped-def] src/documents/serialisers.py:0: error: Need type annotation for "permissions_dict" [var-annotated]
src/documents/serialisers/upload.py:0: error: Function is missing a type annotation [no-untyped-def] src/documents/serialisers.py:0: error: Need type annotation for "with_perms" [var-annotated]
src/documents/serialisers/upload.py:0: error: Function is missing a type annotation [no-untyped-def] src/documents/serialisers.py:0: error: No overload variant of "get" of "dict" matches argument types "str", "str" [call-overload]
src/documents/serialisers/upload.py:0: error: Function is missing a type annotation [no-untyped-def] src/documents/serialisers.py:0: error: No overload variant of "get" of "dict" matches argument types "str", "str" [call-overload]
src/documents/serialisers/upload.py:0: error: Function is missing a type annotation [no-untyped-def] src/documents/serialisers.py:0: error: No overload variant of "get" of "dict" matches argument types "str", "str" [call-overload]
src/documents/serialisers/workflows.py:0: error: Argument "default" to "MultipleChoiceField" has incompatible type "set[DocumentSource]"; expected "set[str | int] | set[str] | set[int] | Callable[[], set[str | int] | set[str] | set[int]] | _Empty | None" [arg-type] src/documents/serialisers.py:0: error: Skipping analyzing "auditlog.context": module is installed, but missing library stubs or py.typed marker [import-untyped]
src/documents/serialisers/workflows.py:0: error: Function is missing a type annotation [no-untyped-def] src/documents/serialisers.py:0: error: Value of type "Any | None" is not indexable [index]
src/documents/serialisers/workflows.py:0: error: Function is missing a type annotation [no-untyped-def] src/documents/serialisers.py:0: error: Value of type "Any | None" is not indexable [index]
src/documents/serialisers/workflows.py:0: error: Function is missing a type annotation [no-untyped-def] src/documents/serialisers.py:0: error: Value of type "Match[str] | None" is not indexable [index]
src/documents/serialisers/workflows.py:0: error: Function is missing a type annotation [no-untyped-def]
src/documents/serialisers/workflows.py:0: error: Function is missing a type annotation [no-untyped-def]
src/documents/serialisers/workflows.py:0: error: Function is missing a type annotation [no-untyped-def]
src/documents/serialisers/workflows.py:0: error: Function is missing a type annotation for one or more parameters [no-untyped-def]
src/documents/serialisers/workflows.py:0: error: Function is missing a type annotation for one or more parameters [no-untyped-def]
src/documents/serialisers/workflows.py:0: error: Function is missing a type annotation for one or more parameters [no-untyped-def]
src/documents/serialisers/workflows.py:0: error: Function is missing a type annotation for one or more parameters [no-untyped-def]
src/documents/serialisers/workflows.py:0: error: Incompatible types in assignment (expression has type "WorkflowActionWebhookSerializer", variable has type "WorkflowActionEmailSerializer") [assignment]
src/documents/signals/handlers.py:0: error: "BaseDatabaseWrapper" has no attribute "close_pool" [attr-defined] src/documents/signals/handlers.py:0: error: "BaseDatabaseWrapper" has no attribute "close_pool" [attr-defined]
src/documents/signals/handlers.py:0: error: Argument 1 to "Path" has incompatible type "Any | None"; expected "str | PathLike[str]" [arg-type] src/documents/signals/handlers.py:0: error: Argument 1 to "Path" has incompatible type "Any | None"; expected "str | PathLike[str]" [arg-type]
src/documents/signals/handlers.py:0: error: Argument 1 to "Path" has incompatible type "Any | None"; expected "str | PathLike[str]" [arg-type] src/documents/signals/handlers.py:0: error: Argument 1 to "Path" has incompatible type "Any | None"; expected "str | PathLike[str]" [arg-type]
@@ -1421,181 +1413,166 @@ src/documents/utils.py:0: error: Incompatible types in assignment (expression ha
src/documents/utils.py:0: error: Incompatible types in assignment (expression has type "float | int", variable has type "int | None") [assignment] src/documents/utils.py:0: error: Incompatible types in assignment (expression has type "float | int", variable has type "int | None") [assignment]
src/documents/utils.py:0: error: Missing type arguments for generic type "CompletedProcess" [type-arg] src/documents/utils.py:0: error: Missing type arguments for generic type "CompletedProcess" [type-arg]
src/documents/validators.py:0: error: Function is missing a type annotation for one or more parameters [no-untyped-def] src/documents/validators.py:0: error: Function is missing a type annotation for one or more parameters [no-untyped-def]
src/documents/views/base.py:0: error: "BulkPermissionMixin" has no attribute "filter_queryset" [attr-defined] src/documents/views.py:0: error: "BulkPermissionMixin" has no attribute "filter_queryset" [attr-defined]
src/documents/views/base.py:0: error: "BulkPermissionMixin" has no attribute "get_queryset" [attr-defined] src/documents/views.py:0: error: "BulkPermissionMixin" has no attribute "get_queryset" [attr-defined]
src/documents/views/base.py:0: error: "BulkPermissionMixin" has no attribute "queryset" [attr-defined] src/documents/views.py:0: error: "BulkPermissionMixin" has no attribute "queryset" [attr-defined]
src/documents/views/base.py:0: error: "BulkPermissionMixin" has no attribute "queryset" [attr-defined] src/documents/views.py:0: error: "BulkPermissionMixin" has no attribute "queryset" [attr-defined]
src/documents/views/base.py:0: error: "get_serializer_context" undefined in superclass [misc] src/documents/views.py:0: error: "BulkPermissionMixin" has no attribute "request" [attr-defined]
src/documents/views/base.py:0: error: "type[Model]" has no attribute "objects" [attr-defined] src/documents/views.py:0: error: "get_serializer_context" undefined in superclass [misc]
src/documents/views/base.py:0: error: Argument "user" to "_has_document_permissions" of "DocumentOperationPermissionMixin" has incompatible type "User | AnonymousUser"; expected "User" [arg-type] src/documents/views.py:0: error: "object" has no attribute "apply_async" [attr-defined]
src/documents/views/base.py:0: error: Argument "user" to "_resolve_document_ids" of "DocumentSelectionMixin" has incompatible type "User | AnonymousUser"; expected "User" [arg-type] src/documents/views.py:0: error: "type[Model]" has no attribute "objects" [attr-defined]
src/documents/views/base.py:0: error: Function is missing a return type annotation [no-untyped-def] src/documents/views.py:0: error: Argument "filename" to "FileResponse" has incompatible type "str | Any | None"; expected "str" [arg-type]
src/documents/views/base.py:0: error: Function is missing a return type annotation [no-untyped-def] src/documents/views.py:0: error: Argument "path" to "EmailAttachment" has incompatible type "Path | None"; expected "Path" [arg-type]
src/documents/views/base.py:0: error: Function is missing a return type annotation [no-untyped-def] src/documents/views.py:0: error: Argument "user" to "_has_document_permissions" of "DocumentOperationPermissionMixin" has incompatible type "User | AnonymousUser"; expected "User" [arg-type]
src/documents/views/base.py:0: error: Function is missing a return type annotation [no-untyped-def] src/documents/views.py:0: error: Argument "user" to "_has_document_permissions" of "DocumentOperationPermissionMixin" has incompatible type "User | AnonymousUser"; expected "User" [arg-type]
src/documents/views/base.py:0: error: Function is missing a type annotation [no-untyped-def] src/documents/views.py:0: error: Argument "user" to "_resolve_document_ids" of "DocumentSelectionMixin" has incompatible type "User | AnonymousUser"; expected "User" [arg-type]
src/documents/views/base.py:0: error: Function is missing a type annotation [no-untyped-def] src/documents/views.py:0: error: Argument "user" to "_resolve_document_ids" of "DocumentSelectionMixin" has incompatible type "User | AnonymousUser"; expected "User" [arg-type]
src/documents/views/base.py:0: error: Function is missing a type annotation for one or more parameters [no-untyped-def] src/documents/views.py:0: error: Argument 1 to "TaskSummarySerializer" has incompatible type "QuerySet[PaperlessTask@AnnotatedWith[TypedDict({'total_count': int, 'pending_count': int, 'success_count': int, 'failure_count': int, 'avg_duration_seconds': Any, 'avg_wait_time_seconds': Any, 'last_run': Any, 'last_success': Any, 'last_failure': Any})], dict[str, Any]]"; expected "dict[str, Any] | None" [arg-type]
src/documents/views/base.py:0: error: Function is missing a type annotation for one or more parameters [no-untyped-def] src/documents/views.py:0: error: Argument 1 to "get_objects_for_user_owner_aware" has incompatible type "User | AnonymousUser"; expected "User | None" [arg-type]
src/documents/views/base.py:0: error: Missing type arguments for generic type "list" [type-arg] src/documents/views.py:0: error: Argument 1 to "int" has incompatible type "Any | Collection[str]"; expected "str | Buffer | SupportsInt | SupportsIndex | SupportsTrunc" [arg-type]
src/documents/views/bulk_edit.py:0: error: Argument "user" to "_has_document_permissions" of "DocumentOperationPermissionMixin" has incompatible type "User | AnonymousUser"; expected "User" [arg-type] src/documents/views.py:0: error: Argument 1 to "int" has incompatible type "Any | Collection[str]"; expected "str | Buffer | SupportsInt | SupportsIndex | SupportsTrunc" [arg-type]
src/documents/views/bulk_edit.py:0: error: Argument "user" to "_resolve_document_ids" of "DocumentSelectionMixin" has incompatible type "User | AnonymousUser"; expected "User" [arg-type] src/documents/views.py:0: error: Argument 1 to "paginate_queryset" of "GenericAPIView" has incompatible type "TantivyRelevanceList"; expected "QuerySet[Any, Any]" [arg-type]
src/documents/views/bulk_edit.py:0: error: Argument 1 to "int" has incompatible type "Any | Collection[str]"; expected "str | Buffer | SupportsInt | SupportsIndex | SupportsTrunc" [arg-type] src/documents/views.py:0: error: Argument 2 to "match_correspondents" has incompatible type "DocumentClassifier | None"; expected "DocumentClassifier" [arg-type]
src/documents/views/bulk_edit.py:0: error: Argument 1 to "permitted_object_ids" has incompatible type "User | AnonymousUser"; expected "User | None" [arg-type] src/documents/views.py:0: error: Argument 2 to "match_document_types" has incompatible type "DocumentClassifier | None"; expected "DocumentClassifier" [arg-type]
src/documents/views/bulk_edit.py:0: error: Function is missing a type annotation [no-untyped-def] src/documents/views.py:0: error: Argument 2 to "match_storage_paths" has incompatible type "DocumentClassifier | None"; expected "DocumentClassifier" [arg-type]
src/documents/views/bulk_edit.py:0: error: Function is missing a type annotation [no-untyped-def] src/documents/views.py:0: error: Argument 2 to "match_tags" has incompatible type "DocumentClassifier | None"; expected "DocumentClassifier" [arg-type]
src/documents/views/bulk_edit.py:0: error: Function is missing a type annotation [no-untyped-def] src/documents/views.py:0: error: Argument 3 to "autocomplete" of "TantivyBackend" has incompatible type "User | AnonymousUser | None"; expected "AbstractBaseUser | None" [arg-type]
src/documents/views/bulk_edit.py:0: error: Function is missing a type annotation [no-untyped-def] src/documents/views.py:0: error: Function is missing a return type annotation [no-untyped-def]
src/documents/views/bulk_edit.py:0: error: Function is missing a type annotation [no-untyped-def] src/documents/views.py:0: error: Function is missing a return type annotation [no-untyped-def]
src/documents/views/bulk_edit.py:0: error: Function is missing a type annotation [no-untyped-def] src/documents/views.py:0: error: Function is missing a return type annotation [no-untyped-def]
src/documents/views/bulk_edit.py:0: error: Function is missing a type annotation [no-untyped-def] src/documents/views.py:0: error: Function is missing a return type annotation [no-untyped-def]
src/documents/views/bulk_edit.py:0: error: Function is missing a type annotation [no-untyped-def] src/documents/views.py:0: error: Function is missing a return type annotation [no-untyped-def]
src/documents/views/bulk_edit.py:0: error: Function is missing a type annotation [no-untyped-def] src/documents/views.py:0: error: Function is missing a return type annotation [no-untyped-def]
src/documents/views/bulk_edit.py:0: error: Function is missing a type annotation [no-untyped-def] src/documents/views.py:0: error: Function is missing a return type annotation [no-untyped-def]
src/documents/views/bulk_edit.py:0: error: Incompatible types in assignment (expression has type "type[ArchiveOnlyStrategy]", variable has type "type[OriginalAndArchiveStrategy]") [assignment] src/documents/views.py:0: error: Function is missing a return type annotation [no-untyped-def]
src/documents/views/bulk_edit.py:0: error: Incompatible types in assignment (expression has type "type[OriginalsOnlyStrategy]", variable has type "type[OriginalAndArchiveStrategy]") [assignment] src/documents/views.py:0: error: Function is missing a return type annotation [no-untyped-def]
src/documents/views/bulk_edit.py:0: error: Skipping analyzing "auditlog.models": module is installed, but missing library stubs or py.typed marker [import-untyped] src/documents/views.py:0: error: Function is missing a return type annotation [no-untyped-def]
src/documents/views/chat.py:0: error: Function is missing a type annotation [no-untyped-def] src/documents/views.py:0: error: Function is missing a return type annotation [no-untyped-def]
src/documents/views/documents.py:0: error: "type[DocumentFilterSet]" has no attribute "declared_filters" [attr-defined] src/documents/views.py:0: error: Function is missing a return type annotation [no-untyped-def]
src/documents/views/documents.py:0: error: Argument "path" to "EmailAttachment" has incompatible type "Path | None"; expected "Path" [arg-type] src/documents/views.py:0: error: Function is missing a return type annotation [no-untyped-def]
src/documents/views/documents.py:0: error: Argument 1 to "paginate_queryset" of "GenericAPIView" has incompatible type "TantivyRelevanceList"; expected "QuerySet[Any, Any]" [arg-type] src/documents/views.py:0: error: Function is missing a return type annotation [no-untyped-def]
src/documents/views/documents.py:0: error: Argument 2 to "match_correspondents" has incompatible type "DocumentClassifier | None"; expected "DocumentClassifier" [arg-type] src/documents/views.py:0: error: Function is missing a return type annotation [no-untyped-def]
src/documents/views/documents.py:0: error: Argument 2 to "match_document_types" has incompatible type "DocumentClassifier | None"; expected "DocumentClassifier" [arg-type] src/documents/views.py:0: error: Function is missing a type annotation [no-untyped-def]
src/documents/views/documents.py:0: error: Argument 2 to "match_storage_paths" has incompatible type "DocumentClassifier | None"; expected "DocumentClassifier" [arg-type] src/documents/views.py:0: error: Function is missing a type annotation [no-untyped-def]
src/documents/views/documents.py:0: error: Argument 2 to "match_tags" has incompatible type "DocumentClassifier | None"; expected "DocumentClassifier" [arg-type] src/documents/views.py:0: error: Function is missing a type annotation [no-untyped-def]
src/documents/views/documents.py:0: error: Function is missing a return type annotation [no-untyped-def] src/documents/views.py:0: error: Function is missing a type annotation [no-untyped-def]
src/documents/views/documents.py:0: error: Function is missing a return type annotation [no-untyped-def] src/documents/views.py:0: error: Function is missing a type annotation [no-untyped-def]
src/documents/views/documents.py:0: error: Function is missing a return type annotation [no-untyped-def] src/documents/views.py:0: error: Function is missing a type annotation [no-untyped-def]
src/documents/views/documents.py:0: error: Function is missing a return type annotation [no-untyped-def] src/documents/views.py:0: error: Function is missing a type annotation [no-untyped-def]
src/documents/views/documents.py:0: error: Function is missing a return type annotation [no-untyped-def] src/documents/views.py:0: error: Function is missing a type annotation [no-untyped-def]
src/documents/views/documents.py:0: error: Function is missing a type annotation [no-untyped-def] src/documents/views.py:0: error: Function is missing a type annotation [no-untyped-def]
src/documents/views/documents.py:0: error: Function is missing a type annotation [no-untyped-def] src/documents/views.py:0: error: Function is missing a type annotation [no-untyped-def]
src/documents/views/documents.py:0: error: Function is missing a type annotation [no-untyped-def] src/documents/views.py:0: error: Function is missing a type annotation [no-untyped-def]
src/documents/views/documents.py:0: error: Function is missing a type annotation [no-untyped-def] src/documents/views.py:0: error: Function is missing a type annotation [no-untyped-def]
src/documents/views/documents.py:0: error: Function is missing a type annotation [no-untyped-def] src/documents/views.py:0: error: Function is missing a type annotation [no-untyped-def]
src/documents/views/documents.py:0: error: Function is missing a type annotation [no-untyped-def] src/documents/views.py:0: error: Function is missing a type annotation [no-untyped-def]
src/documents/views/documents.py:0: error: Function is missing a type annotation [no-untyped-def] src/documents/views.py:0: error: Function is missing a type annotation [no-untyped-def]
src/documents/views/documents.py:0: error: Function is missing a type annotation [no-untyped-def] src/documents/views.py:0: error: Function is missing a type annotation [no-untyped-def]
src/documents/views/documents.py:0: error: Function is missing a type annotation [no-untyped-def] src/documents/views.py:0: error: Function is missing a type annotation [no-untyped-def]
src/documents/views/documents.py:0: error: Function is missing a type annotation [no-untyped-def] src/documents/views.py:0: error: Function is missing a type annotation [no-untyped-def]
src/documents/views/documents.py:0: error: Function is missing a type annotation [no-untyped-def] src/documents/views.py:0: error: Function is missing a type annotation [no-untyped-def]
src/documents/views/documents.py:0: error: Function is missing a type annotation [no-untyped-def] src/documents/views.py:0: error: Function is missing a type annotation [no-untyped-def]
src/documents/views/documents.py:0: error: Function is missing a type annotation [no-untyped-def] src/documents/views.py:0: error: Function is missing a type annotation [no-untyped-def]
src/documents/views/documents.py:0: error: Function is missing a type annotation [no-untyped-def] src/documents/views.py:0: error: Function is missing a type annotation [no-untyped-def]
src/documents/views/documents.py:0: error: Function is missing a type annotation [no-untyped-def] src/documents/views.py:0: error: Function is missing a type annotation [no-untyped-def]
src/documents/views/documents.py:0: error: Function is missing a type annotation [no-untyped-def] src/documents/views.py:0: error: Function is missing a type annotation [no-untyped-def]
src/documents/views/documents.py:0: error: Function is missing a type annotation [no-untyped-def] src/documents/views.py:0: error: Function is missing a type annotation [no-untyped-def]
src/documents/views/documents.py:0: error: Function is missing a type annotation [no-untyped-def] src/documents/views.py:0: error: Function is missing a type annotation [no-untyped-def]
src/documents/views/documents.py:0: error: Function is missing a type annotation [no-untyped-def] src/documents/views.py:0: error: Function is missing a type annotation [no-untyped-def]
src/documents/views/documents.py:0: error: Function is missing a type annotation [no-untyped-def] src/documents/views.py:0: error: Function is missing a type annotation [no-untyped-def]
src/documents/views/documents.py:0: error: Function is missing a type annotation [no-untyped-def] src/documents/views.py:0: error: Function is missing a type annotation [no-untyped-def]
src/documents/views/documents.py:0: error: Function is missing a type annotation [no-untyped-def] src/documents/views.py:0: error: Function is missing a type annotation [no-untyped-def]
src/documents/views/documents.py:0: error: Function is missing a type annotation [no-untyped-def] src/documents/views.py:0: error: Function is missing a type annotation [no-untyped-def]
src/documents/views/documents.py:0: error: Function is missing a type annotation [no-untyped-def] src/documents/views.py:0: error: Function is missing a type annotation [no-untyped-def]
src/documents/views/documents.py:0: error: Function is missing a type annotation [no-untyped-def] src/documents/views.py:0: error: Function is missing a type annotation [no-untyped-def]
src/documents/views/documents.py:0: error: Function is missing a type annotation [no-untyped-def] src/documents/views.py:0: error: Function is missing a type annotation [no-untyped-def]
src/documents/views/documents.py:0: error: Function is missing a type annotation for one or more parameters [no-untyped-def] src/documents/views.py:0: error: Function is missing a type annotation [no-untyped-def]
src/documents/views/documents.py:0: error: Function is missing a type annotation for one or more parameters [no-untyped-def] src/documents/views.py:0: error: Function is missing a type annotation [no-untyped-def]
src/documents/views/documents.py:0: error: Function is missing a type annotation for one or more parameters [no-untyped-def] src/documents/views.py:0: error: Function is missing a type annotation [no-untyped-def]
src/documents/views/documents.py:0: error: Function is missing a type annotation for one or more parameters [no-untyped-def] src/documents/views.py:0: error: Function is missing a type annotation [no-untyped-def]
src/documents/views/documents.py:0: error: Incompatible types in assignment (expression has type "ClassificationSuggestions", variable has type "dict[Any, Any]") [assignment] src/documents/views.py:0: error: Function is missing a type annotation [no-untyped-def]
src/documents/views/documents.py:0: error: Item "BasePagination" of "BasePagination | None" has no attribute "get_page_size" [union-attr] src/documents/views.py:0: error: Function is missing a type annotation [no-untyped-def]
src/documents/views/documents.py:0: error: Item "BasePagination" of "BasePagination | None" has no attribute "page_size" [union-attr] src/documents/views.py:0: error: Function is missing a type annotation [no-untyped-def]
src/documents/views/documents.py:0: error: Item "None" of "BasePagination | None" has no attribute "get_page_size" [union-attr] src/documents/views.py:0: error: Function is missing a type annotation [no-untyped-def]
src/documents/views/documents.py:0: error: Item "None" of "BasePagination | None" has no attribute "page_size" [union-attr] src/documents/views.py:0: error: Function is missing a type annotation [no-untyped-def]
src/documents/views/documents.py:0: error: Missing positional argument "request" in call to "email_documents" [call-arg] src/documents/views.py:0: error: Function is missing a type annotation [no-untyped-def]
src/documents/views/documents.py:0: error: Missing type arguments for generic type "list" [type-arg] src/documents/views.py:0: error: Function is missing a type annotation [no-untyped-def]
src/documents/views/documents.py:0: error: Missing type arguments for generic type "list" [type-arg] src/documents/views.py:0: error: Function is missing a type annotation [no-untyped-def]
src/documents/views/documents.py:0: error: Missing type arguments for generic type "list" [type-arg] src/documents/views.py:0: error: Function is missing a type annotation [no-untyped-def]
src/documents/views/documents.py:0: error: Need type annotation for "doc" [var-annotated] src/documents/views.py:0: error: Function is missing a type annotation [no-untyped-def]
src/documents/views/documents.py:0: error: Need type annotation for "doc" [var-annotated] src/documents/views.py:0: error: Function is missing a type annotation [no-untyped-def]
src/documents/views/documents.py:0: error: No overload variant of "prefetch_related" of "QuerySet" matches argument type "list[object]" [call-overload] src/documents/views.py:0: error: Function is missing a type annotation [no-untyped-def]
src/documents/views/documents.py:0: error: Skipping analyzing "auditlog.models": module is installed, but missing library stubs or py.typed marker [import-untyped] src/documents/views.py:0: error: Function is missing a type annotation [no-untyped-def]
src/documents/views/documents.py:0: error: Skipping analyzing "langdetect": module is installed, but missing library stubs or py.typed marker [import-untyped] src/documents/views.py:0: error: Function is missing a type annotation [no-untyped-def]
src/documents/views/documents.py:0: error: Unsupported operand types for + ("None" and "int") [operator] src/documents/views.py:0: error: Function is missing a type annotation [no-untyped-def]
src/documents/views/index.py:0: error: Argument "filename" to "FileResponse" has incompatible type "str | Any | None"; expected "str" [arg-type] src/documents/views.py:0: error: Function is missing a type annotation [no-untyped-def]
src/documents/views/index.py:0: error: Function is missing a return type annotation [no-untyped-def] src/documents/views.py:0: error: Function is missing a type annotation [no-untyped-def]
src/documents/views/index.py:0: error: Function is missing a type annotation [no-untyped-def] src/documents/views.py:0: error: Function is missing a type annotation [no-untyped-def]
src/documents/views/index.py:0: error: Item "AnonymousUser" of "User | AnonymousUser" has no attribute "get_full_name" [union-attr] src/documents/views.py:0: error: Function is missing a type annotation [no-untyped-def]
src/documents/views/index.py:0: error: Item "None" of "Any | None" has no attribute "get" [union-attr] src/documents/views.py:0: error: Function is missing a type annotation [no-untyped-def]
src/documents/views/index.py:0: error: Item "None" of "Any | None" has no attribute "get" [union-attr] src/documents/views.py:0: error: Function is missing a type annotation [no-untyped-def]
src/documents/views/index.py:0: error: Item "None" of "ApplicationConfiguration | None" has no attribute "app_logo" [union-attr] src/documents/views.py:0: error: Function is missing a type annotation [no-untyped-def]
src/documents/views/logs.py:0: error: Function is missing a type annotation [no-untyped-def] src/documents/views.py:0: error: Function is missing a type annotation [no-untyped-def]
src/documents/views/logs.py:0: error: Function is missing a type annotation [no-untyped-def] src/documents/views.py:0: error: Function is missing a type annotation [no-untyped-def]
src/documents/views/metadata.py:0: error: Argument 1 to "int" has incompatible type "Any | Collection[str]"; expected "str | Buffer | SupportsInt | SupportsIndex | SupportsTrunc" [arg-type] src/documents/views.py:0: error: Function is missing a type annotation [no-untyped-def]
src/documents/views/metadata.py:0: error: Function is missing a return type annotation [no-untyped-def] src/documents/views.py:0: error: Function is missing a type annotation for one or more parameters [no-untyped-def]
src/documents/views/metadata.py:0: error: Function is missing a return type annotation [no-untyped-def] src/documents/views.py:0: error: Function is missing a type annotation for one or more parameters [no-untyped-def]
src/documents/views/metadata.py:0: error: Function is missing a type annotation [no-untyped-def] src/documents/views.py:0: error: Function is missing a type annotation for one or more parameters [no-untyped-def]
src/documents/views/metadata.py:0: error: Function is missing a type annotation [no-untyped-def] src/documents/views.py:0: error: Function is missing a type annotation for one or more parameters [no-untyped-def]
src/documents/views/metadata.py:0: error: Function is missing a type annotation [no-untyped-def] src/documents/views.py:0: error: Function is missing a type annotation for one or more parameters [no-untyped-def]
src/documents/views/metadata.py:0: error: Function is missing a type annotation [no-untyped-def] src/documents/views.py:0: error: Function is missing a type annotation for one or more parameters [no-untyped-def]
src/documents/views/metadata.py:0: error: Function is missing a type annotation [no-untyped-def] src/documents/views.py:0: error: Incompatible types in assignment (expression has type "Any | None", variable has type "dict[Any, Any]") [assignment]
src/documents/views/metadata.py:0: error: Function is missing a type annotation [no-untyped-def] src/documents/views.py:0: error: Incompatible types in assignment (expression has type "QuerySet[Any, Any]", variable has type "list[Any]") [assignment]
src/documents/views/metadata.py:0: error: Incompatible types in assignment (expression has type "tuple[type[IsAuthenticated], type[ViewDocumentsPermissions]]", variable has type "tuple[type[IsAuthenticated], type[PaperlessObjectPermissions]]") [assignment] src/documents/views.py:0: error: Incompatible types in assignment (expression has type "QuerySet[Any, Any]", variable has type "list[Document]") [assignment]
src/documents/views/metadata.py:0: error: Need type annotation for "children_map" (hint: "children_map: dict[<type>, <type>] = ...") [var-annotated] src/documents/views.py:0: error: Incompatible types in assignment (expression has type "bool", target has type "dict[str, str]") [assignment]
src/documents/views/search.py:0: error: Argument 3 to "autocomplete" of "TantivyBackend" has incompatible type "User | AnonymousUser | None"; expected "AbstractUser | None" [arg-type] src/documents/views.py:0: error: Incompatible types in assignment (expression has type "bool", target has type "dict[str, str]") [assignment]
src/documents/views/search.py:0: error: Function is missing a type annotation [no-untyped-def] src/documents/views.py:0: error: Incompatible types in assignment (expression has type "bool", target has type "dict[str, str]") [assignment]
src/documents/views/search.py:0: error: Function is missing a type annotation [no-untyped-def] src/documents/views.py:0: error: Incompatible types in assignment (expression has type "int", target has type "dict[str, str]") [assignment]
src/documents/views/search.py:0: error: Function is missing a type annotation [no-untyped-def] src/documents/views.py:0: error: Incompatible types in assignment (expression has type "str | None", target has type "dict[str, str]") [assignment]
src/documents/views/search.py:0: error: Function is missing a type annotation [no-untyped-def] src/documents/views.py:0: error: Incompatible types in assignment (expression has type "str | None", target has type "dict[str, str]") [assignment]
src/documents/views/search.py:0: error: Incompatible types in assignment (expression has type "QuerySet[Document, Document]", variable has type "list[Any]") [assignment] src/documents/views.py:0: error: Incompatible types in assignment (expression has type "str", target has type "dict[str, str]") [assignment]
src/documents/views/search.py:0: error: Need type annotation for "docs" (hint: "docs: list[<type>] = ...") [var-annotated] src/documents/views.py:0: error: Incompatible types in assignment (expression has type "str", target has type "dict[str, str]") [assignment]
src/documents/views/search.py:0: error: Value of type "Iterable[Any]" is not indexable [index] src/documents/views.py:0: error: Incompatible types in assignment (expression has type "str", target has type "dict[str, str]") [assignment]
src/documents/views/search.py:0: error: Value of type "Iterable[Any]" is not indexable [index] src/documents/views.py:0: error: Incompatible types in assignment (expression has type "str", target has type "dict[str, str]") [assignment]
src/documents/views/search.py:0: error: Value of type "Iterable[Any]" is not indexable [index] src/documents/views.py:0: error: Incompatible types in assignment (expression has type "str", target has type "dict[str, str]") [assignment]
src/documents/views/search.py:0: error: Value of type "Iterable[Any]" is not indexable [index] src/documents/views.py:0: error: Incompatible types in assignment (expression has type "tuple[type[IsAuthenticated]]", variable has type "tuple[type[IsAuthenticated], type[PaperlessObjectPermissions]]") [assignment]
src/documents/views/search.py:0: error: Value of type "Iterable[Any]" is not indexable [index] src/documents/views.py:0: error: Incompatible types in assignment (expression has type "type[ArchiveOnlyStrategy]", variable has type "type[OriginalAndArchiveStrategy]") [assignment]
src/documents/views/search.py:0: error: Value of type "Iterable[Any]" is not indexable [index] src/documents/views.py:0: error: Incompatible types in assignment (expression has type "type[DocumentSerializer]", variable has type "type[TrashSerializer]") [assignment]
src/documents/views/search.py:0: error: Value of type "Iterable[Any]" is not indexable [index] src/documents/views.py:0: error: Incompatible types in assignment (expression has type "type[OriginalsOnlyStrategy]", variable has type "type[OriginalAndArchiveStrategy]") [assignment]
src/documents/views/search.py:0: error: Value of type "Iterable[CustomField]" is not indexable [index] src/documents/views.py:0: error: Item "AnonymousUser" of "User | AnonymousUser" has no attribute "get_full_name" [union-attr]
src/documents/views/search.py:0: error: Value of type "Iterable[Group]" is not indexable [index] src/documents/views.py:0: error: Item "BasePagination" of "BasePagination | None" has no attribute "get_page_size" [union-attr]
src/documents/views/search.py:0: error: Value of type "Iterable[User]" is not indexable [index] src/documents/views.py:0: error: Item "BasePagination" of "BasePagination | None" has no attribute "page_size" [union-attr]
src/documents/views/search.py:0: error: Value of type "Iterable[Workflow]" is not indexable [index] src/documents/views.py:0: error: Item "None" of "Any | None" has no attribute "get" [union-attr]
src/documents/views/sharing.py:0: error: "Sequence[_SupportsHasPermission]" has no attribute "append" [attr-defined] src/documents/views.py:0: error: Item "None" of "Any | None" has no attribute "get" [union-attr]
src/documents/views/sharing.py:0: error: Function is missing a return type annotation [no-untyped-def] src/documents/views.py:0: error: Item "None" of "ApplicationConfiguration | None" has no attribute "app_logo" [union-attr]
src/documents/views/sharing.py:0: error: Function is missing a return type annotation [no-untyped-def] src/documents/views.py:0: error: Item "None" of "BasePagination | None" has no attribute "get_page_size" [union-attr]
src/documents/views/sharing.py:0: error: Function is missing a type annotation [no-untyped-def] src/documents/views.py:0: error: Item "None" of "BasePagination | None" has no attribute "page_size" [union-attr]
src/documents/views/sharing.py:0: error: Function is missing a type annotation [no-untyped-def] src/documents/views.py:0: error: Item "None" of "dict[str, _PingReply] | None" has no attribute "keys" [union-attr]
src/documents/views/sharing.py:0: error: Function is missing a type annotation [no-untyped-def] src/documents/views.py:0: error: Missing positional argument "request" in call to "email_documents" [call-arg]
src/documents/views/sharing.py:0: error: Missing type arguments for generic type "GenericViewSet" [type-arg] src/documents/views.py:0: error: Missing type arguments for generic type "GenericViewSet" [type-arg]
src/documents/views/sharing.py:0: error: Need type annotation for "authentication_classes" (hint: "authentication_classes: list[<type>] = ...") [var-annotated] src/documents/views.py:0: error: Missing type arguments for generic type "list" [type-arg]
src/documents/views/sharing.py:0: error: Need type annotation for "permission_classes" (hint: "permission_classes: list[<type>] = ...") [var-annotated] src/documents/views.py:0: error: Need type annotation for "authentication_classes" (hint: "authentication_classes: list[<type>] = ...") [var-annotated]
src/documents/views/system.py:0: error: Argument 1 to "permitted_document_ids" has incompatible type "User | AnonymousUser"; expected "User | None" [arg-type] src/documents/views.py:0: error: Need type annotation for "children_map" (hint: "children_map: dict[<type>, <type>] = ...") [var-annotated]
src/documents/views/system.py:0: error: Dict entry 0 has incompatible type "str": "bool"; expected "str": "str" [dict-item] src/documents/views.py:0: error: Need type annotation for "doc" [var-annotated]
src/documents/views/system.py:0: error: Function is missing a type annotation [no-untyped-def] src/documents/views.py:0: error: Need type annotation for "docs" (hint: "docs: list[<type>] = ...") [var-annotated]
src/documents/views/system.py:0: error: Function is missing a type annotation [no-untyped-def] src/documents/views.py:0: error: Need type annotation for "permission_classes" (hint: "permission_classes: list[<type>] = ...") [var-annotated]
src/documents/views/system.py:0: error: Function is missing a type annotation [no-untyped-def] src/documents/views.py:0: error: Need type annotation for "ui_settings" (hint: "ui_settings: dict[<type>, <type>] = ...") [var-annotated]
src/documents/views/system.py:0: error: Function is missing a type annotation [no-untyped-def] src/documents/views.py:0: error: Skipping analyzing "auditlog.models": module is installed, but missing library stubs or py.typed marker [import-untyped]
src/documents/views/system.py:0: error: Incompatible types in assignment (expression has type "Any | None", variable has type "dict[Any, Any]") [assignment] src/documents/views.py:0: error: Skipping analyzing "langdetect": module is installed, but missing library stubs or py.typed marker [import-untyped]
src/documents/views/system.py:0: error: Incompatible types in assignment (expression has type "bool", target has type "dict[str, str]") [assignment] src/documents/views.py:0: error: TypedDict key must be a string literal; expected one of ("pk", "correspondent", "document_type", "storage_path", "tags", ...) [literal-required]
src/documents/views/system.py:0: error: Incompatible types in assignment (expression has type "bool", target has type "dict[str, str]") [assignment] src/documents/views.py:0: error: Unsupported operand types for + ("None" and "int") [operator]
src/documents/views/system.py:0: error: Incompatible types in assignment (expression has type "bool", target has type "dict[str, str]") [assignment] src/documents/views.py:0: error: Value of type "Iterable[Any]" is not indexable [index]
src/documents/views/system.py:0: error: Incompatible types in assignment (expression has type "int", target has type "dict[str, str]") [assignment] src/documents/views.py:0: error: Value of type "Iterable[Any]" is not indexable [index]
src/documents/views/system.py:0: error: Incompatible types in assignment (expression has type "str | None", target has type "dict[str, str]") [assignment] src/documents/views.py:0: error: Value of type "Iterable[Any]" is not indexable [index]
src/documents/views/system.py:0: error: Incompatible types in assignment (expression has type "str | None", target has type "dict[str, str]") [assignment] src/documents/views.py:0: error: Value of type "Iterable[Any]" is not indexable [index]
src/documents/views/system.py:0: error: Incompatible types in assignment (expression has type "str", target has type "dict[str, str]") [assignment] src/documents/views.py:0: error: Value of type "Iterable[Any]" is not indexable [index]
src/documents/views/system.py:0: error: Incompatible types in assignment (expression has type "str", target has type "dict[str, str]") [assignment] src/documents/views.py:0: error: Value of type "Iterable[Any]" is not indexable [index]
src/documents/views/system.py:0: error: Incompatible types in assignment (expression has type "str", target has type "dict[str, str]") [assignment] src/documents/views.py:0: error: Value of type "Iterable[Any]" is not indexable [index]
src/documents/views/system.py:0: error: Incompatible types in assignment (expression has type "str", target has type "dict[str, str]") [assignment] src/documents/views.py:0: error: Value of type "Iterable[CustomField]" is not indexable [index]
src/documents/views/system.py:0: error: Incompatible types in assignment (expression has type "str", target has type "dict[str, str]") [assignment] src/documents/views.py:0: error: Value of type "Iterable[Group]" is not indexable [index]
src/documents/views/system.py:0: error: Incompatible types in assignment (expression has type "type[DocumentSerializer]", variable has type "type[TrashSerializer]") [assignment] src/documents/views.py:0: error: Value of type "Iterable[User]" is not indexable [index]
src/documents/views/system.py:0: error: Need type annotation for "ui_settings" (hint: "ui_settings: dict[<type>, <type>] = ...") [var-annotated] src/documents/views.py:0: error: Value of type "Iterable[Workflow]" is not indexable [index]
src/documents/views/tasks.py:0: error: "object" has no attribute "apply_async" [attr-defined] src/documents/views.py:0: error: Value of type "dict[str, _PingReply] | None" is not indexable [index]
src/documents/views/tasks.py:0: error: Argument 1 to "TaskSummarySerializer" has incompatible type "QuerySet[PaperlessTask@AnnotatedWith[TypedDict({'total_count': int, 'pending_count': int, 'success_count': int, 'failure_count': int, 'avg_duration_seconds': Any, 'avg_wait_time_seconds': Any, 'last_run': Any, 'last_success': Any, 'last_failure': Any})], dict[str, Any]]"; expected "dict[str, Any] | None" [arg-type]
src/documents/views/tasks.py:0: error: Function is missing a return type annotation [no-untyped-def]
src/documents/views/tasks.py:0: error: Function is missing a return type annotation [no-untyped-def]
src/documents/views/tasks.py:0: error: Function is missing a return type annotation [no-untyped-def]
src/documents/views/tasks.py:0: error: Function is missing a return type annotation [no-untyped-def]
src/documents/views/tasks.py:0: error: Function is missing a return type annotation [no-untyped-def]
src/documents/views/tasks.py:0: error: Function is missing a type annotation [no-untyped-def]
src/documents/views/tasks.py:0: error: Function is missing a type annotation [no-untyped-def]
src/documents/views/tasks.py:0: error: Function is missing a type annotation [no-untyped-def]
src/documents/views/tasks.py:0: error: Function is missing a type annotation [no-untyped-def]
src/documents/views/tasks.py:0: error: Function is missing a type annotation [no-untyped-def]
src/documents/views/tasks.py:0: error: Function is missing a type annotation [no-untyped-def]
src/documents/views/upload.py:0: error: Function is missing a type annotation [no-untyped-def]
src/documents/views/workflows.py:0: error: Function is missing a type annotation [no-untyped-def]
src/documents/views/workflows.py:0: error: Function is missing a type annotation [no-untyped-def]
src/documents/workflows/actions.py:0: error: Function is missing a return type annotation [no-untyped-def] src/documents/workflows/actions.py:0: error: Function is missing a return type annotation [no-untyped-def]
src/documents/workflows/actions.py:0: error: Function is missing a type annotation [no-untyped-def] src/documents/workflows/actions.py:0: error: Function is missing a type annotation [no-untyped-def]
src/documents/workflows/actions.py:0: error: Function is missing a type annotation for one or more parameters [no-untyped-def] src/documents/workflows/actions.py:0: error: Function is missing a type annotation for one or more parameters [no-untyped-def]
+1033 -1093
View File
File diff suppressed because it is too large Load Diff
+3 -1
View File
@@ -171,7 +171,9 @@ RUN set -eux \
&& cp /etc/ImageMagick-6/paperless-policy.xml /etc/ImageMagick-6/policy.xml \ && cp /etc/ImageMagick-6/paperless-policy.xml /etc/ImageMagick-6/policy.xml \
&& echo "Cleaning up image layer" \ && echo "Cleaning up image layer" \
&& rm --force --verbose *.deb \ && rm --force --verbose *.deb \
&& rm --recursive --force --verbose /var/lib/apt/lists/* && rm --recursive --force --verbose /var/lib/apt/lists/* \
&& echo "Configuring interactive shells to source the s6 container environment" \
&& echo '. /etc/profile.d/contenv.sh' >> /etc/bash.bashrc
WORKDIR /usr/src/paperless/src/ WORKDIR /usr/src/paperless/src/
+18
View File
@@ -0,0 +1,18 @@
#!/bin/sh
# Source s6 container environment for interactive shells.
# Ensures variables resolved from *_FILE secret injection are visible
# when using 'docker exec bash'. Does not affect s6 services (those
# use with-contenv directly). Has no effect in non-container contexts
# because the directory will not exist.
# Note: sh/dash shells opened via 'docker exec sh' are not covered;
# only bash-based sessions benefit from this file.
_pngx_contenv="/run/s6/container_environment"
if [ -d "${_pngx_contenv}" ]; then
for _pngx_f in "${_pngx_contenv}"/*; do
[ -f "${_pngx_f}" ] || continue
_pngx_name=$(basename "${_pngx_f}")
_pngx_val=$(cat "${_pngx_f}")
export "${_pngx_name}=${_pngx_val}"
done
fi
unset _pngx_contenv _pngx_f _pngx_name _pngx_val
@@ -154,11 +154,29 @@
& section { & section {
position: absolute; position: absolute;
text-align: initial; text-align: initial;
pointer-events: auto;
box-sizing: border-box; box-sizing: border-box;
transform-origin: 0 0; transform-origin: 0 0;
} }
& :is(.linkAnnotation, .buttonWidgetAnnotation.pushButton) > a {
position: absolute;
inset: 0;
font-size: 1em;
transition: none;
}
& :is(.linkAnnotation, .buttonWidgetAnnotation.pushButton):not(.hasBorder)
> a:hover {
opacity: 0.2;
background-color: rgb(255 255 0);
}
& .annotationTextContent { & .annotationTextContent {
opacity: 0; opacity: 0;
} }
} }
:host ::ng-deep .textLayer.selecting ~ .annotationLayer section {
pointer-events: none;
}
@@ -1,7 +1,11 @@
import { SimpleChange } from '@angular/core' import { SimpleChange } from '@angular/core'
import { ComponentFixture, TestBed } from '@angular/core/testing' import { ComponentFixture, TestBed } from '@angular/core/testing'
import * as pdfjs from 'pdfjs-dist/legacy/build/pdf.mjs' import * as pdfjs from 'pdfjs-dist/legacy/build/pdf.mjs'
import { PDFSinglePageViewer, PDFViewer } from 'pdfjs-dist/web/pdf_viewer.mjs' import {
LinkTarget,
PDFSinglePageViewer,
PDFViewer,
} from 'pdfjs-dist/web/pdf_viewer.mjs'
import { PngxPdfViewerComponent } from './pdf-viewer.component' import { PngxPdfViewerComponent } from './pdf-viewer.component'
import { PdfRenderMode, PdfZoomLevel, PdfZoomScale } from './pdf-viewer.types' import { PdfRenderMode, PdfZoomLevel, PdfZoomScale } from './pdf-viewer.types'
@@ -58,6 +62,16 @@ describe('PngxPdfViewerComponent', () => {
expect((component as any).pdfViewer).toBeInstanceOf(PDFViewer) expect((component as any).pdfViewer).toBeInstanceOf(PDFViewer)
}) })
it('opens external links in a new tab', () => {
const linkService = (component as any).linkService
expect(linkService.options).toEqual(
expect.objectContaining({
externalLinkTarget: LinkTarget.BLANK,
externalLinkRel: 'noopener noreferrer nofollow',
})
)
})
it('resolves the worker source relative to the document base URI', async () => { it('resolves the worker source relative to the document base URI', async () => {
setBaseHref('/paperless/') setBaseHref('/paperless/')
const getDocumentSpy = jest.spyOn(pdfjs, 'getDocument') const getDocumentSpy = jest.spyOn(pdfjs, 'getDocument')
@@ -21,6 +21,7 @@ import {
} from 'pdfjs-dist/legacy/build/pdf.mjs' } from 'pdfjs-dist/legacy/build/pdf.mjs'
import { import {
EventBus, EventBus,
LinkTarget,
PDFFindController, PDFFindController,
PDFLinkService, PDFLinkService,
PDFSinglePageViewer, PDFSinglePageViewer,
@@ -75,7 +76,11 @@ export class PngxPdfViewerComponent
private lastViewerPage?: number private lastViewerPage?: number
private readonly eventBus = new EventBus() private readonly eventBus = new EventBus()
private readonly linkService = new PDFLinkService({ eventBus: this.eventBus }) private readonly linkService = new PDFLinkService({
eventBus: this.eventBus,
externalLinkTarget: LinkTarget.BLANK,
externalLinkRel: 'noopener noreferrer nofollow',
})
private readonly findController = new PDFFindController({ private readonly findController = new PDFFindController({
eventBus: this.eventBus, eventBus: this.eventBus,
linkService: this.linkService, linkService: this.linkService,
+37 -21
View File
@@ -10741,7 +10741,7 @@
</context-group> </context-group>
<context-group purpose="location"> <context-group purpose="location">
<context context-type="sourcefile">src/app/components/document-list/document-list.component.ts</context> <context context-type="sourcefile">src/app/components/document-list/document-list.component.ts</context>
<context context-type="linenumber">348</context> <context context-type="linenumber">351</context>
</context-group> </context-group>
<context-group purpose="location"> <context-group purpose="location">
<context context-type="sourcefile">src/app/components/manage/document-attributes/document-attributes.component.html</context> <context context-type="sourcefile">src/app/components/manage/document-attributes/document-attributes.component.html</context>
@@ -10757,7 +10757,7 @@
</context-group> </context-group>
<context-group purpose="location"> <context-group purpose="location">
<context context-type="sourcefile">src/app/components/document-list/document-list.component.ts</context> <context context-type="sourcefile">src/app/components/document-list/document-list.component.ts</context>
<context context-type="linenumber">341</context> <context context-type="linenumber">344</context>
</context-group> </context-group>
<context-group purpose="location"> <context-group purpose="location">
<context context-type="sourcefile">src/app/components/manage/document-attributes/document-attributes.component.html</context> <context context-type="sourcefile">src/app/components/manage/document-attributes/document-attributes.component.html</context>
@@ -11041,7 +11041,7 @@
<source>Reset filters / selection</source> <source>Reset filters / selection</source>
<context-group purpose="location"> <context-group purpose="location">
<context context-type="sourcefile">src/app/components/document-list/document-list.component.ts</context> <context context-type="sourcefile">src/app/components/document-list/document-list.component.ts</context>
<context context-type="linenumber">329</context> <context context-type="linenumber">332</context>
</context-group> </context-group>
<target state="needs-translation">Reset filters / selection</target> <target state="needs-translation">Reset filters / selection</target>
</trans-unit> </trans-unit>
@@ -11049,7 +11049,7 @@
<source>Open first [selected] document</source> <source>Open first [selected] document</source>
<context-group purpose="location"> <context-group purpose="location">
<context context-type="sourcefile">src/app/components/document-list/document-list.component.ts</context> <context context-type="sourcefile">src/app/components/document-list/document-list.component.ts</context>
<context context-type="linenumber">357</context> <context context-type="linenumber">360</context>
</context-group> </context-group>
<target state="needs-translation">Open first [selected] document</target> <target state="needs-translation">Open first [selected] document</target>
</trans-unit> </trans-unit>
@@ -11057,7 +11057,7 @@
<source>Previous page</source> <source>Previous page</source>
<context-group purpose="location"> <context-group purpose="location">
<context context-type="sourcefile">src/app/components/document-list/document-list.component.ts</context> <context context-type="sourcefile">src/app/components/document-list/document-list.component.ts</context>
<context context-type="linenumber">373</context> <context context-type="linenumber">376</context>
</context-group> </context-group>
<target state="needs-translation">Previous page</target> <target state="needs-translation">Previous page</target>
</trans-unit> </trans-unit>
@@ -11065,7 +11065,7 @@
<source>Next page</source> <source>Next page</source>
<context-group purpose="location"> <context-group purpose="location">
<context context-type="sourcefile">src/app/components/document-list/document-list.component.ts</context> <context context-type="sourcefile">src/app/components/document-list/document-list.component.ts</context>
<context context-type="linenumber">385</context> <context context-type="linenumber">388</context>
</context-group> </context-group>
<target state="needs-translation">Next page</target> <target state="needs-translation">Next page</target>
</trans-unit> </trans-unit>
@@ -11073,7 +11073,7 @@
<source>View &quot;<x id="PH" equiv-text="this.list.activeSavedViewTitle"/>&quot; saved successfully.</source> <source>View &quot;<x id="PH" equiv-text="this.list.activeSavedViewTitle"/>&quot; saved successfully.</source>
<context-group purpose="location"> <context-group purpose="location">
<context context-type="sourcefile">src/app/components/document-list/document-list.component.ts</context> <context context-type="sourcefile">src/app/components/document-list/document-list.component.ts</context>
<context context-type="linenumber">419</context> <context context-type="linenumber">422</context>
</context-group> </context-group>
<target state="translated">Aansig “<x id="PH" equiv-text="this.list.activeSavedViewTitle"/>” suksesvol bewaar.</target> <target state="translated">Aansig “<x id="PH" equiv-text="this.list.activeSavedViewTitle"/>” suksesvol bewaar.</target>
</trans-unit> </trans-unit>
@@ -11081,7 +11081,7 @@
<source>Failed to save view &quot;<x id="PH" equiv-text="this.list.activeSavedViewTitle"/>&quot;.</source> <source>Failed to save view &quot;<x id="PH" equiv-text="this.list.activeSavedViewTitle"/>&quot;.</source>
<context-group purpose="location"> <context-group purpose="location">
<context context-type="sourcefile">src/app/components/document-list/document-list.component.ts</context> <context context-type="sourcefile">src/app/components/document-list/document-list.component.ts</context>
<context context-type="linenumber">425</context> <context context-type="linenumber">428</context>
</context-group> </context-group>
<target state="needs-translation">Failed to save view "<x id="PH" equiv-text="this.list.activeSavedViewTitle"/>".</target> <target state="needs-translation">Failed to save view "<x id="PH" equiv-text="this.list.activeSavedViewTitle"/>".</target>
</trans-unit> </trans-unit>
@@ -11089,7 +11089,7 @@
<source>View &quot;<x id="PH" equiv-text="savedView.name"/>&quot; created successfully.</source> <source>View &quot;<x id="PH" equiv-text="savedView.name"/>&quot; created successfully.</source>
<context-group purpose="location"> <context-group purpose="location">
<context context-type="sourcefile">src/app/components/document-list/document-list.component.ts</context> <context context-type="sourcefile">src/app/components/document-list/document-list.component.ts</context>
<context context-type="linenumber">494</context> <context context-type="linenumber">497</context>
</context-group> </context-group>
<target state="translated">Aansig “<x id="PH" equiv-text="savedView.name"/>” suksesvol geskep.</target> <target state="translated">Aansig “<x id="PH" equiv-text="savedView.name"/>” suksesvol geskep.</target>
</trans-unit> </trans-unit>
@@ -11097,7 +11097,7 @@
<source>View &quot;<x id="PH" equiv-text="savedView.name"/>&quot; created successfully, but could not update visibility settings.</source> <source>View &quot;<x id="PH" equiv-text="savedView.name"/>&quot; created successfully, but could not update visibility settings.</source>
<context-group purpose="location"> <context-group purpose="location">
<context context-type="sourcefile">src/app/components/document-list/document-list.component.ts</context> <context context-type="sourcefile">src/app/components/document-list/document-list.component.ts</context>
<context context-type="linenumber">500</context> <context context-type="linenumber">503</context>
</context-group> </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="needs-translation">View "<x id="PH" equiv-text="savedView.name"/>" created successfully, but could not update visibility settings.</target>
</trans-unit> </trans-unit>
@@ -13298,11 +13298,27 @@
</context-group> </context-group>
<target state="needs-translation">LLM Embedding Model</target> <target state="needs-translation">LLM Embedding Model</target>
</trans-unit> </trans-unit>
<trans-unit id="861068592166833023" datatype="html">
<source>LLM Embedding API Key</source>
<context-group purpose="location">
<context context-type="sourcefile">src/app/data/paperless-config.ts</context>
<context context-type="linenumber">358</context>
</context-group>
<target state="needs-translation">LLM Embedding API Key</target>
</trans-unit>
<trans-unit id="2929108042259892948" datatype="html">
<source>Used for embeddings when set, otherwise LLM API key is used.</source>
<context-group purpose="location">
<context context-type="sourcefile">src/app/data/paperless-config.ts</context>
<context context-type="linenumber">360</context>
</context-group>
<target state="needs-translation">Used for embeddings when set, otherwise LLM API key is used.</target>
</trans-unit>
<trans-unit id="3554114880473286122" datatype="html"> <trans-unit id="3554114880473286122" datatype="html">
<source>LLM Embedding Endpoint</source> <source>LLM Embedding Endpoint</source>
<context-group purpose="location"> <context-group purpose="location">
<context context-type="sourcefile">src/app/data/paperless-config.ts</context> <context context-type="sourcefile">src/app/data/paperless-config.ts</context>
<context context-type="linenumber">358</context> <context context-type="linenumber">366</context>
</context-group> </context-group>
<target state="needs-translation">LLM Embedding Endpoint</target> <target state="needs-translation">LLM Embedding Endpoint</target>
</trans-unit> </trans-unit>
@@ -13310,7 +13326,7 @@
<source>LLM Embedding Chunk Size</source> <source>LLM Embedding Chunk Size</source>
<context-group purpose="location"> <context-group purpose="location">
<context context-type="sourcefile">src/app/data/paperless-config.ts</context> <context context-type="sourcefile">src/app/data/paperless-config.ts</context>
<context context-type="linenumber">365</context> <context context-type="linenumber">373</context>
</context-group> </context-group>
<target state="needs-translation">LLM Embedding Chunk Size</target> <target state="needs-translation">LLM Embedding Chunk Size</target>
</trans-unit> </trans-unit>
@@ -13318,7 +13334,7 @@
<source>LLM Context Size</source> <source>LLM Context Size</source>
<context-group purpose="location"> <context-group purpose="location">
<context context-type="sourcefile">src/app/data/paperless-config.ts</context> <context context-type="sourcefile">src/app/data/paperless-config.ts</context>
<context context-type="linenumber">372</context> <context context-type="linenumber">380</context>
</context-group> </context-group>
<target state="needs-translation">LLM Context Size</target> <target state="needs-translation">LLM Context Size</target>
</trans-unit> </trans-unit>
@@ -13326,7 +13342,7 @@
<source>LLM Backend</source> <source>LLM Backend</source>
<context-group purpose="location"> <context-group purpose="location">
<context context-type="sourcefile">src/app/data/paperless-config.ts</context> <context context-type="sourcefile">src/app/data/paperless-config.ts</context>
<context context-type="linenumber">379</context> <context context-type="linenumber">387</context>
</context-group> </context-group>
<target state="needs-translation">LLM Backend</target> <target state="needs-translation">LLM Backend</target>
</trans-unit> </trans-unit>
@@ -13334,7 +13350,7 @@
<source>LLM Model</source> <source>LLM Model</source>
<context-group purpose="location"> <context-group purpose="location">
<context context-type="sourcefile">src/app/data/paperless-config.ts</context> <context context-type="sourcefile">src/app/data/paperless-config.ts</context>
<context context-type="linenumber">387</context> <context context-type="linenumber">395</context>
</context-group> </context-group>
<target state="needs-translation">LLM Model</target> <target state="needs-translation">LLM Model</target>
</trans-unit> </trans-unit>
@@ -13342,7 +13358,7 @@
<source>LLM API Key</source> <source>LLM API Key</source>
<context-group purpose="location"> <context-group purpose="location">
<context context-type="sourcefile">src/app/data/paperless-config.ts</context> <context context-type="sourcefile">src/app/data/paperless-config.ts</context>
<context context-type="linenumber">394</context> <context context-type="linenumber">402</context>
</context-group> </context-group>
<target state="needs-translation">LLM API Key</target> <target state="needs-translation">LLM API Key</target>
</trans-unit> </trans-unit>
@@ -13350,7 +13366,7 @@
<source>LLM Endpoint</source> <source>LLM Endpoint</source>
<context-group purpose="location"> <context-group purpose="location">
<context context-type="sourcefile">src/app/data/paperless-config.ts</context> <context context-type="sourcefile">src/app/data/paperless-config.ts</context>
<context context-type="linenumber">401</context> <context context-type="linenumber">409</context>
</context-group> </context-group>
<target state="needs-translation">LLM Endpoint</target> <target state="needs-translation">LLM Endpoint</target>
</trans-unit> </trans-unit>
@@ -13358,7 +13374,7 @@
<source>LLM Output Language</source> <source>LLM Output Language</source>
<context-group purpose="location"> <context-group purpose="location">
<context context-type="sourcefile">src/app/data/paperless-config.ts</context> <context context-type="sourcefile">src/app/data/paperless-config.ts</context>
<context context-type="linenumber">408</context> <context context-type="linenumber">416</context>
</context-group> </context-group>
<target state="needs-translation">LLM Output Language</target> <target state="needs-translation">LLM Output Language</target>
</trans-unit> </trans-unit>
@@ -13366,7 +13382,7 @@
<source>Language to use for generated AI suggestions. When unset, AI suggestions use the user&apos;s display language if explicitly set.</source> <source>Language to use for generated AI suggestions. When unset, AI suggestions use the user&apos;s display language if explicitly set.</source>
<context-group purpose="location"> <context-group purpose="location">
<context context-type="sourcefile">src/app/data/paperless-config.ts</context> <context context-type="sourcefile">src/app/data/paperless-config.ts</context>
<context context-type="linenumber">412</context> <context context-type="linenumber">420</context>
</context-group> </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="needs-translation">Language to use for generated AI suggestions. When unset, AI suggestions use the user's display language if explicitly set.</target>
</trans-unit> </trans-unit>
@@ -13374,7 +13390,7 @@
<source>LLM Request Timeout</source> <source>LLM Request Timeout</source>
<context-group purpose="location"> <context-group purpose="location">
<context context-type="sourcefile">src/app/data/paperless-config.ts</context> <context context-type="sourcefile">src/app/data/paperless-config.ts</context>
<context context-type="linenumber">416</context> <context context-type="linenumber">424</context>
</context-group> </context-group>
<target state="needs-translation">LLM Request Timeout</target> <target state="needs-translation">LLM Request Timeout</target>
</trans-unit> </trans-unit>
@@ -13382,7 +13398,7 @@
<source>Timeout in seconds for LLM requests.</source> <source>Timeout in seconds for LLM requests.</source>
<context-group purpose="location"> <context-group purpose="location">
<context context-type="sourcefile">src/app/data/paperless-config.ts</context> <context context-type="sourcefile">src/app/data/paperless-config.ts</context>
<context context-type="linenumber">420</context> <context context-type="linenumber">428</context>
</context-group> </context-group>
<target state="needs-translation">Timeout in seconds for LLM requests.</target> <target state="needs-translation">Timeout in seconds for LLM requests.</target>
</trans-unit> </trans-unit>
+37 -21
View File
@@ -10741,7 +10741,7 @@
</context-group> </context-group>
<context-group purpose="location"> <context-group purpose="location">
<context context-type="sourcefile">src/app/components/document-list/document-list.component.ts</context> <context context-type="sourcefile">src/app/components/document-list/document-list.component.ts</context>
<context context-type="linenumber">348</context> <context context-type="linenumber">351</context>
</context-group> </context-group>
<context-group purpose="location"> <context-group purpose="location">
<context context-type="sourcefile">src/app/components/manage/document-attributes/document-attributes.component.html</context> <context context-type="sourcefile">src/app/components/manage/document-attributes/document-attributes.component.html</context>
@@ -10757,7 +10757,7 @@
</context-group> </context-group>
<context-group purpose="location"> <context-group purpose="location">
<context context-type="sourcefile">src/app/components/document-list/document-list.component.ts</context> <context context-type="sourcefile">src/app/components/document-list/document-list.component.ts</context>
<context context-type="linenumber">341</context> <context context-type="linenumber">344</context>
</context-group> </context-group>
<context-group purpose="location"> <context-group purpose="location">
<context context-type="sourcefile">src/app/components/manage/document-attributes/document-attributes.component.html</context> <context context-type="sourcefile">src/app/components/manage/document-attributes/document-attributes.component.html</context>
@@ -11041,7 +11041,7 @@
<source>Reset filters / selection</source> <source>Reset filters / selection</source>
<context-group purpose="location"> <context-group purpose="location">
<context context-type="sourcefile">src/app/components/document-list/document-list.component.ts</context> <context context-type="sourcefile">src/app/components/document-list/document-list.component.ts</context>
<context context-type="linenumber">329</context> <context context-type="linenumber">332</context>
</context-group> </context-group>
<target state="needs-translation">Reset filters / selection</target> <target state="needs-translation">Reset filters / selection</target>
</trans-unit> </trans-unit>
@@ -11049,7 +11049,7 @@
<source>Open first [selected] document</source> <source>Open first [selected] document</source>
<context-group purpose="location"> <context-group purpose="location">
<context context-type="sourcefile">src/app/components/document-list/document-list.component.ts</context> <context context-type="sourcefile">src/app/components/document-list/document-list.component.ts</context>
<context context-type="linenumber">357</context> <context context-type="linenumber">360</context>
</context-group> </context-group>
<target state="needs-translation">Open first [selected] document</target> <target state="needs-translation">Open first [selected] document</target>
</trans-unit> </trans-unit>
@@ -11057,7 +11057,7 @@
<source>Previous page</source> <source>Previous page</source>
<context-group purpose="location"> <context-group purpose="location">
<context context-type="sourcefile">src/app/components/document-list/document-list.component.ts</context> <context context-type="sourcefile">src/app/components/document-list/document-list.component.ts</context>
<context context-type="linenumber">373</context> <context context-type="linenumber">376</context>
</context-group> </context-group>
<target state="needs-translation">Previous page</target> <target state="needs-translation">Previous page</target>
</trans-unit> </trans-unit>
@@ -11065,7 +11065,7 @@
<source>Next page</source> <source>Next page</source>
<context-group purpose="location"> <context-group purpose="location">
<context context-type="sourcefile">src/app/components/document-list/document-list.component.ts</context> <context context-type="sourcefile">src/app/components/document-list/document-list.component.ts</context>
<context context-type="linenumber">385</context> <context context-type="linenumber">388</context>
</context-group> </context-group>
<target state="needs-translation">Next page</target> <target state="needs-translation">Next page</target>
</trans-unit> </trans-unit>
@@ -11073,7 +11073,7 @@
<source>View &quot;<x id="PH" equiv-text="this.list.activeSavedViewTitle"/>&quot; saved successfully.</source> <source>View &quot;<x id="PH" equiv-text="this.list.activeSavedViewTitle"/>&quot; saved successfully.</source>
<context-group purpose="location"> <context-group purpose="location">
<context context-type="sourcefile">src/app/components/document-list/document-list.component.ts</context> <context context-type="sourcefile">src/app/components/document-list/document-list.component.ts</context>
<context context-type="linenumber">419</context> <context context-type="linenumber">422</context>
</context-group> </context-group>
<target state="needs-translation">View "<x id="PH" equiv-text="this.list.activeSavedViewTitle"/>" saved successfully.</target> <target state="needs-translation">View "<x id="PH" equiv-text="this.list.activeSavedViewTitle"/>" saved successfully.</target>
</trans-unit> </trans-unit>
@@ -11081,7 +11081,7 @@
<source>Failed to save view &quot;<x id="PH" equiv-text="this.list.activeSavedViewTitle"/>&quot;.</source> <source>Failed to save view &quot;<x id="PH" equiv-text="this.list.activeSavedViewTitle"/>&quot;.</source>
<context-group purpose="location"> <context-group purpose="location">
<context context-type="sourcefile">src/app/components/document-list/document-list.component.ts</context> <context context-type="sourcefile">src/app/components/document-list/document-list.component.ts</context>
<context context-type="linenumber">425</context> <context context-type="linenumber">428</context>
</context-group> </context-group>
<target state="needs-translation">Failed to save view "<x id="PH" equiv-text="this.list.activeSavedViewTitle"/>".</target> <target state="needs-translation">Failed to save view "<x id="PH" equiv-text="this.list.activeSavedViewTitle"/>".</target>
</trans-unit> </trans-unit>
@@ -11089,7 +11089,7 @@
<source>View &quot;<x id="PH" equiv-text="savedView.name"/>&quot; created successfully.</source> <source>View &quot;<x id="PH" equiv-text="savedView.name"/>&quot; created successfully.</source>
<context-group purpose="location"> <context-group purpose="location">
<context context-type="sourcefile">src/app/components/document-list/document-list.component.ts</context> <context context-type="sourcefile">src/app/components/document-list/document-list.component.ts</context>
<context context-type="linenumber">494</context> <context context-type="linenumber">497</context>
</context-group> </context-group>
<target state="needs-translation">View "<x id="PH" equiv-text="savedView.name"/>" created successfully.</target> <target state="needs-translation">View "<x id="PH" equiv-text="savedView.name"/>" created successfully.</target>
</trans-unit> </trans-unit>
@@ -11097,7 +11097,7 @@
<source>View &quot;<x id="PH" equiv-text="savedView.name"/>&quot; created successfully, but could not update visibility settings.</source> <source>View &quot;<x id="PH" equiv-text="savedView.name"/>&quot; created successfully, but could not update visibility settings.</source>
<context-group purpose="location"> <context-group purpose="location">
<context context-type="sourcefile">src/app/components/document-list/document-list.component.ts</context> <context context-type="sourcefile">src/app/components/document-list/document-list.component.ts</context>
<context context-type="linenumber">500</context> <context context-type="linenumber">503</context>
</context-group> </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="needs-translation">View "<x id="PH" equiv-text="savedView.name"/>" created successfully, but could not update visibility settings.</target>
</trans-unit> </trans-unit>
@@ -13298,11 +13298,27 @@
</context-group> </context-group>
<target state="needs-translation">LLM Embedding Model</target> <target state="needs-translation">LLM Embedding Model</target>
</trans-unit> </trans-unit>
<trans-unit id="861068592166833023" datatype="html">
<source>LLM Embedding API Key</source>
<context-group purpose="location">
<context context-type="sourcefile">src/app/data/paperless-config.ts</context>
<context context-type="linenumber">358</context>
</context-group>
<target state="needs-translation">LLM Embedding API Key</target>
</trans-unit>
<trans-unit id="2929108042259892948" datatype="html">
<source>Used for embeddings when set, otherwise LLM API key is used.</source>
<context-group purpose="location">
<context context-type="sourcefile">src/app/data/paperless-config.ts</context>
<context context-type="linenumber">360</context>
</context-group>
<target state="needs-translation">Used for embeddings when set, otherwise LLM API key is used.</target>
</trans-unit>
<trans-unit id="3554114880473286122" datatype="html"> <trans-unit id="3554114880473286122" datatype="html">
<source>LLM Embedding Endpoint</source> <source>LLM Embedding Endpoint</source>
<context-group purpose="location"> <context-group purpose="location">
<context context-type="sourcefile">src/app/data/paperless-config.ts</context> <context context-type="sourcefile">src/app/data/paperless-config.ts</context>
<context context-type="linenumber">358</context> <context context-type="linenumber">366</context>
</context-group> </context-group>
<target state="needs-translation">LLM Embedding Endpoint</target> <target state="needs-translation">LLM Embedding Endpoint</target>
</trans-unit> </trans-unit>
@@ -13310,7 +13326,7 @@
<source>LLM Embedding Chunk Size</source> <source>LLM Embedding Chunk Size</source>
<context-group purpose="location"> <context-group purpose="location">
<context context-type="sourcefile">src/app/data/paperless-config.ts</context> <context context-type="sourcefile">src/app/data/paperless-config.ts</context>
<context context-type="linenumber">365</context> <context context-type="linenumber">373</context>
</context-group> </context-group>
<target state="needs-translation">LLM Embedding Chunk Size</target> <target state="needs-translation">LLM Embedding Chunk Size</target>
</trans-unit> </trans-unit>
@@ -13318,7 +13334,7 @@
<source>LLM Context Size</source> <source>LLM Context Size</source>
<context-group purpose="location"> <context-group purpose="location">
<context context-type="sourcefile">src/app/data/paperless-config.ts</context> <context context-type="sourcefile">src/app/data/paperless-config.ts</context>
<context context-type="linenumber">372</context> <context context-type="linenumber">380</context>
</context-group> </context-group>
<target state="needs-translation">LLM Context Size</target> <target state="needs-translation">LLM Context Size</target>
</trans-unit> </trans-unit>
@@ -13326,7 +13342,7 @@
<source>LLM Backend</source> <source>LLM Backend</source>
<context-group purpose="location"> <context-group purpose="location">
<context context-type="sourcefile">src/app/data/paperless-config.ts</context> <context context-type="sourcefile">src/app/data/paperless-config.ts</context>
<context context-type="linenumber">379</context> <context context-type="linenumber">387</context>
</context-group> </context-group>
<target state="needs-translation">LLM Backend</target> <target state="needs-translation">LLM Backend</target>
</trans-unit> </trans-unit>
@@ -13334,7 +13350,7 @@
<source>LLM Model</source> <source>LLM Model</source>
<context-group purpose="location"> <context-group purpose="location">
<context context-type="sourcefile">src/app/data/paperless-config.ts</context> <context context-type="sourcefile">src/app/data/paperless-config.ts</context>
<context context-type="linenumber">387</context> <context context-type="linenumber">395</context>
</context-group> </context-group>
<target state="needs-translation">LLM Model</target> <target state="needs-translation">LLM Model</target>
</trans-unit> </trans-unit>
@@ -13342,7 +13358,7 @@
<source>LLM API Key</source> <source>LLM API Key</source>
<context-group purpose="location"> <context-group purpose="location">
<context context-type="sourcefile">src/app/data/paperless-config.ts</context> <context context-type="sourcefile">src/app/data/paperless-config.ts</context>
<context context-type="linenumber">394</context> <context context-type="linenumber">402</context>
</context-group> </context-group>
<target state="needs-translation">LLM API Key</target> <target state="needs-translation">LLM API Key</target>
</trans-unit> </trans-unit>
@@ -13350,7 +13366,7 @@
<source>LLM Endpoint</source> <source>LLM Endpoint</source>
<context-group purpose="location"> <context-group purpose="location">
<context context-type="sourcefile">src/app/data/paperless-config.ts</context> <context context-type="sourcefile">src/app/data/paperless-config.ts</context>
<context context-type="linenumber">401</context> <context context-type="linenumber">409</context>
</context-group> </context-group>
<target state="needs-translation">LLM Endpoint</target> <target state="needs-translation">LLM Endpoint</target>
</trans-unit> </trans-unit>
@@ -13358,7 +13374,7 @@
<source>LLM Output Language</source> <source>LLM Output Language</source>
<context-group purpose="location"> <context-group purpose="location">
<context context-type="sourcefile">src/app/data/paperless-config.ts</context> <context context-type="sourcefile">src/app/data/paperless-config.ts</context>
<context context-type="linenumber">408</context> <context context-type="linenumber">416</context>
</context-group> </context-group>
<target state="needs-translation">LLM Output Language</target> <target state="needs-translation">LLM Output Language</target>
</trans-unit> </trans-unit>
@@ -13366,7 +13382,7 @@
<source>Language to use for generated AI suggestions. When unset, AI suggestions use the user&apos;s display language if explicitly set.</source> <source>Language to use for generated AI suggestions. When unset, AI suggestions use the user&apos;s display language if explicitly set.</source>
<context-group purpose="location"> <context-group purpose="location">
<context context-type="sourcefile">src/app/data/paperless-config.ts</context> <context context-type="sourcefile">src/app/data/paperless-config.ts</context>
<context context-type="linenumber">412</context> <context context-type="linenumber">420</context>
</context-group> </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="needs-translation">Language to use for generated AI suggestions. When unset, AI suggestions use the user's display language if explicitly set.</target>
</trans-unit> </trans-unit>
@@ -13374,7 +13390,7 @@
<source>LLM Request Timeout</source> <source>LLM Request Timeout</source>
<context-group purpose="location"> <context-group purpose="location">
<context context-type="sourcefile">src/app/data/paperless-config.ts</context> <context context-type="sourcefile">src/app/data/paperless-config.ts</context>
<context context-type="linenumber">416</context> <context context-type="linenumber">424</context>
</context-group> </context-group>
<target state="needs-translation">LLM Request Timeout</target> <target state="needs-translation">LLM Request Timeout</target>
</trans-unit> </trans-unit>
@@ -13382,7 +13398,7 @@
<source>Timeout in seconds for LLM requests.</source> <source>Timeout in seconds for LLM requests.</source>
<context-group purpose="location"> <context-group purpose="location">
<context context-type="sourcefile">src/app/data/paperless-config.ts</context> <context context-type="sourcefile">src/app/data/paperless-config.ts</context>
<context context-type="linenumber">420</context> <context context-type="linenumber">428</context>
</context-group> </context-group>
<target state="needs-translation">Timeout in seconds for LLM requests.</target> <target state="needs-translation">Timeout in seconds for LLM requests.</target>
</trans-unit> </trans-unit>
+37 -21
View File
@@ -10741,7 +10741,7 @@
</context-group> </context-group>
<context-group purpose="location"> <context-group purpose="location">
<context context-type="sourcefile">src/app/components/document-list/document-list.component.ts</context> <context context-type="sourcefile">src/app/components/document-list/document-list.component.ts</context>
<context context-type="linenumber">348</context> <context context-type="linenumber">351</context>
</context-group> </context-group>
<context-group purpose="location"> <context-group purpose="location">
<context context-type="sourcefile">src/app/components/manage/document-attributes/document-attributes.component.html</context> <context context-type="sourcefile">src/app/components/manage/document-attributes/document-attributes.component.html</context>
@@ -10757,7 +10757,7 @@
</context-group> </context-group>
<context-group purpose="location"> <context-group purpose="location">
<context context-type="sourcefile">src/app/components/document-list/document-list.component.ts</context> <context context-type="sourcefile">src/app/components/document-list/document-list.component.ts</context>
<context context-type="linenumber">341</context> <context context-type="linenumber">344</context>
</context-group> </context-group>
<context-group purpose="location"> <context-group purpose="location">
<context context-type="sourcefile">src/app/components/manage/document-attributes/document-attributes.component.html</context> <context context-type="sourcefile">src/app/components/manage/document-attributes/document-attributes.component.html</context>
@@ -11041,7 +11041,7 @@
<source>Reset filters / selection</source> <source>Reset filters / selection</source>
<context-group purpose="location"> <context-group purpose="location">
<context context-type="sourcefile">src/app/components/document-list/document-list.component.ts</context> <context context-type="sourcefile">src/app/components/document-list/document-list.component.ts</context>
<context context-type="linenumber">329</context> <context context-type="linenumber">332</context>
</context-group> </context-group>
<target state="translated">إعادة تعيين المرشحات / التحديد</target> <target state="translated">إعادة تعيين المرشحات / التحديد</target>
</trans-unit> </trans-unit>
@@ -11049,7 +11049,7 @@
<source>Open first [selected] document</source> <source>Open first [selected] document</source>
<context-group purpose="location"> <context-group purpose="location">
<context context-type="sourcefile">src/app/components/document-list/document-list.component.ts</context> <context context-type="sourcefile">src/app/components/document-list/document-list.component.ts</context>
<context context-type="linenumber">357</context> <context context-type="linenumber">360</context>
</context-group> </context-group>
<target state="translated">فتح أول مستند [محدد]</target> <target state="translated">فتح أول مستند [محدد]</target>
</trans-unit> </trans-unit>
@@ -11057,7 +11057,7 @@
<source>Previous page</source> <source>Previous page</source>
<context-group purpose="location"> <context-group purpose="location">
<context context-type="sourcefile">src/app/components/document-list/document-list.component.ts</context> <context context-type="sourcefile">src/app/components/document-list/document-list.component.ts</context>
<context context-type="linenumber">373</context> <context context-type="linenumber">376</context>
</context-group> </context-group>
<target state="needs-translation">Previous page</target> <target state="needs-translation">Previous page</target>
</trans-unit> </trans-unit>
@@ -11065,7 +11065,7 @@
<source>Next page</source> <source>Next page</source>
<context-group purpose="location"> <context-group purpose="location">
<context context-type="sourcefile">src/app/components/document-list/document-list.component.ts</context> <context context-type="sourcefile">src/app/components/document-list/document-list.component.ts</context>
<context context-type="linenumber">385</context> <context context-type="linenumber">388</context>
</context-group> </context-group>
<target state="needs-translation">Next page</target> <target state="needs-translation">Next page</target>
</trans-unit> </trans-unit>
@@ -11073,7 +11073,7 @@
<source>View &quot;<x id="PH" equiv-text="this.list.activeSavedViewTitle"/>&quot; saved successfully.</source> <source>View &quot;<x id="PH" equiv-text="this.list.activeSavedViewTitle"/>&quot; saved successfully.</source>
<context-group purpose="location"> <context-group purpose="location">
<context context-type="sourcefile">src/app/components/document-list/document-list.component.ts</context> <context context-type="sourcefile">src/app/components/document-list/document-list.component.ts</context>
<context context-type="linenumber">419</context> <context context-type="linenumber">422</context>
</context-group> </context-group>
<target state="translated">عرض "<x id="PH" equiv-text="this.list.activeSavedViewTitle"/>" حفظ بنجاح.</target> <target state="translated">عرض "<x id="PH" equiv-text="this.list.activeSavedViewTitle"/>" حفظ بنجاح.</target>
</trans-unit> </trans-unit>
@@ -11081,7 +11081,7 @@
<source>Failed to save view &quot;<x id="PH" equiv-text="this.list.activeSavedViewTitle"/>&quot;.</source> <source>Failed to save view &quot;<x id="PH" equiv-text="this.list.activeSavedViewTitle"/>&quot;.</source>
<context-group purpose="location"> <context-group purpose="location">
<context context-type="sourcefile">src/app/components/document-list/document-list.component.ts</context> <context context-type="sourcefile">src/app/components/document-list/document-list.component.ts</context>
<context context-type="linenumber">425</context> <context context-type="linenumber">428</context>
</context-group> </context-group>
<target state="translated">فشل في حفظ طريقة العرض "<x id="PH" equiv-text="this.list.activeSavedViewTitle"/>".</target> <target state="translated">فشل في حفظ طريقة العرض "<x id="PH" equiv-text="this.list.activeSavedViewTitle"/>".</target>
</trans-unit> </trans-unit>
@@ -11089,7 +11089,7 @@
<source>View &quot;<x id="PH" equiv-text="savedView.name"/>&quot; created successfully.</source> <source>View &quot;<x id="PH" equiv-text="savedView.name"/>&quot; created successfully.</source>
<context-group purpose="location"> <context-group purpose="location">
<context context-type="sourcefile">src/app/components/document-list/document-list.component.ts</context> <context context-type="sourcefile">src/app/components/document-list/document-list.component.ts</context>
<context context-type="linenumber">494</context> <context context-type="linenumber">497</context>
</context-group> </context-group>
<target state="translated">عرض "<x id="PH" equiv-text="savedView.name"/>" أنشئ بنجاح.</target> <target state="translated">عرض "<x id="PH" equiv-text="savedView.name"/>" أنشئ بنجاح.</target>
</trans-unit> </trans-unit>
@@ -11097,7 +11097,7 @@
<source>View &quot;<x id="PH" equiv-text="savedView.name"/>&quot; created successfully, but could not update visibility settings.</source> <source>View &quot;<x id="PH" equiv-text="savedView.name"/>&quot; created successfully, but could not update visibility settings.</source>
<context-group purpose="location"> <context-group purpose="location">
<context context-type="sourcefile">src/app/components/document-list/document-list.component.ts</context> <context context-type="sourcefile">src/app/components/document-list/document-list.component.ts</context>
<context context-type="linenumber">500</context> <context context-type="linenumber">503</context>
</context-group> </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="needs-translation">View "<x id="PH" equiv-text="savedView.name"/>" created successfully, but could not update visibility settings.</target>
</trans-unit> </trans-unit>
@@ -13298,11 +13298,27 @@
</context-group> </context-group>
<target state="needs-translation">LLM Embedding Model</target> <target state="needs-translation">LLM Embedding Model</target>
</trans-unit> </trans-unit>
<trans-unit id="861068592166833023" datatype="html">
<source>LLM Embedding API Key</source>
<context-group purpose="location">
<context context-type="sourcefile">src/app/data/paperless-config.ts</context>
<context context-type="linenumber">358</context>
</context-group>
<target state="needs-translation">LLM Embedding API Key</target>
</trans-unit>
<trans-unit id="2929108042259892948" datatype="html">
<source>Used for embeddings when set, otherwise LLM API key is used.</source>
<context-group purpose="location">
<context context-type="sourcefile">src/app/data/paperless-config.ts</context>
<context context-type="linenumber">360</context>
</context-group>
<target state="needs-translation">Used for embeddings when set, otherwise LLM API key is used.</target>
</trans-unit>
<trans-unit id="3554114880473286122" datatype="html"> <trans-unit id="3554114880473286122" datatype="html">
<source>LLM Embedding Endpoint</source> <source>LLM Embedding Endpoint</source>
<context-group purpose="location"> <context-group purpose="location">
<context context-type="sourcefile">src/app/data/paperless-config.ts</context> <context context-type="sourcefile">src/app/data/paperless-config.ts</context>
<context context-type="linenumber">358</context> <context context-type="linenumber">366</context>
</context-group> </context-group>
<target state="needs-translation">LLM Embedding Endpoint</target> <target state="needs-translation">LLM Embedding Endpoint</target>
</trans-unit> </trans-unit>
@@ -13310,7 +13326,7 @@
<source>LLM Embedding Chunk Size</source> <source>LLM Embedding Chunk Size</source>
<context-group purpose="location"> <context-group purpose="location">
<context context-type="sourcefile">src/app/data/paperless-config.ts</context> <context context-type="sourcefile">src/app/data/paperless-config.ts</context>
<context context-type="linenumber">365</context> <context context-type="linenumber">373</context>
</context-group> </context-group>
<target state="needs-translation">LLM Embedding Chunk Size</target> <target state="needs-translation">LLM Embedding Chunk Size</target>
</trans-unit> </trans-unit>
@@ -13318,7 +13334,7 @@
<source>LLM Context Size</source> <source>LLM Context Size</source>
<context-group purpose="location"> <context-group purpose="location">
<context context-type="sourcefile">src/app/data/paperless-config.ts</context> <context context-type="sourcefile">src/app/data/paperless-config.ts</context>
<context context-type="linenumber">372</context> <context context-type="linenumber">380</context>
</context-group> </context-group>
<target state="needs-translation">LLM Context Size</target> <target state="needs-translation">LLM Context Size</target>
</trans-unit> </trans-unit>
@@ -13326,7 +13342,7 @@
<source>LLM Backend</source> <source>LLM Backend</source>
<context-group purpose="location"> <context-group purpose="location">
<context context-type="sourcefile">src/app/data/paperless-config.ts</context> <context context-type="sourcefile">src/app/data/paperless-config.ts</context>
<context context-type="linenumber">379</context> <context context-type="linenumber">387</context>
</context-group> </context-group>
<target state="needs-translation">LLM Backend</target> <target state="needs-translation">LLM Backend</target>
</trans-unit> </trans-unit>
@@ -13334,7 +13350,7 @@
<source>LLM Model</source> <source>LLM Model</source>
<context-group purpose="location"> <context-group purpose="location">
<context context-type="sourcefile">src/app/data/paperless-config.ts</context> <context context-type="sourcefile">src/app/data/paperless-config.ts</context>
<context context-type="linenumber">387</context> <context context-type="linenumber">395</context>
</context-group> </context-group>
<target state="needs-translation">LLM Model</target> <target state="needs-translation">LLM Model</target>
</trans-unit> </trans-unit>
@@ -13342,7 +13358,7 @@
<source>LLM API Key</source> <source>LLM API Key</source>
<context-group purpose="location"> <context-group purpose="location">
<context context-type="sourcefile">src/app/data/paperless-config.ts</context> <context context-type="sourcefile">src/app/data/paperless-config.ts</context>
<context context-type="linenumber">394</context> <context context-type="linenumber">402</context>
</context-group> </context-group>
<target state="needs-translation">LLM API Key</target> <target state="needs-translation">LLM API Key</target>
</trans-unit> </trans-unit>
@@ -13350,7 +13366,7 @@
<source>LLM Endpoint</source> <source>LLM Endpoint</source>
<context-group purpose="location"> <context-group purpose="location">
<context context-type="sourcefile">src/app/data/paperless-config.ts</context> <context context-type="sourcefile">src/app/data/paperless-config.ts</context>
<context context-type="linenumber">401</context> <context context-type="linenumber">409</context>
</context-group> </context-group>
<target state="needs-translation">LLM Endpoint</target> <target state="needs-translation">LLM Endpoint</target>
</trans-unit> </trans-unit>
@@ -13358,7 +13374,7 @@
<source>LLM Output Language</source> <source>LLM Output Language</source>
<context-group purpose="location"> <context-group purpose="location">
<context context-type="sourcefile">src/app/data/paperless-config.ts</context> <context context-type="sourcefile">src/app/data/paperless-config.ts</context>
<context context-type="linenumber">408</context> <context context-type="linenumber">416</context>
</context-group> </context-group>
<target state="needs-translation">LLM Output Language</target> <target state="needs-translation">LLM Output Language</target>
</trans-unit> </trans-unit>
@@ -13366,7 +13382,7 @@
<source>Language to use for generated AI suggestions. When unset, AI suggestions use the user&apos;s display language if explicitly set.</source> <source>Language to use for generated AI suggestions. When unset, AI suggestions use the user&apos;s display language if explicitly set.</source>
<context-group purpose="location"> <context-group purpose="location">
<context context-type="sourcefile">src/app/data/paperless-config.ts</context> <context context-type="sourcefile">src/app/data/paperless-config.ts</context>
<context context-type="linenumber">412</context> <context context-type="linenumber">420</context>
</context-group> </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="needs-translation">Language to use for generated AI suggestions. When unset, AI suggestions use the user's display language if explicitly set.</target>
</trans-unit> </trans-unit>
@@ -13374,7 +13390,7 @@
<source>LLM Request Timeout</source> <source>LLM Request Timeout</source>
<context-group purpose="location"> <context-group purpose="location">
<context context-type="sourcefile">src/app/data/paperless-config.ts</context> <context context-type="sourcefile">src/app/data/paperless-config.ts</context>
<context context-type="linenumber">416</context> <context context-type="linenumber">424</context>
</context-group> </context-group>
<target state="needs-translation">LLM Request Timeout</target> <target state="needs-translation">LLM Request Timeout</target>
</trans-unit> </trans-unit>
@@ -13382,7 +13398,7 @@
<source>Timeout in seconds for LLM requests.</source> <source>Timeout in seconds for LLM requests.</source>
<context-group purpose="location"> <context-group purpose="location">
<context context-type="sourcefile">src/app/data/paperless-config.ts</context> <context context-type="sourcefile">src/app/data/paperless-config.ts</context>
<context context-type="linenumber">420</context> <context context-type="linenumber">428</context>
</context-group> </context-group>
<target state="needs-translation">Timeout in seconds for LLM requests.</target> <target state="needs-translation">Timeout in seconds for LLM requests.</target>
</trans-unit> </trans-unit>
+37 -21
View File
@@ -10741,7 +10741,7 @@
</context-group> </context-group>
<context-group purpose="location"> <context-group purpose="location">
<context context-type="sourcefile">src/app/components/document-list/document-list.component.ts</context> <context context-type="sourcefile">src/app/components/document-list/document-list.component.ts</context>
<context context-type="linenumber">348</context> <context context-type="linenumber">351</context>
</context-group> </context-group>
<context-group purpose="location"> <context-group purpose="location">
<context context-type="sourcefile">src/app/components/manage/document-attributes/document-attributes.component.html</context> <context context-type="sourcefile">src/app/components/manage/document-attributes/document-attributes.component.html</context>
@@ -10757,7 +10757,7 @@
</context-group> </context-group>
<context-group purpose="location"> <context-group purpose="location">
<context context-type="sourcefile">src/app/components/document-list/document-list.component.ts</context> <context context-type="sourcefile">src/app/components/document-list/document-list.component.ts</context>
<context context-type="linenumber">341</context> <context context-type="linenumber">344</context>
</context-group> </context-group>
<context-group purpose="location"> <context-group purpose="location">
<context context-type="sourcefile">src/app/components/manage/document-attributes/document-attributes.component.html</context> <context context-type="sourcefile">src/app/components/manage/document-attributes/document-attributes.component.html</context>
@@ -11041,7 +11041,7 @@
<source>Reset filters / selection</source> <source>Reset filters / selection</source>
<context-group purpose="location"> <context-group purpose="location">
<context context-type="sourcefile">src/app/components/document-list/document-list.component.ts</context> <context context-type="sourcefile">src/app/components/document-list/document-list.component.ts</context>
<context context-type="linenumber">329</context> <context context-type="linenumber">332</context>
</context-group> </context-group>
<target state="needs-translation">Reset filters / selection</target> <target state="needs-translation">Reset filters / selection</target>
</trans-unit> </trans-unit>
@@ -11049,7 +11049,7 @@
<source>Open first [selected] document</source> <source>Open first [selected] document</source>
<context-group purpose="location"> <context-group purpose="location">
<context context-type="sourcefile">src/app/components/document-list/document-list.component.ts</context> <context context-type="sourcefile">src/app/components/document-list/document-list.component.ts</context>
<context context-type="linenumber">357</context> <context context-type="linenumber">360</context>
</context-group> </context-group>
<target state="needs-translation">Open first [selected] document</target> <target state="needs-translation">Open first [selected] document</target>
</trans-unit> </trans-unit>
@@ -11057,7 +11057,7 @@
<source>Previous page</source> <source>Previous page</source>
<context-group purpose="location"> <context-group purpose="location">
<context context-type="sourcefile">src/app/components/document-list/document-list.component.ts</context> <context context-type="sourcefile">src/app/components/document-list/document-list.component.ts</context>
<context context-type="linenumber">373</context> <context context-type="linenumber">376</context>
</context-group> </context-group>
<target state="needs-translation">Previous page</target> <target state="needs-translation">Previous page</target>
</trans-unit> </trans-unit>
@@ -11065,7 +11065,7 @@
<source>Next page</source> <source>Next page</source>
<context-group purpose="location"> <context-group purpose="location">
<context context-type="sourcefile">src/app/components/document-list/document-list.component.ts</context> <context context-type="sourcefile">src/app/components/document-list/document-list.component.ts</context>
<context context-type="linenumber">385</context> <context context-type="linenumber">388</context>
</context-group> </context-group>
<target state="needs-translation">Next page</target> <target state="needs-translation">Next page</target>
</trans-unit> </trans-unit>
@@ -11073,7 +11073,7 @@
<source>View &quot;<x id="PH" equiv-text="this.list.activeSavedViewTitle"/>&quot; saved successfully.</source> <source>View &quot;<x id="PH" equiv-text="this.list.activeSavedViewTitle"/>&quot; saved successfully.</source>
<context-group purpose="location"> <context-group purpose="location">
<context context-type="sourcefile">src/app/components/document-list/document-list.component.ts</context> <context context-type="sourcefile">src/app/components/document-list/document-list.component.ts</context>
<context context-type="linenumber">419</context> <context context-type="linenumber">422</context>
</context-group> </context-group>
<target state="translated">Прагляд "<x id="PH" equiv-text="this.list.activeSavedViewTitle"/>" паспяхова захаваны.</target> <target state="translated">Прагляд "<x id="PH" equiv-text="this.list.activeSavedViewTitle"/>" паспяхова захаваны.</target>
</trans-unit> </trans-unit>
@@ -11081,7 +11081,7 @@
<source>Failed to save view &quot;<x id="PH" equiv-text="this.list.activeSavedViewTitle"/>&quot;.</source> <source>Failed to save view &quot;<x id="PH" equiv-text="this.list.activeSavedViewTitle"/>&quot;.</source>
<context-group purpose="location"> <context-group purpose="location">
<context context-type="sourcefile">src/app/components/document-list/document-list.component.ts</context> <context context-type="sourcefile">src/app/components/document-list/document-list.component.ts</context>
<context context-type="linenumber">425</context> <context context-type="linenumber">428</context>
</context-group> </context-group>
<target state="needs-translation">Failed to save view "<x id="PH" equiv-text="this.list.activeSavedViewTitle"/>".</target> <target state="needs-translation">Failed to save view "<x id="PH" equiv-text="this.list.activeSavedViewTitle"/>".</target>
</trans-unit> </trans-unit>
@@ -11089,7 +11089,7 @@
<source>View &quot;<x id="PH" equiv-text="savedView.name"/>&quot; created successfully.</source> <source>View &quot;<x id="PH" equiv-text="savedView.name"/>&quot; created successfully.</source>
<context-group purpose="location"> <context-group purpose="location">
<context context-type="sourcefile">src/app/components/document-list/document-list.component.ts</context> <context context-type="sourcefile">src/app/components/document-list/document-list.component.ts</context>
<context context-type="linenumber">494</context> <context context-type="linenumber">497</context>
</context-group> </context-group>
<target state="translated">Прагляд "<x id="PH" equiv-text="savedView.name"/>" створаны паспяхова.</target> <target state="translated">Прагляд "<x id="PH" equiv-text="savedView.name"/>" створаны паспяхова.</target>
</trans-unit> </trans-unit>
@@ -11097,7 +11097,7 @@
<source>View &quot;<x id="PH" equiv-text="savedView.name"/>&quot; created successfully, but could not update visibility settings.</source> <source>View &quot;<x id="PH" equiv-text="savedView.name"/>&quot; created successfully, but could not update visibility settings.</source>
<context-group purpose="location"> <context-group purpose="location">
<context context-type="sourcefile">src/app/components/document-list/document-list.component.ts</context> <context context-type="sourcefile">src/app/components/document-list/document-list.component.ts</context>
<context context-type="linenumber">500</context> <context context-type="linenumber">503</context>
</context-group> </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="needs-translation">View "<x id="PH" equiv-text="savedView.name"/>" created successfully, but could not update visibility settings.</target>
</trans-unit> </trans-unit>
@@ -13298,11 +13298,27 @@
</context-group> </context-group>
<target state="needs-translation">LLM Embedding Model</target> <target state="needs-translation">LLM Embedding Model</target>
</trans-unit> </trans-unit>
<trans-unit id="861068592166833023" datatype="html">
<source>LLM Embedding API Key</source>
<context-group purpose="location">
<context context-type="sourcefile">src/app/data/paperless-config.ts</context>
<context context-type="linenumber">358</context>
</context-group>
<target state="needs-translation">LLM Embedding API Key</target>
</trans-unit>
<trans-unit id="2929108042259892948" datatype="html">
<source>Used for embeddings when set, otherwise LLM API key is used.</source>
<context-group purpose="location">
<context context-type="sourcefile">src/app/data/paperless-config.ts</context>
<context context-type="linenumber">360</context>
</context-group>
<target state="needs-translation">Used for embeddings when set, otherwise LLM API key is used.</target>
</trans-unit>
<trans-unit id="3554114880473286122" datatype="html"> <trans-unit id="3554114880473286122" datatype="html">
<source>LLM Embedding Endpoint</source> <source>LLM Embedding Endpoint</source>
<context-group purpose="location"> <context-group purpose="location">
<context context-type="sourcefile">src/app/data/paperless-config.ts</context> <context context-type="sourcefile">src/app/data/paperless-config.ts</context>
<context context-type="linenumber">358</context> <context context-type="linenumber">366</context>
</context-group> </context-group>
<target state="needs-translation">LLM Embedding Endpoint</target> <target state="needs-translation">LLM Embedding Endpoint</target>
</trans-unit> </trans-unit>
@@ -13310,7 +13326,7 @@
<source>LLM Embedding Chunk Size</source> <source>LLM Embedding Chunk Size</source>
<context-group purpose="location"> <context-group purpose="location">
<context context-type="sourcefile">src/app/data/paperless-config.ts</context> <context context-type="sourcefile">src/app/data/paperless-config.ts</context>
<context context-type="linenumber">365</context> <context context-type="linenumber">373</context>
</context-group> </context-group>
<target state="needs-translation">LLM Embedding Chunk Size</target> <target state="needs-translation">LLM Embedding Chunk Size</target>
</trans-unit> </trans-unit>
@@ -13318,7 +13334,7 @@
<source>LLM Context Size</source> <source>LLM Context Size</source>
<context-group purpose="location"> <context-group purpose="location">
<context context-type="sourcefile">src/app/data/paperless-config.ts</context> <context context-type="sourcefile">src/app/data/paperless-config.ts</context>
<context context-type="linenumber">372</context> <context context-type="linenumber">380</context>
</context-group> </context-group>
<target state="needs-translation">LLM Context Size</target> <target state="needs-translation">LLM Context Size</target>
</trans-unit> </trans-unit>
@@ -13326,7 +13342,7 @@
<source>LLM Backend</source> <source>LLM Backend</source>
<context-group purpose="location"> <context-group purpose="location">
<context context-type="sourcefile">src/app/data/paperless-config.ts</context> <context context-type="sourcefile">src/app/data/paperless-config.ts</context>
<context context-type="linenumber">379</context> <context context-type="linenumber">387</context>
</context-group> </context-group>
<target state="needs-translation">LLM Backend</target> <target state="needs-translation">LLM Backend</target>
</trans-unit> </trans-unit>
@@ -13334,7 +13350,7 @@
<source>LLM Model</source> <source>LLM Model</source>
<context-group purpose="location"> <context-group purpose="location">
<context context-type="sourcefile">src/app/data/paperless-config.ts</context> <context context-type="sourcefile">src/app/data/paperless-config.ts</context>
<context context-type="linenumber">387</context> <context context-type="linenumber">395</context>
</context-group> </context-group>
<target state="needs-translation">LLM Model</target> <target state="needs-translation">LLM Model</target>
</trans-unit> </trans-unit>
@@ -13342,7 +13358,7 @@
<source>LLM API Key</source> <source>LLM API Key</source>
<context-group purpose="location"> <context-group purpose="location">
<context context-type="sourcefile">src/app/data/paperless-config.ts</context> <context context-type="sourcefile">src/app/data/paperless-config.ts</context>
<context context-type="linenumber">394</context> <context context-type="linenumber">402</context>
</context-group> </context-group>
<target state="needs-translation">LLM API Key</target> <target state="needs-translation">LLM API Key</target>
</trans-unit> </trans-unit>
@@ -13350,7 +13366,7 @@
<source>LLM Endpoint</source> <source>LLM Endpoint</source>
<context-group purpose="location"> <context-group purpose="location">
<context context-type="sourcefile">src/app/data/paperless-config.ts</context> <context context-type="sourcefile">src/app/data/paperless-config.ts</context>
<context context-type="linenumber">401</context> <context context-type="linenumber">409</context>
</context-group> </context-group>
<target state="needs-translation">LLM Endpoint</target> <target state="needs-translation">LLM Endpoint</target>
</trans-unit> </trans-unit>
@@ -13358,7 +13374,7 @@
<source>LLM Output Language</source> <source>LLM Output Language</source>
<context-group purpose="location"> <context-group purpose="location">
<context context-type="sourcefile">src/app/data/paperless-config.ts</context> <context context-type="sourcefile">src/app/data/paperless-config.ts</context>
<context context-type="linenumber">408</context> <context context-type="linenumber">416</context>
</context-group> </context-group>
<target state="needs-translation">LLM Output Language</target> <target state="needs-translation">LLM Output Language</target>
</trans-unit> </trans-unit>
@@ -13366,7 +13382,7 @@
<source>Language to use for generated AI suggestions. When unset, AI suggestions use the user&apos;s display language if explicitly set.</source> <source>Language to use for generated AI suggestions. When unset, AI suggestions use the user&apos;s display language if explicitly set.</source>
<context-group purpose="location"> <context-group purpose="location">
<context context-type="sourcefile">src/app/data/paperless-config.ts</context> <context context-type="sourcefile">src/app/data/paperless-config.ts</context>
<context context-type="linenumber">412</context> <context context-type="linenumber">420</context>
</context-group> </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="needs-translation">Language to use for generated AI suggestions. When unset, AI suggestions use the user's display language if explicitly set.</target>
</trans-unit> </trans-unit>
@@ -13374,7 +13390,7 @@
<source>LLM Request Timeout</source> <source>LLM Request Timeout</source>
<context-group purpose="location"> <context-group purpose="location">
<context context-type="sourcefile">src/app/data/paperless-config.ts</context> <context context-type="sourcefile">src/app/data/paperless-config.ts</context>
<context context-type="linenumber">416</context> <context context-type="linenumber">424</context>
</context-group> </context-group>
<target state="needs-translation">LLM Request Timeout</target> <target state="needs-translation">LLM Request Timeout</target>
</trans-unit> </trans-unit>
@@ -13382,7 +13398,7 @@
<source>Timeout in seconds for LLM requests.</source> <source>Timeout in seconds for LLM requests.</source>
<context-group purpose="location"> <context-group purpose="location">
<context context-type="sourcefile">src/app/data/paperless-config.ts</context> <context context-type="sourcefile">src/app/data/paperless-config.ts</context>
<context context-type="linenumber">420</context> <context context-type="linenumber">428</context>
</context-group> </context-group>
<target state="needs-translation">Timeout in seconds for LLM requests.</target> <target state="needs-translation">Timeout in seconds for LLM requests.</target>
</trans-unit> </trans-unit>
+37 -21
View File
@@ -10741,7 +10741,7 @@
</context-group> </context-group>
<context-group purpose="location"> <context-group purpose="location">
<context context-type="sourcefile">src/app/components/document-list/document-list.component.ts</context> <context context-type="sourcefile">src/app/components/document-list/document-list.component.ts</context>
<context context-type="linenumber">348</context> <context context-type="linenumber">351</context>
</context-group> </context-group>
<context-group purpose="location"> <context-group purpose="location">
<context context-type="sourcefile">src/app/components/manage/document-attributes/document-attributes.component.html</context> <context context-type="sourcefile">src/app/components/manage/document-attributes/document-attributes.component.html</context>
@@ -10757,7 +10757,7 @@
</context-group> </context-group>
<context-group purpose="location"> <context-group purpose="location">
<context context-type="sourcefile">src/app/components/document-list/document-list.component.ts</context> <context context-type="sourcefile">src/app/components/document-list/document-list.component.ts</context>
<context context-type="linenumber">341</context> <context context-type="linenumber">344</context>
</context-group> </context-group>
<context-group purpose="location"> <context-group purpose="location">
<context context-type="sourcefile">src/app/components/manage/document-attributes/document-attributes.component.html</context> <context context-type="sourcefile">src/app/components/manage/document-attributes/document-attributes.component.html</context>
@@ -11041,7 +11041,7 @@
<source>Reset filters / selection</source> <source>Reset filters / selection</source>
<context-group purpose="location"> <context-group purpose="location">
<context context-type="sourcefile">src/app/components/document-list/document-list.component.ts</context> <context context-type="sourcefile">src/app/components/document-list/document-list.component.ts</context>
<context context-type="linenumber">329</context> <context context-type="linenumber">332</context>
</context-group> </context-group>
<target state="translated">Нулиране на филтри/селекция</target> <target state="translated">Нулиране на филтри/селекция</target>
</trans-unit> </trans-unit>
@@ -11049,7 +11049,7 @@
<source>Open first [selected] document</source> <source>Open first [selected] document</source>
<context-group purpose="location"> <context-group purpose="location">
<context context-type="sourcefile">src/app/components/document-list/document-list.component.ts</context> <context context-type="sourcefile">src/app/components/document-list/document-list.component.ts</context>
<context context-type="linenumber">357</context> <context context-type="linenumber">360</context>
</context-group> </context-group>
<target state="translated">Отворете първия [selected] документ</target> <target state="translated">Отворете първия [selected] документ</target>
</trans-unit> </trans-unit>
@@ -11057,7 +11057,7 @@
<source>Previous page</source> <source>Previous page</source>
<context-group purpose="location"> <context-group purpose="location">
<context context-type="sourcefile">src/app/components/document-list/document-list.component.ts</context> <context context-type="sourcefile">src/app/components/document-list/document-list.component.ts</context>
<context context-type="linenumber">373</context> <context context-type="linenumber">376</context>
</context-group> </context-group>
<target state="translated">Предишна страница</target> <target state="translated">Предишна страница</target>
</trans-unit> </trans-unit>
@@ -11065,7 +11065,7 @@
<source>Next page</source> <source>Next page</source>
<context-group purpose="location"> <context-group purpose="location">
<context context-type="sourcefile">src/app/components/document-list/document-list.component.ts</context> <context context-type="sourcefile">src/app/components/document-list/document-list.component.ts</context>
<context context-type="linenumber">385</context> <context context-type="linenumber">388</context>
</context-group> </context-group>
<target state="translated">Следваща страница</target> <target state="translated">Следваща страница</target>
</trans-unit> </trans-unit>
@@ -11073,7 +11073,7 @@
<source>View &quot;<x id="PH" equiv-text="this.list.activeSavedViewTitle"/>&quot; saved successfully.</source> <source>View &quot;<x id="PH" equiv-text="this.list.activeSavedViewTitle"/>&quot; saved successfully.</source>
<context-group purpose="location"> <context-group purpose="location">
<context context-type="sourcefile">src/app/components/document-list/document-list.component.ts</context> <context context-type="sourcefile">src/app/components/document-list/document-list.component.ts</context>
<context context-type="linenumber">419</context> <context context-type="linenumber">422</context>
</context-group> </context-group>
<target state="translated">Изглед "<x id="PH" equiv-text="this.list.activeSavedViewTitle"/>" записан успешно.</target> <target state="translated">Изглед "<x id="PH" equiv-text="this.list.activeSavedViewTitle"/>" записан успешно.</target>
</trans-unit> </trans-unit>
@@ -11081,7 +11081,7 @@
<source>Failed to save view &quot;<x id="PH" equiv-text="this.list.activeSavedViewTitle"/>&quot;.</source> <source>Failed to save view &quot;<x id="PH" equiv-text="this.list.activeSavedViewTitle"/>&quot;.</source>
<context-group purpose="location"> <context-group purpose="location">
<context context-type="sourcefile">src/app/components/document-list/document-list.component.ts</context> <context context-type="sourcefile">src/app/components/document-list/document-list.component.ts</context>
<context context-type="linenumber">425</context> <context context-type="linenumber">428</context>
</context-group> </context-group>
<target state="translated">Неуспешно запазване на изгледа "<x id="PH" equiv-text="this.list.activeSavedViewTitle"/>".</target> <target state="translated">Неуспешно запазване на изгледа "<x id="PH" equiv-text="this.list.activeSavedViewTitle"/>".</target>
</trans-unit> </trans-unit>
@@ -11089,7 +11089,7 @@
<source>View &quot;<x id="PH" equiv-text="savedView.name"/>&quot; created successfully.</source> <source>View &quot;<x id="PH" equiv-text="savedView.name"/>&quot; created successfully.</source>
<context-group purpose="location"> <context-group purpose="location">
<context context-type="sourcefile">src/app/components/document-list/document-list.component.ts</context> <context context-type="sourcefile">src/app/components/document-list/document-list.component.ts</context>
<context context-type="linenumber">494</context> <context context-type="linenumber">497</context>
</context-group> </context-group>
<target state="translated">Изглед "<x id="PH" equiv-text="savedView.name"/>" създаден успешно.</target> <target state="translated">Изглед "<x id="PH" equiv-text="savedView.name"/>" създаден успешно.</target>
</trans-unit> </trans-unit>
@@ -11097,7 +11097,7 @@
<source>View &quot;<x id="PH" equiv-text="savedView.name"/>&quot; created successfully, but could not update visibility settings.</source> <source>View &quot;<x id="PH" equiv-text="savedView.name"/>&quot; created successfully, but could not update visibility settings.</source>
<context-group purpose="location"> <context-group purpose="location">
<context context-type="sourcefile">src/app/components/document-list/document-list.component.ts</context> <context context-type="sourcefile">src/app/components/document-list/document-list.component.ts</context>
<context context-type="linenumber">500</context> <context context-type="linenumber">503</context>
</context-group> </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="needs-translation">View "<x id="PH" equiv-text="savedView.name"/>" created successfully, but could not update visibility settings.</target>
</trans-unit> </trans-unit>
@@ -13298,11 +13298,27 @@
</context-group> </context-group>
<target state="needs-translation">LLM Embedding Model</target> <target state="needs-translation">LLM Embedding Model</target>
</trans-unit> </trans-unit>
<trans-unit id="861068592166833023" datatype="html">
<source>LLM Embedding API Key</source>
<context-group purpose="location">
<context context-type="sourcefile">src/app/data/paperless-config.ts</context>
<context context-type="linenumber">358</context>
</context-group>
<target state="needs-translation">LLM Embedding API Key</target>
</trans-unit>
<trans-unit id="2929108042259892948" datatype="html">
<source>Used for embeddings when set, otherwise LLM API key is used.</source>
<context-group purpose="location">
<context context-type="sourcefile">src/app/data/paperless-config.ts</context>
<context context-type="linenumber">360</context>
</context-group>
<target state="needs-translation">Used for embeddings when set, otherwise LLM API key is used.</target>
</trans-unit>
<trans-unit id="3554114880473286122" datatype="html"> <trans-unit id="3554114880473286122" datatype="html">
<source>LLM Embedding Endpoint</source> <source>LLM Embedding Endpoint</source>
<context-group purpose="location"> <context-group purpose="location">
<context context-type="sourcefile">src/app/data/paperless-config.ts</context> <context context-type="sourcefile">src/app/data/paperless-config.ts</context>
<context context-type="linenumber">358</context> <context context-type="linenumber">366</context>
</context-group> </context-group>
<target state="needs-translation">LLM Embedding Endpoint</target> <target state="needs-translation">LLM Embedding Endpoint</target>
</trans-unit> </trans-unit>
@@ -13310,7 +13326,7 @@
<source>LLM Embedding Chunk Size</source> <source>LLM Embedding Chunk Size</source>
<context-group purpose="location"> <context-group purpose="location">
<context context-type="sourcefile">src/app/data/paperless-config.ts</context> <context context-type="sourcefile">src/app/data/paperless-config.ts</context>
<context context-type="linenumber">365</context> <context context-type="linenumber">373</context>
</context-group> </context-group>
<target state="needs-translation">LLM Embedding Chunk Size</target> <target state="needs-translation">LLM Embedding Chunk Size</target>
</trans-unit> </trans-unit>
@@ -13318,7 +13334,7 @@
<source>LLM Context Size</source> <source>LLM Context Size</source>
<context-group purpose="location"> <context-group purpose="location">
<context context-type="sourcefile">src/app/data/paperless-config.ts</context> <context context-type="sourcefile">src/app/data/paperless-config.ts</context>
<context context-type="linenumber">372</context> <context context-type="linenumber">380</context>
</context-group> </context-group>
<target state="needs-translation">LLM Context Size</target> <target state="needs-translation">LLM Context Size</target>
</trans-unit> </trans-unit>
@@ -13326,7 +13342,7 @@
<source>LLM Backend</source> <source>LLM Backend</source>
<context-group purpose="location"> <context-group purpose="location">
<context context-type="sourcefile">src/app/data/paperless-config.ts</context> <context context-type="sourcefile">src/app/data/paperless-config.ts</context>
<context context-type="linenumber">379</context> <context context-type="linenumber">387</context>
</context-group> </context-group>
<target state="needs-translation">LLM Backend</target> <target state="needs-translation">LLM Backend</target>
</trans-unit> </trans-unit>
@@ -13334,7 +13350,7 @@
<source>LLM Model</source> <source>LLM Model</source>
<context-group purpose="location"> <context-group purpose="location">
<context context-type="sourcefile">src/app/data/paperless-config.ts</context> <context context-type="sourcefile">src/app/data/paperless-config.ts</context>
<context context-type="linenumber">387</context> <context context-type="linenumber">395</context>
</context-group> </context-group>
<target state="needs-translation">LLM Model</target> <target state="needs-translation">LLM Model</target>
</trans-unit> </trans-unit>
@@ -13342,7 +13358,7 @@
<source>LLM API Key</source> <source>LLM API Key</source>
<context-group purpose="location"> <context-group purpose="location">
<context context-type="sourcefile">src/app/data/paperless-config.ts</context> <context context-type="sourcefile">src/app/data/paperless-config.ts</context>
<context context-type="linenumber">394</context> <context context-type="linenumber">402</context>
</context-group> </context-group>
<target state="needs-translation">LLM API Key</target> <target state="needs-translation">LLM API Key</target>
</trans-unit> </trans-unit>
@@ -13350,7 +13366,7 @@
<source>LLM Endpoint</source> <source>LLM Endpoint</source>
<context-group purpose="location"> <context-group purpose="location">
<context context-type="sourcefile">src/app/data/paperless-config.ts</context> <context context-type="sourcefile">src/app/data/paperless-config.ts</context>
<context context-type="linenumber">401</context> <context context-type="linenumber">409</context>
</context-group> </context-group>
<target state="needs-translation">LLM Endpoint</target> <target state="needs-translation">LLM Endpoint</target>
</trans-unit> </trans-unit>
@@ -13358,7 +13374,7 @@
<source>LLM Output Language</source> <source>LLM Output Language</source>
<context-group purpose="location"> <context-group purpose="location">
<context context-type="sourcefile">src/app/data/paperless-config.ts</context> <context context-type="sourcefile">src/app/data/paperless-config.ts</context>
<context context-type="linenumber">408</context> <context context-type="linenumber">416</context>
</context-group> </context-group>
<target state="needs-translation">LLM Output Language</target> <target state="needs-translation">LLM Output Language</target>
</trans-unit> </trans-unit>
@@ -13366,7 +13382,7 @@
<source>Language to use for generated AI suggestions. When unset, AI suggestions use the user&apos;s display language if explicitly set.</source> <source>Language to use for generated AI suggestions. When unset, AI suggestions use the user&apos;s display language if explicitly set.</source>
<context-group purpose="location"> <context-group purpose="location">
<context context-type="sourcefile">src/app/data/paperless-config.ts</context> <context context-type="sourcefile">src/app/data/paperless-config.ts</context>
<context context-type="linenumber">412</context> <context context-type="linenumber">420</context>
</context-group> </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="needs-translation">Language to use for generated AI suggestions. When unset, AI suggestions use the user's display language if explicitly set.</target>
</trans-unit> </trans-unit>
@@ -13374,7 +13390,7 @@
<source>LLM Request Timeout</source> <source>LLM Request Timeout</source>
<context-group purpose="location"> <context-group purpose="location">
<context context-type="sourcefile">src/app/data/paperless-config.ts</context> <context context-type="sourcefile">src/app/data/paperless-config.ts</context>
<context context-type="linenumber">416</context> <context context-type="linenumber">424</context>
</context-group> </context-group>
<target state="needs-translation">LLM Request Timeout</target> <target state="needs-translation">LLM Request Timeout</target>
</trans-unit> </trans-unit>
@@ -13382,7 +13398,7 @@
<source>Timeout in seconds for LLM requests.</source> <source>Timeout in seconds for LLM requests.</source>
<context-group purpose="location"> <context-group purpose="location">
<context context-type="sourcefile">src/app/data/paperless-config.ts</context> <context context-type="sourcefile">src/app/data/paperless-config.ts</context>
<context context-type="linenumber">420</context> <context context-type="linenumber">428</context>
</context-group> </context-group>
<target state="needs-translation">Timeout in seconds for LLM requests.</target> <target state="needs-translation">Timeout in seconds for LLM requests.</target>
</trans-unit> </trans-unit>
+37 -21
View File
@@ -10741,7 +10741,7 @@
</context-group> </context-group>
<context-group purpose="location"> <context-group purpose="location">
<context context-type="sourcefile">src/app/components/document-list/document-list.component.ts</context> <context context-type="sourcefile">src/app/components/document-list/document-list.component.ts</context>
<context context-type="linenumber">348</context> <context context-type="linenumber">351</context>
</context-group> </context-group>
<context-group purpose="location"> <context-group purpose="location">
<context context-type="sourcefile">src/app/components/manage/document-attributes/document-attributes.component.html</context> <context context-type="sourcefile">src/app/components/manage/document-attributes/document-attributes.component.html</context>
@@ -10757,7 +10757,7 @@
</context-group> </context-group>
<context-group purpose="location"> <context-group purpose="location">
<context context-type="sourcefile">src/app/components/document-list/document-list.component.ts</context> <context context-type="sourcefile">src/app/components/document-list/document-list.component.ts</context>
<context context-type="linenumber">341</context> <context context-type="linenumber">344</context>
</context-group> </context-group>
<context-group purpose="location"> <context-group purpose="location">
<context context-type="sourcefile">src/app/components/manage/document-attributes/document-attributes.component.html</context> <context context-type="sourcefile">src/app/components/manage/document-attributes/document-attributes.component.html</context>
@@ -11041,7 +11041,7 @@
<source>Reset filters / selection</source> <source>Reset filters / selection</source>
<context-group purpose="location"> <context-group purpose="location">
<context context-type="sourcefile">src/app/components/document-list/document-list.component.ts</context> <context context-type="sourcefile">src/app/components/document-list/document-list.component.ts</context>
<context context-type="linenumber">329</context> <context context-type="linenumber">332</context>
</context-group> </context-group>
<target state="translated">Reseteja filtres / selecció</target> <target state="translated">Reseteja filtres / selecció</target>
</trans-unit> </trans-unit>
@@ -11049,7 +11049,7 @@
<source>Open first [selected] document</source> <source>Open first [selected] document</source>
<context-group purpose="location"> <context-group purpose="location">
<context context-type="sourcefile">src/app/components/document-list/document-list.component.ts</context> <context context-type="sourcefile">src/app/components/document-list/document-list.component.ts</context>
<context context-type="linenumber">357</context> <context context-type="linenumber">360</context>
</context-group> </context-group>
<target state="translated">Obrer el primer [seleccionat] document</target> <target state="translated">Obrer el primer [seleccionat] document</target>
</trans-unit> </trans-unit>
@@ -11057,7 +11057,7 @@
<source>Previous page</source> <source>Previous page</source>
<context-group purpose="location"> <context-group purpose="location">
<context context-type="sourcefile">src/app/components/document-list/document-list.component.ts</context> <context context-type="sourcefile">src/app/components/document-list/document-list.component.ts</context>
<context context-type="linenumber">373</context> <context context-type="linenumber">376</context>
</context-group> </context-group>
<target state="translated">Pàgina anterior</target> <target state="translated">Pàgina anterior</target>
</trans-unit> </trans-unit>
@@ -11065,7 +11065,7 @@
<source>Next page</source> <source>Next page</source>
<context-group purpose="location"> <context-group purpose="location">
<context context-type="sourcefile">src/app/components/document-list/document-list.component.ts</context> <context context-type="sourcefile">src/app/components/document-list/document-list.component.ts</context>
<context context-type="linenumber">385</context> <context context-type="linenumber">388</context>
</context-group> </context-group>
<target state="translated">Pàgina següent</target> <target state="translated">Pàgina següent</target>
</trans-unit> </trans-unit>
@@ -11073,7 +11073,7 @@
<source>View &quot;<x id="PH" equiv-text="this.list.activeSavedViewTitle"/>&quot; saved successfully.</source> <source>View &quot;<x id="PH" equiv-text="this.list.activeSavedViewTitle"/>&quot; saved successfully.</source>
<context-group purpose="location"> <context-group purpose="location">
<context context-type="sourcefile">src/app/components/document-list/document-list.component.ts</context> <context context-type="sourcefile">src/app/components/document-list/document-list.component.ts</context>
<context context-type="linenumber">419</context> <context context-type="linenumber">422</context>
</context-group> </context-group>
<target state="translated">Vista "<x id="PH" equiv-text="this.list.activeSavedViewTitle"/>" desada correctament.</target> <target state="translated">Vista "<x id="PH" equiv-text="this.list.activeSavedViewTitle"/>" desada correctament.</target>
</trans-unit> </trans-unit>
@@ -11081,7 +11081,7 @@
<source>Failed to save view &quot;<x id="PH" equiv-text="this.list.activeSavedViewTitle"/>&quot;.</source> <source>Failed to save view &quot;<x id="PH" equiv-text="this.list.activeSavedViewTitle"/>&quot;.</source>
<context-group purpose="location"> <context-group purpose="location">
<context context-type="sourcefile">src/app/components/document-list/document-list.component.ts</context> <context context-type="sourcefile">src/app/components/document-list/document-list.component.ts</context>
<context context-type="linenumber">425</context> <context context-type="linenumber">428</context>
</context-group> </context-group>
<target state="translated">Error desant vista "<x id="PH" equiv-text="this.list.activeSavedViewTitle"/>".</target> <target state="translated">Error desant vista "<x id="PH" equiv-text="this.list.activeSavedViewTitle"/>".</target>
</trans-unit> </trans-unit>
@@ -11089,7 +11089,7 @@
<source>View &quot;<x id="PH" equiv-text="savedView.name"/>&quot; created successfully.</source> <source>View &quot;<x id="PH" equiv-text="savedView.name"/>&quot; created successfully.</source>
<context-group purpose="location"> <context-group purpose="location">
<context context-type="sourcefile">src/app/components/document-list/document-list.component.ts</context> <context context-type="sourcefile">src/app/components/document-list/document-list.component.ts</context>
<context context-type="linenumber">494</context> <context context-type="linenumber">497</context>
</context-group> </context-group>
<target state="translated">Vista "<x id="PH" equiv-text="savedView.name"/>" creada correctament.</target> <target state="translated">Vista "<x id="PH" equiv-text="savedView.name"/>" creada correctament.</target>
</trans-unit> </trans-unit>
@@ -11097,7 +11097,7 @@
<source>View &quot;<x id="PH" equiv-text="savedView.name"/>&quot; created successfully, but could not update visibility settings.</source> <source>View &quot;<x id="PH" equiv-text="savedView.name"/>&quot; created successfully, but could not update visibility settings.</source>
<context-group purpose="location"> <context-group purpose="location">
<context context-type="sourcefile">src/app/components/document-list/document-list.component.ts</context> <context context-type="sourcefile">src/app/components/document-list/document-list.component.ts</context>
<context context-type="linenumber">500</context> <context context-type="linenumber">503</context>
</context-group> </context-group>
<target state="translated">Vista "<x id="PH" equiv-text="savedView.name"/>" creada correctament, però no s'ha pogut actualitzar la configuració de visibilitat.</target> <target state="translated">Vista "<x id="PH" equiv-text="savedView.name"/>" creada correctament, però no s'ha pogut actualitzar la configuració de visibilitat.</target>
</trans-unit> </trans-unit>
@@ -13298,11 +13298,27 @@
</context-group> </context-group>
<target state="translated">Model d'incrustació LLM</target> <target state="translated">Model d'incrustació LLM</target>
</trans-unit> </trans-unit>
<trans-unit id="861068592166833023" datatype="html">
<source>LLM Embedding API Key</source>
<context-group purpose="location">
<context context-type="sourcefile">src/app/data/paperless-config.ts</context>
<context context-type="linenumber">358</context>
</context-group>
<target state="needs-translation">LLM Embedding API Key</target>
</trans-unit>
<trans-unit id="2929108042259892948" datatype="html">
<source>Used for embeddings when set, otherwise LLM API key is used.</source>
<context-group purpose="location">
<context context-type="sourcefile">src/app/data/paperless-config.ts</context>
<context context-type="linenumber">360</context>
</context-group>
<target state="needs-translation">Used for embeddings when set, otherwise LLM API key is used.</target>
</trans-unit>
<trans-unit id="3554114880473286122" datatype="html"> <trans-unit id="3554114880473286122" datatype="html">
<source>LLM Embedding Endpoint</source> <source>LLM Embedding Endpoint</source>
<context-group purpose="location"> <context-group purpose="location">
<context context-type="sourcefile">src/app/data/paperless-config.ts</context> <context context-type="sourcefile">src/app/data/paperless-config.ts</context>
<context context-type="linenumber">358</context> <context context-type="linenumber">366</context>
</context-group> </context-group>
<target state="translated">Punt final d'incrustació de LLM</target> <target state="translated">Punt final d'incrustació de LLM</target>
</trans-unit> </trans-unit>
@@ -13310,7 +13326,7 @@
<source>LLM Embedding Chunk Size</source> <source>LLM Embedding Chunk Size</source>
<context-group purpose="location"> <context-group purpose="location">
<context context-type="sourcefile">src/app/data/paperless-config.ts</context> <context context-type="sourcefile">src/app/data/paperless-config.ts</context>
<context context-type="linenumber">365</context> <context context-type="linenumber">373</context>
</context-group> </context-group>
<target state="translated">Mida del fragment d'incrustació de LLM</target> <target state="translated">Mida del fragment d'incrustació de LLM</target>
</trans-unit> </trans-unit>
@@ -13318,7 +13334,7 @@
<source>LLM Context Size</source> <source>LLM Context Size</source>
<context-group purpose="location"> <context-group purpose="location">
<context context-type="sourcefile">src/app/data/paperless-config.ts</context> <context context-type="sourcefile">src/app/data/paperless-config.ts</context>
<context context-type="linenumber">372</context> <context context-type="linenumber">380</context>
</context-group> </context-group>
<target state="translated">Mida del context de LLM</target> <target state="translated">Mida del context de LLM</target>
</trans-unit> </trans-unit>
@@ -13326,7 +13342,7 @@
<source>LLM Backend</source> <source>LLM Backend</source>
<context-group purpose="location"> <context-group purpose="location">
<context context-type="sourcefile">src/app/data/paperless-config.ts</context> <context context-type="sourcefile">src/app/data/paperless-config.ts</context>
<context context-type="linenumber">379</context> <context context-type="linenumber">387</context>
</context-group> </context-group>
<target state="translated">Backend de LLM</target> <target state="translated">Backend de LLM</target>
</trans-unit> </trans-unit>
@@ -13334,7 +13350,7 @@
<source>LLM Model</source> <source>LLM Model</source>
<context-group purpose="location"> <context-group purpose="location">
<context context-type="sourcefile">src/app/data/paperless-config.ts</context> <context context-type="sourcefile">src/app/data/paperless-config.ts</context>
<context context-type="linenumber">387</context> <context context-type="linenumber">395</context>
</context-group> </context-group>
<target state="translated">Model LLM</target> <target state="translated">Model LLM</target>
</trans-unit> </trans-unit>
@@ -13342,7 +13358,7 @@
<source>LLM API Key</source> <source>LLM API Key</source>
<context-group purpose="location"> <context-group purpose="location">
<context context-type="sourcefile">src/app/data/paperless-config.ts</context> <context context-type="sourcefile">src/app/data/paperless-config.ts</context>
<context context-type="linenumber">394</context> <context context-type="linenumber">402</context>
</context-group> </context-group>
<target state="translated">Clau API LLM</target> <target state="translated">Clau API LLM</target>
</trans-unit> </trans-unit>
@@ -13350,7 +13366,7 @@
<source>LLM Endpoint</source> <source>LLM Endpoint</source>
<context-group purpose="location"> <context-group purpose="location">
<context context-type="sourcefile">src/app/data/paperless-config.ts</context> <context context-type="sourcefile">src/app/data/paperless-config.ts</context>
<context context-type="linenumber">401</context> <context context-type="linenumber">409</context>
</context-group> </context-group>
<target state="translated">Punt final LLM</target> <target state="translated">Punt final LLM</target>
</trans-unit> </trans-unit>
@@ -13358,7 +13374,7 @@
<source>LLM Output Language</source> <source>LLM Output Language</source>
<context-group purpose="location"> <context-group purpose="location">
<context context-type="sourcefile">src/app/data/paperless-config.ts</context> <context context-type="sourcefile">src/app/data/paperless-config.ts</context>
<context context-type="linenumber">408</context> <context context-type="linenumber">416</context>
</context-group> </context-group>
<target state="translated">Idioma de sortida de LLM</target> <target state="translated">Idioma de sortida de LLM</target>
</trans-unit> </trans-unit>
@@ -13366,7 +13382,7 @@
<source>Language to use for generated AI suggestions. When unset, AI suggestions use the user&apos;s display language if explicitly set.</source> <source>Language to use for generated AI suggestions. When unset, AI suggestions use the user&apos;s display language if explicitly set.</source>
<context-group purpose="location"> <context-group purpose="location">
<context context-type="sourcefile">src/app/data/paperless-config.ts</context> <context context-type="sourcefile">src/app/data/paperless-config.ts</context>
<context context-type="linenumber">412</context> <context context-type="linenumber">420</context>
</context-group> </context-group>
<target state="translated">Idioma que s'utilitzarà per als suggeriments d'IA generats. Quan no està definit, els suggeriments d'IA utilitzen l'idioma de visualització de l'usuari si està definit explícitament.</target> <target state="translated">Idioma que s'utilitzarà per als suggeriments d'IA generats. Quan no està definit, els suggeriments d'IA utilitzen l'idioma de visualització de l'usuari si està definit explícitament.</target>
</trans-unit> </trans-unit>
@@ -13374,7 +13390,7 @@
<source>LLM Request Timeout</source> <source>LLM Request Timeout</source>
<context-group purpose="location"> <context-group purpose="location">
<context context-type="sourcefile">src/app/data/paperless-config.ts</context> <context context-type="sourcefile">src/app/data/paperless-config.ts</context>
<context context-type="linenumber">416</context> <context context-type="linenumber">424</context>
</context-group> </context-group>
<target state="needs-translation">LLM Request Timeout</target> <target state="needs-translation">LLM Request Timeout</target>
</trans-unit> </trans-unit>
@@ -13382,7 +13398,7 @@
<source>Timeout in seconds for LLM requests.</source> <source>Timeout in seconds for LLM requests.</source>
<context-group purpose="location"> <context-group purpose="location">
<context context-type="sourcefile">src/app/data/paperless-config.ts</context> <context context-type="sourcefile">src/app/data/paperless-config.ts</context>
<context context-type="linenumber">420</context> <context context-type="linenumber">428</context>
</context-group> </context-group>
<target state="needs-translation">Timeout in seconds for LLM requests.</target> <target state="needs-translation">Timeout in seconds for LLM requests.</target>
</trans-unit> </trans-unit>
+37 -21
View File
@@ -10740,7 +10740,7 @@
</context-group> </context-group>
<context-group purpose="location"> <context-group purpose="location">
<context context-type="sourcefile">src/app/components/document-list/document-list.component.ts</context> <context context-type="sourcefile">src/app/components/document-list/document-list.component.ts</context>
<context context-type="linenumber">348</context> <context context-type="linenumber">351</context>
</context-group> </context-group>
<context-group purpose="location"> <context-group purpose="location">
<context context-type="sourcefile">src/app/components/manage/document-attributes/document-attributes.component.html</context> <context context-type="sourcefile">src/app/components/manage/document-attributes/document-attributes.component.html</context>
@@ -10756,7 +10756,7 @@
</context-group> </context-group>
<context-group purpose="location"> <context-group purpose="location">
<context context-type="sourcefile">src/app/components/document-list/document-list.component.ts</context> <context context-type="sourcefile">src/app/components/document-list/document-list.component.ts</context>
<context context-type="linenumber">341</context> <context context-type="linenumber">344</context>
</context-group> </context-group>
<context-group purpose="location"> <context-group purpose="location">
<context context-type="sourcefile">src/app/components/manage/document-attributes/document-attributes.component.html</context> <context context-type="sourcefile">src/app/components/manage/document-attributes/document-attributes.component.html</context>
@@ -11040,7 +11040,7 @@
<source>Reset filters / selection</source> <source>Reset filters / selection</source>
<context-group purpose="location"> <context-group purpose="location">
<context context-type="sourcefile">src/app/components/document-list/document-list.component.ts</context> <context context-type="sourcefile">src/app/components/document-list/document-list.component.ts</context>
<context context-type="linenumber">329</context> <context context-type="linenumber">332</context>
</context-group> </context-group>
<target state="translated">Resetovat filtry / výběr</target> <target state="translated">Resetovat filtry / výběr</target>
</trans-unit> </trans-unit>
@@ -11048,7 +11048,7 @@
<source>Open first [selected] document</source> <source>Open first [selected] document</source>
<context-group purpose="location"> <context-group purpose="location">
<context context-type="sourcefile">src/app/components/document-list/document-list.component.ts</context> <context context-type="sourcefile">src/app/components/document-list/document-list.component.ts</context>
<context context-type="linenumber">357</context> <context context-type="linenumber">360</context>
</context-group> </context-group>
<target state="translated">Otevřít první [vybraný] dokument</target> <target state="translated">Otevřít první [vybraný] dokument</target>
</trans-unit> </trans-unit>
@@ -11056,7 +11056,7 @@
<source>Previous page</source> <source>Previous page</source>
<context-group purpose="location"> <context-group purpose="location">
<context context-type="sourcefile">src/app/components/document-list/document-list.component.ts</context> <context context-type="sourcefile">src/app/components/document-list/document-list.component.ts</context>
<context context-type="linenumber">373</context> <context context-type="linenumber">376</context>
</context-group> </context-group>
<target state="translated">Předchozí stránka</target> <target state="translated">Předchozí stránka</target>
</trans-unit> </trans-unit>
@@ -11064,7 +11064,7 @@
<source>Next page</source> <source>Next page</source>
<context-group purpose="location"> <context-group purpose="location">
<context context-type="sourcefile">src/app/components/document-list/document-list.component.ts</context> <context context-type="sourcefile">src/app/components/document-list/document-list.component.ts</context>
<context context-type="linenumber">385</context> <context context-type="linenumber">388</context>
</context-group> </context-group>
<target state="translated">Další stránka</target> <target state="translated">Další stránka</target>
</trans-unit> </trans-unit>
@@ -11072,7 +11072,7 @@
<source>View &quot;<x id="PH" equiv-text="this.list.activeSavedViewTitle"/>&quot; saved successfully.</source> <source>View &quot;<x id="PH" equiv-text="this.list.activeSavedViewTitle"/>&quot; saved successfully.</source>
<context-group purpose="location"> <context-group purpose="location">
<context context-type="sourcefile">src/app/components/document-list/document-list.component.ts</context> <context context-type="sourcefile">src/app/components/document-list/document-list.component.ts</context>
<context context-type="linenumber">419</context> <context context-type="linenumber">422</context>
</context-group> </context-group>
<target state="final">Zobrazení "<x id="PH" equiv-text="this.list.activeSavedViewTitle"/>" bylo úspěšně uloženo.</target> <target state="final">Zobrazení "<x id="PH" equiv-text="this.list.activeSavedViewTitle"/>" bylo úspěšně uloženo.</target>
</trans-unit> </trans-unit>
@@ -11080,7 +11080,7 @@
<source>Failed to save view &quot;<x id="PH" equiv-text="this.list.activeSavedViewTitle"/>&quot;.</source> <source>Failed to save view &quot;<x id="PH" equiv-text="this.list.activeSavedViewTitle"/>&quot;.</source>
<context-group purpose="location"> <context-group purpose="location">
<context context-type="sourcefile">src/app/components/document-list/document-list.component.ts</context> <context context-type="sourcefile">src/app/components/document-list/document-list.component.ts</context>
<context context-type="linenumber">425</context> <context context-type="linenumber">428</context>
</context-group> </context-group>
<target state="translated">Nepodařilo se uložit pohled „<x id="PH" equiv-text="this.list.activeSavedViewTitle"/>“.</target> <target state="translated">Nepodařilo se uložit pohled „<x id="PH" equiv-text="this.list.activeSavedViewTitle"/>“.</target>
</trans-unit> </trans-unit>
@@ -11088,7 +11088,7 @@
<source>View &quot;<x id="PH" equiv-text="savedView.name"/>&quot; created successfully.</source> <source>View &quot;<x id="PH" equiv-text="savedView.name"/>&quot; created successfully.</source>
<context-group purpose="location"> <context-group purpose="location">
<context context-type="sourcefile">src/app/components/document-list/document-list.component.ts</context> <context context-type="sourcefile">src/app/components/document-list/document-list.component.ts</context>
<context context-type="linenumber">494</context> <context context-type="linenumber">497</context>
</context-group> </context-group>
<target state="final">Zobrazení "<x id="PH" equiv-text="savedView.name"/>" bylo úspěšně vytvořeno.</target> <target state="final">Zobrazení "<x id="PH" equiv-text="savedView.name"/>" bylo úspěšně vytvořeno.</target>
</trans-unit> </trans-unit>
@@ -11096,7 +11096,7 @@
<source>View &quot;<x id="PH" equiv-text="savedView.name"/>&quot; created successfully, but could not update visibility settings.</source> <source>View &quot;<x id="PH" equiv-text="savedView.name"/>&quot; created successfully, but could not update visibility settings.</source>
<context-group purpose="location"> <context-group purpose="location">
<context context-type="sourcefile">src/app/components/document-list/document-list.component.ts</context> <context context-type="sourcefile">src/app/components/document-list/document-list.component.ts</context>
<context context-type="linenumber">500</context> <context context-type="linenumber">503</context>
</context-group> </context-group>
<target state="translated">Pohled „<x id="PH" equiv-text="savedView.name"/>“ úspěšně vytvořen, nepodařilo se ale aktualizovat nastavení viditelnosti.</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>
@@ -13297,11 +13297,27 @@
</context-group> </context-group>
<target state="translated">Model vkládání LLM</target> <target state="translated">Model vkládání LLM</target>
</trans-unit> </trans-unit>
<trans-unit id="861068592166833023" datatype="html">
<source>LLM Embedding API Key</source>
<context-group purpose="location">
<context context-type="sourcefile">src/app/data/paperless-config.ts</context>
<context context-type="linenumber">358</context>
</context-group>
<target state="needs-translation">LLM Embedding API Key</target>
</trans-unit>
<trans-unit id="2929108042259892948" datatype="html">
<source>Used for embeddings when set, otherwise LLM API key is used.</source>
<context-group purpose="location">
<context context-type="sourcefile">src/app/data/paperless-config.ts</context>
<context context-type="linenumber">360</context>
</context-group>
<target state="needs-translation">Used for embeddings when set, otherwise LLM API key is used.</target>
</trans-unit>
<trans-unit id="3554114880473286122" datatype="html"> <trans-unit id="3554114880473286122" datatype="html">
<source>LLM Embedding Endpoint</source> <source>LLM Embedding Endpoint</source>
<context-group purpose="location"> <context-group purpose="location">
<context context-type="sourcefile">src/app/data/paperless-config.ts</context> <context context-type="sourcefile">src/app/data/paperless-config.ts</context>
<context context-type="linenumber">358</context> <context context-type="linenumber">366</context>
</context-group> </context-group>
<target state="translated">Koncový bod vkládání LLM</target> <target state="translated">Koncový bod vkládání LLM</target>
</trans-unit> </trans-unit>
@@ -13309,7 +13325,7 @@
<source>LLM Embedding Chunk Size</source> <source>LLM Embedding Chunk Size</source>
<context-group purpose="location"> <context-group purpose="location">
<context context-type="sourcefile">src/app/data/paperless-config.ts</context> <context context-type="sourcefile">src/app/data/paperless-config.ts</context>
<context context-type="linenumber">365</context> <context context-type="linenumber">373</context>
</context-group> </context-group>
<target state="translated">Velikost bloku vkládání LLM</target> <target state="translated">Velikost bloku vkládání LLM</target>
</trans-unit> </trans-unit>
@@ -13317,7 +13333,7 @@
<source>LLM Context Size</source> <source>LLM Context Size</source>
<context-group purpose="location"> <context-group purpose="location">
<context context-type="sourcefile">src/app/data/paperless-config.ts</context> <context context-type="sourcefile">src/app/data/paperless-config.ts</context>
<context context-type="linenumber">372</context> <context context-type="linenumber">380</context>
</context-group> </context-group>
<target state="translated">Velikost kontextu LLM</target> <target state="translated">Velikost kontextu LLM</target>
</trans-unit> </trans-unit>
@@ -13325,7 +13341,7 @@
<source>LLM Backend</source> <source>LLM Backend</source>
<context-group purpose="location"> <context-group purpose="location">
<context context-type="sourcefile">src/app/data/paperless-config.ts</context> <context context-type="sourcefile">src/app/data/paperless-config.ts</context>
<context context-type="linenumber">379</context> <context context-type="linenumber">387</context>
</context-group> </context-group>
<target state="translated">Backend LLM</target> <target state="translated">Backend LLM</target>
</trans-unit> </trans-unit>
@@ -13333,7 +13349,7 @@
<source>LLM Model</source> <source>LLM Model</source>
<context-group purpose="location"> <context-group purpose="location">
<context context-type="sourcefile">src/app/data/paperless-config.ts</context> <context context-type="sourcefile">src/app/data/paperless-config.ts</context>
<context context-type="linenumber">387</context> <context context-type="linenumber">395</context>
</context-group> </context-group>
<target state="translated">Model LLM</target> <target state="translated">Model LLM</target>
</trans-unit> </trans-unit>
@@ -13341,7 +13357,7 @@
<source>LLM API Key</source> <source>LLM API Key</source>
<context-group purpose="location"> <context-group purpose="location">
<context context-type="sourcefile">src/app/data/paperless-config.ts</context> <context context-type="sourcefile">src/app/data/paperless-config.ts</context>
<context context-type="linenumber">394</context> <context context-type="linenumber">402</context>
</context-group> </context-group>
<target state="translated">Klíč API LLM</target> <target state="translated">Klíč API LLM</target>
</trans-unit> </trans-unit>
@@ -13349,7 +13365,7 @@
<source>LLM Endpoint</source> <source>LLM Endpoint</source>
<context-group purpose="location"> <context-group purpose="location">
<context context-type="sourcefile">src/app/data/paperless-config.ts</context> <context context-type="sourcefile">src/app/data/paperless-config.ts</context>
<context context-type="linenumber">401</context> <context context-type="linenumber">409</context>
</context-group> </context-group>
<target state="translated">Koncový bod LLM</target> <target state="translated">Koncový bod LLM</target>
</trans-unit> </trans-unit>
@@ -13357,7 +13373,7 @@
<source>LLM Output Language</source> <source>LLM Output Language</source>
<context-group purpose="location"> <context-group purpose="location">
<context context-type="sourcefile">src/app/data/paperless-config.ts</context> <context context-type="sourcefile">src/app/data/paperless-config.ts</context>
<context context-type="linenumber">408</context> <context context-type="linenumber">416</context>
</context-group> </context-group>
<target state="translated">Výstupní jazyk LLM</target> <target state="translated">Výstupní jazyk LLM</target>
</trans-unit> </trans-unit>
@@ -13365,7 +13381,7 @@
<source>Language to use for generated AI suggestions. When unset, AI suggestions use the user&apos;s display language if explicitly set.</source> <source>Language to use for generated AI suggestions. When unset, AI suggestions use the user&apos;s display language if explicitly set.</source>
<context-group purpose="location"> <context-group purpose="location">
<context context-type="sourcefile">src/app/data/paperless-config.ts</context> <context context-type="sourcefile">src/app/data/paperless-config.ts</context>
<context context-type="linenumber">412</context> <context context-type="linenumber">420</context>
</context-group> </context-group>
<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> <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>
@@ -13373,7 +13389,7 @@
<source>LLM Request Timeout</source> <source>LLM Request Timeout</source>
<context-group purpose="location"> <context-group purpose="location">
<context context-type="sourcefile">src/app/data/paperless-config.ts</context> <context context-type="sourcefile">src/app/data/paperless-config.ts</context>
<context context-type="linenumber">416</context> <context context-type="linenumber">424</context>
</context-group> </context-group>
<target state="translated">Čawsový limit žádosti LLM</target> <target state="translated">Čawsový limit žádosti LLM</target>
</trans-unit> </trans-unit>
@@ -13381,7 +13397,7 @@
<source>Timeout in seconds for LLM requests.</source> <source>Timeout in seconds for LLM requests.</source>
<context-group purpose="location"> <context-group purpose="location">
<context context-type="sourcefile">src/app/data/paperless-config.ts</context> <context context-type="sourcefile">src/app/data/paperless-config.ts</context>
<context context-type="linenumber">420</context> <context context-type="linenumber">428</context>
</context-group> </context-group>
<target state="translated">Časový limit v sekundách pro žádosti LLM.</target> <target state="translated">Časový limit v sekundách pro žádosti LLM.</target>
</trans-unit> </trans-unit>
+37 -21
View File
@@ -10741,7 +10741,7 @@
</context-group> </context-group>
<context-group purpose="location"> <context-group purpose="location">
<context context-type="sourcefile">src/app/components/document-list/document-list.component.ts</context> <context context-type="sourcefile">src/app/components/document-list/document-list.component.ts</context>
<context context-type="linenumber">348</context> <context context-type="linenumber">351</context>
</context-group> </context-group>
<context-group purpose="location"> <context-group purpose="location">
<context context-type="sourcefile">src/app/components/manage/document-attributes/document-attributes.component.html</context> <context context-type="sourcefile">src/app/components/manage/document-attributes/document-attributes.component.html</context>
@@ -10757,7 +10757,7 @@
</context-group> </context-group>
<context-group purpose="location"> <context-group purpose="location">
<context context-type="sourcefile">src/app/components/document-list/document-list.component.ts</context> <context context-type="sourcefile">src/app/components/document-list/document-list.component.ts</context>
<context context-type="linenumber">341</context> <context context-type="linenumber">344</context>
</context-group> </context-group>
<context-group purpose="location"> <context-group purpose="location">
<context context-type="sourcefile">src/app/components/manage/document-attributes/document-attributes.component.html</context> <context context-type="sourcefile">src/app/components/manage/document-attributes/document-attributes.component.html</context>
@@ -11041,7 +11041,7 @@
<source>Reset filters / selection</source> <source>Reset filters / selection</source>
<context-group purpose="location"> <context-group purpose="location">
<context context-type="sourcefile">src/app/components/document-list/document-list.component.ts</context> <context context-type="sourcefile">src/app/components/document-list/document-list.component.ts</context>
<context context-type="linenumber">329</context> <context context-type="linenumber">332</context>
</context-group> </context-group>
<target state="needs-translation">Reset filters / selection</target> <target state="needs-translation">Reset filters / selection</target>
</trans-unit> </trans-unit>
@@ -11049,7 +11049,7 @@
<source>Open first [selected] document</source> <source>Open first [selected] document</source>
<context-group purpose="location"> <context-group purpose="location">
<context context-type="sourcefile">src/app/components/document-list/document-list.component.ts</context> <context context-type="sourcefile">src/app/components/document-list/document-list.component.ts</context>
<context context-type="linenumber">357</context> <context context-type="linenumber">360</context>
</context-group> </context-group>
<target state="needs-translation">Open first [selected] document</target> <target state="needs-translation">Open first [selected] document</target>
</trans-unit> </trans-unit>
@@ -11057,7 +11057,7 @@
<source>Previous page</source> <source>Previous page</source>
<context-group purpose="location"> <context-group purpose="location">
<context context-type="sourcefile">src/app/components/document-list/document-list.component.ts</context> <context context-type="sourcefile">src/app/components/document-list/document-list.component.ts</context>
<context context-type="linenumber">373</context> <context context-type="linenumber">376</context>
</context-group> </context-group>
<target state="needs-translation">Previous page</target> <target state="needs-translation">Previous page</target>
</trans-unit> </trans-unit>
@@ -11065,7 +11065,7 @@
<source>Next page</source> <source>Next page</source>
<context-group purpose="location"> <context-group purpose="location">
<context context-type="sourcefile">src/app/components/document-list/document-list.component.ts</context> <context context-type="sourcefile">src/app/components/document-list/document-list.component.ts</context>
<context context-type="linenumber">385</context> <context context-type="linenumber">388</context>
</context-group> </context-group>
<target state="needs-translation">Next page</target> <target state="needs-translation">Next page</target>
</trans-unit> </trans-unit>
@@ -11073,7 +11073,7 @@
<source>View &quot;<x id="PH" equiv-text="this.list.activeSavedViewTitle"/>&quot; saved successfully.</source> <source>View &quot;<x id="PH" equiv-text="this.list.activeSavedViewTitle"/>&quot; saved successfully.</source>
<context-group purpose="location"> <context-group purpose="location">
<context context-type="sourcefile">src/app/components/document-list/document-list.component.ts</context> <context context-type="sourcefile">src/app/components/document-list/document-list.component.ts</context>
<context context-type="linenumber">419</context> <context context-type="linenumber">422</context>
</context-group> </context-group>
<target state="final">Visning "<x id="PH" equiv-text="this.list.activeSavedViewTitle"/>" er gemt.</target> <target state="final">Visning "<x id="PH" equiv-text="this.list.activeSavedViewTitle"/>" er gemt.</target>
</trans-unit> </trans-unit>
@@ -11081,7 +11081,7 @@
<source>Failed to save view &quot;<x id="PH" equiv-text="this.list.activeSavedViewTitle"/>&quot;.</source> <source>Failed to save view &quot;<x id="PH" equiv-text="this.list.activeSavedViewTitle"/>&quot;.</source>
<context-group purpose="location"> <context-group purpose="location">
<context context-type="sourcefile">src/app/components/document-list/document-list.component.ts</context> <context context-type="sourcefile">src/app/components/document-list/document-list.component.ts</context>
<context context-type="linenumber">425</context> <context context-type="linenumber">428</context>
</context-group> </context-group>
<target state="needs-translation">Failed to save view "<x id="PH" equiv-text="this.list.activeSavedViewTitle"/>".</target> <target state="needs-translation">Failed to save view "<x id="PH" equiv-text="this.list.activeSavedViewTitle"/>".</target>
</trans-unit> </trans-unit>
@@ -11089,7 +11089,7 @@
<source>View &quot;<x id="PH" equiv-text="savedView.name"/>&quot; created successfully.</source> <source>View &quot;<x id="PH" equiv-text="savedView.name"/>&quot; created successfully.</source>
<context-group purpose="location"> <context-group purpose="location">
<context context-type="sourcefile">src/app/components/document-list/document-list.component.ts</context> <context context-type="sourcefile">src/app/components/document-list/document-list.component.ts</context>
<context context-type="linenumber">494</context> <context context-type="linenumber">497</context>
</context-group> </context-group>
<target state="final">Visning "<x id="PH" equiv-text="savedView.name"/>" er oprettet.</target> <target state="final">Visning "<x id="PH" equiv-text="savedView.name"/>" er oprettet.</target>
</trans-unit> </trans-unit>
@@ -11097,7 +11097,7 @@
<source>View &quot;<x id="PH" equiv-text="savedView.name"/>&quot; created successfully, but could not update visibility settings.</source> <source>View &quot;<x id="PH" equiv-text="savedView.name"/>&quot; created successfully, but could not update visibility settings.</source>
<context-group purpose="location"> <context-group purpose="location">
<context context-type="sourcefile">src/app/components/document-list/document-list.component.ts</context> <context context-type="sourcefile">src/app/components/document-list/document-list.component.ts</context>
<context context-type="linenumber">500</context> <context context-type="linenumber">503</context>
</context-group> </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="needs-translation">View "<x id="PH" equiv-text="savedView.name"/>" created successfully, but could not update visibility settings.</target>
</trans-unit> </trans-unit>
@@ -13298,11 +13298,27 @@
</context-group> </context-group>
<target state="needs-translation">LLM Embedding Model</target> <target state="needs-translation">LLM Embedding Model</target>
</trans-unit> </trans-unit>
<trans-unit id="861068592166833023" datatype="html">
<source>LLM Embedding API Key</source>
<context-group purpose="location">
<context context-type="sourcefile">src/app/data/paperless-config.ts</context>
<context context-type="linenumber">358</context>
</context-group>
<target state="needs-translation">LLM Embedding API Key</target>
</trans-unit>
<trans-unit id="2929108042259892948" datatype="html">
<source>Used for embeddings when set, otherwise LLM API key is used.</source>
<context-group purpose="location">
<context context-type="sourcefile">src/app/data/paperless-config.ts</context>
<context context-type="linenumber">360</context>
</context-group>
<target state="needs-translation">Used for embeddings when set, otherwise LLM API key is used.</target>
</trans-unit>
<trans-unit id="3554114880473286122" datatype="html"> <trans-unit id="3554114880473286122" datatype="html">
<source>LLM Embedding Endpoint</source> <source>LLM Embedding Endpoint</source>
<context-group purpose="location"> <context-group purpose="location">
<context context-type="sourcefile">src/app/data/paperless-config.ts</context> <context context-type="sourcefile">src/app/data/paperless-config.ts</context>
<context context-type="linenumber">358</context> <context context-type="linenumber">366</context>
</context-group> </context-group>
<target state="needs-translation">LLM Embedding Endpoint</target> <target state="needs-translation">LLM Embedding Endpoint</target>
</trans-unit> </trans-unit>
@@ -13310,7 +13326,7 @@
<source>LLM Embedding Chunk Size</source> <source>LLM Embedding Chunk Size</source>
<context-group purpose="location"> <context-group purpose="location">
<context context-type="sourcefile">src/app/data/paperless-config.ts</context> <context context-type="sourcefile">src/app/data/paperless-config.ts</context>
<context context-type="linenumber">365</context> <context context-type="linenumber">373</context>
</context-group> </context-group>
<target state="needs-translation">LLM Embedding Chunk Size</target> <target state="needs-translation">LLM Embedding Chunk Size</target>
</trans-unit> </trans-unit>
@@ -13318,7 +13334,7 @@
<source>LLM Context Size</source> <source>LLM Context Size</source>
<context-group purpose="location"> <context-group purpose="location">
<context context-type="sourcefile">src/app/data/paperless-config.ts</context> <context context-type="sourcefile">src/app/data/paperless-config.ts</context>
<context context-type="linenumber">372</context> <context context-type="linenumber">380</context>
</context-group> </context-group>
<target state="needs-translation">LLM Context Size</target> <target state="needs-translation">LLM Context Size</target>
</trans-unit> </trans-unit>
@@ -13326,7 +13342,7 @@
<source>LLM Backend</source> <source>LLM Backend</source>
<context-group purpose="location"> <context-group purpose="location">
<context context-type="sourcefile">src/app/data/paperless-config.ts</context> <context context-type="sourcefile">src/app/data/paperless-config.ts</context>
<context context-type="linenumber">379</context> <context context-type="linenumber">387</context>
</context-group> </context-group>
<target state="needs-translation">LLM Backend</target> <target state="needs-translation">LLM Backend</target>
</trans-unit> </trans-unit>
@@ -13334,7 +13350,7 @@
<source>LLM Model</source> <source>LLM Model</source>
<context-group purpose="location"> <context-group purpose="location">
<context context-type="sourcefile">src/app/data/paperless-config.ts</context> <context context-type="sourcefile">src/app/data/paperless-config.ts</context>
<context context-type="linenumber">387</context> <context context-type="linenumber">395</context>
</context-group> </context-group>
<target state="needs-translation">LLM Model</target> <target state="needs-translation">LLM Model</target>
</trans-unit> </trans-unit>
@@ -13342,7 +13358,7 @@
<source>LLM API Key</source> <source>LLM API Key</source>
<context-group purpose="location"> <context-group purpose="location">
<context context-type="sourcefile">src/app/data/paperless-config.ts</context> <context context-type="sourcefile">src/app/data/paperless-config.ts</context>
<context context-type="linenumber">394</context> <context context-type="linenumber">402</context>
</context-group> </context-group>
<target state="needs-translation">LLM API Key</target> <target state="needs-translation">LLM API Key</target>
</trans-unit> </trans-unit>
@@ -13350,7 +13366,7 @@
<source>LLM Endpoint</source> <source>LLM Endpoint</source>
<context-group purpose="location"> <context-group purpose="location">
<context context-type="sourcefile">src/app/data/paperless-config.ts</context> <context context-type="sourcefile">src/app/data/paperless-config.ts</context>
<context context-type="linenumber">401</context> <context context-type="linenumber">409</context>
</context-group> </context-group>
<target state="needs-translation">LLM Endpoint</target> <target state="needs-translation">LLM Endpoint</target>
</trans-unit> </trans-unit>
@@ -13358,7 +13374,7 @@
<source>LLM Output Language</source> <source>LLM Output Language</source>
<context-group purpose="location"> <context-group purpose="location">
<context context-type="sourcefile">src/app/data/paperless-config.ts</context> <context context-type="sourcefile">src/app/data/paperless-config.ts</context>
<context context-type="linenumber">408</context> <context context-type="linenumber">416</context>
</context-group> </context-group>
<target state="needs-translation">LLM Output Language</target> <target state="needs-translation">LLM Output Language</target>
</trans-unit> </trans-unit>
@@ -13366,7 +13382,7 @@
<source>Language to use for generated AI suggestions. When unset, AI suggestions use the user&apos;s display language if explicitly set.</source> <source>Language to use for generated AI suggestions. When unset, AI suggestions use the user&apos;s display language if explicitly set.</source>
<context-group purpose="location"> <context-group purpose="location">
<context context-type="sourcefile">src/app/data/paperless-config.ts</context> <context context-type="sourcefile">src/app/data/paperless-config.ts</context>
<context context-type="linenumber">412</context> <context context-type="linenumber">420</context>
</context-group> </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="needs-translation">Language to use for generated AI suggestions. When unset, AI suggestions use the user's display language if explicitly set.</target>
</trans-unit> </trans-unit>
@@ -13374,7 +13390,7 @@
<source>LLM Request Timeout</source> <source>LLM Request Timeout</source>
<context-group purpose="location"> <context-group purpose="location">
<context context-type="sourcefile">src/app/data/paperless-config.ts</context> <context context-type="sourcefile">src/app/data/paperless-config.ts</context>
<context context-type="linenumber">416</context> <context context-type="linenumber">424</context>
</context-group> </context-group>
<target state="needs-translation">LLM Request Timeout</target> <target state="needs-translation">LLM Request Timeout</target>
</trans-unit> </trans-unit>
@@ -13382,7 +13398,7 @@
<source>Timeout in seconds for LLM requests.</source> <source>Timeout in seconds for LLM requests.</source>
<context-group purpose="location"> <context-group purpose="location">
<context context-type="sourcefile">src/app/data/paperless-config.ts</context> <context context-type="sourcefile">src/app/data/paperless-config.ts</context>
<context context-type="linenumber">420</context> <context context-type="linenumber">428</context>
</context-group> </context-group>
<target state="needs-translation">Timeout in seconds for LLM requests.</target> <target state="needs-translation">Timeout in seconds for LLM requests.</target>
</trans-unit> </trans-unit>
+37 -21
View File
@@ -10740,7 +10740,7 @@
</context-group> </context-group>
<context-group purpose="location"> <context-group purpose="location">
<context context-type="sourcefile">src/app/components/document-list/document-list.component.ts</context> <context context-type="sourcefile">src/app/components/document-list/document-list.component.ts</context>
<context context-type="linenumber">348</context> <context context-type="linenumber">351</context>
</context-group> </context-group>
<context-group purpose="location"> <context-group purpose="location">
<context context-type="sourcefile">src/app/components/manage/document-attributes/document-attributes.component.html</context> <context context-type="sourcefile">src/app/components/manage/document-attributes/document-attributes.component.html</context>
@@ -10756,7 +10756,7 @@
</context-group> </context-group>
<context-group purpose="location"> <context-group purpose="location">
<context context-type="sourcefile">src/app/components/document-list/document-list.component.ts</context> <context context-type="sourcefile">src/app/components/document-list/document-list.component.ts</context>
<context context-type="linenumber">341</context> <context context-type="linenumber">344</context>
</context-group> </context-group>
<context-group purpose="location"> <context-group purpose="location">
<context context-type="sourcefile">src/app/components/manage/document-attributes/document-attributes.component.html</context> <context context-type="sourcefile">src/app/components/manage/document-attributes/document-attributes.component.html</context>
@@ -11040,7 +11040,7 @@
<source>Reset filters / selection</source> <source>Reset filters / selection</source>
<context-group purpose="location"> <context-group purpose="location">
<context context-type="sourcefile">src/app/components/document-list/document-list.component.ts</context> <context context-type="sourcefile">src/app/components/document-list/document-list.component.ts</context>
<context context-type="linenumber">329</context> <context context-type="linenumber">332</context>
</context-group> </context-group>
<target state="translated">Filter / Auswahl zurücksetzen</target> <target state="translated">Filter / Auswahl zurücksetzen</target>
</trans-unit> </trans-unit>
@@ -11048,7 +11048,7 @@
<source>Open first [selected] document</source> <source>Open first [selected] document</source>
<context-group purpose="location"> <context-group purpose="location">
<context context-type="sourcefile">src/app/components/document-list/document-list.component.ts</context> <context context-type="sourcefile">src/app/components/document-list/document-list.component.ts</context>
<context context-type="linenumber">357</context> <context context-type="linenumber">360</context>
</context-group> </context-group>
<target state="translated">Erstes [ausgewähltes] Dokument öffnen</target> <target state="translated">Erstes [ausgewähltes] Dokument öffnen</target>
</trans-unit> </trans-unit>
@@ -11056,7 +11056,7 @@
<source>Previous page</source> <source>Previous page</source>
<context-group purpose="location"> <context-group purpose="location">
<context context-type="sourcefile">src/app/components/document-list/document-list.component.ts</context> <context context-type="sourcefile">src/app/components/document-list/document-list.component.ts</context>
<context context-type="linenumber">373</context> <context context-type="linenumber">376</context>
</context-group> </context-group>
<target state="translated">Vorherige Seite</target> <target state="translated">Vorherige Seite</target>
</trans-unit> </trans-unit>
@@ -11064,7 +11064,7 @@
<source>Next page</source> <source>Next page</source>
<context-group purpose="location"> <context-group purpose="location">
<context context-type="sourcefile">src/app/components/document-list/document-list.component.ts</context> <context context-type="sourcefile">src/app/components/document-list/document-list.component.ts</context>
<context context-type="linenumber">385</context> <context context-type="linenumber">388</context>
</context-group> </context-group>
<target state="translated">Nächste Seite</target> <target state="translated">Nächste Seite</target>
</trans-unit> </trans-unit>
@@ -11072,7 +11072,7 @@
<source>View &quot;<x id="PH" equiv-text="this.list.activeSavedViewTitle"/>&quot; saved successfully.</source> <source>View &quot;<x id="PH" equiv-text="this.list.activeSavedViewTitle"/>&quot; saved successfully.</source>
<context-group purpose="location"> <context-group purpose="location">
<context context-type="sourcefile">src/app/components/document-list/document-list.component.ts</context> <context context-type="sourcefile">src/app/components/document-list/document-list.component.ts</context>
<context context-type="linenumber">419</context> <context context-type="linenumber">422</context>
</context-group> </context-group>
<target state="translated">Ansicht „<x id="PH" equiv-text="this.list.activeSavedViewTitle"/>“ erfolgreich gespeichert.</target> <target state="translated">Ansicht „<x id="PH" equiv-text="this.list.activeSavedViewTitle"/>“ erfolgreich gespeichert.</target>
</trans-unit> </trans-unit>
@@ -11080,7 +11080,7 @@
<source>Failed to save view &quot;<x id="PH" equiv-text="this.list.activeSavedViewTitle"/>&quot;.</source> <source>Failed to save view &quot;<x id="PH" equiv-text="this.list.activeSavedViewTitle"/>&quot;.</source>
<context-group purpose="location"> <context-group purpose="location">
<context context-type="sourcefile">src/app/components/document-list/document-list.component.ts</context> <context context-type="sourcefile">src/app/components/document-list/document-list.component.ts</context>
<context context-type="linenumber">425</context> <context context-type="linenumber">428</context>
</context-group> </context-group>
<target state="translated">Fehler beim Speichern der Ansicht „<x id="PH" equiv-text="this.list.activeSavedViewTitle"/>“.</target> <target state="translated">Fehler beim Speichern der Ansicht „<x id="PH" equiv-text="this.list.activeSavedViewTitle"/>“.</target>
</trans-unit> </trans-unit>
@@ -11088,7 +11088,7 @@
<source>View &quot;<x id="PH" equiv-text="savedView.name"/>&quot; created successfully.</source> <source>View &quot;<x id="PH" equiv-text="savedView.name"/>&quot; created successfully.</source>
<context-group purpose="location"> <context-group purpose="location">
<context context-type="sourcefile">src/app/components/document-list/document-list.component.ts</context> <context context-type="sourcefile">src/app/components/document-list/document-list.component.ts</context>
<context context-type="linenumber">494</context> <context context-type="linenumber">497</context>
</context-group> </context-group>
<target state="translated">Ansicht „<x id="PH" equiv-text="savedView.name"/>“ erfolgreich erstellt.</target> <target state="translated">Ansicht „<x id="PH" equiv-text="savedView.name"/>“ erfolgreich erstellt.</target>
</trans-unit> </trans-unit>
@@ -11096,7 +11096,7 @@
<source>View &quot;<x id="PH" equiv-text="savedView.name"/>&quot; created successfully, but could not update visibility settings.</source> <source>View &quot;<x id="PH" equiv-text="savedView.name"/>&quot; created successfully, but could not update visibility settings.</source>
<context-group purpose="location"> <context-group purpose="location">
<context context-type="sourcefile">src/app/components/document-list/document-list.component.ts</context> <context context-type="sourcefile">src/app/components/document-list/document-list.component.ts</context>
<context context-type="linenumber">500</context> <context context-type="linenumber">503</context>
</context-group> </context-group>
<target state="translated">Ansicht „<x id="PH" equiv-text="savedView.name"/>“ wurde erfolgreich erstellt, die Sichtbarkeitseinstellungen konnten jedoch nicht aktualisiert werden.</target> <target state="translated">Ansicht „<x id="PH" equiv-text="savedView.name"/>“ wurde erfolgreich erstellt, die Sichtbarkeitseinstellungen konnten jedoch nicht aktualisiert werden.</target>
</trans-unit> </trans-unit>
@@ -13297,11 +13297,27 @@
</context-group> </context-group>
<target state="translated">LLM-Einbettungsmodell</target> <target state="translated">LLM-Einbettungsmodell</target>
</trans-unit> </trans-unit>
<trans-unit id="861068592166833023" datatype="html">
<source>LLM Embedding API Key</source>
<context-group purpose="location">
<context context-type="sourcefile">src/app/data/paperless-config.ts</context>
<context context-type="linenumber">358</context>
</context-group>
<target state="needs-translation">LLM Embedding API Key</target>
</trans-unit>
<trans-unit id="2929108042259892948" datatype="html">
<source>Used for embeddings when set, otherwise LLM API key is used.</source>
<context-group purpose="location">
<context context-type="sourcefile">src/app/data/paperless-config.ts</context>
<context context-type="linenumber">360</context>
</context-group>
<target state="needs-translation">Used for embeddings when set, otherwise LLM API key is used.</target>
</trans-unit>
<trans-unit id="3554114880473286122" datatype="html"> <trans-unit id="3554114880473286122" datatype="html">
<source>LLM Embedding Endpoint</source> <source>LLM Embedding Endpoint</source>
<context-group purpose="location"> <context-group purpose="location">
<context context-type="sourcefile">src/app/data/paperless-config.ts</context> <context context-type="sourcefile">src/app/data/paperless-config.ts</context>
<context context-type="linenumber">358</context> <context context-type="linenumber">366</context>
</context-group> </context-group>
<target state="needs-translation">LLM Embedding Endpoint</target> <target state="needs-translation">LLM Embedding Endpoint</target>
</trans-unit> </trans-unit>
@@ -13309,7 +13325,7 @@
<source>LLM Embedding Chunk Size</source> <source>LLM Embedding Chunk Size</source>
<context-group purpose="location"> <context-group purpose="location">
<context context-type="sourcefile">src/app/data/paperless-config.ts</context> <context context-type="sourcefile">src/app/data/paperless-config.ts</context>
<context context-type="linenumber">365</context> <context context-type="linenumber">373</context>
</context-group> </context-group>
<target state="needs-translation">LLM Embedding Chunk Size</target> <target state="needs-translation">LLM Embedding Chunk Size</target>
</trans-unit> </trans-unit>
@@ -13317,7 +13333,7 @@
<source>LLM Context Size</source> <source>LLM Context Size</source>
<context-group purpose="location"> <context-group purpose="location">
<context context-type="sourcefile">src/app/data/paperless-config.ts</context> <context context-type="sourcefile">src/app/data/paperless-config.ts</context>
<context context-type="linenumber">372</context> <context context-type="linenumber">380</context>
</context-group> </context-group>
<target state="needs-translation">LLM Context Size</target> <target state="needs-translation">LLM Context Size</target>
</trans-unit> </trans-unit>
@@ -13325,7 +13341,7 @@
<source>LLM Backend</source> <source>LLM Backend</source>
<context-group purpose="location"> <context-group purpose="location">
<context context-type="sourcefile">src/app/data/paperless-config.ts</context> <context context-type="sourcefile">src/app/data/paperless-config.ts</context>
<context context-type="linenumber">379</context> <context context-type="linenumber">387</context>
</context-group> </context-group>
<target state="translated">LLM-Backend</target> <target state="translated">LLM-Backend</target>
</trans-unit> </trans-unit>
@@ -13333,7 +13349,7 @@
<source>LLM Model</source> <source>LLM Model</source>
<context-group purpose="location"> <context-group purpose="location">
<context context-type="sourcefile">src/app/data/paperless-config.ts</context> <context context-type="sourcefile">src/app/data/paperless-config.ts</context>
<context context-type="linenumber">387</context> <context context-type="linenumber">395</context>
</context-group> </context-group>
<target state="translated">LLM-Modell</target> <target state="translated">LLM-Modell</target>
</trans-unit> </trans-unit>
@@ -13341,7 +13357,7 @@
<source>LLM API Key</source> <source>LLM API Key</source>
<context-group purpose="location"> <context-group purpose="location">
<context context-type="sourcefile">src/app/data/paperless-config.ts</context> <context context-type="sourcefile">src/app/data/paperless-config.ts</context>
<context context-type="linenumber">394</context> <context context-type="linenumber">402</context>
</context-group> </context-group>
<target state="translated">LLM API-Schlüssel</target> <target state="translated">LLM API-Schlüssel</target>
</trans-unit> </trans-unit>
@@ -13349,7 +13365,7 @@
<source>LLM Endpoint</source> <source>LLM Endpoint</source>
<context-group purpose="location"> <context-group purpose="location">
<context context-type="sourcefile">src/app/data/paperless-config.ts</context> <context context-type="sourcefile">src/app/data/paperless-config.ts</context>
<context context-type="linenumber">401</context> <context context-type="linenumber">409</context>
</context-group> </context-group>
<target state="translated">LLM-Endpunkt</target> <target state="translated">LLM-Endpunkt</target>
</trans-unit> </trans-unit>
@@ -13357,7 +13373,7 @@
<source>LLM Output Language</source> <source>LLM Output Language</source>
<context-group purpose="location"> <context-group purpose="location">
<context context-type="sourcefile">src/app/data/paperless-config.ts</context> <context context-type="sourcefile">src/app/data/paperless-config.ts</context>
<context context-type="linenumber">408</context> <context context-type="linenumber">416</context>
</context-group> </context-group>
<target state="needs-translation">LLM Output Language</target> <target state="needs-translation">LLM Output Language</target>
</trans-unit> </trans-unit>
@@ -13365,7 +13381,7 @@
<source>Language to use for generated AI suggestions. When unset, AI suggestions use the user&apos;s display language if explicitly set.</source> <source>Language to use for generated AI suggestions. When unset, AI suggestions use the user&apos;s display language if explicitly set.</source>
<context-group purpose="location"> <context-group purpose="location">
<context context-type="sourcefile">src/app/data/paperless-config.ts</context> <context context-type="sourcefile">src/app/data/paperless-config.ts</context>
<context context-type="linenumber">412</context> <context context-type="linenumber">420</context>
</context-group> </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="needs-translation">Language to use for generated AI suggestions. When unset, AI suggestions use the user's display language if explicitly set.</target>
</trans-unit> </trans-unit>
@@ -13373,7 +13389,7 @@
<source>LLM Request Timeout</source> <source>LLM Request Timeout</source>
<context-group purpose="location"> <context-group purpose="location">
<context context-type="sourcefile">src/app/data/paperless-config.ts</context> <context context-type="sourcefile">src/app/data/paperless-config.ts</context>
<context context-type="linenumber">416</context> <context context-type="linenumber">424</context>
</context-group> </context-group>
<target state="needs-translation">LLM Request Timeout</target> <target state="needs-translation">LLM Request Timeout</target>
</trans-unit> </trans-unit>
@@ -13381,7 +13397,7 @@
<source>Timeout in seconds for LLM requests.</source> <source>Timeout in seconds for LLM requests.</source>
<context-group purpose="location"> <context-group purpose="location">
<context context-type="sourcefile">src/app/data/paperless-config.ts</context> <context context-type="sourcefile">src/app/data/paperless-config.ts</context>
<context context-type="linenumber">420</context> <context context-type="linenumber">428</context>
</context-group> </context-group>
<target state="needs-translation">Timeout in seconds for LLM requests.</target> <target state="needs-translation">Timeout in seconds for LLM requests.</target>
</trans-unit> </trans-unit>
+84 -68
View File
@@ -571,7 +571,7 @@
<context context-type="sourcefile">src/app/components/admin/config/config.component.html</context> <context context-type="sourcefile">src/app/components/admin/config/config.component.html</context>
<context context-type="linenumber">35</context> <context context-type="linenumber">35</context>
</context-group> </context-group>
<target state="needs-translation">This value overrides <x id="INTERPOLATION" equiv-text="{{option.config_key}}"/>, which is set outside Paperless.</target> <target state="translated">Dieser Wert überschreibt <x id="INTERPOLATION" equiv-text="{{option.config_key}}"/>, der außerhalb von Paperless festgelegt wird.</target>
</trans-unit> </trans-unit>
<trans-unit id="7221396516204435584" datatype="html"> <trans-unit id="7221396516204435584" datatype="html">
<source><x id="INTERPOLATION" equiv-text="{{option.config_key}}"/> is set outside Paperless. Enter a value here to override it.</source> <source><x id="INTERPOLATION" equiv-text="{{option.config_key}}"/> is set outside Paperless. Enter a value here to override it.</source>
@@ -579,7 +579,7 @@
<context context-type="sourcefile">src/app/components/admin/config/config.component.html</context> <context context-type="sourcefile">src/app/components/admin/config/config.component.html</context>
<context context-type="linenumber">37</context> <context context-type="linenumber">37</context>
</context-group> </context-group>
<target state="needs-translation"><x id="INTERPOLATION" equiv-text="{{option.config_key}}"/> is set outside Paperless. Enter a value here to override it.</target> <target state="translated"><x id="INTERPOLATION" equiv-text="{{option.config_key}}"/> ist außerhalb von Paperless festgelegt. Geben Sie hier einen Wert ein, um ihn zu überschreiben.</target>
</trans-unit> </trans-unit>
<trans-unit id="8318849619178340389" datatype="html"> <trans-unit id="8318849619178340389" datatype="html">
<source>Use the externally configured value</source> <source>Use the externally configured value</source>
@@ -587,7 +587,7 @@
<context context-type="sourcefile">src/app/components/admin/config/config.component.html</context> <context context-type="sourcefile">src/app/components/admin/config/config.component.html</context>
<context context-type="linenumber">42</context> <context context-type="linenumber">42</context>
</context-group> </context-group>
<target state="needs-translation">Use the externally configured value</target> <target state="translated">Den extern konfigurierten Wert verwenden</target>
</trans-unit> </trans-unit>
<trans-unit id="6032629623003430385" datatype="html"> <trans-unit id="6032629623003430385" datatype="html">
<source>Reset to external</source> <source>Reset to external</source>
@@ -595,7 +595,7 @@
<context context-type="sourcefile">src/app/components/admin/config/config.component.html</context> <context context-type="sourcefile">src/app/components/admin/config/config.component.html</context>
<context context-type="linenumber">43</context> <context context-type="linenumber">43</context>
</context-group> </context-group>
<target state="needs-translation">Reset to external</target> <target state="translated">Auf extern zurücksetzen</target>
</trans-unit> </trans-unit>
<trans-unit id="7808756054397155068" datatype="html" approved="yes"> <trans-unit id="7808756054397155068" datatype="html" approved="yes">
<source>Reset</source> <source>Reset</source>
@@ -1135,7 +1135,7 @@
<context context-type="sourcefile">src/app/components/admin/settings/settings.component.html</context> <context context-type="sourcefile">src/app/components/admin/settings/settings.component.html</context>
<context context-type="linenumber">115,116</context> <context context-type="linenumber">115,116</context>
</context-group> </context-group>
<target state="needs-translation">Sidebar items to show:</target> <target state="translated">Anzuzeigende Elemente in der Seitenleiste:</target>
</trans-unit> </trans-unit>
<trans-unit id="1356890996281769972" datatype="html" approved="yes"> <trans-unit id="1356890996281769972" datatype="html" approved="yes">
<source>Dark mode</source> <source>Dark mode</source>
@@ -1397,13 +1397,13 @@
</context-group> </context-group>
<target state="final">Posteingangs-Tag(s) beim Speichern automatisch entfernen</target> <target state="final">Posteingangs-Tag(s) beim Speichern automatisch entfernen</target>
</trans-unit> </trans-unit>
<trans-unit id="1043449647727456069" datatype="html"> <trans-unit id="1043449647727456069" datatype="html" approved="yes">
<source>Automatically request suggestions for inbox documents</source> <source>Automatically request suggestions for inbox documents</source>
<context-group purpose="location"> <context-group purpose="location">
<context context-type="sourcefile">src/app/components/admin/settings/settings.component.html</context> <context context-type="sourcefile">src/app/components/admin/settings/settings.component.html</context>
<context context-type="linenumber">258</context> <context context-type="linenumber">258</context>
</context-group> </context-group>
<target state="needs-translation">Automatically request suggestions for inbox documents</target> <target state="final">Automatische Vorschläge für Posteingangsdokumente anfordern</target>
</trans-unit> </trans-unit>
<trans-unit id="460700039378563125" datatype="html"> <trans-unit id="460700039378563125" datatype="html">
<source>If un-checked, suggestions must be requested via the Suggest button.</source> <source>If un-checked, suggestions must be requested via the Suggest button.</source>
@@ -1411,7 +1411,7 @@
<context context-type="sourcefile">src/app/components/admin/settings/settings.component.html</context> <context context-type="sourcefile">src/app/components/admin/settings/settings.component.html</context>
<context context-type="linenumber">258</context> <context context-type="linenumber">258</context>
</context-group> </context-group>
<target state="needs-translation">If un-checked, suggestions must be requested via the Suggest button.</target> <target state="translated">Wenn diese Option nicht aktiviert ist, müssen Vorschläge über die Schaltfläche Vorschläge angefordert werden.</target>
</trans-unit> </trans-unit>
<trans-unit id="8793267604636304297" datatype="html" approved="yes"> <trans-unit id="8793267604636304297" datatype="html" approved="yes">
<source>Show document thumbnail during loading</source> <source>Show document thumbnail during loading</source>
@@ -1607,7 +1607,7 @@
<context context-type="sourcefile">src/app/components/admin/settings/settings.component.html</context> <context context-type="sourcefile">src/app/components/admin/settings/settings.component.html</context>
<context context-type="linenumber">329</context> <context context-type="linenumber">329</context>
</context-group> </context-group>
<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> <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>
<trans-unit id="4292903881380648974" datatype="html" approved="yes"> <trans-unit id="4292903881380648974" datatype="html" approved="yes">
<source>Default Owner</source> <source>Default Owner</source>
@@ -4531,7 +4531,7 @@
<context context-type="sourcefile">src/app/components/common/confirm-dialog/rotate-confirm-dialog/rotate-confirm-dialog.component.html</context> <context context-type="sourcefile">src/app/components/common/confirm-dialog/rotate-confirm-dialog/rotate-confirm-dialog.component.html</context>
<context context-type="linenumber">19</context> <context context-type="linenumber">19</context>
</context-group> </context-group>
<target state="translated">Im Uhrzeigersinn Rotieren</target> <target state="translated">Im Uhrzeigersinn rotieren</target>
</trans-unit> </trans-unit>
<trans-unit id="8157388568390631653" datatype="html" approved="yes"> <trans-unit id="8157388568390631653" datatype="html" approved="yes">
<source>Note that only PDFs will be rotated.</source> <source>Note that only PDFs will be rotated.</source>
@@ -4799,7 +4799,7 @@
<context context-type="sourcefile">src/app/components/common/dates-dropdown/dates-dropdown.component.html</context> <context context-type="sourcefile">src/app/components/common/dates-dropdown/dates-dropdown.component.html</context>
<context context-type="linenumber">12</context> <context context-type="linenumber">12</context>
</context-group> </context-group>
<target state="needs-translation">Clear created relative date</target> <target state="translated">Erstelltes relatives Datum löschen</target>
</trans-unit> </trans-unit>
<trans-unit id="6312759212949884929" datatype="html" approved="yes"> <trans-unit id="6312759212949884929" datatype="html" approved="yes">
<source>Relative dates</source> <source>Relative dates</source>
@@ -4819,7 +4819,7 @@
<context context-type="sourcefile">src/app/components/common/dates-dropdown/dates-dropdown.component.html</context> <context context-type="sourcefile">src/app/components/common/dates-dropdown/dates-dropdown.component.html</context>
<context context-type="linenumber">37</context> <context context-type="linenumber">37</context>
</context-group> </context-group>
<target state="needs-translation">Clear created from date</target> <target state="translated">Erstelltes von Datum löschen</target>
</trans-unit> </trans-unit>
<trans-unit id="5203279511751768967" datatype="html" approved="yes"> <trans-unit id="5203279511751768967" datatype="html" approved="yes">
<source>From</source> <source>From</source>
@@ -4839,7 +4839,7 @@
<context context-type="sourcefile">src/app/components/common/dates-dropdown/dates-dropdown.component.html</context> <context context-type="sourcefile">src/app/components/common/dates-dropdown/dates-dropdown.component.html</context>
<context context-type="linenumber">47</context> <context context-type="linenumber">47</context>
</context-group> </context-group>
<target state="needs-translation">Open created from date picker</target> <target state="translated">Erstellte von Datumsauswahl öffnen</target>
</trans-unit> </trans-unit>
<trans-unit id="5714803496005897828" datatype="html"> <trans-unit id="5714803496005897828" datatype="html">
<source>Clear created to date</source> <source>Clear created to date</source>
@@ -4847,7 +4847,7 @@
<context context-type="sourcefile">src/app/components/common/dates-dropdown/dates-dropdown.component.html</context> <context context-type="sourcefile">src/app/components/common/dates-dropdown/dates-dropdown.component.html</context>
<context context-type="linenumber">61</context> <context context-type="linenumber">61</context>
</context-group> </context-group>
<target state="needs-translation">Clear created to date</target> <target state="translated">Erstellte bis Datumsauswahl löschen</target>
</trans-unit> </trans-unit>
<trans-unit id="1640609344969975994" datatype="html" approved="yes"> <trans-unit id="1640609344969975994" datatype="html" approved="yes">
<source>To</source> <source>To</source>
@@ -4867,7 +4867,7 @@
<context context-type="sourcefile">src/app/components/common/dates-dropdown/dates-dropdown.component.html</context> <context context-type="sourcefile">src/app/components/common/dates-dropdown/dates-dropdown.component.html</context>
<context context-type="linenumber">71</context> <context context-type="linenumber">71</context>
</context-group> </context-group>
<target state="needs-translation">Open created to date picker</target> <target state="translated">Erstellte bis Datumsauswahl öffnen</target>
</trans-unit> </trans-unit>
<trans-unit id="231679111972850796" datatype="html" approved="yes"> <trans-unit id="231679111972850796" datatype="html" approved="yes">
<source>Added</source> <source>Added</source>
@@ -4899,7 +4899,7 @@
<context context-type="sourcefile">src/app/components/common/dates-dropdown/dates-dropdown.component.html</context> <context context-type="sourcefile">src/app/components/common/dates-dropdown/dates-dropdown.component.html</context>
<context context-type="linenumber">89</context> <context context-type="linenumber">89</context>
</context-group> </context-group>
<target state="needs-translation">Clear added relative date</target> <target state="translated">Erstelltes relatives Datum löschen</target>
</trans-unit> </trans-unit>
<trans-unit id="8527347906195580369" datatype="html"> <trans-unit id="8527347906195580369" datatype="html">
<source>Clear added from date</source> <source>Clear added from date</source>
@@ -4907,7 +4907,7 @@
<context context-type="sourcefile">src/app/components/common/dates-dropdown/dates-dropdown.component.html</context> <context context-type="sourcefile">src/app/components/common/dates-dropdown/dates-dropdown.component.html</context>
<context context-type="linenumber">114</context> <context context-type="linenumber">114</context>
</context-group> </context-group>
<target state="needs-translation">Clear added from date</target> <target state="translated">Hinzugefügt von Datum löschen</target>
</trans-unit> </trans-unit>
<trans-unit id="5711531903664147782" datatype="html"> <trans-unit id="5711531903664147782" datatype="html">
<source>Open added from date picker</source> <source>Open added from date picker</source>
@@ -4915,7 +4915,7 @@
<context context-type="sourcefile">src/app/components/common/dates-dropdown/dates-dropdown.component.html</context> <context context-type="sourcefile">src/app/components/common/dates-dropdown/dates-dropdown.component.html</context>
<context context-type="linenumber">124</context> <context context-type="linenumber">124</context>
</context-group> </context-group>
<target state="needs-translation">Open added from date picker</target> <target state="translated">Hinzugefügt von Datumsauswahl öffnen</target>
</trans-unit> </trans-unit>
<trans-unit id="6559691063013749167" datatype="html"> <trans-unit id="6559691063013749167" datatype="html">
<source>Clear added to date</source> <source>Clear added to date</source>
@@ -4923,7 +4923,7 @@
<context context-type="sourcefile">src/app/components/common/dates-dropdown/dates-dropdown.component.html</context> <context context-type="sourcefile">src/app/components/common/dates-dropdown/dates-dropdown.component.html</context>
<context context-type="linenumber">138</context> <context context-type="linenumber">138</context>
</context-group> </context-group>
<target state="needs-translation">Clear added to date</target> <target state="translated">Hinzugefügt bis Datum löschen</target>
</trans-unit> </trans-unit>
<trans-unit id="6072383085349258752" datatype="html"> <trans-unit id="6072383085349258752" datatype="html">
<source>Open added to date picker</source> <source>Open added to date picker</source>
@@ -4931,7 +4931,7 @@
<context context-type="sourcefile">src/app/components/common/dates-dropdown/dates-dropdown.component.html</context> <context context-type="sourcefile">src/app/components/common/dates-dropdown/dates-dropdown.component.html</context>
<context context-type="linenumber">148</context> <context context-type="linenumber">148</context>
</context-group> </context-group>
<target state="needs-translation">Open added to date picker</target> <target state="translated">Hinzugefügt bis Datumsauswahl öffnen</target>
</trans-unit> </trans-unit>
<trans-unit id="6052766076365105714" datatype="html" approved="yes"> <trans-unit id="6052766076365105714" datatype="html" approved="yes">
<source>now</source> <source>now</source>
@@ -5837,13 +5837,13 @@
</context-group> </context-group>
<target state="translated">Fehler beim Abrufen der Korrespondenten</target> <target state="translated">Fehler beim Abrufen der Korrespondenten</target>
</trans-unit> </trans-unit>
<trans-unit id="3407606224361082860" datatype="html"> <trans-unit id="3407606224361082860" datatype="html" approved="yes">
<source>Error retrieving document types</source> <source>Error retrieving document types</source>
<context-group purpose="location"> <context-group purpose="location">
<context context-type="sourcefile">src/app/components/common/edit-dialog/mail-rule-edit-dialog/mail-rule-edit-dialog.component.ts</context> <context context-type="sourcefile">src/app/components/common/edit-dialog/mail-rule-edit-dialog/mail-rule-edit-dialog.component.ts</context>
<context context-type="linenumber">195</context> <context context-type="linenumber">195</context>
</context-group> </context-group>
<target state="needs-translation">Error retrieving document types</target> <target state="final">Fehler beim Abrufen der Dokumenttypen</target>
</trans-unit> </trans-unit>
<trans-unit id="3147349817770432927" datatype="html" approved="yes"> <trans-unit id="3147349817770432927" datatype="html" approved="yes">
<source>Create new mail rule</source> <source>Create new mail rule</source>
@@ -9625,29 +9625,29 @@
</context-group> </context-group>
<target state="translated">Sie haben ungespeicherte Änderungen am Inhalt dieser Version.</target> <target state="translated">Sie haben ungespeicherte Änderungen am Inhalt dieser Version.</target>
</trans-unit> </trans-unit>
<trans-unit id="85184271222513014" datatype="html"> <trans-unit id="85184271222513014" datatype="html" approved="yes">
<source>Switching versions will discard them.</source> <source>Switching versions will discard them.</source>
<context-group purpose="location"> <context-group purpose="location">
<context context-type="sourcefile">src/app/components/document-detail/document-detail.component.ts</context> <context context-type="sourcefile">src/app/components/document-detail/document-detail.component.ts</context>
<context context-type="linenumber">1052</context> <context context-type="linenumber">1052</context>
</context-group> </context-group>
<target state="needs-translation">Switching versions will discard them.</target> <target state="final">Beim Versionswechsel werden diese verworfen.</target>
</trans-unit> </trans-unit>
<trans-unit id="2565707334844767610" datatype="html"> <trans-unit id="2565707334844767610" datatype="html" approved="yes">
<source>Discard and switch</source> <source>Discard and switch</source>
<context-group purpose="location"> <context-group purpose="location">
<context context-type="sourcefile">src/app/components/document-detail/document-detail.component.ts</context> <context context-type="sourcefile">src/app/components/document-detail/document-detail.component.ts</context>
<context context-type="linenumber">1054</context> <context context-type="linenumber">1054</context>
</context-group> </context-group>
<target state="needs-translation">Discard and switch</target> <target state="final">Verwerfen und wechseln</target>
</trans-unit> </trans-unit>
<trans-unit id="2109314380040637387" datatype="html"> <trans-unit id="2109314380040637387" datatype="html" approved="yes">
<source>Save and switch</source> <source>Save and switch</source>
<context-group purpose="location"> <context-group purpose="location">
<context context-type="sourcefile">src/app/components/document-detail/document-detail.component.ts</context> <context context-type="sourcefile">src/app/components/document-detail/document-detail.component.ts</context>
<context context-type="linenumber">1056</context> <context context-type="linenumber">1056</context>
</context-group> </context-group>
<target state="needs-translation">Save and switch</target> <target state="final">Speichern und wechseln</target>
</trans-unit> </trans-unit>
<trans-unit id="3456881259945295697" datatype="html" approved="yes"> <trans-unit id="3456881259945295697" datatype="html" approved="yes">
<source>Error retrieving suggestions.</source> <source>Error retrieving suggestions.</source>
@@ -10740,7 +10740,7 @@
</context-group> </context-group>
<context-group purpose="location"> <context-group purpose="location">
<context context-type="sourcefile">src/app/components/document-list/document-list.component.ts</context> <context context-type="sourcefile">src/app/components/document-list/document-list.component.ts</context>
<context context-type="linenumber">348</context> <context context-type="linenumber">351</context>
</context-group> </context-group>
<context-group purpose="location"> <context-group purpose="location">
<context context-type="sourcefile">src/app/components/manage/document-attributes/document-attributes.component.html</context> <context context-type="sourcefile">src/app/components/manage/document-attributes/document-attributes.component.html</context>
@@ -10756,7 +10756,7 @@
</context-group> </context-group>
<context-group purpose="location"> <context-group purpose="location">
<context context-type="sourcefile">src/app/components/document-list/document-list.component.ts</context> <context context-type="sourcefile">src/app/components/document-list/document-list.component.ts</context>
<context context-type="linenumber">341</context> <context context-type="linenumber">344</context>
</context-group> </context-group>
<context-group purpose="location"> <context-group purpose="location">
<context context-type="sourcefile">src/app/components/manage/document-attributes/document-attributes.component.html</context> <context context-type="sourcefile">src/app/components/manage/document-attributes/document-attributes.component.html</context>
@@ -11040,7 +11040,7 @@
<source>Reset filters / selection</source> <source>Reset filters / selection</source>
<context-group purpose="location"> <context-group purpose="location">
<context context-type="sourcefile">src/app/components/document-list/document-list.component.ts</context> <context context-type="sourcefile">src/app/components/document-list/document-list.component.ts</context>
<context context-type="linenumber">329</context> <context context-type="linenumber">332</context>
</context-group> </context-group>
<target state="final">Filter / Auswahl zurücksetzen</target> <target state="final">Filter / Auswahl zurücksetzen</target>
</trans-unit> </trans-unit>
@@ -11048,7 +11048,7 @@
<source>Open first [selected] document</source> <source>Open first [selected] document</source>
<context-group purpose="location"> <context-group purpose="location">
<context context-type="sourcefile">src/app/components/document-list/document-list.component.ts</context> <context context-type="sourcefile">src/app/components/document-list/document-list.component.ts</context>
<context context-type="linenumber">357</context> <context context-type="linenumber">360</context>
</context-group> </context-group>
<target state="final">Erstes [ausgewähltes] Dokument öffnen</target> <target state="final">Erstes [ausgewähltes] Dokument öffnen</target>
</trans-unit> </trans-unit>
@@ -11056,7 +11056,7 @@
<source>Previous page</source> <source>Previous page</source>
<context-group purpose="location"> <context-group purpose="location">
<context context-type="sourcefile">src/app/components/document-list/document-list.component.ts</context> <context context-type="sourcefile">src/app/components/document-list/document-list.component.ts</context>
<context context-type="linenumber">373</context> <context context-type="linenumber">376</context>
</context-group> </context-group>
<target state="final">Vorherige Seite</target> <target state="final">Vorherige Seite</target>
</trans-unit> </trans-unit>
@@ -11064,7 +11064,7 @@
<source>Next page</source> <source>Next page</source>
<context-group purpose="location"> <context-group purpose="location">
<context context-type="sourcefile">src/app/components/document-list/document-list.component.ts</context> <context context-type="sourcefile">src/app/components/document-list/document-list.component.ts</context>
<context context-type="linenumber">385</context> <context context-type="linenumber">388</context>
</context-group> </context-group>
<target state="final">Nächste Seite</target> <target state="final">Nächste Seite</target>
</trans-unit> </trans-unit>
@@ -11072,7 +11072,7 @@
<source>View &quot;<x id="PH" equiv-text="this.list.activeSavedViewTitle"/>&quot; saved successfully.</source> <source>View &quot;<x id="PH" equiv-text="this.list.activeSavedViewTitle"/>&quot; saved successfully.</source>
<context-group purpose="location"> <context-group purpose="location">
<context context-type="sourcefile">src/app/components/document-list/document-list.component.ts</context> <context context-type="sourcefile">src/app/components/document-list/document-list.component.ts</context>
<context context-type="linenumber">419</context> <context context-type="linenumber">422</context>
</context-group> </context-group>
<target state="final">Ansicht „<x id="PH" equiv-text="this.list.activeSavedViewTitle"/>“ erfolgreich gespeichert.</target> <target state="final">Ansicht „<x id="PH" equiv-text="this.list.activeSavedViewTitle"/>“ erfolgreich gespeichert.</target>
</trans-unit> </trans-unit>
@@ -11080,7 +11080,7 @@
<source>Failed to save view &quot;<x id="PH" equiv-text="this.list.activeSavedViewTitle"/>&quot;.</source> <source>Failed to save view &quot;<x id="PH" equiv-text="this.list.activeSavedViewTitle"/>&quot;.</source>
<context-group purpose="location"> <context-group purpose="location">
<context context-type="sourcefile">src/app/components/document-list/document-list.component.ts</context> <context context-type="sourcefile">src/app/components/document-list/document-list.component.ts</context>
<context context-type="linenumber">425</context> <context context-type="linenumber">428</context>
</context-group> </context-group>
<target state="final">Fehler beim Speichern der Ansicht „<x id="PH" equiv-text="this.list.activeSavedViewTitle"/>“.</target> <target state="final">Fehler beim Speichern der Ansicht „<x id="PH" equiv-text="this.list.activeSavedViewTitle"/>“.</target>
</trans-unit> </trans-unit>
@@ -11088,7 +11088,7 @@
<source>View &quot;<x id="PH" equiv-text="savedView.name"/>&quot; created successfully.</source> <source>View &quot;<x id="PH" equiv-text="savedView.name"/>&quot; created successfully.</source>
<context-group purpose="location"> <context-group purpose="location">
<context context-type="sourcefile">src/app/components/document-list/document-list.component.ts</context> <context context-type="sourcefile">src/app/components/document-list/document-list.component.ts</context>
<context context-type="linenumber">494</context> <context context-type="linenumber">497</context>
</context-group> </context-group>
<target state="final">Ansicht „<x id="PH" equiv-text="savedView.name"/>“ erfolgreich erstellt.</target> <target state="final">Ansicht „<x id="PH" equiv-text="savedView.name"/>“ erfolgreich erstellt.</target>
</trans-unit> </trans-unit>
@@ -11096,7 +11096,7 @@
<source>View &quot;<x id="PH" equiv-text="savedView.name"/>&quot; created successfully, but could not update visibility settings.</source> <source>View &quot;<x id="PH" equiv-text="savedView.name"/>&quot; created successfully, but could not update visibility settings.</source>
<context-group purpose="location"> <context-group purpose="location">
<context context-type="sourcefile">src/app/components/document-list/document-list.component.ts</context> <context context-type="sourcefile">src/app/components/document-list/document-list.component.ts</context>
<context context-type="linenumber">500</context> <context context-type="linenumber">503</context>
</context-group> </context-group>
<target state="translated">Ansicht „<x id="PH" equiv-text="savedView.name"/>“ wurde erfolgreich erstellt, die Sichtbarkeitseinstellungen konnten jedoch nicht aktualisiert werden.</target> <target state="translated">Ansicht „<x id="PH" equiv-text="savedView.name"/>“ wurde erfolgreich erstellt, die Sichtbarkeitseinstellungen konnten jedoch nicht aktualisiert werden.</target>
</trans-unit> </trans-unit>
@@ -12410,7 +12410,7 @@
<context context-type="sourcefile">src/app/components/manage/share-links/share-link-list/share-link-list.component.html</context> <context context-type="sourcefile">src/app/components/manage/share-links/share-link-list/share-link-list.component.html</context>
<context context-type="linenumber">40,41</context> <context context-type="linenumber">40,41</context>
</context-group> </context-group>
<target state="needs-translation">Expired</target> <target state="translated">Abgelaufen</target>
</trans-unit> </trans-unit>
<trans-unit id="2057574872309338088" datatype="html"> <trans-unit id="2057574872309338088" datatype="html">
<source>Copy share link</source> <source>Copy share link</source>
@@ -12454,7 +12454,7 @@
<context context-type="sourcefile">src/app/components/manage/share-links/share-link-bundle-list/share-link-bundle-list.component.html</context> <context context-type="sourcefile">src/app/components/manage/share-links/share-link-bundle-list/share-link-bundle-list.component.html</context>
<context context-type="linenumber">164,165</context> <context context-type="linenumber">164,165</context>
</context-group> </context-group>
<target state="needs-translation">Share link bundles pagination</target> <target state="translated">Freigabelink-Pakete Seitennummerierung</target>
</trans-unit> </trans-unit>
<trans-unit id="1541995860059283227" datatype="html"> <trans-unit id="1541995860059283227" datatype="html">
<source>Failed to load share link bundles.</source> <source>Failed to load share link bundles.</source>
@@ -12510,23 +12510,23 @@
<context context-type="sourcefile">src/app/components/manage/share-links/share-link-list/share-link-list.component.html</context> <context context-type="sourcefile">src/app/components/manage/share-links/share-link-list/share-link-list.component.html</context>
<context context-type="linenumber">7,8</context> <context context-type="linenumber">7,8</context>
</context-group> </context-group>
<target state="needs-translation"> No document share links currently exist. </target> <target state="translated"> Derzeit gibt es keine Dokumenten-Freigabe-Links. </target>
</trans-unit> </trans-unit>
<trans-unit id="894965666917873756" datatype="html"> <trans-unit id="894965666917873756" datatype="html" approved="yes">
<source>Document</source> <source>Document</source>
<context-group purpose="location"> <context-group purpose="location">
<context context-type="sourcefile">src/app/components/manage/share-links/share-link-list/share-link-list.component.html</context> <context context-type="sourcefile">src/app/components/manage/share-links/share-link-list/share-link-list.component.html</context>
<context context-type="linenumber">15,16</context> <context context-type="linenumber">15,16</context>
</context-group> </context-group>
<target state="needs-translation">Document</target> <target state="final">Dokument</target>
</trans-unit> </trans-unit>
<trans-unit id="7420713064779772535" datatype="html"> <trans-unit id="7420713064779772535" datatype="html" approved="yes">
<source>Delete share link</source> <source>Delete share link</source>
<context-group purpose="location"> <context-group purpose="location">
<context context-type="sourcefile">src/app/components/manage/share-links/share-link-list/share-link-list.component.html</context> <context context-type="sourcefile">src/app/components/manage/share-links/share-link-list/share-link-list.component.html</context>
<context context-type="linenumber">75,76</context> <context context-type="linenumber">75,76</context>
</context-group> </context-group>
<target state="needs-translation">Delete share link</target> <target state="final">Freigabelink löschen</target>
</trans-unit> </trans-unit>
<trans-unit id="5198271726831144068" datatype="html"> <trans-unit id="5198271726831144068" datatype="html">
<source>Share links pagination</source> <source>Share links pagination</source>
@@ -12534,39 +12534,39 @@
<context context-type="sourcefile">src/app/components/manage/share-links/share-link-list/share-link-list.component.html</context> <context context-type="sourcefile">src/app/components/manage/share-links/share-link-list/share-link-list.component.html</context>
<context context-type="linenumber">104,105</context> <context context-type="linenumber">104,105</context>
</context-group> </context-group>
<target state="needs-translation">Share links pagination</target> <target state="translated">Freigabelinks-Seitennummerierung</target>
</trans-unit> </trans-unit>
<trans-unit id="2976350639944567244" datatype="html"> <trans-unit id="2976350639944567244" datatype="html" approved="yes">
<source>Failed to load share links.</source> <source>Failed to load share links.</source>
<context-group purpose="location"> <context-group purpose="location">
<context context-type="sourcefile">src/app/components/manage/share-links/share-link-list/share-link-list.component.ts</context> <context context-type="sourcefile">src/app/components/manage/share-links/share-link-list/share-link-list.component.ts</context>
<context context-type="linenumber">105</context> <context context-type="linenumber">105</context>
</context-group> </context-group>
<target state="needs-translation">Failed to load share links.</target> <target state="final">Fehler beim Laden des Freigabelinks.</target>
</trans-unit> </trans-unit>
<trans-unit id="4100863040928608880" datatype="html"> <trans-unit id="4100863040928608880" datatype="html" approved="yes">
<source>Error retrieving share links.</source> <source>Error retrieving share links.</source>
<context-group purpose="location"> <context-group purpose="location">
<context context-type="sourcefile">src/app/components/manage/share-links/share-link-list/share-link-list.component.ts</context> <context context-type="sourcefile">src/app/components/manage/share-links/share-link-list/share-link-list.component.ts</context>
<context context-type="linenumber">107</context> <context context-type="linenumber">107</context>
</context-group> </context-group>
<target state="needs-translation">Error retrieving share links.</target> <target state="final">Fehler beim Abrufen des Freigabelinks.</target>
</trans-unit> </trans-unit>
<trans-unit id="326120283142363299" datatype="html"> <trans-unit id="326120283142363299" datatype="html" approved="yes">
<source>Share link deleted.</source> <source>Share link deleted.</source>
<context-group purpose="location"> <context-group purpose="location">
<context context-type="sourcefile">src/app/components/manage/share-links/share-link-list/share-link-list.component.ts</context> <context context-type="sourcefile">src/app/components/manage/share-links/share-link-list/share-link-list.component.ts</context>
<context context-type="linenumber">154</context> <context context-type="linenumber">154</context>
</context-group> </context-group>
<target state="needs-translation">Share link deleted.</target> <target state="final">Freigabelink gelöscht.</target>
</trans-unit> </trans-unit>
<trans-unit id="4964931417181298145" datatype="html"> <trans-unit id="4964931417181298145" datatype="html" approved="yes">
<source>Error deleting share link.</source> <source>Error deleting share link.</source>
<context-group purpose="location"> <context-group purpose="location">
<context context-type="sourcefile">src/app/components/manage/share-links/share-link-list/share-link-list.component.ts</context> <context context-type="sourcefile">src/app/components/manage/share-links/share-link-list/share-link-list.component.ts</context>
<context context-type="linenumber">159</context> <context context-type="linenumber">159</context>
</context-group> </context-group>
<target state="needs-translation">Error deleting share link.</target> <target state="final">Fehler beim Löschen des Freigabelinks.</target>
</trans-unit> </trans-unit>
<trans-unit id="3439104787814858626" datatype="html"> <trans-unit id="3439104787814858626" datatype="html">
<source>Manage public links to individual documents and document bundles.</source> <source>Manage public links to individual documents and document bundles.</source>
@@ -12582,15 +12582,15 @@
<context context-type="sourcefile">src/app/components/manage/share-links/share-links.component.html</context> <context context-type="sourcefile">src/app/components/manage/share-links/share-links.component.html</context>
<context context-type="linenumber">18,19</context> <context context-type="linenumber">18,19</context>
</context-group> </context-group>
<target state="needs-translation">Document links</target> <target state="translated">Dokumentenlinks</target>
</trans-unit> </trans-unit>
<trans-unit id="8216780576869093031" datatype="html"> <trans-unit id="8216780576869093031" datatype="html" approved="yes">
<source>Bundles</source> <source>Bundles</source>
<context-group purpose="location"> <context-group purpose="location">
<context context-type="sourcefile">src/app/components/manage/share-links/share-links.component.html</context> <context context-type="sourcefile">src/app/components/manage/share-links/share-links.component.html</context>
<context context-type="linenumber">26,27</context> <context context-type="linenumber">26,27</context>
</context-group> </context-group>
<target state="needs-translation">Bundles</target> <target state="final">Pakete</target>
</trans-unit> </trans-unit>
<trans-unit id="1229748338333965418" datatype="html" approved="yes"> <trans-unit id="1229748338333965418" datatype="html" approved="yes">
<source>Use workflows to customize the behavior of Paperless-ngx when events &apos;trigger&apos; a workflow.</source> <source>Use workflows to customize the behavior of Paperless-ngx when events &apos;trigger&apos; a workflow.</source>
@@ -13297,11 +13297,27 @@
</context-group> </context-group>
<target state="translated">LLM-Einbettungsmodell</target> <target state="translated">LLM-Einbettungsmodell</target>
</trans-unit> </trans-unit>
<trans-unit id="861068592166833023" datatype="html">
<source>LLM Embedding API Key</source>
<context-group purpose="location">
<context context-type="sourcefile">src/app/data/paperless-config.ts</context>
<context context-type="linenumber">358</context>
</context-group>
<target state="translated">LLM Einbettungs API Schlüssel</target>
</trans-unit>
<trans-unit id="2929108042259892948" datatype="html">
<source>Used for embeddings when set, otherwise LLM API key is used.</source>
<context-group purpose="location">
<context context-type="sourcefile">src/app/data/paperless-config.ts</context>
<context context-type="linenumber">360</context>
</context-group>
<target state="translated">Wird für Einbettung genutzt, wenn gesetzt, ansonsten wird der LLM API Schlüssel verwendet.</target>
</trans-unit>
<trans-unit id="3554114880473286122" datatype="html"> <trans-unit id="3554114880473286122" datatype="html">
<source>LLM Embedding Endpoint</source> <source>LLM Embedding Endpoint</source>
<context-group purpose="location"> <context-group purpose="location">
<context context-type="sourcefile">src/app/data/paperless-config.ts</context> <context context-type="sourcefile">src/app/data/paperless-config.ts</context>
<context context-type="linenumber">358</context> <context context-type="linenumber">366</context>
</context-group> </context-group>
<target state="translated">LLM-Einbettungsendpunkt</target> <target state="translated">LLM-Einbettungsendpunkt</target>
</trans-unit> </trans-unit>
@@ -13309,7 +13325,7 @@
<source>LLM Embedding Chunk Size</source> <source>LLM Embedding Chunk Size</source>
<context-group purpose="location"> <context-group purpose="location">
<context context-type="sourcefile">src/app/data/paperless-config.ts</context> <context context-type="sourcefile">src/app/data/paperless-config.ts</context>
<context context-type="linenumber">365</context> <context context-type="linenumber">373</context>
</context-group> </context-group>
<target state="translated">LLM-Einbettungschunkgröße</target> <target state="translated">LLM-Einbettungschunkgröße</target>
</trans-unit> </trans-unit>
@@ -13317,7 +13333,7 @@
<source>LLM Context Size</source> <source>LLM Context Size</source>
<context-group purpose="location"> <context-group purpose="location">
<context context-type="sourcefile">src/app/data/paperless-config.ts</context> <context context-type="sourcefile">src/app/data/paperless-config.ts</context>
<context context-type="linenumber">372</context> <context context-type="linenumber">380</context>
</context-group> </context-group>
<target state="translated">LLM-Kontextgröße</target> <target state="translated">LLM-Kontextgröße</target>
</trans-unit> </trans-unit>
@@ -13325,7 +13341,7 @@
<source>LLM Backend</source> <source>LLM Backend</source>
<context-group purpose="location"> <context-group purpose="location">
<context context-type="sourcefile">src/app/data/paperless-config.ts</context> <context context-type="sourcefile">src/app/data/paperless-config.ts</context>
<context context-type="linenumber">379</context> <context context-type="linenumber">387</context>
</context-group> </context-group>
<target state="final">LLM-Backend</target> <target state="final">LLM-Backend</target>
</trans-unit> </trans-unit>
@@ -13333,7 +13349,7 @@
<source>LLM Model</source> <source>LLM Model</source>
<context-group purpose="location"> <context-group purpose="location">
<context context-type="sourcefile">src/app/data/paperless-config.ts</context> <context context-type="sourcefile">src/app/data/paperless-config.ts</context>
<context context-type="linenumber">387</context> <context context-type="linenumber">395</context>
</context-group> </context-group>
<target state="final">LLM-Modell</target> <target state="final">LLM-Modell</target>
</trans-unit> </trans-unit>
@@ -13341,7 +13357,7 @@
<source>LLM API Key</source> <source>LLM API Key</source>
<context-group purpose="location"> <context-group purpose="location">
<context context-type="sourcefile">src/app/data/paperless-config.ts</context> <context context-type="sourcefile">src/app/data/paperless-config.ts</context>
<context context-type="linenumber">394</context> <context context-type="linenumber">402</context>
</context-group> </context-group>
<target state="final">LLM API-Schlüssel</target> <target state="final">LLM API-Schlüssel</target>
</trans-unit> </trans-unit>
@@ -13349,7 +13365,7 @@
<source>LLM Endpoint</source> <source>LLM Endpoint</source>
<context-group purpose="location"> <context-group purpose="location">
<context context-type="sourcefile">src/app/data/paperless-config.ts</context> <context context-type="sourcefile">src/app/data/paperless-config.ts</context>
<context context-type="linenumber">401</context> <context context-type="linenumber">409</context>
</context-group> </context-group>
<target state="final">LLM-Endpunkt</target> <target state="final">LLM-Endpunkt</target>
</trans-unit> </trans-unit>
@@ -13357,7 +13373,7 @@
<source>LLM Output Language</source> <source>LLM Output Language</source>
<context-group purpose="location"> <context-group purpose="location">
<context context-type="sourcefile">src/app/data/paperless-config.ts</context> <context context-type="sourcefile">src/app/data/paperless-config.ts</context>
<context context-type="linenumber">408</context> <context context-type="linenumber">416</context>
</context-group> </context-group>
<target state="translated">LLM-Ausgabesprache</target> <target state="translated">LLM-Ausgabesprache</target>
</trans-unit> </trans-unit>
@@ -13365,7 +13381,7 @@
<source>Language to use for generated AI suggestions. When unset, AI suggestions use the user&apos;s display language if explicitly set.</source> <source>Language to use for generated AI suggestions. When unset, AI suggestions use the user&apos;s display language if explicitly set.</source>
<context-group purpose="location"> <context-group purpose="location">
<context context-type="sourcefile">src/app/data/paperless-config.ts</context> <context context-type="sourcefile">src/app/data/paperless-config.ts</context>
<context context-type="linenumber">412</context> <context context-type="linenumber">420</context>
</context-group> </context-group>
<target state="translated">Sprache, die für KI-Vorschläge verwendet werden soll. Wenn sie nicht gesetzt ist, verwenden KI-Vorschläge die Anzeigesprache des Benutzers, sofern diese explizit festgelegt ist.</target> <target state="translated">Sprache, die für KI-Vorschläge verwendet werden soll. Wenn sie nicht gesetzt ist, verwenden KI-Vorschläge die Anzeigesprache des Benutzers, sofern diese explizit festgelegt ist.</target>
</trans-unit> </trans-unit>
@@ -13373,7 +13389,7 @@
<source>LLM Request Timeout</source> <source>LLM Request Timeout</source>
<context-group purpose="location"> <context-group purpose="location">
<context context-type="sourcefile">src/app/data/paperless-config.ts</context> <context context-type="sourcefile">src/app/data/paperless-config.ts</context>
<context context-type="linenumber">416</context> <context context-type="linenumber">424</context>
</context-group> </context-group>
<target state="translated">LLM-Anfrage Zeitüberschreitung</target> <target state="translated">LLM-Anfrage Zeitüberschreitung</target>
</trans-unit> </trans-unit>
@@ -13381,7 +13397,7 @@
<source>Timeout in seconds for LLM requests.</source> <source>Timeout in seconds for LLM requests.</source>
<context-group purpose="location"> <context-group purpose="location">
<context context-type="sourcefile">src/app/data/paperless-config.ts</context> <context context-type="sourcefile">src/app/data/paperless-config.ts</context>
<context context-type="linenumber">420</context> <context context-type="linenumber">428</context>
</context-group> </context-group>
<target state="translated">Zeiltimit in Sekunden für LLM-Anfragen.</target> <target state="translated">Zeiltimit in Sekunden für LLM-Anfragen.</target>
</trans-unit> </trans-unit>
+37 -21
View File
@@ -10741,7 +10741,7 @@
</context-group> </context-group>
<context-group purpose="location"> <context-group purpose="location">
<context context-type="sourcefile">src/app/components/document-list/document-list.component.ts</context> <context context-type="sourcefile">src/app/components/document-list/document-list.component.ts</context>
<context context-type="linenumber">348</context> <context context-type="linenumber">351</context>
</context-group> </context-group>
<context-group purpose="location"> <context-group purpose="location">
<context context-type="sourcefile">src/app/components/manage/document-attributes/document-attributes.component.html</context> <context context-type="sourcefile">src/app/components/manage/document-attributes/document-attributes.component.html</context>
@@ -10757,7 +10757,7 @@
</context-group> </context-group>
<context-group purpose="location"> <context-group purpose="location">
<context context-type="sourcefile">src/app/components/document-list/document-list.component.ts</context> <context context-type="sourcefile">src/app/components/document-list/document-list.component.ts</context>
<context context-type="linenumber">341</context> <context context-type="linenumber">344</context>
</context-group> </context-group>
<context-group purpose="location"> <context-group purpose="location">
<context context-type="sourcefile">src/app/components/manage/document-attributes/document-attributes.component.html</context> <context context-type="sourcefile">src/app/components/manage/document-attributes/document-attributes.component.html</context>
@@ -11041,7 +11041,7 @@
<source>Reset filters / selection</source> <source>Reset filters / selection</source>
<context-group purpose="location"> <context-group purpose="location">
<context context-type="sourcefile">src/app/components/document-list/document-list.component.ts</context> <context context-type="sourcefile">src/app/components/document-list/document-list.component.ts</context>
<context context-type="linenumber">329</context> <context context-type="linenumber">332</context>
</context-group> </context-group>
<target state="needs-translation">Reset filters / selection</target> <target state="needs-translation">Reset filters / selection</target>
</trans-unit> </trans-unit>
@@ -11049,7 +11049,7 @@
<source>Open first [selected] document</source> <source>Open first [selected] document</source>
<context-group purpose="location"> <context-group purpose="location">
<context context-type="sourcefile">src/app/components/document-list/document-list.component.ts</context> <context context-type="sourcefile">src/app/components/document-list/document-list.component.ts</context>
<context context-type="linenumber">357</context> <context context-type="linenumber">360</context>
</context-group> </context-group>
<target state="needs-translation">Open first [selected] document</target> <target state="needs-translation">Open first [selected] document</target>
</trans-unit> </trans-unit>
@@ -11057,7 +11057,7 @@
<source>Previous page</source> <source>Previous page</source>
<context-group purpose="location"> <context-group purpose="location">
<context context-type="sourcefile">src/app/components/document-list/document-list.component.ts</context> <context context-type="sourcefile">src/app/components/document-list/document-list.component.ts</context>
<context context-type="linenumber">373</context> <context context-type="linenumber">376</context>
</context-group> </context-group>
<target state="needs-translation">Previous page</target> <target state="needs-translation">Previous page</target>
</trans-unit> </trans-unit>
@@ -11065,7 +11065,7 @@
<source>Next page</source> <source>Next page</source>
<context-group purpose="location"> <context-group purpose="location">
<context context-type="sourcefile">src/app/components/document-list/document-list.component.ts</context> <context context-type="sourcefile">src/app/components/document-list/document-list.component.ts</context>
<context context-type="linenumber">385</context> <context context-type="linenumber">388</context>
</context-group> </context-group>
<target state="needs-translation">Next page</target> <target state="needs-translation">Next page</target>
</trans-unit> </trans-unit>
@@ -11073,7 +11073,7 @@
<source>View &quot;<x id="PH" equiv-text="this.list.activeSavedViewTitle"/>&quot; saved successfully.</source> <source>View &quot;<x id="PH" equiv-text="this.list.activeSavedViewTitle"/>&quot; saved successfully.</source>
<context-group purpose="location"> <context-group purpose="location">
<context context-type="sourcefile">src/app/components/document-list/document-list.component.ts</context> <context context-type="sourcefile">src/app/components/document-list/document-list.component.ts</context>
<context context-type="linenumber">419</context> <context context-type="linenumber">422</context>
</context-group> </context-group>
<target state="translated">Η προβολή "<x id="PH" equiv-text="this.list.activeSavedViewTitle"/>" αποθηκεύτηκε επιτυχώς.</target> <target state="translated">Η προβολή "<x id="PH" equiv-text="this.list.activeSavedViewTitle"/>" αποθηκεύτηκε επιτυχώς.</target>
</trans-unit> </trans-unit>
@@ -11081,7 +11081,7 @@
<source>Failed to save view &quot;<x id="PH" equiv-text="this.list.activeSavedViewTitle"/>&quot;.</source> <source>Failed to save view &quot;<x id="PH" equiv-text="this.list.activeSavedViewTitle"/>&quot;.</source>
<context-group purpose="location"> <context-group purpose="location">
<context context-type="sourcefile">src/app/components/document-list/document-list.component.ts</context> <context context-type="sourcefile">src/app/components/document-list/document-list.component.ts</context>
<context context-type="linenumber">425</context> <context context-type="linenumber">428</context>
</context-group> </context-group>
<target state="needs-translation">Failed to save view "<x id="PH" equiv-text="this.list.activeSavedViewTitle"/>".</target> <target state="needs-translation">Failed to save view "<x id="PH" equiv-text="this.list.activeSavedViewTitle"/>".</target>
</trans-unit> </trans-unit>
@@ -11089,7 +11089,7 @@
<source>View &quot;<x id="PH" equiv-text="savedView.name"/>&quot; created successfully.</source> <source>View &quot;<x id="PH" equiv-text="savedView.name"/>&quot; created successfully.</source>
<context-group purpose="location"> <context-group purpose="location">
<context context-type="sourcefile">src/app/components/document-list/document-list.component.ts</context> <context context-type="sourcefile">src/app/components/document-list/document-list.component.ts</context>
<context context-type="linenumber">494</context> <context context-type="linenumber">497</context>
</context-group> </context-group>
<target state="translated">Η προβολή "<x id="PH" equiv-text="savedView.name"/>" δημιουργήθηκε επιτυχώς.</target> <target state="translated">Η προβολή "<x id="PH" equiv-text="savedView.name"/>" δημιουργήθηκε επιτυχώς.</target>
</trans-unit> </trans-unit>
@@ -11097,7 +11097,7 @@
<source>View &quot;<x id="PH" equiv-text="savedView.name"/>&quot; created successfully, but could not update visibility settings.</source> <source>View &quot;<x id="PH" equiv-text="savedView.name"/>&quot; created successfully, but could not update visibility settings.</source>
<context-group purpose="location"> <context-group purpose="location">
<context context-type="sourcefile">src/app/components/document-list/document-list.component.ts</context> <context context-type="sourcefile">src/app/components/document-list/document-list.component.ts</context>
<context context-type="linenumber">500</context> <context context-type="linenumber">503</context>
</context-group> </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="needs-translation">View "<x id="PH" equiv-text="savedView.name"/>" created successfully, but could not update visibility settings.</target>
</trans-unit> </trans-unit>
@@ -13298,11 +13298,27 @@
</context-group> </context-group>
<target state="needs-translation">LLM Embedding Model</target> <target state="needs-translation">LLM Embedding Model</target>
</trans-unit> </trans-unit>
<trans-unit id="861068592166833023" datatype="html">
<source>LLM Embedding API Key</source>
<context-group purpose="location">
<context context-type="sourcefile">src/app/data/paperless-config.ts</context>
<context context-type="linenumber">358</context>
</context-group>
<target state="needs-translation">LLM Embedding API Key</target>
</trans-unit>
<trans-unit id="2929108042259892948" datatype="html">
<source>Used for embeddings when set, otherwise LLM API key is used.</source>
<context-group purpose="location">
<context context-type="sourcefile">src/app/data/paperless-config.ts</context>
<context context-type="linenumber">360</context>
</context-group>
<target state="needs-translation">Used for embeddings when set, otherwise LLM API key is used.</target>
</trans-unit>
<trans-unit id="3554114880473286122" datatype="html"> <trans-unit id="3554114880473286122" datatype="html">
<source>LLM Embedding Endpoint</source> <source>LLM Embedding Endpoint</source>
<context-group purpose="location"> <context-group purpose="location">
<context context-type="sourcefile">src/app/data/paperless-config.ts</context> <context context-type="sourcefile">src/app/data/paperless-config.ts</context>
<context context-type="linenumber">358</context> <context context-type="linenumber">366</context>
</context-group> </context-group>
<target state="needs-translation">LLM Embedding Endpoint</target> <target state="needs-translation">LLM Embedding Endpoint</target>
</trans-unit> </trans-unit>
@@ -13310,7 +13326,7 @@
<source>LLM Embedding Chunk Size</source> <source>LLM Embedding Chunk Size</source>
<context-group purpose="location"> <context-group purpose="location">
<context context-type="sourcefile">src/app/data/paperless-config.ts</context> <context context-type="sourcefile">src/app/data/paperless-config.ts</context>
<context context-type="linenumber">365</context> <context context-type="linenumber">373</context>
</context-group> </context-group>
<target state="needs-translation">LLM Embedding Chunk Size</target> <target state="needs-translation">LLM Embedding Chunk Size</target>
</trans-unit> </trans-unit>
@@ -13318,7 +13334,7 @@
<source>LLM Context Size</source> <source>LLM Context Size</source>
<context-group purpose="location"> <context-group purpose="location">
<context context-type="sourcefile">src/app/data/paperless-config.ts</context> <context context-type="sourcefile">src/app/data/paperless-config.ts</context>
<context context-type="linenumber">372</context> <context context-type="linenumber">380</context>
</context-group> </context-group>
<target state="needs-translation">LLM Context Size</target> <target state="needs-translation">LLM Context Size</target>
</trans-unit> </trans-unit>
@@ -13326,7 +13342,7 @@
<source>LLM Backend</source> <source>LLM Backend</source>
<context-group purpose="location"> <context-group purpose="location">
<context context-type="sourcefile">src/app/data/paperless-config.ts</context> <context context-type="sourcefile">src/app/data/paperless-config.ts</context>
<context context-type="linenumber">379</context> <context context-type="linenumber">387</context>
</context-group> </context-group>
<target state="needs-translation">LLM Backend</target> <target state="needs-translation">LLM Backend</target>
</trans-unit> </trans-unit>
@@ -13334,7 +13350,7 @@
<source>LLM Model</source> <source>LLM Model</source>
<context-group purpose="location"> <context-group purpose="location">
<context context-type="sourcefile">src/app/data/paperless-config.ts</context> <context context-type="sourcefile">src/app/data/paperless-config.ts</context>
<context context-type="linenumber">387</context> <context context-type="linenumber">395</context>
</context-group> </context-group>
<target state="needs-translation">LLM Model</target> <target state="needs-translation">LLM Model</target>
</trans-unit> </trans-unit>
@@ -13342,7 +13358,7 @@
<source>LLM API Key</source> <source>LLM API Key</source>
<context-group purpose="location"> <context-group purpose="location">
<context context-type="sourcefile">src/app/data/paperless-config.ts</context> <context context-type="sourcefile">src/app/data/paperless-config.ts</context>
<context context-type="linenumber">394</context> <context context-type="linenumber">402</context>
</context-group> </context-group>
<target state="needs-translation">LLM API Key</target> <target state="needs-translation">LLM API Key</target>
</trans-unit> </trans-unit>
@@ -13350,7 +13366,7 @@
<source>LLM Endpoint</source> <source>LLM Endpoint</source>
<context-group purpose="location"> <context-group purpose="location">
<context context-type="sourcefile">src/app/data/paperless-config.ts</context> <context context-type="sourcefile">src/app/data/paperless-config.ts</context>
<context context-type="linenumber">401</context> <context context-type="linenumber">409</context>
</context-group> </context-group>
<target state="needs-translation">LLM Endpoint</target> <target state="needs-translation">LLM Endpoint</target>
</trans-unit> </trans-unit>
@@ -13358,7 +13374,7 @@
<source>LLM Output Language</source> <source>LLM Output Language</source>
<context-group purpose="location"> <context-group purpose="location">
<context context-type="sourcefile">src/app/data/paperless-config.ts</context> <context context-type="sourcefile">src/app/data/paperless-config.ts</context>
<context context-type="linenumber">408</context> <context context-type="linenumber">416</context>
</context-group> </context-group>
<target state="needs-translation">LLM Output Language</target> <target state="needs-translation">LLM Output Language</target>
</trans-unit> </trans-unit>
@@ -13366,7 +13382,7 @@
<source>Language to use for generated AI suggestions. When unset, AI suggestions use the user&apos;s display language if explicitly set.</source> <source>Language to use for generated AI suggestions. When unset, AI suggestions use the user&apos;s display language if explicitly set.</source>
<context-group purpose="location"> <context-group purpose="location">
<context context-type="sourcefile">src/app/data/paperless-config.ts</context> <context context-type="sourcefile">src/app/data/paperless-config.ts</context>
<context context-type="linenumber">412</context> <context context-type="linenumber">420</context>
</context-group> </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="needs-translation">Language to use for generated AI suggestions. When unset, AI suggestions use the user's display language if explicitly set.</target>
</trans-unit> </trans-unit>
@@ -13374,7 +13390,7 @@
<source>LLM Request Timeout</source> <source>LLM Request Timeout</source>
<context-group purpose="location"> <context-group purpose="location">
<context context-type="sourcefile">src/app/data/paperless-config.ts</context> <context context-type="sourcefile">src/app/data/paperless-config.ts</context>
<context context-type="linenumber">416</context> <context context-type="linenumber">424</context>
</context-group> </context-group>
<target state="needs-translation">LLM Request Timeout</target> <target state="needs-translation">LLM Request Timeout</target>
</trans-unit> </trans-unit>
@@ -13382,7 +13398,7 @@
<source>Timeout in seconds for LLM requests.</source> <source>Timeout in seconds for LLM requests.</source>
<context-group purpose="location"> <context-group purpose="location">
<context context-type="sourcefile">src/app/data/paperless-config.ts</context> <context context-type="sourcefile">src/app/data/paperless-config.ts</context>
<context context-type="linenumber">420</context> <context context-type="linenumber">428</context>
</context-group> </context-group>
<target state="needs-translation">Timeout in seconds for LLM requests.</target> <target state="needs-translation">Timeout in seconds for LLM requests.</target>
</trans-unit> </trans-unit>
+37 -21
View File
@@ -10741,7 +10741,7 @@
</context-group> </context-group>
<context-group purpose="location"> <context-group purpose="location">
<context context-type="sourcefile">src/app/components/document-list/document-list.component.ts</context> <context context-type="sourcefile">src/app/components/document-list/document-list.component.ts</context>
<context context-type="linenumber">348</context> <context context-type="linenumber">351</context>
</context-group> </context-group>
<context-group purpose="location"> <context-group purpose="location">
<context context-type="sourcefile">src/app/components/manage/document-attributes/document-attributes.component.html</context> <context context-type="sourcefile">src/app/components/manage/document-attributes/document-attributes.component.html</context>
@@ -10757,7 +10757,7 @@
</context-group> </context-group>
<context-group purpose="location"> <context-group purpose="location">
<context context-type="sourcefile">src/app/components/document-list/document-list.component.ts</context> <context context-type="sourcefile">src/app/components/document-list/document-list.component.ts</context>
<context context-type="linenumber">341</context> <context context-type="linenumber">344</context>
</context-group> </context-group>
<context-group purpose="location"> <context-group purpose="location">
<context context-type="sourcefile">src/app/components/manage/document-attributes/document-attributes.component.html</context> <context context-type="sourcefile">src/app/components/manage/document-attributes/document-attributes.component.html</context>
@@ -11041,7 +11041,7 @@
<source>Reset filters / selection</source> <source>Reset filters / selection</source>
<context-group purpose="location"> <context-group purpose="location">
<context context-type="sourcefile">src/app/components/document-list/document-list.component.ts</context> <context context-type="sourcefile">src/app/components/document-list/document-list.component.ts</context>
<context context-type="linenumber">329</context> <context context-type="linenumber">332</context>
</context-group> </context-group>
<target state="translated">Restablecer filtros / selección</target> <target state="translated">Restablecer filtros / selección</target>
</trans-unit> </trans-unit>
@@ -11049,7 +11049,7 @@
<source>Open first [selected] document</source> <source>Open first [selected] document</source>
<context-group purpose="location"> <context-group purpose="location">
<context context-type="sourcefile">src/app/components/document-list/document-list.component.ts</context> <context context-type="sourcefile">src/app/components/document-list/document-list.component.ts</context>
<context context-type="linenumber">357</context> <context context-type="linenumber">360</context>
</context-group> </context-group>
<target state="translated">Abrir primero documento [seleccionado]</target> <target state="translated">Abrir primero documento [seleccionado]</target>
</trans-unit> </trans-unit>
@@ -11057,7 +11057,7 @@
<source>Previous page</source> <source>Previous page</source>
<context-group purpose="location"> <context-group purpose="location">
<context context-type="sourcefile">src/app/components/document-list/document-list.component.ts</context> <context context-type="sourcefile">src/app/components/document-list/document-list.component.ts</context>
<context context-type="linenumber">373</context> <context context-type="linenumber">376</context>
</context-group> </context-group>
<target state="translated">Página anterior</target> <target state="translated">Página anterior</target>
</trans-unit> </trans-unit>
@@ -11065,7 +11065,7 @@
<source>Next page</source> <source>Next page</source>
<context-group purpose="location"> <context-group purpose="location">
<context context-type="sourcefile">src/app/components/document-list/document-list.component.ts</context> <context context-type="sourcefile">src/app/components/document-list/document-list.component.ts</context>
<context context-type="linenumber">385</context> <context context-type="linenumber">388</context>
</context-group> </context-group>
<target state="translated">Página siguiente</target> <target state="translated">Página siguiente</target>
</trans-unit> </trans-unit>
@@ -11073,7 +11073,7 @@
<source>View &quot;<x id="PH" equiv-text="this.list.activeSavedViewTitle"/>&quot; saved successfully.</source> <source>View &quot;<x id="PH" equiv-text="this.list.activeSavedViewTitle"/>&quot; saved successfully.</source>
<context-group purpose="location"> <context-group purpose="location">
<context context-type="sourcefile">src/app/components/document-list/document-list.component.ts</context> <context context-type="sourcefile">src/app/components/document-list/document-list.component.ts</context>
<context context-type="linenumber">419</context> <context context-type="linenumber">422</context>
</context-group> </context-group>
<target state="final">Ver "<x id="PH" equiv-text="this.list.activeSavedViewTitle"/>" guardado satisfactoriamente.</target> <target state="final">Ver "<x id="PH" equiv-text="this.list.activeSavedViewTitle"/>" guardado satisfactoriamente.</target>
</trans-unit> </trans-unit>
@@ -11081,7 +11081,7 @@
<source>Failed to save view &quot;<x id="PH" equiv-text="this.list.activeSavedViewTitle"/>&quot;.</source> <source>Failed to save view &quot;<x id="PH" equiv-text="this.list.activeSavedViewTitle"/>&quot;.</source>
<context-group purpose="location"> <context-group purpose="location">
<context context-type="sourcefile">src/app/components/document-list/document-list.component.ts</context> <context context-type="sourcefile">src/app/components/document-list/document-list.component.ts</context>
<context context-type="linenumber">425</context> <context context-type="linenumber">428</context>
</context-group> </context-group>
<target state="translated">No se pudo guardar la vista "<x id="PH" equiv-text="this.list.activeSavedViewTitle"/>".</target> <target state="translated">No se pudo guardar la vista "<x id="PH" equiv-text="this.list.activeSavedViewTitle"/>".</target>
</trans-unit> </trans-unit>
@@ -11089,7 +11089,7 @@
<source>View &quot;<x id="PH" equiv-text="savedView.name"/>&quot; created successfully.</source> <source>View &quot;<x id="PH" equiv-text="savedView.name"/>&quot; created successfully.</source>
<context-group purpose="location"> <context-group purpose="location">
<context context-type="sourcefile">src/app/components/document-list/document-list.component.ts</context> <context context-type="sourcefile">src/app/components/document-list/document-list.component.ts</context>
<context context-type="linenumber">494</context> <context context-type="linenumber">497</context>
</context-group> </context-group>
<target state="final">Ver "<x id="PH" equiv-text="savedView.name"/>" creado satisfactoriamente.</target> <target state="final">Ver "<x id="PH" equiv-text="savedView.name"/>" creado satisfactoriamente.</target>
</trans-unit> </trans-unit>
@@ -11097,7 +11097,7 @@
<source>View &quot;<x id="PH" equiv-text="savedView.name"/>&quot; created successfully, but could not update visibility settings.</source> <source>View &quot;<x id="PH" equiv-text="savedView.name"/>&quot; created successfully, but could not update visibility settings.</source>
<context-group purpose="location"> <context-group purpose="location">
<context context-type="sourcefile">src/app/components/document-list/document-list.component.ts</context> <context context-type="sourcefile">src/app/components/document-list/document-list.component.ts</context>
<context context-type="linenumber">500</context> <context context-type="linenumber">503</context>
</context-group> </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="needs-translation">View "<x id="PH" equiv-text="savedView.name"/>" created successfully, but could not update visibility settings.</target>
</trans-unit> </trans-unit>
@@ -13298,11 +13298,27 @@
</context-group> </context-group>
<target state="needs-translation">LLM Embedding Model</target> <target state="needs-translation">LLM Embedding Model</target>
</trans-unit> </trans-unit>
<trans-unit id="861068592166833023" datatype="html">
<source>LLM Embedding API Key</source>
<context-group purpose="location">
<context context-type="sourcefile">src/app/data/paperless-config.ts</context>
<context context-type="linenumber">358</context>
</context-group>
<target state="needs-translation">LLM Embedding API Key</target>
</trans-unit>
<trans-unit id="2929108042259892948" datatype="html">
<source>Used for embeddings when set, otherwise LLM API key is used.</source>
<context-group purpose="location">
<context context-type="sourcefile">src/app/data/paperless-config.ts</context>
<context context-type="linenumber">360</context>
</context-group>
<target state="needs-translation">Used for embeddings when set, otherwise LLM API key is used.</target>
</trans-unit>
<trans-unit id="3554114880473286122" datatype="html"> <trans-unit id="3554114880473286122" datatype="html">
<source>LLM Embedding Endpoint</source> <source>LLM Embedding Endpoint</source>
<context-group purpose="location"> <context-group purpose="location">
<context context-type="sourcefile">src/app/data/paperless-config.ts</context> <context context-type="sourcefile">src/app/data/paperless-config.ts</context>
<context context-type="linenumber">358</context> <context context-type="linenumber">366</context>
</context-group> </context-group>
<target state="needs-translation">LLM Embedding Endpoint</target> <target state="needs-translation">LLM Embedding Endpoint</target>
</trans-unit> </trans-unit>
@@ -13310,7 +13326,7 @@
<source>LLM Embedding Chunk Size</source> <source>LLM Embedding Chunk Size</source>
<context-group purpose="location"> <context-group purpose="location">
<context context-type="sourcefile">src/app/data/paperless-config.ts</context> <context context-type="sourcefile">src/app/data/paperless-config.ts</context>
<context context-type="linenumber">365</context> <context context-type="linenumber">373</context>
</context-group> </context-group>
<target state="needs-translation">LLM Embedding Chunk Size</target> <target state="needs-translation">LLM Embedding Chunk Size</target>
</trans-unit> </trans-unit>
@@ -13318,7 +13334,7 @@
<source>LLM Context Size</source> <source>LLM Context Size</source>
<context-group purpose="location"> <context-group purpose="location">
<context context-type="sourcefile">src/app/data/paperless-config.ts</context> <context context-type="sourcefile">src/app/data/paperless-config.ts</context>
<context context-type="linenumber">372</context> <context context-type="linenumber">380</context>
</context-group> </context-group>
<target state="needs-translation">LLM Context Size</target> <target state="needs-translation">LLM Context Size</target>
</trans-unit> </trans-unit>
@@ -13326,7 +13342,7 @@
<source>LLM Backend</source> <source>LLM Backend</source>
<context-group purpose="location"> <context-group purpose="location">
<context context-type="sourcefile">src/app/data/paperless-config.ts</context> <context context-type="sourcefile">src/app/data/paperless-config.ts</context>
<context context-type="linenumber">379</context> <context context-type="linenumber">387</context>
</context-group> </context-group>
<target state="needs-translation">LLM Backend</target> <target state="needs-translation">LLM Backend</target>
</trans-unit> </trans-unit>
@@ -13334,7 +13350,7 @@
<source>LLM Model</source> <source>LLM Model</source>
<context-group purpose="location"> <context-group purpose="location">
<context context-type="sourcefile">src/app/data/paperless-config.ts</context> <context context-type="sourcefile">src/app/data/paperless-config.ts</context>
<context context-type="linenumber">387</context> <context context-type="linenumber">395</context>
</context-group> </context-group>
<target state="needs-translation">LLM Model</target> <target state="needs-translation">LLM Model</target>
</trans-unit> </trans-unit>
@@ -13342,7 +13358,7 @@
<source>LLM API Key</source> <source>LLM API Key</source>
<context-group purpose="location"> <context-group purpose="location">
<context context-type="sourcefile">src/app/data/paperless-config.ts</context> <context context-type="sourcefile">src/app/data/paperless-config.ts</context>
<context context-type="linenumber">394</context> <context context-type="linenumber">402</context>
</context-group> </context-group>
<target state="needs-translation">LLM API Key</target> <target state="needs-translation">LLM API Key</target>
</trans-unit> </trans-unit>
@@ -13350,7 +13366,7 @@
<source>LLM Endpoint</source> <source>LLM Endpoint</source>
<context-group purpose="location"> <context-group purpose="location">
<context context-type="sourcefile">src/app/data/paperless-config.ts</context> <context context-type="sourcefile">src/app/data/paperless-config.ts</context>
<context context-type="linenumber">401</context> <context context-type="linenumber">409</context>
</context-group> </context-group>
<target state="needs-translation">LLM Endpoint</target> <target state="needs-translation">LLM Endpoint</target>
</trans-unit> </trans-unit>
@@ -13358,7 +13374,7 @@
<source>LLM Output Language</source> <source>LLM Output Language</source>
<context-group purpose="location"> <context-group purpose="location">
<context context-type="sourcefile">src/app/data/paperless-config.ts</context> <context context-type="sourcefile">src/app/data/paperless-config.ts</context>
<context context-type="linenumber">408</context> <context context-type="linenumber">416</context>
</context-group> </context-group>
<target state="needs-translation">LLM Output Language</target> <target state="needs-translation">LLM Output Language</target>
</trans-unit> </trans-unit>
@@ -13366,7 +13382,7 @@
<source>Language to use for generated AI suggestions. When unset, AI suggestions use the user&apos;s display language if explicitly set.</source> <source>Language to use for generated AI suggestions. When unset, AI suggestions use the user&apos;s display language if explicitly set.</source>
<context-group purpose="location"> <context-group purpose="location">
<context context-type="sourcefile">src/app/data/paperless-config.ts</context> <context context-type="sourcefile">src/app/data/paperless-config.ts</context>
<context context-type="linenumber">412</context> <context context-type="linenumber">420</context>
</context-group> </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="needs-translation">Language to use for generated AI suggestions. When unset, AI suggestions use the user's display language if explicitly set.</target>
</trans-unit> </trans-unit>
@@ -13374,7 +13390,7 @@
<source>LLM Request Timeout</source> <source>LLM Request Timeout</source>
<context-group purpose="location"> <context-group purpose="location">
<context context-type="sourcefile">src/app/data/paperless-config.ts</context> <context context-type="sourcefile">src/app/data/paperless-config.ts</context>
<context context-type="linenumber">416</context> <context context-type="linenumber">424</context>
</context-group> </context-group>
<target state="needs-translation">LLM Request Timeout</target> <target state="needs-translation">LLM Request Timeout</target>
</trans-unit> </trans-unit>
@@ -13382,7 +13398,7 @@
<source>Timeout in seconds for LLM requests.</source> <source>Timeout in seconds for LLM requests.</source>
<context-group purpose="location"> <context-group purpose="location">
<context context-type="sourcefile">src/app/data/paperless-config.ts</context> <context context-type="sourcefile">src/app/data/paperless-config.ts</context>
<context context-type="linenumber">420</context> <context context-type="linenumber">428</context>
</context-group> </context-group>
<target state="needs-translation">Timeout in seconds for LLM requests.</target> <target state="needs-translation">Timeout in seconds for LLM requests.</target>
</trans-unit> </trans-unit>
+37 -21
View File
@@ -10741,7 +10741,7 @@
</context-group> </context-group>
<context-group purpose="location"> <context-group purpose="location">
<context context-type="sourcefile">src/app/components/document-list/document-list.component.ts</context> <context context-type="sourcefile">src/app/components/document-list/document-list.component.ts</context>
<context context-type="linenumber">348</context> <context context-type="linenumber">351</context>
</context-group> </context-group>
<context-group purpose="location"> <context-group purpose="location">
<context context-type="sourcefile">src/app/components/manage/document-attributes/document-attributes.component.html</context> <context context-type="sourcefile">src/app/components/manage/document-attributes/document-attributes.component.html</context>
@@ -10757,7 +10757,7 @@
</context-group> </context-group>
<context-group purpose="location"> <context-group purpose="location">
<context context-type="sourcefile">src/app/components/document-list/document-list.component.ts</context> <context context-type="sourcefile">src/app/components/document-list/document-list.component.ts</context>
<context context-type="linenumber">341</context> <context context-type="linenumber">344</context>
</context-group> </context-group>
<context-group purpose="location"> <context-group purpose="location">
<context context-type="sourcefile">src/app/components/manage/document-attributes/document-attributes.component.html</context> <context context-type="sourcefile">src/app/components/manage/document-attributes/document-attributes.component.html</context>
@@ -11041,7 +11041,7 @@
<source>Reset filters / selection</source> <source>Reset filters / selection</source>
<context-group purpose="location"> <context-group purpose="location">
<context context-type="sourcefile">src/app/components/document-list/document-list.component.ts</context> <context context-type="sourcefile">src/app/components/document-list/document-list.component.ts</context>
<context context-type="linenumber">329</context> <context context-type="linenumber">332</context>
</context-group> </context-group>
<target state="needs-translation">Reset filters / selection</target> <target state="needs-translation">Reset filters / selection</target>
</trans-unit> </trans-unit>
@@ -11049,7 +11049,7 @@
<source>Open first [selected] document</source> <source>Open first [selected] document</source>
<context-group purpose="location"> <context-group purpose="location">
<context context-type="sourcefile">src/app/components/document-list/document-list.component.ts</context> <context context-type="sourcefile">src/app/components/document-list/document-list.component.ts</context>
<context context-type="linenumber">357</context> <context context-type="linenumber">360</context>
</context-group> </context-group>
<target state="needs-translation">Open first [selected] document</target> <target state="needs-translation">Open first [selected] document</target>
</trans-unit> </trans-unit>
@@ -11057,7 +11057,7 @@
<source>Previous page</source> <source>Previous page</source>
<context-group purpose="location"> <context-group purpose="location">
<context context-type="sourcefile">src/app/components/document-list/document-list.component.ts</context> <context context-type="sourcefile">src/app/components/document-list/document-list.component.ts</context>
<context context-type="linenumber">373</context> <context context-type="linenumber">376</context>
</context-group> </context-group>
<target state="needs-translation">Previous page</target> <target state="needs-translation">Previous page</target>
</trans-unit> </trans-unit>
@@ -11065,7 +11065,7 @@
<source>Next page</source> <source>Next page</source>
<context-group purpose="location"> <context-group purpose="location">
<context context-type="sourcefile">src/app/components/document-list/document-list.component.ts</context> <context context-type="sourcefile">src/app/components/document-list/document-list.component.ts</context>
<context context-type="linenumber">385</context> <context context-type="linenumber">388</context>
</context-group> </context-group>
<target state="needs-translation">Next page</target> <target state="needs-translation">Next page</target>
</trans-unit> </trans-unit>
@@ -11073,7 +11073,7 @@
<source>View &quot;<x id="PH" equiv-text="this.list.activeSavedViewTitle"/>&quot; saved successfully.</source> <source>View &quot;<x id="PH" equiv-text="this.list.activeSavedViewTitle"/>&quot; saved successfully.</source>
<context-group purpose="location"> <context-group purpose="location">
<context context-type="sourcefile">src/app/components/document-list/document-list.component.ts</context> <context context-type="sourcefile">src/app/components/document-list/document-list.component.ts</context>
<context context-type="linenumber">419</context> <context context-type="linenumber">422</context>
</context-group> </context-group>
<target state="needs-translation">View "<x id="PH" equiv-text="this.list.activeSavedViewTitle"/>" saved successfully.</target> <target state="needs-translation">View "<x id="PH" equiv-text="this.list.activeSavedViewTitle"/>" saved successfully.</target>
</trans-unit> </trans-unit>
@@ -11081,7 +11081,7 @@
<source>Failed to save view &quot;<x id="PH" equiv-text="this.list.activeSavedViewTitle"/>&quot;.</source> <source>Failed to save view &quot;<x id="PH" equiv-text="this.list.activeSavedViewTitle"/>&quot;.</source>
<context-group purpose="location"> <context-group purpose="location">
<context context-type="sourcefile">src/app/components/document-list/document-list.component.ts</context> <context context-type="sourcefile">src/app/components/document-list/document-list.component.ts</context>
<context context-type="linenumber">425</context> <context context-type="linenumber">428</context>
</context-group> </context-group>
<target state="needs-translation">Failed to save view "<x id="PH" equiv-text="this.list.activeSavedViewTitle"/>".</target> <target state="needs-translation">Failed to save view "<x id="PH" equiv-text="this.list.activeSavedViewTitle"/>".</target>
</trans-unit> </trans-unit>
@@ -11089,7 +11089,7 @@
<source>View &quot;<x id="PH" equiv-text="savedView.name"/>&quot; created successfully.</source> <source>View &quot;<x id="PH" equiv-text="savedView.name"/>&quot; created successfully.</source>
<context-group purpose="location"> <context-group purpose="location">
<context context-type="sourcefile">src/app/components/document-list/document-list.component.ts</context> <context context-type="sourcefile">src/app/components/document-list/document-list.component.ts</context>
<context context-type="linenumber">494</context> <context context-type="linenumber">497</context>
</context-group> </context-group>
<target state="needs-translation">View "<x id="PH" equiv-text="savedView.name"/>" created successfully.</target> <target state="needs-translation">View "<x id="PH" equiv-text="savedView.name"/>" created successfully.</target>
</trans-unit> </trans-unit>
@@ -11097,7 +11097,7 @@
<source>View &quot;<x id="PH" equiv-text="savedView.name"/>&quot; created successfully, but could not update visibility settings.</source> <source>View &quot;<x id="PH" equiv-text="savedView.name"/>&quot; created successfully, but could not update visibility settings.</source>
<context-group purpose="location"> <context-group purpose="location">
<context context-type="sourcefile">src/app/components/document-list/document-list.component.ts</context> <context context-type="sourcefile">src/app/components/document-list/document-list.component.ts</context>
<context context-type="linenumber">500</context> <context context-type="linenumber">503</context>
</context-group> </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="needs-translation">View "<x id="PH" equiv-text="savedView.name"/>" created successfully, but could not update visibility settings.</target>
</trans-unit> </trans-unit>
@@ -13298,11 +13298,27 @@
</context-group> </context-group>
<target state="needs-translation">LLM Embedding Model</target> <target state="needs-translation">LLM Embedding Model</target>
</trans-unit> </trans-unit>
<trans-unit id="861068592166833023" datatype="html">
<source>LLM Embedding API Key</source>
<context-group purpose="location">
<context context-type="sourcefile">src/app/data/paperless-config.ts</context>
<context context-type="linenumber">358</context>
</context-group>
<target state="needs-translation">LLM Embedding API Key</target>
</trans-unit>
<trans-unit id="2929108042259892948" datatype="html">
<source>Used for embeddings when set, otherwise LLM API key is used.</source>
<context-group purpose="location">
<context context-type="sourcefile">src/app/data/paperless-config.ts</context>
<context context-type="linenumber">360</context>
</context-group>
<target state="needs-translation">Used for embeddings when set, otherwise LLM API key is used.</target>
</trans-unit>
<trans-unit id="3554114880473286122" datatype="html"> <trans-unit id="3554114880473286122" datatype="html">
<source>LLM Embedding Endpoint</source> <source>LLM Embedding Endpoint</source>
<context-group purpose="location"> <context-group purpose="location">
<context context-type="sourcefile">src/app/data/paperless-config.ts</context> <context context-type="sourcefile">src/app/data/paperless-config.ts</context>
<context context-type="linenumber">358</context> <context context-type="linenumber">366</context>
</context-group> </context-group>
<target state="needs-translation">LLM Embedding Endpoint</target> <target state="needs-translation">LLM Embedding Endpoint</target>
</trans-unit> </trans-unit>
@@ -13310,7 +13326,7 @@
<source>LLM Embedding Chunk Size</source> <source>LLM Embedding Chunk Size</source>
<context-group purpose="location"> <context-group purpose="location">
<context context-type="sourcefile">src/app/data/paperless-config.ts</context> <context context-type="sourcefile">src/app/data/paperless-config.ts</context>
<context context-type="linenumber">365</context> <context context-type="linenumber">373</context>
</context-group> </context-group>
<target state="needs-translation">LLM Embedding Chunk Size</target> <target state="needs-translation">LLM Embedding Chunk Size</target>
</trans-unit> </trans-unit>
@@ -13318,7 +13334,7 @@
<source>LLM Context Size</source> <source>LLM Context Size</source>
<context-group purpose="location"> <context-group purpose="location">
<context context-type="sourcefile">src/app/data/paperless-config.ts</context> <context context-type="sourcefile">src/app/data/paperless-config.ts</context>
<context context-type="linenumber">372</context> <context context-type="linenumber">380</context>
</context-group> </context-group>
<target state="needs-translation">LLM Context Size</target> <target state="needs-translation">LLM Context Size</target>
</trans-unit> </trans-unit>
@@ -13326,7 +13342,7 @@
<source>LLM Backend</source> <source>LLM Backend</source>
<context-group purpose="location"> <context-group purpose="location">
<context context-type="sourcefile">src/app/data/paperless-config.ts</context> <context context-type="sourcefile">src/app/data/paperless-config.ts</context>
<context context-type="linenumber">379</context> <context context-type="linenumber">387</context>
</context-group> </context-group>
<target state="needs-translation">LLM Backend</target> <target state="needs-translation">LLM Backend</target>
</trans-unit> </trans-unit>
@@ -13334,7 +13350,7 @@
<source>LLM Model</source> <source>LLM Model</source>
<context-group purpose="location"> <context-group purpose="location">
<context context-type="sourcefile">src/app/data/paperless-config.ts</context> <context context-type="sourcefile">src/app/data/paperless-config.ts</context>
<context context-type="linenumber">387</context> <context context-type="linenumber">395</context>
</context-group> </context-group>
<target state="needs-translation">LLM Model</target> <target state="needs-translation">LLM Model</target>
</trans-unit> </trans-unit>
@@ -13342,7 +13358,7 @@
<source>LLM API Key</source> <source>LLM API Key</source>
<context-group purpose="location"> <context-group purpose="location">
<context context-type="sourcefile">src/app/data/paperless-config.ts</context> <context context-type="sourcefile">src/app/data/paperless-config.ts</context>
<context context-type="linenumber">394</context> <context context-type="linenumber">402</context>
</context-group> </context-group>
<target state="needs-translation">LLM API Key</target> <target state="needs-translation">LLM API Key</target>
</trans-unit> </trans-unit>
@@ -13350,7 +13366,7 @@
<source>LLM Endpoint</source> <source>LLM Endpoint</source>
<context-group purpose="location"> <context-group purpose="location">
<context context-type="sourcefile">src/app/data/paperless-config.ts</context> <context context-type="sourcefile">src/app/data/paperless-config.ts</context>
<context context-type="linenumber">401</context> <context context-type="linenumber">409</context>
</context-group> </context-group>
<target state="needs-translation">LLM Endpoint</target> <target state="needs-translation">LLM Endpoint</target>
</trans-unit> </trans-unit>
@@ -13358,7 +13374,7 @@
<source>LLM Output Language</source> <source>LLM Output Language</source>
<context-group purpose="location"> <context-group purpose="location">
<context context-type="sourcefile">src/app/data/paperless-config.ts</context> <context context-type="sourcefile">src/app/data/paperless-config.ts</context>
<context context-type="linenumber">408</context> <context context-type="linenumber">416</context>
</context-group> </context-group>
<target state="needs-translation">LLM Output Language</target> <target state="needs-translation">LLM Output Language</target>
</trans-unit> </trans-unit>
@@ -13366,7 +13382,7 @@
<source>Language to use for generated AI suggestions. When unset, AI suggestions use the user&apos;s display language if explicitly set.</source> <source>Language to use for generated AI suggestions. When unset, AI suggestions use the user&apos;s display language if explicitly set.</source>
<context-group purpose="location"> <context-group purpose="location">
<context context-type="sourcefile">src/app/data/paperless-config.ts</context> <context context-type="sourcefile">src/app/data/paperless-config.ts</context>
<context context-type="linenumber">412</context> <context context-type="linenumber">420</context>
</context-group> </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="needs-translation">Language to use for generated AI suggestions. When unset, AI suggestions use the user's display language if explicitly set.</target>
</trans-unit> </trans-unit>
@@ -13374,7 +13390,7 @@
<source>LLM Request Timeout</source> <source>LLM Request Timeout</source>
<context-group purpose="location"> <context-group purpose="location">
<context context-type="sourcefile">src/app/data/paperless-config.ts</context> <context context-type="sourcefile">src/app/data/paperless-config.ts</context>
<context context-type="linenumber">416</context> <context context-type="linenumber">424</context>
</context-group> </context-group>
<target state="needs-translation">LLM Request Timeout</target> <target state="needs-translation">LLM Request Timeout</target>
</trans-unit> </trans-unit>
@@ -13382,7 +13398,7 @@
<source>Timeout in seconds for LLM requests.</source> <source>Timeout in seconds for LLM requests.</source>
<context-group purpose="location"> <context-group purpose="location">
<context context-type="sourcefile">src/app/data/paperless-config.ts</context> <context context-type="sourcefile">src/app/data/paperless-config.ts</context>
<context context-type="linenumber">420</context> <context context-type="linenumber">428</context>
</context-group> </context-group>
<target state="needs-translation">Timeout in seconds for LLM requests.</target> <target state="needs-translation">Timeout in seconds for LLM requests.</target>
</trans-unit> </trans-unit>
+37 -21
View File
@@ -10741,7 +10741,7 @@
</context-group> </context-group>
<context-group purpose="location"> <context-group purpose="location">
<context context-type="sourcefile">src/app/components/document-list/document-list.component.ts</context> <context context-type="sourcefile">src/app/components/document-list/document-list.component.ts</context>
<context context-type="linenumber">348</context> <context context-type="linenumber">351</context>
</context-group> </context-group>
<context-group purpose="location"> <context-group purpose="location">
<context context-type="sourcefile">src/app/components/manage/document-attributes/document-attributes.component.html</context> <context context-type="sourcefile">src/app/components/manage/document-attributes/document-attributes.component.html</context>
@@ -10757,7 +10757,7 @@
</context-group> </context-group>
<context-group purpose="location"> <context-group purpose="location">
<context context-type="sourcefile">src/app/components/document-list/document-list.component.ts</context> <context context-type="sourcefile">src/app/components/document-list/document-list.component.ts</context>
<context context-type="linenumber">341</context> <context context-type="linenumber">344</context>
</context-group> </context-group>
<context-group purpose="location"> <context-group purpose="location">
<context context-type="sourcefile">src/app/components/manage/document-attributes/document-attributes.component.html</context> <context context-type="sourcefile">src/app/components/manage/document-attributes/document-attributes.component.html</context>
@@ -11041,7 +11041,7 @@
<source>Reset filters / selection</source> <source>Reset filters / selection</source>
<context-group purpose="location"> <context-group purpose="location">
<context context-type="sourcefile">src/app/components/document-list/document-list.component.ts</context> <context context-type="sourcefile">src/app/components/document-list/document-list.component.ts</context>
<context context-type="linenumber">329</context> <context context-type="linenumber">332</context>
</context-group> </context-group>
<target state="translated">تنظیم مجدد فیلترها / انتخاب</target> <target state="translated">تنظیم مجدد فیلترها / انتخاب</target>
</trans-unit> </trans-unit>
@@ -11049,7 +11049,7 @@
<source>Open first [selected] document</source> <source>Open first [selected] document</source>
<context-group purpose="location"> <context-group purpose="location">
<context context-type="sourcefile">src/app/components/document-list/document-list.component.ts</context> <context context-type="sourcefile">src/app/components/document-list/document-list.component.ts</context>
<context context-type="linenumber">357</context> <context context-type="linenumber">360</context>
</context-group> </context-group>
<target state="translated">اولین سند [انتخاب شده] را باز کنید</target> <target state="translated">اولین سند [انتخاب شده] را باز کنید</target>
</trans-unit> </trans-unit>
@@ -11057,7 +11057,7 @@
<source>Previous page</source> <source>Previous page</source>
<context-group purpose="location"> <context-group purpose="location">
<context context-type="sourcefile">src/app/components/document-list/document-list.component.ts</context> <context context-type="sourcefile">src/app/components/document-list/document-list.component.ts</context>
<context context-type="linenumber">373</context> <context context-type="linenumber">376</context>
</context-group> </context-group>
<target state="translated">صفحه قبلی</target> <target state="translated">صفحه قبلی</target>
</trans-unit> </trans-unit>
@@ -11065,7 +11065,7 @@
<source>Next page</source> <source>Next page</source>
<context-group purpose="location"> <context-group purpose="location">
<context context-type="sourcefile">src/app/components/document-list/document-list.component.ts</context> <context context-type="sourcefile">src/app/components/document-list/document-list.component.ts</context>
<context context-type="linenumber">385</context> <context context-type="linenumber">388</context>
</context-group> </context-group>
<target state="translated">صفحه بعدی</target> <target state="translated">صفحه بعدی</target>
</trans-unit> </trans-unit>
@@ -11073,7 +11073,7 @@
<source>View &quot;<x id="PH" equiv-text="this.list.activeSavedViewTitle"/>&quot; saved successfully.</source> <source>View &quot;<x id="PH" equiv-text="this.list.activeSavedViewTitle"/>&quot; saved successfully.</source>
<context-group purpose="location"> <context-group purpose="location">
<context context-type="sourcefile">src/app/components/document-list/document-list.component.ts</context> <context context-type="sourcefile">src/app/components/document-list/document-list.component.ts</context>
<context context-type="linenumber">419</context> <context context-type="linenumber">422</context>
</context-group> </context-group>
<target state="needs-translation">View "<x id="PH" equiv-text="this.list.activeSavedViewTitle"/>" saved successfully.</target> <target state="needs-translation">View "<x id="PH" equiv-text="this.list.activeSavedViewTitle"/>" saved successfully.</target>
</trans-unit> </trans-unit>
@@ -11081,7 +11081,7 @@
<source>Failed to save view &quot;<x id="PH" equiv-text="this.list.activeSavedViewTitle"/>&quot;.</source> <source>Failed to save view &quot;<x id="PH" equiv-text="this.list.activeSavedViewTitle"/>&quot;.</source>
<context-group purpose="location"> <context-group purpose="location">
<context context-type="sourcefile">src/app/components/document-list/document-list.component.ts</context> <context context-type="sourcefile">src/app/components/document-list/document-list.component.ts</context>
<context context-type="linenumber">425</context> <context context-type="linenumber">428</context>
</context-group> </context-group>
<target state="needs-translation">Failed to save view "<x id="PH" equiv-text="this.list.activeSavedViewTitle"/>".</target> <target state="needs-translation">Failed to save view "<x id="PH" equiv-text="this.list.activeSavedViewTitle"/>".</target>
</trans-unit> </trans-unit>
@@ -11089,7 +11089,7 @@
<source>View &quot;<x id="PH" equiv-text="savedView.name"/>&quot; created successfully.</source> <source>View &quot;<x id="PH" equiv-text="savedView.name"/>&quot; created successfully.</source>
<context-group purpose="location"> <context-group purpose="location">
<context context-type="sourcefile">src/app/components/document-list/document-list.component.ts</context> <context context-type="sourcefile">src/app/components/document-list/document-list.component.ts</context>
<context context-type="linenumber">494</context> <context context-type="linenumber">497</context>
</context-group> </context-group>
<target state="needs-translation">View "<x id="PH" equiv-text="savedView.name"/>" created successfully.</target> <target state="needs-translation">View "<x id="PH" equiv-text="savedView.name"/>" created successfully.</target>
</trans-unit> </trans-unit>
@@ -11097,7 +11097,7 @@
<source>View &quot;<x id="PH" equiv-text="savedView.name"/>&quot; created successfully, but could not update visibility settings.</source> <source>View &quot;<x id="PH" equiv-text="savedView.name"/>&quot; created successfully, but could not update visibility settings.</source>
<context-group purpose="location"> <context-group purpose="location">
<context context-type="sourcefile">src/app/components/document-list/document-list.component.ts</context> <context context-type="sourcefile">src/app/components/document-list/document-list.component.ts</context>
<context context-type="linenumber">500</context> <context context-type="linenumber">503</context>
</context-group> </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="needs-translation">View "<x id="PH" equiv-text="savedView.name"/>" created successfully, but could not update visibility settings.</target>
</trans-unit> </trans-unit>
@@ -13298,11 +13298,27 @@
</context-group> </context-group>
<target state="needs-translation">LLM Embedding Model</target> <target state="needs-translation">LLM Embedding Model</target>
</trans-unit> </trans-unit>
<trans-unit id="861068592166833023" datatype="html">
<source>LLM Embedding API Key</source>
<context-group purpose="location">
<context context-type="sourcefile">src/app/data/paperless-config.ts</context>
<context context-type="linenumber">358</context>
</context-group>
<target state="needs-translation">LLM Embedding API Key</target>
</trans-unit>
<trans-unit id="2929108042259892948" datatype="html">
<source>Used for embeddings when set, otherwise LLM API key is used.</source>
<context-group purpose="location">
<context context-type="sourcefile">src/app/data/paperless-config.ts</context>
<context context-type="linenumber">360</context>
</context-group>
<target state="needs-translation">Used for embeddings when set, otherwise LLM API key is used.</target>
</trans-unit>
<trans-unit id="3554114880473286122" datatype="html"> <trans-unit id="3554114880473286122" datatype="html">
<source>LLM Embedding Endpoint</source> <source>LLM Embedding Endpoint</source>
<context-group purpose="location"> <context-group purpose="location">
<context context-type="sourcefile">src/app/data/paperless-config.ts</context> <context context-type="sourcefile">src/app/data/paperless-config.ts</context>
<context context-type="linenumber">358</context> <context context-type="linenumber">366</context>
</context-group> </context-group>
<target state="needs-translation">LLM Embedding Endpoint</target> <target state="needs-translation">LLM Embedding Endpoint</target>
</trans-unit> </trans-unit>
@@ -13310,7 +13326,7 @@
<source>LLM Embedding Chunk Size</source> <source>LLM Embedding Chunk Size</source>
<context-group purpose="location"> <context-group purpose="location">
<context context-type="sourcefile">src/app/data/paperless-config.ts</context> <context context-type="sourcefile">src/app/data/paperless-config.ts</context>
<context context-type="linenumber">365</context> <context context-type="linenumber">373</context>
</context-group> </context-group>
<target state="needs-translation">LLM Embedding Chunk Size</target> <target state="needs-translation">LLM Embedding Chunk Size</target>
</trans-unit> </trans-unit>
@@ -13318,7 +13334,7 @@
<source>LLM Context Size</source> <source>LLM Context Size</source>
<context-group purpose="location"> <context-group purpose="location">
<context context-type="sourcefile">src/app/data/paperless-config.ts</context> <context context-type="sourcefile">src/app/data/paperless-config.ts</context>
<context context-type="linenumber">372</context> <context context-type="linenumber">380</context>
</context-group> </context-group>
<target state="needs-translation">LLM Context Size</target> <target state="needs-translation">LLM Context Size</target>
</trans-unit> </trans-unit>
@@ -13326,7 +13342,7 @@
<source>LLM Backend</source> <source>LLM Backend</source>
<context-group purpose="location"> <context-group purpose="location">
<context context-type="sourcefile">src/app/data/paperless-config.ts</context> <context context-type="sourcefile">src/app/data/paperless-config.ts</context>
<context context-type="linenumber">379</context> <context context-type="linenumber">387</context>
</context-group> </context-group>
<target state="needs-translation">LLM Backend</target> <target state="needs-translation">LLM Backend</target>
</trans-unit> </trans-unit>
@@ -13334,7 +13350,7 @@
<source>LLM Model</source> <source>LLM Model</source>
<context-group purpose="location"> <context-group purpose="location">
<context context-type="sourcefile">src/app/data/paperless-config.ts</context> <context context-type="sourcefile">src/app/data/paperless-config.ts</context>
<context context-type="linenumber">387</context> <context context-type="linenumber">395</context>
</context-group> </context-group>
<target state="needs-translation">LLM Model</target> <target state="needs-translation">LLM Model</target>
</trans-unit> </trans-unit>
@@ -13342,7 +13358,7 @@
<source>LLM API Key</source> <source>LLM API Key</source>
<context-group purpose="location"> <context-group purpose="location">
<context context-type="sourcefile">src/app/data/paperless-config.ts</context> <context context-type="sourcefile">src/app/data/paperless-config.ts</context>
<context context-type="linenumber">394</context> <context context-type="linenumber">402</context>
</context-group> </context-group>
<target state="needs-translation">LLM API Key</target> <target state="needs-translation">LLM API Key</target>
</trans-unit> </trans-unit>
@@ -13350,7 +13366,7 @@
<source>LLM Endpoint</source> <source>LLM Endpoint</source>
<context-group purpose="location"> <context-group purpose="location">
<context context-type="sourcefile">src/app/data/paperless-config.ts</context> <context context-type="sourcefile">src/app/data/paperless-config.ts</context>
<context context-type="linenumber">401</context> <context context-type="linenumber">409</context>
</context-group> </context-group>
<target state="needs-translation">LLM Endpoint</target> <target state="needs-translation">LLM Endpoint</target>
</trans-unit> </trans-unit>
@@ -13358,7 +13374,7 @@
<source>LLM Output Language</source> <source>LLM Output Language</source>
<context-group purpose="location"> <context-group purpose="location">
<context context-type="sourcefile">src/app/data/paperless-config.ts</context> <context context-type="sourcefile">src/app/data/paperless-config.ts</context>
<context context-type="linenumber">408</context> <context context-type="linenumber">416</context>
</context-group> </context-group>
<target state="needs-translation">LLM Output Language</target> <target state="needs-translation">LLM Output Language</target>
</trans-unit> </trans-unit>
@@ -13366,7 +13382,7 @@
<source>Language to use for generated AI suggestions. When unset, AI suggestions use the user&apos;s display language if explicitly set.</source> <source>Language to use for generated AI suggestions. When unset, AI suggestions use the user&apos;s display language if explicitly set.</source>
<context-group purpose="location"> <context-group purpose="location">
<context context-type="sourcefile">src/app/data/paperless-config.ts</context> <context context-type="sourcefile">src/app/data/paperless-config.ts</context>
<context context-type="linenumber">412</context> <context context-type="linenumber">420</context>
</context-group> </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="needs-translation">Language to use for generated AI suggestions. When unset, AI suggestions use the user's display language if explicitly set.</target>
</trans-unit> </trans-unit>
@@ -13374,7 +13390,7 @@
<source>LLM Request Timeout</source> <source>LLM Request Timeout</source>
<context-group purpose="location"> <context-group purpose="location">
<context context-type="sourcefile">src/app/data/paperless-config.ts</context> <context context-type="sourcefile">src/app/data/paperless-config.ts</context>
<context context-type="linenumber">416</context> <context context-type="linenumber">424</context>
</context-group> </context-group>
<target state="needs-translation">LLM Request Timeout</target> <target state="needs-translation">LLM Request Timeout</target>
</trans-unit> </trans-unit>
@@ -13382,7 +13398,7 @@
<source>Timeout in seconds for LLM requests.</source> <source>Timeout in seconds for LLM requests.</source>
<context-group purpose="location"> <context-group purpose="location">
<context context-type="sourcefile">src/app/data/paperless-config.ts</context> <context context-type="sourcefile">src/app/data/paperless-config.ts</context>
<context context-type="linenumber">420</context> <context context-type="linenumber">428</context>
</context-group> </context-group>
<target state="needs-translation">Timeout in seconds for LLM requests.</target> <target state="needs-translation">Timeout in seconds for LLM requests.</target>
</trans-unit> </trans-unit>
+37 -21
View File
@@ -10741,7 +10741,7 @@
</context-group> </context-group>
<context-group purpose="location"> <context-group purpose="location">
<context context-type="sourcefile">src/app/components/document-list/document-list.component.ts</context> <context context-type="sourcefile">src/app/components/document-list/document-list.component.ts</context>
<context context-type="linenumber">348</context> <context context-type="linenumber">351</context>
</context-group> </context-group>
<context-group purpose="location"> <context-group purpose="location">
<context context-type="sourcefile">src/app/components/manage/document-attributes/document-attributes.component.html</context> <context context-type="sourcefile">src/app/components/manage/document-attributes/document-attributes.component.html</context>
@@ -10757,7 +10757,7 @@
</context-group> </context-group>
<context-group purpose="location"> <context-group purpose="location">
<context context-type="sourcefile">src/app/components/document-list/document-list.component.ts</context> <context context-type="sourcefile">src/app/components/document-list/document-list.component.ts</context>
<context context-type="linenumber">341</context> <context context-type="linenumber">344</context>
</context-group> </context-group>
<context-group purpose="location"> <context-group purpose="location">
<context context-type="sourcefile">src/app/components/manage/document-attributes/document-attributes.component.html</context> <context context-type="sourcefile">src/app/components/manage/document-attributes/document-attributes.component.html</context>
@@ -11041,7 +11041,7 @@
<source>Reset filters / selection</source> <source>Reset filters / selection</source>
<context-group purpose="location"> <context-group purpose="location">
<context context-type="sourcefile">src/app/components/document-list/document-list.component.ts</context> <context context-type="sourcefile">src/app/components/document-list/document-list.component.ts</context>
<context context-type="linenumber">329</context> <context context-type="linenumber">332</context>
</context-group> </context-group>
<target state="translated">Nollaa suodattimet / valinta</target> <target state="translated">Nollaa suodattimet / valinta</target>
</trans-unit> </trans-unit>
@@ -11049,7 +11049,7 @@
<source>Open first [selected] document</source> <source>Open first [selected] document</source>
<context-group purpose="location"> <context-group purpose="location">
<context context-type="sourcefile">src/app/components/document-list/document-list.component.ts</context> <context context-type="sourcefile">src/app/components/document-list/document-list.component.ts</context>
<context context-type="linenumber">357</context> <context context-type="linenumber">360</context>
</context-group> </context-group>
<target state="needs-translation">Open first [selected] document</target> <target state="needs-translation">Open first [selected] document</target>
</trans-unit> </trans-unit>
@@ -11057,7 +11057,7 @@
<source>Previous page</source> <source>Previous page</source>
<context-group purpose="location"> <context-group purpose="location">
<context context-type="sourcefile">src/app/components/document-list/document-list.component.ts</context> <context context-type="sourcefile">src/app/components/document-list/document-list.component.ts</context>
<context context-type="linenumber">373</context> <context context-type="linenumber">376</context>
</context-group> </context-group>
<target state="translated">Edellinen sivu</target> <target state="translated">Edellinen sivu</target>
</trans-unit> </trans-unit>
@@ -11065,7 +11065,7 @@
<source>Next page</source> <source>Next page</source>
<context-group purpose="location"> <context-group purpose="location">
<context context-type="sourcefile">src/app/components/document-list/document-list.component.ts</context> <context context-type="sourcefile">src/app/components/document-list/document-list.component.ts</context>
<context context-type="linenumber">385</context> <context context-type="linenumber">388</context>
</context-group> </context-group>
<target state="translated">Seuraava sivu</target> <target state="translated">Seuraava sivu</target>
</trans-unit> </trans-unit>
@@ -11073,7 +11073,7 @@
<source>View &quot;<x id="PH" equiv-text="this.list.activeSavedViewTitle"/>&quot; saved successfully.</source> <source>View &quot;<x id="PH" equiv-text="this.list.activeSavedViewTitle"/>&quot; saved successfully.</source>
<context-group purpose="location"> <context-group purpose="location">
<context context-type="sourcefile">src/app/components/document-list/document-list.component.ts</context> <context context-type="sourcefile">src/app/components/document-list/document-list.component.ts</context>
<context context-type="linenumber">419</context> <context context-type="linenumber">422</context>
</context-group> </context-group>
<target state="translated">Näkymä "<x id="PH" equiv-text="this.list.activeSavedViewTitle"/>" tallennettu onnistuneesti.</target> <target state="translated">Näkymä "<x id="PH" equiv-text="this.list.activeSavedViewTitle"/>" tallennettu onnistuneesti.</target>
</trans-unit> </trans-unit>
@@ -11081,7 +11081,7 @@
<source>Failed to save view &quot;<x id="PH" equiv-text="this.list.activeSavedViewTitle"/>&quot;.</source> <source>Failed to save view &quot;<x id="PH" equiv-text="this.list.activeSavedViewTitle"/>&quot;.</source>
<context-group purpose="location"> <context-group purpose="location">
<context context-type="sourcefile">src/app/components/document-list/document-list.component.ts</context> <context context-type="sourcefile">src/app/components/document-list/document-list.component.ts</context>
<context context-type="linenumber">425</context> <context context-type="linenumber">428</context>
</context-group> </context-group>
<target state="needs-translation">Failed to save view "<x id="PH" equiv-text="this.list.activeSavedViewTitle"/>".</target> <target state="needs-translation">Failed to save view "<x id="PH" equiv-text="this.list.activeSavedViewTitle"/>".</target>
</trans-unit> </trans-unit>
@@ -11089,7 +11089,7 @@
<source>View &quot;<x id="PH" equiv-text="savedView.name"/>&quot; created successfully.</source> <source>View &quot;<x id="PH" equiv-text="savedView.name"/>&quot; created successfully.</source>
<context-group purpose="location"> <context-group purpose="location">
<context context-type="sourcefile">src/app/components/document-list/document-list.component.ts</context> <context context-type="sourcefile">src/app/components/document-list/document-list.component.ts</context>
<context context-type="linenumber">494</context> <context context-type="linenumber">497</context>
</context-group> </context-group>
<target state="translated">Näkymä "<x id="PH" equiv-text="savedView.name"/>" luotu onnistuneesti.</target> <target state="translated">Näkymä "<x id="PH" equiv-text="savedView.name"/>" luotu onnistuneesti.</target>
</trans-unit> </trans-unit>
@@ -11097,7 +11097,7 @@
<source>View &quot;<x id="PH" equiv-text="savedView.name"/>&quot; created successfully, but could not update visibility settings.</source> <source>View &quot;<x id="PH" equiv-text="savedView.name"/>&quot; created successfully, but could not update visibility settings.</source>
<context-group purpose="location"> <context-group purpose="location">
<context context-type="sourcefile">src/app/components/document-list/document-list.component.ts</context> <context context-type="sourcefile">src/app/components/document-list/document-list.component.ts</context>
<context context-type="linenumber">500</context> <context context-type="linenumber">503</context>
</context-group> </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="needs-translation">View "<x id="PH" equiv-text="savedView.name"/>" created successfully, but could not update visibility settings.</target>
</trans-unit> </trans-unit>
@@ -13298,11 +13298,27 @@
</context-group> </context-group>
<target state="needs-translation">LLM Embedding Model</target> <target state="needs-translation">LLM Embedding Model</target>
</trans-unit> </trans-unit>
<trans-unit id="861068592166833023" datatype="html">
<source>LLM Embedding API Key</source>
<context-group purpose="location">
<context context-type="sourcefile">src/app/data/paperless-config.ts</context>
<context context-type="linenumber">358</context>
</context-group>
<target state="needs-translation">LLM Embedding API Key</target>
</trans-unit>
<trans-unit id="2929108042259892948" datatype="html">
<source>Used for embeddings when set, otherwise LLM API key is used.</source>
<context-group purpose="location">
<context context-type="sourcefile">src/app/data/paperless-config.ts</context>
<context context-type="linenumber">360</context>
</context-group>
<target state="needs-translation">Used for embeddings when set, otherwise LLM API key is used.</target>
</trans-unit>
<trans-unit id="3554114880473286122" datatype="html"> <trans-unit id="3554114880473286122" datatype="html">
<source>LLM Embedding Endpoint</source> <source>LLM Embedding Endpoint</source>
<context-group purpose="location"> <context-group purpose="location">
<context context-type="sourcefile">src/app/data/paperless-config.ts</context> <context context-type="sourcefile">src/app/data/paperless-config.ts</context>
<context context-type="linenumber">358</context> <context context-type="linenumber">366</context>
</context-group> </context-group>
<target state="needs-translation">LLM Embedding Endpoint</target> <target state="needs-translation">LLM Embedding Endpoint</target>
</trans-unit> </trans-unit>
@@ -13310,7 +13326,7 @@
<source>LLM Embedding Chunk Size</source> <source>LLM Embedding Chunk Size</source>
<context-group purpose="location"> <context-group purpose="location">
<context context-type="sourcefile">src/app/data/paperless-config.ts</context> <context context-type="sourcefile">src/app/data/paperless-config.ts</context>
<context context-type="linenumber">365</context> <context context-type="linenumber">373</context>
</context-group> </context-group>
<target state="needs-translation">LLM Embedding Chunk Size</target> <target state="needs-translation">LLM Embedding Chunk Size</target>
</trans-unit> </trans-unit>
@@ -13318,7 +13334,7 @@
<source>LLM Context Size</source> <source>LLM Context Size</source>
<context-group purpose="location"> <context-group purpose="location">
<context context-type="sourcefile">src/app/data/paperless-config.ts</context> <context context-type="sourcefile">src/app/data/paperless-config.ts</context>
<context context-type="linenumber">372</context> <context context-type="linenumber">380</context>
</context-group> </context-group>
<target state="needs-translation">LLM Context Size</target> <target state="needs-translation">LLM Context Size</target>
</trans-unit> </trans-unit>
@@ -13326,7 +13342,7 @@
<source>LLM Backend</source> <source>LLM Backend</source>
<context-group purpose="location"> <context-group purpose="location">
<context context-type="sourcefile">src/app/data/paperless-config.ts</context> <context context-type="sourcefile">src/app/data/paperless-config.ts</context>
<context context-type="linenumber">379</context> <context context-type="linenumber">387</context>
</context-group> </context-group>
<target state="needs-translation">LLM Backend</target> <target state="needs-translation">LLM Backend</target>
</trans-unit> </trans-unit>
@@ -13334,7 +13350,7 @@
<source>LLM Model</source> <source>LLM Model</source>
<context-group purpose="location"> <context-group purpose="location">
<context context-type="sourcefile">src/app/data/paperless-config.ts</context> <context context-type="sourcefile">src/app/data/paperless-config.ts</context>
<context context-type="linenumber">387</context> <context context-type="linenumber">395</context>
</context-group> </context-group>
<target state="needs-translation">LLM Model</target> <target state="needs-translation">LLM Model</target>
</trans-unit> </trans-unit>
@@ -13342,7 +13358,7 @@
<source>LLM API Key</source> <source>LLM API Key</source>
<context-group purpose="location"> <context-group purpose="location">
<context context-type="sourcefile">src/app/data/paperless-config.ts</context> <context context-type="sourcefile">src/app/data/paperless-config.ts</context>
<context context-type="linenumber">394</context> <context context-type="linenumber">402</context>
</context-group> </context-group>
<target state="needs-translation">LLM API Key</target> <target state="needs-translation">LLM API Key</target>
</trans-unit> </trans-unit>
@@ -13350,7 +13366,7 @@
<source>LLM Endpoint</source> <source>LLM Endpoint</source>
<context-group purpose="location"> <context-group purpose="location">
<context context-type="sourcefile">src/app/data/paperless-config.ts</context> <context context-type="sourcefile">src/app/data/paperless-config.ts</context>
<context context-type="linenumber">401</context> <context context-type="linenumber">409</context>
</context-group> </context-group>
<target state="needs-translation">LLM Endpoint</target> <target state="needs-translation">LLM Endpoint</target>
</trans-unit> </trans-unit>
@@ -13358,7 +13374,7 @@
<source>LLM Output Language</source> <source>LLM Output Language</source>
<context-group purpose="location"> <context-group purpose="location">
<context context-type="sourcefile">src/app/data/paperless-config.ts</context> <context context-type="sourcefile">src/app/data/paperless-config.ts</context>
<context context-type="linenumber">408</context> <context context-type="linenumber">416</context>
</context-group> </context-group>
<target state="needs-translation">LLM Output Language</target> <target state="needs-translation">LLM Output Language</target>
</trans-unit> </trans-unit>
@@ -13366,7 +13382,7 @@
<source>Language to use for generated AI suggestions. When unset, AI suggestions use the user&apos;s display language if explicitly set.</source> <source>Language to use for generated AI suggestions. When unset, AI suggestions use the user&apos;s display language if explicitly set.</source>
<context-group purpose="location"> <context-group purpose="location">
<context context-type="sourcefile">src/app/data/paperless-config.ts</context> <context context-type="sourcefile">src/app/data/paperless-config.ts</context>
<context context-type="linenumber">412</context> <context context-type="linenumber">420</context>
</context-group> </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="needs-translation">Language to use for generated AI suggestions. When unset, AI suggestions use the user's display language if explicitly set.</target>
</trans-unit> </trans-unit>
@@ -13374,7 +13390,7 @@
<source>LLM Request Timeout</source> <source>LLM Request Timeout</source>
<context-group purpose="location"> <context-group purpose="location">
<context context-type="sourcefile">src/app/data/paperless-config.ts</context> <context context-type="sourcefile">src/app/data/paperless-config.ts</context>
<context context-type="linenumber">416</context> <context context-type="linenumber">424</context>
</context-group> </context-group>
<target state="needs-translation">LLM Request Timeout</target> <target state="needs-translation">LLM Request Timeout</target>
</trans-unit> </trans-unit>
@@ -13382,7 +13398,7 @@
<source>Timeout in seconds for LLM requests.</source> <source>Timeout in seconds for LLM requests.</source>
<context-group purpose="location"> <context-group purpose="location">
<context context-type="sourcefile">src/app/data/paperless-config.ts</context> <context context-type="sourcefile">src/app/data/paperless-config.ts</context>
<context context-type="linenumber">420</context> <context context-type="linenumber">428</context>
</context-group> </context-group>
<target state="needs-translation">Timeout in seconds for LLM requests.</target> <target state="needs-translation">Timeout in seconds for LLM requests.</target>
</trans-unit> </trans-unit>
+37 -21
View File
@@ -10740,7 +10740,7 @@
</context-group> </context-group>
<context-group purpose="location"> <context-group purpose="location">
<context context-type="sourcefile">src/app/components/document-list/document-list.component.ts</context> <context context-type="sourcefile">src/app/components/document-list/document-list.component.ts</context>
<context context-type="linenumber">348</context> <context context-type="linenumber">351</context>
</context-group> </context-group>
<context-group purpose="location"> <context-group purpose="location">
<context context-type="sourcefile">src/app/components/manage/document-attributes/document-attributes.component.html</context> <context context-type="sourcefile">src/app/components/manage/document-attributes/document-attributes.component.html</context>
@@ -10756,7 +10756,7 @@
</context-group> </context-group>
<context-group purpose="location"> <context-group purpose="location">
<context context-type="sourcefile">src/app/components/document-list/document-list.component.ts</context> <context context-type="sourcefile">src/app/components/document-list/document-list.component.ts</context>
<context context-type="linenumber">341</context> <context context-type="linenumber">344</context>
</context-group> </context-group>
<context-group purpose="location"> <context-group purpose="location">
<context context-type="sourcefile">src/app/components/manage/document-attributes/document-attributes.component.html</context> <context context-type="sourcefile">src/app/components/manage/document-attributes/document-attributes.component.html</context>
@@ -11040,7 +11040,7 @@
<source>Reset filters / selection</source> <source>Reset filters / selection</source>
<context-group purpose="location"> <context-group purpose="location">
<context context-type="sourcefile">src/app/components/document-list/document-list.component.ts</context> <context context-type="sourcefile">src/app/components/document-list/document-list.component.ts</context>
<context context-type="linenumber">329</context> <context context-type="linenumber">332</context>
</context-group> </context-group>
<target state="translated">Réinitialiser les filtres / la sélection</target> <target state="translated">Réinitialiser les filtres / la sélection</target>
</trans-unit> </trans-unit>
@@ -11048,7 +11048,7 @@
<source>Open first [selected] document</source> <source>Open first [selected] document</source>
<context-group purpose="location"> <context-group purpose="location">
<context context-type="sourcefile">src/app/components/document-list/document-list.component.ts</context> <context context-type="sourcefile">src/app/components/document-list/document-list.component.ts</context>
<context context-type="linenumber">357</context> <context context-type="linenumber">360</context>
</context-group> </context-group>
<target state="translated">Ouvrir le premier document [sélectionné]</target> <target state="translated">Ouvrir le premier document [sélectionné]</target>
</trans-unit> </trans-unit>
@@ -11056,7 +11056,7 @@
<source>Previous page</source> <source>Previous page</source>
<context-group purpose="location"> <context-group purpose="location">
<context context-type="sourcefile">src/app/components/document-list/document-list.component.ts</context> <context context-type="sourcefile">src/app/components/document-list/document-list.component.ts</context>
<context context-type="linenumber">373</context> <context context-type="linenumber">376</context>
</context-group> </context-group>
<target state="translated">Page précédente</target> <target state="translated">Page précédente</target>
</trans-unit> </trans-unit>
@@ -11064,7 +11064,7 @@
<source>Next page</source> <source>Next page</source>
<context-group purpose="location"> <context-group purpose="location">
<context context-type="sourcefile">src/app/components/document-list/document-list.component.ts</context> <context context-type="sourcefile">src/app/components/document-list/document-list.component.ts</context>
<context context-type="linenumber">385</context> <context context-type="linenumber">388</context>
</context-group> </context-group>
<target state="translated">Page suivante</target> <target state="translated">Page suivante</target>
</trans-unit> </trans-unit>
@@ -11072,7 +11072,7 @@
<source>View &quot;<x id="PH" equiv-text="this.list.activeSavedViewTitle"/>&quot; saved successfully.</source> <source>View &quot;<x id="PH" equiv-text="this.list.activeSavedViewTitle"/>&quot; saved successfully.</source>
<context-group purpose="location"> <context-group purpose="location">
<context context-type="sourcefile">src/app/components/document-list/document-list.component.ts</context> <context context-type="sourcefile">src/app/components/document-list/document-list.component.ts</context>
<context context-type="linenumber">419</context> <context context-type="linenumber">422</context>
</context-group> </context-group>
<target state="final">Vue "<x id="PH" equiv-text="this.list.activeSavedViewTitle"/>" enregistrée avec succès.</target> <target state="final">Vue "<x id="PH" equiv-text="this.list.activeSavedViewTitle"/>" enregistrée avec succès.</target>
</trans-unit> </trans-unit>
@@ -11080,7 +11080,7 @@
<source>Failed to save view &quot;<x id="PH" equiv-text="this.list.activeSavedViewTitle"/>&quot;.</source> <source>Failed to save view &quot;<x id="PH" equiv-text="this.list.activeSavedViewTitle"/>&quot;.</source>
<context-group purpose="location"> <context-group purpose="location">
<context context-type="sourcefile">src/app/components/document-list/document-list.component.ts</context> <context context-type="sourcefile">src/app/components/document-list/document-list.component.ts</context>
<context context-type="linenumber">425</context> <context context-type="linenumber">428</context>
</context-group> </context-group>
<target state="translated">Impossible d'enregistrer la vue "<x id="PH" equiv-text="this.list.activeSavedViewTitle"/>".</target> <target state="translated">Impossible d'enregistrer la vue "<x id="PH" equiv-text="this.list.activeSavedViewTitle"/>".</target>
</trans-unit> </trans-unit>
@@ -11088,7 +11088,7 @@
<source>View &quot;<x id="PH" equiv-text="savedView.name"/>&quot; created successfully.</source> <source>View &quot;<x id="PH" equiv-text="savedView.name"/>&quot; created successfully.</source>
<context-group purpose="location"> <context-group purpose="location">
<context context-type="sourcefile">src/app/components/document-list/document-list.component.ts</context> <context context-type="sourcefile">src/app/components/document-list/document-list.component.ts</context>
<context context-type="linenumber">494</context> <context context-type="linenumber">497</context>
</context-group> </context-group>
<target state="final">Vue « <x id="PH" equiv-text="savedView.name"/> » créée avec succès.</target> <target state="final">Vue « <x id="PH" equiv-text="savedView.name"/> » créée avec succès.</target>
</trans-unit> </trans-unit>
@@ -11096,7 +11096,7 @@
<source>View &quot;<x id="PH" equiv-text="savedView.name"/>&quot; created successfully, but could not update visibility settings.</source> <source>View &quot;<x id="PH" equiv-text="savedView.name"/>&quot; created successfully, but could not update visibility settings.</source>
<context-group purpose="location"> <context-group purpose="location">
<context context-type="sourcefile">src/app/components/document-list/document-list.component.ts</context> <context context-type="sourcefile">src/app/components/document-list/document-list.component.ts</context>
<context context-type="linenumber">500</context> <context context-type="linenumber">503</context>
</context-group> </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="needs-translation">View "<x id="PH" equiv-text="savedView.name"/>" created successfully, but could not update visibility settings.</target>
</trans-unit> </trans-unit>
@@ -13297,11 +13297,27 @@
</context-group> </context-group>
<target state="final">Modèle d'embeddings</target> <target state="final">Modèle d'embeddings</target>
</trans-unit> </trans-unit>
<trans-unit id="861068592166833023" datatype="html">
<source>LLM Embedding API Key</source>
<context-group purpose="location">
<context context-type="sourcefile">src/app/data/paperless-config.ts</context>
<context context-type="linenumber">358</context>
</context-group>
<target state="needs-translation">LLM Embedding API Key</target>
</trans-unit>
<trans-unit id="2929108042259892948" datatype="html">
<source>Used for embeddings when set, otherwise LLM API key is used.</source>
<context-group purpose="location">
<context context-type="sourcefile">src/app/data/paperless-config.ts</context>
<context context-type="linenumber">360</context>
</context-group>
<target state="needs-translation">Used for embeddings when set, otherwise LLM API key is used.</target>
</trans-unit>
<trans-unit id="3554114880473286122" datatype="html"> <trans-unit id="3554114880473286122" datatype="html">
<source>LLM Embedding Endpoint</source> <source>LLM Embedding Endpoint</source>
<context-group purpose="location"> <context-group purpose="location">
<context context-type="sourcefile">src/app/data/paperless-config.ts</context> <context context-type="sourcefile">src/app/data/paperless-config.ts</context>
<context context-type="linenumber">358</context> <context context-type="linenumber">366</context>
</context-group> </context-group>
<target state="translated">Point de terminaison de l'intégration LLM</target> <target state="translated">Point de terminaison de l'intégration LLM</target>
</trans-unit> </trans-unit>
@@ -13309,7 +13325,7 @@
<source>LLM Embedding Chunk Size</source> <source>LLM Embedding Chunk Size</source>
<context-group purpose="location"> <context-group purpose="location">
<context context-type="sourcefile">src/app/data/paperless-config.ts</context> <context context-type="sourcefile">src/app/data/paperless-config.ts</context>
<context context-type="linenumber">365</context> <context context-type="linenumber">373</context>
</context-group> </context-group>
<target state="translated">LLM Embedding Chunk Size</target> <target state="translated">LLM Embedding Chunk Size</target>
</trans-unit> </trans-unit>
@@ -13317,7 +13333,7 @@
<source>LLM Context Size</source> <source>LLM Context Size</source>
<context-group purpose="location"> <context-group purpose="location">
<context context-type="sourcefile">src/app/data/paperless-config.ts</context> <context context-type="sourcefile">src/app/data/paperless-config.ts</context>
<context context-type="linenumber">372</context> <context context-type="linenumber">380</context>
</context-group> </context-group>
<target state="translated">LLM Context Size</target> <target state="translated">LLM Context Size</target>
</trans-unit> </trans-unit>
@@ -13325,7 +13341,7 @@
<source>LLM Backend</source> <source>LLM Backend</source>
<context-group purpose="location"> <context-group purpose="location">
<context context-type="sourcefile">src/app/data/paperless-config.ts</context> <context context-type="sourcefile">src/app/data/paperless-config.ts</context>
<context context-type="linenumber">379</context> <context context-type="linenumber">387</context>
</context-group> </context-group>
<target state="translated">Backend LLM</target> <target state="translated">Backend LLM</target>
</trans-unit> </trans-unit>
@@ -13333,7 +13349,7 @@
<source>LLM Model</source> <source>LLM Model</source>
<context-group purpose="location"> <context-group purpose="location">
<context context-type="sourcefile">src/app/data/paperless-config.ts</context> <context context-type="sourcefile">src/app/data/paperless-config.ts</context>
<context context-type="linenumber">387</context> <context context-type="linenumber">395</context>
</context-group> </context-group>
<target state="translated">Modèle LLM</target> <target state="translated">Modèle LLM</target>
</trans-unit> </trans-unit>
@@ -13341,7 +13357,7 @@
<source>LLM API Key</source> <source>LLM API Key</source>
<context-group purpose="location"> <context-group purpose="location">
<context context-type="sourcefile">src/app/data/paperless-config.ts</context> <context context-type="sourcefile">src/app/data/paperless-config.ts</context>
<context context-type="linenumber">394</context> <context context-type="linenumber">402</context>
</context-group> </context-group>
<target state="translated">Clé d'API LLM</target> <target state="translated">Clé d'API LLM</target>
</trans-unit> </trans-unit>
@@ -13349,7 +13365,7 @@
<source>LLM Endpoint</source> <source>LLM Endpoint</source>
<context-group purpose="location"> <context-group purpose="location">
<context context-type="sourcefile">src/app/data/paperless-config.ts</context> <context context-type="sourcefile">src/app/data/paperless-config.ts</context>
<context context-type="linenumber">401</context> <context context-type="linenumber">409</context>
</context-group> </context-group>
<target state="translated">LLM Endpoint</target> <target state="translated">LLM Endpoint</target>
</trans-unit> </trans-unit>
@@ -13357,7 +13373,7 @@
<source>LLM Output Language</source> <source>LLM Output Language</source>
<context-group purpose="location"> <context-group purpose="location">
<context context-type="sourcefile">src/app/data/paperless-config.ts</context> <context context-type="sourcefile">src/app/data/paperless-config.ts</context>
<context context-type="linenumber">408</context> <context context-type="linenumber">416</context>
</context-group> </context-group>
<target state="translated">Langue de sortie LLM</target> <target state="translated">Langue de sortie LLM</target>
</trans-unit> </trans-unit>
@@ -13365,7 +13381,7 @@
<source>Language to use for generated AI suggestions. When unset, AI suggestions use the user&apos;s display language if explicitly set.</source> <source>Language to use for generated AI suggestions. When unset, AI suggestions use the user&apos;s display language if explicitly set.</source>
<context-group purpose="location"> <context-group purpose="location">
<context context-type="sourcefile">src/app/data/paperless-config.ts</context> <context context-type="sourcefile">src/app/data/paperless-config.ts</context>
<context context-type="linenumber">412</context> <context context-type="linenumber">420</context>
</context-group> </context-group>
<target state="translated">Langue à utiliser pour les suggestions d'IA générées. Lorsqu'elle n'est pas définie, les suggestions d'IA utilisent la langue d'affichage de l'utilisateur si elle est explicitement définie.</target> <target state="translated">Langue à utiliser pour les suggestions d'IA générées. Lorsqu'elle n'est pas définie, les suggestions d'IA utilisent la langue d'affichage de l'utilisateur si elle est explicitement définie.</target>
</trans-unit> </trans-unit>
@@ -13373,7 +13389,7 @@
<source>LLM Request Timeout</source> <source>LLM Request Timeout</source>
<context-group purpose="location"> <context-group purpose="location">
<context context-type="sourcefile">src/app/data/paperless-config.ts</context> <context context-type="sourcefile">src/app/data/paperless-config.ts</context>
<context context-type="linenumber">416</context> <context context-type="linenumber">424</context>
</context-group> </context-group>
<target state="translated">Délai d'attente des requêtes LLM</target> <target state="translated">Délai d'attente des requêtes LLM</target>
</trans-unit> </trans-unit>
@@ -13381,7 +13397,7 @@
<source>Timeout in seconds for LLM requests.</source> <source>Timeout in seconds for LLM requests.</source>
<context-group purpose="location"> <context-group purpose="location">
<context context-type="sourcefile">src/app/data/paperless-config.ts</context> <context context-type="sourcefile">src/app/data/paperless-config.ts</context>
<context context-type="linenumber">420</context> <context context-type="linenumber">428</context>
</context-group> </context-group>
<target state="translated">Délai d'attente en secondes pour les requêtes LLM.</target> <target state="translated">Délai d'attente en secondes pour les requêtes LLM.</target>
</trans-unit> </trans-unit>
+37 -21
View File
@@ -10740,7 +10740,7 @@
</context-group> </context-group>
<context-group purpose="location"> <context-group purpose="location">
<context context-type="sourcefile">src/app/components/document-list/document-list.component.ts</context> <context context-type="sourcefile">src/app/components/document-list/document-list.component.ts</context>
<context context-type="linenumber">348</context> <context context-type="linenumber">351</context>
</context-group> </context-group>
<context-group purpose="location"> <context-group purpose="location">
<context context-type="sourcefile">src/app/components/manage/document-attributes/document-attributes.component.html</context> <context context-type="sourcefile">src/app/components/manage/document-attributes/document-attributes.component.html</context>
@@ -10756,7 +10756,7 @@
</context-group> </context-group>
<context-group purpose="location"> <context-group purpose="location">
<context context-type="sourcefile">src/app/components/document-list/document-list.component.ts</context> <context context-type="sourcefile">src/app/components/document-list/document-list.component.ts</context>
<context context-type="linenumber">341</context> <context context-type="linenumber">344</context>
</context-group> </context-group>
<context-group purpose="location"> <context-group purpose="location">
<context context-type="sourcefile">src/app/components/manage/document-attributes/document-attributes.component.html</context> <context context-type="sourcefile">src/app/components/manage/document-attributes/document-attributes.component.html</context>
@@ -11040,7 +11040,7 @@
<source>Reset filters / selection</source> <source>Reset filters / selection</source>
<context-group purpose="location"> <context-group purpose="location">
<context context-type="sourcefile">src/app/components/document-list/document-list.component.ts</context> <context context-type="sourcefile">src/app/components/document-list/document-list.component.ts</context>
<context context-type="linenumber">329</context> <context context-type="linenumber">332</context>
</context-group> </context-group>
<target state="translated">איפוס סינון / בחירה</target> <target state="translated">איפוס סינון / בחירה</target>
</trans-unit> </trans-unit>
@@ -11048,7 +11048,7 @@
<source>Open first [selected] document</source> <source>Open first [selected] document</source>
<context-group purpose="location"> <context-group purpose="location">
<context context-type="sourcefile">src/app/components/document-list/document-list.component.ts</context> <context context-type="sourcefile">src/app/components/document-list/document-list.component.ts</context>
<context context-type="linenumber">357</context> <context context-type="linenumber">360</context>
</context-group> </context-group>
<target state="translated">פתח את המסמך הראשון [הנבחר]</target> <target state="translated">פתח את המסמך הראשון [הנבחר]</target>
</trans-unit> </trans-unit>
@@ -11056,7 +11056,7 @@
<source>Previous page</source> <source>Previous page</source>
<context-group purpose="location"> <context-group purpose="location">
<context context-type="sourcefile">src/app/components/document-list/document-list.component.ts</context> <context context-type="sourcefile">src/app/components/document-list/document-list.component.ts</context>
<context context-type="linenumber">373</context> <context context-type="linenumber">376</context>
</context-group> </context-group>
<target state="translated">עמוד קודם</target> <target state="translated">עמוד קודם</target>
</trans-unit> </trans-unit>
@@ -11064,7 +11064,7 @@
<source>Next page</source> <source>Next page</source>
<context-group purpose="location"> <context-group purpose="location">
<context context-type="sourcefile">src/app/components/document-list/document-list.component.ts</context> <context context-type="sourcefile">src/app/components/document-list/document-list.component.ts</context>
<context context-type="linenumber">385</context> <context context-type="linenumber">388</context>
</context-group> </context-group>
<target state="translated">עמוד הבא</target> <target state="translated">עמוד הבא</target>
</trans-unit> </trans-unit>
@@ -11072,7 +11072,7 @@
<source>View &quot;<x id="PH" equiv-text="this.list.activeSavedViewTitle"/>&quot; saved successfully.</source> <source>View &quot;<x id="PH" equiv-text="this.list.activeSavedViewTitle"/>&quot; saved successfully.</source>
<context-group purpose="location"> <context-group purpose="location">
<context context-type="sourcefile">src/app/components/document-list/document-list.component.ts</context> <context context-type="sourcefile">src/app/components/document-list/document-list.component.ts</context>
<context context-type="linenumber">419</context> <context context-type="linenumber">422</context>
</context-group> </context-group>
<target state="translated">תצוגה "<x id="PH" equiv-text="this.list.activeSavedViewTitle"/>" נשמרה בהצלחה.</target> <target state="translated">תצוגה "<x id="PH" equiv-text="this.list.activeSavedViewTitle"/>" נשמרה בהצלחה.</target>
</trans-unit> </trans-unit>
@@ -11080,7 +11080,7 @@
<source>Failed to save view &quot;<x id="PH" equiv-text="this.list.activeSavedViewTitle"/>&quot;.</source> <source>Failed to save view &quot;<x id="PH" equiv-text="this.list.activeSavedViewTitle"/>&quot;.</source>
<context-group purpose="location"> <context-group purpose="location">
<context context-type="sourcefile">src/app/components/document-list/document-list.component.ts</context> <context context-type="sourcefile">src/app/components/document-list/document-list.component.ts</context>
<context context-type="linenumber">425</context> <context context-type="linenumber">428</context>
</context-group> </context-group>
<target state="translated">כישלון בעת שמירת תצוגה "<x id="PH" equiv-text="this.list.activeSavedViewTitle"/>".</target> <target state="translated">כישלון בעת שמירת תצוגה "<x id="PH" equiv-text="this.list.activeSavedViewTitle"/>".</target>
</trans-unit> </trans-unit>
@@ -11088,7 +11088,7 @@
<source>View &quot;<x id="PH" equiv-text="savedView.name"/>&quot; created successfully.</source> <source>View &quot;<x id="PH" equiv-text="savedView.name"/>&quot; created successfully.</source>
<context-group purpose="location"> <context-group purpose="location">
<context context-type="sourcefile">src/app/components/document-list/document-list.component.ts</context> <context context-type="sourcefile">src/app/components/document-list/document-list.component.ts</context>
<context context-type="linenumber">494</context> <context context-type="linenumber">497</context>
</context-group> </context-group>
<target state="translated">תצוגה "<x id="PH" equiv-text="savedView.name"/>" נוצרה בהצלחה.</target> <target state="translated">תצוגה "<x id="PH" equiv-text="savedView.name"/>" נוצרה בהצלחה.</target>
</trans-unit> </trans-unit>
@@ -11096,7 +11096,7 @@
<source>View &quot;<x id="PH" equiv-text="savedView.name"/>&quot; created successfully, but could not update visibility settings.</source> <source>View &quot;<x id="PH" equiv-text="savedView.name"/>&quot; created successfully, but could not update visibility settings.</source>
<context-group purpose="location"> <context-group purpose="location">
<context context-type="sourcefile">src/app/components/document-list/document-list.component.ts</context> <context context-type="sourcefile">src/app/components/document-list/document-list.component.ts</context>
<context context-type="linenumber">500</context> <context context-type="linenumber">503</context>
</context-group> </context-group>
<target state="translated">התצוגה "<x id="PH" equiv-text="savedView.name"/>" נוצרה בהצלחה, אך לא ניתן היה לעדכן את הגדרות הנראות.</target> <target state="translated">התצוגה "<x id="PH" equiv-text="savedView.name"/>" נוצרה בהצלחה, אך לא ניתן היה לעדכן את הגדרות הנראות.</target>
</trans-unit> </trans-unit>
@@ -13297,11 +13297,27 @@
</context-group> </context-group>
<target state="needs-translation">LLM Embedding Model</target> <target state="needs-translation">LLM Embedding Model</target>
</trans-unit> </trans-unit>
<trans-unit id="861068592166833023" datatype="html">
<source>LLM Embedding API Key</source>
<context-group purpose="location">
<context context-type="sourcefile">src/app/data/paperless-config.ts</context>
<context context-type="linenumber">358</context>
</context-group>
<target state="needs-translation">LLM Embedding API Key</target>
</trans-unit>
<trans-unit id="2929108042259892948" datatype="html">
<source>Used for embeddings when set, otherwise LLM API key is used.</source>
<context-group purpose="location">
<context context-type="sourcefile">src/app/data/paperless-config.ts</context>
<context context-type="linenumber">360</context>
</context-group>
<target state="needs-translation">Used for embeddings when set, otherwise LLM API key is used.</target>
</trans-unit>
<trans-unit id="3554114880473286122" datatype="html"> <trans-unit id="3554114880473286122" datatype="html">
<source>LLM Embedding Endpoint</source> <source>LLM Embedding Endpoint</source>
<context-group purpose="location"> <context-group purpose="location">
<context context-type="sourcefile">src/app/data/paperless-config.ts</context> <context context-type="sourcefile">src/app/data/paperless-config.ts</context>
<context context-type="linenumber">358</context> <context context-type="linenumber">366</context>
</context-group> </context-group>
<target state="needs-translation">LLM Embedding Endpoint</target> <target state="needs-translation">LLM Embedding Endpoint</target>
</trans-unit> </trans-unit>
@@ -13309,7 +13325,7 @@
<source>LLM Embedding Chunk Size</source> <source>LLM Embedding Chunk Size</source>
<context-group purpose="location"> <context-group purpose="location">
<context context-type="sourcefile">src/app/data/paperless-config.ts</context> <context context-type="sourcefile">src/app/data/paperless-config.ts</context>
<context context-type="linenumber">365</context> <context context-type="linenumber">373</context>
</context-group> </context-group>
<target state="needs-translation">LLM Embedding Chunk Size</target> <target state="needs-translation">LLM Embedding Chunk Size</target>
</trans-unit> </trans-unit>
@@ -13317,7 +13333,7 @@
<source>LLM Context Size</source> <source>LLM Context Size</source>
<context-group purpose="location"> <context-group purpose="location">
<context context-type="sourcefile">src/app/data/paperless-config.ts</context> <context context-type="sourcefile">src/app/data/paperless-config.ts</context>
<context context-type="linenumber">372</context> <context context-type="linenumber">380</context>
</context-group> </context-group>
<target state="needs-translation">LLM Context Size</target> <target state="needs-translation">LLM Context Size</target>
</trans-unit> </trans-unit>
@@ -13325,7 +13341,7 @@
<source>LLM Backend</source> <source>LLM Backend</source>
<context-group purpose="location"> <context-group purpose="location">
<context context-type="sourcefile">src/app/data/paperless-config.ts</context> <context context-type="sourcefile">src/app/data/paperless-config.ts</context>
<context context-type="linenumber">379</context> <context context-type="linenumber">387</context>
</context-group> </context-group>
<target state="needs-translation">LLM Backend</target> <target state="needs-translation">LLM Backend</target>
</trans-unit> </trans-unit>
@@ -13333,7 +13349,7 @@
<source>LLM Model</source> <source>LLM Model</source>
<context-group purpose="location"> <context-group purpose="location">
<context context-type="sourcefile">src/app/data/paperless-config.ts</context> <context context-type="sourcefile">src/app/data/paperless-config.ts</context>
<context context-type="linenumber">387</context> <context context-type="linenumber">395</context>
</context-group> </context-group>
<target state="needs-translation">LLM Model</target> <target state="needs-translation">LLM Model</target>
</trans-unit> </trans-unit>
@@ -13341,7 +13357,7 @@
<source>LLM API Key</source> <source>LLM API Key</source>
<context-group purpose="location"> <context-group purpose="location">
<context context-type="sourcefile">src/app/data/paperless-config.ts</context> <context context-type="sourcefile">src/app/data/paperless-config.ts</context>
<context context-type="linenumber">394</context> <context context-type="linenumber">402</context>
</context-group> </context-group>
<target state="needs-translation">LLM API Key</target> <target state="needs-translation">LLM API Key</target>
</trans-unit> </trans-unit>
@@ -13349,7 +13365,7 @@
<source>LLM Endpoint</source> <source>LLM Endpoint</source>
<context-group purpose="location"> <context-group purpose="location">
<context context-type="sourcefile">src/app/data/paperless-config.ts</context> <context context-type="sourcefile">src/app/data/paperless-config.ts</context>
<context context-type="linenumber">401</context> <context context-type="linenumber">409</context>
</context-group> </context-group>
<target state="needs-translation">LLM Endpoint</target> <target state="needs-translation">LLM Endpoint</target>
</trans-unit> </trans-unit>
@@ -13357,7 +13373,7 @@
<source>LLM Output Language</source> <source>LLM Output Language</source>
<context-group purpose="location"> <context-group purpose="location">
<context context-type="sourcefile">src/app/data/paperless-config.ts</context> <context context-type="sourcefile">src/app/data/paperless-config.ts</context>
<context context-type="linenumber">408</context> <context context-type="linenumber">416</context>
</context-group> </context-group>
<target state="needs-translation">LLM Output Language</target> <target state="needs-translation">LLM Output Language</target>
</trans-unit> </trans-unit>
@@ -13365,7 +13381,7 @@
<source>Language to use for generated AI suggestions. When unset, AI suggestions use the user&apos;s display language if explicitly set.</source> <source>Language to use for generated AI suggestions. When unset, AI suggestions use the user&apos;s display language if explicitly set.</source>
<context-group purpose="location"> <context-group purpose="location">
<context context-type="sourcefile">src/app/data/paperless-config.ts</context> <context context-type="sourcefile">src/app/data/paperless-config.ts</context>
<context context-type="linenumber">412</context> <context context-type="linenumber">420</context>
</context-group> </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="needs-translation">Language to use for generated AI suggestions. When unset, AI suggestions use the user's display language if explicitly set.</target>
</trans-unit> </trans-unit>
@@ -13373,7 +13389,7 @@
<source>LLM Request Timeout</source> <source>LLM Request Timeout</source>
<context-group purpose="location"> <context-group purpose="location">
<context context-type="sourcefile">src/app/data/paperless-config.ts</context> <context context-type="sourcefile">src/app/data/paperless-config.ts</context>
<context context-type="linenumber">416</context> <context context-type="linenumber">424</context>
</context-group> </context-group>
<target state="needs-translation">LLM Request Timeout</target> <target state="needs-translation">LLM Request Timeout</target>
</trans-unit> </trans-unit>
@@ -13381,7 +13397,7 @@
<source>Timeout in seconds for LLM requests.</source> <source>Timeout in seconds for LLM requests.</source>
<context-group purpose="location"> <context-group purpose="location">
<context context-type="sourcefile">src/app/data/paperless-config.ts</context> <context context-type="sourcefile">src/app/data/paperless-config.ts</context>
<context context-type="linenumber">420</context> <context context-type="linenumber">428</context>
</context-group> </context-group>
<target state="needs-translation">Timeout in seconds for LLM requests.</target> <target state="needs-translation">Timeout in seconds for LLM requests.</target>
</trans-unit> </trans-unit>
+37 -21
View File
@@ -10741,7 +10741,7 @@
</context-group> </context-group>
<context-group purpose="location"> <context-group purpose="location">
<context context-type="sourcefile">src/app/components/document-list/document-list.component.ts</context> <context context-type="sourcefile">src/app/components/document-list/document-list.component.ts</context>
<context context-type="linenumber">348</context> <context context-type="linenumber">351</context>
</context-group> </context-group>
<context-group purpose="location"> <context-group purpose="location">
<context context-type="sourcefile">src/app/components/manage/document-attributes/document-attributes.component.html</context> <context context-type="sourcefile">src/app/components/manage/document-attributes/document-attributes.component.html</context>
@@ -10757,7 +10757,7 @@
</context-group> </context-group>
<context-group purpose="location"> <context-group purpose="location">
<context context-type="sourcefile">src/app/components/document-list/document-list.component.ts</context> <context context-type="sourcefile">src/app/components/document-list/document-list.component.ts</context>
<context context-type="linenumber">341</context> <context context-type="linenumber">344</context>
</context-group> </context-group>
<context-group purpose="location"> <context-group purpose="location">
<context context-type="sourcefile">src/app/components/manage/document-attributes/document-attributes.component.html</context> <context context-type="sourcefile">src/app/components/manage/document-attributes/document-attributes.component.html</context>
@@ -11041,7 +11041,7 @@
<source>Reset filters / selection</source> <source>Reset filters / selection</source>
<context-group purpose="location"> <context-group purpose="location">
<context context-type="sourcefile">src/app/components/document-list/document-list.component.ts</context> <context context-type="sourcefile">src/app/components/document-list/document-list.component.ts</context>
<context context-type="linenumber">329</context> <context context-type="linenumber">332</context>
</context-group> </context-group>
<target state="needs-translation">Reset filters / selection</target> <target state="needs-translation">Reset filters / selection</target>
</trans-unit> </trans-unit>
@@ -11049,7 +11049,7 @@
<source>Open first [selected] document</source> <source>Open first [selected] document</source>
<context-group purpose="location"> <context-group purpose="location">
<context context-type="sourcefile">src/app/components/document-list/document-list.component.ts</context> <context context-type="sourcefile">src/app/components/document-list/document-list.component.ts</context>
<context context-type="linenumber">357</context> <context context-type="linenumber">360</context>
</context-group> </context-group>
<target state="needs-translation">Open first [selected] document</target> <target state="needs-translation">Open first [selected] document</target>
</trans-unit> </trans-unit>
@@ -11057,7 +11057,7 @@
<source>Previous page</source> <source>Previous page</source>
<context-group purpose="location"> <context-group purpose="location">
<context context-type="sourcefile">src/app/components/document-list/document-list.component.ts</context> <context context-type="sourcefile">src/app/components/document-list/document-list.component.ts</context>
<context context-type="linenumber">373</context> <context context-type="linenumber">376</context>
</context-group> </context-group>
<target state="needs-translation">Previous page</target> <target state="needs-translation">Previous page</target>
</trans-unit> </trans-unit>
@@ -11065,7 +11065,7 @@
<source>Next page</source> <source>Next page</source>
<context-group purpose="location"> <context-group purpose="location">
<context context-type="sourcefile">src/app/components/document-list/document-list.component.ts</context> <context context-type="sourcefile">src/app/components/document-list/document-list.component.ts</context>
<context context-type="linenumber">385</context> <context context-type="linenumber">388</context>
</context-group> </context-group>
<target state="needs-translation">Next page</target> <target state="needs-translation">Next page</target>
</trans-unit> </trans-unit>
@@ -11073,7 +11073,7 @@
<source>View &quot;<x id="PH" equiv-text="this.list.activeSavedViewTitle"/>&quot; saved successfully.</source> <source>View &quot;<x id="PH" equiv-text="this.list.activeSavedViewTitle"/>&quot; saved successfully.</source>
<context-group purpose="location"> <context-group purpose="location">
<context context-type="sourcefile">src/app/components/document-list/document-list.component.ts</context> <context context-type="sourcefile">src/app/components/document-list/document-list.component.ts</context>
<context context-type="linenumber">419</context> <context context-type="linenumber">422</context>
</context-group> </context-group>
<target state="needs-translation">View "<x id="PH" equiv-text="this.list.activeSavedViewTitle"/>" saved successfully.</target> <target state="needs-translation">View "<x id="PH" equiv-text="this.list.activeSavedViewTitle"/>" saved successfully.</target>
</trans-unit> </trans-unit>
@@ -11081,7 +11081,7 @@
<source>Failed to save view &quot;<x id="PH" equiv-text="this.list.activeSavedViewTitle"/>&quot;.</source> <source>Failed to save view &quot;<x id="PH" equiv-text="this.list.activeSavedViewTitle"/>&quot;.</source>
<context-group purpose="location"> <context-group purpose="location">
<context context-type="sourcefile">src/app/components/document-list/document-list.component.ts</context> <context context-type="sourcefile">src/app/components/document-list/document-list.component.ts</context>
<context context-type="linenumber">425</context> <context context-type="linenumber">428</context>
</context-group> </context-group>
<target state="needs-translation">Failed to save view "<x id="PH" equiv-text="this.list.activeSavedViewTitle"/>".</target> <target state="needs-translation">Failed to save view "<x id="PH" equiv-text="this.list.activeSavedViewTitle"/>".</target>
</trans-unit> </trans-unit>
@@ -11089,7 +11089,7 @@
<source>View &quot;<x id="PH" equiv-text="savedView.name"/>&quot; created successfully.</source> <source>View &quot;<x id="PH" equiv-text="savedView.name"/>&quot; created successfully.</source>
<context-group purpose="location"> <context-group purpose="location">
<context context-type="sourcefile">src/app/components/document-list/document-list.component.ts</context> <context context-type="sourcefile">src/app/components/document-list/document-list.component.ts</context>
<context context-type="linenumber">494</context> <context context-type="linenumber">497</context>
</context-group> </context-group>
<target state="needs-translation">View "<x id="PH" equiv-text="savedView.name"/>" created successfully.</target> <target state="needs-translation">View "<x id="PH" equiv-text="savedView.name"/>" created successfully.</target>
</trans-unit> </trans-unit>
@@ -11097,7 +11097,7 @@
<source>View &quot;<x id="PH" equiv-text="savedView.name"/>&quot; created successfully, but could not update visibility settings.</source> <source>View &quot;<x id="PH" equiv-text="savedView.name"/>&quot; created successfully, but could not update visibility settings.</source>
<context-group purpose="location"> <context-group purpose="location">
<context context-type="sourcefile">src/app/components/document-list/document-list.component.ts</context> <context context-type="sourcefile">src/app/components/document-list/document-list.component.ts</context>
<context context-type="linenumber">500</context> <context context-type="linenumber">503</context>
</context-group> </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="needs-translation">View "<x id="PH" equiv-text="savedView.name"/>" created successfully, but could not update visibility settings.</target>
</trans-unit> </trans-unit>
@@ -13298,11 +13298,27 @@
</context-group> </context-group>
<target state="needs-translation">LLM Embedding Model</target> <target state="needs-translation">LLM Embedding Model</target>
</trans-unit> </trans-unit>
<trans-unit id="861068592166833023" datatype="html">
<source>LLM Embedding API Key</source>
<context-group purpose="location">
<context context-type="sourcefile">src/app/data/paperless-config.ts</context>
<context context-type="linenumber">358</context>
</context-group>
<target state="needs-translation">LLM Embedding API Key</target>
</trans-unit>
<trans-unit id="2929108042259892948" datatype="html">
<source>Used for embeddings when set, otherwise LLM API key is used.</source>
<context-group purpose="location">
<context context-type="sourcefile">src/app/data/paperless-config.ts</context>
<context context-type="linenumber">360</context>
</context-group>
<target state="needs-translation">Used for embeddings when set, otherwise LLM API key is used.</target>
</trans-unit>
<trans-unit id="3554114880473286122" datatype="html"> <trans-unit id="3554114880473286122" datatype="html">
<source>LLM Embedding Endpoint</source> <source>LLM Embedding Endpoint</source>
<context-group purpose="location"> <context-group purpose="location">
<context context-type="sourcefile">src/app/data/paperless-config.ts</context> <context context-type="sourcefile">src/app/data/paperless-config.ts</context>
<context context-type="linenumber">358</context> <context context-type="linenumber">366</context>
</context-group> </context-group>
<target state="needs-translation">LLM Embedding Endpoint</target> <target state="needs-translation">LLM Embedding Endpoint</target>
</trans-unit> </trans-unit>
@@ -13310,7 +13326,7 @@
<source>LLM Embedding Chunk Size</source> <source>LLM Embedding Chunk Size</source>
<context-group purpose="location"> <context-group purpose="location">
<context context-type="sourcefile">src/app/data/paperless-config.ts</context> <context context-type="sourcefile">src/app/data/paperless-config.ts</context>
<context context-type="linenumber">365</context> <context context-type="linenumber">373</context>
</context-group> </context-group>
<target state="needs-translation">LLM Embedding Chunk Size</target> <target state="needs-translation">LLM Embedding Chunk Size</target>
</trans-unit> </trans-unit>
@@ -13318,7 +13334,7 @@
<source>LLM Context Size</source> <source>LLM Context Size</source>
<context-group purpose="location"> <context-group purpose="location">
<context context-type="sourcefile">src/app/data/paperless-config.ts</context> <context context-type="sourcefile">src/app/data/paperless-config.ts</context>
<context context-type="linenumber">372</context> <context context-type="linenumber">380</context>
</context-group> </context-group>
<target state="needs-translation">LLM Context Size</target> <target state="needs-translation">LLM Context Size</target>
</trans-unit> </trans-unit>
@@ -13326,7 +13342,7 @@
<source>LLM Backend</source> <source>LLM Backend</source>
<context-group purpose="location"> <context-group purpose="location">
<context context-type="sourcefile">src/app/data/paperless-config.ts</context> <context context-type="sourcefile">src/app/data/paperless-config.ts</context>
<context context-type="linenumber">379</context> <context context-type="linenumber">387</context>
</context-group> </context-group>
<target state="needs-translation">LLM Backend</target> <target state="needs-translation">LLM Backend</target>
</trans-unit> </trans-unit>
@@ -13334,7 +13350,7 @@
<source>LLM Model</source> <source>LLM Model</source>
<context-group purpose="location"> <context-group purpose="location">
<context context-type="sourcefile">src/app/data/paperless-config.ts</context> <context context-type="sourcefile">src/app/data/paperless-config.ts</context>
<context context-type="linenumber">387</context> <context context-type="linenumber">395</context>
</context-group> </context-group>
<target state="needs-translation">LLM Model</target> <target state="needs-translation">LLM Model</target>
</trans-unit> </trans-unit>
@@ -13342,7 +13358,7 @@
<source>LLM API Key</source> <source>LLM API Key</source>
<context-group purpose="location"> <context-group purpose="location">
<context context-type="sourcefile">src/app/data/paperless-config.ts</context> <context context-type="sourcefile">src/app/data/paperless-config.ts</context>
<context context-type="linenumber">394</context> <context context-type="linenumber">402</context>
</context-group> </context-group>
<target state="needs-translation">LLM API Key</target> <target state="needs-translation">LLM API Key</target>
</trans-unit> </trans-unit>
@@ -13350,7 +13366,7 @@
<source>LLM Endpoint</source> <source>LLM Endpoint</source>
<context-group purpose="location"> <context-group purpose="location">
<context context-type="sourcefile">src/app/data/paperless-config.ts</context> <context context-type="sourcefile">src/app/data/paperless-config.ts</context>
<context context-type="linenumber">401</context> <context context-type="linenumber">409</context>
</context-group> </context-group>
<target state="needs-translation">LLM Endpoint</target> <target state="needs-translation">LLM Endpoint</target>
</trans-unit> </trans-unit>
@@ -13358,7 +13374,7 @@
<source>LLM Output Language</source> <source>LLM Output Language</source>
<context-group purpose="location"> <context-group purpose="location">
<context context-type="sourcefile">src/app/data/paperless-config.ts</context> <context context-type="sourcefile">src/app/data/paperless-config.ts</context>
<context context-type="linenumber">408</context> <context context-type="linenumber">416</context>
</context-group> </context-group>
<target state="needs-translation">LLM Output Language</target> <target state="needs-translation">LLM Output Language</target>
</trans-unit> </trans-unit>
@@ -13366,7 +13382,7 @@
<source>Language to use for generated AI suggestions. When unset, AI suggestions use the user&apos;s display language if explicitly set.</source> <source>Language to use for generated AI suggestions. When unset, AI suggestions use the user&apos;s display language if explicitly set.</source>
<context-group purpose="location"> <context-group purpose="location">
<context context-type="sourcefile">src/app/data/paperless-config.ts</context> <context context-type="sourcefile">src/app/data/paperless-config.ts</context>
<context context-type="linenumber">412</context> <context context-type="linenumber">420</context>
</context-group> </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="needs-translation">Language to use for generated AI suggestions. When unset, AI suggestions use the user's display language if explicitly set.</target>
</trans-unit> </trans-unit>
@@ -13374,7 +13390,7 @@
<source>LLM Request Timeout</source> <source>LLM Request Timeout</source>
<context-group purpose="location"> <context-group purpose="location">
<context context-type="sourcefile">src/app/data/paperless-config.ts</context> <context context-type="sourcefile">src/app/data/paperless-config.ts</context>
<context context-type="linenumber">416</context> <context context-type="linenumber">424</context>
</context-group> </context-group>
<target state="needs-translation">LLM Request Timeout</target> <target state="needs-translation">LLM Request Timeout</target>
</trans-unit> </trans-unit>
@@ -13382,7 +13398,7 @@
<source>Timeout in seconds for LLM requests.</source> <source>Timeout in seconds for LLM requests.</source>
<context-group purpose="location"> <context-group purpose="location">
<context context-type="sourcefile">src/app/data/paperless-config.ts</context> <context context-type="sourcefile">src/app/data/paperless-config.ts</context>
<context context-type="linenumber">420</context> <context context-type="linenumber">428</context>
</context-group> </context-group>
<target state="needs-translation">Timeout in seconds for LLM requests.</target> <target state="needs-translation">Timeout in seconds for LLM requests.</target>
</trans-unit> </trans-unit>
+37 -21
View File
@@ -10741,7 +10741,7 @@
</context-group> </context-group>
<context-group purpose="location"> <context-group purpose="location">
<context context-type="sourcefile">src/app/components/document-list/document-list.component.ts</context> <context context-type="sourcefile">src/app/components/document-list/document-list.component.ts</context>
<context context-type="linenumber">348</context> <context context-type="linenumber">351</context>
</context-group> </context-group>
<context-group purpose="location"> <context-group purpose="location">
<context context-type="sourcefile">src/app/components/manage/document-attributes/document-attributes.component.html</context> <context context-type="sourcefile">src/app/components/manage/document-attributes/document-attributes.component.html</context>
@@ -10757,7 +10757,7 @@
</context-group> </context-group>
<context-group purpose="location"> <context-group purpose="location">
<context context-type="sourcefile">src/app/components/document-list/document-list.component.ts</context> <context context-type="sourcefile">src/app/components/document-list/document-list.component.ts</context>
<context context-type="linenumber">341</context> <context context-type="linenumber">344</context>
</context-group> </context-group>
<context-group purpose="location"> <context-group purpose="location">
<context context-type="sourcefile">src/app/components/manage/document-attributes/document-attributes.component.html</context> <context context-type="sourcefile">src/app/components/manage/document-attributes/document-attributes.component.html</context>
@@ -11041,7 +11041,7 @@
<source>Reset filters / selection</source> <source>Reset filters / selection</source>
<context-group purpose="location"> <context-group purpose="location">
<context context-type="sourcefile">src/app/components/document-list/document-list.component.ts</context> <context context-type="sourcefile">src/app/components/document-list/document-list.component.ts</context>
<context context-type="linenumber">329</context> <context context-type="linenumber">332</context>
</context-group> </context-group>
<target state="translated">Resetiraj filtere / odabir</target> <target state="translated">Resetiraj filtere / odabir</target>
</trans-unit> </trans-unit>
@@ -11049,7 +11049,7 @@
<source>Open first [selected] document</source> <source>Open first [selected] document</source>
<context-group purpose="location"> <context-group purpose="location">
<context context-type="sourcefile">src/app/components/document-list/document-list.component.ts</context> <context context-type="sourcefile">src/app/components/document-list/document-list.component.ts</context>
<context context-type="linenumber">357</context> <context context-type="linenumber">360</context>
</context-group> </context-group>
<target state="translated">Otvori prvi [odabrani] dokument</target> <target state="translated">Otvori prvi [odabrani] dokument</target>
</trans-unit> </trans-unit>
@@ -11057,7 +11057,7 @@
<source>Previous page</source> <source>Previous page</source>
<context-group purpose="location"> <context-group purpose="location">
<context context-type="sourcefile">src/app/components/document-list/document-list.component.ts</context> <context context-type="sourcefile">src/app/components/document-list/document-list.component.ts</context>
<context context-type="linenumber">373</context> <context context-type="linenumber">376</context>
</context-group> </context-group>
<target state="translated">Prethodna stranica</target> <target state="translated">Prethodna stranica</target>
</trans-unit> </trans-unit>
@@ -11065,7 +11065,7 @@
<source>Next page</source> <source>Next page</source>
<context-group purpose="location"> <context-group purpose="location">
<context context-type="sourcefile">src/app/components/document-list/document-list.component.ts</context> <context context-type="sourcefile">src/app/components/document-list/document-list.component.ts</context>
<context context-type="linenumber">385</context> <context context-type="linenumber">388</context>
</context-group> </context-group>
<target state="translated">Sljedeća stranica</target> <target state="translated">Sljedeća stranica</target>
</trans-unit> </trans-unit>
@@ -11073,7 +11073,7 @@
<source>View &quot;<x id="PH" equiv-text="this.list.activeSavedViewTitle"/>&quot; saved successfully.</source> <source>View &quot;<x id="PH" equiv-text="this.list.activeSavedViewTitle"/>&quot; saved successfully.</source>
<context-group purpose="location"> <context-group purpose="location">
<context context-type="sourcefile">src/app/components/document-list/document-list.component.ts</context> <context context-type="sourcefile">src/app/components/document-list/document-list.component.ts</context>
<context context-type="linenumber">419</context> <context context-type="linenumber">422</context>
</context-group> </context-group>
<target state="translated">Prikaz "<x id="PH" equiv-text="this.list.activeSavedViewTitle"/>" uspješno spremljen.</target> <target state="translated">Prikaz "<x id="PH" equiv-text="this.list.activeSavedViewTitle"/>" uspješno spremljen.</target>
</trans-unit> </trans-unit>
@@ -11081,7 +11081,7 @@
<source>Failed to save view &quot;<x id="PH" equiv-text="this.list.activeSavedViewTitle"/>&quot;.</source> <source>Failed to save view &quot;<x id="PH" equiv-text="this.list.activeSavedViewTitle"/>&quot;.</source>
<context-group purpose="location"> <context-group purpose="location">
<context context-type="sourcefile">src/app/components/document-list/document-list.component.ts</context> <context context-type="sourcefile">src/app/components/document-list/document-list.component.ts</context>
<context context-type="linenumber">425</context> <context context-type="linenumber">428</context>
</context-group> </context-group>
<target state="translated">Spremanje prikaza "<x id="PH" equiv-text="this.list.activeSavedViewTitle"/>" nije uspjelo.</target> <target state="translated">Spremanje prikaza "<x id="PH" equiv-text="this.list.activeSavedViewTitle"/>" nije uspjelo.</target>
</trans-unit> </trans-unit>
@@ -11089,7 +11089,7 @@
<source>View &quot;<x id="PH" equiv-text="savedView.name"/>&quot; created successfully.</source> <source>View &quot;<x id="PH" equiv-text="savedView.name"/>&quot; created successfully.</source>
<context-group purpose="location"> <context-group purpose="location">
<context context-type="sourcefile">src/app/components/document-list/document-list.component.ts</context> <context context-type="sourcefile">src/app/components/document-list/document-list.component.ts</context>
<context context-type="linenumber">494</context> <context context-type="linenumber">497</context>
</context-group> </context-group>
<target state="translated">Prikaz "<x id="PH" equiv-text="savedView.name"/>" uspješno kreiran.</target> <target state="translated">Prikaz "<x id="PH" equiv-text="savedView.name"/>" uspješno kreiran.</target>
</trans-unit> </trans-unit>
@@ -11097,7 +11097,7 @@
<source>View &quot;<x id="PH" equiv-text="savedView.name"/>&quot; created successfully, but could not update visibility settings.</source> <source>View &quot;<x id="PH" equiv-text="savedView.name"/>&quot; created successfully, but could not update visibility settings.</source>
<context-group purpose="location"> <context-group purpose="location">
<context context-type="sourcefile">src/app/components/document-list/document-list.component.ts</context> <context context-type="sourcefile">src/app/components/document-list/document-list.component.ts</context>
<context context-type="linenumber">500</context> <context context-type="linenumber">503</context>
</context-group> </context-group>
<target state="translated">Prikaz "<x id="PH" equiv-text="savedView.name"/>" uspješno kreiran, ali nije moguće ažurirati postavke vidljivosti.</target> <target state="translated">Prikaz "<x id="PH" equiv-text="savedView.name"/>" uspješno kreiran, ali nije moguće ažurirati postavke vidljivosti.</target>
</trans-unit> </trans-unit>
@@ -13298,11 +13298,27 @@
</context-group> </context-group>
<target state="translated">LLM embedding model</target> <target state="translated">LLM embedding model</target>
</trans-unit> </trans-unit>
<trans-unit id="861068592166833023" datatype="html">
<source>LLM Embedding API Key</source>
<context-group purpose="location">
<context context-type="sourcefile">src/app/data/paperless-config.ts</context>
<context context-type="linenumber">358</context>
</context-group>
<target state="needs-translation">LLM Embedding API Key</target>
</trans-unit>
<trans-unit id="2929108042259892948" datatype="html">
<source>Used for embeddings when set, otherwise LLM API key is used.</source>
<context-group purpose="location">
<context context-type="sourcefile">src/app/data/paperless-config.ts</context>
<context context-type="linenumber">360</context>
</context-group>
<target state="needs-translation">Used for embeddings when set, otherwise LLM API key is used.</target>
</trans-unit>
<trans-unit id="3554114880473286122" datatype="html"> <trans-unit id="3554114880473286122" datatype="html">
<source>LLM Embedding Endpoint</source> <source>LLM Embedding Endpoint</source>
<context-group purpose="location"> <context-group purpose="location">
<context context-type="sourcefile">src/app/data/paperless-config.ts</context> <context context-type="sourcefile">src/app/data/paperless-config.ts</context>
<context context-type="linenumber">358</context> <context context-type="linenumber">366</context>
</context-group> </context-group>
<target state="translated">LLM embedding krajnja točka</target> <target state="translated">LLM embedding krajnja točka</target>
</trans-unit> </trans-unit>
@@ -13310,7 +13326,7 @@
<source>LLM Embedding Chunk Size</source> <source>LLM Embedding Chunk Size</source>
<context-group purpose="location"> <context-group purpose="location">
<context context-type="sourcefile">src/app/data/paperless-config.ts</context> <context context-type="sourcefile">src/app/data/paperless-config.ts</context>
<context context-type="linenumber">365</context> <context context-type="linenumber">373</context>
</context-group> </context-group>
<target state="translated">Veličina LLM embedding bloka</target> <target state="translated">Veličina LLM embedding bloka</target>
</trans-unit> </trans-unit>
@@ -13318,7 +13334,7 @@
<source>LLM Context Size</source> <source>LLM Context Size</source>
<context-group purpose="location"> <context-group purpose="location">
<context context-type="sourcefile">src/app/data/paperless-config.ts</context> <context context-type="sourcefile">src/app/data/paperless-config.ts</context>
<context context-type="linenumber">372</context> <context context-type="linenumber">380</context>
</context-group> </context-group>
<target state="translated">Veličina LLM konteksta</target> <target state="translated">Veličina LLM konteksta</target>
</trans-unit> </trans-unit>
@@ -13326,7 +13342,7 @@
<source>LLM Backend</source> <source>LLM Backend</source>
<context-group purpose="location"> <context-group purpose="location">
<context context-type="sourcefile">src/app/data/paperless-config.ts</context> <context context-type="sourcefile">src/app/data/paperless-config.ts</context>
<context context-type="linenumber">379</context> <context context-type="linenumber">387</context>
</context-group> </context-group>
<target state="translated">LLM pozadina</target> <target state="translated">LLM pozadina</target>
</trans-unit> </trans-unit>
@@ -13334,7 +13350,7 @@
<source>LLM Model</source> <source>LLM Model</source>
<context-group purpose="location"> <context-group purpose="location">
<context context-type="sourcefile">src/app/data/paperless-config.ts</context> <context context-type="sourcefile">src/app/data/paperless-config.ts</context>
<context context-type="linenumber">387</context> <context context-type="linenumber">395</context>
</context-group> </context-group>
<target state="translated">LLM model</target> <target state="translated">LLM model</target>
</trans-unit> </trans-unit>
@@ -13342,7 +13358,7 @@
<source>LLM API Key</source> <source>LLM API Key</source>
<context-group purpose="location"> <context-group purpose="location">
<context context-type="sourcefile">src/app/data/paperless-config.ts</context> <context context-type="sourcefile">src/app/data/paperless-config.ts</context>
<context context-type="linenumber">394</context> <context context-type="linenumber">402</context>
</context-group> </context-group>
<target state="translated">LLM API ključ</target> <target state="translated">LLM API ključ</target>
</trans-unit> </trans-unit>
@@ -13350,7 +13366,7 @@
<source>LLM Endpoint</source> <source>LLM Endpoint</source>
<context-group purpose="location"> <context-group purpose="location">
<context context-type="sourcefile">src/app/data/paperless-config.ts</context> <context context-type="sourcefile">src/app/data/paperless-config.ts</context>
<context context-type="linenumber">401</context> <context context-type="linenumber">409</context>
</context-group> </context-group>
<target state="translated">LLM krajnja točka</target> <target state="translated">LLM krajnja točka</target>
</trans-unit> </trans-unit>
@@ -13358,7 +13374,7 @@
<source>LLM Output Language</source> <source>LLM Output Language</source>
<context-group purpose="location"> <context-group purpose="location">
<context context-type="sourcefile">src/app/data/paperless-config.ts</context> <context context-type="sourcefile">src/app/data/paperless-config.ts</context>
<context context-type="linenumber">408</context> <context context-type="linenumber">416</context>
</context-group> </context-group>
<target state="translated">LLM izlazni jezik</target> <target state="translated">LLM izlazni jezik</target>
</trans-unit> </trans-unit>
@@ -13366,7 +13382,7 @@
<source>Language to use for generated AI suggestions. When unset, AI suggestions use the user&apos;s display language if explicitly set.</source> <source>Language to use for generated AI suggestions. When unset, AI suggestions use the user&apos;s display language if explicitly set.</source>
<context-group purpose="location"> <context-group purpose="location">
<context context-type="sourcefile">src/app/data/paperless-config.ts</context> <context context-type="sourcefile">src/app/data/paperless-config.ts</context>
<context context-type="linenumber">412</context> <context context-type="linenumber">420</context>
</context-group> </context-group>
<target state="translated">Jezik za generirane AI prijedloge. Ako nije postavljeno, AI prijedlozi koriste korisnikov jezik prikaza ako je eksplicitno postavljen.</target> <target state="translated">Jezik za generirane AI prijedloge. Ako nije postavljeno, AI prijedlozi koriste korisnikov jezik prikaza ako je eksplicitno postavljen.</target>
</trans-unit> </trans-unit>
@@ -13374,7 +13390,7 @@
<source>LLM Request Timeout</source> <source>LLM Request Timeout</source>
<context-group purpose="location"> <context-group purpose="location">
<context context-type="sourcefile">src/app/data/paperless-config.ts</context> <context context-type="sourcefile">src/app/data/paperless-config.ts</context>
<context context-type="linenumber">416</context> <context context-type="linenumber">424</context>
</context-group> </context-group>
<target state="needs-translation">LLM Request Timeout</target> <target state="needs-translation">LLM Request Timeout</target>
</trans-unit> </trans-unit>
@@ -13382,7 +13398,7 @@
<source>Timeout in seconds for LLM requests.</source> <source>Timeout in seconds for LLM requests.</source>
<context-group purpose="location"> <context-group purpose="location">
<context context-type="sourcefile">src/app/data/paperless-config.ts</context> <context context-type="sourcefile">src/app/data/paperless-config.ts</context>
<context context-type="linenumber">420</context> <context context-type="linenumber">428</context>
</context-group> </context-group>
<target state="needs-translation">Timeout in seconds for LLM requests.</target> <target state="needs-translation">Timeout in seconds for LLM requests.</target>
</trans-unit> </trans-unit>
+37 -21
View File
@@ -10741,7 +10741,7 @@
</context-group> </context-group>
<context-group purpose="location"> <context-group purpose="location">
<context context-type="sourcefile">src/app/components/document-list/document-list.component.ts</context> <context context-type="sourcefile">src/app/components/document-list/document-list.component.ts</context>
<context context-type="linenumber">348</context> <context context-type="linenumber">351</context>
</context-group> </context-group>
<context-group purpose="location"> <context-group purpose="location">
<context context-type="sourcefile">src/app/components/manage/document-attributes/document-attributes.component.html</context> <context context-type="sourcefile">src/app/components/manage/document-attributes/document-attributes.component.html</context>
@@ -10757,7 +10757,7 @@
</context-group> </context-group>
<context-group purpose="location"> <context-group purpose="location">
<context context-type="sourcefile">src/app/components/document-list/document-list.component.ts</context> <context context-type="sourcefile">src/app/components/document-list/document-list.component.ts</context>
<context context-type="linenumber">341</context> <context context-type="linenumber">344</context>
</context-group> </context-group>
<context-group purpose="location"> <context-group purpose="location">
<context context-type="sourcefile">src/app/components/manage/document-attributes/document-attributes.component.html</context> <context context-type="sourcefile">src/app/components/manage/document-attributes/document-attributes.component.html</context>
@@ -11041,7 +11041,7 @@
<source>Reset filters / selection</source> <source>Reset filters / selection</source>
<context-group purpose="location"> <context-group purpose="location">
<context context-type="sourcefile">src/app/components/document-list/document-list.component.ts</context> <context context-type="sourcefile">src/app/components/document-list/document-list.component.ts</context>
<context context-type="linenumber">329</context> <context context-type="linenumber">332</context>
</context-group> </context-group>
<target state="translated">Szűrők / kiválasztás alaphelyzetbe</target> <target state="translated">Szűrők / kiválasztás alaphelyzetbe</target>
</trans-unit> </trans-unit>
@@ -11049,7 +11049,7 @@
<source>Open first [selected] document</source> <source>Open first [selected] document</source>
<context-group purpose="location"> <context-group purpose="location">
<context context-type="sourcefile">src/app/components/document-list/document-list.component.ts</context> <context context-type="sourcefile">src/app/components/document-list/document-list.component.ts</context>
<context context-type="linenumber">357</context> <context context-type="linenumber">360</context>
</context-group> </context-group>
<target state="translated">Első [kiválasztott] dokumentum megnyitása</target> <target state="translated">Első [kiválasztott] dokumentum megnyitása</target>
</trans-unit> </trans-unit>
@@ -11057,7 +11057,7 @@
<source>Previous page</source> <source>Previous page</source>
<context-group purpose="location"> <context-group purpose="location">
<context context-type="sourcefile">src/app/components/document-list/document-list.component.ts</context> <context context-type="sourcefile">src/app/components/document-list/document-list.component.ts</context>
<context context-type="linenumber">373</context> <context context-type="linenumber">376</context>
</context-group> </context-group>
<target state="translated">Előző oldal</target> <target state="translated">Előző oldal</target>
</trans-unit> </trans-unit>
@@ -11065,7 +11065,7 @@
<source>Next page</source> <source>Next page</source>
<context-group purpose="location"> <context-group purpose="location">
<context context-type="sourcefile">src/app/components/document-list/document-list.component.ts</context> <context context-type="sourcefile">src/app/components/document-list/document-list.component.ts</context>
<context context-type="linenumber">385</context> <context context-type="linenumber">388</context>
</context-group> </context-group>
<target state="translated">Következő oldal</target> <target state="translated">Következő oldal</target>
</trans-unit> </trans-unit>
@@ -11073,7 +11073,7 @@
<source>View &quot;<x id="PH" equiv-text="this.list.activeSavedViewTitle"/>&quot; saved successfully.</source> <source>View &quot;<x id="PH" equiv-text="this.list.activeSavedViewTitle"/>&quot; saved successfully.</source>
<context-group purpose="location"> <context-group purpose="location">
<context context-type="sourcefile">src/app/components/document-list/document-list.component.ts</context> <context context-type="sourcefile">src/app/components/document-list/document-list.component.ts</context>
<context context-type="linenumber">419</context> <context context-type="linenumber">422</context>
</context-group> </context-group>
<target state="translated">Nézet "<x id="PH" equiv-text="this.list.activeSavedViewTitle"/>" sikeresen mentve.</target> <target state="translated">Nézet "<x id="PH" equiv-text="this.list.activeSavedViewTitle"/>" sikeresen mentve.</target>
</trans-unit> </trans-unit>
@@ -11081,7 +11081,7 @@
<source>Failed to save view &quot;<x id="PH" equiv-text="this.list.activeSavedViewTitle"/>&quot;.</source> <source>Failed to save view &quot;<x id="PH" equiv-text="this.list.activeSavedViewTitle"/>&quot;.</source>
<context-group purpose="location"> <context-group purpose="location">
<context context-type="sourcefile">src/app/components/document-list/document-list.component.ts</context> <context context-type="sourcefile">src/app/components/document-list/document-list.component.ts</context>
<context context-type="linenumber">425</context> <context context-type="linenumber">428</context>
</context-group> </context-group>
<target state="translated">"<x id="PH" equiv-text="this.list.activeSavedViewTitle"/>" nézet mentése sikertelen.</target> <target state="translated">"<x id="PH" equiv-text="this.list.activeSavedViewTitle"/>" nézet mentése sikertelen.</target>
</trans-unit> </trans-unit>
@@ -11089,7 +11089,7 @@
<source>View &quot;<x id="PH" equiv-text="savedView.name"/>&quot; created successfully.</source> <source>View &quot;<x id="PH" equiv-text="savedView.name"/>&quot; created successfully.</source>
<context-group purpose="location"> <context-group purpose="location">
<context context-type="sourcefile">src/app/components/document-list/document-list.component.ts</context> <context context-type="sourcefile">src/app/components/document-list/document-list.component.ts</context>
<context context-type="linenumber">494</context> <context context-type="linenumber">497</context>
</context-group> </context-group>
<target state="translated">Nézet "<x id="PH" equiv-text="savedView.name"/>" sikeresen létrehozva.</target> <target state="translated">Nézet "<x id="PH" equiv-text="savedView.name"/>" sikeresen létrehozva.</target>
</trans-unit> </trans-unit>
@@ -11097,7 +11097,7 @@
<source>View &quot;<x id="PH" equiv-text="savedView.name"/>&quot; created successfully, but could not update visibility settings.</source> <source>View &quot;<x id="PH" equiv-text="savedView.name"/>&quot; created successfully, but could not update visibility settings.</source>
<context-group purpose="location"> <context-group purpose="location">
<context context-type="sourcefile">src/app/components/document-list/document-list.component.ts</context> <context context-type="sourcefile">src/app/components/document-list/document-list.component.ts</context>
<context context-type="linenumber">500</context> <context context-type="linenumber">503</context>
</context-group> </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="needs-translation">View "<x id="PH" equiv-text="savedView.name"/>" created successfully, but could not update visibility settings.</target>
</trans-unit> </trans-unit>
@@ -13298,11 +13298,27 @@
</context-group> </context-group>
<target state="needs-translation">LLM Embedding Model</target> <target state="needs-translation">LLM Embedding Model</target>
</trans-unit> </trans-unit>
<trans-unit id="861068592166833023" datatype="html">
<source>LLM Embedding API Key</source>
<context-group purpose="location">
<context context-type="sourcefile">src/app/data/paperless-config.ts</context>
<context context-type="linenumber">358</context>
</context-group>
<target state="needs-translation">LLM Embedding API Key</target>
</trans-unit>
<trans-unit id="2929108042259892948" datatype="html">
<source>Used for embeddings when set, otherwise LLM API key is used.</source>
<context-group purpose="location">
<context context-type="sourcefile">src/app/data/paperless-config.ts</context>
<context context-type="linenumber">360</context>
</context-group>
<target state="needs-translation">Used for embeddings when set, otherwise LLM API key is used.</target>
</trans-unit>
<trans-unit id="3554114880473286122" datatype="html"> <trans-unit id="3554114880473286122" datatype="html">
<source>LLM Embedding Endpoint</source> <source>LLM Embedding Endpoint</source>
<context-group purpose="location"> <context-group purpose="location">
<context context-type="sourcefile">src/app/data/paperless-config.ts</context> <context context-type="sourcefile">src/app/data/paperless-config.ts</context>
<context context-type="linenumber">358</context> <context context-type="linenumber">366</context>
</context-group> </context-group>
<target state="needs-translation">LLM Embedding Endpoint</target> <target state="needs-translation">LLM Embedding Endpoint</target>
</trans-unit> </trans-unit>
@@ -13310,7 +13326,7 @@
<source>LLM Embedding Chunk Size</source> <source>LLM Embedding Chunk Size</source>
<context-group purpose="location"> <context-group purpose="location">
<context context-type="sourcefile">src/app/data/paperless-config.ts</context> <context context-type="sourcefile">src/app/data/paperless-config.ts</context>
<context context-type="linenumber">365</context> <context context-type="linenumber">373</context>
</context-group> </context-group>
<target state="needs-translation">LLM Embedding Chunk Size</target> <target state="needs-translation">LLM Embedding Chunk Size</target>
</trans-unit> </trans-unit>
@@ -13318,7 +13334,7 @@
<source>LLM Context Size</source> <source>LLM Context Size</source>
<context-group purpose="location"> <context-group purpose="location">
<context context-type="sourcefile">src/app/data/paperless-config.ts</context> <context context-type="sourcefile">src/app/data/paperless-config.ts</context>
<context context-type="linenumber">372</context> <context context-type="linenumber">380</context>
</context-group> </context-group>
<target state="needs-translation">LLM Context Size</target> <target state="needs-translation">LLM Context Size</target>
</trans-unit> </trans-unit>
@@ -13326,7 +13342,7 @@
<source>LLM Backend</source> <source>LLM Backend</source>
<context-group purpose="location"> <context-group purpose="location">
<context context-type="sourcefile">src/app/data/paperless-config.ts</context> <context context-type="sourcefile">src/app/data/paperless-config.ts</context>
<context context-type="linenumber">379</context> <context context-type="linenumber">387</context>
</context-group> </context-group>
<target state="needs-translation">LLM Backend</target> <target state="needs-translation">LLM Backend</target>
</trans-unit> </trans-unit>
@@ -13334,7 +13350,7 @@
<source>LLM Model</source> <source>LLM Model</source>
<context-group purpose="location"> <context-group purpose="location">
<context context-type="sourcefile">src/app/data/paperless-config.ts</context> <context context-type="sourcefile">src/app/data/paperless-config.ts</context>
<context context-type="linenumber">387</context> <context context-type="linenumber">395</context>
</context-group> </context-group>
<target state="needs-translation">LLM Model</target> <target state="needs-translation">LLM Model</target>
</trans-unit> </trans-unit>
@@ -13342,7 +13358,7 @@
<source>LLM API Key</source> <source>LLM API Key</source>
<context-group purpose="location"> <context-group purpose="location">
<context context-type="sourcefile">src/app/data/paperless-config.ts</context> <context context-type="sourcefile">src/app/data/paperless-config.ts</context>
<context context-type="linenumber">394</context> <context context-type="linenumber">402</context>
</context-group> </context-group>
<target state="needs-translation">LLM API Key</target> <target state="needs-translation">LLM API Key</target>
</trans-unit> </trans-unit>
@@ -13350,7 +13366,7 @@
<source>LLM Endpoint</source> <source>LLM Endpoint</source>
<context-group purpose="location"> <context-group purpose="location">
<context context-type="sourcefile">src/app/data/paperless-config.ts</context> <context context-type="sourcefile">src/app/data/paperless-config.ts</context>
<context context-type="linenumber">401</context> <context context-type="linenumber">409</context>
</context-group> </context-group>
<target state="needs-translation">LLM Endpoint</target> <target state="needs-translation">LLM Endpoint</target>
</trans-unit> </trans-unit>
@@ -13358,7 +13374,7 @@
<source>LLM Output Language</source> <source>LLM Output Language</source>
<context-group purpose="location"> <context-group purpose="location">
<context context-type="sourcefile">src/app/data/paperless-config.ts</context> <context context-type="sourcefile">src/app/data/paperless-config.ts</context>
<context context-type="linenumber">408</context> <context context-type="linenumber">416</context>
</context-group> </context-group>
<target state="needs-translation">LLM Output Language</target> <target state="needs-translation">LLM Output Language</target>
</trans-unit> </trans-unit>
@@ -13366,7 +13382,7 @@
<source>Language to use for generated AI suggestions. When unset, AI suggestions use the user&apos;s display language if explicitly set.</source> <source>Language to use for generated AI suggestions. When unset, AI suggestions use the user&apos;s display language if explicitly set.</source>
<context-group purpose="location"> <context-group purpose="location">
<context context-type="sourcefile">src/app/data/paperless-config.ts</context> <context context-type="sourcefile">src/app/data/paperless-config.ts</context>
<context context-type="linenumber">412</context> <context context-type="linenumber">420</context>
</context-group> </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="needs-translation">Language to use for generated AI suggestions. When unset, AI suggestions use the user's display language if explicitly set.</target>
</trans-unit> </trans-unit>
@@ -13374,7 +13390,7 @@
<source>LLM Request Timeout</source> <source>LLM Request Timeout</source>
<context-group purpose="location"> <context-group purpose="location">
<context context-type="sourcefile">src/app/data/paperless-config.ts</context> <context context-type="sourcefile">src/app/data/paperless-config.ts</context>
<context context-type="linenumber">416</context> <context context-type="linenumber">424</context>
</context-group> </context-group>
<target state="needs-translation">LLM Request Timeout</target> <target state="needs-translation">LLM Request Timeout</target>
</trans-unit> </trans-unit>
@@ -13382,7 +13398,7 @@
<source>Timeout in seconds for LLM requests.</source> <source>Timeout in seconds for LLM requests.</source>
<context-group purpose="location"> <context-group purpose="location">
<context context-type="sourcefile">src/app/data/paperless-config.ts</context> <context context-type="sourcefile">src/app/data/paperless-config.ts</context>
<context context-type="linenumber">420</context> <context context-type="linenumber">428</context>
</context-group> </context-group>
<target state="needs-translation">Timeout in seconds for LLM requests.</target> <target state="needs-translation">Timeout in seconds for LLM requests.</target>
</trans-unit> </trans-unit>
+37 -21
View File
@@ -10740,7 +10740,7 @@
</context-group> </context-group>
<context-group purpose="location"> <context-group purpose="location">
<context context-type="sourcefile">src/app/components/document-list/document-list.component.ts</context> <context context-type="sourcefile">src/app/components/document-list/document-list.component.ts</context>
<context context-type="linenumber">348</context> <context context-type="linenumber">351</context>
</context-group> </context-group>
<context-group purpose="location"> <context-group purpose="location">
<context context-type="sourcefile">src/app/components/manage/document-attributes/document-attributes.component.html</context> <context context-type="sourcefile">src/app/components/manage/document-attributes/document-attributes.component.html</context>
@@ -10756,7 +10756,7 @@
</context-group> </context-group>
<context-group purpose="location"> <context-group purpose="location">
<context context-type="sourcefile">src/app/components/document-list/document-list.component.ts</context> <context context-type="sourcefile">src/app/components/document-list/document-list.component.ts</context>
<context context-type="linenumber">341</context> <context context-type="linenumber">344</context>
</context-group> </context-group>
<context-group purpose="location"> <context-group purpose="location">
<context context-type="sourcefile">src/app/components/manage/document-attributes/document-attributes.component.html</context> <context context-type="sourcefile">src/app/components/manage/document-attributes/document-attributes.component.html</context>
@@ -11040,7 +11040,7 @@
<source>Reset filters / selection</source> <source>Reset filters / selection</source>
<context-group purpose="location"> <context-group purpose="location">
<context context-type="sourcefile">src/app/components/document-list/document-list.component.ts</context> <context context-type="sourcefile">src/app/components/document-list/document-list.component.ts</context>
<context context-type="linenumber">329</context> <context context-type="linenumber">332</context>
</context-group> </context-group>
<target state="translated">Reset filter / pilihan</target> <target state="translated">Reset filter / pilihan</target>
</trans-unit> </trans-unit>
@@ -11048,7 +11048,7 @@
<source>Open first [selected] document</source> <source>Open first [selected] document</source>
<context-group purpose="location"> <context-group purpose="location">
<context context-type="sourcefile">src/app/components/document-list/document-list.component.ts</context> <context context-type="sourcefile">src/app/components/document-list/document-list.component.ts</context>
<context context-type="linenumber">357</context> <context context-type="linenumber">360</context>
</context-group> </context-group>
<target state="translated">Buka dokumen [terpilih] pertama</target> <target state="translated">Buka dokumen [terpilih] pertama</target>
</trans-unit> </trans-unit>
@@ -11056,7 +11056,7 @@
<source>Previous page</source> <source>Previous page</source>
<context-group purpose="location"> <context-group purpose="location">
<context context-type="sourcefile">src/app/components/document-list/document-list.component.ts</context> <context context-type="sourcefile">src/app/components/document-list/document-list.component.ts</context>
<context context-type="linenumber">373</context> <context context-type="linenumber">376</context>
</context-group> </context-group>
<target state="translated">Halaman sebelumnya</target> <target state="translated">Halaman sebelumnya</target>
</trans-unit> </trans-unit>
@@ -11064,7 +11064,7 @@
<source>Next page</source> <source>Next page</source>
<context-group purpose="location"> <context-group purpose="location">
<context context-type="sourcefile">src/app/components/document-list/document-list.component.ts</context> <context context-type="sourcefile">src/app/components/document-list/document-list.component.ts</context>
<context context-type="linenumber">385</context> <context context-type="linenumber">388</context>
</context-group> </context-group>
<target state="translated">Halaman berikutnya</target> <target state="translated">Halaman berikutnya</target>
</trans-unit> </trans-unit>
@@ -11072,7 +11072,7 @@
<source>View &quot;<x id="PH" equiv-text="this.list.activeSavedViewTitle"/>&quot; saved successfully.</source> <source>View &quot;<x id="PH" equiv-text="this.list.activeSavedViewTitle"/>&quot; saved successfully.</source>
<context-group purpose="location"> <context-group purpose="location">
<context context-type="sourcefile">src/app/components/document-list/document-list.component.ts</context> <context context-type="sourcefile">src/app/components/document-list/document-list.component.ts</context>
<context context-type="linenumber">419</context> <context context-type="linenumber">422</context>
</context-group> </context-group>
<target state="translated">Tampilan "<x id="PH" equiv-text="this.list.activeSavedViewTitle"/>" berhasil disimpan.</target> <target state="translated">Tampilan "<x id="PH" equiv-text="this.list.activeSavedViewTitle"/>" berhasil disimpan.</target>
</trans-unit> </trans-unit>
@@ -11080,7 +11080,7 @@
<source>Failed to save view &quot;<x id="PH" equiv-text="this.list.activeSavedViewTitle"/>&quot;.</source> <source>Failed to save view &quot;<x id="PH" equiv-text="this.list.activeSavedViewTitle"/>&quot;.</source>
<context-group purpose="location"> <context-group purpose="location">
<context context-type="sourcefile">src/app/components/document-list/document-list.component.ts</context> <context context-type="sourcefile">src/app/components/document-list/document-list.component.ts</context>
<context context-type="linenumber">425</context> <context context-type="linenumber">428</context>
</context-group> </context-group>
<target state="translated">Gagal menyimpan tampilan "<x id="PH" equiv-text="this.list.activeSavedViewTitle"/>".</target> <target state="translated">Gagal menyimpan tampilan "<x id="PH" equiv-text="this.list.activeSavedViewTitle"/>".</target>
</trans-unit> </trans-unit>
@@ -11088,7 +11088,7 @@
<source>View &quot;<x id="PH" equiv-text="savedView.name"/>&quot; created successfully.</source> <source>View &quot;<x id="PH" equiv-text="savedView.name"/>&quot; created successfully.</source>
<context-group purpose="location"> <context-group purpose="location">
<context context-type="sourcefile">src/app/components/document-list/document-list.component.ts</context> <context context-type="sourcefile">src/app/components/document-list/document-list.component.ts</context>
<context context-type="linenumber">494</context> <context context-type="linenumber">497</context>
</context-group> </context-group>
<target state="translated">Tampilan "<x id="PH" equiv-text="savedView.name"/>" berhasil dibuat.</target> <target state="translated">Tampilan "<x id="PH" equiv-text="savedView.name"/>" berhasil dibuat.</target>
</trans-unit> </trans-unit>
@@ -11096,7 +11096,7 @@
<source>View &quot;<x id="PH" equiv-text="savedView.name"/>&quot; created successfully, but could not update visibility settings.</source> <source>View &quot;<x id="PH" equiv-text="savedView.name"/>&quot; created successfully, but could not update visibility settings.</source>
<context-group purpose="location"> <context-group purpose="location">
<context context-type="sourcefile">src/app/components/document-list/document-list.component.ts</context> <context context-type="sourcefile">src/app/components/document-list/document-list.component.ts</context>
<context context-type="linenumber">500</context> <context context-type="linenumber">503</context>
</context-group> </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="needs-translation">View "<x id="PH" equiv-text="savedView.name"/>" created successfully, but could not update visibility settings.</target>
</trans-unit> </trans-unit>
@@ -13297,11 +13297,27 @@
</context-group> </context-group>
<target state="needs-translation">LLM Embedding Model</target> <target state="needs-translation">LLM Embedding Model</target>
</trans-unit> </trans-unit>
<trans-unit id="861068592166833023" datatype="html">
<source>LLM Embedding API Key</source>
<context-group purpose="location">
<context context-type="sourcefile">src/app/data/paperless-config.ts</context>
<context context-type="linenumber">358</context>
</context-group>
<target state="needs-translation">LLM Embedding API Key</target>
</trans-unit>
<trans-unit id="2929108042259892948" datatype="html">
<source>Used for embeddings when set, otherwise LLM API key is used.</source>
<context-group purpose="location">
<context context-type="sourcefile">src/app/data/paperless-config.ts</context>
<context context-type="linenumber">360</context>
</context-group>
<target state="needs-translation">Used for embeddings when set, otherwise LLM API key is used.</target>
</trans-unit>
<trans-unit id="3554114880473286122" datatype="html"> <trans-unit id="3554114880473286122" datatype="html">
<source>LLM Embedding Endpoint</source> <source>LLM Embedding Endpoint</source>
<context-group purpose="location"> <context-group purpose="location">
<context context-type="sourcefile">src/app/data/paperless-config.ts</context> <context context-type="sourcefile">src/app/data/paperless-config.ts</context>
<context context-type="linenumber">358</context> <context context-type="linenumber">366</context>
</context-group> </context-group>
<target state="needs-translation">LLM Embedding Endpoint</target> <target state="needs-translation">LLM Embedding Endpoint</target>
</trans-unit> </trans-unit>
@@ -13309,7 +13325,7 @@
<source>LLM Embedding Chunk Size</source> <source>LLM Embedding Chunk Size</source>
<context-group purpose="location"> <context-group purpose="location">
<context context-type="sourcefile">src/app/data/paperless-config.ts</context> <context context-type="sourcefile">src/app/data/paperless-config.ts</context>
<context context-type="linenumber">365</context> <context context-type="linenumber">373</context>
</context-group> </context-group>
<target state="needs-translation">LLM Embedding Chunk Size</target> <target state="needs-translation">LLM Embedding Chunk Size</target>
</trans-unit> </trans-unit>
@@ -13317,7 +13333,7 @@
<source>LLM Context Size</source> <source>LLM Context Size</source>
<context-group purpose="location"> <context-group purpose="location">
<context context-type="sourcefile">src/app/data/paperless-config.ts</context> <context context-type="sourcefile">src/app/data/paperless-config.ts</context>
<context context-type="linenumber">372</context> <context context-type="linenumber">380</context>
</context-group> </context-group>
<target state="needs-translation">LLM Context Size</target> <target state="needs-translation">LLM Context Size</target>
</trans-unit> </trans-unit>
@@ -13325,7 +13341,7 @@
<source>LLM Backend</source> <source>LLM Backend</source>
<context-group purpose="location"> <context-group purpose="location">
<context context-type="sourcefile">src/app/data/paperless-config.ts</context> <context context-type="sourcefile">src/app/data/paperless-config.ts</context>
<context context-type="linenumber">379</context> <context context-type="linenumber">387</context>
</context-group> </context-group>
<target state="needs-translation">LLM Backend</target> <target state="needs-translation">LLM Backend</target>
</trans-unit> </trans-unit>
@@ -13333,7 +13349,7 @@
<source>LLM Model</source> <source>LLM Model</source>
<context-group purpose="location"> <context-group purpose="location">
<context context-type="sourcefile">src/app/data/paperless-config.ts</context> <context context-type="sourcefile">src/app/data/paperless-config.ts</context>
<context context-type="linenumber">387</context> <context context-type="linenumber">395</context>
</context-group> </context-group>
<target state="needs-translation">LLM Model</target> <target state="needs-translation">LLM Model</target>
</trans-unit> </trans-unit>
@@ -13341,7 +13357,7 @@
<source>LLM API Key</source> <source>LLM API Key</source>
<context-group purpose="location"> <context-group purpose="location">
<context context-type="sourcefile">src/app/data/paperless-config.ts</context> <context context-type="sourcefile">src/app/data/paperless-config.ts</context>
<context context-type="linenumber">394</context> <context context-type="linenumber">402</context>
</context-group> </context-group>
<target state="needs-translation">LLM API Key</target> <target state="needs-translation">LLM API Key</target>
</trans-unit> </trans-unit>
@@ -13349,7 +13365,7 @@
<source>LLM Endpoint</source> <source>LLM Endpoint</source>
<context-group purpose="location"> <context-group purpose="location">
<context context-type="sourcefile">src/app/data/paperless-config.ts</context> <context context-type="sourcefile">src/app/data/paperless-config.ts</context>
<context context-type="linenumber">401</context> <context context-type="linenumber">409</context>
</context-group> </context-group>
<target state="needs-translation">LLM Endpoint</target> <target state="needs-translation">LLM Endpoint</target>
</trans-unit> </trans-unit>
@@ -13357,7 +13373,7 @@
<source>LLM Output Language</source> <source>LLM Output Language</source>
<context-group purpose="location"> <context-group purpose="location">
<context context-type="sourcefile">src/app/data/paperless-config.ts</context> <context context-type="sourcefile">src/app/data/paperless-config.ts</context>
<context context-type="linenumber">408</context> <context context-type="linenumber">416</context>
</context-group> </context-group>
<target state="needs-translation">LLM Output Language</target> <target state="needs-translation">LLM Output Language</target>
</trans-unit> </trans-unit>
@@ -13365,7 +13381,7 @@
<source>Language to use for generated AI suggestions. When unset, AI suggestions use the user&apos;s display language if explicitly set.</source> <source>Language to use for generated AI suggestions. When unset, AI suggestions use the user&apos;s display language if explicitly set.</source>
<context-group purpose="location"> <context-group purpose="location">
<context context-type="sourcefile">src/app/data/paperless-config.ts</context> <context context-type="sourcefile">src/app/data/paperless-config.ts</context>
<context context-type="linenumber">412</context> <context context-type="linenumber">420</context>
</context-group> </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="needs-translation">Language to use for generated AI suggestions. When unset, AI suggestions use the user's display language if explicitly set.</target>
</trans-unit> </trans-unit>
@@ -13373,7 +13389,7 @@
<source>LLM Request Timeout</source> <source>LLM Request Timeout</source>
<context-group purpose="location"> <context-group purpose="location">
<context context-type="sourcefile">src/app/data/paperless-config.ts</context> <context context-type="sourcefile">src/app/data/paperless-config.ts</context>
<context context-type="linenumber">416</context> <context context-type="linenumber">424</context>
</context-group> </context-group>
<target state="needs-translation">LLM Request Timeout</target> <target state="needs-translation">LLM Request Timeout</target>
</trans-unit> </trans-unit>
@@ -13381,7 +13397,7 @@
<source>Timeout in seconds for LLM requests.</source> <source>Timeout in seconds for LLM requests.</source>
<context-group purpose="location"> <context-group purpose="location">
<context context-type="sourcefile">src/app/data/paperless-config.ts</context> <context context-type="sourcefile">src/app/data/paperless-config.ts</context>
<context context-type="linenumber">420</context> <context context-type="linenumber">428</context>
</context-group> </context-group>
<target state="needs-translation">Timeout in seconds for LLM requests.</target> <target state="needs-translation">Timeout in seconds for LLM requests.</target>
</trans-unit> </trans-unit>
+37 -21
View File
@@ -10741,7 +10741,7 @@
</context-group> </context-group>
<context-group purpose="location"> <context-group purpose="location">
<context context-type="sourcefile">src/app/components/document-list/document-list.component.ts</context> <context context-type="sourcefile">src/app/components/document-list/document-list.component.ts</context>
<context context-type="linenumber">348</context> <context context-type="linenumber">351</context>
</context-group> </context-group>
<context-group purpose="location"> <context-group purpose="location">
<context context-type="sourcefile">src/app/components/manage/document-attributes/document-attributes.component.html</context> <context context-type="sourcefile">src/app/components/manage/document-attributes/document-attributes.component.html</context>
@@ -10757,7 +10757,7 @@
</context-group> </context-group>
<context-group purpose="location"> <context-group purpose="location">
<context context-type="sourcefile">src/app/components/document-list/document-list.component.ts</context> <context context-type="sourcefile">src/app/components/document-list/document-list.component.ts</context>
<context context-type="linenumber">341</context> <context context-type="linenumber">344</context>
</context-group> </context-group>
<context-group purpose="location"> <context-group purpose="location">
<context context-type="sourcefile">src/app/components/manage/document-attributes/document-attributes.component.html</context> <context context-type="sourcefile">src/app/components/manage/document-attributes/document-attributes.component.html</context>
@@ -11041,7 +11041,7 @@
<source>Reset filters / selection</source> <source>Reset filters / selection</source>
<context-group purpose="location"> <context-group purpose="location">
<context context-type="sourcefile">src/app/components/document-list/document-list.component.ts</context> <context context-type="sourcefile">src/app/components/document-list/document-list.component.ts</context>
<context context-type="linenumber">329</context> <context context-type="linenumber">332</context>
</context-group> </context-group>
<target state="translated">Azzera filtri / selezione</target> <target state="translated">Azzera filtri / selezione</target>
</trans-unit> </trans-unit>
@@ -11049,7 +11049,7 @@
<source>Open first [selected] document</source> <source>Open first [selected] document</source>
<context-group purpose="location"> <context-group purpose="location">
<context context-type="sourcefile">src/app/components/document-list/document-list.component.ts</context> <context context-type="sourcefile">src/app/components/document-list/document-list.component.ts</context>
<context context-type="linenumber">357</context> <context context-type="linenumber">360</context>
</context-group> </context-group>
<target state="translated">Apri il primo documento [selezionato]</target> <target state="translated">Apri il primo documento [selezionato]</target>
</trans-unit> </trans-unit>
@@ -11057,7 +11057,7 @@
<source>Previous page</source> <source>Previous page</source>
<context-group purpose="location"> <context-group purpose="location">
<context context-type="sourcefile">src/app/components/document-list/document-list.component.ts</context> <context context-type="sourcefile">src/app/components/document-list/document-list.component.ts</context>
<context context-type="linenumber">373</context> <context context-type="linenumber">376</context>
</context-group> </context-group>
<target state="translated">Pagina precedente</target> <target state="translated">Pagina precedente</target>
</trans-unit> </trans-unit>
@@ -11065,7 +11065,7 @@
<source>Next page</source> <source>Next page</source>
<context-group purpose="location"> <context-group purpose="location">
<context context-type="sourcefile">src/app/components/document-list/document-list.component.ts</context> <context context-type="sourcefile">src/app/components/document-list/document-list.component.ts</context>
<context context-type="linenumber">385</context> <context context-type="linenumber">388</context>
</context-group> </context-group>
<target state="translated">Pagina successiva</target> <target state="translated">Pagina successiva</target>
</trans-unit> </trans-unit>
@@ -11073,7 +11073,7 @@
<source>View &quot;<x id="PH" equiv-text="this.list.activeSavedViewTitle"/>&quot; saved successfully.</source> <source>View &quot;<x id="PH" equiv-text="this.list.activeSavedViewTitle"/>&quot; saved successfully.</source>
<context-group purpose="location"> <context-group purpose="location">
<context context-type="sourcefile">src/app/components/document-list/document-list.component.ts</context> <context context-type="sourcefile">src/app/components/document-list/document-list.component.ts</context>
<context context-type="linenumber">419</context> <context context-type="linenumber">422</context>
</context-group> </context-group>
<target state="final">La vista "<x id="PH" equiv-text="this.list.activeSavedViewTitle"/>" è stata salvata.</target> <target state="final">La vista "<x id="PH" equiv-text="this.list.activeSavedViewTitle"/>" è stata salvata.</target>
</trans-unit> </trans-unit>
@@ -11081,7 +11081,7 @@
<source>Failed to save view &quot;<x id="PH" equiv-text="this.list.activeSavedViewTitle"/>&quot;.</source> <source>Failed to save view &quot;<x id="PH" equiv-text="this.list.activeSavedViewTitle"/>&quot;.</source>
<context-group purpose="location"> <context-group purpose="location">
<context context-type="sourcefile">src/app/components/document-list/document-list.component.ts</context> <context context-type="sourcefile">src/app/components/document-list/document-list.component.ts</context>
<context context-type="linenumber">425</context> <context context-type="linenumber">428</context>
</context-group> </context-group>
<target state="translated">Impossibile salvare la visualizzazione "<x id="PH" equiv-text="this.list.activeSavedViewTitle"/>".</target> <target state="translated">Impossibile salvare la visualizzazione "<x id="PH" equiv-text="this.list.activeSavedViewTitle"/>".</target>
</trans-unit> </trans-unit>
@@ -11089,7 +11089,7 @@
<source>View &quot;<x id="PH" equiv-text="savedView.name"/>&quot; created successfully.</source> <source>View &quot;<x id="PH" equiv-text="savedView.name"/>&quot; created successfully.</source>
<context-group purpose="location"> <context-group purpose="location">
<context context-type="sourcefile">src/app/components/document-list/document-list.component.ts</context> <context context-type="sourcefile">src/app/components/document-list/document-list.component.ts</context>
<context context-type="linenumber">494</context> <context context-type="linenumber">497</context>
</context-group> </context-group>
<target state="final">La vista "<x id="PH" equiv-text="savedView.name"/>" è stata creata.</target> <target state="final">La vista "<x id="PH" equiv-text="savedView.name"/>" è stata creata.</target>
</trans-unit> </trans-unit>
@@ -11097,7 +11097,7 @@
<source>View &quot;<x id="PH" equiv-text="savedView.name"/>&quot; created successfully, but could not update visibility settings.</source> <source>View &quot;<x id="PH" equiv-text="savedView.name"/>&quot; created successfully, but could not update visibility settings.</source>
<context-group purpose="location"> <context-group purpose="location">
<context context-type="sourcefile">src/app/components/document-list/document-list.component.ts</context> <context context-type="sourcefile">src/app/components/document-list/document-list.component.ts</context>
<context context-type="linenumber">500</context> <context context-type="linenumber">503</context>
</context-group> </context-group>
<target state="translated">La vista "<x id="PH" equiv-text="savedView.name"/>" è stata creata correttamente, ma non è stato possibile aggiornare le impostazioni di visibilità.</target> <target state="translated">La vista "<x id="PH" equiv-text="savedView.name"/>" è stata creata correttamente, ma non è stato possibile aggiornare le impostazioni di visibilità.</target>
</trans-unit> </trans-unit>
@@ -13298,11 +13298,27 @@
</context-group> </context-group>
<target state="translated">Modello di embedding LLM</target> <target state="translated">Modello di embedding LLM</target>
</trans-unit> </trans-unit>
<trans-unit id="861068592166833023" datatype="html">
<source>LLM Embedding API Key</source>
<context-group purpose="location">
<context context-type="sourcefile">src/app/data/paperless-config.ts</context>
<context context-type="linenumber">358</context>
</context-group>
<target state="needs-translation">LLM Embedding API Key</target>
</trans-unit>
<trans-unit id="2929108042259892948" datatype="html">
<source>Used for embeddings when set, otherwise LLM API key is used.</source>
<context-group purpose="location">
<context context-type="sourcefile">src/app/data/paperless-config.ts</context>
<context context-type="linenumber">360</context>
</context-group>
<target state="needs-translation">Used for embeddings when set, otherwise LLM API key is used.</target>
</trans-unit>
<trans-unit id="3554114880473286122" datatype="html"> <trans-unit id="3554114880473286122" datatype="html">
<source>LLM Embedding Endpoint</source> <source>LLM Embedding Endpoint</source>
<context-group purpose="location"> <context-group purpose="location">
<context context-type="sourcefile">src/app/data/paperless-config.ts</context> <context context-type="sourcefile">src/app/data/paperless-config.ts</context>
<context context-type="linenumber">358</context> <context context-type="linenumber">366</context>
</context-group> </context-group>
<target state="translated">Endpoint di integrazione LLM</target> <target state="translated">Endpoint di integrazione LLM</target>
</trans-unit> </trans-unit>
@@ -13310,7 +13326,7 @@
<source>LLM Embedding Chunk Size</source> <source>LLM Embedding Chunk Size</source>
<context-group purpose="location"> <context-group purpose="location">
<context context-type="sourcefile">src/app/data/paperless-config.ts</context> <context context-type="sourcefile">src/app/data/paperless-config.ts</context>
<context context-type="linenumber">365</context> <context context-type="linenumber">373</context>
</context-group> </context-group>
<target state="translated">Dimensione del blocco di incorporamento LLM</target> <target state="translated">Dimensione del blocco di incorporamento LLM</target>
</trans-unit> </trans-unit>
@@ -13318,7 +13334,7 @@
<source>LLM Context Size</source> <source>LLM Context Size</source>
<context-group purpose="location"> <context-group purpose="location">
<context context-type="sourcefile">src/app/data/paperless-config.ts</context> <context context-type="sourcefile">src/app/data/paperless-config.ts</context>
<context context-type="linenumber">372</context> <context context-type="linenumber">380</context>
</context-group> </context-group>
<target state="translated">Dimensione del contesto LLM</target> <target state="translated">Dimensione del contesto LLM</target>
</trans-unit> </trans-unit>
@@ -13326,7 +13342,7 @@
<source>LLM Backend</source> <source>LLM Backend</source>
<context-group purpose="location"> <context-group purpose="location">
<context context-type="sourcefile">src/app/data/paperless-config.ts</context> <context context-type="sourcefile">src/app/data/paperless-config.ts</context>
<context context-type="linenumber">379</context> <context context-type="linenumber">387</context>
</context-group> </context-group>
<target state="translated">Backend LLM</target> <target state="translated">Backend LLM</target>
</trans-unit> </trans-unit>
@@ -13334,7 +13350,7 @@
<source>LLM Model</source> <source>LLM Model</source>
<context-group purpose="location"> <context-group purpose="location">
<context context-type="sourcefile">src/app/data/paperless-config.ts</context> <context context-type="sourcefile">src/app/data/paperless-config.ts</context>
<context context-type="linenumber">387</context> <context context-type="linenumber">395</context>
</context-group> </context-group>
<target state="translated">Modello LLM</target> <target state="translated">Modello LLM</target>
</trans-unit> </trans-unit>
@@ -13342,7 +13358,7 @@
<source>LLM API Key</source> <source>LLM API Key</source>
<context-group purpose="location"> <context-group purpose="location">
<context context-type="sourcefile">src/app/data/paperless-config.ts</context> <context context-type="sourcefile">src/app/data/paperless-config.ts</context>
<context context-type="linenumber">394</context> <context context-type="linenumber">402</context>
</context-group> </context-group>
<target state="translated">Chiave API LLM</target> <target state="translated">Chiave API LLM</target>
</trans-unit> </trans-unit>
@@ -13350,7 +13366,7 @@
<source>LLM Endpoint</source> <source>LLM Endpoint</source>
<context-group purpose="location"> <context-group purpose="location">
<context context-type="sourcefile">src/app/data/paperless-config.ts</context> <context context-type="sourcefile">src/app/data/paperless-config.ts</context>
<context context-type="linenumber">401</context> <context context-type="linenumber">409</context>
</context-group> </context-group>
<target state="translated">Endpoint LLM</target> <target state="translated">Endpoint LLM</target>
</trans-unit> </trans-unit>
@@ -13358,7 +13374,7 @@
<source>LLM Output Language</source> <source>LLM Output Language</source>
<context-group purpose="location"> <context-group purpose="location">
<context context-type="sourcefile">src/app/data/paperless-config.ts</context> <context context-type="sourcefile">src/app/data/paperless-config.ts</context>
<context context-type="linenumber">408</context> <context context-type="linenumber">416</context>
</context-group> </context-group>
<target state="translated">Lingua di output LLM</target> <target state="translated">Lingua di output LLM</target>
</trans-unit> </trans-unit>
@@ -13366,7 +13382,7 @@
<source>Language to use for generated AI suggestions. When unset, AI suggestions use the user&apos;s display language if explicitly set.</source> <source>Language to use for generated AI suggestions. When unset, AI suggestions use the user&apos;s display language if explicitly set.</source>
<context-group purpose="location"> <context-group purpose="location">
<context context-type="sourcefile">src/app/data/paperless-config.ts</context> <context context-type="sourcefile">src/app/data/paperless-config.ts</context>
<context context-type="linenumber">412</context> <context context-type="linenumber">420</context>
</context-group> </context-group>
<target state="translated">Lingua da utilizzare per i suggerimenti generati dall'IA. Se non specificata, i suggerimenti dell'IA utilizzano la lingua di visualizzazione dell'utente, qualora sia impostata esplicitamente.</target> <target state="translated">Lingua da utilizzare per i suggerimenti generati dall'IA. Se non specificata, i suggerimenti dell'IA utilizzano la lingua di visualizzazione dell'utente, qualora sia impostata esplicitamente.</target>
</trans-unit> </trans-unit>
@@ -13374,7 +13390,7 @@
<source>LLM Request Timeout</source> <source>LLM Request Timeout</source>
<context-group purpose="location"> <context-group purpose="location">
<context context-type="sourcefile">src/app/data/paperless-config.ts</context> <context context-type="sourcefile">src/app/data/paperless-config.ts</context>
<context context-type="linenumber">416</context> <context context-type="linenumber">424</context>
</context-group> </context-group>
<target state="translated">Timeout della richiesta LLM</target> <target state="translated">Timeout della richiesta LLM</target>
</trans-unit> </trans-unit>
@@ -13382,7 +13398,7 @@
<source>Timeout in seconds for LLM requests.</source> <source>Timeout in seconds for LLM requests.</source>
<context-group purpose="location"> <context-group purpose="location">
<context context-type="sourcefile">src/app/data/paperless-config.ts</context> <context context-type="sourcefile">src/app/data/paperless-config.ts</context>
<context context-type="linenumber">420</context> <context context-type="linenumber">428</context>
</context-group> </context-group>
<target state="translated">Timeout in secondi per le richieste LLM.</target> <target state="translated">Timeout in secondi per le richieste LLM.</target>
</trans-unit> </trans-unit>
+37 -21
View File
@@ -10740,7 +10740,7 @@
</context-group> </context-group>
<context-group purpose="location"> <context-group purpose="location">
<context context-type="sourcefile">src/app/components/document-list/document-list.component.ts</context> <context context-type="sourcefile">src/app/components/document-list/document-list.component.ts</context>
<context context-type="linenumber">348</context> <context context-type="linenumber">351</context>
</context-group> </context-group>
<context-group purpose="location"> <context-group purpose="location">
<context context-type="sourcefile">src/app/components/manage/document-attributes/document-attributes.component.html</context> <context context-type="sourcefile">src/app/components/manage/document-attributes/document-attributes.component.html</context>
@@ -10756,7 +10756,7 @@
</context-group> </context-group>
<context-group purpose="location"> <context-group purpose="location">
<context context-type="sourcefile">src/app/components/document-list/document-list.component.ts</context> <context context-type="sourcefile">src/app/components/document-list/document-list.component.ts</context>
<context context-type="linenumber">341</context> <context context-type="linenumber">344</context>
</context-group> </context-group>
<context-group purpose="location"> <context-group purpose="location">
<context context-type="sourcefile">src/app/components/manage/document-attributes/document-attributes.component.html</context> <context context-type="sourcefile">src/app/components/manage/document-attributes/document-attributes.component.html</context>
@@ -11040,7 +11040,7 @@
<source>Reset filters / selection</source> <source>Reset filters / selection</source>
<context-group purpose="location"> <context-group purpose="location">
<context context-type="sourcefile">src/app/components/document-list/document-list.component.ts</context> <context context-type="sourcefile">src/app/components/document-list/document-list.component.ts</context>
<context context-type="linenumber">329</context> <context context-type="linenumber">332</context>
</context-group> </context-group>
<target state="translated">フィルター/選択をリセット</target> <target state="translated">フィルター/選択をリセット</target>
</trans-unit> </trans-unit>
@@ -11048,7 +11048,7 @@
<source>Open first [selected] document</source> <source>Open first [selected] document</source>
<context-group purpose="location"> <context-group purpose="location">
<context context-type="sourcefile">src/app/components/document-list/document-list.component.ts</context> <context context-type="sourcefile">src/app/components/document-list/document-list.component.ts</context>
<context context-type="linenumber">357</context> <context context-type="linenumber">360</context>
</context-group> </context-group>
<target state="translated">最初の [selected] ドキュメントを開く</target> <target state="translated">最初の [selected] ドキュメントを開く</target>
</trans-unit> </trans-unit>
@@ -11056,7 +11056,7 @@
<source>Previous page</source> <source>Previous page</source>
<context-group purpose="location"> <context-group purpose="location">
<context context-type="sourcefile">src/app/components/document-list/document-list.component.ts</context> <context context-type="sourcefile">src/app/components/document-list/document-list.component.ts</context>
<context context-type="linenumber">373</context> <context context-type="linenumber">376</context>
</context-group> </context-group>
<target state="translated">前のページ</target> <target state="translated">前のページ</target>
</trans-unit> </trans-unit>
@@ -11064,7 +11064,7 @@
<source>Next page</source> <source>Next page</source>
<context-group purpose="location"> <context-group purpose="location">
<context context-type="sourcefile">src/app/components/document-list/document-list.component.ts</context> <context context-type="sourcefile">src/app/components/document-list/document-list.component.ts</context>
<context context-type="linenumber">385</context> <context context-type="linenumber">388</context>
</context-group> </context-group>
<target state="translated">次のページ</target> <target state="translated">次のページ</target>
</trans-unit> </trans-unit>
@@ -11072,7 +11072,7 @@
<source>View &quot;<x id="PH" equiv-text="this.list.activeSavedViewTitle"/>&quot; saved successfully.</source> <source>View &quot;<x id="PH" equiv-text="this.list.activeSavedViewTitle"/>&quot; saved successfully.</source>
<context-group purpose="location"> <context-group purpose="location">
<context context-type="sourcefile">src/app/components/document-list/document-list.component.ts</context> <context context-type="sourcefile">src/app/components/document-list/document-list.component.ts</context>
<context context-type="linenumber">419</context> <context context-type="linenumber">422</context>
</context-group> </context-group>
<target state="translated">ビュー "<x id="PH" equiv-text="this.list.activeSavedViewTitle"/>" は正常に保存されました</target> <target state="translated">ビュー "<x id="PH" equiv-text="this.list.activeSavedViewTitle"/>" は正常に保存されました</target>
</trans-unit> </trans-unit>
@@ -11080,7 +11080,7 @@
<source>Failed to save view &quot;<x id="PH" equiv-text="this.list.activeSavedViewTitle"/>&quot;.</source> <source>Failed to save view &quot;<x id="PH" equiv-text="this.list.activeSavedViewTitle"/>&quot;.</source>
<context-group purpose="location"> <context-group purpose="location">
<context context-type="sourcefile">src/app/components/document-list/document-list.component.ts</context> <context context-type="sourcefile">src/app/components/document-list/document-list.component.ts</context>
<context context-type="linenumber">425</context> <context context-type="linenumber">428</context>
</context-group> </context-group>
<target state="translated">ビュー "<x id="PH" equiv-text="this.list.activeSavedViewTitle"/> " を保存できませんでした。</target> <target state="translated">ビュー "<x id="PH" equiv-text="this.list.activeSavedViewTitle"/> " を保存できませんでした。</target>
</trans-unit> </trans-unit>
@@ -11088,7 +11088,7 @@
<source>View &quot;<x id="PH" equiv-text="savedView.name"/>&quot; created successfully.</source> <source>View &quot;<x id="PH" equiv-text="savedView.name"/>&quot; created successfully.</source>
<context-group purpose="location"> <context-group purpose="location">
<context context-type="sourcefile">src/app/components/document-list/document-list.component.ts</context> <context context-type="sourcefile">src/app/components/document-list/document-list.component.ts</context>
<context context-type="linenumber">494</context> <context context-type="linenumber">497</context>
</context-group> </context-group>
<target state="translated">ビュー "<x id="PH" equiv-text="savedView.name"/>" は正常に作成されました</target> <target state="translated">ビュー "<x id="PH" equiv-text="savedView.name"/>" は正常に作成されました</target>
</trans-unit> </trans-unit>
@@ -11096,7 +11096,7 @@
<source>View &quot;<x id="PH" equiv-text="savedView.name"/>&quot; created successfully, but could not update visibility settings.</source> <source>View &quot;<x id="PH" equiv-text="savedView.name"/>&quot; created successfully, but could not update visibility settings.</source>
<context-group purpose="location"> <context-group purpose="location">
<context context-type="sourcefile">src/app/components/document-list/document-list.component.ts</context> <context context-type="sourcefile">src/app/components/document-list/document-list.component.ts</context>
<context context-type="linenumber">500</context> <context context-type="linenumber">503</context>
</context-group> </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="needs-translation">View "<x id="PH" equiv-text="savedView.name"/>" created successfully, but could not update visibility settings.</target>
</trans-unit> </trans-unit>
@@ -13297,11 +13297,27 @@
</context-group> </context-group>
<target state="needs-translation">LLM Embedding Model</target> <target state="needs-translation">LLM Embedding Model</target>
</trans-unit> </trans-unit>
<trans-unit id="861068592166833023" datatype="html">
<source>LLM Embedding API Key</source>
<context-group purpose="location">
<context context-type="sourcefile">src/app/data/paperless-config.ts</context>
<context context-type="linenumber">358</context>
</context-group>
<target state="needs-translation">LLM Embedding API Key</target>
</trans-unit>
<trans-unit id="2929108042259892948" datatype="html">
<source>Used for embeddings when set, otherwise LLM API key is used.</source>
<context-group purpose="location">
<context context-type="sourcefile">src/app/data/paperless-config.ts</context>
<context context-type="linenumber">360</context>
</context-group>
<target state="needs-translation">Used for embeddings when set, otherwise LLM API key is used.</target>
</trans-unit>
<trans-unit id="3554114880473286122" datatype="html"> <trans-unit id="3554114880473286122" datatype="html">
<source>LLM Embedding Endpoint</source> <source>LLM Embedding Endpoint</source>
<context-group purpose="location"> <context-group purpose="location">
<context context-type="sourcefile">src/app/data/paperless-config.ts</context> <context context-type="sourcefile">src/app/data/paperless-config.ts</context>
<context context-type="linenumber">358</context> <context context-type="linenumber">366</context>
</context-group> </context-group>
<target state="needs-translation">LLM Embedding Endpoint</target> <target state="needs-translation">LLM Embedding Endpoint</target>
</trans-unit> </trans-unit>
@@ -13309,7 +13325,7 @@
<source>LLM Embedding Chunk Size</source> <source>LLM Embedding Chunk Size</source>
<context-group purpose="location"> <context-group purpose="location">
<context context-type="sourcefile">src/app/data/paperless-config.ts</context> <context context-type="sourcefile">src/app/data/paperless-config.ts</context>
<context context-type="linenumber">365</context> <context context-type="linenumber">373</context>
</context-group> </context-group>
<target state="needs-translation">LLM Embedding Chunk Size</target> <target state="needs-translation">LLM Embedding Chunk Size</target>
</trans-unit> </trans-unit>
@@ -13317,7 +13333,7 @@
<source>LLM Context Size</source> <source>LLM Context Size</source>
<context-group purpose="location"> <context-group purpose="location">
<context context-type="sourcefile">src/app/data/paperless-config.ts</context> <context context-type="sourcefile">src/app/data/paperless-config.ts</context>
<context context-type="linenumber">372</context> <context context-type="linenumber">380</context>
</context-group> </context-group>
<target state="needs-translation">LLM Context Size</target> <target state="needs-translation">LLM Context Size</target>
</trans-unit> </trans-unit>
@@ -13325,7 +13341,7 @@
<source>LLM Backend</source> <source>LLM Backend</source>
<context-group purpose="location"> <context-group purpose="location">
<context context-type="sourcefile">src/app/data/paperless-config.ts</context> <context context-type="sourcefile">src/app/data/paperless-config.ts</context>
<context context-type="linenumber">379</context> <context context-type="linenumber">387</context>
</context-group> </context-group>
<target state="needs-translation">LLM Backend</target> <target state="needs-translation">LLM Backend</target>
</trans-unit> </trans-unit>
@@ -13333,7 +13349,7 @@
<source>LLM Model</source> <source>LLM Model</source>
<context-group purpose="location"> <context-group purpose="location">
<context context-type="sourcefile">src/app/data/paperless-config.ts</context> <context context-type="sourcefile">src/app/data/paperless-config.ts</context>
<context context-type="linenumber">387</context> <context context-type="linenumber">395</context>
</context-group> </context-group>
<target state="needs-translation">LLM Model</target> <target state="needs-translation">LLM Model</target>
</trans-unit> </trans-unit>
@@ -13341,7 +13357,7 @@
<source>LLM API Key</source> <source>LLM API Key</source>
<context-group purpose="location"> <context-group purpose="location">
<context context-type="sourcefile">src/app/data/paperless-config.ts</context> <context context-type="sourcefile">src/app/data/paperless-config.ts</context>
<context context-type="linenumber">394</context> <context context-type="linenumber">402</context>
</context-group> </context-group>
<target state="needs-translation">LLM API Key</target> <target state="needs-translation">LLM API Key</target>
</trans-unit> </trans-unit>
@@ -13349,7 +13365,7 @@
<source>LLM Endpoint</source> <source>LLM Endpoint</source>
<context-group purpose="location"> <context-group purpose="location">
<context context-type="sourcefile">src/app/data/paperless-config.ts</context> <context context-type="sourcefile">src/app/data/paperless-config.ts</context>
<context context-type="linenumber">401</context> <context context-type="linenumber">409</context>
</context-group> </context-group>
<target state="needs-translation">LLM Endpoint</target> <target state="needs-translation">LLM Endpoint</target>
</trans-unit> </trans-unit>
@@ -13357,7 +13373,7 @@
<source>LLM Output Language</source> <source>LLM Output Language</source>
<context-group purpose="location"> <context-group purpose="location">
<context context-type="sourcefile">src/app/data/paperless-config.ts</context> <context context-type="sourcefile">src/app/data/paperless-config.ts</context>
<context context-type="linenumber">408</context> <context context-type="linenumber">416</context>
</context-group> </context-group>
<target state="needs-translation">LLM Output Language</target> <target state="needs-translation">LLM Output Language</target>
</trans-unit> </trans-unit>
@@ -13365,7 +13381,7 @@
<source>Language to use for generated AI suggestions. When unset, AI suggestions use the user&apos;s display language if explicitly set.</source> <source>Language to use for generated AI suggestions. When unset, AI suggestions use the user&apos;s display language if explicitly set.</source>
<context-group purpose="location"> <context-group purpose="location">
<context context-type="sourcefile">src/app/data/paperless-config.ts</context> <context context-type="sourcefile">src/app/data/paperless-config.ts</context>
<context context-type="linenumber">412</context> <context context-type="linenumber">420</context>
</context-group> </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="needs-translation">Language to use for generated AI suggestions. When unset, AI suggestions use the user's display language if explicitly set.</target>
</trans-unit> </trans-unit>
@@ -13373,7 +13389,7 @@
<source>LLM Request Timeout</source> <source>LLM Request Timeout</source>
<context-group purpose="location"> <context-group purpose="location">
<context context-type="sourcefile">src/app/data/paperless-config.ts</context> <context context-type="sourcefile">src/app/data/paperless-config.ts</context>
<context context-type="linenumber">416</context> <context context-type="linenumber">424</context>
</context-group> </context-group>
<target state="needs-translation">LLM Request Timeout</target> <target state="needs-translation">LLM Request Timeout</target>
</trans-unit> </trans-unit>
@@ -13381,7 +13397,7 @@
<source>Timeout in seconds for LLM requests.</source> <source>Timeout in seconds for LLM requests.</source>
<context-group purpose="location"> <context-group purpose="location">
<context context-type="sourcefile">src/app/data/paperless-config.ts</context> <context context-type="sourcefile">src/app/data/paperless-config.ts</context>
<context context-type="linenumber">420</context> <context context-type="linenumber">428</context>
</context-group> </context-group>
<target state="needs-translation">Timeout in seconds for LLM requests.</target> <target state="needs-translation">Timeout in seconds for LLM requests.</target>
</trans-unit> </trans-unit>
+37 -21
View File
@@ -10741,7 +10741,7 @@
</context-group> </context-group>
<context-group purpose="location"> <context-group purpose="location">
<context context-type="sourcefile">src/app/components/document-list/document-list.component.ts</context> <context context-type="sourcefile">src/app/components/document-list/document-list.component.ts</context>
<context context-type="linenumber">348</context> <context context-type="linenumber">351</context>
</context-group> </context-group>
<context-group purpose="location"> <context-group purpose="location">
<context context-type="sourcefile">src/app/components/manage/document-attributes/document-attributes.component.html</context> <context context-type="sourcefile">src/app/components/manage/document-attributes/document-attributes.component.html</context>
@@ -10757,7 +10757,7 @@
</context-group> </context-group>
<context-group purpose="location"> <context-group purpose="location">
<context context-type="sourcefile">src/app/components/document-list/document-list.component.ts</context> <context context-type="sourcefile">src/app/components/document-list/document-list.component.ts</context>
<context context-type="linenumber">341</context> <context context-type="linenumber">344</context>
</context-group> </context-group>
<context-group purpose="location"> <context-group purpose="location">
<context context-type="sourcefile">src/app/components/manage/document-attributes/document-attributes.component.html</context> <context context-type="sourcefile">src/app/components/manage/document-attributes/document-attributes.component.html</context>
@@ -11041,7 +11041,7 @@
<source>Reset filters / selection</source> <source>Reset filters / selection</source>
<context-group purpose="location"> <context-group purpose="location">
<context context-type="sourcefile">src/app/components/document-list/document-list.component.ts</context> <context context-type="sourcefile">src/app/components/document-list/document-list.component.ts</context>
<context context-type="linenumber">329</context> <context context-type="linenumber">332</context>
</context-group> </context-group>
<target state="translated">필터/선택 항목 재설정</target> <target state="translated">필터/선택 항목 재설정</target>
</trans-unit> </trans-unit>
@@ -11049,7 +11049,7 @@
<source>Open first [selected] document</source> <source>Open first [selected] document</source>
<context-group purpose="location"> <context-group purpose="location">
<context context-type="sourcefile">src/app/components/document-list/document-list.component.ts</context> <context context-type="sourcefile">src/app/components/document-list/document-list.component.ts</context>
<context context-type="linenumber">357</context> <context context-type="linenumber">360</context>
</context-group> </context-group>
<target state="translated">첫번째 [선택한] 문서 열기</target> <target state="translated">첫번째 [선택한] 문서 열기</target>
</trans-unit> </trans-unit>
@@ -11057,7 +11057,7 @@
<source>Previous page</source> <source>Previous page</source>
<context-group purpose="location"> <context-group purpose="location">
<context context-type="sourcefile">src/app/components/document-list/document-list.component.ts</context> <context context-type="sourcefile">src/app/components/document-list/document-list.component.ts</context>
<context context-type="linenumber">373</context> <context context-type="linenumber">376</context>
</context-group> </context-group>
<target state="translated">이전 페이지</target> <target state="translated">이전 페이지</target>
</trans-unit> </trans-unit>
@@ -11065,7 +11065,7 @@
<source>Next page</source> <source>Next page</source>
<context-group purpose="location"> <context-group purpose="location">
<context context-type="sourcefile">src/app/components/document-list/document-list.component.ts</context> <context context-type="sourcefile">src/app/components/document-list/document-list.component.ts</context>
<context context-type="linenumber">385</context> <context context-type="linenumber">388</context>
</context-group> </context-group>
<target state="translated">다음 페이지</target> <target state="translated">다음 페이지</target>
</trans-unit> </trans-unit>
@@ -11073,7 +11073,7 @@
<source>View &quot;<x id="PH" equiv-text="this.list.activeSavedViewTitle"/>&quot; saved successfully.</source> <source>View &quot;<x id="PH" equiv-text="this.list.activeSavedViewTitle"/>&quot; saved successfully.</source>
<context-group purpose="location"> <context-group purpose="location">
<context context-type="sourcefile">src/app/components/document-list/document-list.component.ts</context> <context context-type="sourcefile">src/app/components/document-list/document-list.component.ts</context>
<context context-type="linenumber">419</context> <context context-type="linenumber">422</context>
</context-group> </context-group>
<target state="translated"><x id="PH" equiv-text="this.list.activeSavedViewTitle"/> 뷰가 성공적으로 저장되었습니다.</target> <target state="translated"><x id="PH" equiv-text="this.list.activeSavedViewTitle"/> 뷰가 성공적으로 저장되었습니다.</target>
</trans-unit> </trans-unit>
@@ -11081,7 +11081,7 @@
<source>Failed to save view &quot;<x id="PH" equiv-text="this.list.activeSavedViewTitle"/>&quot;.</source> <source>Failed to save view &quot;<x id="PH" equiv-text="this.list.activeSavedViewTitle"/>&quot;.</source>
<context-group purpose="location"> <context-group purpose="location">
<context context-type="sourcefile">src/app/components/document-list/document-list.component.ts</context> <context context-type="sourcefile">src/app/components/document-list/document-list.component.ts</context>
<context context-type="linenumber">425</context> <context context-type="linenumber">428</context>
</context-group> </context-group>
<target state="needs-translation">Failed to save view "<x id="PH" equiv-text="this.list.activeSavedViewTitle"/>".</target> <target state="needs-translation">Failed to save view "<x id="PH" equiv-text="this.list.activeSavedViewTitle"/>".</target>
</trans-unit> </trans-unit>
@@ -11089,7 +11089,7 @@
<source>View &quot;<x id="PH" equiv-text="savedView.name"/>&quot; created successfully.</source> <source>View &quot;<x id="PH" equiv-text="savedView.name"/>&quot; created successfully.</source>
<context-group purpose="location"> <context-group purpose="location">
<context context-type="sourcefile">src/app/components/document-list/document-list.component.ts</context> <context context-type="sourcefile">src/app/components/document-list/document-list.component.ts</context>
<context context-type="linenumber">494</context> <context context-type="linenumber">497</context>
</context-group> </context-group>
<target state="translated"><x id="PH" equiv-text="this.list.activeSavedViewTitle"/> 뷰가 성공적으로 생성되었습니다.</target> <target state="translated"><x id="PH" equiv-text="this.list.activeSavedViewTitle"/> 뷰가 성공적으로 생성되었습니다.</target>
</trans-unit> </trans-unit>
@@ -11097,7 +11097,7 @@
<source>View &quot;<x id="PH" equiv-text="savedView.name"/>&quot; created successfully, but could not update visibility settings.</source> <source>View &quot;<x id="PH" equiv-text="savedView.name"/>&quot; created successfully, but could not update visibility settings.</source>
<context-group purpose="location"> <context-group purpose="location">
<context context-type="sourcefile">src/app/components/document-list/document-list.component.ts</context> <context context-type="sourcefile">src/app/components/document-list/document-list.component.ts</context>
<context context-type="linenumber">500</context> <context context-type="linenumber">503</context>
</context-group> </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="needs-translation">View "<x id="PH" equiv-text="savedView.name"/>" created successfully, but could not update visibility settings.</target>
</trans-unit> </trans-unit>
@@ -13298,11 +13298,27 @@
</context-group> </context-group>
<target state="needs-translation">LLM Embedding Model</target> <target state="needs-translation">LLM Embedding Model</target>
</trans-unit> </trans-unit>
<trans-unit id="861068592166833023" datatype="html">
<source>LLM Embedding API Key</source>
<context-group purpose="location">
<context context-type="sourcefile">src/app/data/paperless-config.ts</context>
<context context-type="linenumber">358</context>
</context-group>
<target state="needs-translation">LLM Embedding API Key</target>
</trans-unit>
<trans-unit id="2929108042259892948" datatype="html">
<source>Used for embeddings when set, otherwise LLM API key is used.</source>
<context-group purpose="location">
<context context-type="sourcefile">src/app/data/paperless-config.ts</context>
<context context-type="linenumber">360</context>
</context-group>
<target state="needs-translation">Used for embeddings when set, otherwise LLM API key is used.</target>
</trans-unit>
<trans-unit id="3554114880473286122" datatype="html"> <trans-unit id="3554114880473286122" datatype="html">
<source>LLM Embedding Endpoint</source> <source>LLM Embedding Endpoint</source>
<context-group purpose="location"> <context-group purpose="location">
<context context-type="sourcefile">src/app/data/paperless-config.ts</context> <context context-type="sourcefile">src/app/data/paperless-config.ts</context>
<context context-type="linenumber">358</context> <context context-type="linenumber">366</context>
</context-group> </context-group>
<target state="needs-translation">LLM Embedding Endpoint</target> <target state="needs-translation">LLM Embedding Endpoint</target>
</trans-unit> </trans-unit>
@@ -13310,7 +13326,7 @@
<source>LLM Embedding Chunk Size</source> <source>LLM Embedding Chunk Size</source>
<context-group purpose="location"> <context-group purpose="location">
<context context-type="sourcefile">src/app/data/paperless-config.ts</context> <context context-type="sourcefile">src/app/data/paperless-config.ts</context>
<context context-type="linenumber">365</context> <context context-type="linenumber">373</context>
</context-group> </context-group>
<target state="needs-translation">LLM Embedding Chunk Size</target> <target state="needs-translation">LLM Embedding Chunk Size</target>
</trans-unit> </trans-unit>
@@ -13318,7 +13334,7 @@
<source>LLM Context Size</source> <source>LLM Context Size</source>
<context-group purpose="location"> <context-group purpose="location">
<context context-type="sourcefile">src/app/data/paperless-config.ts</context> <context context-type="sourcefile">src/app/data/paperless-config.ts</context>
<context context-type="linenumber">372</context> <context context-type="linenumber">380</context>
</context-group> </context-group>
<target state="needs-translation">LLM Context Size</target> <target state="needs-translation">LLM Context Size</target>
</trans-unit> </trans-unit>
@@ -13326,7 +13342,7 @@
<source>LLM Backend</source> <source>LLM Backend</source>
<context-group purpose="location"> <context-group purpose="location">
<context context-type="sourcefile">src/app/data/paperless-config.ts</context> <context context-type="sourcefile">src/app/data/paperless-config.ts</context>
<context context-type="linenumber">379</context> <context context-type="linenumber">387</context>
</context-group> </context-group>
<target state="needs-translation">LLM Backend</target> <target state="needs-translation">LLM Backend</target>
</trans-unit> </trans-unit>
@@ -13334,7 +13350,7 @@
<source>LLM Model</source> <source>LLM Model</source>
<context-group purpose="location"> <context-group purpose="location">
<context context-type="sourcefile">src/app/data/paperless-config.ts</context> <context context-type="sourcefile">src/app/data/paperless-config.ts</context>
<context context-type="linenumber">387</context> <context context-type="linenumber">395</context>
</context-group> </context-group>
<target state="needs-translation">LLM Model</target> <target state="needs-translation">LLM Model</target>
</trans-unit> </trans-unit>
@@ -13342,7 +13358,7 @@
<source>LLM API Key</source> <source>LLM API Key</source>
<context-group purpose="location"> <context-group purpose="location">
<context context-type="sourcefile">src/app/data/paperless-config.ts</context> <context context-type="sourcefile">src/app/data/paperless-config.ts</context>
<context context-type="linenumber">394</context> <context context-type="linenumber">402</context>
</context-group> </context-group>
<target state="needs-translation">LLM API Key</target> <target state="needs-translation">LLM API Key</target>
</trans-unit> </trans-unit>
@@ -13350,7 +13366,7 @@
<source>LLM Endpoint</source> <source>LLM Endpoint</source>
<context-group purpose="location"> <context-group purpose="location">
<context context-type="sourcefile">src/app/data/paperless-config.ts</context> <context context-type="sourcefile">src/app/data/paperless-config.ts</context>
<context context-type="linenumber">401</context> <context context-type="linenumber">409</context>
</context-group> </context-group>
<target state="needs-translation">LLM Endpoint</target> <target state="needs-translation">LLM Endpoint</target>
</trans-unit> </trans-unit>
@@ -13358,7 +13374,7 @@
<source>LLM Output Language</source> <source>LLM Output Language</source>
<context-group purpose="location"> <context-group purpose="location">
<context context-type="sourcefile">src/app/data/paperless-config.ts</context> <context context-type="sourcefile">src/app/data/paperless-config.ts</context>
<context context-type="linenumber">408</context> <context context-type="linenumber">416</context>
</context-group> </context-group>
<target state="needs-translation">LLM Output Language</target> <target state="needs-translation">LLM Output Language</target>
</trans-unit> </trans-unit>
@@ -13366,7 +13382,7 @@
<source>Language to use for generated AI suggestions. When unset, AI suggestions use the user&apos;s display language if explicitly set.</source> <source>Language to use for generated AI suggestions. When unset, AI suggestions use the user&apos;s display language if explicitly set.</source>
<context-group purpose="location"> <context-group purpose="location">
<context context-type="sourcefile">src/app/data/paperless-config.ts</context> <context context-type="sourcefile">src/app/data/paperless-config.ts</context>
<context context-type="linenumber">412</context> <context context-type="linenumber">420</context>
</context-group> </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="needs-translation">Language to use for generated AI suggestions. When unset, AI suggestions use the user's display language if explicitly set.</target>
</trans-unit> </trans-unit>
@@ -13374,7 +13390,7 @@
<source>LLM Request Timeout</source> <source>LLM Request Timeout</source>
<context-group purpose="location"> <context-group purpose="location">
<context context-type="sourcefile">src/app/data/paperless-config.ts</context> <context context-type="sourcefile">src/app/data/paperless-config.ts</context>
<context context-type="linenumber">416</context> <context context-type="linenumber">424</context>
</context-group> </context-group>
<target state="needs-translation">LLM Request Timeout</target> <target state="needs-translation">LLM Request Timeout</target>
</trans-unit> </trans-unit>
@@ -13382,7 +13398,7 @@
<source>Timeout in seconds for LLM requests.</source> <source>Timeout in seconds for LLM requests.</source>
<context-group purpose="location"> <context-group purpose="location">
<context context-type="sourcefile">src/app/data/paperless-config.ts</context> <context context-type="sourcefile">src/app/data/paperless-config.ts</context>
<context context-type="linenumber">420</context> <context context-type="linenumber">428</context>
</context-group> </context-group>
<target state="needs-translation">Timeout in seconds for LLM requests.</target> <target state="needs-translation">Timeout in seconds for LLM requests.</target>
</trans-unit> </trans-unit>
+37 -21
View File
@@ -10741,7 +10741,7 @@
</context-group> </context-group>
<context-group purpose="location"> <context-group purpose="location">
<context context-type="sourcefile">src/app/components/document-list/document-list.component.ts</context> <context context-type="sourcefile">src/app/components/document-list/document-list.component.ts</context>
<context context-type="linenumber">348</context> <context context-type="linenumber">351</context>
</context-group> </context-group>
<context-group purpose="location"> <context-group purpose="location">
<context context-type="sourcefile">src/app/components/manage/document-attributes/document-attributes.component.html</context> <context context-type="sourcefile">src/app/components/manage/document-attributes/document-attributes.component.html</context>
@@ -10757,7 +10757,7 @@
</context-group> </context-group>
<context-group purpose="location"> <context-group purpose="location">
<context context-type="sourcefile">src/app/components/document-list/document-list.component.ts</context> <context context-type="sourcefile">src/app/components/document-list/document-list.component.ts</context>
<context context-type="linenumber">341</context> <context context-type="linenumber">344</context>
</context-group> </context-group>
<context-group purpose="location"> <context-group purpose="location">
<context context-type="sourcefile">src/app/components/manage/document-attributes/document-attributes.component.html</context> <context context-type="sourcefile">src/app/components/manage/document-attributes/document-attributes.component.html</context>
@@ -11041,7 +11041,7 @@
<source>Reset filters / selection</source> <source>Reset filters / selection</source>
<context-group purpose="location"> <context-group purpose="location">
<context context-type="sourcefile">src/app/components/document-list/document-list.component.ts</context> <context context-type="sourcefile">src/app/components/document-list/document-list.component.ts</context>
<context context-type="linenumber">329</context> <context context-type="linenumber">332</context>
</context-group> </context-group>
<target state="needs-translation">Reset filters / selection</target> <target state="needs-translation">Reset filters / selection</target>
</trans-unit> </trans-unit>
@@ -11049,7 +11049,7 @@
<source>Open first [selected] document</source> <source>Open first [selected] document</source>
<context-group purpose="location"> <context-group purpose="location">
<context context-type="sourcefile">src/app/components/document-list/document-list.component.ts</context> <context context-type="sourcefile">src/app/components/document-list/document-list.component.ts</context>
<context context-type="linenumber">357</context> <context context-type="linenumber">360</context>
</context-group> </context-group>
<target state="needs-translation">Open first [selected] document</target> <target state="needs-translation">Open first [selected] document</target>
</trans-unit> </trans-unit>
@@ -11057,7 +11057,7 @@
<source>Previous page</source> <source>Previous page</source>
<context-group purpose="location"> <context-group purpose="location">
<context context-type="sourcefile">src/app/components/document-list/document-list.component.ts</context> <context context-type="sourcefile">src/app/components/document-list/document-list.component.ts</context>
<context context-type="linenumber">373</context> <context context-type="linenumber">376</context>
</context-group> </context-group>
<target state="needs-translation">Previous page</target> <target state="needs-translation">Previous page</target>
</trans-unit> </trans-unit>
@@ -11065,7 +11065,7 @@
<source>Next page</source> <source>Next page</source>
<context-group purpose="location"> <context-group purpose="location">
<context context-type="sourcefile">src/app/components/document-list/document-list.component.ts</context> <context context-type="sourcefile">src/app/components/document-list/document-list.component.ts</context>
<context context-type="linenumber">385</context> <context context-type="linenumber">388</context>
</context-group> </context-group>
<target state="needs-translation">Next page</target> <target state="needs-translation">Next page</target>
</trans-unit> </trans-unit>
@@ -11073,7 +11073,7 @@
<source>View &quot;<x id="PH" equiv-text="this.list.activeSavedViewTitle"/>&quot; saved successfully.</source> <source>View &quot;<x id="PH" equiv-text="this.list.activeSavedViewTitle"/>&quot; saved successfully.</source>
<context-group purpose="location"> <context-group purpose="location">
<context context-type="sourcefile">src/app/components/document-list/document-list.component.ts</context> <context context-type="sourcefile">src/app/components/document-list/document-list.component.ts</context>
<context context-type="linenumber">419</context> <context context-type="linenumber">422</context>
</context-group> </context-group>
<target state="final">Usiicht "<x id="PH" equiv-text="this.list.activeSavedViewTitle"/>" gouf erfollegräich gespäichert.</target> <target state="final">Usiicht "<x id="PH" equiv-text="this.list.activeSavedViewTitle"/>" gouf erfollegräich gespäichert.</target>
</trans-unit> </trans-unit>
@@ -11081,7 +11081,7 @@
<source>Failed to save view &quot;<x id="PH" equiv-text="this.list.activeSavedViewTitle"/>&quot;.</source> <source>Failed to save view &quot;<x id="PH" equiv-text="this.list.activeSavedViewTitle"/>&quot;.</source>
<context-group purpose="location"> <context-group purpose="location">
<context context-type="sourcefile">src/app/components/document-list/document-list.component.ts</context> <context context-type="sourcefile">src/app/components/document-list/document-list.component.ts</context>
<context context-type="linenumber">425</context> <context context-type="linenumber">428</context>
</context-group> </context-group>
<target state="needs-translation">Failed to save view "<x id="PH" equiv-text="this.list.activeSavedViewTitle"/>".</target> <target state="needs-translation">Failed to save view "<x id="PH" equiv-text="this.list.activeSavedViewTitle"/>".</target>
</trans-unit> </trans-unit>
@@ -11089,7 +11089,7 @@
<source>View &quot;<x id="PH" equiv-text="savedView.name"/>&quot; created successfully.</source> <source>View &quot;<x id="PH" equiv-text="savedView.name"/>&quot; created successfully.</source>
<context-group purpose="location"> <context-group purpose="location">
<context context-type="sourcefile">src/app/components/document-list/document-list.component.ts</context> <context context-type="sourcefile">src/app/components/document-list/document-list.component.ts</context>
<context context-type="linenumber">494</context> <context context-type="linenumber">497</context>
</context-group> </context-group>
<target state="final">Vue "<x id="PH" equiv-text="savedView.name"/>" gouf erfollegräich erstallt.</target> <target state="final">Vue "<x id="PH" equiv-text="savedView.name"/>" gouf erfollegräich erstallt.</target>
</trans-unit> </trans-unit>
@@ -11097,7 +11097,7 @@
<source>View &quot;<x id="PH" equiv-text="savedView.name"/>&quot; created successfully, but could not update visibility settings.</source> <source>View &quot;<x id="PH" equiv-text="savedView.name"/>&quot; created successfully, but could not update visibility settings.</source>
<context-group purpose="location"> <context-group purpose="location">
<context context-type="sourcefile">src/app/components/document-list/document-list.component.ts</context> <context context-type="sourcefile">src/app/components/document-list/document-list.component.ts</context>
<context context-type="linenumber">500</context> <context context-type="linenumber">503</context>
</context-group> </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="needs-translation">View "<x id="PH" equiv-text="savedView.name"/>" created successfully, but could not update visibility settings.</target>
</trans-unit> </trans-unit>
@@ -13298,11 +13298,27 @@
</context-group> </context-group>
<target state="needs-translation">LLM Embedding Model</target> <target state="needs-translation">LLM Embedding Model</target>
</trans-unit> </trans-unit>
<trans-unit id="861068592166833023" datatype="html">
<source>LLM Embedding API Key</source>
<context-group purpose="location">
<context context-type="sourcefile">src/app/data/paperless-config.ts</context>
<context context-type="linenumber">358</context>
</context-group>
<target state="needs-translation">LLM Embedding API Key</target>
</trans-unit>
<trans-unit id="2929108042259892948" datatype="html">
<source>Used for embeddings when set, otherwise LLM API key is used.</source>
<context-group purpose="location">
<context context-type="sourcefile">src/app/data/paperless-config.ts</context>
<context context-type="linenumber">360</context>
</context-group>
<target state="needs-translation">Used for embeddings when set, otherwise LLM API key is used.</target>
</trans-unit>
<trans-unit id="3554114880473286122" datatype="html"> <trans-unit id="3554114880473286122" datatype="html">
<source>LLM Embedding Endpoint</source> <source>LLM Embedding Endpoint</source>
<context-group purpose="location"> <context-group purpose="location">
<context context-type="sourcefile">src/app/data/paperless-config.ts</context> <context context-type="sourcefile">src/app/data/paperless-config.ts</context>
<context context-type="linenumber">358</context> <context context-type="linenumber">366</context>
</context-group> </context-group>
<target state="needs-translation">LLM Embedding Endpoint</target> <target state="needs-translation">LLM Embedding Endpoint</target>
</trans-unit> </trans-unit>
@@ -13310,7 +13326,7 @@
<source>LLM Embedding Chunk Size</source> <source>LLM Embedding Chunk Size</source>
<context-group purpose="location"> <context-group purpose="location">
<context context-type="sourcefile">src/app/data/paperless-config.ts</context> <context context-type="sourcefile">src/app/data/paperless-config.ts</context>
<context context-type="linenumber">365</context> <context context-type="linenumber">373</context>
</context-group> </context-group>
<target state="needs-translation">LLM Embedding Chunk Size</target> <target state="needs-translation">LLM Embedding Chunk Size</target>
</trans-unit> </trans-unit>
@@ -13318,7 +13334,7 @@
<source>LLM Context Size</source> <source>LLM Context Size</source>
<context-group purpose="location"> <context-group purpose="location">
<context context-type="sourcefile">src/app/data/paperless-config.ts</context> <context context-type="sourcefile">src/app/data/paperless-config.ts</context>
<context context-type="linenumber">372</context> <context context-type="linenumber">380</context>
</context-group> </context-group>
<target state="needs-translation">LLM Context Size</target> <target state="needs-translation">LLM Context Size</target>
</trans-unit> </trans-unit>
@@ -13326,7 +13342,7 @@
<source>LLM Backend</source> <source>LLM Backend</source>
<context-group purpose="location"> <context-group purpose="location">
<context context-type="sourcefile">src/app/data/paperless-config.ts</context> <context context-type="sourcefile">src/app/data/paperless-config.ts</context>
<context context-type="linenumber">379</context> <context context-type="linenumber">387</context>
</context-group> </context-group>
<target state="needs-translation">LLM Backend</target> <target state="needs-translation">LLM Backend</target>
</trans-unit> </trans-unit>
@@ -13334,7 +13350,7 @@
<source>LLM Model</source> <source>LLM Model</source>
<context-group purpose="location"> <context-group purpose="location">
<context context-type="sourcefile">src/app/data/paperless-config.ts</context> <context context-type="sourcefile">src/app/data/paperless-config.ts</context>
<context context-type="linenumber">387</context> <context context-type="linenumber">395</context>
</context-group> </context-group>
<target state="needs-translation">LLM Model</target> <target state="needs-translation">LLM Model</target>
</trans-unit> </trans-unit>
@@ -13342,7 +13358,7 @@
<source>LLM API Key</source> <source>LLM API Key</source>
<context-group purpose="location"> <context-group purpose="location">
<context context-type="sourcefile">src/app/data/paperless-config.ts</context> <context context-type="sourcefile">src/app/data/paperless-config.ts</context>
<context context-type="linenumber">394</context> <context context-type="linenumber">402</context>
</context-group> </context-group>
<target state="needs-translation">LLM API Key</target> <target state="needs-translation">LLM API Key</target>
</trans-unit> </trans-unit>
@@ -13350,7 +13366,7 @@
<source>LLM Endpoint</source> <source>LLM Endpoint</source>
<context-group purpose="location"> <context-group purpose="location">
<context context-type="sourcefile">src/app/data/paperless-config.ts</context> <context context-type="sourcefile">src/app/data/paperless-config.ts</context>
<context context-type="linenumber">401</context> <context context-type="linenumber">409</context>
</context-group> </context-group>
<target state="needs-translation">LLM Endpoint</target> <target state="needs-translation">LLM Endpoint</target>
</trans-unit> </trans-unit>
@@ -13358,7 +13374,7 @@
<source>LLM Output Language</source> <source>LLM Output Language</source>
<context-group purpose="location"> <context-group purpose="location">
<context context-type="sourcefile">src/app/data/paperless-config.ts</context> <context context-type="sourcefile">src/app/data/paperless-config.ts</context>
<context context-type="linenumber">408</context> <context context-type="linenumber">416</context>
</context-group> </context-group>
<target state="needs-translation">LLM Output Language</target> <target state="needs-translation">LLM Output Language</target>
</trans-unit> </trans-unit>
@@ -13366,7 +13382,7 @@
<source>Language to use for generated AI suggestions. When unset, AI suggestions use the user&apos;s display language if explicitly set.</source> <source>Language to use for generated AI suggestions. When unset, AI suggestions use the user&apos;s display language if explicitly set.</source>
<context-group purpose="location"> <context-group purpose="location">
<context context-type="sourcefile">src/app/data/paperless-config.ts</context> <context context-type="sourcefile">src/app/data/paperless-config.ts</context>
<context context-type="linenumber">412</context> <context context-type="linenumber">420</context>
</context-group> </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="needs-translation">Language to use for generated AI suggestions. When unset, AI suggestions use the user's display language if explicitly set.</target>
</trans-unit> </trans-unit>
@@ -13374,7 +13390,7 @@
<source>LLM Request Timeout</source> <source>LLM Request Timeout</source>
<context-group purpose="location"> <context-group purpose="location">
<context context-type="sourcefile">src/app/data/paperless-config.ts</context> <context context-type="sourcefile">src/app/data/paperless-config.ts</context>
<context context-type="linenumber">416</context> <context context-type="linenumber">424</context>
</context-group> </context-group>
<target state="needs-translation">LLM Request Timeout</target> <target state="needs-translation">LLM Request Timeout</target>
</trans-unit> </trans-unit>
@@ -13382,7 +13398,7 @@
<source>Timeout in seconds for LLM requests.</source> <source>Timeout in seconds for LLM requests.</source>
<context-group purpose="location"> <context-group purpose="location">
<context context-type="sourcefile">src/app/data/paperless-config.ts</context> <context context-type="sourcefile">src/app/data/paperless-config.ts</context>
<context context-type="linenumber">420</context> <context context-type="linenumber">428</context>
</context-group> </context-group>
<target state="needs-translation">Timeout in seconds for LLM requests.</target> <target state="needs-translation">Timeout in seconds for LLM requests.</target>
</trans-unit> </trans-unit>
+37 -21
View File
@@ -10741,7 +10741,7 @@
</context-group> </context-group>
<context-group purpose="location"> <context-group purpose="location">
<context context-type="sourcefile">src/app/components/document-list/document-list.component.ts</context> <context context-type="sourcefile">src/app/components/document-list/document-list.component.ts</context>
<context context-type="linenumber">348</context> <context context-type="linenumber">351</context>
</context-group> </context-group>
<context-group purpose="location"> <context-group purpose="location">
<context context-type="sourcefile">src/app/components/manage/document-attributes/document-attributes.component.html</context> <context context-type="sourcefile">src/app/components/manage/document-attributes/document-attributes.component.html</context>
@@ -10757,7 +10757,7 @@
</context-group> </context-group>
<context-group purpose="location"> <context-group purpose="location">
<context context-type="sourcefile">src/app/components/document-list/document-list.component.ts</context> <context context-type="sourcefile">src/app/components/document-list/document-list.component.ts</context>
<context context-type="linenumber">341</context> <context context-type="linenumber">344</context>
</context-group> </context-group>
<context-group purpose="location"> <context-group purpose="location">
<context context-type="sourcefile">src/app/components/manage/document-attributes/document-attributes.component.html</context> <context context-type="sourcefile">src/app/components/manage/document-attributes/document-attributes.component.html</context>
@@ -11041,7 +11041,7 @@
<source>Reset filters / selection</source> <source>Reset filters / selection</source>
<context-group purpose="location"> <context-group purpose="location">
<context context-type="sourcefile">src/app/components/document-list/document-list.component.ts</context> <context context-type="sourcefile">src/app/components/document-list/document-list.component.ts</context>
<context context-type="linenumber">329</context> <context context-type="linenumber">332</context>
</context-group> </context-group>
<target state="needs-translation">Reset filters / selection</target> <target state="needs-translation">Reset filters / selection</target>
</trans-unit> </trans-unit>
@@ -11049,7 +11049,7 @@
<source>Open first [selected] document</source> <source>Open first [selected] document</source>
<context-group purpose="location"> <context-group purpose="location">
<context context-type="sourcefile">src/app/components/document-list/document-list.component.ts</context> <context context-type="sourcefile">src/app/components/document-list/document-list.component.ts</context>
<context context-type="linenumber">357</context> <context context-type="linenumber">360</context>
</context-group> </context-group>
<target state="needs-translation">Open first [selected] document</target> <target state="needs-translation">Open first [selected] document</target>
</trans-unit> </trans-unit>
@@ -11057,7 +11057,7 @@
<source>Previous page</source> <source>Previous page</source>
<context-group purpose="location"> <context-group purpose="location">
<context context-type="sourcefile">src/app/components/document-list/document-list.component.ts</context> <context context-type="sourcefile">src/app/components/document-list/document-list.component.ts</context>
<context context-type="linenumber">373</context> <context context-type="linenumber">376</context>
</context-group> </context-group>
<target state="needs-translation">Previous page</target> <target state="needs-translation">Previous page</target>
</trans-unit> </trans-unit>
@@ -11065,7 +11065,7 @@
<source>Next page</source> <source>Next page</source>
<context-group purpose="location"> <context-group purpose="location">
<context context-type="sourcefile">src/app/components/document-list/document-list.component.ts</context> <context context-type="sourcefile">src/app/components/document-list/document-list.component.ts</context>
<context context-type="linenumber">385</context> <context context-type="linenumber">388</context>
</context-group> </context-group>
<target state="needs-translation">Next page</target> <target state="needs-translation">Next page</target>
</trans-unit> </trans-unit>
@@ -11073,7 +11073,7 @@
<source>View &quot;<x id="PH" equiv-text="this.list.activeSavedViewTitle"/>&quot; saved successfully.</source> <source>View &quot;<x id="PH" equiv-text="this.list.activeSavedViewTitle"/>&quot; saved successfully.</source>
<context-group purpose="location"> <context-group purpose="location">
<context context-type="sourcefile">src/app/components/document-list/document-list.component.ts</context> <context context-type="sourcefile">src/app/components/document-list/document-list.component.ts</context>
<context context-type="linenumber">419</context> <context context-type="linenumber">422</context>
</context-group> </context-group>
<target state="needs-translation">View "<x id="PH" equiv-text="this.list.activeSavedViewTitle"/>" saved successfully.</target> <target state="needs-translation">View "<x id="PH" equiv-text="this.list.activeSavedViewTitle"/>" saved successfully.</target>
</trans-unit> </trans-unit>
@@ -11081,7 +11081,7 @@
<source>Failed to save view &quot;<x id="PH" equiv-text="this.list.activeSavedViewTitle"/>&quot;.</source> <source>Failed to save view &quot;<x id="PH" equiv-text="this.list.activeSavedViewTitle"/>&quot;.</source>
<context-group purpose="location"> <context-group purpose="location">
<context context-type="sourcefile">src/app/components/document-list/document-list.component.ts</context> <context context-type="sourcefile">src/app/components/document-list/document-list.component.ts</context>
<context context-type="linenumber">425</context> <context context-type="linenumber">428</context>
</context-group> </context-group>
<target state="needs-translation">Failed to save view "<x id="PH" equiv-text="this.list.activeSavedViewTitle"/>".</target> <target state="needs-translation">Failed to save view "<x id="PH" equiv-text="this.list.activeSavedViewTitle"/>".</target>
</trans-unit> </trans-unit>
@@ -11089,7 +11089,7 @@
<source>View &quot;<x id="PH" equiv-text="savedView.name"/>&quot; created successfully.</source> <source>View &quot;<x id="PH" equiv-text="savedView.name"/>&quot; created successfully.</source>
<context-group purpose="location"> <context-group purpose="location">
<context context-type="sourcefile">src/app/components/document-list/document-list.component.ts</context> <context context-type="sourcefile">src/app/components/document-list/document-list.component.ts</context>
<context context-type="linenumber">494</context> <context context-type="linenumber">497</context>
</context-group> </context-group>
<target state="needs-translation">View "<x id="PH" equiv-text="savedView.name"/>" created successfully.</target> <target state="needs-translation">View "<x id="PH" equiv-text="savedView.name"/>" created successfully.</target>
</trans-unit> </trans-unit>
@@ -11097,7 +11097,7 @@
<source>View &quot;<x id="PH" equiv-text="savedView.name"/>&quot; created successfully, but could not update visibility settings.</source> <source>View &quot;<x id="PH" equiv-text="savedView.name"/>&quot; created successfully, but could not update visibility settings.</source>
<context-group purpose="location"> <context-group purpose="location">
<context context-type="sourcefile">src/app/components/document-list/document-list.component.ts</context> <context context-type="sourcefile">src/app/components/document-list/document-list.component.ts</context>
<context context-type="linenumber">500</context> <context context-type="linenumber">503</context>
</context-group> </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="needs-translation">View "<x id="PH" equiv-text="savedView.name"/>" created successfully, but could not update visibility settings.</target>
</trans-unit> </trans-unit>
@@ -13298,11 +13298,27 @@
</context-group> </context-group>
<target state="needs-translation">LLM Embedding Model</target> <target state="needs-translation">LLM Embedding Model</target>
</trans-unit> </trans-unit>
<trans-unit id="861068592166833023" datatype="html">
<source>LLM Embedding API Key</source>
<context-group purpose="location">
<context context-type="sourcefile">src/app/data/paperless-config.ts</context>
<context context-type="linenumber">358</context>
</context-group>
<target state="needs-translation">LLM Embedding API Key</target>
</trans-unit>
<trans-unit id="2929108042259892948" datatype="html">
<source>Used for embeddings when set, otherwise LLM API key is used.</source>
<context-group purpose="location">
<context context-type="sourcefile">src/app/data/paperless-config.ts</context>
<context context-type="linenumber">360</context>
</context-group>
<target state="needs-translation">Used for embeddings when set, otherwise LLM API key is used.</target>
</trans-unit>
<trans-unit id="3554114880473286122" datatype="html"> <trans-unit id="3554114880473286122" datatype="html">
<source>LLM Embedding Endpoint</source> <source>LLM Embedding Endpoint</source>
<context-group purpose="location"> <context-group purpose="location">
<context context-type="sourcefile">src/app/data/paperless-config.ts</context> <context context-type="sourcefile">src/app/data/paperless-config.ts</context>
<context context-type="linenumber">358</context> <context context-type="linenumber">366</context>
</context-group> </context-group>
<target state="needs-translation">LLM Embedding Endpoint</target> <target state="needs-translation">LLM Embedding Endpoint</target>
</trans-unit> </trans-unit>
@@ -13310,7 +13326,7 @@
<source>LLM Embedding Chunk Size</source> <source>LLM Embedding Chunk Size</source>
<context-group purpose="location"> <context-group purpose="location">
<context context-type="sourcefile">src/app/data/paperless-config.ts</context> <context context-type="sourcefile">src/app/data/paperless-config.ts</context>
<context context-type="linenumber">365</context> <context context-type="linenumber">373</context>
</context-group> </context-group>
<target state="needs-translation">LLM Embedding Chunk Size</target> <target state="needs-translation">LLM Embedding Chunk Size</target>
</trans-unit> </trans-unit>
@@ -13318,7 +13334,7 @@
<source>LLM Context Size</source> <source>LLM Context Size</source>
<context-group purpose="location"> <context-group purpose="location">
<context context-type="sourcefile">src/app/data/paperless-config.ts</context> <context context-type="sourcefile">src/app/data/paperless-config.ts</context>
<context context-type="linenumber">372</context> <context context-type="linenumber">380</context>
</context-group> </context-group>
<target state="needs-translation">LLM Context Size</target> <target state="needs-translation">LLM Context Size</target>
</trans-unit> </trans-unit>
@@ -13326,7 +13342,7 @@
<source>LLM Backend</source> <source>LLM Backend</source>
<context-group purpose="location"> <context-group purpose="location">
<context context-type="sourcefile">src/app/data/paperless-config.ts</context> <context context-type="sourcefile">src/app/data/paperless-config.ts</context>
<context context-type="linenumber">379</context> <context context-type="linenumber">387</context>
</context-group> </context-group>
<target state="needs-translation">LLM Backend</target> <target state="needs-translation">LLM Backend</target>
</trans-unit> </trans-unit>
@@ -13334,7 +13350,7 @@
<source>LLM Model</source> <source>LLM Model</source>
<context-group purpose="location"> <context-group purpose="location">
<context context-type="sourcefile">src/app/data/paperless-config.ts</context> <context context-type="sourcefile">src/app/data/paperless-config.ts</context>
<context context-type="linenumber">387</context> <context context-type="linenumber">395</context>
</context-group> </context-group>
<target state="needs-translation">LLM Model</target> <target state="needs-translation">LLM Model</target>
</trans-unit> </trans-unit>
@@ -13342,7 +13358,7 @@
<source>LLM API Key</source> <source>LLM API Key</source>
<context-group purpose="location"> <context-group purpose="location">
<context context-type="sourcefile">src/app/data/paperless-config.ts</context> <context context-type="sourcefile">src/app/data/paperless-config.ts</context>
<context context-type="linenumber">394</context> <context context-type="linenumber">402</context>
</context-group> </context-group>
<target state="needs-translation">LLM API Key</target> <target state="needs-translation">LLM API Key</target>
</trans-unit> </trans-unit>
@@ -13350,7 +13366,7 @@
<source>LLM Endpoint</source> <source>LLM Endpoint</source>
<context-group purpose="location"> <context-group purpose="location">
<context context-type="sourcefile">src/app/data/paperless-config.ts</context> <context context-type="sourcefile">src/app/data/paperless-config.ts</context>
<context context-type="linenumber">401</context> <context context-type="linenumber">409</context>
</context-group> </context-group>
<target state="needs-translation">LLM Endpoint</target> <target state="needs-translation">LLM Endpoint</target>
</trans-unit> </trans-unit>
@@ -13358,7 +13374,7 @@
<source>LLM Output Language</source> <source>LLM Output Language</source>
<context-group purpose="location"> <context-group purpose="location">
<context context-type="sourcefile">src/app/data/paperless-config.ts</context> <context context-type="sourcefile">src/app/data/paperless-config.ts</context>
<context context-type="linenumber">408</context> <context context-type="linenumber">416</context>
</context-group> </context-group>
<target state="needs-translation">LLM Output Language</target> <target state="needs-translation">LLM Output Language</target>
</trans-unit> </trans-unit>
@@ -13366,7 +13382,7 @@
<source>Language to use for generated AI suggestions. When unset, AI suggestions use the user&apos;s display language if explicitly set.</source> <source>Language to use for generated AI suggestions. When unset, AI suggestions use the user&apos;s display language if explicitly set.</source>
<context-group purpose="location"> <context-group purpose="location">
<context context-type="sourcefile">src/app/data/paperless-config.ts</context> <context context-type="sourcefile">src/app/data/paperless-config.ts</context>
<context context-type="linenumber">412</context> <context context-type="linenumber">420</context>
</context-group> </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="needs-translation">Language to use for generated AI suggestions. When unset, AI suggestions use the user's display language if explicitly set.</target>
</trans-unit> </trans-unit>
@@ -13374,7 +13390,7 @@
<source>LLM Request Timeout</source> <source>LLM Request Timeout</source>
<context-group purpose="location"> <context-group purpose="location">
<context context-type="sourcefile">src/app/data/paperless-config.ts</context> <context context-type="sourcefile">src/app/data/paperless-config.ts</context>
<context context-type="linenumber">416</context> <context context-type="linenumber">424</context>
</context-group> </context-group>
<target state="needs-translation">LLM Request Timeout</target> <target state="needs-translation">LLM Request Timeout</target>
</trans-unit> </trans-unit>
@@ -13382,7 +13398,7 @@
<source>Timeout in seconds for LLM requests.</source> <source>Timeout in seconds for LLM requests.</source>
<context-group purpose="location"> <context-group purpose="location">
<context context-type="sourcefile">src/app/data/paperless-config.ts</context> <context context-type="sourcefile">src/app/data/paperless-config.ts</context>
<context context-type="linenumber">420</context> <context context-type="linenumber">428</context>
</context-group> </context-group>
<target state="needs-translation">Timeout in seconds for LLM requests.</target> <target state="needs-translation">Timeout in seconds for LLM requests.</target>
</trans-unit> </trans-unit>
+37 -21
View File
@@ -10741,7 +10741,7 @@
</context-group> </context-group>
<context-group purpose="location"> <context-group purpose="location">
<context context-type="sourcefile">src/app/components/document-list/document-list.component.ts</context> <context context-type="sourcefile">src/app/components/document-list/document-list.component.ts</context>
<context context-type="linenumber">348</context> <context context-type="linenumber">351</context>
</context-group> </context-group>
<context-group purpose="location"> <context-group purpose="location">
<context context-type="sourcefile">src/app/components/manage/document-attributes/document-attributes.component.html</context> <context context-type="sourcefile">src/app/components/manage/document-attributes/document-attributes.component.html</context>
@@ -10757,7 +10757,7 @@
</context-group> </context-group>
<context-group purpose="location"> <context-group purpose="location">
<context context-type="sourcefile">src/app/components/document-list/document-list.component.ts</context> <context context-type="sourcefile">src/app/components/document-list/document-list.component.ts</context>
<context context-type="linenumber">341</context> <context context-type="linenumber">344</context>
</context-group> </context-group>
<context-group purpose="location"> <context-group purpose="location">
<context context-type="sourcefile">src/app/components/manage/document-attributes/document-attributes.component.html</context> <context context-type="sourcefile">src/app/components/manage/document-attributes/document-attributes.component.html</context>
@@ -11041,7 +11041,7 @@
<source>Reset filters / selection</source> <source>Reset filters / selection</source>
<context-group purpose="location"> <context-group purpose="location">
<context context-type="sourcefile">src/app/components/document-list/document-list.component.ts</context> <context context-type="sourcefile">src/app/components/document-list/document-list.component.ts</context>
<context context-type="linenumber">329</context> <context context-type="linenumber">332</context>
</context-group> </context-group>
<target state="needs-translation">Reset filters / selection</target> <target state="needs-translation">Reset filters / selection</target>
</trans-unit> </trans-unit>
@@ -11049,7 +11049,7 @@
<source>Open first [selected] document</source> <source>Open first [selected] document</source>
<context-group purpose="location"> <context-group purpose="location">
<context context-type="sourcefile">src/app/components/document-list/document-list.component.ts</context> <context context-type="sourcefile">src/app/components/document-list/document-list.component.ts</context>
<context context-type="linenumber">357</context> <context context-type="linenumber">360</context>
</context-group> </context-group>
<target state="needs-translation">Open first [selected] document</target> <target state="needs-translation">Open first [selected] document</target>
</trans-unit> </trans-unit>
@@ -11057,7 +11057,7 @@
<source>Previous page</source> <source>Previous page</source>
<context-group purpose="location"> <context-group purpose="location">
<context context-type="sourcefile">src/app/components/document-list/document-list.component.ts</context> <context context-type="sourcefile">src/app/components/document-list/document-list.component.ts</context>
<context context-type="linenumber">373</context> <context context-type="linenumber">376</context>
</context-group> </context-group>
<target state="needs-translation">Previous page</target> <target state="needs-translation">Previous page</target>
</trans-unit> </trans-unit>
@@ -11065,7 +11065,7 @@
<source>Next page</source> <source>Next page</source>
<context-group purpose="location"> <context-group purpose="location">
<context context-type="sourcefile">src/app/components/document-list/document-list.component.ts</context> <context context-type="sourcefile">src/app/components/document-list/document-list.component.ts</context>
<context context-type="linenumber">385</context> <context context-type="linenumber">388</context>
</context-group> </context-group>
<target state="needs-translation">Next page</target> <target state="needs-translation">Next page</target>
</trans-unit> </trans-unit>
@@ -11073,7 +11073,7 @@
<source>View &quot;<x id="PH" equiv-text="this.list.activeSavedViewTitle"/>&quot; saved successfully.</source> <source>View &quot;<x id="PH" equiv-text="this.list.activeSavedViewTitle"/>&quot; saved successfully.</source>
<context-group purpose="location"> <context-group purpose="location">
<context context-type="sourcefile">src/app/components/document-list/document-list.component.ts</context> <context context-type="sourcefile">src/app/components/document-list/document-list.component.ts</context>
<context context-type="linenumber">419</context> <context context-type="linenumber">422</context>
</context-group> </context-group>
<target state="needs-translation">View "<x id="PH" equiv-text="this.list.activeSavedViewTitle"/>" saved successfully.</target> <target state="needs-translation">View "<x id="PH" equiv-text="this.list.activeSavedViewTitle"/>" saved successfully.</target>
</trans-unit> </trans-unit>
@@ -11081,7 +11081,7 @@
<source>Failed to save view &quot;<x id="PH" equiv-text="this.list.activeSavedViewTitle"/>&quot;.</source> <source>Failed to save view &quot;<x id="PH" equiv-text="this.list.activeSavedViewTitle"/>&quot;.</source>
<context-group purpose="location"> <context-group purpose="location">
<context context-type="sourcefile">src/app/components/document-list/document-list.component.ts</context> <context context-type="sourcefile">src/app/components/document-list/document-list.component.ts</context>
<context context-type="linenumber">425</context> <context context-type="linenumber">428</context>
</context-group> </context-group>
<target state="needs-translation">Failed to save view "<x id="PH" equiv-text="this.list.activeSavedViewTitle"/>".</target> <target state="needs-translation">Failed to save view "<x id="PH" equiv-text="this.list.activeSavedViewTitle"/>".</target>
</trans-unit> </trans-unit>
@@ -11089,7 +11089,7 @@
<source>View &quot;<x id="PH" equiv-text="savedView.name"/>&quot; created successfully.</source> <source>View &quot;<x id="PH" equiv-text="savedView.name"/>&quot; created successfully.</source>
<context-group purpose="location"> <context-group purpose="location">
<context context-type="sourcefile">src/app/components/document-list/document-list.component.ts</context> <context context-type="sourcefile">src/app/components/document-list/document-list.component.ts</context>
<context context-type="linenumber">494</context> <context context-type="linenumber">497</context>
</context-group> </context-group>
<target state="needs-translation">View "<x id="PH" equiv-text="savedView.name"/>" created successfully.</target> <target state="needs-translation">View "<x id="PH" equiv-text="savedView.name"/>" created successfully.</target>
</trans-unit> </trans-unit>
@@ -11097,7 +11097,7 @@
<source>View &quot;<x id="PH" equiv-text="savedView.name"/>&quot; created successfully, but could not update visibility settings.</source> <source>View &quot;<x id="PH" equiv-text="savedView.name"/>&quot; created successfully, but could not update visibility settings.</source>
<context-group purpose="location"> <context-group purpose="location">
<context context-type="sourcefile">src/app/components/document-list/document-list.component.ts</context> <context context-type="sourcefile">src/app/components/document-list/document-list.component.ts</context>
<context context-type="linenumber">500</context> <context context-type="linenumber">503</context>
</context-group> </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="needs-translation">View "<x id="PH" equiv-text="savedView.name"/>" created successfully, but could not update visibility settings.</target>
</trans-unit> </trans-unit>
@@ -13298,11 +13298,27 @@
</context-group> </context-group>
<target state="needs-translation">LLM Embedding Model</target> <target state="needs-translation">LLM Embedding Model</target>
</trans-unit> </trans-unit>
<trans-unit id="861068592166833023" datatype="html">
<source>LLM Embedding API Key</source>
<context-group purpose="location">
<context context-type="sourcefile">src/app/data/paperless-config.ts</context>
<context context-type="linenumber">358</context>
</context-group>
<target state="needs-translation">LLM Embedding API Key</target>
</trans-unit>
<trans-unit id="2929108042259892948" datatype="html">
<source>Used for embeddings when set, otherwise LLM API key is used.</source>
<context-group purpose="location">
<context context-type="sourcefile">src/app/data/paperless-config.ts</context>
<context context-type="linenumber">360</context>
</context-group>
<target state="needs-translation">Used for embeddings when set, otherwise LLM API key is used.</target>
</trans-unit>
<trans-unit id="3554114880473286122" datatype="html"> <trans-unit id="3554114880473286122" datatype="html">
<source>LLM Embedding Endpoint</source> <source>LLM Embedding Endpoint</source>
<context-group purpose="location"> <context-group purpose="location">
<context context-type="sourcefile">src/app/data/paperless-config.ts</context> <context context-type="sourcefile">src/app/data/paperless-config.ts</context>
<context context-type="linenumber">358</context> <context context-type="linenumber">366</context>
</context-group> </context-group>
<target state="needs-translation">LLM Embedding Endpoint</target> <target state="needs-translation">LLM Embedding Endpoint</target>
</trans-unit> </trans-unit>
@@ -13310,7 +13326,7 @@
<source>LLM Embedding Chunk Size</source> <source>LLM Embedding Chunk Size</source>
<context-group purpose="location"> <context-group purpose="location">
<context context-type="sourcefile">src/app/data/paperless-config.ts</context> <context context-type="sourcefile">src/app/data/paperless-config.ts</context>
<context context-type="linenumber">365</context> <context context-type="linenumber">373</context>
</context-group> </context-group>
<target state="needs-translation">LLM Embedding Chunk Size</target> <target state="needs-translation">LLM Embedding Chunk Size</target>
</trans-unit> </trans-unit>
@@ -13318,7 +13334,7 @@
<source>LLM Context Size</source> <source>LLM Context Size</source>
<context-group purpose="location"> <context-group purpose="location">
<context context-type="sourcefile">src/app/data/paperless-config.ts</context> <context context-type="sourcefile">src/app/data/paperless-config.ts</context>
<context context-type="linenumber">372</context> <context context-type="linenumber">380</context>
</context-group> </context-group>
<target state="needs-translation">LLM Context Size</target> <target state="needs-translation">LLM Context Size</target>
</trans-unit> </trans-unit>
@@ -13326,7 +13342,7 @@
<source>LLM Backend</source> <source>LLM Backend</source>
<context-group purpose="location"> <context-group purpose="location">
<context context-type="sourcefile">src/app/data/paperless-config.ts</context> <context context-type="sourcefile">src/app/data/paperless-config.ts</context>
<context context-type="linenumber">379</context> <context context-type="linenumber">387</context>
</context-group> </context-group>
<target state="needs-translation">LLM Backend</target> <target state="needs-translation">LLM Backend</target>
</trans-unit> </trans-unit>
@@ -13334,7 +13350,7 @@
<source>LLM Model</source> <source>LLM Model</source>
<context-group purpose="location"> <context-group purpose="location">
<context context-type="sourcefile">src/app/data/paperless-config.ts</context> <context context-type="sourcefile">src/app/data/paperless-config.ts</context>
<context context-type="linenumber">387</context> <context context-type="linenumber">395</context>
</context-group> </context-group>
<target state="needs-translation">LLM Model</target> <target state="needs-translation">LLM Model</target>
</trans-unit> </trans-unit>
@@ -13342,7 +13358,7 @@
<source>LLM API Key</source> <source>LLM API Key</source>
<context-group purpose="location"> <context-group purpose="location">
<context context-type="sourcefile">src/app/data/paperless-config.ts</context> <context context-type="sourcefile">src/app/data/paperless-config.ts</context>
<context context-type="linenumber">394</context> <context context-type="linenumber">402</context>
</context-group> </context-group>
<target state="needs-translation">LLM API Key</target> <target state="needs-translation">LLM API Key</target>
</trans-unit> </trans-unit>
@@ -13350,7 +13366,7 @@
<source>LLM Endpoint</source> <source>LLM Endpoint</source>
<context-group purpose="location"> <context-group purpose="location">
<context context-type="sourcefile">src/app/data/paperless-config.ts</context> <context context-type="sourcefile">src/app/data/paperless-config.ts</context>
<context context-type="linenumber">401</context> <context context-type="linenumber">409</context>
</context-group> </context-group>
<target state="needs-translation">LLM Endpoint</target> <target state="needs-translation">LLM Endpoint</target>
</trans-unit> </trans-unit>
@@ -13358,7 +13374,7 @@
<source>LLM Output Language</source> <source>LLM Output Language</source>
<context-group purpose="location"> <context-group purpose="location">
<context context-type="sourcefile">src/app/data/paperless-config.ts</context> <context context-type="sourcefile">src/app/data/paperless-config.ts</context>
<context context-type="linenumber">408</context> <context context-type="linenumber">416</context>
</context-group> </context-group>
<target state="needs-translation">LLM Output Language</target> <target state="needs-translation">LLM Output Language</target>
</trans-unit> </trans-unit>
@@ -13366,7 +13382,7 @@
<source>Language to use for generated AI suggestions. When unset, AI suggestions use the user&apos;s display language if explicitly set.</source> <source>Language to use for generated AI suggestions. When unset, AI suggestions use the user&apos;s display language if explicitly set.</source>
<context-group purpose="location"> <context-group purpose="location">
<context context-type="sourcefile">src/app/data/paperless-config.ts</context> <context context-type="sourcefile">src/app/data/paperless-config.ts</context>
<context context-type="linenumber">412</context> <context context-type="linenumber">420</context>
</context-group> </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="needs-translation">Language to use for generated AI suggestions. When unset, AI suggestions use the user's display language if explicitly set.</target>
</trans-unit> </trans-unit>
@@ -13374,7 +13390,7 @@
<source>LLM Request Timeout</source> <source>LLM Request Timeout</source>
<context-group purpose="location"> <context-group purpose="location">
<context context-type="sourcefile">src/app/data/paperless-config.ts</context> <context context-type="sourcefile">src/app/data/paperless-config.ts</context>
<context context-type="linenumber">416</context> <context context-type="linenumber">424</context>
</context-group> </context-group>
<target state="needs-translation">LLM Request Timeout</target> <target state="needs-translation">LLM Request Timeout</target>
</trans-unit> </trans-unit>
@@ -13382,7 +13398,7 @@
<source>Timeout in seconds for LLM requests.</source> <source>Timeout in seconds for LLM requests.</source>
<context-group purpose="location"> <context-group purpose="location">
<context context-type="sourcefile">src/app/data/paperless-config.ts</context> <context context-type="sourcefile">src/app/data/paperless-config.ts</context>
<context context-type="linenumber">420</context> <context context-type="linenumber">428</context>
</context-group> </context-group>
<target state="needs-translation">Timeout in seconds for LLM requests.</target> <target state="needs-translation">Timeout in seconds for LLM requests.</target>
</trans-unit> </trans-unit>
+37 -21
View File
@@ -10741,7 +10741,7 @@
</context-group> </context-group>
<context-group purpose="location"> <context-group purpose="location">
<context context-type="sourcefile">src/app/components/document-list/document-list.component.ts</context> <context context-type="sourcefile">src/app/components/document-list/document-list.component.ts</context>
<context context-type="linenumber">348</context> <context context-type="linenumber">351</context>
</context-group> </context-group>
<context-group purpose="location"> <context-group purpose="location">
<context context-type="sourcefile">src/app/components/manage/document-attributes/document-attributes.component.html</context> <context context-type="sourcefile">src/app/components/manage/document-attributes/document-attributes.component.html</context>
@@ -10757,7 +10757,7 @@
</context-group> </context-group>
<context-group purpose="location"> <context-group purpose="location">
<context context-type="sourcefile">src/app/components/document-list/document-list.component.ts</context> <context context-type="sourcefile">src/app/components/document-list/document-list.component.ts</context>
<context context-type="linenumber">341</context> <context context-type="linenumber">344</context>
</context-group> </context-group>
<context-group purpose="location"> <context-group purpose="location">
<context context-type="sourcefile">src/app/components/manage/document-attributes/document-attributes.component.html</context> <context context-type="sourcefile">src/app/components/manage/document-attributes/document-attributes.component.html</context>
@@ -11041,7 +11041,7 @@
<source>Reset filters / selection</source> <source>Reset filters / selection</source>
<context-group purpose="location"> <context-group purpose="location">
<context context-type="sourcefile">src/app/components/document-list/document-list.component.ts</context> <context context-type="sourcefile">src/app/components/document-list/document-list.component.ts</context>
<context context-type="linenumber">329</context> <context context-type="linenumber">332</context>
</context-group> </context-group>
<target state="needs-translation">Reset filters / selection</target> <target state="needs-translation">Reset filters / selection</target>
</trans-unit> </trans-unit>
@@ -11049,7 +11049,7 @@
<source>Open first [selected] document</source> <source>Open first [selected] document</source>
<context-group purpose="location"> <context-group purpose="location">
<context context-type="sourcefile">src/app/components/document-list/document-list.component.ts</context> <context context-type="sourcefile">src/app/components/document-list/document-list.component.ts</context>
<context context-type="linenumber">357</context> <context context-type="linenumber">360</context>
</context-group> </context-group>
<target state="needs-translation">Open first [selected] document</target> <target state="needs-translation">Open first [selected] document</target>
</trans-unit> </trans-unit>
@@ -11057,7 +11057,7 @@
<source>Previous page</source> <source>Previous page</source>
<context-group purpose="location"> <context-group purpose="location">
<context context-type="sourcefile">src/app/components/document-list/document-list.component.ts</context> <context context-type="sourcefile">src/app/components/document-list/document-list.component.ts</context>
<context context-type="linenumber">373</context> <context context-type="linenumber">376</context>
</context-group> </context-group>
<target state="needs-translation">Previous page</target> <target state="needs-translation">Previous page</target>
</trans-unit> </trans-unit>
@@ -11065,7 +11065,7 @@
<source>Next page</source> <source>Next page</source>
<context-group purpose="location"> <context-group purpose="location">
<context context-type="sourcefile">src/app/components/document-list/document-list.component.ts</context> <context context-type="sourcefile">src/app/components/document-list/document-list.component.ts</context>
<context context-type="linenumber">385</context> <context context-type="linenumber">388</context>
</context-group> </context-group>
<target state="needs-translation">Next page</target> <target state="needs-translation">Next page</target>
</trans-unit> </trans-unit>
@@ -11073,7 +11073,7 @@
<source>View &quot;<x id="PH" equiv-text="this.list.activeSavedViewTitle"/>&quot; saved successfully.</source> <source>View &quot;<x id="PH" equiv-text="this.list.activeSavedViewTitle"/>&quot; saved successfully.</source>
<context-group purpose="location"> <context-group purpose="location">
<context context-type="sourcefile">src/app/components/document-list/document-list.component.ts</context> <context context-type="sourcefile">src/app/components/document-list/document-list.component.ts</context>
<context context-type="linenumber">419</context> <context context-type="linenumber">422</context>
</context-group> </context-group>
<target state="needs-translation">View "<x id="PH" equiv-text="this.list.activeSavedViewTitle"/>" saved successfully.</target> <target state="needs-translation">View "<x id="PH" equiv-text="this.list.activeSavedViewTitle"/>" saved successfully.</target>
</trans-unit> </trans-unit>
@@ -11081,7 +11081,7 @@
<source>Failed to save view &quot;<x id="PH" equiv-text="this.list.activeSavedViewTitle"/>&quot;.</source> <source>Failed to save view &quot;<x id="PH" equiv-text="this.list.activeSavedViewTitle"/>&quot;.</source>
<context-group purpose="location"> <context-group purpose="location">
<context context-type="sourcefile">src/app/components/document-list/document-list.component.ts</context> <context context-type="sourcefile">src/app/components/document-list/document-list.component.ts</context>
<context context-type="linenumber">425</context> <context context-type="linenumber">428</context>
</context-group> </context-group>
<target state="needs-translation">Failed to save view "<x id="PH" equiv-text="this.list.activeSavedViewTitle"/>".</target> <target state="needs-translation">Failed to save view "<x id="PH" equiv-text="this.list.activeSavedViewTitle"/>".</target>
</trans-unit> </trans-unit>
@@ -11089,7 +11089,7 @@
<source>View &quot;<x id="PH" equiv-text="savedView.name"/>&quot; created successfully.</source> <source>View &quot;<x id="PH" equiv-text="savedView.name"/>&quot; created successfully.</source>
<context-group purpose="location"> <context-group purpose="location">
<context context-type="sourcefile">src/app/components/document-list/document-list.component.ts</context> <context context-type="sourcefile">src/app/components/document-list/document-list.component.ts</context>
<context context-type="linenumber">494</context> <context context-type="linenumber">497</context>
</context-group> </context-group>
<target state="needs-translation">View "<x id="PH" equiv-text="savedView.name"/>" created successfully.</target> <target state="needs-translation">View "<x id="PH" equiv-text="savedView.name"/>" created successfully.</target>
</trans-unit> </trans-unit>
@@ -11097,7 +11097,7 @@
<source>View &quot;<x id="PH" equiv-text="savedView.name"/>&quot; created successfully, but could not update visibility settings.</source> <source>View &quot;<x id="PH" equiv-text="savedView.name"/>&quot; created successfully, but could not update visibility settings.</source>
<context-group purpose="location"> <context-group purpose="location">
<context context-type="sourcefile">src/app/components/document-list/document-list.component.ts</context> <context context-type="sourcefile">src/app/components/document-list/document-list.component.ts</context>
<context context-type="linenumber">500</context> <context context-type="linenumber">503</context>
</context-group> </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="needs-translation">View "<x id="PH" equiv-text="savedView.name"/>" created successfully, but could not update visibility settings.</target>
</trans-unit> </trans-unit>
@@ -13298,11 +13298,27 @@
</context-group> </context-group>
<target state="needs-translation">LLM Embedding Model</target> <target state="needs-translation">LLM Embedding Model</target>
</trans-unit> </trans-unit>
<trans-unit id="861068592166833023" datatype="html">
<source>LLM Embedding API Key</source>
<context-group purpose="location">
<context context-type="sourcefile">src/app/data/paperless-config.ts</context>
<context context-type="linenumber">358</context>
</context-group>
<target state="needs-translation">LLM Embedding API Key</target>
</trans-unit>
<trans-unit id="2929108042259892948" datatype="html">
<source>Used for embeddings when set, otherwise LLM API key is used.</source>
<context-group purpose="location">
<context context-type="sourcefile">src/app/data/paperless-config.ts</context>
<context context-type="linenumber">360</context>
</context-group>
<target state="needs-translation">Used for embeddings when set, otherwise LLM API key is used.</target>
</trans-unit>
<trans-unit id="3554114880473286122" datatype="html"> <trans-unit id="3554114880473286122" datatype="html">
<source>LLM Embedding Endpoint</source> <source>LLM Embedding Endpoint</source>
<context-group purpose="location"> <context-group purpose="location">
<context context-type="sourcefile">src/app/data/paperless-config.ts</context> <context context-type="sourcefile">src/app/data/paperless-config.ts</context>
<context context-type="linenumber">358</context> <context context-type="linenumber">366</context>
</context-group> </context-group>
<target state="needs-translation">LLM Embedding Endpoint</target> <target state="needs-translation">LLM Embedding Endpoint</target>
</trans-unit> </trans-unit>
@@ -13310,7 +13326,7 @@
<source>LLM Embedding Chunk Size</source> <source>LLM Embedding Chunk Size</source>
<context-group purpose="location"> <context-group purpose="location">
<context context-type="sourcefile">src/app/data/paperless-config.ts</context> <context context-type="sourcefile">src/app/data/paperless-config.ts</context>
<context context-type="linenumber">365</context> <context context-type="linenumber">373</context>
</context-group> </context-group>
<target state="needs-translation">LLM Embedding Chunk Size</target> <target state="needs-translation">LLM Embedding Chunk Size</target>
</trans-unit> </trans-unit>
@@ -13318,7 +13334,7 @@
<source>LLM Context Size</source> <source>LLM Context Size</source>
<context-group purpose="location"> <context-group purpose="location">
<context context-type="sourcefile">src/app/data/paperless-config.ts</context> <context context-type="sourcefile">src/app/data/paperless-config.ts</context>
<context context-type="linenumber">372</context> <context context-type="linenumber">380</context>
</context-group> </context-group>
<target state="needs-translation">LLM Context Size</target> <target state="needs-translation">LLM Context Size</target>
</trans-unit> </trans-unit>
@@ -13326,7 +13342,7 @@
<source>LLM Backend</source> <source>LLM Backend</source>
<context-group purpose="location"> <context-group purpose="location">
<context context-type="sourcefile">src/app/data/paperless-config.ts</context> <context context-type="sourcefile">src/app/data/paperless-config.ts</context>
<context context-type="linenumber">379</context> <context context-type="linenumber">387</context>
</context-group> </context-group>
<target state="needs-translation">LLM Backend</target> <target state="needs-translation">LLM Backend</target>
</trans-unit> </trans-unit>
@@ -13334,7 +13350,7 @@
<source>LLM Model</source> <source>LLM Model</source>
<context-group purpose="location"> <context-group purpose="location">
<context context-type="sourcefile">src/app/data/paperless-config.ts</context> <context context-type="sourcefile">src/app/data/paperless-config.ts</context>
<context context-type="linenumber">387</context> <context context-type="linenumber">395</context>
</context-group> </context-group>
<target state="needs-translation">LLM Model</target> <target state="needs-translation">LLM Model</target>
</trans-unit> </trans-unit>
@@ -13342,7 +13358,7 @@
<source>LLM API Key</source> <source>LLM API Key</source>
<context-group purpose="location"> <context-group purpose="location">
<context context-type="sourcefile">src/app/data/paperless-config.ts</context> <context context-type="sourcefile">src/app/data/paperless-config.ts</context>
<context context-type="linenumber">394</context> <context context-type="linenumber">402</context>
</context-group> </context-group>
<target state="needs-translation">LLM API Key</target> <target state="needs-translation">LLM API Key</target>
</trans-unit> </trans-unit>
@@ -13350,7 +13366,7 @@
<source>LLM Endpoint</source> <source>LLM Endpoint</source>
<context-group purpose="location"> <context-group purpose="location">
<context context-type="sourcefile">src/app/data/paperless-config.ts</context> <context context-type="sourcefile">src/app/data/paperless-config.ts</context>
<context context-type="linenumber">401</context> <context context-type="linenumber">409</context>
</context-group> </context-group>
<target state="needs-translation">LLM Endpoint</target> <target state="needs-translation">LLM Endpoint</target>
</trans-unit> </trans-unit>
@@ -13358,7 +13374,7 @@
<source>LLM Output Language</source> <source>LLM Output Language</source>
<context-group purpose="location"> <context-group purpose="location">
<context context-type="sourcefile">src/app/data/paperless-config.ts</context> <context context-type="sourcefile">src/app/data/paperless-config.ts</context>
<context context-type="linenumber">408</context> <context context-type="linenumber">416</context>
</context-group> </context-group>
<target state="needs-translation">LLM Output Language</target> <target state="needs-translation">LLM Output Language</target>
</trans-unit> </trans-unit>
@@ -13366,7 +13382,7 @@
<source>Language to use for generated AI suggestions. When unset, AI suggestions use the user&apos;s display language if explicitly set.</source> <source>Language to use for generated AI suggestions. When unset, AI suggestions use the user&apos;s display language if explicitly set.</source>
<context-group purpose="location"> <context-group purpose="location">
<context context-type="sourcefile">src/app/data/paperless-config.ts</context> <context context-type="sourcefile">src/app/data/paperless-config.ts</context>
<context context-type="linenumber">412</context> <context context-type="linenumber">420</context>
</context-group> </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="needs-translation">Language to use for generated AI suggestions. When unset, AI suggestions use the user's display language if explicitly set.</target>
</trans-unit> </trans-unit>
@@ -13374,7 +13390,7 @@
<source>LLM Request Timeout</source> <source>LLM Request Timeout</source>
<context-group purpose="location"> <context-group purpose="location">
<context context-type="sourcefile">src/app/data/paperless-config.ts</context> <context context-type="sourcefile">src/app/data/paperless-config.ts</context>
<context context-type="linenumber">416</context> <context context-type="linenumber">424</context>
</context-group> </context-group>
<target state="needs-translation">LLM Request Timeout</target> <target state="needs-translation">LLM Request Timeout</target>
</trans-unit> </trans-unit>
@@ -13382,7 +13398,7 @@
<source>Timeout in seconds for LLM requests.</source> <source>Timeout in seconds for LLM requests.</source>
<context-group purpose="location"> <context-group purpose="location">
<context context-type="sourcefile">src/app/data/paperless-config.ts</context> <context context-type="sourcefile">src/app/data/paperless-config.ts</context>
<context context-type="linenumber">420</context> <context context-type="linenumber">428</context>
</context-group> </context-group>
<target state="needs-translation">Timeout in seconds for LLM requests.</target> <target state="needs-translation">Timeout in seconds for LLM requests.</target>
</trans-unit> </trans-unit>
+37 -21
View File
@@ -10741,7 +10741,7 @@
</context-group> </context-group>
<context-group purpose="location"> <context-group purpose="location">
<context context-type="sourcefile">src/app/components/document-list/document-list.component.ts</context> <context context-type="sourcefile">src/app/components/document-list/document-list.component.ts</context>
<context context-type="linenumber">348</context> <context context-type="linenumber">351</context>
</context-group> </context-group>
<context-group purpose="location"> <context-group purpose="location">
<context context-type="sourcefile">src/app/components/manage/document-attributes/document-attributes.component.html</context> <context context-type="sourcefile">src/app/components/manage/document-attributes/document-attributes.component.html</context>
@@ -10757,7 +10757,7 @@
</context-group> </context-group>
<context-group purpose="location"> <context-group purpose="location">
<context context-type="sourcefile">src/app/components/document-list/document-list.component.ts</context> <context context-type="sourcefile">src/app/components/document-list/document-list.component.ts</context>
<context context-type="linenumber">341</context> <context context-type="linenumber">344</context>
</context-group> </context-group>
<context-group purpose="location"> <context-group purpose="location">
<context context-type="sourcefile">src/app/components/manage/document-attributes/document-attributes.component.html</context> <context context-type="sourcefile">src/app/components/manage/document-attributes/document-attributes.component.html</context>
@@ -11041,7 +11041,7 @@
<source>Reset filters / selection</source> <source>Reset filters / selection</source>
<context-group purpose="location"> <context-group purpose="location">
<context context-type="sourcefile">src/app/components/document-list/document-list.component.ts</context> <context context-type="sourcefile">src/app/components/document-list/document-list.component.ts</context>
<context context-type="linenumber">329</context> <context context-type="linenumber">332</context>
</context-group> </context-group>
<target state="needs-translation">Reset filters / selection</target> <target state="needs-translation">Reset filters / selection</target>
</trans-unit> </trans-unit>
@@ -11049,7 +11049,7 @@
<source>Open first [selected] document</source> <source>Open first [selected] document</source>
<context-group purpose="location"> <context-group purpose="location">
<context context-type="sourcefile">src/app/components/document-list/document-list.component.ts</context> <context context-type="sourcefile">src/app/components/document-list/document-list.component.ts</context>
<context context-type="linenumber">357</context> <context context-type="linenumber">360</context>
</context-group> </context-group>
<target state="needs-translation">Open first [selected] document</target> <target state="needs-translation">Open first [selected] document</target>
</trans-unit> </trans-unit>
@@ -11057,7 +11057,7 @@
<source>Previous page</source> <source>Previous page</source>
<context-group purpose="location"> <context-group purpose="location">
<context context-type="sourcefile">src/app/components/document-list/document-list.component.ts</context> <context context-type="sourcefile">src/app/components/document-list/document-list.component.ts</context>
<context context-type="linenumber">373</context> <context context-type="linenumber">376</context>
</context-group> </context-group>
<target state="needs-translation">Previous page</target> <target state="needs-translation">Previous page</target>
</trans-unit> </trans-unit>
@@ -11065,7 +11065,7 @@
<source>Next page</source> <source>Next page</source>
<context-group purpose="location"> <context-group purpose="location">
<context context-type="sourcefile">src/app/components/document-list/document-list.component.ts</context> <context context-type="sourcefile">src/app/components/document-list/document-list.component.ts</context>
<context context-type="linenumber">385</context> <context context-type="linenumber">388</context>
</context-group> </context-group>
<target state="needs-translation">Next page</target> <target state="needs-translation">Next page</target>
</trans-unit> </trans-unit>
@@ -11073,7 +11073,7 @@
<source>View &quot;<x id="PH" equiv-text="this.list.activeSavedViewTitle"/>&quot; saved successfully.</source> <source>View &quot;<x id="PH" equiv-text="this.list.activeSavedViewTitle"/>&quot; saved successfully.</source>
<context-group purpose="location"> <context-group purpose="location">
<context context-type="sourcefile">src/app/components/document-list/document-list.component.ts</context> <context context-type="sourcefile">src/app/components/document-list/document-list.component.ts</context>
<context context-type="linenumber">419</context> <context context-type="linenumber">422</context>
</context-group> </context-group>
<target state="needs-translation">View "<x id="PH" equiv-text="this.list.activeSavedViewTitle"/>" saved successfully.</target> <target state="needs-translation">View "<x id="PH" equiv-text="this.list.activeSavedViewTitle"/>" saved successfully.</target>
</trans-unit> </trans-unit>
@@ -11081,7 +11081,7 @@
<source>Failed to save view &quot;<x id="PH" equiv-text="this.list.activeSavedViewTitle"/>&quot;.</source> <source>Failed to save view &quot;<x id="PH" equiv-text="this.list.activeSavedViewTitle"/>&quot;.</source>
<context-group purpose="location"> <context-group purpose="location">
<context context-type="sourcefile">src/app/components/document-list/document-list.component.ts</context> <context context-type="sourcefile">src/app/components/document-list/document-list.component.ts</context>
<context context-type="linenumber">425</context> <context context-type="linenumber">428</context>
</context-group> </context-group>
<target state="needs-translation">Failed to save view "<x id="PH" equiv-text="this.list.activeSavedViewTitle"/>".</target> <target state="needs-translation">Failed to save view "<x id="PH" equiv-text="this.list.activeSavedViewTitle"/>".</target>
</trans-unit> </trans-unit>
@@ -11089,7 +11089,7 @@
<source>View &quot;<x id="PH" equiv-text="savedView.name"/>&quot; created successfully.</source> <source>View &quot;<x id="PH" equiv-text="savedView.name"/>&quot; created successfully.</source>
<context-group purpose="location"> <context-group purpose="location">
<context context-type="sourcefile">src/app/components/document-list/document-list.component.ts</context> <context context-type="sourcefile">src/app/components/document-list/document-list.component.ts</context>
<context context-type="linenumber">494</context> <context context-type="linenumber">497</context>
</context-group> </context-group>
<target state="needs-translation">View "<x id="PH" equiv-text="savedView.name"/>" created successfully.</target> <target state="needs-translation">View "<x id="PH" equiv-text="savedView.name"/>" created successfully.</target>
</trans-unit> </trans-unit>
@@ -11097,7 +11097,7 @@
<source>View &quot;<x id="PH" equiv-text="savedView.name"/>&quot; created successfully, but could not update visibility settings.</source> <source>View &quot;<x id="PH" equiv-text="savedView.name"/>&quot; created successfully, but could not update visibility settings.</source>
<context-group purpose="location"> <context-group purpose="location">
<context context-type="sourcefile">src/app/components/document-list/document-list.component.ts</context> <context context-type="sourcefile">src/app/components/document-list/document-list.component.ts</context>
<context context-type="linenumber">500</context> <context context-type="linenumber">503</context>
</context-group> </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="needs-translation">View "<x id="PH" equiv-text="savedView.name"/>" created successfully, but could not update visibility settings.</target>
</trans-unit> </trans-unit>
@@ -13298,11 +13298,27 @@
</context-group> </context-group>
<target state="needs-translation">LLM Embedding Model</target> <target state="needs-translation">LLM Embedding Model</target>
</trans-unit> </trans-unit>
<trans-unit id="861068592166833023" datatype="html">
<source>LLM Embedding API Key</source>
<context-group purpose="location">
<context context-type="sourcefile">src/app/data/paperless-config.ts</context>
<context context-type="linenumber">358</context>
</context-group>
<target state="needs-translation">LLM Embedding API Key</target>
</trans-unit>
<trans-unit id="2929108042259892948" datatype="html">
<source>Used for embeddings when set, otherwise LLM API key is used.</source>
<context-group purpose="location">
<context context-type="sourcefile">src/app/data/paperless-config.ts</context>
<context context-type="linenumber">360</context>
</context-group>
<target state="needs-translation">Used for embeddings when set, otherwise LLM API key is used.</target>
</trans-unit>
<trans-unit id="3554114880473286122" datatype="html"> <trans-unit id="3554114880473286122" datatype="html">
<source>LLM Embedding Endpoint</source> <source>LLM Embedding Endpoint</source>
<context-group purpose="location"> <context-group purpose="location">
<context context-type="sourcefile">src/app/data/paperless-config.ts</context> <context context-type="sourcefile">src/app/data/paperless-config.ts</context>
<context context-type="linenumber">358</context> <context context-type="linenumber">366</context>
</context-group> </context-group>
<target state="needs-translation">LLM Embedding Endpoint</target> <target state="needs-translation">LLM Embedding Endpoint</target>
</trans-unit> </trans-unit>
@@ -13310,7 +13326,7 @@
<source>LLM Embedding Chunk Size</source> <source>LLM Embedding Chunk Size</source>
<context-group purpose="location"> <context-group purpose="location">
<context context-type="sourcefile">src/app/data/paperless-config.ts</context> <context context-type="sourcefile">src/app/data/paperless-config.ts</context>
<context context-type="linenumber">365</context> <context context-type="linenumber">373</context>
</context-group> </context-group>
<target state="needs-translation">LLM Embedding Chunk Size</target> <target state="needs-translation">LLM Embedding Chunk Size</target>
</trans-unit> </trans-unit>
@@ -13318,7 +13334,7 @@
<source>LLM Context Size</source> <source>LLM Context Size</source>
<context-group purpose="location"> <context-group purpose="location">
<context context-type="sourcefile">src/app/data/paperless-config.ts</context> <context context-type="sourcefile">src/app/data/paperless-config.ts</context>
<context context-type="linenumber">372</context> <context context-type="linenumber">380</context>
</context-group> </context-group>
<target state="needs-translation">LLM Context Size</target> <target state="needs-translation">LLM Context Size</target>
</trans-unit> </trans-unit>
@@ -13326,7 +13342,7 @@
<source>LLM Backend</source> <source>LLM Backend</source>
<context-group purpose="location"> <context-group purpose="location">
<context context-type="sourcefile">src/app/data/paperless-config.ts</context> <context context-type="sourcefile">src/app/data/paperless-config.ts</context>
<context context-type="linenumber">379</context> <context context-type="linenumber">387</context>
</context-group> </context-group>
<target state="needs-translation">LLM Backend</target> <target state="needs-translation">LLM Backend</target>
</trans-unit> </trans-unit>
@@ -13334,7 +13350,7 @@
<source>LLM Model</source> <source>LLM Model</source>
<context-group purpose="location"> <context-group purpose="location">
<context context-type="sourcefile">src/app/data/paperless-config.ts</context> <context context-type="sourcefile">src/app/data/paperless-config.ts</context>
<context context-type="linenumber">387</context> <context context-type="linenumber">395</context>
</context-group> </context-group>
<target state="needs-translation">LLM Model</target> <target state="needs-translation">LLM Model</target>
</trans-unit> </trans-unit>
@@ -13342,7 +13358,7 @@
<source>LLM API Key</source> <source>LLM API Key</source>
<context-group purpose="location"> <context-group purpose="location">
<context context-type="sourcefile">src/app/data/paperless-config.ts</context> <context context-type="sourcefile">src/app/data/paperless-config.ts</context>
<context context-type="linenumber">394</context> <context context-type="linenumber">402</context>
</context-group> </context-group>
<target state="needs-translation">LLM API Key</target> <target state="needs-translation">LLM API Key</target>
</trans-unit> </trans-unit>
@@ -13350,7 +13366,7 @@
<source>LLM Endpoint</source> <source>LLM Endpoint</source>
<context-group purpose="location"> <context-group purpose="location">
<context context-type="sourcefile">src/app/data/paperless-config.ts</context> <context context-type="sourcefile">src/app/data/paperless-config.ts</context>
<context context-type="linenumber">401</context> <context context-type="linenumber">409</context>
</context-group> </context-group>
<target state="needs-translation">LLM Endpoint</target> <target state="needs-translation">LLM Endpoint</target>
</trans-unit> </trans-unit>
@@ -13358,7 +13374,7 @@
<source>LLM Output Language</source> <source>LLM Output Language</source>
<context-group purpose="location"> <context-group purpose="location">
<context context-type="sourcefile">src/app/data/paperless-config.ts</context> <context context-type="sourcefile">src/app/data/paperless-config.ts</context>
<context context-type="linenumber">408</context> <context context-type="linenumber">416</context>
</context-group> </context-group>
<target state="needs-translation">LLM Output Language</target> <target state="needs-translation">LLM Output Language</target>
</trans-unit> </trans-unit>
@@ -13366,7 +13382,7 @@
<source>Language to use for generated AI suggestions. When unset, AI suggestions use the user&apos;s display language if explicitly set.</source> <source>Language to use for generated AI suggestions. When unset, AI suggestions use the user&apos;s display language if explicitly set.</source>
<context-group purpose="location"> <context-group purpose="location">
<context context-type="sourcefile">src/app/data/paperless-config.ts</context> <context context-type="sourcefile">src/app/data/paperless-config.ts</context>
<context context-type="linenumber">412</context> <context context-type="linenumber">420</context>
</context-group> </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="needs-translation">Language to use for generated AI suggestions. When unset, AI suggestions use the user's display language if explicitly set.</target>
</trans-unit> </trans-unit>
@@ -13374,7 +13390,7 @@
<source>LLM Request Timeout</source> <source>LLM Request Timeout</source>
<context-group purpose="location"> <context-group purpose="location">
<context context-type="sourcefile">src/app/data/paperless-config.ts</context> <context context-type="sourcefile">src/app/data/paperless-config.ts</context>
<context context-type="linenumber">416</context> <context context-type="linenumber">424</context>
</context-group> </context-group>
<target state="needs-translation">LLM Request Timeout</target> <target state="needs-translation">LLM Request Timeout</target>
</trans-unit> </trans-unit>
@@ -13382,7 +13398,7 @@
<source>Timeout in seconds for LLM requests.</source> <source>Timeout in seconds for LLM requests.</source>
<context-group purpose="location"> <context-group purpose="location">
<context context-type="sourcefile">src/app/data/paperless-config.ts</context> <context context-type="sourcefile">src/app/data/paperless-config.ts</context>
<context context-type="linenumber">420</context> <context context-type="linenumber">428</context>
</context-group> </context-group>
<target state="needs-translation">Timeout in seconds for LLM requests.</target> <target state="needs-translation">Timeout in seconds for LLM requests.</target>
</trans-unit> </trans-unit>
+37 -21
View File
@@ -10740,7 +10740,7 @@
</context-group> </context-group>
<context-group purpose="location"> <context-group purpose="location">
<context context-type="sourcefile">src/app/components/document-list/document-list.component.ts</context> <context context-type="sourcefile">src/app/components/document-list/document-list.component.ts</context>
<context context-type="linenumber">348</context> <context context-type="linenumber">351</context>
</context-group> </context-group>
<context-group purpose="location"> <context-group purpose="location">
<context context-type="sourcefile">src/app/components/manage/document-attributes/document-attributes.component.html</context> <context context-type="sourcefile">src/app/components/manage/document-attributes/document-attributes.component.html</context>
@@ -10756,7 +10756,7 @@
</context-group> </context-group>
<context-group purpose="location"> <context-group purpose="location">
<context context-type="sourcefile">src/app/components/document-list/document-list.component.ts</context> <context context-type="sourcefile">src/app/components/document-list/document-list.component.ts</context>
<context context-type="linenumber">341</context> <context context-type="linenumber">344</context>
</context-group> </context-group>
<context-group purpose="location"> <context-group purpose="location">
<context context-type="sourcefile">src/app/components/manage/document-attributes/document-attributes.component.html</context> <context context-type="sourcefile">src/app/components/manage/document-attributes/document-attributes.component.html</context>
@@ -11040,7 +11040,7 @@
<source>Reset filters / selection</source> <source>Reset filters / selection</source>
<context-group purpose="location"> <context-group purpose="location">
<context context-type="sourcefile">src/app/components/document-list/document-list.component.ts</context> <context context-type="sourcefile">src/app/components/document-list/document-list.component.ts</context>
<context context-type="linenumber">329</context> <context context-type="linenumber">332</context>
</context-group> </context-group>
<target state="translated">Reset filters / selectie</target> <target state="translated">Reset filters / selectie</target>
</trans-unit> </trans-unit>
@@ -11048,7 +11048,7 @@
<source>Open first [selected] document</source> <source>Open first [selected] document</source>
<context-group purpose="location"> <context-group purpose="location">
<context context-type="sourcefile">src/app/components/document-list/document-list.component.ts</context> <context context-type="sourcefile">src/app/components/document-list/document-list.component.ts</context>
<context context-type="linenumber">357</context> <context context-type="linenumber">360</context>
</context-group> </context-group>
<target state="translated">Open het eerste [geselecteerde] document</target> <target state="translated">Open het eerste [geselecteerde] document</target>
</trans-unit> </trans-unit>
@@ -11056,7 +11056,7 @@
<source>Previous page</source> <source>Previous page</source>
<context-group purpose="location"> <context-group purpose="location">
<context context-type="sourcefile">src/app/components/document-list/document-list.component.ts</context> <context context-type="sourcefile">src/app/components/document-list/document-list.component.ts</context>
<context context-type="linenumber">373</context> <context context-type="linenumber">376</context>
</context-group> </context-group>
<target state="translated">Vorige pagina</target> <target state="translated">Vorige pagina</target>
</trans-unit> </trans-unit>
@@ -11064,7 +11064,7 @@
<source>Next page</source> <source>Next page</source>
<context-group purpose="location"> <context-group purpose="location">
<context context-type="sourcefile">src/app/components/document-list/document-list.component.ts</context> <context context-type="sourcefile">src/app/components/document-list/document-list.component.ts</context>
<context context-type="linenumber">385</context> <context context-type="linenumber">388</context>
</context-group> </context-group>
<target state="translated">Volgende pagina</target> <target state="translated">Volgende pagina</target>
</trans-unit> </trans-unit>
@@ -11072,7 +11072,7 @@
<source>View &quot;<x id="PH" equiv-text="this.list.activeSavedViewTitle"/>&quot; saved successfully.</source> <source>View &quot;<x id="PH" equiv-text="this.list.activeSavedViewTitle"/>&quot; saved successfully.</source>
<context-group purpose="location"> <context-group purpose="location">
<context context-type="sourcefile">src/app/components/document-list/document-list.component.ts</context> <context context-type="sourcefile">src/app/components/document-list/document-list.component.ts</context>
<context context-type="linenumber">419</context> <context context-type="linenumber">422</context>
</context-group> </context-group>
<target state="final">View "<x id="PH" equiv-text="this.list.activeSavedViewTitle"/>" met succes opgeslagen.</target> <target state="final">View "<x id="PH" equiv-text="this.list.activeSavedViewTitle"/>" met succes opgeslagen.</target>
</trans-unit> </trans-unit>
@@ -11080,7 +11080,7 @@
<source>Failed to save view &quot;<x id="PH" equiv-text="this.list.activeSavedViewTitle"/>&quot;.</source> <source>Failed to save view &quot;<x id="PH" equiv-text="this.list.activeSavedViewTitle"/>&quot;.</source>
<context-group purpose="location"> <context-group purpose="location">
<context context-type="sourcefile">src/app/components/document-list/document-list.component.ts</context> <context context-type="sourcefile">src/app/components/document-list/document-list.component.ts</context>
<context context-type="linenumber">425</context> <context context-type="linenumber">428</context>
</context-group> </context-group>
<target state="translated">Fout bij het opslaan van weergave "<x id="PH" equiv-text="this.list.activeSavedViewTitle"/>".</target> <target state="translated">Fout bij het opslaan van weergave "<x id="PH" equiv-text="this.list.activeSavedViewTitle"/>".</target>
</trans-unit> </trans-unit>
@@ -11088,7 +11088,7 @@
<source>View &quot;<x id="PH" equiv-text="savedView.name"/>&quot; created successfully.</source> <source>View &quot;<x id="PH" equiv-text="savedView.name"/>&quot; created successfully.</source>
<context-group purpose="location"> <context-group purpose="location">
<context context-type="sourcefile">src/app/components/document-list/document-list.component.ts</context> <context context-type="sourcefile">src/app/components/document-list/document-list.component.ts</context>
<context context-type="linenumber">494</context> <context context-type="linenumber">497</context>
</context-group> </context-group>
<target state="final">View "<x id="PH" equiv-text="savedView.name"/>" met succes gemaakt.</target> <target state="final">View "<x id="PH" equiv-text="savedView.name"/>" met succes gemaakt.</target>
</trans-unit> </trans-unit>
@@ -11096,7 +11096,7 @@
<source>View &quot;<x id="PH" equiv-text="savedView.name"/>&quot; created successfully, but could not update visibility settings.</source> <source>View &quot;<x id="PH" equiv-text="savedView.name"/>&quot; created successfully, but could not update visibility settings.</source>
<context-group purpose="location"> <context-group purpose="location">
<context context-type="sourcefile">src/app/components/document-list/document-list.component.ts</context> <context context-type="sourcefile">src/app/components/document-list/document-list.component.ts</context>
<context context-type="linenumber">500</context> <context context-type="linenumber">503</context>
</context-group> </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="needs-translation">View "<x id="PH" equiv-text="savedView.name"/>" created successfully, but could not update visibility settings.</target>
</trans-unit> </trans-unit>
@@ -13297,11 +13297,27 @@
</context-group> </context-group>
<target state="needs-translation">LLM Embedding Model</target> <target state="needs-translation">LLM Embedding Model</target>
</trans-unit> </trans-unit>
<trans-unit id="861068592166833023" datatype="html">
<source>LLM Embedding API Key</source>
<context-group purpose="location">
<context context-type="sourcefile">src/app/data/paperless-config.ts</context>
<context context-type="linenumber">358</context>
</context-group>
<target state="needs-translation">LLM Embedding API Key</target>
</trans-unit>
<trans-unit id="2929108042259892948" datatype="html">
<source>Used for embeddings when set, otherwise LLM API key is used.</source>
<context-group purpose="location">
<context context-type="sourcefile">src/app/data/paperless-config.ts</context>
<context context-type="linenumber">360</context>
</context-group>
<target state="needs-translation">Used for embeddings when set, otherwise LLM API key is used.</target>
</trans-unit>
<trans-unit id="3554114880473286122" datatype="html"> <trans-unit id="3554114880473286122" datatype="html">
<source>LLM Embedding Endpoint</source> <source>LLM Embedding Endpoint</source>
<context-group purpose="location"> <context-group purpose="location">
<context context-type="sourcefile">src/app/data/paperless-config.ts</context> <context context-type="sourcefile">src/app/data/paperless-config.ts</context>
<context context-type="linenumber">358</context> <context context-type="linenumber">366</context>
</context-group> </context-group>
<target state="needs-translation">LLM Embedding Endpoint</target> <target state="needs-translation">LLM Embedding Endpoint</target>
</trans-unit> </trans-unit>
@@ -13309,7 +13325,7 @@
<source>LLM Embedding Chunk Size</source> <source>LLM Embedding Chunk Size</source>
<context-group purpose="location"> <context-group purpose="location">
<context context-type="sourcefile">src/app/data/paperless-config.ts</context> <context context-type="sourcefile">src/app/data/paperless-config.ts</context>
<context context-type="linenumber">365</context> <context context-type="linenumber">373</context>
</context-group> </context-group>
<target state="needs-translation">LLM Embedding Chunk Size</target> <target state="needs-translation">LLM Embedding Chunk Size</target>
</trans-unit> </trans-unit>
@@ -13317,7 +13333,7 @@
<source>LLM Context Size</source> <source>LLM Context Size</source>
<context-group purpose="location"> <context-group purpose="location">
<context context-type="sourcefile">src/app/data/paperless-config.ts</context> <context context-type="sourcefile">src/app/data/paperless-config.ts</context>
<context context-type="linenumber">372</context> <context context-type="linenumber">380</context>
</context-group> </context-group>
<target state="needs-translation">LLM Context Size</target> <target state="needs-translation">LLM Context Size</target>
</trans-unit> </trans-unit>
@@ -13325,7 +13341,7 @@
<source>LLM Backend</source> <source>LLM Backend</source>
<context-group purpose="location"> <context-group purpose="location">
<context context-type="sourcefile">src/app/data/paperless-config.ts</context> <context context-type="sourcefile">src/app/data/paperless-config.ts</context>
<context context-type="linenumber">379</context> <context context-type="linenumber">387</context>
</context-group> </context-group>
<target state="needs-translation">LLM Backend</target> <target state="needs-translation">LLM Backend</target>
</trans-unit> </trans-unit>
@@ -13333,7 +13349,7 @@
<source>LLM Model</source> <source>LLM Model</source>
<context-group purpose="location"> <context-group purpose="location">
<context context-type="sourcefile">src/app/data/paperless-config.ts</context> <context context-type="sourcefile">src/app/data/paperless-config.ts</context>
<context context-type="linenumber">387</context> <context context-type="linenumber">395</context>
</context-group> </context-group>
<target state="needs-translation">LLM Model</target> <target state="needs-translation">LLM Model</target>
</trans-unit> </trans-unit>
@@ -13341,7 +13357,7 @@
<source>LLM API Key</source> <source>LLM API Key</source>
<context-group purpose="location"> <context-group purpose="location">
<context context-type="sourcefile">src/app/data/paperless-config.ts</context> <context context-type="sourcefile">src/app/data/paperless-config.ts</context>
<context context-type="linenumber">394</context> <context context-type="linenumber">402</context>
</context-group> </context-group>
<target state="needs-translation">LLM API Key</target> <target state="needs-translation">LLM API Key</target>
</trans-unit> </trans-unit>
@@ -13349,7 +13365,7 @@
<source>LLM Endpoint</source> <source>LLM Endpoint</source>
<context-group purpose="location"> <context-group purpose="location">
<context context-type="sourcefile">src/app/data/paperless-config.ts</context> <context context-type="sourcefile">src/app/data/paperless-config.ts</context>
<context context-type="linenumber">401</context> <context context-type="linenumber">409</context>
</context-group> </context-group>
<target state="needs-translation">LLM Endpoint</target> <target state="needs-translation">LLM Endpoint</target>
</trans-unit> </trans-unit>
@@ -13357,7 +13373,7 @@
<source>LLM Output Language</source> <source>LLM Output Language</source>
<context-group purpose="location"> <context-group purpose="location">
<context context-type="sourcefile">src/app/data/paperless-config.ts</context> <context context-type="sourcefile">src/app/data/paperless-config.ts</context>
<context context-type="linenumber">408</context> <context context-type="linenumber">416</context>
</context-group> </context-group>
<target state="needs-translation">LLM Output Language</target> <target state="needs-translation">LLM Output Language</target>
</trans-unit> </trans-unit>
@@ -13365,7 +13381,7 @@
<source>Language to use for generated AI suggestions. When unset, AI suggestions use the user&apos;s display language if explicitly set.</source> <source>Language to use for generated AI suggestions. When unset, AI suggestions use the user&apos;s display language if explicitly set.</source>
<context-group purpose="location"> <context-group purpose="location">
<context context-type="sourcefile">src/app/data/paperless-config.ts</context> <context context-type="sourcefile">src/app/data/paperless-config.ts</context>
<context context-type="linenumber">412</context> <context context-type="linenumber">420</context>
</context-group> </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="needs-translation">Language to use for generated AI suggestions. When unset, AI suggestions use the user's display language if explicitly set.</target>
</trans-unit> </trans-unit>
@@ -13373,7 +13389,7 @@
<source>LLM Request Timeout</source> <source>LLM Request Timeout</source>
<context-group purpose="location"> <context-group purpose="location">
<context context-type="sourcefile">src/app/data/paperless-config.ts</context> <context context-type="sourcefile">src/app/data/paperless-config.ts</context>
<context context-type="linenumber">416</context> <context context-type="linenumber">424</context>
</context-group> </context-group>
<target state="needs-translation">LLM Request Timeout</target> <target state="needs-translation">LLM Request Timeout</target>
</trans-unit> </trans-unit>
@@ -13381,7 +13397,7 @@
<source>Timeout in seconds for LLM requests.</source> <source>Timeout in seconds for LLM requests.</source>
<context-group purpose="location"> <context-group purpose="location">
<context context-type="sourcefile">src/app/data/paperless-config.ts</context> <context context-type="sourcefile">src/app/data/paperless-config.ts</context>
<context context-type="linenumber">420</context> <context context-type="linenumber">428</context>
</context-group> </context-group>
<target state="needs-translation">Timeout in seconds for LLM requests.</target> <target state="needs-translation">Timeout in seconds for LLM requests.</target>
</trans-unit> </trans-unit>
+37 -21
View File
@@ -10741,7 +10741,7 @@
</context-group> </context-group>
<context-group purpose="location"> <context-group purpose="location">
<context context-type="sourcefile">src/app/components/document-list/document-list.component.ts</context> <context context-type="sourcefile">src/app/components/document-list/document-list.component.ts</context>
<context context-type="linenumber">348</context> <context context-type="linenumber">351</context>
</context-group> </context-group>
<context-group purpose="location"> <context-group purpose="location">
<context context-type="sourcefile">src/app/components/manage/document-attributes/document-attributes.component.html</context> <context context-type="sourcefile">src/app/components/manage/document-attributes/document-attributes.component.html</context>
@@ -10757,7 +10757,7 @@
</context-group> </context-group>
<context-group purpose="location"> <context-group purpose="location">
<context context-type="sourcefile">src/app/components/document-list/document-list.component.ts</context> <context context-type="sourcefile">src/app/components/document-list/document-list.component.ts</context>
<context context-type="linenumber">341</context> <context context-type="linenumber">344</context>
</context-group> </context-group>
<context-group purpose="location"> <context-group purpose="location">
<context context-type="sourcefile">src/app/components/manage/document-attributes/document-attributes.component.html</context> <context context-type="sourcefile">src/app/components/manage/document-attributes/document-attributes.component.html</context>
@@ -11041,7 +11041,7 @@
<source>Reset filters / selection</source> <source>Reset filters / selection</source>
<context-group purpose="location"> <context-group purpose="location">
<context context-type="sourcefile">src/app/components/document-list/document-list.component.ts</context> <context context-type="sourcefile">src/app/components/document-list/document-list.component.ts</context>
<context context-type="linenumber">329</context> <context context-type="linenumber">332</context>
</context-group> </context-group>
<target state="translated">Tilbakestill filtre / utvalg</target> <target state="translated">Tilbakestill filtre / utvalg</target>
</trans-unit> </trans-unit>
@@ -11049,7 +11049,7 @@
<source>Open first [selected] document</source> <source>Open first [selected] document</source>
<context-group purpose="location"> <context-group purpose="location">
<context context-type="sourcefile">src/app/components/document-list/document-list.component.ts</context> <context context-type="sourcefile">src/app/components/document-list/document-list.component.ts</context>
<context context-type="linenumber">357</context> <context context-type="linenumber">360</context>
</context-group> </context-group>
<target state="translated">Åpne første [selected] dokument</target> <target state="translated">Åpne første [selected] dokument</target>
</trans-unit> </trans-unit>
@@ -11057,7 +11057,7 @@
<source>Previous page</source> <source>Previous page</source>
<context-group purpose="location"> <context-group purpose="location">
<context context-type="sourcefile">src/app/components/document-list/document-list.component.ts</context> <context context-type="sourcefile">src/app/components/document-list/document-list.component.ts</context>
<context context-type="linenumber">373</context> <context context-type="linenumber">376</context>
</context-group> </context-group>
<target state="translated">Forrige side</target> <target state="translated">Forrige side</target>
</trans-unit> </trans-unit>
@@ -11065,7 +11065,7 @@
<source>Next page</source> <source>Next page</source>
<context-group purpose="location"> <context-group purpose="location">
<context context-type="sourcefile">src/app/components/document-list/document-list.component.ts</context> <context context-type="sourcefile">src/app/components/document-list/document-list.component.ts</context>
<context context-type="linenumber">385</context> <context context-type="linenumber">388</context>
</context-group> </context-group>
<target state="translated">Neste side</target> <target state="translated">Neste side</target>
</trans-unit> </trans-unit>
@@ -11073,7 +11073,7 @@
<source>View &quot;<x id="PH" equiv-text="this.list.activeSavedViewTitle"/>&quot; saved successfully.</source> <source>View &quot;<x id="PH" equiv-text="this.list.activeSavedViewTitle"/>&quot; saved successfully.</source>
<context-group purpose="location"> <context-group purpose="location">
<context context-type="sourcefile">src/app/components/document-list/document-list.component.ts</context> <context context-type="sourcefile">src/app/components/document-list/document-list.component.ts</context>
<context context-type="linenumber">419</context> <context context-type="linenumber">422</context>
</context-group> </context-group>
<target state="translated">Visning "<x id="PH" equiv-text="this.list.activeSavedViewTitle"/>" ble lagret.</target> <target state="translated">Visning "<x id="PH" equiv-text="this.list.activeSavedViewTitle"/>" ble lagret.</target>
</trans-unit> </trans-unit>
@@ -11081,7 +11081,7 @@
<source>Failed to save view &quot;<x id="PH" equiv-text="this.list.activeSavedViewTitle"/>&quot;.</source> <source>Failed to save view &quot;<x id="PH" equiv-text="this.list.activeSavedViewTitle"/>&quot;.</source>
<context-group purpose="location"> <context-group purpose="location">
<context context-type="sourcefile">src/app/components/document-list/document-list.component.ts</context> <context context-type="sourcefile">src/app/components/document-list/document-list.component.ts</context>
<context context-type="linenumber">425</context> <context context-type="linenumber">428</context>
</context-group> </context-group>
<target state="translated">Kan ikke lagre visning "<x id="PH" equiv-text="this.list.activeSavedViewTitle"/>".</target> <target state="translated">Kan ikke lagre visning "<x id="PH" equiv-text="this.list.activeSavedViewTitle"/>".</target>
</trans-unit> </trans-unit>
@@ -11089,7 +11089,7 @@
<source>View &quot;<x id="PH" equiv-text="savedView.name"/>&quot; created successfully.</source> <source>View &quot;<x id="PH" equiv-text="savedView.name"/>&quot; created successfully.</source>
<context-group purpose="location"> <context-group purpose="location">
<context context-type="sourcefile">src/app/components/document-list/document-list.component.ts</context> <context context-type="sourcefile">src/app/components/document-list/document-list.component.ts</context>
<context context-type="linenumber">494</context> <context context-type="linenumber">497</context>
</context-group> </context-group>
<target state="translated">Visning "<x id="PH" equiv-text="savedView.name"/>" ble opprettet.</target> <target state="translated">Visning "<x id="PH" equiv-text="savedView.name"/>" ble opprettet.</target>
</trans-unit> </trans-unit>
@@ -11097,7 +11097,7 @@
<source>View &quot;<x id="PH" equiv-text="savedView.name"/>&quot; created successfully, but could not update visibility settings.</source> <source>View &quot;<x id="PH" equiv-text="savedView.name"/>&quot; created successfully, but could not update visibility settings.</source>
<context-group purpose="location"> <context-group purpose="location">
<context context-type="sourcefile">src/app/components/document-list/document-list.component.ts</context> <context context-type="sourcefile">src/app/components/document-list/document-list.component.ts</context>
<context context-type="linenumber">500</context> <context context-type="linenumber">503</context>
</context-group> </context-group>
<target state="translated">Se "<x id="PH" equiv-text="savedView.name"/>" opprettet vellykket, men klarte ikke oppdatere synlighetsinnstillinger.</target> <target state="translated">Se "<x id="PH" equiv-text="savedView.name"/>" opprettet vellykket, men klarte ikke oppdatere synlighetsinnstillinger.</target>
</trans-unit> </trans-unit>
@@ -13298,11 +13298,27 @@
</context-group> </context-group>
<target state="translated">LLM innebygd modell</target> <target state="translated">LLM innebygd modell</target>
</trans-unit> </trans-unit>
<trans-unit id="861068592166833023" datatype="html">
<source>LLM Embedding API Key</source>
<context-group purpose="location">
<context context-type="sourcefile">src/app/data/paperless-config.ts</context>
<context context-type="linenumber">358</context>
</context-group>
<target state="needs-translation">LLM Embedding API Key</target>
</trans-unit>
<trans-unit id="2929108042259892948" datatype="html">
<source>Used for embeddings when set, otherwise LLM API key is used.</source>
<context-group purpose="location">
<context context-type="sourcefile">src/app/data/paperless-config.ts</context>
<context context-type="linenumber">360</context>
</context-group>
<target state="needs-translation">Used for embeddings when set, otherwise LLM API key is used.</target>
</trans-unit>
<trans-unit id="3554114880473286122" datatype="html"> <trans-unit id="3554114880473286122" datatype="html">
<source>LLM Embedding Endpoint</source> <source>LLM Embedding Endpoint</source>
<context-group purpose="location"> <context-group purpose="location">
<context context-type="sourcefile">src/app/data/paperless-config.ts</context> <context context-type="sourcefile">src/app/data/paperless-config.ts</context>
<context context-type="linenumber">358</context> <context context-type="linenumber">366</context>
</context-group> </context-group>
<target state="translated">LLM Innebygd endepunkt</target> <target state="translated">LLM Innebygd endepunkt</target>
</trans-unit> </trans-unit>
@@ -13310,7 +13326,7 @@
<source>LLM Embedding Chunk Size</source> <source>LLM Embedding Chunk Size</source>
<context-group purpose="location"> <context-group purpose="location">
<context context-type="sourcefile">src/app/data/paperless-config.ts</context> <context context-type="sourcefile">src/app/data/paperless-config.ts</context>
<context context-type="linenumber">365</context> <context context-type="linenumber">373</context>
</context-group> </context-group>
<target state="translated">LLM-innebyggingings blokkstørrelse</target> <target state="translated">LLM-innebyggingings blokkstørrelse</target>
</trans-unit> </trans-unit>
@@ -13318,7 +13334,7 @@
<source>LLM Context Size</source> <source>LLM Context Size</source>
<context-group purpose="location"> <context-group purpose="location">
<context context-type="sourcefile">src/app/data/paperless-config.ts</context> <context context-type="sourcefile">src/app/data/paperless-config.ts</context>
<context context-type="linenumber">372</context> <context context-type="linenumber">380</context>
</context-group> </context-group>
<target state="translated">LLM-kontekststørrelse</target> <target state="translated">LLM-kontekststørrelse</target>
</trans-unit> </trans-unit>
@@ -13326,7 +13342,7 @@
<source>LLM Backend</source> <source>LLM Backend</source>
<context-group purpose="location"> <context-group purpose="location">
<context context-type="sourcefile">src/app/data/paperless-config.ts</context> <context context-type="sourcefile">src/app/data/paperless-config.ts</context>
<context context-type="linenumber">379</context> <context context-type="linenumber">387</context>
</context-group> </context-group>
<target state="translated">LLM-motor</target> <target state="translated">LLM-motor</target>
</trans-unit> </trans-unit>
@@ -13334,7 +13350,7 @@
<source>LLM Model</source> <source>LLM Model</source>
<context-group purpose="location"> <context-group purpose="location">
<context context-type="sourcefile">src/app/data/paperless-config.ts</context> <context context-type="sourcefile">src/app/data/paperless-config.ts</context>
<context context-type="linenumber">387</context> <context context-type="linenumber">395</context>
</context-group> </context-group>
<target state="translated">LLM modell</target> <target state="translated">LLM modell</target>
</trans-unit> </trans-unit>
@@ -13342,7 +13358,7 @@
<source>LLM API Key</source> <source>LLM API Key</source>
<context-group purpose="location"> <context-group purpose="location">
<context context-type="sourcefile">src/app/data/paperless-config.ts</context> <context context-type="sourcefile">src/app/data/paperless-config.ts</context>
<context context-type="linenumber">394</context> <context context-type="linenumber">402</context>
</context-group> </context-group>
<target state="translated">LLM API-nøkkel</target> <target state="translated">LLM API-nøkkel</target>
</trans-unit> </trans-unit>
@@ -13350,7 +13366,7 @@
<source>LLM Endpoint</source> <source>LLM Endpoint</source>
<context-group purpose="location"> <context-group purpose="location">
<context context-type="sourcefile">src/app/data/paperless-config.ts</context> <context context-type="sourcefile">src/app/data/paperless-config.ts</context>
<context context-type="linenumber">401</context> <context context-type="linenumber">409</context>
</context-group> </context-group>
<target state="translated">LLM endepunkt</target> <target state="translated">LLM endepunkt</target>
</trans-unit> </trans-unit>
@@ -13358,7 +13374,7 @@
<source>LLM Output Language</source> <source>LLM Output Language</source>
<context-group purpose="location"> <context-group purpose="location">
<context context-type="sourcefile">src/app/data/paperless-config.ts</context> <context context-type="sourcefile">src/app/data/paperless-config.ts</context>
<context context-type="linenumber">408</context> <context context-type="linenumber">416</context>
</context-group> </context-group>
<target state="translated">LLM-utdataspråk</target> <target state="translated">LLM-utdataspråk</target>
</trans-unit> </trans-unit>
@@ -13366,7 +13382,7 @@
<source>Language to use for generated AI suggestions. When unset, AI suggestions use the user&apos;s display language if explicitly set.</source> <source>Language to use for generated AI suggestions. When unset, AI suggestions use the user&apos;s display language if explicitly set.</source>
<context-group purpose="location"> <context-group purpose="location">
<context context-type="sourcefile">src/app/data/paperless-config.ts</context> <context context-type="sourcefile">src/app/data/paperless-config.ts</context>
<context context-type="linenumber">412</context> <context context-type="linenumber">420</context>
</context-group> </context-group>
<target state="translated">Språk som skal brukes for genererte KI forslag. Når upasset, bruker KI forslag brukerens visningsspråk dersom det er angitt eksplisitt.</target> <target state="translated">Språk som skal brukes for genererte KI forslag. Når upasset, bruker KI forslag brukerens visningsspråk dersom det er angitt eksplisitt.</target>
</trans-unit> </trans-unit>
@@ -13374,7 +13390,7 @@
<source>LLM Request Timeout</source> <source>LLM Request Timeout</source>
<context-group purpose="location"> <context-group purpose="location">
<context context-type="sourcefile">src/app/data/paperless-config.ts</context> <context context-type="sourcefile">src/app/data/paperless-config.ts</context>
<context context-type="linenumber">416</context> <context context-type="linenumber">424</context>
</context-group> </context-group>
<target state="translated">Tidsavbrudd for LTM-forespørsel</target> <target state="translated">Tidsavbrudd for LTM-forespørsel</target>
</trans-unit> </trans-unit>
@@ -13382,7 +13398,7 @@
<source>Timeout in seconds for LLM requests.</source> <source>Timeout in seconds for LLM requests.</source>
<context-group purpose="location"> <context-group purpose="location">
<context context-type="sourcefile">src/app/data/paperless-config.ts</context> <context context-type="sourcefile">src/app/data/paperless-config.ts</context>
<context context-type="linenumber">420</context> <context context-type="linenumber">428</context>
</context-group> </context-group>
<target state="translated">Tidsavbrudd i sekunder for LSM-forespørsler.</target> <target state="translated">Tidsavbrudd i sekunder for LSM-forespørsler.</target>
</trans-unit> </trans-unit>
+37 -21
View File
@@ -10740,7 +10740,7 @@
</context-group> </context-group>
<context-group purpose="location"> <context-group purpose="location">
<context context-type="sourcefile">src/app/components/document-list/document-list.component.ts</context> <context context-type="sourcefile">src/app/components/document-list/document-list.component.ts</context>
<context context-type="linenumber">348</context> <context context-type="linenumber">351</context>
</context-group> </context-group>
<context-group purpose="location"> <context-group purpose="location">
<context context-type="sourcefile">src/app/components/manage/document-attributes/document-attributes.component.html</context> <context context-type="sourcefile">src/app/components/manage/document-attributes/document-attributes.component.html</context>
@@ -10756,7 +10756,7 @@
</context-group> </context-group>
<context-group purpose="location"> <context-group purpose="location">
<context context-type="sourcefile">src/app/components/document-list/document-list.component.ts</context> <context context-type="sourcefile">src/app/components/document-list/document-list.component.ts</context>
<context context-type="linenumber">341</context> <context context-type="linenumber">344</context>
</context-group> </context-group>
<context-group purpose="location"> <context-group purpose="location">
<context context-type="sourcefile">src/app/components/manage/document-attributes/document-attributes.component.html</context> <context context-type="sourcefile">src/app/components/manage/document-attributes/document-attributes.component.html</context>
@@ -11040,7 +11040,7 @@
<source>Reset filters / selection</source> <source>Reset filters / selection</source>
<context-group purpose="location"> <context-group purpose="location">
<context context-type="sourcefile">src/app/components/document-list/document-list.component.ts</context> <context context-type="sourcefile">src/app/components/document-list/document-list.component.ts</context>
<context context-type="linenumber">329</context> <context context-type="linenumber">332</context>
</context-group> </context-group>
<target state="translated">Resetowanie filtrów/wyboru</target> <target state="translated">Resetowanie filtrów/wyboru</target>
</trans-unit> </trans-unit>
@@ -11048,7 +11048,7 @@
<source>Open first [selected] document</source> <source>Open first [selected] document</source>
<context-group purpose="location"> <context-group purpose="location">
<context context-type="sourcefile">src/app/components/document-list/document-list.component.ts</context> <context context-type="sourcefile">src/app/components/document-list/document-list.component.ts</context>
<context context-type="linenumber">357</context> <context context-type="linenumber">360</context>
</context-group> </context-group>
<target state="translated">Otwórz pierwszy [wybrany] dokument</target> <target state="translated">Otwórz pierwszy [wybrany] dokument</target>
</trans-unit> </trans-unit>
@@ -11056,7 +11056,7 @@
<source>Previous page</source> <source>Previous page</source>
<context-group purpose="location"> <context-group purpose="location">
<context context-type="sourcefile">src/app/components/document-list/document-list.component.ts</context> <context context-type="sourcefile">src/app/components/document-list/document-list.component.ts</context>
<context context-type="linenumber">373</context> <context context-type="linenumber">376</context>
</context-group> </context-group>
<target state="translated">Poprzednia strona</target> <target state="translated">Poprzednia strona</target>
</trans-unit> </trans-unit>
@@ -11064,7 +11064,7 @@
<source>Next page</source> <source>Next page</source>
<context-group purpose="location"> <context-group purpose="location">
<context context-type="sourcefile">src/app/components/document-list/document-list.component.ts</context> <context context-type="sourcefile">src/app/components/document-list/document-list.component.ts</context>
<context context-type="linenumber">385</context> <context context-type="linenumber">388</context>
</context-group> </context-group>
<target state="translated">Następna strona</target> <target state="translated">Następna strona</target>
</trans-unit> </trans-unit>
@@ -11072,7 +11072,7 @@
<source>View &quot;<x id="PH" equiv-text="this.list.activeSavedViewTitle"/>&quot; saved successfully.</source> <source>View &quot;<x id="PH" equiv-text="this.list.activeSavedViewTitle"/>&quot; saved successfully.</source>
<context-group purpose="location"> <context-group purpose="location">
<context context-type="sourcefile">src/app/components/document-list/document-list.component.ts</context> <context context-type="sourcefile">src/app/components/document-list/document-list.component.ts</context>
<context context-type="linenumber">419</context> <context context-type="linenumber">422</context>
</context-group> </context-group>
<target state="final">Widok "<x id="PH" equiv-text="this.list.activeSavedViewTitle"/>" został zapisany.</target> <target state="final">Widok "<x id="PH" equiv-text="this.list.activeSavedViewTitle"/>" został zapisany.</target>
</trans-unit> </trans-unit>
@@ -11080,7 +11080,7 @@
<source>Failed to save view &quot;<x id="PH" equiv-text="this.list.activeSavedViewTitle"/>&quot;.</source> <source>Failed to save view &quot;<x id="PH" equiv-text="this.list.activeSavedViewTitle"/>&quot;.</source>
<context-group purpose="location"> <context-group purpose="location">
<context context-type="sourcefile">src/app/components/document-list/document-list.component.ts</context> <context context-type="sourcefile">src/app/components/document-list/document-list.component.ts</context>
<context context-type="linenumber">425</context> <context context-type="linenumber">428</context>
</context-group> </context-group>
<target state="translated">Nie udało się zapisać widoku "<x id="PH" equiv-text="this.list.activeSavedViewTitle"/>".</target> <target state="translated">Nie udało się zapisać widoku "<x id="PH" equiv-text="this.list.activeSavedViewTitle"/>".</target>
</trans-unit> </trans-unit>
@@ -11088,7 +11088,7 @@
<source>View &quot;<x id="PH" equiv-text="savedView.name"/>&quot; created successfully.</source> <source>View &quot;<x id="PH" equiv-text="savedView.name"/>&quot; created successfully.</source>
<context-group purpose="location"> <context-group purpose="location">
<context context-type="sourcefile">src/app/components/document-list/document-list.component.ts</context> <context context-type="sourcefile">src/app/components/document-list/document-list.component.ts</context>
<context context-type="linenumber">494</context> <context context-type="linenumber">497</context>
</context-group> </context-group>
<target state="final">Widok "<x id="PH" equiv-text="savedView.name"/>" został utworzony pomyślnie.</target> <target state="final">Widok "<x id="PH" equiv-text="savedView.name"/>" został utworzony pomyślnie.</target>
</trans-unit> </trans-unit>
@@ -11096,7 +11096,7 @@
<source>View &quot;<x id="PH" equiv-text="savedView.name"/>&quot; created successfully, but could not update visibility settings.</source> <source>View &quot;<x id="PH" equiv-text="savedView.name"/>&quot; created successfully, but could not update visibility settings.</source>
<context-group purpose="location"> <context-group purpose="location">
<context context-type="sourcefile">src/app/components/document-list/document-list.component.ts</context> <context context-type="sourcefile">src/app/components/document-list/document-list.component.ts</context>
<context context-type="linenumber">500</context> <context context-type="linenumber">503</context>
</context-group> </context-group>
<target state="translated">Widok "<x id="PH" equiv-text="savedView.name"/>" utworzono pomyślnie, ale nie można zaktualizować ustawień widoczności.</target> <target state="translated">Widok "<x id="PH" equiv-text="savedView.name"/>" utworzono pomyślnie, ale nie można zaktualizować ustawień widoczności.</target>
</trans-unit> </trans-unit>
@@ -13297,11 +13297,27 @@
</context-group> </context-group>
<target state="translated">Model do analizy treści dokumentów</target> <target state="translated">Model do analizy treści dokumentów</target>
</trans-unit> </trans-unit>
<trans-unit id="861068592166833023" datatype="html">
<source>LLM Embedding API Key</source>
<context-group purpose="location">
<context context-type="sourcefile">src/app/data/paperless-config.ts</context>
<context context-type="linenumber">358</context>
</context-group>
<target state="needs-translation">LLM Embedding API Key</target>
</trans-unit>
<trans-unit id="2929108042259892948" datatype="html">
<source>Used for embeddings when set, otherwise LLM API key is used.</source>
<context-group purpose="location">
<context context-type="sourcefile">src/app/data/paperless-config.ts</context>
<context context-type="linenumber">360</context>
</context-group>
<target state="needs-translation">Used for embeddings when set, otherwise LLM API key is used.</target>
</trans-unit>
<trans-unit id="3554114880473286122" datatype="html"> <trans-unit id="3554114880473286122" datatype="html">
<source>LLM Embedding Endpoint</source> <source>LLM Embedding Endpoint</source>
<context-group purpose="location"> <context-group purpose="location">
<context context-type="sourcefile">src/app/data/paperless-config.ts</context> <context context-type="sourcefile">src/app/data/paperless-config.ts</context>
<context context-type="linenumber">358</context> <context context-type="linenumber">366</context>
</context-group> </context-group>
<target state="needs-translation">LLM Embedding Endpoint</target> <target state="needs-translation">LLM Embedding Endpoint</target>
</trans-unit> </trans-unit>
@@ -13309,7 +13325,7 @@
<source>LLM Embedding Chunk Size</source> <source>LLM Embedding Chunk Size</source>
<context-group purpose="location"> <context-group purpose="location">
<context context-type="sourcefile">src/app/data/paperless-config.ts</context> <context context-type="sourcefile">src/app/data/paperless-config.ts</context>
<context context-type="linenumber">365</context> <context context-type="linenumber">373</context>
</context-group> </context-group>
<target state="needs-translation">LLM Embedding Chunk Size</target> <target state="needs-translation">LLM Embedding Chunk Size</target>
</trans-unit> </trans-unit>
@@ -13317,7 +13333,7 @@
<source>LLM Context Size</source> <source>LLM Context Size</source>
<context-group purpose="location"> <context-group purpose="location">
<context context-type="sourcefile">src/app/data/paperless-config.ts</context> <context context-type="sourcefile">src/app/data/paperless-config.ts</context>
<context context-type="linenumber">372</context> <context context-type="linenumber">380</context>
</context-group> </context-group>
<target state="needs-translation">LLM Context Size</target> <target state="needs-translation">LLM Context Size</target>
</trans-unit> </trans-unit>
@@ -13325,7 +13341,7 @@
<source>LLM Backend</source> <source>LLM Backend</source>
<context-group purpose="location"> <context-group purpose="location">
<context context-type="sourcefile">src/app/data/paperless-config.ts</context> <context context-type="sourcefile">src/app/data/paperless-config.ts</context>
<context context-type="linenumber">379</context> <context context-type="linenumber">387</context>
</context-group> </context-group>
<target state="translated">Usługa sztucznej inteligencji</target> <target state="translated">Usługa sztucznej inteligencji</target>
</trans-unit> </trans-unit>
@@ -13333,7 +13349,7 @@
<source>LLM Model</source> <source>LLM Model</source>
<context-group purpose="location"> <context-group purpose="location">
<context context-type="sourcefile">src/app/data/paperless-config.ts</context> <context context-type="sourcefile">src/app/data/paperless-config.ts</context>
<context context-type="linenumber">387</context> <context context-type="linenumber">395</context>
</context-group> </context-group>
<target state="translated">Model sztucznej inteligencji</target> <target state="translated">Model sztucznej inteligencji</target>
</trans-unit> </trans-unit>
@@ -13341,7 +13357,7 @@
<source>LLM API Key</source> <source>LLM API Key</source>
<context-group purpose="location"> <context-group purpose="location">
<context context-type="sourcefile">src/app/data/paperless-config.ts</context> <context context-type="sourcefile">src/app/data/paperless-config.ts</context>
<context context-type="linenumber">394</context> <context context-type="linenumber">402</context>
</context-group> </context-group>
<target state="translated">Klucz dostępu do usługi AI</target> <target state="translated">Klucz dostępu do usługi AI</target>
</trans-unit> </trans-unit>
@@ -13349,7 +13365,7 @@
<source>LLM Endpoint</source> <source>LLM Endpoint</source>
<context-group purpose="location"> <context-group purpose="location">
<context context-type="sourcefile">src/app/data/paperless-config.ts</context> <context context-type="sourcefile">src/app/data/paperless-config.ts</context>
<context context-type="linenumber">401</context> <context context-type="linenumber">409</context>
</context-group> </context-group>
<target state="translated">Adres usługi AI</target> <target state="translated">Adres usługi AI</target>
</trans-unit> </trans-unit>
@@ -13357,7 +13373,7 @@
<source>LLM Output Language</source> <source>LLM Output Language</source>
<context-group purpose="location"> <context-group purpose="location">
<context context-type="sourcefile">src/app/data/paperless-config.ts</context> <context context-type="sourcefile">src/app/data/paperless-config.ts</context>
<context context-type="linenumber">408</context> <context context-type="linenumber">416</context>
</context-group> </context-group>
<target state="needs-translation">LLM Output Language</target> <target state="needs-translation">LLM Output Language</target>
</trans-unit> </trans-unit>
@@ -13365,7 +13381,7 @@
<source>Language to use for generated AI suggestions. When unset, AI suggestions use the user&apos;s display language if explicitly set.</source> <source>Language to use for generated AI suggestions. When unset, AI suggestions use the user&apos;s display language if explicitly set.</source>
<context-group purpose="location"> <context-group purpose="location">
<context context-type="sourcefile">src/app/data/paperless-config.ts</context> <context context-type="sourcefile">src/app/data/paperless-config.ts</context>
<context context-type="linenumber">412</context> <context context-type="linenumber">420</context>
</context-group> </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="needs-translation">Language to use for generated AI suggestions. When unset, AI suggestions use the user's display language if explicitly set.</target>
</trans-unit> </trans-unit>
@@ -13373,7 +13389,7 @@
<source>LLM Request Timeout</source> <source>LLM Request Timeout</source>
<context-group purpose="location"> <context-group purpose="location">
<context context-type="sourcefile">src/app/data/paperless-config.ts</context> <context context-type="sourcefile">src/app/data/paperless-config.ts</context>
<context context-type="linenumber">416</context> <context context-type="linenumber">424</context>
</context-group> </context-group>
<target state="needs-translation">LLM Request Timeout</target> <target state="needs-translation">LLM Request Timeout</target>
</trans-unit> </trans-unit>
@@ -13381,7 +13397,7 @@
<source>Timeout in seconds for LLM requests.</source> <source>Timeout in seconds for LLM requests.</source>
<context-group purpose="location"> <context-group purpose="location">
<context context-type="sourcefile">src/app/data/paperless-config.ts</context> <context context-type="sourcefile">src/app/data/paperless-config.ts</context>
<context context-type="linenumber">420</context> <context context-type="linenumber">428</context>
</context-group> </context-group>
<target state="needs-translation">Timeout in seconds for LLM requests.</target> <target state="needs-translation">Timeout in seconds for LLM requests.</target>
</trans-unit> </trans-unit>
+37 -21
View File
@@ -10742,7 +10742,7 @@ Erro ao enviar documentos por e-mail</target>
</context-group> </context-group>
<context-group purpose="location"> <context-group purpose="location">
<context context-type="sourcefile">src/app/components/document-list/document-list.component.ts</context> <context context-type="sourcefile">src/app/components/document-list/document-list.component.ts</context>
<context context-type="linenumber">348</context> <context context-type="linenumber">351</context>
</context-group> </context-group>
<context-group purpose="location"> <context-group purpose="location">
<context context-type="sourcefile">src/app/components/manage/document-attributes/document-attributes.component.html</context> <context context-type="sourcefile">src/app/components/manage/document-attributes/document-attributes.component.html</context>
@@ -10758,7 +10758,7 @@ Erro ao enviar documentos por e-mail</target>
</context-group> </context-group>
<context-group purpose="location"> <context-group purpose="location">
<context context-type="sourcefile">src/app/components/document-list/document-list.component.ts</context> <context context-type="sourcefile">src/app/components/document-list/document-list.component.ts</context>
<context context-type="linenumber">341</context> <context context-type="linenumber">344</context>
</context-group> </context-group>
<context-group purpose="location"> <context-group purpose="location">
<context context-type="sourcefile">src/app/components/manage/document-attributes/document-attributes.component.html</context> <context context-type="sourcefile">src/app/components/manage/document-attributes/document-attributes.component.html</context>
@@ -11042,7 +11042,7 @@ Erro ao enviar documentos por e-mail</target>
<source>Reset filters / selection</source> <source>Reset filters / selection</source>
<context-group purpose="location"> <context-group purpose="location">
<context context-type="sourcefile">src/app/components/document-list/document-list.component.ts</context> <context context-type="sourcefile">src/app/components/document-list/document-list.component.ts</context>
<context context-type="linenumber">329</context> <context context-type="linenumber">332</context>
</context-group> </context-group>
<target state="translated">Redefinir filtros / seleção</target> <target state="translated">Redefinir filtros / seleção</target>
</trans-unit> </trans-unit>
@@ -11050,7 +11050,7 @@ Erro ao enviar documentos por e-mail</target>
<source>Open first [selected] document</source> <source>Open first [selected] document</source>
<context-group purpose="location"> <context-group purpose="location">
<context context-type="sourcefile">src/app/components/document-list/document-list.component.ts</context> <context context-type="sourcefile">src/app/components/document-list/document-list.component.ts</context>
<context context-type="linenumber">357</context> <context context-type="linenumber">360</context>
</context-group> </context-group>
<target state="translated">Abrir o primeiro documento [selected]</target> <target state="translated">Abrir o primeiro documento [selected]</target>
</trans-unit> </trans-unit>
@@ -11058,7 +11058,7 @@ Erro ao enviar documentos por e-mail</target>
<source>Previous page</source> <source>Previous page</source>
<context-group purpose="location"> <context-group purpose="location">
<context context-type="sourcefile">src/app/components/document-list/document-list.component.ts</context> <context context-type="sourcefile">src/app/components/document-list/document-list.component.ts</context>
<context context-type="linenumber">373</context> <context context-type="linenumber">376</context>
</context-group> </context-group>
<target state="translated">Página anterior</target> <target state="translated">Página anterior</target>
</trans-unit> </trans-unit>
@@ -11066,7 +11066,7 @@ Erro ao enviar documentos por e-mail</target>
<source>Next page</source> <source>Next page</source>
<context-group purpose="location"> <context-group purpose="location">
<context context-type="sourcefile">src/app/components/document-list/document-list.component.ts</context> <context context-type="sourcefile">src/app/components/document-list/document-list.component.ts</context>
<context context-type="linenumber">385</context> <context context-type="linenumber">388</context>
</context-group> </context-group>
<target state="translated">Próxima página</target> <target state="translated">Próxima página</target>
</trans-unit> </trans-unit>
@@ -11074,7 +11074,7 @@ Erro ao enviar documentos por e-mail</target>
<source>View &quot;<x id="PH" equiv-text="this.list.activeSavedViewTitle"/>&quot; saved successfully.</source> <source>View &quot;<x id="PH" equiv-text="this.list.activeSavedViewTitle"/>&quot; saved successfully.</source>
<context-group purpose="location"> <context-group purpose="location">
<context context-type="sourcefile">src/app/components/document-list/document-list.component.ts</context> <context context-type="sourcefile">src/app/components/document-list/document-list.component.ts</context>
<context context-type="linenumber">419</context> <context context-type="linenumber">422</context>
</context-group> </context-group>
<target state="final">Visualização "<x id="PH" equiv-text="this.list.activeSavedViewTitle"/>" salva com sucesso.</target> <target state="final">Visualização "<x id="PH" equiv-text="this.list.activeSavedViewTitle"/>" salva com sucesso.</target>
</trans-unit> </trans-unit>
@@ -11082,7 +11082,7 @@ Erro ao enviar documentos por e-mail</target>
<source>Failed to save view &quot;<x id="PH" equiv-text="this.list.activeSavedViewTitle"/>&quot;.</source> <source>Failed to save view &quot;<x id="PH" equiv-text="this.list.activeSavedViewTitle"/>&quot;.</source>
<context-group purpose="location"> <context-group purpose="location">
<context context-type="sourcefile">src/app/components/document-list/document-list.component.ts</context> <context context-type="sourcefile">src/app/components/document-list/document-list.component.ts</context>
<context context-type="linenumber">425</context> <context context-type="linenumber">428</context>
</context-group> </context-group>
<target state="translated">Falha ao salvar a view "<x id="PH" equiv-text="this.list.activeSavedViewTitle"/>".</target> <target state="translated">Falha ao salvar a view "<x id="PH" equiv-text="this.list.activeSavedViewTitle"/>".</target>
</trans-unit> </trans-unit>
@@ -11090,7 +11090,7 @@ Erro ao enviar documentos por e-mail</target>
<source>View &quot;<x id="PH" equiv-text="savedView.name"/>&quot; created successfully.</source> <source>View &quot;<x id="PH" equiv-text="savedView.name"/>&quot; created successfully.</source>
<context-group purpose="location"> <context-group purpose="location">
<context context-type="sourcefile">src/app/components/document-list/document-list.component.ts</context> <context context-type="sourcefile">src/app/components/document-list/document-list.component.ts</context>
<context context-type="linenumber">494</context> <context context-type="linenumber">497</context>
</context-group> </context-group>
<target state="final">Visualização "<x id="PH" equiv-text="savedView.name"/>" criada com sucesso.</target> <target state="final">Visualização "<x id="PH" equiv-text="savedView.name"/>" criada com sucesso.</target>
</trans-unit> </trans-unit>
@@ -11098,7 +11098,7 @@ Erro ao enviar documentos por e-mail</target>
<source>View &quot;<x id="PH" equiv-text="savedView.name"/>&quot; created successfully, but could not update visibility settings.</source> <source>View &quot;<x id="PH" equiv-text="savedView.name"/>&quot; created successfully, but could not update visibility settings.</source>
<context-group purpose="location"> <context-group purpose="location">
<context context-type="sourcefile">src/app/components/document-list/document-list.component.ts</context> <context context-type="sourcefile">src/app/components/document-list/document-list.component.ts</context>
<context context-type="linenumber">500</context> <context context-type="linenumber">503</context>
</context-group> </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="needs-translation">View "<x id="PH" equiv-text="savedView.name"/>" created successfully, but could not update visibility settings.</target>
</trans-unit> </trans-unit>
@@ -13299,11 +13299,27 @@ Erro ao enviar documentos por e-mail</target>
</context-group> </context-group>
<target state="translated">Modelo de embedding do LLM</target> <target state="translated">Modelo de embedding do LLM</target>
</trans-unit> </trans-unit>
<trans-unit id="861068592166833023" datatype="html">
<source>LLM Embedding API Key</source>
<context-group purpose="location">
<context context-type="sourcefile">src/app/data/paperless-config.ts</context>
<context context-type="linenumber">358</context>
</context-group>
<target state="needs-translation">LLM Embedding API Key</target>
</trans-unit>
<trans-unit id="2929108042259892948" datatype="html">
<source>Used for embeddings when set, otherwise LLM API key is used.</source>
<context-group purpose="location">
<context context-type="sourcefile">src/app/data/paperless-config.ts</context>
<context context-type="linenumber">360</context>
</context-group>
<target state="needs-translation">Used for embeddings when set, otherwise LLM API key is used.</target>
</trans-unit>
<trans-unit id="3554114880473286122" datatype="html"> <trans-unit id="3554114880473286122" datatype="html">
<source>LLM Embedding Endpoint</source> <source>LLM Embedding Endpoint</source>
<context-group purpose="location"> <context-group purpose="location">
<context context-type="sourcefile">src/app/data/paperless-config.ts</context> <context context-type="sourcefile">src/app/data/paperless-config.ts</context>
<context context-type="linenumber">358</context> <context context-type="linenumber">366</context>
</context-group> </context-group>
<target state="translated">Endpoint de embedding do LLM</target> <target state="translated">Endpoint de embedding do LLM</target>
</trans-unit> </trans-unit>
@@ -13311,7 +13327,7 @@ Erro ao enviar documentos por e-mail</target>
<source>LLM Embedding Chunk Size</source> <source>LLM Embedding Chunk Size</source>
<context-group purpose="location"> <context-group purpose="location">
<context context-type="sourcefile">src/app/data/paperless-config.ts</context> <context context-type="sourcefile">src/app/data/paperless-config.ts</context>
<context context-type="linenumber">365</context> <context context-type="linenumber">373</context>
</context-group> </context-group>
<target state="translated">Tamanho do Chunk de embedding do LLM</target> <target state="translated">Tamanho do Chunk de embedding do LLM</target>
</trans-unit> </trans-unit>
@@ -13319,7 +13335,7 @@ Erro ao enviar documentos por e-mail</target>
<source>LLM Context Size</source> <source>LLM Context Size</source>
<context-group purpose="location"> <context-group purpose="location">
<context context-type="sourcefile">src/app/data/paperless-config.ts</context> <context context-type="sourcefile">src/app/data/paperless-config.ts</context>
<context context-type="linenumber">372</context> <context context-type="linenumber">380</context>
</context-group> </context-group>
<target state="translated">Tamanho do Contexto do LLM</target> <target state="translated">Tamanho do Contexto do LLM</target>
</trans-unit> </trans-unit>
@@ -13327,7 +13343,7 @@ Erro ao enviar documentos por e-mail</target>
<source>LLM Backend</source> <source>LLM Backend</source>
<context-group purpose="location"> <context-group purpose="location">
<context context-type="sourcefile">src/app/data/paperless-config.ts</context> <context context-type="sourcefile">src/app/data/paperless-config.ts</context>
<context context-type="linenumber">379</context> <context context-type="linenumber">387</context>
</context-group> </context-group>
<target state="translated">Backend do LLM</target> <target state="translated">Backend do LLM</target>
</trans-unit> </trans-unit>
@@ -13335,7 +13351,7 @@ Erro ao enviar documentos por e-mail</target>
<source>LLM Model</source> <source>LLM Model</source>
<context-group purpose="location"> <context-group purpose="location">
<context context-type="sourcefile">src/app/data/paperless-config.ts</context> <context context-type="sourcefile">src/app/data/paperless-config.ts</context>
<context context-type="linenumber">387</context> <context context-type="linenumber">395</context>
</context-group> </context-group>
<target state="translated">Modelo do LLM</target> <target state="translated">Modelo do LLM</target>
</trans-unit> </trans-unit>
@@ -13343,7 +13359,7 @@ Erro ao enviar documentos por e-mail</target>
<source>LLM API Key</source> <source>LLM API Key</source>
<context-group purpose="location"> <context-group purpose="location">
<context context-type="sourcefile">src/app/data/paperless-config.ts</context> <context context-type="sourcefile">src/app/data/paperless-config.ts</context>
<context context-type="linenumber">394</context> <context context-type="linenumber">402</context>
</context-group> </context-group>
<target state="translated">API Key do LLM</target> <target state="translated">API Key do LLM</target>
</trans-unit> </trans-unit>
@@ -13351,7 +13367,7 @@ Erro ao enviar documentos por e-mail</target>
<source>LLM Endpoint</source> <source>LLM Endpoint</source>
<context-group purpose="location"> <context-group purpose="location">
<context context-type="sourcefile">src/app/data/paperless-config.ts</context> <context context-type="sourcefile">src/app/data/paperless-config.ts</context>
<context context-type="linenumber">401</context> <context context-type="linenumber">409</context>
</context-group> </context-group>
<target state="translated">Endpoint do LLM</target> <target state="translated">Endpoint do LLM</target>
</trans-unit> </trans-unit>
@@ -13359,7 +13375,7 @@ Erro ao enviar documentos por e-mail</target>
<source>LLM Output Language</source> <source>LLM Output Language</source>
<context-group purpose="location"> <context-group purpose="location">
<context context-type="sourcefile">src/app/data/paperless-config.ts</context> <context context-type="sourcefile">src/app/data/paperless-config.ts</context>
<context context-type="linenumber">408</context> <context context-type="linenumber">416</context>
</context-group> </context-group>
<target state="translated">Idioma de Saída do LLM</target> <target state="translated">Idioma de Saída do LLM</target>
</trans-unit> </trans-unit>
@@ -13367,7 +13383,7 @@ Erro ao enviar documentos por e-mail</target>
<source>Language to use for generated AI suggestions. When unset, AI suggestions use the user&apos;s display language if explicitly set.</source> <source>Language to use for generated AI suggestions. When unset, AI suggestions use the user&apos;s display language if explicitly set.</source>
<context-group purpose="location"> <context-group purpose="location">
<context context-type="sourcefile">src/app/data/paperless-config.ts</context> <context context-type="sourcefile">src/app/data/paperless-config.ts</context>
<context context-type="linenumber">412</context> <context context-type="linenumber">420</context>
</context-group> </context-group>
<target state="translated">Idioma a ser usado para sugestões geradas por IA. Quando não definido, as sugestões de IA usam o idioma de exibição do usuário, se definido explicitamente.</target> <target state="translated">Idioma a ser usado para sugestões geradas por IA. Quando não definido, as sugestões de IA usam o idioma de exibição do usuário, se definido explicitamente.</target>
</trans-unit> </trans-unit>
@@ -13375,7 +13391,7 @@ Erro ao enviar documentos por e-mail</target>
<source>LLM Request Timeout</source> <source>LLM Request Timeout</source>
<context-group purpose="location"> <context-group purpose="location">
<context context-type="sourcefile">src/app/data/paperless-config.ts</context> <context context-type="sourcefile">src/app/data/paperless-config.ts</context>
<context context-type="linenumber">416</context> <context context-type="linenumber">424</context>
</context-group> </context-group>
<target state="translated">Tempo limite da requisição LLM</target> <target state="translated">Tempo limite da requisição LLM</target>
</trans-unit> </trans-unit>
@@ -13383,7 +13399,7 @@ Erro ao enviar documentos por e-mail</target>
<source>Timeout in seconds for LLM requests.</source> <source>Timeout in seconds for LLM requests.</source>
<context-group purpose="location"> <context-group purpose="location">
<context context-type="sourcefile">src/app/data/paperless-config.ts</context> <context context-type="sourcefile">src/app/data/paperless-config.ts</context>
<context context-type="linenumber">420</context> <context context-type="linenumber">428</context>
</context-group> </context-group>
<target state="translated">Tempo limite em segundos para requisições LLM.</target> <target state="translated">Tempo limite em segundos para requisições LLM.</target>
</trans-unit> </trans-unit>
+37 -21
View File
@@ -10741,7 +10741,7 @@
</context-group> </context-group>
<context-group purpose="location"> <context-group purpose="location">
<context context-type="sourcefile">src/app/components/document-list/document-list.component.ts</context> <context context-type="sourcefile">src/app/components/document-list/document-list.component.ts</context>
<context context-type="linenumber">348</context> <context context-type="linenumber">351</context>
</context-group> </context-group>
<context-group purpose="location"> <context-group purpose="location">
<context context-type="sourcefile">src/app/components/manage/document-attributes/document-attributes.component.html</context> <context context-type="sourcefile">src/app/components/manage/document-attributes/document-attributes.component.html</context>
@@ -10757,7 +10757,7 @@
</context-group> </context-group>
<context-group purpose="location"> <context-group purpose="location">
<context context-type="sourcefile">src/app/components/document-list/document-list.component.ts</context> <context context-type="sourcefile">src/app/components/document-list/document-list.component.ts</context>
<context context-type="linenumber">341</context> <context context-type="linenumber">344</context>
</context-group> </context-group>
<context-group purpose="location"> <context-group purpose="location">
<context context-type="sourcefile">src/app/components/manage/document-attributes/document-attributes.component.html</context> <context context-type="sourcefile">src/app/components/manage/document-attributes/document-attributes.component.html</context>
@@ -11041,7 +11041,7 @@
<source>Reset filters / selection</source> <source>Reset filters / selection</source>
<context-group purpose="location"> <context-group purpose="location">
<context context-type="sourcefile">src/app/components/document-list/document-list.component.ts</context> <context context-type="sourcefile">src/app/components/document-list/document-list.component.ts</context>
<context context-type="linenumber">329</context> <context context-type="linenumber">332</context>
</context-group> </context-group>
<target state="needs-translation">Reset filters / selection</target> <target state="needs-translation">Reset filters / selection</target>
</trans-unit> </trans-unit>
@@ -11049,7 +11049,7 @@
<source>Open first [selected] document</source> <source>Open first [selected] document</source>
<context-group purpose="location"> <context-group purpose="location">
<context context-type="sourcefile">src/app/components/document-list/document-list.component.ts</context> <context context-type="sourcefile">src/app/components/document-list/document-list.component.ts</context>
<context context-type="linenumber">357</context> <context context-type="linenumber">360</context>
</context-group> </context-group>
<target state="needs-translation">Open first [selected] document</target> <target state="needs-translation">Open first [selected] document</target>
</trans-unit> </trans-unit>
@@ -11057,7 +11057,7 @@
<source>Previous page</source> <source>Previous page</source>
<context-group purpose="location"> <context-group purpose="location">
<context context-type="sourcefile">src/app/components/document-list/document-list.component.ts</context> <context context-type="sourcefile">src/app/components/document-list/document-list.component.ts</context>
<context context-type="linenumber">373</context> <context context-type="linenumber">376</context>
</context-group> </context-group>
<target state="needs-translation">Previous page</target> <target state="needs-translation">Previous page</target>
</trans-unit> </trans-unit>
@@ -11065,7 +11065,7 @@
<source>Next page</source> <source>Next page</source>
<context-group purpose="location"> <context-group purpose="location">
<context context-type="sourcefile">src/app/components/document-list/document-list.component.ts</context> <context context-type="sourcefile">src/app/components/document-list/document-list.component.ts</context>
<context context-type="linenumber">385</context> <context context-type="linenumber">388</context>
</context-group> </context-group>
<target state="needs-translation">Next page</target> <target state="needs-translation">Next page</target>
</trans-unit> </trans-unit>
@@ -11073,7 +11073,7 @@
<source>View &quot;<x id="PH" equiv-text="this.list.activeSavedViewTitle"/>&quot; saved successfully.</source> <source>View &quot;<x id="PH" equiv-text="this.list.activeSavedViewTitle"/>&quot; saved successfully.</source>
<context-group purpose="location"> <context-group purpose="location">
<context context-type="sourcefile">src/app/components/document-list/document-list.component.ts</context> <context context-type="sourcefile">src/app/components/document-list/document-list.component.ts</context>
<context context-type="linenumber">419</context> <context context-type="linenumber">422</context>
</context-group> </context-group>
<target state="final">Visualização "<x id="PH" equiv-text="this.list.activeSavedViewTitle"/>" guardado com sucesso.</target> <target state="final">Visualização "<x id="PH" equiv-text="this.list.activeSavedViewTitle"/>" guardado com sucesso.</target>
</trans-unit> </trans-unit>
@@ -11081,7 +11081,7 @@
<source>Failed to save view &quot;<x id="PH" equiv-text="this.list.activeSavedViewTitle"/>&quot;.</source> <source>Failed to save view &quot;<x id="PH" equiv-text="this.list.activeSavedViewTitle"/>&quot;.</source>
<context-group purpose="location"> <context-group purpose="location">
<context context-type="sourcefile">src/app/components/document-list/document-list.component.ts</context> <context context-type="sourcefile">src/app/components/document-list/document-list.component.ts</context>
<context context-type="linenumber">425</context> <context context-type="linenumber">428</context>
</context-group> </context-group>
<target state="needs-translation">Failed to save view "<x id="PH" equiv-text="this.list.activeSavedViewTitle"/>".</target> <target state="needs-translation">Failed to save view "<x id="PH" equiv-text="this.list.activeSavedViewTitle"/>".</target>
</trans-unit> </trans-unit>
@@ -11089,7 +11089,7 @@
<source>View &quot;<x id="PH" equiv-text="savedView.name"/>&quot; created successfully.</source> <source>View &quot;<x id="PH" equiv-text="savedView.name"/>&quot; created successfully.</source>
<context-group purpose="location"> <context-group purpose="location">
<context context-type="sourcefile">src/app/components/document-list/document-list.component.ts</context> <context context-type="sourcefile">src/app/components/document-list/document-list.component.ts</context>
<context context-type="linenumber">494</context> <context context-type="linenumber">497</context>
</context-group> </context-group>
<target state="final">Visualização "<x id="PH" equiv-text="savedView.name"/>" criada com sucesso.</target> <target state="final">Visualização "<x id="PH" equiv-text="savedView.name"/>" criada com sucesso.</target>
</trans-unit> </trans-unit>
@@ -11097,7 +11097,7 @@
<source>View &quot;<x id="PH" equiv-text="savedView.name"/>&quot; created successfully, but could not update visibility settings.</source> <source>View &quot;<x id="PH" equiv-text="savedView.name"/>&quot; created successfully, but could not update visibility settings.</source>
<context-group purpose="location"> <context-group purpose="location">
<context context-type="sourcefile">src/app/components/document-list/document-list.component.ts</context> <context context-type="sourcefile">src/app/components/document-list/document-list.component.ts</context>
<context context-type="linenumber">500</context> <context context-type="linenumber">503</context>
</context-group> </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="needs-translation">View "<x id="PH" equiv-text="savedView.name"/>" created successfully, but could not update visibility settings.</target>
</trans-unit> </trans-unit>
@@ -13298,11 +13298,27 @@
</context-group> </context-group>
<target state="needs-translation">LLM Embedding Model</target> <target state="needs-translation">LLM Embedding Model</target>
</trans-unit> </trans-unit>
<trans-unit id="861068592166833023" datatype="html">
<source>LLM Embedding API Key</source>
<context-group purpose="location">
<context context-type="sourcefile">src/app/data/paperless-config.ts</context>
<context context-type="linenumber">358</context>
</context-group>
<target state="needs-translation">LLM Embedding API Key</target>
</trans-unit>
<trans-unit id="2929108042259892948" datatype="html">
<source>Used for embeddings when set, otherwise LLM API key is used.</source>
<context-group purpose="location">
<context context-type="sourcefile">src/app/data/paperless-config.ts</context>
<context context-type="linenumber">360</context>
</context-group>
<target state="needs-translation">Used for embeddings when set, otherwise LLM API key is used.</target>
</trans-unit>
<trans-unit id="3554114880473286122" datatype="html"> <trans-unit id="3554114880473286122" datatype="html">
<source>LLM Embedding Endpoint</source> <source>LLM Embedding Endpoint</source>
<context-group purpose="location"> <context-group purpose="location">
<context context-type="sourcefile">src/app/data/paperless-config.ts</context> <context context-type="sourcefile">src/app/data/paperless-config.ts</context>
<context context-type="linenumber">358</context> <context context-type="linenumber">366</context>
</context-group> </context-group>
<target state="needs-translation">LLM Embedding Endpoint</target> <target state="needs-translation">LLM Embedding Endpoint</target>
</trans-unit> </trans-unit>
@@ -13310,7 +13326,7 @@
<source>LLM Embedding Chunk Size</source> <source>LLM Embedding Chunk Size</source>
<context-group purpose="location"> <context-group purpose="location">
<context context-type="sourcefile">src/app/data/paperless-config.ts</context> <context context-type="sourcefile">src/app/data/paperless-config.ts</context>
<context context-type="linenumber">365</context> <context context-type="linenumber">373</context>
</context-group> </context-group>
<target state="needs-translation">LLM Embedding Chunk Size</target> <target state="needs-translation">LLM Embedding Chunk Size</target>
</trans-unit> </trans-unit>
@@ -13318,7 +13334,7 @@
<source>LLM Context Size</source> <source>LLM Context Size</source>
<context-group purpose="location"> <context-group purpose="location">
<context context-type="sourcefile">src/app/data/paperless-config.ts</context> <context context-type="sourcefile">src/app/data/paperless-config.ts</context>
<context context-type="linenumber">372</context> <context context-type="linenumber">380</context>
</context-group> </context-group>
<target state="needs-translation">LLM Context Size</target> <target state="needs-translation">LLM Context Size</target>
</trans-unit> </trans-unit>
@@ -13326,7 +13342,7 @@
<source>LLM Backend</source> <source>LLM Backend</source>
<context-group purpose="location"> <context-group purpose="location">
<context context-type="sourcefile">src/app/data/paperless-config.ts</context> <context context-type="sourcefile">src/app/data/paperless-config.ts</context>
<context context-type="linenumber">379</context> <context context-type="linenumber">387</context>
</context-group> </context-group>
<target state="needs-translation">LLM Backend</target> <target state="needs-translation">LLM Backend</target>
</trans-unit> </trans-unit>
@@ -13334,7 +13350,7 @@
<source>LLM Model</source> <source>LLM Model</source>
<context-group purpose="location"> <context-group purpose="location">
<context context-type="sourcefile">src/app/data/paperless-config.ts</context> <context context-type="sourcefile">src/app/data/paperless-config.ts</context>
<context context-type="linenumber">387</context> <context context-type="linenumber">395</context>
</context-group> </context-group>
<target state="needs-translation">LLM Model</target> <target state="needs-translation">LLM Model</target>
</trans-unit> </trans-unit>
@@ -13342,7 +13358,7 @@
<source>LLM API Key</source> <source>LLM API Key</source>
<context-group purpose="location"> <context-group purpose="location">
<context context-type="sourcefile">src/app/data/paperless-config.ts</context> <context context-type="sourcefile">src/app/data/paperless-config.ts</context>
<context context-type="linenumber">394</context> <context context-type="linenumber">402</context>
</context-group> </context-group>
<target state="needs-translation">LLM API Key</target> <target state="needs-translation">LLM API Key</target>
</trans-unit> </trans-unit>
@@ -13350,7 +13366,7 @@
<source>LLM Endpoint</source> <source>LLM Endpoint</source>
<context-group purpose="location"> <context-group purpose="location">
<context context-type="sourcefile">src/app/data/paperless-config.ts</context> <context context-type="sourcefile">src/app/data/paperless-config.ts</context>
<context context-type="linenumber">401</context> <context context-type="linenumber">409</context>
</context-group> </context-group>
<target state="needs-translation">LLM Endpoint</target> <target state="needs-translation">LLM Endpoint</target>
</trans-unit> </trans-unit>
@@ -13358,7 +13374,7 @@
<source>LLM Output Language</source> <source>LLM Output Language</source>
<context-group purpose="location"> <context-group purpose="location">
<context context-type="sourcefile">src/app/data/paperless-config.ts</context> <context context-type="sourcefile">src/app/data/paperless-config.ts</context>
<context context-type="linenumber">408</context> <context context-type="linenumber">416</context>
</context-group> </context-group>
<target state="needs-translation">LLM Output Language</target> <target state="needs-translation">LLM Output Language</target>
</trans-unit> </trans-unit>
@@ -13366,7 +13382,7 @@
<source>Language to use for generated AI suggestions. When unset, AI suggestions use the user&apos;s display language if explicitly set.</source> <source>Language to use for generated AI suggestions. When unset, AI suggestions use the user&apos;s display language if explicitly set.</source>
<context-group purpose="location"> <context-group purpose="location">
<context context-type="sourcefile">src/app/data/paperless-config.ts</context> <context context-type="sourcefile">src/app/data/paperless-config.ts</context>
<context context-type="linenumber">412</context> <context context-type="linenumber">420</context>
</context-group> </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="needs-translation">Language to use for generated AI suggestions. When unset, AI suggestions use the user's display language if explicitly set.</target>
</trans-unit> </trans-unit>
@@ -13374,7 +13390,7 @@
<source>LLM Request Timeout</source> <source>LLM Request Timeout</source>
<context-group purpose="location"> <context-group purpose="location">
<context context-type="sourcefile">src/app/data/paperless-config.ts</context> <context context-type="sourcefile">src/app/data/paperless-config.ts</context>
<context context-type="linenumber">416</context> <context context-type="linenumber">424</context>
</context-group> </context-group>
<target state="needs-translation">LLM Request Timeout</target> <target state="needs-translation">LLM Request Timeout</target>
</trans-unit> </trans-unit>
@@ -13382,7 +13398,7 @@
<source>Timeout in seconds for LLM requests.</source> <source>Timeout in seconds for LLM requests.</source>
<context-group purpose="location"> <context-group purpose="location">
<context context-type="sourcefile">src/app/data/paperless-config.ts</context> <context context-type="sourcefile">src/app/data/paperless-config.ts</context>
<context context-type="linenumber">420</context> <context context-type="linenumber">428</context>
</context-group> </context-group>
<target state="needs-translation">Timeout in seconds for LLM requests.</target> <target state="needs-translation">Timeout in seconds for LLM requests.</target>
</trans-unit> </trans-unit>
+37 -21
View File
@@ -10740,7 +10740,7 @@
</context-group> </context-group>
<context-group purpose="location"> <context-group purpose="location">
<context context-type="sourcefile">src/app/components/document-list/document-list.component.ts</context> <context context-type="sourcefile">src/app/components/document-list/document-list.component.ts</context>
<context context-type="linenumber">348</context> <context context-type="linenumber">351</context>
</context-group> </context-group>
<context-group purpose="location"> <context-group purpose="location">
<context context-type="sourcefile">src/app/components/manage/document-attributes/document-attributes.component.html</context> <context context-type="sourcefile">src/app/components/manage/document-attributes/document-attributes.component.html</context>
@@ -10756,7 +10756,7 @@
</context-group> </context-group>
<context-group purpose="location"> <context-group purpose="location">
<context context-type="sourcefile">src/app/components/document-list/document-list.component.ts</context> <context context-type="sourcefile">src/app/components/document-list/document-list.component.ts</context>
<context context-type="linenumber">341</context> <context context-type="linenumber">344</context>
</context-group> </context-group>
<context-group purpose="location"> <context-group purpose="location">
<context context-type="sourcefile">src/app/components/manage/document-attributes/document-attributes.component.html</context> <context context-type="sourcefile">src/app/components/manage/document-attributes/document-attributes.component.html</context>
@@ -11040,7 +11040,7 @@
<source>Reset filters / selection</source> <source>Reset filters / selection</source>
<context-group purpose="location"> <context-group purpose="location">
<context context-type="sourcefile">src/app/components/document-list/document-list.component.ts</context> <context context-type="sourcefile">src/app/components/document-list/document-list.component.ts</context>
<context context-type="linenumber">329</context> <context context-type="linenumber">332</context>
</context-group> </context-group>
<target state="translated">Resetare filtre / selecţie</target> <target state="translated">Resetare filtre / selecţie</target>
</trans-unit> </trans-unit>
@@ -11048,7 +11048,7 @@
<source>Open first [selected] document</source> <source>Open first [selected] document</source>
<context-group purpose="location"> <context-group purpose="location">
<context context-type="sourcefile">src/app/components/document-list/document-list.component.ts</context> <context context-type="sourcefile">src/app/components/document-list/document-list.component.ts</context>
<context context-type="linenumber">357</context> <context context-type="linenumber">360</context>
</context-group> </context-group>
<target state="translated">Deschide primul document [selectat]</target> <target state="translated">Deschide primul document [selectat]</target>
</trans-unit> </trans-unit>
@@ -11056,7 +11056,7 @@
<source>Previous page</source> <source>Previous page</source>
<context-group purpose="location"> <context-group purpose="location">
<context context-type="sourcefile">src/app/components/document-list/document-list.component.ts</context> <context context-type="sourcefile">src/app/components/document-list/document-list.component.ts</context>
<context context-type="linenumber">373</context> <context context-type="linenumber">376</context>
</context-group> </context-group>
<target state="translated">Pagina precedentă</target> <target state="translated">Pagina precedentă</target>
</trans-unit> </trans-unit>
@@ -11064,7 +11064,7 @@
<source>Next page</source> <source>Next page</source>
<context-group purpose="location"> <context-group purpose="location">
<context context-type="sourcefile">src/app/components/document-list/document-list.component.ts</context> <context context-type="sourcefile">src/app/components/document-list/document-list.component.ts</context>
<context context-type="linenumber">385</context> <context context-type="linenumber">388</context>
</context-group> </context-group>
<target state="translated">Pagina următoare</target> <target state="translated">Pagina următoare</target>
</trans-unit> </trans-unit>
@@ -11072,7 +11072,7 @@
<source>View &quot;<x id="PH" equiv-text="this.list.activeSavedViewTitle"/>&quot; saved successfully.</source> <source>View &quot;<x id="PH" equiv-text="this.list.activeSavedViewTitle"/>&quot; saved successfully.</source>
<context-group purpose="location"> <context-group purpose="location">
<context context-type="sourcefile">src/app/components/document-list/document-list.component.ts</context> <context context-type="sourcefile">src/app/components/document-list/document-list.component.ts</context>
<context context-type="linenumber">419</context> <context context-type="linenumber">422</context>
</context-group> </context-group>
<target state="final">Vizualizarea "<x id="PH" equiv-text="this.list.activeSavedViewTitle"/>" a fost salvată.</target> <target state="final">Vizualizarea "<x id="PH" equiv-text="this.list.activeSavedViewTitle"/>" a fost salvată.</target>
</trans-unit> </trans-unit>
@@ -11080,7 +11080,7 @@
<source>Failed to save view &quot;<x id="PH" equiv-text="this.list.activeSavedViewTitle"/>&quot;.</source> <source>Failed to save view &quot;<x id="PH" equiv-text="this.list.activeSavedViewTitle"/>&quot;.</source>
<context-group purpose="location"> <context-group purpose="location">
<context context-type="sourcefile">src/app/components/document-list/document-list.component.ts</context> <context context-type="sourcefile">src/app/components/document-list/document-list.component.ts</context>
<context context-type="linenumber">425</context> <context context-type="linenumber">428</context>
</context-group> </context-group>
<target state="translated">Nu s-a putut salva vizualizarea "<x id="PH" equiv-text="this.list.activeSavedViewTitle"/>".</target> <target state="translated">Nu s-a putut salva vizualizarea "<x id="PH" equiv-text="this.list.activeSavedViewTitle"/>".</target>
</trans-unit> </trans-unit>
@@ -11088,7 +11088,7 @@
<source>View &quot;<x id="PH" equiv-text="savedView.name"/>&quot; created successfully.</source> <source>View &quot;<x id="PH" equiv-text="savedView.name"/>&quot; created successfully.</source>
<context-group purpose="location"> <context-group purpose="location">
<context context-type="sourcefile">src/app/components/document-list/document-list.component.ts</context> <context context-type="sourcefile">src/app/components/document-list/document-list.component.ts</context>
<context context-type="linenumber">494</context> <context context-type="linenumber">497</context>
</context-group> </context-group>
<target state="final">Vizualizarea "<x id="PH" equiv-text="savedView.name"/>" a fost creată.</target> <target state="final">Vizualizarea "<x id="PH" equiv-text="savedView.name"/>" a fost creată.</target>
</trans-unit> </trans-unit>
@@ -11096,7 +11096,7 @@
<source>View &quot;<x id="PH" equiv-text="savedView.name"/>&quot; created successfully, but could not update visibility settings.</source> <source>View &quot;<x id="PH" equiv-text="savedView.name"/>&quot; created successfully, but could not update visibility settings.</source>
<context-group purpose="location"> <context-group purpose="location">
<context context-type="sourcefile">src/app/components/document-list/document-list.component.ts</context> <context context-type="sourcefile">src/app/components/document-list/document-list.component.ts</context>
<context context-type="linenumber">500</context> <context context-type="linenumber">503</context>
</context-group> </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="needs-translation">View "<x id="PH" equiv-text="savedView.name"/>" created successfully, but could not update visibility settings.</target>
</trans-unit> </trans-unit>
@@ -13297,11 +13297,27 @@
</context-group> </context-group>
<target state="translated">Modelul de Încorporare LLM</target> <target state="translated">Modelul de Încorporare LLM</target>
</trans-unit> </trans-unit>
<trans-unit id="861068592166833023" datatype="html">
<source>LLM Embedding API Key</source>
<context-group purpose="location">
<context context-type="sourcefile">src/app/data/paperless-config.ts</context>
<context context-type="linenumber">358</context>
</context-group>
<target state="needs-translation">LLM Embedding API Key</target>
</trans-unit>
<trans-unit id="2929108042259892948" datatype="html">
<source>Used for embeddings when set, otherwise LLM API key is used.</source>
<context-group purpose="location">
<context context-type="sourcefile">src/app/data/paperless-config.ts</context>
<context context-type="linenumber">360</context>
</context-group>
<target state="needs-translation">Used for embeddings when set, otherwise LLM API key is used.</target>
</trans-unit>
<trans-unit id="3554114880473286122" datatype="html"> <trans-unit id="3554114880473286122" datatype="html">
<source>LLM Embedding Endpoint</source> <source>LLM Embedding Endpoint</source>
<context-group purpose="location"> <context-group purpose="location">
<context context-type="sourcefile">src/app/data/paperless-config.ts</context> <context context-type="sourcefile">src/app/data/paperless-config.ts</context>
<context context-type="linenumber">358</context> <context context-type="linenumber">366</context>
</context-group> </context-group>
<target state="needs-translation">LLM Embedding Endpoint</target> <target state="needs-translation">LLM Embedding Endpoint</target>
</trans-unit> </trans-unit>
@@ -13309,7 +13325,7 @@
<source>LLM Embedding Chunk Size</source> <source>LLM Embedding Chunk Size</source>
<context-group purpose="location"> <context-group purpose="location">
<context context-type="sourcefile">src/app/data/paperless-config.ts</context> <context context-type="sourcefile">src/app/data/paperless-config.ts</context>
<context context-type="linenumber">365</context> <context context-type="linenumber">373</context>
</context-group> </context-group>
<target state="needs-translation">LLM Embedding Chunk Size</target> <target state="needs-translation">LLM Embedding Chunk Size</target>
</trans-unit> </trans-unit>
@@ -13317,7 +13333,7 @@
<source>LLM Context Size</source> <source>LLM Context Size</source>
<context-group purpose="location"> <context-group purpose="location">
<context context-type="sourcefile">src/app/data/paperless-config.ts</context> <context context-type="sourcefile">src/app/data/paperless-config.ts</context>
<context context-type="linenumber">372</context> <context context-type="linenumber">380</context>
</context-group> </context-group>
<target state="needs-translation">LLM Context Size</target> <target state="needs-translation">LLM Context Size</target>
</trans-unit> </trans-unit>
@@ -13325,7 +13341,7 @@
<source>LLM Backend</source> <source>LLM Backend</source>
<context-group purpose="location"> <context-group purpose="location">
<context context-type="sourcefile">src/app/data/paperless-config.ts</context> <context context-type="sourcefile">src/app/data/paperless-config.ts</context>
<context context-type="linenumber">379</context> <context context-type="linenumber">387</context>
</context-group> </context-group>
<target state="translated">Backend-ul LLM</target> <target state="translated">Backend-ul LLM</target>
</trans-unit> </trans-unit>
@@ -13333,7 +13349,7 @@
<source>LLM Model</source> <source>LLM Model</source>
<context-group purpose="location"> <context-group purpose="location">
<context context-type="sourcefile">src/app/data/paperless-config.ts</context> <context context-type="sourcefile">src/app/data/paperless-config.ts</context>
<context context-type="linenumber">387</context> <context context-type="linenumber">395</context>
</context-group> </context-group>
<target state="translated">Model LLM</target> <target state="translated">Model LLM</target>
</trans-unit> </trans-unit>
@@ -13341,7 +13357,7 @@
<source>LLM API Key</source> <source>LLM API Key</source>
<context-group purpose="location"> <context-group purpose="location">
<context context-type="sourcefile">src/app/data/paperless-config.ts</context> <context context-type="sourcefile">src/app/data/paperless-config.ts</context>
<context context-type="linenumber">394</context> <context context-type="linenumber">402</context>
</context-group> </context-group>
<target state="translated">Cheie API LLM</target> <target state="translated">Cheie API LLM</target>
</trans-unit> </trans-unit>
@@ -13349,7 +13365,7 @@
<source>LLM Endpoint</source> <source>LLM Endpoint</source>
<context-group purpose="location"> <context-group purpose="location">
<context context-type="sourcefile">src/app/data/paperless-config.ts</context> <context context-type="sourcefile">src/app/data/paperless-config.ts</context>
<context context-type="linenumber">401</context> <context context-type="linenumber">409</context>
</context-group> </context-group>
<target state="translated">Endpoint LLM</target> <target state="translated">Endpoint LLM</target>
</trans-unit> </trans-unit>
@@ -13357,7 +13373,7 @@
<source>LLM Output Language</source> <source>LLM Output Language</source>
<context-group purpose="location"> <context-group purpose="location">
<context context-type="sourcefile">src/app/data/paperless-config.ts</context> <context context-type="sourcefile">src/app/data/paperless-config.ts</context>
<context context-type="linenumber">408</context> <context context-type="linenumber">416</context>
</context-group> </context-group>
<target state="needs-translation">LLM Output Language</target> <target state="needs-translation">LLM Output Language</target>
</trans-unit> </trans-unit>
@@ -13365,7 +13381,7 @@
<source>Language to use for generated AI suggestions. When unset, AI suggestions use the user&apos;s display language if explicitly set.</source> <source>Language to use for generated AI suggestions. When unset, AI suggestions use the user&apos;s display language if explicitly set.</source>
<context-group purpose="location"> <context-group purpose="location">
<context context-type="sourcefile">src/app/data/paperless-config.ts</context> <context context-type="sourcefile">src/app/data/paperless-config.ts</context>
<context context-type="linenumber">412</context> <context context-type="linenumber">420</context>
</context-group> </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="needs-translation">Language to use for generated AI suggestions. When unset, AI suggestions use the user's display language if explicitly set.</target>
</trans-unit> </trans-unit>
@@ -13373,7 +13389,7 @@
<source>LLM Request Timeout</source> <source>LLM Request Timeout</source>
<context-group purpose="location"> <context-group purpose="location">
<context context-type="sourcefile">src/app/data/paperless-config.ts</context> <context context-type="sourcefile">src/app/data/paperless-config.ts</context>
<context context-type="linenumber">416</context> <context context-type="linenumber">424</context>
</context-group> </context-group>
<target state="needs-translation">LLM Request Timeout</target> <target state="needs-translation">LLM Request Timeout</target>
</trans-unit> </trans-unit>
@@ -13381,7 +13397,7 @@
<source>Timeout in seconds for LLM requests.</source> <source>Timeout in seconds for LLM requests.</source>
<context-group purpose="location"> <context-group purpose="location">
<context context-type="sourcefile">src/app/data/paperless-config.ts</context> <context context-type="sourcefile">src/app/data/paperless-config.ts</context>
<context context-type="linenumber">420</context> <context context-type="linenumber">428</context>
</context-group> </context-group>
<target state="needs-translation">Timeout in seconds for LLM requests.</target> <target state="needs-translation">Timeout in seconds for LLM requests.</target>
</trans-unit> </trans-unit>
+37 -21
View File
@@ -10740,7 +10740,7 @@
</context-group> </context-group>
<context-group purpose="location"> <context-group purpose="location">
<context context-type="sourcefile">src/app/components/document-list/document-list.component.ts</context> <context context-type="sourcefile">src/app/components/document-list/document-list.component.ts</context>
<context context-type="linenumber">348</context> <context context-type="linenumber">351</context>
</context-group> </context-group>
<context-group purpose="location"> <context-group purpose="location">
<context context-type="sourcefile">src/app/components/manage/document-attributes/document-attributes.component.html</context> <context context-type="sourcefile">src/app/components/manage/document-attributes/document-attributes.component.html</context>
@@ -10756,7 +10756,7 @@
</context-group> </context-group>
<context-group purpose="location"> <context-group purpose="location">
<context context-type="sourcefile">src/app/components/document-list/document-list.component.ts</context> <context context-type="sourcefile">src/app/components/document-list/document-list.component.ts</context>
<context context-type="linenumber">341</context> <context context-type="linenumber">344</context>
</context-group> </context-group>
<context-group purpose="location"> <context-group purpose="location">
<context context-type="sourcefile">src/app/components/manage/document-attributes/document-attributes.component.html</context> <context context-type="sourcefile">src/app/components/manage/document-attributes/document-attributes.component.html</context>
@@ -11040,7 +11040,7 @@
<source>Reset filters / selection</source> <source>Reset filters / selection</source>
<context-group purpose="location"> <context-group purpose="location">
<context context-type="sourcefile">src/app/components/document-list/document-list.component.ts</context> <context context-type="sourcefile">src/app/components/document-list/document-list.component.ts</context>
<context context-type="linenumber">329</context> <context context-type="linenumber">332</context>
</context-group> </context-group>
<target state="translated">Сбросить фильтры / выбор</target> <target state="translated">Сбросить фильтры / выбор</target>
</trans-unit> </trans-unit>
@@ -11048,7 +11048,7 @@
<source>Open first [selected] document</source> <source>Open first [selected] document</source>
<context-group purpose="location"> <context-group purpose="location">
<context context-type="sourcefile">src/app/components/document-list/document-list.component.ts</context> <context context-type="sourcefile">src/app/components/document-list/document-list.component.ts</context>
<context context-type="linenumber">357</context> <context context-type="linenumber">360</context>
</context-group> </context-group>
<target state="translated">Открыть первый [выбранный] документ</target> <target state="translated">Открыть первый [выбранный] документ</target>
</trans-unit> </trans-unit>
@@ -11056,7 +11056,7 @@
<source>Previous page</source> <source>Previous page</source>
<context-group purpose="location"> <context-group purpose="location">
<context context-type="sourcefile">src/app/components/document-list/document-list.component.ts</context> <context context-type="sourcefile">src/app/components/document-list/document-list.component.ts</context>
<context context-type="linenumber">373</context> <context context-type="linenumber">376</context>
</context-group> </context-group>
<target state="translated">Предыдущая страница</target> <target state="translated">Предыдущая страница</target>
</trans-unit> </trans-unit>
@@ -11064,7 +11064,7 @@
<source>Next page</source> <source>Next page</source>
<context-group purpose="location"> <context-group purpose="location">
<context context-type="sourcefile">src/app/components/document-list/document-list.component.ts</context> <context context-type="sourcefile">src/app/components/document-list/document-list.component.ts</context>
<context context-type="linenumber">385</context> <context context-type="linenumber">388</context>
</context-group> </context-group>
<target state="translated">Следующая страница</target> <target state="translated">Следующая страница</target>
</trans-unit> </trans-unit>
@@ -11072,7 +11072,7 @@
<source>View &quot;<x id="PH" equiv-text="this.list.activeSavedViewTitle"/>&quot; saved successfully.</source> <source>View &quot;<x id="PH" equiv-text="this.list.activeSavedViewTitle"/>&quot; saved successfully.</source>
<context-group purpose="location"> <context-group purpose="location">
<context context-type="sourcefile">src/app/components/document-list/document-list.component.ts</context> <context context-type="sourcefile">src/app/components/document-list/document-list.component.ts</context>
<context context-type="linenumber">419</context> <context context-type="linenumber">422</context>
</context-group> </context-group>
<target state="final">Представление "<x id="PH" equiv-text="this.list.activeSavedViewTitle"/>" успешно сохранено.</target> <target state="final">Представление "<x id="PH" equiv-text="this.list.activeSavedViewTitle"/>" успешно сохранено.</target>
</trans-unit> </trans-unit>
@@ -11080,7 +11080,7 @@
<source>Failed to save view &quot;<x id="PH" equiv-text="this.list.activeSavedViewTitle"/>&quot;.</source> <source>Failed to save view &quot;<x id="PH" equiv-text="this.list.activeSavedViewTitle"/>&quot;.</source>
<context-group purpose="location"> <context-group purpose="location">
<context context-type="sourcefile">src/app/components/document-list/document-list.component.ts</context> <context context-type="sourcefile">src/app/components/document-list/document-list.component.ts</context>
<context context-type="linenumber">425</context> <context context-type="linenumber">428</context>
</context-group> </context-group>
<target state="translated">Не удалось сохранить представление "<x id="PH" equiv-text="this.list.activeSavedViewTitle"/>".</target> <target state="translated">Не удалось сохранить представление "<x id="PH" equiv-text="this.list.activeSavedViewTitle"/>".</target>
</trans-unit> </trans-unit>
@@ -11088,7 +11088,7 @@
<source>View &quot;<x id="PH" equiv-text="savedView.name"/>&quot; created successfully.</source> <source>View &quot;<x id="PH" equiv-text="savedView.name"/>&quot; created successfully.</source>
<context-group purpose="location"> <context-group purpose="location">
<context context-type="sourcefile">src/app/components/document-list/document-list.component.ts</context> <context context-type="sourcefile">src/app/components/document-list/document-list.component.ts</context>
<context context-type="linenumber">494</context> <context context-type="linenumber">497</context>
</context-group> </context-group>
<target state="final">Представление "<x id="PH" equiv-text="savedView.name"/>" успешно создано.</target> <target state="final">Представление "<x id="PH" equiv-text="savedView.name"/>" успешно создано.</target>
</trans-unit> </trans-unit>
@@ -11096,7 +11096,7 @@
<source>View &quot;<x id="PH" equiv-text="savedView.name"/>&quot; created successfully, but could not update visibility settings.</source> <source>View &quot;<x id="PH" equiv-text="savedView.name"/>&quot; created successfully, but could not update visibility settings.</source>
<context-group purpose="location"> <context-group purpose="location">
<context context-type="sourcefile">src/app/components/document-list/document-list.component.ts</context> <context context-type="sourcefile">src/app/components/document-list/document-list.component.ts</context>
<context context-type="linenumber">500</context> <context context-type="linenumber">503</context>
</context-group> </context-group>
<target state="translated">Просмотр "<x id="PH" equiv-text="savedView.name"/>" успешно создан, но не удалось обновить настройки видимости.</target> <target state="translated">Просмотр "<x id="PH" equiv-text="savedView.name"/>" успешно создан, но не удалось обновить настройки видимости.</target>
</trans-unit> </trans-unit>
@@ -13297,11 +13297,27 @@
</context-group> </context-group>
<target state="translated">Модель встраивания LLM</target> <target state="translated">Модель встраивания LLM</target>
</trans-unit> </trans-unit>
<trans-unit id="861068592166833023" datatype="html">
<source>LLM Embedding API Key</source>
<context-group purpose="location">
<context context-type="sourcefile">src/app/data/paperless-config.ts</context>
<context context-type="linenumber">358</context>
</context-group>
<target state="translated">API-ключ для LLM встраивания</target>
</trans-unit>
<trans-unit id="2929108042259892948" datatype="html">
<source>Used for embeddings when set, otherwise LLM API key is used.</source>
<context-group purpose="location">
<context context-type="sourcefile">src/app/data/paperless-config.ts</context>
<context context-type="linenumber">360</context>
</context-group>
<target state="translated">Используется для встраивания, если установлено, в противном случае используется API-ключ LLM.</target>
</trans-unit>
<trans-unit id="3554114880473286122" datatype="html"> <trans-unit id="3554114880473286122" datatype="html">
<source>LLM Embedding Endpoint</source> <source>LLM Embedding Endpoint</source>
<context-group purpose="location"> <context-group purpose="location">
<context context-type="sourcefile">src/app/data/paperless-config.ts</context> <context context-type="sourcefile">src/app/data/paperless-config.ts</context>
<context context-type="linenumber">358</context> <context context-type="linenumber">366</context>
</context-group> </context-group>
<target state="translated">Конечная точка встраивания LLM</target> <target state="translated">Конечная точка встраивания LLM</target>
</trans-unit> </trans-unit>
@@ -13309,7 +13325,7 @@
<source>LLM Embedding Chunk Size</source> <source>LLM Embedding Chunk Size</source>
<context-group purpose="location"> <context-group purpose="location">
<context context-type="sourcefile">src/app/data/paperless-config.ts</context> <context context-type="sourcefile">src/app/data/paperless-config.ts</context>
<context context-type="linenumber">365</context> <context context-type="linenumber">373</context>
</context-group> </context-group>
<target state="translated">Размер кучи встраивания LLM</target> <target state="translated">Размер кучи встраивания LLM</target>
</trans-unit> </trans-unit>
@@ -13317,7 +13333,7 @@
<source>LLM Context Size</source> <source>LLM Context Size</source>
<context-group purpose="location"> <context-group purpose="location">
<context context-type="sourcefile">src/app/data/paperless-config.ts</context> <context context-type="sourcefile">src/app/data/paperless-config.ts</context>
<context context-type="linenumber">372</context> <context context-type="linenumber">380</context>
</context-group> </context-group>
<target state="translated">Размер контекста LLM</target> <target state="translated">Размер контекста LLM</target>
</trans-unit> </trans-unit>
@@ -13325,7 +13341,7 @@
<source>LLM Backend</source> <source>LLM Backend</source>
<context-group purpose="location"> <context-group purpose="location">
<context context-type="sourcefile">src/app/data/paperless-config.ts</context> <context context-type="sourcefile">src/app/data/paperless-config.ts</context>
<context context-type="linenumber">379</context> <context context-type="linenumber">387</context>
</context-group> </context-group>
<target state="translated">Бэкенд LLM</target> <target state="translated">Бэкенд LLM</target>
</trans-unit> </trans-unit>
@@ -13333,7 +13349,7 @@
<source>LLM Model</source> <source>LLM Model</source>
<context-group purpose="location"> <context-group purpose="location">
<context context-type="sourcefile">src/app/data/paperless-config.ts</context> <context context-type="sourcefile">src/app/data/paperless-config.ts</context>
<context context-type="linenumber">387</context> <context context-type="linenumber">395</context>
</context-group> </context-group>
<target state="translated">Модель LLM</target> <target state="translated">Модель LLM</target>
</trans-unit> </trans-unit>
@@ -13341,7 +13357,7 @@
<source>LLM API Key</source> <source>LLM API Key</source>
<context-group purpose="location"> <context-group purpose="location">
<context context-type="sourcefile">src/app/data/paperless-config.ts</context> <context context-type="sourcefile">src/app/data/paperless-config.ts</context>
<context context-type="linenumber">394</context> <context context-type="linenumber">402</context>
</context-group> </context-group>
<target state="translated">API-ключ LLM</target> <target state="translated">API-ключ LLM</target>
</trans-unit> </trans-unit>
@@ -13349,7 +13365,7 @@
<source>LLM Endpoint</source> <source>LLM Endpoint</source>
<context-group purpose="location"> <context-group purpose="location">
<context context-type="sourcefile">src/app/data/paperless-config.ts</context> <context context-type="sourcefile">src/app/data/paperless-config.ts</context>
<context context-type="linenumber">401</context> <context context-type="linenumber">409</context>
</context-group> </context-group>
<target state="translated">Конечная точка LLM</target> <target state="translated">Конечная точка LLM</target>
</trans-unit> </trans-unit>
@@ -13357,7 +13373,7 @@
<source>LLM Output Language</source> <source>LLM Output Language</source>
<context-group purpose="location"> <context-group purpose="location">
<context context-type="sourcefile">src/app/data/paperless-config.ts</context> <context context-type="sourcefile">src/app/data/paperless-config.ts</context>
<context context-type="linenumber">408</context> <context context-type="linenumber">416</context>
</context-group> </context-group>
<target state="translated">Язык выдачи LLM</target> <target state="translated">Язык выдачи LLM</target>
</trans-unit> </trans-unit>
@@ -13365,7 +13381,7 @@
<source>Language to use for generated AI suggestions. When unset, AI suggestions use the user&apos;s display language if explicitly set.</source> <source>Language to use for generated AI suggestions. When unset, AI suggestions use the user&apos;s display language if explicitly set.</source>
<context-group purpose="location"> <context-group purpose="location">
<context context-type="sourcefile">src/app/data/paperless-config.ts</context> <context context-type="sourcefile">src/app/data/paperless-config.ts</context>
<context context-type="linenumber">412</context> <context context-type="linenumber">420</context>
</context-group> </context-group>
<target state="translated">Язык для сгенерированных ИИ предложений. Когда отключено, ИИ использует язык пользователя, если он явно установлен.</target> <target state="translated">Язык для сгенерированных ИИ предложений. Когда отключено, ИИ использует язык пользователя, если он явно установлен.</target>
</trans-unit> </trans-unit>
@@ -13373,7 +13389,7 @@
<source>LLM Request Timeout</source> <source>LLM Request Timeout</source>
<context-group purpose="location"> <context-group purpose="location">
<context context-type="sourcefile">src/app/data/paperless-config.ts</context> <context context-type="sourcefile">src/app/data/paperless-config.ts</context>
<context context-type="linenumber">416</context> <context context-type="linenumber">424</context>
</context-group> </context-group>
<target state="translated">Таймаут запроса LLM</target> <target state="translated">Таймаут запроса LLM</target>
</trans-unit> </trans-unit>
@@ -13381,7 +13397,7 @@
<source>Timeout in seconds for LLM requests.</source> <source>Timeout in seconds for LLM requests.</source>
<context-group purpose="location"> <context-group purpose="location">
<context context-type="sourcefile">src/app/data/paperless-config.ts</context> <context context-type="sourcefile">src/app/data/paperless-config.ts</context>
<context context-type="linenumber">420</context> <context context-type="linenumber">428</context>
</context-group> </context-group>
<target state="translated">Тайм-аут в секундах для LLM запросов.</target> <target state="translated">Тайм-аут в секундах для LLM запросов.</target>
</trans-unit> </trans-unit>
+70 -54
View File
@@ -17,7 +17,7 @@
<context context-type="linenumber">129</context> <context context-type="linenumber">129</context>
</context-group> </context-group>
<note priority="1" from="description">Currently selected slide number read by screen reader</note> <note priority="1" from="description">Currently selected slide number read by screen reader</note>
<target state="needs-translation"> Slide <x id="INTERPOLATION"/> of <x id="INTERPOLATION_1"/> </target> <target state="translated">Snímka <x id="INTERPOLATION"/> z <x id="INTERPOLATION_1"/></target>
</trans-unit> </trans-unit>
<trans-unit id="ngb.carousel.previous" datatype="html"> <trans-unit id="ngb.carousel.previous" datatype="html">
<source>Previous</source> <source>Previous</source>
@@ -479,7 +479,7 @@
<context context-type="sourcefile">src/app/app.component.ts</context> <context context-type="sourcefile">src/app/app.component.ts</context>
<context context-type="linenumber">201</context> <context context-type="linenumber">201</context>
</context-group> </context-group>
<target state="needs-translation">Attributes like tags, correspondents, document types, storage paths and custom fields can all be managed here. They can also be created from the document edit view.</target> <target state="translated">Tu možno spravovať atribúty, ako sú štítky, korešpondenti, typy dokumentov, cesty k úložisku a vlastné polia. Možno ich vytvárať aj v zobrazení úpravy dokumentu.</target>
</trans-unit> </trans-unit>
<trans-unit id="7851939076947092983" datatype="html"> <trans-unit id="7851939076947092983" datatype="html">
<source>Manage e-mail accounts and rules for automatically importing documents.</source> <source>Manage e-mail accounts and rules for automatically importing documents.</source>
@@ -507,7 +507,7 @@
<context context-type="sourcefile">src/app/app.component.ts</context> <context context-type="sourcefile">src/app/app.component.ts</context>
<context context-type="linenumber">225</context> <context context-type="linenumber">225</context>
</context-group> </context-group>
<target state="needs-translation">Tasks helps you track background work, what needs attention, and what recently completed.</target> <target state="translated">Funkcia Úlohy vám pomáha sledovať prácu na pozadí, záležitosti vyžadujúce pozornosť a nedávno dokončené úlohy.</target>
</trans-unit> </trans-unit>
<trans-unit id="2755033621682206902" datatype="html"> <trans-unit id="2755033621682206902" datatype="html">
<source>Check out the settings for various tweaks to the web app.</source> <source>Check out the settings for various tweaks to the web app.</source>
@@ -515,7 +515,7 @@
<context context-type="sourcefile">src/app/app.component.ts</context> <context context-type="sourcefile">src/app/app.component.ts</context>
<context context-type="linenumber">233</context> <context context-type="linenumber">233</context>
</context-group> </context-group>
<target state="needs-translation">Check out the settings for various tweaks to the web app.</target> <target state="translated">Pozrite si nastavenia rôznych vylepšení webovej aplikácie.</target>
</trans-unit> </trans-unit>
<trans-unit id="7172877665285340082" datatype="html"> <trans-unit id="7172877665285340082" datatype="html">
<source>Thank you! 🙏</source> <source>Thank you! 🙏</source>
@@ -555,7 +555,7 @@
<context context-type="sourcefile">src/app/components/admin/config/config.component.html</context> <context context-type="sourcefile">src/app/components/admin/config/config.component.html</context>
<context context-type="linenumber">4,5</context> <context context-type="linenumber">4,5</context>
</context-group> </context-group>
<target state="needs-translation">Global app configuration options which apply to &lt;strong&gt;every&lt;/strong&gt; user of this install of Paperless-ngx. Options can also be set using environment variables or the configuration file but the value here will always take precedence.</target> <target state="translated">Globálne možnosti konfigurácie aplikácie, ktoré sa vzťahujú na &lt;strong&gt;každého&lt;/strong&gt; používateľa tejto inštalácie Paperless-ngx. Možnosti možno nastaviť aj pomocou premenných prostredia alebo konfiguračného súboru, avšak tu uvedená hodnota bude mať vždy prednosť.</target>
</trans-unit> </trans-unit>
<trans-unit id="7991430199894172363" datatype="html"> <trans-unit id="7991430199894172363" datatype="html">
<source>Read the documentation about this setting</source> <source>Read the documentation about this setting</source>
@@ -563,7 +563,7 @@
<context context-type="sourcefile">src/app/components/admin/config/config.component.html</context> <context context-type="sourcefile">src/app/components/admin/config/config.component.html</context>
<context context-type="linenumber">30</context> <context context-type="linenumber">30</context>
</context-group> </context-group>
<target state="needs-translation">Read the documentation about this setting</target> <target state="translated">Prečítajte si dokumentáciu k tomuto nastaveniu.</target>
</trans-unit> </trans-unit>
<trans-unit id="7057826840809102816" datatype="html"> <trans-unit id="7057826840809102816" datatype="html">
<source>This value overrides <x id="INTERPOLATION" equiv-text="{{option.config_key}}"/>, which is set outside Paperless.</source> <source>This value overrides <x id="INTERPOLATION" equiv-text="{{option.config_key}}"/>, which is set outside Paperless.</source>
@@ -571,7 +571,7 @@
<context context-type="sourcefile">src/app/components/admin/config/config.component.html</context> <context context-type="sourcefile">src/app/components/admin/config/config.component.html</context>
<context context-type="linenumber">35</context> <context context-type="linenumber">35</context>
</context-group> </context-group>
<target state="needs-translation">This value overrides <x id="INTERPOLATION" equiv-text="{{option.config_key}}"/>, which is set outside Paperless.</target> <target state="translated">Táto hodnota prepíše <x id="INTERPOLATION" equiv-text="{{option.config_key}}"/>, ktorá je nastavená mimo Paperless.</target>
</trans-unit> </trans-unit>
<trans-unit id="7221396516204435584" datatype="html"> <trans-unit id="7221396516204435584" datatype="html">
<source><x id="INTERPOLATION" equiv-text="{{option.config_key}}"/> is set outside Paperless. Enter a value here to override it.</source> <source><x id="INTERPOLATION" equiv-text="{{option.config_key}}"/> is set outside Paperless. Enter a value here to override it.</source>
@@ -579,7 +579,7 @@
<context context-type="sourcefile">src/app/components/admin/config/config.component.html</context> <context context-type="sourcefile">src/app/components/admin/config/config.component.html</context>
<context context-type="linenumber">37</context> <context context-type="linenumber">37</context>
</context-group> </context-group>
<target state="needs-translation"><x id="INTERPOLATION" equiv-text="{{option.config_key}}"/> is set outside Paperless. Enter a value here to override it.</target> <target state="translated"><x id="INTERPOLATION" equiv-text="{{option.config_key}}"/> je nastavené mimo aplikácie Paperless. Zadajte sem hodnotu, ak chcete toto nastavenie prepísať.</target>
</trans-unit> </trans-unit>
<trans-unit id="8318849619178340389" datatype="html"> <trans-unit id="8318849619178340389" datatype="html">
<source>Use the externally configured value</source> <source>Use the externally configured value</source>
@@ -587,7 +587,7 @@
<context context-type="sourcefile">src/app/components/admin/config/config.component.html</context> <context context-type="sourcefile">src/app/components/admin/config/config.component.html</context>
<context context-type="linenumber">42</context> <context context-type="linenumber">42</context>
</context-group> </context-group>
<target state="needs-translation">Use the externally configured value</target> <target state="translated">Použite externe nakonfigurovanú hodnotu.</target>
</trans-unit> </trans-unit>
<trans-unit id="6032629623003430385" datatype="html"> <trans-unit id="6032629623003430385" datatype="html">
<source>Reset to external</source> <source>Reset to external</source>
@@ -595,7 +595,7 @@
<context context-type="sourcefile">src/app/components/admin/config/config.component.html</context> <context context-type="sourcefile">src/app/components/admin/config/config.component.html</context>
<context context-type="linenumber">43</context> <context context-type="linenumber">43</context>
</context-group> </context-group>
<target state="needs-translation">Reset to external</target> <target state="translated">Obnoviť na externé</target>
</trans-unit> </trans-unit>
<trans-unit id="7808756054397155068" datatype="html"> <trans-unit id="7808756054397155068" datatype="html">
<source>Reset</source> <source>Reset</source>
@@ -1271,7 +1271,7 @@
<context context-type="sourcefile">src/app/components/admin/settings/settings.component.html</context> <context context-type="sourcefile">src/app/components/admin/settings/settings.component.html</context>
<context context-type="linenumber">188</context> <context context-type="linenumber">188</context>
</context-group> </context-group>
<target state="needs-translation"> Update checking works by pinging the public GitHub API for the latest release to determine whether a new version is available. Actual updating of the app must still be performed manually. </target> <target state="translated">Kontrola aktualizácií funguje tak, že sa prostredníctvom verejného rozhrania GitHub API zisťuje najnovšie vydanie, čím sa overuje dostupnosť novej verzie. Samotnú aktualizáciu aplikácie je však stále nutné vykonať manuálne.</target>
</trans-unit> </trans-unit>
<trans-unit id="8416061320800650487" datatype="html"> <trans-unit id="8416061320800650487" datatype="html">
<source>No tracking data is collected by the app in any way.</source> <source>No tracking data is collected by the app in any way.</source>
@@ -1279,7 +1279,7 @@
<context context-type="sourcefile">src/app/components/admin/settings/settings.component.html</context> <context context-type="sourcefile">src/app/components/admin/settings/settings.component.html</context>
<context context-type="linenumber">191,192</context> <context context-type="linenumber">191,192</context>
</context-group> </context-group>
<target state="needs-translation">No tracking data is collected by the app in any way.</target> <target state="translated">Aplikácia žiadnym spôsobom nezhromažďuje žiadne údaje o sledovaní.</target>
</trans-unit> </trans-unit>
<trans-unit id="5775451530782446954" datatype="html"> <trans-unit id="5775451530782446954" datatype="html">
<source>Saved Views</source> <source>Saved Views</source>
@@ -1323,7 +1323,7 @@
<context context-type="sourcefile">src/app/components/admin/settings/settings.component.html</context> <context context-type="sourcefile">src/app/components/admin/settings/settings.component.html</context>
<context context-type="linenumber">201</context> <context context-type="linenumber">201</context>
</context-group> </context-group>
<target state="needs-translation">Show document counts in sidebar saved views</target> <target state="translated">Zobraziť počty dokumentov pri uložených zobrazeniach na bočnom paneli</target>
</trans-unit> </trans-unit>
<trans-unit id="8939587804990976924" datatype="html"> <trans-unit id="8939587804990976924" datatype="html">
<source>Items per page</source> <source>Items per page</source>
@@ -1387,7 +1387,7 @@
<context context-type="sourcefile">src/app/components/admin/settings/settings.component.html</context> <context context-type="sourcefile">src/app/components/admin/settings/settings.component.html</context>
<context context-type="linenumber">246,247</context> <context context-type="linenumber">246,247</context>
</context-group> </context-group>
<target state="needs-translation">Only applies to the Paperless-ngx PDF viewer.</target> <target state="translated">Vzťahuje sa len na prehliadač PDF v aplikácii Paperless-ngx.</target>
</trans-unit> </trans-unit>
<trans-unit id="2959590948110714366" datatype="html"> <trans-unit id="2959590948110714366" datatype="html">
<source>Automatically remove inbox tag(s) on save</source> <source>Automatically remove inbox tag(s) on save</source>
@@ -1395,7 +1395,7 @@
<context context-type="sourcefile">src/app/components/admin/settings/settings.component.html</context> <context context-type="sourcefile">src/app/components/admin/settings/settings.component.html</context>
<context context-type="linenumber">252</context> <context context-type="linenumber">252</context>
</context-group> </context-group>
<target state="needs-translation">Automatically remove inbox tag(s) on save</target> <target state="translated">Automaticky odstrániť štítky doručenej pošty pri uložení</target>
</trans-unit> </trans-unit>
<trans-unit id="1043449647727456069" datatype="html"> <trans-unit id="1043449647727456069" datatype="html">
<source>Automatically request suggestions for inbox documents</source> <source>Automatically request suggestions for inbox documents</source>
@@ -1403,7 +1403,7 @@
<context context-type="sourcefile">src/app/components/admin/settings/settings.component.html</context> <context context-type="sourcefile">src/app/components/admin/settings/settings.component.html</context>
<context context-type="linenumber">258</context> <context context-type="linenumber">258</context>
</context-group> </context-group>
<target state="needs-translation">Automatically request suggestions for inbox documents</target> <target state="translated">Automaticky vyžiadať návrhy pre dokumenty v doručenej pošte</target>
</trans-unit> </trans-unit>
<trans-unit id="460700039378563125" datatype="html"> <trans-unit id="460700039378563125" datatype="html">
<source>If un-checked, suggestions must be requested via the Suggest button.</source> <source>If un-checked, suggestions must be requested via the Suggest button.</source>
@@ -1411,7 +1411,7 @@
<context context-type="sourcefile">src/app/components/admin/settings/settings.component.html</context> <context context-type="sourcefile">src/app/components/admin/settings/settings.component.html</context>
<context context-type="linenumber">258</context> <context context-type="linenumber">258</context>
</context-group> </context-group>
<target state="needs-translation">If un-checked, suggestions must be requested via the Suggest button.</target> <target state="translated">Ak políčko nie je začiarknuté, o návrhy treba požiadať pomocou tlačidla „Navrhnúť“.</target>
</trans-unit> </trans-unit>
<trans-unit id="8793267604636304297" datatype="html"> <trans-unit id="8793267604636304297" datatype="html">
<source>Show document thumbnail during loading</source> <source>Show document thumbnail during loading</source>
@@ -1419,7 +1419,7 @@
<context context-type="sourcefile">src/app/components/admin/settings/settings.component.html</context> <context context-type="sourcefile">src/app/components/admin/settings/settings.component.html</context>
<context context-type="linenumber">264</context> <context context-type="linenumber">264</context>
</context-group> </context-group>
<target state="needs-translation">Show document thumbnail during loading</target> <target state="translated">Zobraziť miniatúru dokumentu počas načítavania</target>
</trans-unit> </trans-unit>
<trans-unit id="1783600598811723080" datatype="html"> <trans-unit id="1783600598811723080" datatype="html">
<source>Built-in fields to show:</source> <source>Built-in fields to show:</source>
@@ -1427,7 +1427,7 @@
<context context-type="sourcefile">src/app/components/admin/settings/settings.component.html</context> <context context-type="sourcefile">src/app/components/admin/settings/settings.component.html</context>
<context context-type="linenumber">270,271</context> <context context-type="linenumber">270,271</context>
</context-group> </context-group>
<target state="needs-translation">Built-in fields to show:</target> <target state="translated">Vstavané polia na zobrazenie:</target>
</trans-unit> </trans-unit>
<trans-unit id="3467966318201103991" datatype="html"> <trans-unit id="3467966318201103991" datatype="html">
<source>Uncheck fields to hide them on the document details page.</source> <source>Uncheck fields to hide them on the document details page.</source>
@@ -1435,7 +1435,7 @@
<context context-type="sourcefile">src/app/components/admin/settings/settings.component.html</context> <context context-type="sourcefile">src/app/components/admin/settings/settings.component.html</context>
<context context-type="linenumber">282,283</context> <context context-type="linenumber">282,283</context>
</context-group> </context-group>
<target state="needs-translation">Uncheck fields to hide them on the document details page.</target> <target state="translated">Zrušením zaškrtnutia políčok ich skryjete na stránke s podrobnosťami o dokumente.</target>
</trans-unit> </trans-unit>
<trans-unit id="8508424367627989968" datatype="html"> <trans-unit id="8508424367627989968" datatype="html">
<source>Bulk editing</source> <source>Bulk editing</source>
@@ -1483,7 +1483,7 @@
<context context-type="sourcefile">src/app/components/admin/settings/settings.component.html</context> <context context-type="sourcefile">src/app/components/admin/settings/settings.component.html</context>
<context context-type="linenumber">299,300</context> <context context-type="linenumber">299,300</context>
</context-group> </context-group>
<target state="needs-translation">Default editing mode</target> <target state="translated">Predvolený režim úprav</target>
</trans-unit> </trans-unit>
<trans-unit id="7273640930165035289" datatype="html"> <trans-unit id="7273640930165035289" datatype="html">
<source>Create new document(s)</source> <source>Create new document(s)</source>
@@ -1607,7 +1607,7 @@
<context context-type="sourcefile">src/app/components/admin/settings/settings.component.html</context> <context context-type="sourcefile">src/app/components/admin/settings/settings.component.html</context>
<context context-type="linenumber">329</context> <context context-type="linenumber">329</context>
</context-group> </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">Nastavenia sa pre tento používateľský účet vzťahujú na objekty (štítky, pravidlá pre poštu atď.) vytvorené prostredníctvom webového rozhrania. Tieto nastavenia sa nevzťahujú na dokumenty.</target>
</trans-unit> </trans-unit>
<trans-unit id="4292903881380648974" datatype="html"> <trans-unit id="4292903881380648974" datatype="html">
<source>Default Owner</source> <source>Default Owner</source>
@@ -2003,7 +2003,7 @@
<context context-type="sourcefile">src/app/components/document-detail/document-detail.component.html</context> <context context-type="sourcefile">src/app/components/document-detail/document-detail.component.html</context>
<context context-type="linenumber">99,100</context> <context context-type="linenumber">99,100</context>
</context-group> </context-group>
<target state="needs-translation">Share Links</target> <target state="translated">Odkazy pre zdieľanie</target>
</trans-unit> </trans-unit>
<trans-unit id="2889601918256567804" datatype="html"> <trans-unit id="2889601918256567804" datatype="html">
<source>Workflows</source> <source>Workflows</source>
@@ -2179,7 +2179,7 @@
<context context-type="sourcefile">src/app/components/admin/tasks/tasks.component.html</context> <context context-type="sourcefile">src/app/components/admin/tasks/tasks.component.html</context>
<context context-type="linenumber">4,5</context> <context context-type="linenumber">4,5</context>
</context-group> </context-group>
<target state="needs-translation">Tasks shows detailed information about document consumption and system tasks.</target> <target state="translated">Sekcia Úlohy zobrazuje podrobné informácie o spracovaní dokumentov a systémových úlohách.</target>
</trans-unit> </trans-unit>
<trans-unit id="103921551219467537" datatype="html"> <trans-unit id="103921551219467537" datatype="html">
<source>Clear selection</source> <source>Clear selection</source>
@@ -2319,7 +2319,7 @@
<context context-type="sourcefile">src/app/components/admin/tasks/tasks.component.html</context> <context context-type="sourcefile">src/app/components/admin/tasks/tasks.component.html</context>
<context context-type="linenumber">122</context> <context context-type="linenumber">122</context>
</context-group> </context-group>
<target state="needs-translation">{VAR_PLURAL, plural, =1 {1 task} other {<x id="INTERPOLATION"/> tasks}}</target> <target state="translated">{VAR_PLURAL, plural, =1 {1 task} other {<x id="INTERPOLATION"/> tasks}}</target>
</trans-unit> </trans-unit>
<trans-unit id="8953033926734869941" datatype="html"> <trans-unit id="8953033926734869941" datatype="html">
<source>Name</source> <source>Name</source>
@@ -2619,7 +2619,7 @@
<context context-type="sourcefile">src/app/components/admin/tasks/tasks.component.html</context> <context context-type="sourcefile">src/app/components/admin/tasks/tasks.component.html</context>
<context context-type="linenumber">207</context> <context context-type="linenumber">207</context>
</context-group> </context-group>
<target state="needs-translation">View task details</target> <target state="translated">Zobraziť podrobnosti úlohy</target>
</trans-unit> </trans-unit>
<trans-unit id="1536087519743707362" datatype="html"> <trans-unit id="1536087519743707362" datatype="html">
<source>Dismiss</source> <source>Dismiss</source>
@@ -2723,7 +2723,7 @@
<context context-type="sourcefile">src/app/components/admin/tasks/tasks.component.html</context> <context context-type="sourcefile">src/app/components/admin/tasks/tasks.component.html</context>
<context context-type="linenumber">285,287</context> <context context-type="linenumber">285,287</context>
</context-group> </context-group>
<target state="needs-translation">No tasks match the current filters.</target> <target state="translated">Žiadne úlohy nezodpovedajú aktuálnym filtrom.</target>
</trans-unit> </trans-unit>
<trans-unit id="2525230676386818985" datatype="html"> <trans-unit id="2525230676386818985" datatype="html">
<source>Result</source> <source>Result</source>
@@ -2755,7 +2755,7 @@
<context context-type="sourcefile">src/app/components/admin/tasks/tasks.component.ts</context> <context context-type="sourcefile">src/app/components/admin/tasks/tasks.component.ts</context>
<context context-type="linenumber">57</context> <context context-type="linenumber">57</context>
</context-group> </context-group>
<target state="needs-translation">Recently completed</target> <target state="translated">Nedávno dokončené</target>
</trans-unit> </trans-unit>
<trans-unit id="2936452645673957909" datatype="html"> <trans-unit id="2936452645673957909" datatype="html">
<source>Consume File</source> <source>Consume File</source>
@@ -2855,7 +2855,7 @@
<context context-type="sourcefile">src/app/components/admin/tasks/tasks.component.ts</context> <context context-type="sourcefile">src/app/components/admin/tasks/tasks.component.ts</context>
<context context-type="linenumber">104</context> <context context-type="linenumber">104</context>
</context-group> </context-group>
<target state="needs-translation">Apply AI Suggestions</target> <target state="translated">Použiť návrhy umelej inteligencie</target>
</trans-unit> </trans-unit>
<trans-unit id="9172233176401579786" datatype="html"> <trans-unit id="9172233176401579786" datatype="html">
<source>Scheduled</source> <source>Scheduled</source>
@@ -2999,7 +2999,7 @@
<context context-type="sourcefile">src/app/components/admin/tasks/tasks.component.ts</context> <context context-type="sourcefile">src/app/components/admin/tasks/tasks.component.ts</context>
<context context-type="linenumber">412</context> <context context-type="linenumber">412</context>
</context-group> </context-group>
<target state="needs-translation">Success. New document id <x id="PH" equiv-text="documentId"/> created</target> <target state="translated">Úspešné. Vytvorené nové ID dokumentu <x id="PH" equiv-text="documentId"/>.</target>
</trans-unit> </trans-unit>
<trans-unit id="8760066891202884337" datatype="html"> <trans-unit id="8760066891202884337" datatype="html">
<source>Duplicate of document #<x id="PH" equiv-text="duplicateOf"/></source> <source>Duplicate of document #<x id="PH" equiv-text="duplicateOf"/></source>
@@ -3011,7 +3011,7 @@
<context context-type="sourcefile">src/app/components/admin/tasks/tasks.component.ts</context> <context context-type="sourcefile">src/app/components/admin/tasks/tasks.component.ts</context>
<context context-type="linenumber">456</context> <context context-type="linenumber">456</context>
</context-group> </context-group>
<target state="needs-translation">Duplicate of document #<x id="PH" equiv-text="duplicateOf"/></target> <target state="translated">Kópia dokumentu č. <x id="PH" equiv-text="duplicateOf"/></target>
</trans-unit> </trans-unit>
<trans-unit id="3418677553313974490" datatype="html"> <trans-unit id="3418677553313974490" datatype="html">
<source>Trash</source> <source>Trash</source>
@@ -3035,7 +3035,7 @@
<context context-type="sourcefile">src/app/components/admin/trash/trash.component.html</context> <context context-type="sourcefile">src/app/components/admin/trash/trash.component.html</context>
<context context-type="linenumber">4,5</context> <context context-type="linenumber">4,5</context>
</context-group> </context-group>
<target state="needs-translation">Manage trashed documents that are pending deletion.</target> <target state="translated">Spravujte dokumenty v koši, ktoré čakajú na odstránenie.</target>
</trans-unit> </trans-unit>
<trans-unit id="3186604097120837257" datatype="html"> <trans-unit id="3186604097120837257" datatype="html">
<source>Restore selected</source> <source>Restore selected</source>
@@ -3083,7 +3083,7 @@
<context context-type="sourcefile">src/app/components/admin/trash/trash.component.html</context> <context context-type="sourcefile">src/app/components/admin/trash/trash.component.html</context>
<context context-type="linenumber">65,66</context> <context context-type="linenumber">65,66</context>
</context-group> </context-group>
<target state="needs-translation"><x id="INTERPOLATION" equiv-text="{{ getDaysRemaining(document) }}"/> days</target> <target state="translated"><x id="INTERPOLATION" equiv-text="{{ getDaysRemaining(document) }}"/> dni</target>
</trans-unit> </trans-unit>
<trans-unit id="6770769801335635194" datatype="html"> <trans-unit id="6770769801335635194" datatype="html">
<source>Restore</source> <source>Restore</source>
@@ -10741,7 +10741,7 @@
</context-group> </context-group>
<context-group purpose="location"> <context-group purpose="location">
<context context-type="sourcefile">src/app/components/document-list/document-list.component.ts</context> <context context-type="sourcefile">src/app/components/document-list/document-list.component.ts</context>
<context context-type="linenumber">348</context> <context context-type="linenumber">351</context>
</context-group> </context-group>
<context-group purpose="location"> <context-group purpose="location">
<context context-type="sourcefile">src/app/components/manage/document-attributes/document-attributes.component.html</context> <context context-type="sourcefile">src/app/components/manage/document-attributes/document-attributes.component.html</context>
@@ -10757,7 +10757,7 @@
</context-group> </context-group>
<context-group purpose="location"> <context-group purpose="location">
<context context-type="sourcefile">src/app/components/document-list/document-list.component.ts</context> <context context-type="sourcefile">src/app/components/document-list/document-list.component.ts</context>
<context context-type="linenumber">341</context> <context context-type="linenumber">344</context>
</context-group> </context-group>
<context-group purpose="location"> <context-group purpose="location">
<context context-type="sourcefile">src/app/components/manage/document-attributes/document-attributes.component.html</context> <context context-type="sourcefile">src/app/components/manage/document-attributes/document-attributes.component.html</context>
@@ -11041,7 +11041,7 @@
<source>Reset filters / selection</source> <source>Reset filters / selection</source>
<context-group purpose="location"> <context-group purpose="location">
<context context-type="sourcefile">src/app/components/document-list/document-list.component.ts</context> <context context-type="sourcefile">src/app/components/document-list/document-list.component.ts</context>
<context context-type="linenumber">329</context> <context context-type="linenumber">332</context>
</context-group> </context-group>
<target state="needs-translation">Reset filters / selection</target> <target state="needs-translation">Reset filters / selection</target>
</trans-unit> </trans-unit>
@@ -11049,7 +11049,7 @@
<source>Open first [selected] document</source> <source>Open first [selected] document</source>
<context-group purpose="location"> <context-group purpose="location">
<context context-type="sourcefile">src/app/components/document-list/document-list.component.ts</context> <context context-type="sourcefile">src/app/components/document-list/document-list.component.ts</context>
<context context-type="linenumber">357</context> <context context-type="linenumber">360</context>
</context-group> </context-group>
<target state="needs-translation">Open first [selected] document</target> <target state="needs-translation">Open first [selected] document</target>
</trans-unit> </trans-unit>
@@ -11057,7 +11057,7 @@
<source>Previous page</source> <source>Previous page</source>
<context-group purpose="location"> <context-group purpose="location">
<context context-type="sourcefile">src/app/components/document-list/document-list.component.ts</context> <context context-type="sourcefile">src/app/components/document-list/document-list.component.ts</context>
<context context-type="linenumber">373</context> <context context-type="linenumber">376</context>
</context-group> </context-group>
<target state="needs-translation">Previous page</target> <target state="needs-translation">Previous page</target>
</trans-unit> </trans-unit>
@@ -11065,7 +11065,7 @@
<source>Next page</source> <source>Next page</source>
<context-group purpose="location"> <context-group purpose="location">
<context context-type="sourcefile">src/app/components/document-list/document-list.component.ts</context> <context context-type="sourcefile">src/app/components/document-list/document-list.component.ts</context>
<context context-type="linenumber">385</context> <context context-type="linenumber">388</context>
</context-group> </context-group>
<target state="needs-translation">Next page</target> <target state="needs-translation">Next page</target>
</trans-unit> </trans-unit>
@@ -11073,7 +11073,7 @@
<source>View &quot;<x id="PH" equiv-text="this.list.activeSavedViewTitle"/>&quot; saved successfully.</source> <source>View &quot;<x id="PH" equiv-text="this.list.activeSavedViewTitle"/>&quot; saved successfully.</source>
<context-group purpose="location"> <context-group purpose="location">
<context context-type="sourcefile">src/app/components/document-list/document-list.component.ts</context> <context context-type="sourcefile">src/app/components/document-list/document-list.component.ts</context>
<context context-type="linenumber">419</context> <context context-type="linenumber">422</context>
</context-group> </context-group>
<target state="translated">Pohľad "<x id="PH" equiv-text="this.list.activeSavedViewTitle"/>" úspešne uložený.</target> <target state="translated">Pohľad "<x id="PH" equiv-text="this.list.activeSavedViewTitle"/>" úspešne uložený.</target>
</trans-unit> </trans-unit>
@@ -11081,7 +11081,7 @@
<source>Failed to save view &quot;<x id="PH" equiv-text="this.list.activeSavedViewTitle"/>&quot;.</source> <source>Failed to save view &quot;<x id="PH" equiv-text="this.list.activeSavedViewTitle"/>&quot;.</source>
<context-group purpose="location"> <context-group purpose="location">
<context context-type="sourcefile">src/app/components/document-list/document-list.component.ts</context> <context context-type="sourcefile">src/app/components/document-list/document-list.component.ts</context>
<context context-type="linenumber">425</context> <context context-type="linenumber">428</context>
</context-group> </context-group>
<target state="needs-translation">Failed to save view "<x id="PH" equiv-text="this.list.activeSavedViewTitle"/>".</target> <target state="needs-translation">Failed to save view "<x id="PH" equiv-text="this.list.activeSavedViewTitle"/>".</target>
</trans-unit> </trans-unit>
@@ -11089,7 +11089,7 @@
<source>View &quot;<x id="PH" equiv-text="savedView.name"/>&quot; created successfully.</source> <source>View &quot;<x id="PH" equiv-text="savedView.name"/>&quot; created successfully.</source>
<context-group purpose="location"> <context-group purpose="location">
<context context-type="sourcefile">src/app/components/document-list/document-list.component.ts</context> <context context-type="sourcefile">src/app/components/document-list/document-list.component.ts</context>
<context context-type="linenumber">494</context> <context context-type="linenumber">497</context>
</context-group> </context-group>
<target state="translated">Pohľad "<x id="PH" equiv-text="savedView.name"/>" úspešne vytvorený.</target> <target state="translated">Pohľad "<x id="PH" equiv-text="savedView.name"/>" úspešne vytvorený.</target>
</trans-unit> </trans-unit>
@@ -11097,7 +11097,7 @@
<source>View &quot;<x id="PH" equiv-text="savedView.name"/>&quot; created successfully, but could not update visibility settings.</source> <source>View &quot;<x id="PH" equiv-text="savedView.name"/>&quot; created successfully, but could not update visibility settings.</source>
<context-group purpose="location"> <context-group purpose="location">
<context context-type="sourcefile">src/app/components/document-list/document-list.component.ts</context> <context context-type="sourcefile">src/app/components/document-list/document-list.component.ts</context>
<context context-type="linenumber">500</context> <context context-type="linenumber">503</context>
</context-group> </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="needs-translation">View "<x id="PH" equiv-text="savedView.name"/>" created successfully, but could not update visibility settings.</target>
</trans-unit> </trans-unit>
@@ -13298,11 +13298,27 @@
</context-group> </context-group>
<target state="needs-translation">LLM Embedding Model</target> <target state="needs-translation">LLM Embedding Model</target>
</trans-unit> </trans-unit>
<trans-unit id="861068592166833023" datatype="html">
<source>LLM Embedding API Key</source>
<context-group purpose="location">
<context context-type="sourcefile">src/app/data/paperless-config.ts</context>
<context context-type="linenumber">358</context>
</context-group>
<target state="needs-translation">LLM Embedding API Key</target>
</trans-unit>
<trans-unit id="2929108042259892948" datatype="html">
<source>Used for embeddings when set, otherwise LLM API key is used.</source>
<context-group purpose="location">
<context context-type="sourcefile">src/app/data/paperless-config.ts</context>
<context context-type="linenumber">360</context>
</context-group>
<target state="needs-translation">Used for embeddings when set, otherwise LLM API key is used.</target>
</trans-unit>
<trans-unit id="3554114880473286122" datatype="html"> <trans-unit id="3554114880473286122" datatype="html">
<source>LLM Embedding Endpoint</source> <source>LLM Embedding Endpoint</source>
<context-group purpose="location"> <context-group purpose="location">
<context context-type="sourcefile">src/app/data/paperless-config.ts</context> <context context-type="sourcefile">src/app/data/paperless-config.ts</context>
<context context-type="linenumber">358</context> <context context-type="linenumber">366</context>
</context-group> </context-group>
<target state="needs-translation">LLM Embedding Endpoint</target> <target state="needs-translation">LLM Embedding Endpoint</target>
</trans-unit> </trans-unit>
@@ -13310,7 +13326,7 @@
<source>LLM Embedding Chunk Size</source> <source>LLM Embedding Chunk Size</source>
<context-group purpose="location"> <context-group purpose="location">
<context context-type="sourcefile">src/app/data/paperless-config.ts</context> <context context-type="sourcefile">src/app/data/paperless-config.ts</context>
<context context-type="linenumber">365</context> <context context-type="linenumber">373</context>
</context-group> </context-group>
<target state="needs-translation">LLM Embedding Chunk Size</target> <target state="needs-translation">LLM Embedding Chunk Size</target>
</trans-unit> </trans-unit>
@@ -13318,7 +13334,7 @@
<source>LLM Context Size</source> <source>LLM Context Size</source>
<context-group purpose="location"> <context-group purpose="location">
<context context-type="sourcefile">src/app/data/paperless-config.ts</context> <context context-type="sourcefile">src/app/data/paperless-config.ts</context>
<context context-type="linenumber">372</context> <context context-type="linenumber">380</context>
</context-group> </context-group>
<target state="needs-translation">LLM Context Size</target> <target state="needs-translation">LLM Context Size</target>
</trans-unit> </trans-unit>
@@ -13326,7 +13342,7 @@
<source>LLM Backend</source> <source>LLM Backend</source>
<context-group purpose="location"> <context-group purpose="location">
<context context-type="sourcefile">src/app/data/paperless-config.ts</context> <context context-type="sourcefile">src/app/data/paperless-config.ts</context>
<context context-type="linenumber">379</context> <context context-type="linenumber">387</context>
</context-group> </context-group>
<target state="needs-translation">LLM Backend</target> <target state="needs-translation">LLM Backend</target>
</trans-unit> </trans-unit>
@@ -13334,7 +13350,7 @@
<source>LLM Model</source> <source>LLM Model</source>
<context-group purpose="location"> <context-group purpose="location">
<context context-type="sourcefile">src/app/data/paperless-config.ts</context> <context context-type="sourcefile">src/app/data/paperless-config.ts</context>
<context context-type="linenumber">387</context> <context context-type="linenumber">395</context>
</context-group> </context-group>
<target state="needs-translation">LLM Model</target> <target state="needs-translation">LLM Model</target>
</trans-unit> </trans-unit>
@@ -13342,7 +13358,7 @@
<source>LLM API Key</source> <source>LLM API Key</source>
<context-group purpose="location"> <context-group purpose="location">
<context context-type="sourcefile">src/app/data/paperless-config.ts</context> <context context-type="sourcefile">src/app/data/paperless-config.ts</context>
<context context-type="linenumber">394</context> <context context-type="linenumber">402</context>
</context-group> </context-group>
<target state="needs-translation">LLM API Key</target> <target state="needs-translation">LLM API Key</target>
</trans-unit> </trans-unit>
@@ -13350,7 +13366,7 @@
<source>LLM Endpoint</source> <source>LLM Endpoint</source>
<context-group purpose="location"> <context-group purpose="location">
<context context-type="sourcefile">src/app/data/paperless-config.ts</context> <context context-type="sourcefile">src/app/data/paperless-config.ts</context>
<context context-type="linenumber">401</context> <context context-type="linenumber">409</context>
</context-group> </context-group>
<target state="needs-translation">LLM Endpoint</target> <target state="needs-translation">LLM Endpoint</target>
</trans-unit> </trans-unit>
@@ -13358,7 +13374,7 @@
<source>LLM Output Language</source> <source>LLM Output Language</source>
<context-group purpose="location"> <context-group purpose="location">
<context context-type="sourcefile">src/app/data/paperless-config.ts</context> <context context-type="sourcefile">src/app/data/paperless-config.ts</context>
<context context-type="linenumber">408</context> <context context-type="linenumber">416</context>
</context-group> </context-group>
<target state="needs-translation">LLM Output Language</target> <target state="needs-translation">LLM Output Language</target>
</trans-unit> </trans-unit>
@@ -13366,7 +13382,7 @@
<source>Language to use for generated AI suggestions. When unset, AI suggestions use the user&apos;s display language if explicitly set.</source> <source>Language to use for generated AI suggestions. When unset, AI suggestions use the user&apos;s display language if explicitly set.</source>
<context-group purpose="location"> <context-group purpose="location">
<context context-type="sourcefile">src/app/data/paperless-config.ts</context> <context context-type="sourcefile">src/app/data/paperless-config.ts</context>
<context context-type="linenumber">412</context> <context context-type="linenumber">420</context>
</context-group> </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="needs-translation">Language to use for generated AI suggestions. When unset, AI suggestions use the user's display language if explicitly set.</target>
</trans-unit> </trans-unit>
@@ -13374,7 +13390,7 @@
<source>LLM Request Timeout</source> <source>LLM Request Timeout</source>
<context-group purpose="location"> <context-group purpose="location">
<context context-type="sourcefile">src/app/data/paperless-config.ts</context> <context context-type="sourcefile">src/app/data/paperless-config.ts</context>
<context context-type="linenumber">416</context> <context context-type="linenumber">424</context>
</context-group> </context-group>
<target state="needs-translation">LLM Request Timeout</target> <target state="needs-translation">LLM Request Timeout</target>
</trans-unit> </trans-unit>
@@ -13382,7 +13398,7 @@
<source>Timeout in seconds for LLM requests.</source> <source>Timeout in seconds for LLM requests.</source>
<context-group purpose="location"> <context-group purpose="location">
<context context-type="sourcefile">src/app/data/paperless-config.ts</context> <context context-type="sourcefile">src/app/data/paperless-config.ts</context>
<context context-type="linenumber">420</context> <context context-type="linenumber">428</context>
</context-group> </context-group>
<target state="needs-translation">Timeout in seconds for LLM requests.</target> <target state="needs-translation">Timeout in seconds for LLM requests.</target>
</trans-unit> </trans-unit>
+37 -21
View File
@@ -10741,7 +10741,7 @@
</context-group> </context-group>
<context-group purpose="location"> <context-group purpose="location">
<context context-type="sourcefile">src/app/components/document-list/document-list.component.ts</context> <context context-type="sourcefile">src/app/components/document-list/document-list.component.ts</context>
<context context-type="linenumber">348</context> <context context-type="linenumber">351</context>
</context-group> </context-group>
<context-group purpose="location"> <context-group purpose="location">
<context context-type="sourcefile">src/app/components/manage/document-attributes/document-attributes.component.html</context> <context context-type="sourcefile">src/app/components/manage/document-attributes/document-attributes.component.html</context>
@@ -10757,7 +10757,7 @@
</context-group> </context-group>
<context-group purpose="location"> <context-group purpose="location">
<context context-type="sourcefile">src/app/components/document-list/document-list.component.ts</context> <context context-type="sourcefile">src/app/components/document-list/document-list.component.ts</context>
<context context-type="linenumber">341</context> <context context-type="linenumber">344</context>
</context-group> </context-group>
<context-group purpose="location"> <context-group purpose="location">
<context context-type="sourcefile">src/app/components/manage/document-attributes/document-attributes.component.html</context> <context context-type="sourcefile">src/app/components/manage/document-attributes/document-attributes.component.html</context>
@@ -11041,7 +11041,7 @@
<source>Reset filters / selection</source> <source>Reset filters / selection</source>
<context-group purpose="location"> <context-group purpose="location">
<context context-type="sourcefile">src/app/components/document-list/document-list.component.ts</context> <context context-type="sourcefile">src/app/components/document-list/document-list.component.ts</context>
<context context-type="linenumber">329</context> <context context-type="linenumber">332</context>
</context-group> </context-group>
<target state="translated">Ponastavi filtre / izbor</target> <target state="translated">Ponastavi filtre / izbor</target>
</trans-unit> </trans-unit>
@@ -11049,7 +11049,7 @@
<source>Open first [selected] document</source> <source>Open first [selected] document</source>
<context-group purpose="location"> <context-group purpose="location">
<context context-type="sourcefile">src/app/components/document-list/document-list.component.ts</context> <context context-type="sourcefile">src/app/components/document-list/document-list.component.ts</context>
<context context-type="linenumber">357</context> <context context-type="linenumber">360</context>
</context-group> </context-group>
<target state="translated">Odpri prvi [izbran] dokument</target> <target state="translated">Odpri prvi [izbran] dokument</target>
</trans-unit> </trans-unit>
@@ -11057,7 +11057,7 @@
<source>Previous page</source> <source>Previous page</source>
<context-group purpose="location"> <context-group purpose="location">
<context context-type="sourcefile">src/app/components/document-list/document-list.component.ts</context> <context context-type="sourcefile">src/app/components/document-list/document-list.component.ts</context>
<context context-type="linenumber">373</context> <context context-type="linenumber">376</context>
</context-group> </context-group>
<target state="translated">Prejšnja stran</target> <target state="translated">Prejšnja stran</target>
</trans-unit> </trans-unit>
@@ -11065,7 +11065,7 @@
<source>Next page</source> <source>Next page</source>
<context-group purpose="location"> <context-group purpose="location">
<context context-type="sourcefile">src/app/components/document-list/document-list.component.ts</context> <context context-type="sourcefile">src/app/components/document-list/document-list.component.ts</context>
<context context-type="linenumber">385</context> <context context-type="linenumber">388</context>
</context-group> </context-group>
<target state="translated">Naslednja stran</target> <target state="translated">Naslednja stran</target>
</trans-unit> </trans-unit>
@@ -11073,7 +11073,7 @@
<source>View &quot;<x id="PH" equiv-text="this.list.activeSavedViewTitle"/>&quot; saved successfully.</source> <source>View &quot;<x id="PH" equiv-text="this.list.activeSavedViewTitle"/>&quot; saved successfully.</source>
<context-group purpose="location"> <context-group purpose="location">
<context context-type="sourcefile">src/app/components/document-list/document-list.component.ts</context> <context context-type="sourcefile">src/app/components/document-list/document-list.component.ts</context>
<context context-type="linenumber">419</context> <context context-type="linenumber">422</context>
</context-group> </context-group>
<target state="translated">Pogled »<x id="PH" equiv-text="this.list.activeSavedViewTitle"/>" je uspešno shranjen.</target> <target state="translated">Pogled »<x id="PH" equiv-text="this.list.activeSavedViewTitle"/>" je uspešno shranjen.</target>
</trans-unit> </trans-unit>
@@ -11081,7 +11081,7 @@
<source>Failed to save view &quot;<x id="PH" equiv-text="this.list.activeSavedViewTitle"/>&quot;.</source> <source>Failed to save view &quot;<x id="PH" equiv-text="this.list.activeSavedViewTitle"/>&quot;.</source>
<context-group purpose="location"> <context-group purpose="location">
<context context-type="sourcefile">src/app/components/document-list/document-list.component.ts</context> <context context-type="sourcefile">src/app/components/document-list/document-list.component.ts</context>
<context context-type="linenumber">425</context> <context context-type="linenumber">428</context>
</context-group> </context-group>
<target state="translated">Shranjevanje pogleda "<x id="PH" equiv-text="this.list.activeSavedViewTitle"/>" ni uspelo.</target> <target state="translated">Shranjevanje pogleda "<x id="PH" equiv-text="this.list.activeSavedViewTitle"/>" ni uspelo.</target>
</trans-unit> </trans-unit>
@@ -11089,7 +11089,7 @@
<source>View &quot;<x id="PH" equiv-text="savedView.name"/>&quot; created successfully.</source> <source>View &quot;<x id="PH" equiv-text="savedView.name"/>&quot; created successfully.</source>
<context-group purpose="location"> <context-group purpose="location">
<context context-type="sourcefile">src/app/components/document-list/document-list.component.ts</context> <context context-type="sourcefile">src/app/components/document-list/document-list.component.ts</context>
<context context-type="linenumber">494</context> <context context-type="linenumber">497</context>
</context-group> </context-group>
<target state="translated">Pogled »<x id="PH" equiv-text="savedView.name"/>" je bil uspešno ustvarjen.</target> <target state="translated">Pogled »<x id="PH" equiv-text="savedView.name"/>" je bil uspešno ustvarjen.</target>
</trans-unit> </trans-unit>
@@ -11097,7 +11097,7 @@
<source>View &quot;<x id="PH" equiv-text="savedView.name"/>&quot; created successfully, but could not update visibility settings.</source> <source>View &quot;<x id="PH" equiv-text="savedView.name"/>&quot; created successfully, but could not update visibility settings.</source>
<context-group purpose="location"> <context-group purpose="location">
<context context-type="sourcefile">src/app/components/document-list/document-list.component.ts</context> <context context-type="sourcefile">src/app/components/document-list/document-list.component.ts</context>
<context context-type="linenumber">500</context> <context context-type="linenumber">503</context>
</context-group> </context-group>
<target state="translated">Pogled »<x id="PH" equiv-text="savedView.name"/>« je bil uspešno ustvarjen, vendar nastavitev vidnosti ni bilo mogoče posodobiti.</target> <target state="translated">Pogled »<x id="PH" equiv-text="savedView.name"/>« je bil uspešno ustvarjen, vendar nastavitev vidnosti ni bilo mogoče posodobiti.</target>
</trans-unit> </trans-unit>
@@ -13298,11 +13298,27 @@
</context-group> </context-group>
<target state="translated">Model vdelave LLM</target> <target state="translated">Model vdelave LLM</target>
</trans-unit> </trans-unit>
<trans-unit id="861068592166833023" datatype="html">
<source>LLM Embedding API Key</source>
<context-group purpose="location">
<context context-type="sourcefile">src/app/data/paperless-config.ts</context>
<context context-type="linenumber">358</context>
</context-group>
<target state="translated">Ključ API za vdelave LLM</target>
</trans-unit>
<trans-unit id="2929108042259892948" datatype="html">
<source>Used for embeddings when set, otherwise LLM API key is used.</source>
<context-group purpose="location">
<context context-type="sourcefile">src/app/data/paperless-config.ts</context>
<context context-type="linenumber">360</context>
</context-group>
<target state="translated">Če je nastavljeno, se uporablja za vdelave; v nasprotnem primeru se uporabi ključ API-ja za LLM.</target>
</trans-unit>
<trans-unit id="3554114880473286122" datatype="html"> <trans-unit id="3554114880473286122" datatype="html">
<source>LLM Embedding Endpoint</source> <source>LLM Embedding Endpoint</source>
<context-group purpose="location"> <context-group purpose="location">
<context context-type="sourcefile">src/app/data/paperless-config.ts</context> <context context-type="sourcefile">src/app/data/paperless-config.ts</context>
<context context-type="linenumber">358</context> <context context-type="linenumber">366</context>
</context-group> </context-group>
<target state="translated">Končna točka vdelave LLM</target> <target state="translated">Končna točka vdelave LLM</target>
</trans-unit> </trans-unit>
@@ -13310,7 +13326,7 @@
<source>LLM Embedding Chunk Size</source> <source>LLM Embedding Chunk Size</source>
<context-group purpose="location"> <context-group purpose="location">
<context context-type="sourcefile">src/app/data/paperless-config.ts</context> <context context-type="sourcefile">src/app/data/paperless-config.ts</context>
<context context-type="linenumber">365</context> <context context-type="linenumber">373</context>
</context-group> </context-group>
<target state="translated">Velikost vdelanega kosa LLM</target> <target state="translated">Velikost vdelanega kosa LLM</target>
</trans-unit> </trans-unit>
@@ -13318,7 +13334,7 @@
<source>LLM Context Size</source> <source>LLM Context Size</source>
<context-group purpose="location"> <context-group purpose="location">
<context context-type="sourcefile">src/app/data/paperless-config.ts</context> <context context-type="sourcefile">src/app/data/paperless-config.ts</context>
<context context-type="linenumber">372</context> <context context-type="linenumber">380</context>
</context-group> </context-group>
<target state="translated">Velikost konteksta LLM</target> <target state="translated">Velikost konteksta LLM</target>
</trans-unit> </trans-unit>
@@ -13326,7 +13342,7 @@
<source>LLM Backend</source> <source>LLM Backend</source>
<context-group purpose="location"> <context-group purpose="location">
<context context-type="sourcefile">src/app/data/paperless-config.ts</context> <context context-type="sourcefile">src/app/data/paperless-config.ts</context>
<context context-type="linenumber">379</context> <context context-type="linenumber">387</context>
</context-group> </context-group>
<target state="translated">Zaledni sistem za LLM</target> <target state="translated">Zaledni sistem za LLM</target>
</trans-unit> </trans-unit>
@@ -13334,7 +13350,7 @@
<source>LLM Model</source> <source>LLM Model</source>
<context-group purpose="location"> <context-group purpose="location">
<context context-type="sourcefile">src/app/data/paperless-config.ts</context> <context context-type="sourcefile">src/app/data/paperless-config.ts</context>
<context context-type="linenumber">387</context> <context context-type="linenumber">395</context>
</context-group> </context-group>
<target state="translated">Model LLM</target> <target state="translated">Model LLM</target>
</trans-unit> </trans-unit>
@@ -13342,7 +13358,7 @@
<source>LLM API Key</source> <source>LLM API Key</source>
<context-group purpose="location"> <context-group purpose="location">
<context context-type="sourcefile">src/app/data/paperless-config.ts</context> <context context-type="sourcefile">src/app/data/paperless-config.ts</context>
<context context-type="linenumber">394</context> <context context-type="linenumber">402</context>
</context-group> </context-group>
<target state="translated">Ključ API-ja LLM</target> <target state="translated">Ključ API-ja LLM</target>
</trans-unit> </trans-unit>
@@ -13350,7 +13366,7 @@
<source>LLM Endpoint</source> <source>LLM Endpoint</source>
<context-group purpose="location"> <context-group purpose="location">
<context context-type="sourcefile">src/app/data/paperless-config.ts</context> <context context-type="sourcefile">src/app/data/paperless-config.ts</context>
<context context-type="linenumber">401</context> <context context-type="linenumber">409</context>
</context-group> </context-group>
<target state="translated">Končna točka LLM</target> <target state="translated">Končna točka LLM</target>
</trans-unit> </trans-unit>
@@ -13358,7 +13374,7 @@
<source>LLM Output Language</source> <source>LLM Output Language</source>
<context-group purpose="location"> <context-group purpose="location">
<context context-type="sourcefile">src/app/data/paperless-config.ts</context> <context context-type="sourcefile">src/app/data/paperless-config.ts</context>
<context context-type="linenumber">408</context> <context context-type="linenumber">416</context>
</context-group> </context-group>
<target state="translated">Izhodni jezik LLM</target> <target state="translated">Izhodni jezik LLM</target>
</trans-unit> </trans-unit>
@@ -13366,7 +13382,7 @@
<source>Language to use for generated AI suggestions. When unset, AI suggestions use the user&apos;s display language if explicitly set.</source> <source>Language to use for generated AI suggestions. When unset, AI suggestions use the user&apos;s display language if explicitly set.</source>
<context-group purpose="location"> <context-group purpose="location">
<context context-type="sourcefile">src/app/data/paperless-config.ts</context> <context context-type="sourcefile">src/app/data/paperless-config.ts</context>
<context context-type="linenumber">412</context> <context context-type="linenumber">420</context>
</context-group> </context-group>
<target state="translated">Jezik, ki se uporablja za ustvarjene predloge umetne inteligence. Če ni nastavljen, predlogi umetne inteligence uporabljajo uporabnikov jezik prikaza, če je izrecno nastavljen.</target> <target state="translated">Jezik, ki se uporablja za ustvarjene predloge umetne inteligence. Če ni nastavljen, predlogi umetne inteligence uporabljajo uporabnikov jezik prikaza, če je izrecno nastavljen.</target>
</trans-unit> </trans-unit>
@@ -13374,7 +13390,7 @@
<source>LLM Request Timeout</source> <source>LLM Request Timeout</source>
<context-group purpose="location"> <context-group purpose="location">
<context context-type="sourcefile">src/app/data/paperless-config.ts</context> <context context-type="sourcefile">src/app/data/paperless-config.ts</context>
<context context-type="linenumber">416</context> <context context-type="linenumber">424</context>
</context-group> </context-group>
<target state="translated">Časovna omejitev zahteve LLM</target> <target state="translated">Časovna omejitev zahteve LLM</target>
</trans-unit> </trans-unit>
@@ -13382,7 +13398,7 @@
<source>Timeout in seconds for LLM requests.</source> <source>Timeout in seconds for LLM requests.</source>
<context-group purpose="location"> <context-group purpose="location">
<context context-type="sourcefile">src/app/data/paperless-config.ts</context> <context context-type="sourcefile">src/app/data/paperless-config.ts</context>
<context context-type="linenumber">420</context> <context context-type="linenumber">428</context>
</context-group> </context-group>
<target state="translated">Časovna omejitev v sekundah za zahteve LLM.</target> <target state="translated">Časovna omejitev v sekundah za zahteve LLM.</target>
</trans-unit> </trans-unit>
+37 -21
View File
@@ -10741,7 +10741,7 @@
</context-group> </context-group>
<context-group purpose="location"> <context-group purpose="location">
<context context-type="sourcefile">src/app/components/document-list/document-list.component.ts</context> <context context-type="sourcefile">src/app/components/document-list/document-list.component.ts</context>
<context context-type="linenumber">348</context> <context context-type="linenumber">351</context>
</context-group> </context-group>
<context-group purpose="location"> <context-group purpose="location">
<context context-type="sourcefile">src/app/components/manage/document-attributes/document-attributes.component.html</context> <context context-type="sourcefile">src/app/components/manage/document-attributes/document-attributes.component.html</context>
@@ -10757,7 +10757,7 @@
</context-group> </context-group>
<context-group purpose="location"> <context-group purpose="location">
<context context-type="sourcefile">src/app/components/document-list/document-list.component.ts</context> <context context-type="sourcefile">src/app/components/document-list/document-list.component.ts</context>
<context context-type="linenumber">341</context> <context context-type="linenumber">344</context>
</context-group> </context-group>
<context-group purpose="location"> <context-group purpose="location">
<context context-type="sourcefile">src/app/components/manage/document-attributes/document-attributes.component.html</context> <context context-type="sourcefile">src/app/components/manage/document-attributes/document-attributes.component.html</context>
@@ -11041,7 +11041,7 @@
<source>Reset filters / selection</source> <source>Reset filters / selection</source>
<context-group purpose="location"> <context-group purpose="location">
<context context-type="sourcefile">src/app/components/document-list/document-list.component.ts</context> <context context-type="sourcefile">src/app/components/document-list/document-list.component.ts</context>
<context context-type="linenumber">329</context> <context context-type="linenumber">332</context>
</context-group> </context-group>
<target state="translated">Rivendos filters / selection</target> <target state="translated">Rivendos filters / selection</target>
</trans-unit> </trans-unit>
@@ -11049,7 +11049,7 @@
<source>Open first [selected] document</source> <source>Open first [selected] document</source>
<context-group purpose="location"> <context-group purpose="location">
<context context-type="sourcefile">src/app/components/document-list/document-list.component.ts</context> <context context-type="sourcefile">src/app/components/document-list/document-list.component.ts</context>
<context context-type="linenumber">357</context> <context context-type="linenumber">360</context>
</context-group> </context-group>
<target state="translated">Hap first [selected] dokument</target> <target state="translated">Hap first [selected] dokument</target>
</trans-unit> </trans-unit>
@@ -11057,7 +11057,7 @@
<source>Previous page</source> <source>Previous page</source>
<context-group purpose="location"> <context-group purpose="location">
<context context-type="sourcefile">src/app/components/document-list/document-list.component.ts</context> <context context-type="sourcefile">src/app/components/document-list/document-list.component.ts</context>
<context context-type="linenumber">373</context> <context context-type="linenumber">376</context>
</context-group> </context-group>
<target state="translated">Previous faqe</target> <target state="translated">Previous faqe</target>
</trans-unit> </trans-unit>
@@ -11065,7 +11065,7 @@
<source>Next page</source> <source>Next page</source>
<context-group purpose="location"> <context-group purpose="location">
<context context-type="sourcefile">src/app/components/document-list/document-list.component.ts</context> <context context-type="sourcefile">src/app/components/document-list/document-list.component.ts</context>
<context context-type="linenumber">385</context> <context context-type="linenumber">388</context>
</context-group> </context-group>
<target state="translated">Next faqe</target> <target state="translated">Next faqe</target>
</trans-unit> </trans-unit>
@@ -11073,7 +11073,7 @@
<source>View &quot;<x id="PH" equiv-text="this.list.activeSavedViewTitle"/>&quot; saved successfully.</source> <source>View &quot;<x id="PH" equiv-text="this.list.activeSavedViewTitle"/>&quot; saved successfully.</source>
<context-group purpose="location"> <context-group purpose="location">
<context context-type="sourcefile">src/app/components/document-list/document-list.component.ts</context> <context context-type="sourcefile">src/app/components/document-list/document-list.component.ts</context>
<context context-type="linenumber">419</context> <context context-type="linenumber">422</context>
</context-group> </context-group>
<target state="translated">Pamje "<x id="PH" equiv-text="this.list.activeSavedViewTitle"/>" saved successfully.</target> <target state="translated">Pamje "<x id="PH" equiv-text="this.list.activeSavedViewTitle"/>" saved successfully.</target>
</trans-unit> </trans-unit>
@@ -11081,7 +11081,7 @@
<source>Failed to save view &quot;<x id="PH" equiv-text="this.list.activeSavedViewTitle"/>&quot;.</source> <source>Failed to save view &quot;<x id="PH" equiv-text="this.list.activeSavedViewTitle"/>&quot;.</source>
<context-group purpose="location"> <context-group purpose="location">
<context context-type="sourcefile">src/app/components/document-list/document-list.component.ts</context> <context context-type="sourcefile">src/app/components/document-list/document-list.component.ts</context>
<context context-type="linenumber">425</context> <context context-type="linenumber">428</context>
</context-group> </context-group>
<target state="translated">Dështoi të save pamje "<x id="PH" equiv-text="this.list.activeSavedViewTitle"/>".</target> <target state="translated">Dështoi të save pamje "<x id="PH" equiv-text="this.list.activeSavedViewTitle"/>".</target>
</trans-unit> </trans-unit>
@@ -11089,7 +11089,7 @@
<source>View &quot;<x id="PH" equiv-text="savedView.name"/>&quot; created successfully.</source> <source>View &quot;<x id="PH" equiv-text="savedView.name"/>&quot; created successfully.</source>
<context-group purpose="location"> <context-group purpose="location">
<context context-type="sourcefile">src/app/components/document-list/document-list.component.ts</context> <context context-type="sourcefile">src/app/components/document-list/document-list.component.ts</context>
<context context-type="linenumber">494</context> <context context-type="linenumber">497</context>
</context-group> </context-group>
<target state="translated">Pamje "<x id="PH" equiv-text="savedView.name"/>" created successfully.</target> <target state="translated">Pamje "<x id="PH" equiv-text="savedView.name"/>" created successfully.</target>
</trans-unit> </trans-unit>
@@ -11097,7 +11097,7 @@
<source>View &quot;<x id="PH" equiv-text="savedView.name"/>&quot; created successfully, but could not update visibility settings.</source> <source>View &quot;<x id="PH" equiv-text="savedView.name"/>&quot; created successfully, but could not update visibility settings.</source>
<context-group purpose="location"> <context-group purpose="location">
<context context-type="sourcefile">src/app/components/document-list/document-list.component.ts</context> <context context-type="sourcefile">src/app/components/document-list/document-list.component.ts</context>
<context context-type="linenumber">500</context> <context context-type="linenumber">503</context>
</context-group> </context-group>
<target state="translated">Pamje "<x id="PH" equiv-text="savedView.name"/>" created successfully, but could not update visibility cilësime.</target> <target state="translated">Pamje "<x id="PH" equiv-text="savedView.name"/>" created successfully, but could not update visibility cilësime.</target>
</trans-unit> </trans-unit>
@@ -13298,11 +13298,27 @@
</context-group> </context-group>
<target state="translated">Modeli i embedding LLM</target> <target state="translated">Modeli i embedding LLM</target>
</trans-unit> </trans-unit>
<trans-unit id="861068592166833023" datatype="html">
<source>LLM Embedding API Key</source>
<context-group purpose="location">
<context context-type="sourcefile">src/app/data/paperless-config.ts</context>
<context context-type="linenumber">358</context>
</context-group>
<target state="needs-translation">LLM Embedding API Key</target>
</trans-unit>
<trans-unit id="2929108042259892948" datatype="html">
<source>Used for embeddings when set, otherwise LLM API key is used.</source>
<context-group purpose="location">
<context context-type="sourcefile">src/app/data/paperless-config.ts</context>
<context context-type="linenumber">360</context>
</context-group>
<target state="needs-translation">Used for embeddings when set, otherwise LLM API key is used.</target>
</trans-unit>
<trans-unit id="3554114880473286122" datatype="html"> <trans-unit id="3554114880473286122" datatype="html">
<source>LLM Embedding Endpoint</source> <source>LLM Embedding Endpoint</source>
<context-group purpose="location"> <context-group purpose="location">
<context context-type="sourcefile">src/app/data/paperless-config.ts</context> <context context-type="sourcefile">src/app/data/paperless-config.ts</context>
<context context-type="linenumber">358</context> <context context-type="linenumber">366</context>
</context-group> </context-group>
<target state="translated">Endpoint-i i embedding LLM</target> <target state="translated">Endpoint-i i embedding LLM</target>
</trans-unit> </trans-unit>
@@ -13310,7 +13326,7 @@
<source>LLM Embedding Chunk Size</source> <source>LLM Embedding Chunk Size</source>
<context-group purpose="location"> <context-group purpose="location">
<context context-type="sourcefile">src/app/data/paperless-config.ts</context> <context context-type="sourcefile">src/app/data/paperless-config.ts</context>
<context context-type="linenumber">365</context> <context context-type="linenumber">373</context>
</context-group> </context-group>
<target state="translated">Madhësia e copës për embedding LLM</target> <target state="translated">Madhësia e copës për embedding LLM</target>
</trans-unit> </trans-unit>
@@ -13318,7 +13334,7 @@
<source>LLM Context Size</source> <source>LLM Context Size</source>
<context-group purpose="location"> <context-group purpose="location">
<context context-type="sourcefile">src/app/data/paperless-config.ts</context> <context context-type="sourcefile">src/app/data/paperless-config.ts</context>
<context context-type="linenumber">372</context> <context context-type="linenumber">380</context>
</context-group> </context-group>
<target state="translated">Madhësia e kontekstit LLM</target> <target state="translated">Madhësia e kontekstit LLM</target>
</trans-unit> </trans-unit>
@@ -13326,7 +13342,7 @@
<source>LLM Backend</source> <source>LLM Backend</source>
<context-group purpose="location"> <context-group purpose="location">
<context context-type="sourcefile">src/app/data/paperless-config.ts</context> <context context-type="sourcefile">src/app/data/paperless-config.ts</context>
<context context-type="linenumber">379</context> <context context-type="linenumber">387</context>
</context-group> </context-group>
<target state="translated">Backend-i LLM</target> <target state="translated">Backend-i LLM</target>
</trans-unit> </trans-unit>
@@ -13334,7 +13350,7 @@
<source>LLM Model</source> <source>LLM Model</source>
<context-group purpose="location"> <context-group purpose="location">
<context context-type="sourcefile">src/app/data/paperless-config.ts</context> <context context-type="sourcefile">src/app/data/paperless-config.ts</context>
<context context-type="linenumber">387</context> <context context-type="linenumber">395</context>
</context-group> </context-group>
<target state="translated">Modeli LLM</target> <target state="translated">Modeli LLM</target>
</trans-unit> </trans-unit>
@@ -13342,7 +13358,7 @@
<source>LLM API Key</source> <source>LLM API Key</source>
<context-group purpose="location"> <context-group purpose="location">
<context context-type="sourcefile">src/app/data/paperless-config.ts</context> <context context-type="sourcefile">src/app/data/paperless-config.ts</context>
<context context-type="linenumber">394</context> <context context-type="linenumber">402</context>
</context-group> </context-group>
<target state="translated">Çelësi API i LLM</target> <target state="translated">Çelësi API i LLM</target>
</trans-unit> </trans-unit>
@@ -13350,7 +13366,7 @@
<source>LLM Endpoint</source> <source>LLM Endpoint</source>
<context-group purpose="location"> <context-group purpose="location">
<context context-type="sourcefile">src/app/data/paperless-config.ts</context> <context context-type="sourcefile">src/app/data/paperless-config.ts</context>
<context context-type="linenumber">401</context> <context context-type="linenumber">409</context>
</context-group> </context-group>
<target state="translated">Endpoint-i LLM</target> <target state="translated">Endpoint-i LLM</target>
</trans-unit> </trans-unit>
@@ -13358,7 +13374,7 @@
<source>LLM Output Language</source> <source>LLM Output Language</source>
<context-group purpose="location"> <context-group purpose="location">
<context context-type="sourcefile">src/app/data/paperless-config.ts</context> <context context-type="sourcefile">src/app/data/paperless-config.ts</context>
<context context-type="linenumber">408</context> <context context-type="linenumber">416</context>
</context-group> </context-group>
<target state="translated">LLM Output Gjuha</target> <target state="translated">LLM Output Gjuha</target>
</trans-unit> </trans-unit>
@@ -13366,7 +13382,7 @@
<source>Language to use for generated AI suggestions. When unset, AI suggestions use the user&apos;s display language if explicitly set.</source> <source>Language to use for generated AI suggestions. When unset, AI suggestions use the user&apos;s display language if explicitly set.</source>
<context-group purpose="location"> <context-group purpose="location">
<context context-type="sourcefile">src/app/data/paperless-config.ts</context> <context context-type="sourcefile">src/app/data/paperless-config.ts</context>
<context context-type="linenumber">412</context> <context context-type="linenumber">420</context>
</context-group> </context-group>
<target state="translated">Gjuha to use for generated AI suggestions. When unset, AI suggestions use the përdorues's display language if explicitly set.</target> <target state="translated">Gjuha to use for generated AI suggestions. When unset, AI suggestions use the përdorues's display language if explicitly set.</target>
</trans-unit> </trans-unit>
@@ -13374,7 +13390,7 @@
<source>LLM Request Timeout</source> <source>LLM Request Timeout</source>
<context-group purpose="location"> <context-group purpose="location">
<context context-type="sourcefile">src/app/data/paperless-config.ts</context> <context context-type="sourcefile">src/app/data/paperless-config.ts</context>
<context context-type="linenumber">416</context> <context context-type="linenumber">424</context>
</context-group> </context-group>
<target state="translated">Koha limit e kërkesës LLM</target> <target state="translated">Koha limit e kërkesës LLM</target>
</trans-unit> </trans-unit>
@@ -13382,7 +13398,7 @@
<source>Timeout in seconds for LLM requests.</source> <source>Timeout in seconds for LLM requests.</source>
<context-group purpose="location"> <context-group purpose="location">
<context context-type="sourcefile">src/app/data/paperless-config.ts</context> <context context-type="sourcefile">src/app/data/paperless-config.ts</context>
<context context-type="linenumber">420</context> <context context-type="linenumber">428</context>
</context-group> </context-group>
<target state="translated">Koha limit në sekonda për kërkesat LLM.</target> <target state="translated">Koha limit në sekonda për kërkesat LLM.</target>
</trans-unit> </trans-unit>
+37 -21
View File
@@ -10742,7 +10742,7 @@
</context-group> </context-group>
<context-group purpose="location"> <context-group purpose="location">
<context context-type="sourcefile">src/app/components/document-list/document-list.component.ts</context> <context context-type="sourcefile">src/app/components/document-list/document-list.component.ts</context>
<context context-type="linenumber">348</context> <context context-type="linenumber">351</context>
</context-group> </context-group>
<context-group purpose="location"> <context-group purpose="location">
<context context-type="sourcefile">src/app/components/manage/document-attributes/document-attributes.component.html</context> <context context-type="sourcefile">src/app/components/manage/document-attributes/document-attributes.component.html</context>
@@ -10758,7 +10758,7 @@
</context-group> </context-group>
<context-group purpose="location"> <context-group purpose="location">
<context context-type="sourcefile">src/app/components/document-list/document-list.component.ts</context> <context context-type="sourcefile">src/app/components/document-list/document-list.component.ts</context>
<context context-type="linenumber">341</context> <context context-type="linenumber">344</context>
</context-group> </context-group>
<context-group purpose="location"> <context-group purpose="location">
<context context-type="sourcefile">src/app/components/manage/document-attributes/document-attributes.component.html</context> <context context-type="sourcefile">src/app/components/manage/document-attributes/document-attributes.component.html</context>
@@ -11042,7 +11042,7 @@
<source>Reset filters / selection</source> <source>Reset filters / selection</source>
<context-group purpose="location"> <context-group purpose="location">
<context context-type="sourcefile">src/app/components/document-list/document-list.component.ts</context> <context context-type="sourcefile">src/app/components/document-list/document-list.component.ts</context>
<context context-type="linenumber">329</context> <context context-type="linenumber">332</context>
</context-group> </context-group>
<target state="translated">Resetuj filtere / selekciju</target> <target state="translated">Resetuj filtere / selekciju</target>
</trans-unit> </trans-unit>
@@ -11050,7 +11050,7 @@
<source>Open first [selected] document</source> <source>Open first [selected] document</source>
<context-group purpose="location"> <context-group purpose="location">
<context context-type="sourcefile">src/app/components/document-list/document-list.component.ts</context> <context context-type="sourcefile">src/app/components/document-list/document-list.component.ts</context>
<context context-type="linenumber">357</context> <context context-type="linenumber">360</context>
</context-group> </context-group>
<target state="translated">Otvorite prvi [selected] dokument</target> <target state="translated">Otvorite prvi [selected] dokument</target>
</trans-unit> </trans-unit>
@@ -11058,7 +11058,7 @@
<source>Previous page</source> <source>Previous page</source>
<context-group purpose="location"> <context-group purpose="location">
<context context-type="sourcefile">src/app/components/document-list/document-list.component.ts</context> <context context-type="sourcefile">src/app/components/document-list/document-list.component.ts</context>
<context context-type="linenumber">373</context> <context context-type="linenumber">376</context>
</context-group> </context-group>
<target state="translated">Prethodna stranica</target> <target state="translated">Prethodna stranica</target>
</trans-unit> </trans-unit>
@@ -11066,7 +11066,7 @@
<source>Next page</source> <source>Next page</source>
<context-group purpose="location"> <context-group purpose="location">
<context context-type="sourcefile">src/app/components/document-list/document-list.component.ts</context> <context context-type="sourcefile">src/app/components/document-list/document-list.component.ts</context>
<context context-type="linenumber">385</context> <context context-type="linenumber">388</context>
</context-group> </context-group>
<target state="translated">Sledeća stranica</target> <target state="translated">Sledeća stranica</target>
</trans-unit> </trans-unit>
@@ -11074,7 +11074,7 @@
<source>View &quot;<x id="PH" equiv-text="this.list.activeSavedViewTitle"/>&quot; saved successfully.</source> <source>View &quot;<x id="PH" equiv-text="this.list.activeSavedViewTitle"/>&quot; saved successfully.</source>
<context-group purpose="location"> <context-group purpose="location">
<context context-type="sourcefile">src/app/components/document-list/document-list.component.ts</context> <context context-type="sourcefile">src/app/components/document-list/document-list.component.ts</context>
<context context-type="linenumber">419</context> <context context-type="linenumber">422</context>
</context-group> </context-group>
<target state="translated">Prikaz "<x id="PH" equiv-text="this.list.activeSavedViewTitle"/>" je uspešno sačuvan.</target> <target state="translated">Prikaz "<x id="PH" equiv-text="this.list.activeSavedViewTitle"/>" je uspešno sačuvan.</target>
</trans-unit> </trans-unit>
@@ -11082,7 +11082,7 @@
<source>Failed to save view &quot;<x id="PH" equiv-text="this.list.activeSavedViewTitle"/>&quot;.</source> <source>Failed to save view &quot;<x id="PH" equiv-text="this.list.activeSavedViewTitle"/>&quot;.</source>
<context-group purpose="location"> <context-group purpose="location">
<context context-type="sourcefile">src/app/components/document-list/document-list.component.ts</context> <context context-type="sourcefile">src/app/components/document-list/document-list.component.ts</context>
<context context-type="linenumber">425</context> <context context-type="linenumber">428</context>
</context-group> </context-group>
<target state="translated">Nije moguće sačuvati prikaz "<x id="PH" equiv-text="this.list.activeSavedViewTitle"/>".</target> <target state="translated">Nije moguće sačuvati prikaz "<x id="PH" equiv-text="this.list.activeSavedViewTitle"/>".</target>
</trans-unit> </trans-unit>
@@ -11090,7 +11090,7 @@
<source>View &quot;<x id="PH" equiv-text="savedView.name"/>&quot; created successfully.</source> <source>View &quot;<x id="PH" equiv-text="savedView.name"/>&quot; created successfully.</source>
<context-group purpose="location"> <context-group purpose="location">
<context context-type="sourcefile">src/app/components/document-list/document-list.component.ts</context> <context context-type="sourcefile">src/app/components/document-list/document-list.component.ts</context>
<context context-type="linenumber">494</context> <context context-type="linenumber">497</context>
</context-group> </context-group>
<target state="translated">Prikaz "<x id="PH" equiv-text="savedView.name"/>" je uspešno kreiran.</target> <target state="translated">Prikaz "<x id="PH" equiv-text="savedView.name"/>" je uspešno kreiran.</target>
</trans-unit> </trans-unit>
@@ -11098,7 +11098,7 @@
<source>View &quot;<x id="PH" equiv-text="savedView.name"/>&quot; created successfully, but could not update visibility settings.</source> <source>View &quot;<x id="PH" equiv-text="savedView.name"/>&quot; created successfully, but could not update visibility settings.</source>
<context-group purpose="location"> <context-group purpose="location">
<context context-type="sourcefile">src/app/components/document-list/document-list.component.ts</context> <context context-type="sourcefile">src/app/components/document-list/document-list.component.ts</context>
<context context-type="linenumber">500</context> <context context-type="linenumber">503</context>
</context-group> </context-group>
<target state="translated">Prikaz „<x id="PH" equiv-text="savedView.name"/>“ je uspešno kreiran, ali podešavanja vidljivosti nisu ažurirana.</target> <target state="translated">Prikaz „<x id="PH" equiv-text="savedView.name"/>“ je uspešno kreiran, ali podešavanja vidljivosti nisu ažurirana.</target>
</trans-unit> </trans-unit>
@@ -13299,11 +13299,27 @@
</context-group> </context-group>
<target state="translated">Model ugrađivanja LLM-a</target> <target state="translated">Model ugrađivanja LLM-a</target>
</trans-unit> </trans-unit>
<trans-unit id="861068592166833023" datatype="html">
<source>LLM Embedding API Key</source>
<context-group purpose="location">
<context context-type="sourcefile">src/app/data/paperless-config.ts</context>
<context context-type="linenumber">358</context>
</context-group>
<target state="needs-translation">LLM Embedding API Key</target>
</trans-unit>
<trans-unit id="2929108042259892948" datatype="html">
<source>Used for embeddings when set, otherwise LLM API key is used.</source>
<context-group purpose="location">
<context context-type="sourcefile">src/app/data/paperless-config.ts</context>
<context context-type="linenumber">360</context>
</context-group>
<target state="needs-translation">Used for embeddings when set, otherwise LLM API key is used.</target>
</trans-unit>
<trans-unit id="3554114880473286122" datatype="html"> <trans-unit id="3554114880473286122" datatype="html">
<source>LLM Embedding Endpoint</source> <source>LLM Embedding Endpoint</source>
<context-group purpose="location"> <context-group purpose="location">
<context context-type="sourcefile">src/app/data/paperless-config.ts</context> <context context-type="sourcefile">src/app/data/paperless-config.ts</context>
<context context-type="linenumber">358</context> <context context-type="linenumber">366</context>
</context-group> </context-group>
<target state="needs-translation">LLM Embedding Endpoint</target> <target state="needs-translation">LLM Embedding Endpoint</target>
</trans-unit> </trans-unit>
@@ -13311,7 +13327,7 @@
<source>LLM Embedding Chunk Size</source> <source>LLM Embedding Chunk Size</source>
<context-group purpose="location"> <context-group purpose="location">
<context context-type="sourcefile">src/app/data/paperless-config.ts</context> <context context-type="sourcefile">src/app/data/paperless-config.ts</context>
<context context-type="linenumber">365</context> <context context-type="linenumber">373</context>
</context-group> </context-group>
<target state="needs-translation">LLM Embedding Chunk Size</target> <target state="needs-translation">LLM Embedding Chunk Size</target>
</trans-unit> </trans-unit>
@@ -13319,7 +13335,7 @@
<source>LLM Context Size</source> <source>LLM Context Size</source>
<context-group purpose="location"> <context-group purpose="location">
<context context-type="sourcefile">src/app/data/paperless-config.ts</context> <context context-type="sourcefile">src/app/data/paperless-config.ts</context>
<context context-type="linenumber">372</context> <context context-type="linenumber">380</context>
</context-group> </context-group>
<target state="needs-translation">LLM Context Size</target> <target state="needs-translation">LLM Context Size</target>
</trans-unit> </trans-unit>
@@ -13327,7 +13343,7 @@
<source>LLM Backend</source> <source>LLM Backend</source>
<context-group purpose="location"> <context-group purpose="location">
<context context-type="sourcefile">src/app/data/paperless-config.ts</context> <context context-type="sourcefile">src/app/data/paperless-config.ts</context>
<context context-type="linenumber">379</context> <context context-type="linenumber">387</context>
</context-group> </context-group>
<target state="translated">LLM Bekend</target> <target state="translated">LLM Bekend</target>
</trans-unit> </trans-unit>
@@ -13335,7 +13351,7 @@
<source>LLM Model</source> <source>LLM Model</source>
<context-group purpose="location"> <context-group purpose="location">
<context context-type="sourcefile">src/app/data/paperless-config.ts</context> <context context-type="sourcefile">src/app/data/paperless-config.ts</context>
<context context-type="linenumber">387</context> <context context-type="linenumber">395</context>
</context-group> </context-group>
<target state="translated">LLM Model</target> <target state="translated">LLM Model</target>
</trans-unit> </trans-unit>
@@ -13343,7 +13359,7 @@
<source>LLM API Key</source> <source>LLM API Key</source>
<context-group purpose="location"> <context-group purpose="location">
<context context-type="sourcefile">src/app/data/paperless-config.ts</context> <context context-type="sourcefile">src/app/data/paperless-config.ts</context>
<context context-type="linenumber">394</context> <context context-type="linenumber">402</context>
</context-group> </context-group>
<target state="translated">LLM API Ključ</target> <target state="translated">LLM API Ključ</target>
</trans-unit> </trans-unit>
@@ -13351,7 +13367,7 @@
<source>LLM Endpoint</source> <source>LLM Endpoint</source>
<context-group purpose="location"> <context-group purpose="location">
<context context-type="sourcefile">src/app/data/paperless-config.ts</context> <context context-type="sourcefile">src/app/data/paperless-config.ts</context>
<context context-type="linenumber">401</context> <context context-type="linenumber">409</context>
</context-group> </context-group>
<target state="translated">LLM Endpoint</target> <target state="translated">LLM Endpoint</target>
</trans-unit> </trans-unit>
@@ -13359,7 +13375,7 @@
<source>LLM Output Language</source> <source>LLM Output Language</source>
<context-group purpose="location"> <context-group purpose="location">
<context context-type="sourcefile">src/app/data/paperless-config.ts</context> <context context-type="sourcefile">src/app/data/paperless-config.ts</context>
<context context-type="linenumber">408</context> <context context-type="linenumber">416</context>
</context-group> </context-group>
<target state="needs-translation">LLM Output Language</target> <target state="needs-translation">LLM Output Language</target>
</trans-unit> </trans-unit>
@@ -13367,7 +13383,7 @@
<source>Language to use for generated AI suggestions. When unset, AI suggestions use the user&apos;s display language if explicitly set.</source> <source>Language to use for generated AI suggestions. When unset, AI suggestions use the user&apos;s display language if explicitly set.</source>
<context-group purpose="location"> <context-group purpose="location">
<context context-type="sourcefile">src/app/data/paperless-config.ts</context> <context context-type="sourcefile">src/app/data/paperless-config.ts</context>
<context context-type="linenumber">412</context> <context context-type="linenumber">420</context>
</context-group> </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="needs-translation">Language to use for generated AI suggestions. When unset, AI suggestions use the user's display language if explicitly set.</target>
</trans-unit> </trans-unit>
@@ -13375,7 +13391,7 @@
<source>LLM Request Timeout</source> <source>LLM Request Timeout</source>
<context-group purpose="location"> <context-group purpose="location">
<context context-type="sourcefile">src/app/data/paperless-config.ts</context> <context context-type="sourcefile">src/app/data/paperless-config.ts</context>
<context context-type="linenumber">416</context> <context context-type="linenumber">424</context>
</context-group> </context-group>
<target state="needs-translation">LLM Request Timeout</target> <target state="needs-translation">LLM Request Timeout</target>
</trans-unit> </trans-unit>
@@ -13383,7 +13399,7 @@
<source>Timeout in seconds for LLM requests.</source> <source>Timeout in seconds for LLM requests.</source>
<context-group purpose="location"> <context-group purpose="location">
<context context-type="sourcefile">src/app/data/paperless-config.ts</context> <context context-type="sourcefile">src/app/data/paperless-config.ts</context>
<context context-type="linenumber">420</context> <context context-type="linenumber">428</context>
</context-group> </context-group>
<target state="needs-translation">Timeout in seconds for LLM requests.</target> <target state="needs-translation">Timeout in seconds for LLM requests.</target>
</trans-unit> </trans-unit>
+37 -21
View File
@@ -10740,7 +10740,7 @@
</context-group> </context-group>
<context-group purpose="location"> <context-group purpose="location">
<context context-type="sourcefile">src/app/components/document-list/document-list.component.ts</context> <context context-type="sourcefile">src/app/components/document-list/document-list.component.ts</context>
<context context-type="linenumber">348</context> <context context-type="linenumber">351</context>
</context-group> </context-group>
<context-group purpose="location"> <context-group purpose="location">
<context context-type="sourcefile">src/app/components/manage/document-attributes/document-attributes.component.html</context> <context context-type="sourcefile">src/app/components/manage/document-attributes/document-attributes.component.html</context>
@@ -10756,7 +10756,7 @@
</context-group> </context-group>
<context-group purpose="location"> <context-group purpose="location">
<context context-type="sourcefile">src/app/components/document-list/document-list.component.ts</context> <context context-type="sourcefile">src/app/components/document-list/document-list.component.ts</context>
<context context-type="linenumber">341</context> <context context-type="linenumber">344</context>
</context-group> </context-group>
<context-group purpose="location"> <context-group purpose="location">
<context context-type="sourcefile">src/app/components/manage/document-attributes/document-attributes.component.html</context> <context context-type="sourcefile">src/app/components/manage/document-attributes/document-attributes.component.html</context>
@@ -11040,7 +11040,7 @@
<source>Reset filters / selection</source> <source>Reset filters / selection</source>
<context-group purpose="location"> <context-group purpose="location">
<context context-type="sourcefile">src/app/components/document-list/document-list.component.ts</context> <context context-type="sourcefile">src/app/components/document-list/document-list.component.ts</context>
<context context-type="linenumber">329</context> <context context-type="linenumber">332</context>
</context-group> </context-group>
<target state="translated">Återställ filter / val</target> <target state="translated">Återställ filter / val</target>
</trans-unit> </trans-unit>
@@ -11048,7 +11048,7 @@
<source>Open first [selected] document</source> <source>Open first [selected] document</source>
<context-group purpose="location"> <context-group purpose="location">
<context context-type="sourcefile">src/app/components/document-list/document-list.component.ts</context> <context context-type="sourcefile">src/app/components/document-list/document-list.component.ts</context>
<context context-type="linenumber">357</context> <context context-type="linenumber">360</context>
</context-group> </context-group>
<target state="translated">Öppna första [valt] dokument</target> <target state="translated">Öppna första [valt] dokument</target>
</trans-unit> </trans-unit>
@@ -11056,7 +11056,7 @@
<source>Previous page</source> <source>Previous page</source>
<context-group purpose="location"> <context-group purpose="location">
<context context-type="sourcefile">src/app/components/document-list/document-list.component.ts</context> <context context-type="sourcefile">src/app/components/document-list/document-list.component.ts</context>
<context context-type="linenumber">373</context> <context context-type="linenumber">376</context>
</context-group> </context-group>
<target state="translated">Föregående sida</target> <target state="translated">Föregående sida</target>
</trans-unit> </trans-unit>
@@ -11064,7 +11064,7 @@
<source>Next page</source> <source>Next page</source>
<context-group purpose="location"> <context-group purpose="location">
<context context-type="sourcefile">src/app/components/document-list/document-list.component.ts</context> <context context-type="sourcefile">src/app/components/document-list/document-list.component.ts</context>
<context context-type="linenumber">385</context> <context context-type="linenumber">388</context>
</context-group> </context-group>
<target state="translated">Nästa sida</target> <target state="translated">Nästa sida</target>
</trans-unit> </trans-unit>
@@ -11072,7 +11072,7 @@
<source>View &quot;<x id="PH" equiv-text="this.list.activeSavedViewTitle"/>&quot; saved successfully.</source> <source>View &quot;<x id="PH" equiv-text="this.list.activeSavedViewTitle"/>&quot; saved successfully.</source>
<context-group purpose="location"> <context-group purpose="location">
<context context-type="sourcefile">src/app/components/document-list/document-list.component.ts</context> <context context-type="sourcefile">src/app/components/document-list/document-list.component.ts</context>
<context context-type="linenumber">419</context> <context context-type="linenumber">422</context>
</context-group> </context-group>
<target state="final">Vy "<x id="PH" equiv-text="this.list.activeSavedViewTitle"/>" sparades.</target> <target state="final">Vy "<x id="PH" equiv-text="this.list.activeSavedViewTitle"/>" sparades.</target>
</trans-unit> </trans-unit>
@@ -11080,7 +11080,7 @@
<source>Failed to save view &quot;<x id="PH" equiv-text="this.list.activeSavedViewTitle"/>&quot;.</source> <source>Failed to save view &quot;<x id="PH" equiv-text="this.list.activeSavedViewTitle"/>&quot;.</source>
<context-group purpose="location"> <context-group purpose="location">
<context context-type="sourcefile">src/app/components/document-list/document-list.component.ts</context> <context context-type="sourcefile">src/app/components/document-list/document-list.component.ts</context>
<context context-type="linenumber">425</context> <context context-type="linenumber">428</context>
</context-group> </context-group>
<target state="translated">Kunde inte spara vy "<x id="PH" equiv-text="this.list.activeSavedViewTitle"/>".</target> <target state="translated">Kunde inte spara vy "<x id="PH" equiv-text="this.list.activeSavedViewTitle"/>".</target>
</trans-unit> </trans-unit>
@@ -11088,7 +11088,7 @@
<source>View &quot;<x id="PH" equiv-text="savedView.name"/>&quot; created successfully.</source> <source>View &quot;<x id="PH" equiv-text="savedView.name"/>&quot; created successfully.</source>
<context-group purpose="location"> <context-group purpose="location">
<context context-type="sourcefile">src/app/components/document-list/document-list.component.ts</context> <context context-type="sourcefile">src/app/components/document-list/document-list.component.ts</context>
<context context-type="linenumber">494</context> <context context-type="linenumber">497</context>
</context-group> </context-group>
<target state="final">Vy "<x id="PH" equiv-text="savedView.name"/>" skapades.</target> <target state="final">Vy "<x id="PH" equiv-text="savedView.name"/>" skapades.</target>
</trans-unit> </trans-unit>
@@ -11096,7 +11096,7 @@
<source>View &quot;<x id="PH" equiv-text="savedView.name"/>&quot; created successfully, but could not update visibility settings.</source> <source>View &quot;<x id="PH" equiv-text="savedView.name"/>&quot; created successfully, but could not update visibility settings.</source>
<context-group purpose="location"> <context-group purpose="location">
<context context-type="sourcefile">src/app/components/document-list/document-list.component.ts</context> <context context-type="sourcefile">src/app/components/document-list/document-list.component.ts</context>
<context context-type="linenumber">500</context> <context context-type="linenumber">503</context>
</context-group> </context-group>
<target state="translated">Vyn "<x id="PH" equiv-text="savedView.name"/>" skapades, men synlighetsinställningarna kunde inte uppdateras.</target> <target state="translated">Vyn "<x id="PH" equiv-text="savedView.name"/>" skapades, men synlighetsinställningarna kunde inte uppdateras.</target>
</trans-unit> </trans-unit>
@@ -13297,11 +13297,27 @@
</context-group> </context-group>
<target state="translated">Modell för LLM-inbäddning</target> <target state="translated">Modell för LLM-inbäddning</target>
</trans-unit> </trans-unit>
<trans-unit id="861068592166833023" datatype="html">
<source>LLM Embedding API Key</source>
<context-group purpose="location">
<context context-type="sourcefile">src/app/data/paperless-config.ts</context>
<context context-type="linenumber">358</context>
</context-group>
<target state="translated">API-nyckel för LLM-inbäddning</target>
</trans-unit>
<trans-unit id="2929108042259892948" datatype="html">
<source>Used for embeddings when set, otherwise LLM API key is used.</source>
<context-group purpose="location">
<context context-type="sourcefile">src/app/data/paperless-config.ts</context>
<context context-type="linenumber">360</context>
</context-group>
<target state="translated">Används för inbäddningar när inställd, annars används LLM API-nyckel.</target>
</trans-unit>
<trans-unit id="3554114880473286122" datatype="html"> <trans-unit id="3554114880473286122" datatype="html">
<source>LLM Embedding Endpoint</source> <source>LLM Embedding Endpoint</source>
<context-group purpose="location"> <context-group purpose="location">
<context context-type="sourcefile">src/app/data/paperless-config.ts</context> <context context-type="sourcefile">src/app/data/paperless-config.ts</context>
<context context-type="linenumber">358</context> <context context-type="linenumber">366</context>
</context-group> </context-group>
<target state="translated">Slutpunkt för LLM-inbäddning</target> <target state="translated">Slutpunkt för LLM-inbäddning</target>
</trans-unit> </trans-unit>
@@ -13309,7 +13325,7 @@
<source>LLM Embedding Chunk Size</source> <source>LLM Embedding Chunk Size</source>
<context-group purpose="location"> <context-group purpose="location">
<context context-type="sourcefile">src/app/data/paperless-config.ts</context> <context context-type="sourcefile">src/app/data/paperless-config.ts</context>
<context context-type="linenumber">365</context> <context context-type="linenumber">373</context>
</context-group> </context-group>
<target state="translated">Blockstorlek för LLM-inbäddning</target> <target state="translated">Blockstorlek för LLM-inbäddning</target>
</trans-unit> </trans-unit>
@@ -13317,7 +13333,7 @@
<source>LLM Context Size</source> <source>LLM Context Size</source>
<context-group purpose="location"> <context-group purpose="location">
<context context-type="sourcefile">src/app/data/paperless-config.ts</context> <context context-type="sourcefile">src/app/data/paperless-config.ts</context>
<context context-type="linenumber">372</context> <context context-type="linenumber">380</context>
</context-group> </context-group>
<target state="translated">LLM-kontextstorlek</target> <target state="translated">LLM-kontextstorlek</target>
</trans-unit> </trans-unit>
@@ -13325,7 +13341,7 @@
<source>LLM Backend</source> <source>LLM Backend</source>
<context-group purpose="location"> <context-group purpose="location">
<context context-type="sourcefile">src/app/data/paperless-config.ts</context> <context context-type="sourcefile">src/app/data/paperless-config.ts</context>
<context context-type="linenumber">379</context> <context context-type="linenumber">387</context>
</context-group> </context-group>
<target state="translated">LLM-serverdel</target> <target state="translated">LLM-serverdel</target>
</trans-unit> </trans-unit>
@@ -13333,7 +13349,7 @@
<source>LLM Model</source> <source>LLM Model</source>
<context-group purpose="location"> <context-group purpose="location">
<context context-type="sourcefile">src/app/data/paperless-config.ts</context> <context context-type="sourcefile">src/app/data/paperless-config.ts</context>
<context context-type="linenumber">387</context> <context context-type="linenumber">395</context>
</context-group> </context-group>
<target state="translated">LLM-modell</target> <target state="translated">LLM-modell</target>
</trans-unit> </trans-unit>
@@ -13341,7 +13357,7 @@
<source>LLM API Key</source> <source>LLM API Key</source>
<context-group purpose="location"> <context-group purpose="location">
<context context-type="sourcefile">src/app/data/paperless-config.ts</context> <context context-type="sourcefile">src/app/data/paperless-config.ts</context>
<context context-type="linenumber">394</context> <context context-type="linenumber">402</context>
</context-group> </context-group>
<target state="translated">LLM-API-nyckel</target> <target state="translated">LLM-API-nyckel</target>
</trans-unit> </trans-unit>
@@ -13349,7 +13365,7 @@
<source>LLM Endpoint</source> <source>LLM Endpoint</source>
<context-group purpose="location"> <context-group purpose="location">
<context context-type="sourcefile">src/app/data/paperless-config.ts</context> <context context-type="sourcefile">src/app/data/paperless-config.ts</context>
<context context-type="linenumber">401</context> <context context-type="linenumber">409</context>
</context-group> </context-group>
<target state="translated">LLM-slutpunkt</target> <target state="translated">LLM-slutpunkt</target>
</trans-unit> </trans-unit>
@@ -13357,7 +13373,7 @@
<source>LLM Output Language</source> <source>LLM Output Language</source>
<context-group purpose="location"> <context-group purpose="location">
<context context-type="sourcefile">src/app/data/paperless-config.ts</context> <context context-type="sourcefile">src/app/data/paperless-config.ts</context>
<context context-type="linenumber">408</context> <context context-type="linenumber">416</context>
</context-group> </context-group>
<target state="translated">Utdataspråk för LLM</target> <target state="translated">Utdataspråk för LLM</target>
</trans-unit> </trans-unit>
@@ -13365,7 +13381,7 @@
<source>Language to use for generated AI suggestions. When unset, AI suggestions use the user&apos;s display language if explicitly set.</source> <source>Language to use for generated AI suggestions. When unset, AI suggestions use the user&apos;s display language if explicitly set.</source>
<context-group purpose="location"> <context-group purpose="location">
<context context-type="sourcefile">src/app/data/paperless-config.ts</context> <context context-type="sourcefile">src/app/data/paperless-config.ts</context>
<context context-type="linenumber">412</context> <context context-type="linenumber">420</context>
</context-group> </context-group>
<target state="translated">Språk för genererade AI-förslag. Om inget språk har angetts används användarens visningsspråk, om det uttryckligen har valts.</target> <target state="translated">Språk för genererade AI-förslag. Om inget språk har angetts används användarens visningsspråk, om det uttryckligen har valts.</target>
</trans-unit> </trans-unit>
@@ -13373,7 +13389,7 @@
<source>LLM Request Timeout</source> <source>LLM Request Timeout</source>
<context-group purpose="location"> <context-group purpose="location">
<context context-type="sourcefile">src/app/data/paperless-config.ts</context> <context context-type="sourcefile">src/app/data/paperless-config.ts</context>
<context context-type="linenumber">416</context> <context context-type="linenumber">424</context>
</context-group> </context-group>
<target state="translated">Tidsgräns för LLM-begäran</target> <target state="translated">Tidsgräns för LLM-begäran</target>
</trans-unit> </trans-unit>
@@ -13381,7 +13397,7 @@
<source>Timeout in seconds for LLM requests.</source> <source>Timeout in seconds for LLM requests.</source>
<context-group purpose="location"> <context-group purpose="location">
<context context-type="sourcefile">src/app/data/paperless-config.ts</context> <context context-type="sourcefile">src/app/data/paperless-config.ts</context>
<context context-type="linenumber">420</context> <context context-type="linenumber">428</context>
</context-group> </context-group>
<target state="translated">Tidsgräns i sekunder för LLM-begäranden.</target> <target state="translated">Tidsgräns i sekunder för LLM-begäranden.</target>
</trans-unit> </trans-unit>
+37 -21
View File
@@ -10741,7 +10741,7 @@
</context-group> </context-group>
<context-group purpose="location"> <context-group purpose="location">
<context context-type="sourcefile">src/app/components/document-list/document-list.component.ts</context> <context context-type="sourcefile">src/app/components/document-list/document-list.component.ts</context>
<context context-type="linenumber">348</context> <context context-type="linenumber">351</context>
</context-group> </context-group>
<context-group purpose="location"> <context-group purpose="location">
<context context-type="sourcefile">src/app/components/manage/document-attributes/document-attributes.component.html</context> <context context-type="sourcefile">src/app/components/manage/document-attributes/document-attributes.component.html</context>
@@ -10757,7 +10757,7 @@
</context-group> </context-group>
<context-group purpose="location"> <context-group purpose="location">
<context context-type="sourcefile">src/app/components/document-list/document-list.component.ts</context> <context context-type="sourcefile">src/app/components/document-list/document-list.component.ts</context>
<context context-type="linenumber">341</context> <context context-type="linenumber">344</context>
</context-group> </context-group>
<context-group purpose="location"> <context-group purpose="location">
<context context-type="sourcefile">src/app/components/manage/document-attributes/document-attributes.component.html</context> <context context-type="sourcefile">src/app/components/manage/document-attributes/document-attributes.component.html</context>
@@ -11041,7 +11041,7 @@
<source>Reset filters / selection</source> <source>Reset filters / selection</source>
<context-group purpose="location"> <context-group purpose="location">
<context context-type="sourcefile">src/app/components/document-list/document-list.component.ts</context> <context context-type="sourcefile">src/app/components/document-list/document-list.component.ts</context>
<context context-type="linenumber">329</context> <context context-type="linenumber">332</context>
</context-group> </context-group>
<target state="needs-translation">Reset filters / selection</target> <target state="needs-translation">Reset filters / selection</target>
</trans-unit> </trans-unit>
@@ -11049,7 +11049,7 @@
<source>Open first [selected] document</source> <source>Open first [selected] document</source>
<context-group purpose="location"> <context-group purpose="location">
<context context-type="sourcefile">src/app/components/document-list/document-list.component.ts</context> <context context-type="sourcefile">src/app/components/document-list/document-list.component.ts</context>
<context context-type="linenumber">357</context> <context context-type="linenumber">360</context>
</context-group> </context-group>
<target state="needs-translation">Open first [selected] document</target> <target state="needs-translation">Open first [selected] document</target>
</trans-unit> </trans-unit>
@@ -11057,7 +11057,7 @@
<source>Previous page</source> <source>Previous page</source>
<context-group purpose="location"> <context-group purpose="location">
<context context-type="sourcefile">src/app/components/document-list/document-list.component.ts</context> <context context-type="sourcefile">src/app/components/document-list/document-list.component.ts</context>
<context context-type="linenumber">373</context> <context context-type="linenumber">376</context>
</context-group> </context-group>
<target state="needs-translation">Previous page</target> <target state="needs-translation">Previous page</target>
</trans-unit> </trans-unit>
@@ -11065,7 +11065,7 @@
<source>Next page</source> <source>Next page</source>
<context-group purpose="location"> <context-group purpose="location">
<context context-type="sourcefile">src/app/components/document-list/document-list.component.ts</context> <context context-type="sourcefile">src/app/components/document-list/document-list.component.ts</context>
<context context-type="linenumber">385</context> <context context-type="linenumber">388</context>
</context-group> </context-group>
<target state="needs-translation">Next page</target> <target state="needs-translation">Next page</target>
</trans-unit> </trans-unit>
@@ -11073,7 +11073,7 @@
<source>View &quot;<x id="PH" equiv-text="this.list.activeSavedViewTitle"/>&quot; saved successfully.</source> <source>View &quot;<x id="PH" equiv-text="this.list.activeSavedViewTitle"/>&quot; saved successfully.</source>
<context-group purpose="location"> <context-group purpose="location">
<context context-type="sourcefile">src/app/components/document-list/document-list.component.ts</context> <context context-type="sourcefile">src/app/components/document-list/document-list.component.ts</context>
<context context-type="linenumber">419</context> <context context-type="linenumber">422</context>
</context-group> </context-group>
<target state="needs-translation">View "<x id="PH" equiv-text="this.list.activeSavedViewTitle"/>" saved successfully.</target> <target state="needs-translation">View "<x id="PH" equiv-text="this.list.activeSavedViewTitle"/>" saved successfully.</target>
</trans-unit> </trans-unit>
@@ -11081,7 +11081,7 @@
<source>Failed to save view &quot;<x id="PH" equiv-text="this.list.activeSavedViewTitle"/>&quot;.</source> <source>Failed to save view &quot;<x id="PH" equiv-text="this.list.activeSavedViewTitle"/>&quot;.</source>
<context-group purpose="location"> <context-group purpose="location">
<context context-type="sourcefile">src/app/components/document-list/document-list.component.ts</context> <context context-type="sourcefile">src/app/components/document-list/document-list.component.ts</context>
<context context-type="linenumber">425</context> <context context-type="linenumber">428</context>
</context-group> </context-group>
<target state="needs-translation">Failed to save view "<x id="PH" equiv-text="this.list.activeSavedViewTitle"/>".</target> <target state="needs-translation">Failed to save view "<x id="PH" equiv-text="this.list.activeSavedViewTitle"/>".</target>
</trans-unit> </trans-unit>
@@ -11089,7 +11089,7 @@
<source>View &quot;<x id="PH" equiv-text="savedView.name"/>&quot; created successfully.</source> <source>View &quot;<x id="PH" equiv-text="savedView.name"/>&quot; created successfully.</source>
<context-group purpose="location"> <context-group purpose="location">
<context context-type="sourcefile">src/app/components/document-list/document-list.component.ts</context> <context context-type="sourcefile">src/app/components/document-list/document-list.component.ts</context>
<context context-type="linenumber">494</context> <context context-type="linenumber">497</context>
</context-group> </context-group>
<target state="needs-translation">View "<x id="PH" equiv-text="savedView.name"/>" created successfully.</target> <target state="needs-translation">View "<x id="PH" equiv-text="savedView.name"/>" created successfully.</target>
</trans-unit> </trans-unit>
@@ -11097,7 +11097,7 @@
<source>View &quot;<x id="PH" equiv-text="savedView.name"/>&quot; created successfully, but could not update visibility settings.</source> <source>View &quot;<x id="PH" equiv-text="savedView.name"/>&quot; created successfully, but could not update visibility settings.</source>
<context-group purpose="location"> <context-group purpose="location">
<context context-type="sourcefile">src/app/components/document-list/document-list.component.ts</context> <context context-type="sourcefile">src/app/components/document-list/document-list.component.ts</context>
<context context-type="linenumber">500</context> <context context-type="linenumber">503</context>
</context-group> </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="needs-translation">View "<x id="PH" equiv-text="savedView.name"/>" created successfully, but could not update visibility settings.</target>
</trans-unit> </trans-unit>
@@ -13298,11 +13298,27 @@
</context-group> </context-group>
<target state="needs-translation">LLM Embedding Model</target> <target state="needs-translation">LLM Embedding Model</target>
</trans-unit> </trans-unit>
<trans-unit id="861068592166833023" datatype="html">
<source>LLM Embedding API Key</source>
<context-group purpose="location">
<context context-type="sourcefile">src/app/data/paperless-config.ts</context>
<context context-type="linenumber">358</context>
</context-group>
<target state="needs-translation">LLM Embedding API Key</target>
</trans-unit>
<trans-unit id="2929108042259892948" datatype="html">
<source>Used for embeddings when set, otherwise LLM API key is used.</source>
<context-group purpose="location">
<context context-type="sourcefile">src/app/data/paperless-config.ts</context>
<context context-type="linenumber">360</context>
</context-group>
<target state="needs-translation">Used for embeddings when set, otherwise LLM API key is used.</target>
</trans-unit>
<trans-unit id="3554114880473286122" datatype="html"> <trans-unit id="3554114880473286122" datatype="html">
<source>LLM Embedding Endpoint</source> <source>LLM Embedding Endpoint</source>
<context-group purpose="location"> <context-group purpose="location">
<context context-type="sourcefile">src/app/data/paperless-config.ts</context> <context context-type="sourcefile">src/app/data/paperless-config.ts</context>
<context context-type="linenumber">358</context> <context context-type="linenumber">366</context>
</context-group> </context-group>
<target state="needs-translation">LLM Embedding Endpoint</target> <target state="needs-translation">LLM Embedding Endpoint</target>
</trans-unit> </trans-unit>
@@ -13310,7 +13326,7 @@
<source>LLM Embedding Chunk Size</source> <source>LLM Embedding Chunk Size</source>
<context-group purpose="location"> <context-group purpose="location">
<context context-type="sourcefile">src/app/data/paperless-config.ts</context> <context context-type="sourcefile">src/app/data/paperless-config.ts</context>
<context context-type="linenumber">365</context> <context context-type="linenumber">373</context>
</context-group> </context-group>
<target state="needs-translation">LLM Embedding Chunk Size</target> <target state="needs-translation">LLM Embedding Chunk Size</target>
</trans-unit> </trans-unit>
@@ -13318,7 +13334,7 @@
<source>LLM Context Size</source> <source>LLM Context Size</source>
<context-group purpose="location"> <context-group purpose="location">
<context context-type="sourcefile">src/app/data/paperless-config.ts</context> <context context-type="sourcefile">src/app/data/paperless-config.ts</context>
<context context-type="linenumber">372</context> <context context-type="linenumber">380</context>
</context-group> </context-group>
<target state="needs-translation">LLM Context Size</target> <target state="needs-translation">LLM Context Size</target>
</trans-unit> </trans-unit>
@@ -13326,7 +13342,7 @@
<source>LLM Backend</source> <source>LLM Backend</source>
<context-group purpose="location"> <context-group purpose="location">
<context context-type="sourcefile">src/app/data/paperless-config.ts</context> <context context-type="sourcefile">src/app/data/paperless-config.ts</context>
<context context-type="linenumber">379</context> <context context-type="linenumber">387</context>
</context-group> </context-group>
<target state="needs-translation">LLM Backend</target> <target state="needs-translation">LLM Backend</target>
</trans-unit> </trans-unit>
@@ -13334,7 +13350,7 @@
<source>LLM Model</source> <source>LLM Model</source>
<context-group purpose="location"> <context-group purpose="location">
<context context-type="sourcefile">src/app/data/paperless-config.ts</context> <context context-type="sourcefile">src/app/data/paperless-config.ts</context>
<context context-type="linenumber">387</context> <context context-type="linenumber">395</context>
</context-group> </context-group>
<target state="needs-translation">LLM Model</target> <target state="needs-translation">LLM Model</target>
</trans-unit> </trans-unit>
@@ -13342,7 +13358,7 @@
<source>LLM API Key</source> <source>LLM API Key</source>
<context-group purpose="location"> <context-group purpose="location">
<context context-type="sourcefile">src/app/data/paperless-config.ts</context> <context context-type="sourcefile">src/app/data/paperless-config.ts</context>
<context context-type="linenumber">394</context> <context context-type="linenumber">402</context>
</context-group> </context-group>
<target state="needs-translation">LLM API Key</target> <target state="needs-translation">LLM API Key</target>
</trans-unit> </trans-unit>
@@ -13350,7 +13366,7 @@
<source>LLM Endpoint</source> <source>LLM Endpoint</source>
<context-group purpose="location"> <context-group purpose="location">
<context context-type="sourcefile">src/app/data/paperless-config.ts</context> <context context-type="sourcefile">src/app/data/paperless-config.ts</context>
<context context-type="linenumber">401</context> <context context-type="linenumber">409</context>
</context-group> </context-group>
<target state="needs-translation">LLM Endpoint</target> <target state="needs-translation">LLM Endpoint</target>
</trans-unit> </trans-unit>
@@ -13358,7 +13374,7 @@
<source>LLM Output Language</source> <source>LLM Output Language</source>
<context-group purpose="location"> <context-group purpose="location">
<context context-type="sourcefile">src/app/data/paperless-config.ts</context> <context context-type="sourcefile">src/app/data/paperless-config.ts</context>
<context context-type="linenumber">408</context> <context context-type="linenumber">416</context>
</context-group> </context-group>
<target state="needs-translation">LLM Output Language</target> <target state="needs-translation">LLM Output Language</target>
</trans-unit> </trans-unit>
@@ -13366,7 +13382,7 @@
<source>Language to use for generated AI suggestions. When unset, AI suggestions use the user&apos;s display language if explicitly set.</source> <source>Language to use for generated AI suggestions. When unset, AI suggestions use the user&apos;s display language if explicitly set.</source>
<context-group purpose="location"> <context-group purpose="location">
<context context-type="sourcefile">src/app/data/paperless-config.ts</context> <context context-type="sourcefile">src/app/data/paperless-config.ts</context>
<context context-type="linenumber">412</context> <context context-type="linenumber">420</context>
</context-group> </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="needs-translation">Language to use for generated AI suggestions. When unset, AI suggestions use the user's display language if explicitly set.</target>
</trans-unit> </trans-unit>
@@ -13374,7 +13390,7 @@
<source>LLM Request Timeout</source> <source>LLM Request Timeout</source>
<context-group purpose="location"> <context-group purpose="location">
<context context-type="sourcefile">src/app/data/paperless-config.ts</context> <context context-type="sourcefile">src/app/data/paperless-config.ts</context>
<context context-type="linenumber">416</context> <context context-type="linenumber">424</context>
</context-group> </context-group>
<target state="needs-translation">LLM Request Timeout</target> <target state="needs-translation">LLM Request Timeout</target>
</trans-unit> </trans-unit>
@@ -13382,7 +13398,7 @@
<source>Timeout in seconds for LLM requests.</source> <source>Timeout in seconds for LLM requests.</source>
<context-group purpose="location"> <context-group purpose="location">
<context context-type="sourcefile">src/app/data/paperless-config.ts</context> <context context-type="sourcefile">src/app/data/paperless-config.ts</context>
<context context-type="linenumber">420</context> <context context-type="linenumber">428</context>
</context-group> </context-group>
<target state="needs-translation">Timeout in seconds for LLM requests.</target> <target state="needs-translation">Timeout in seconds for LLM requests.</target>
</trans-unit> </trans-unit>
+37 -21
View File
@@ -10742,7 +10742,7 @@ tüm <x id="CLOSE_EMPHASISED_TEXT" ctype="x-em" equiv-text="&lt;/em&gt;"/> krite
</context-group> </context-group>
<context-group purpose="location"> <context-group purpose="location">
<context context-type="sourcefile">src/app/components/document-list/document-list.component.ts</context> <context context-type="sourcefile">src/app/components/document-list/document-list.component.ts</context>
<context context-type="linenumber">348</context> <context context-type="linenumber">351</context>
</context-group> </context-group>
<context-group purpose="location"> <context-group purpose="location">
<context context-type="sourcefile">src/app/components/manage/document-attributes/document-attributes.component.html</context> <context context-type="sourcefile">src/app/components/manage/document-attributes/document-attributes.component.html</context>
@@ -10758,7 +10758,7 @@ tüm <x id="CLOSE_EMPHASISED_TEXT" ctype="x-em" equiv-text="&lt;/em&gt;"/> krite
</context-group> </context-group>
<context-group purpose="location"> <context-group purpose="location">
<context context-type="sourcefile">src/app/components/document-list/document-list.component.ts</context> <context context-type="sourcefile">src/app/components/document-list/document-list.component.ts</context>
<context context-type="linenumber">341</context> <context context-type="linenumber">344</context>
</context-group> </context-group>
<context-group purpose="location"> <context-group purpose="location">
<context context-type="sourcefile">src/app/components/manage/document-attributes/document-attributes.component.html</context> <context context-type="sourcefile">src/app/components/manage/document-attributes/document-attributes.component.html</context>
@@ -11042,7 +11042,7 @@ tüm <x id="CLOSE_EMPHASISED_TEXT" ctype="x-em" equiv-text="&lt;/em&gt;"/> krite
<source>Reset filters / selection</source> <source>Reset filters / selection</source>
<context-group purpose="location"> <context-group purpose="location">
<context context-type="sourcefile">src/app/components/document-list/document-list.component.ts</context> <context context-type="sourcefile">src/app/components/document-list/document-list.component.ts</context>
<context context-type="linenumber">329</context> <context context-type="linenumber">332</context>
</context-group> </context-group>
<target state="translated">Filtreleri / seçimi sıfırla</target> <target state="translated">Filtreleri / seçimi sıfırla</target>
</trans-unit> </trans-unit>
@@ -11050,7 +11050,7 @@ tüm <x id="CLOSE_EMPHASISED_TEXT" ctype="x-em" equiv-text="&lt;/em&gt;"/> krite
<source>Open first [selected] document</source> <source>Open first [selected] document</source>
<context-group purpose="location"> <context-group purpose="location">
<context context-type="sourcefile">src/app/components/document-list/document-list.component.ts</context> <context context-type="sourcefile">src/app/components/document-list/document-list.component.ts</context>
<context context-type="linenumber">357</context> <context context-type="linenumber">360</context>
</context-group> </context-group>
<target state="translated">İlk [selected] belgeyi aç</target> <target state="translated">İlk [selected] belgeyi aç</target>
</trans-unit> </trans-unit>
@@ -11058,7 +11058,7 @@ tüm <x id="CLOSE_EMPHASISED_TEXT" ctype="x-em" equiv-text="&lt;/em&gt;"/> krite
<source>Previous page</source> <source>Previous page</source>
<context-group purpose="location"> <context-group purpose="location">
<context context-type="sourcefile">src/app/components/document-list/document-list.component.ts</context> <context context-type="sourcefile">src/app/components/document-list/document-list.component.ts</context>
<context context-type="linenumber">373</context> <context context-type="linenumber">376</context>
</context-group> </context-group>
<target state="translated">Önceki sayfa</target> <target state="translated">Önceki sayfa</target>
</trans-unit> </trans-unit>
@@ -11066,7 +11066,7 @@ tüm <x id="CLOSE_EMPHASISED_TEXT" ctype="x-em" equiv-text="&lt;/em&gt;"/> krite
<source>Next page</source> <source>Next page</source>
<context-group purpose="location"> <context-group purpose="location">
<context context-type="sourcefile">src/app/components/document-list/document-list.component.ts</context> <context context-type="sourcefile">src/app/components/document-list/document-list.component.ts</context>
<context context-type="linenumber">385</context> <context context-type="linenumber">388</context>
</context-group> </context-group>
<target state="translated">Sonraki sayfa</target> <target state="translated">Sonraki sayfa</target>
</trans-unit> </trans-unit>
@@ -11074,7 +11074,7 @@ tüm <x id="CLOSE_EMPHASISED_TEXT" ctype="x-em" equiv-text="&lt;/em&gt;"/> krite
<source>View &quot;<x id="PH" equiv-text="this.list.activeSavedViewTitle"/>&quot; saved successfully.</source> <source>View &quot;<x id="PH" equiv-text="this.list.activeSavedViewTitle"/>&quot; saved successfully.</source>
<context-group purpose="location"> <context-group purpose="location">
<context context-type="sourcefile">src/app/components/document-list/document-list.component.ts</context> <context context-type="sourcefile">src/app/components/document-list/document-list.component.ts</context>
<context context-type="linenumber">419</context> <context context-type="linenumber">422</context>
</context-group> </context-group>
<target state="translated">"<x id="PH" equiv-text="this.list.activeSavedViewTitle"/>" adlı görünüm başarıyla kaydedildi.</target> <target state="translated">"<x id="PH" equiv-text="this.list.activeSavedViewTitle"/>" adlı görünüm başarıyla kaydedildi.</target>
</trans-unit> </trans-unit>
@@ -11082,7 +11082,7 @@ tüm <x id="CLOSE_EMPHASISED_TEXT" ctype="x-em" equiv-text="&lt;/em&gt;"/> krite
<source>Failed to save view &quot;<x id="PH" equiv-text="this.list.activeSavedViewTitle"/>&quot;.</source> <source>Failed to save view &quot;<x id="PH" equiv-text="this.list.activeSavedViewTitle"/>&quot;.</source>
<context-group purpose="location"> <context-group purpose="location">
<context context-type="sourcefile">src/app/components/document-list/document-list.component.ts</context> <context context-type="sourcefile">src/app/components/document-list/document-list.component.ts</context>
<context context-type="linenumber">425</context> <context context-type="linenumber">428</context>
</context-group> </context-group>
<target state="translated">"<x id="PH" equiv-text="this.list.activeSavedViewTitle"/>" görünümünü kaydederken bir hata ile karşılaşıldı.</target> <target state="translated">"<x id="PH" equiv-text="this.list.activeSavedViewTitle"/>" görünümünü kaydederken bir hata ile karşılaşıldı.</target>
</trans-unit> </trans-unit>
@@ -11090,7 +11090,7 @@ tüm <x id="CLOSE_EMPHASISED_TEXT" ctype="x-em" equiv-text="&lt;/em&gt;"/> krite
<source>View &quot;<x id="PH" equiv-text="savedView.name"/>&quot; created successfully.</source> <source>View &quot;<x id="PH" equiv-text="savedView.name"/>&quot; created successfully.</source>
<context-group purpose="location"> <context-group purpose="location">
<context context-type="sourcefile">src/app/components/document-list/document-list.component.ts</context> <context context-type="sourcefile">src/app/components/document-list/document-list.component.ts</context>
<context context-type="linenumber">494</context> <context context-type="linenumber">497</context>
</context-group> </context-group>
<target state="translated"><x id="PH" equiv-text="savedView.name"/> adlı görünüm başarıyla oluşturuldu.</target> <target state="translated"><x id="PH" equiv-text="savedView.name"/> adlı görünüm başarıyla oluşturuldu.</target>
</trans-unit> </trans-unit>
@@ -11098,7 +11098,7 @@ tüm <x id="CLOSE_EMPHASISED_TEXT" ctype="x-em" equiv-text="&lt;/em&gt;"/> krite
<source>View &quot;<x id="PH" equiv-text="savedView.name"/>&quot; created successfully, but could not update visibility settings.</source> <source>View &quot;<x id="PH" equiv-text="savedView.name"/>&quot; created successfully, but could not update visibility settings.</source>
<context-group purpose="location"> <context-group purpose="location">
<context context-type="sourcefile">src/app/components/document-list/document-list.component.ts</context> <context context-type="sourcefile">src/app/components/document-list/document-list.component.ts</context>
<context context-type="linenumber">500</context> <context context-type="linenumber">503</context>
</context-group> </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="needs-translation">View "<x id="PH" equiv-text="savedView.name"/>" created successfully, but could not update visibility settings.</target>
</trans-unit> </trans-unit>
@@ -13299,11 +13299,27 @@ tüm <x id="CLOSE_EMPHASISED_TEXT" ctype="x-em" equiv-text="&lt;/em&gt;"/> krite
</context-group> </context-group>
<target state="needs-translation">LLM Embedding Model</target> <target state="needs-translation">LLM Embedding Model</target>
</trans-unit> </trans-unit>
<trans-unit id="861068592166833023" datatype="html">
<source>LLM Embedding API Key</source>
<context-group purpose="location">
<context context-type="sourcefile">src/app/data/paperless-config.ts</context>
<context context-type="linenumber">358</context>
</context-group>
<target state="needs-translation">LLM Embedding API Key</target>
</trans-unit>
<trans-unit id="2929108042259892948" datatype="html">
<source>Used for embeddings when set, otherwise LLM API key is used.</source>
<context-group purpose="location">
<context context-type="sourcefile">src/app/data/paperless-config.ts</context>
<context context-type="linenumber">360</context>
</context-group>
<target state="needs-translation">Used for embeddings when set, otherwise LLM API key is used.</target>
</trans-unit>
<trans-unit id="3554114880473286122" datatype="html"> <trans-unit id="3554114880473286122" datatype="html">
<source>LLM Embedding Endpoint</source> <source>LLM Embedding Endpoint</source>
<context-group purpose="location"> <context-group purpose="location">
<context context-type="sourcefile">src/app/data/paperless-config.ts</context> <context context-type="sourcefile">src/app/data/paperless-config.ts</context>
<context context-type="linenumber">358</context> <context context-type="linenumber">366</context>
</context-group> </context-group>
<target state="needs-translation">LLM Embedding Endpoint</target> <target state="needs-translation">LLM Embedding Endpoint</target>
</trans-unit> </trans-unit>
@@ -13311,7 +13327,7 @@ tüm <x id="CLOSE_EMPHASISED_TEXT" ctype="x-em" equiv-text="&lt;/em&gt;"/> krite
<source>LLM Embedding Chunk Size</source> <source>LLM Embedding Chunk Size</source>
<context-group purpose="location"> <context-group purpose="location">
<context context-type="sourcefile">src/app/data/paperless-config.ts</context> <context context-type="sourcefile">src/app/data/paperless-config.ts</context>
<context context-type="linenumber">365</context> <context context-type="linenumber">373</context>
</context-group> </context-group>
<target state="needs-translation">LLM Embedding Chunk Size</target> <target state="needs-translation">LLM Embedding Chunk Size</target>
</trans-unit> </trans-unit>
@@ -13319,7 +13335,7 @@ tüm <x id="CLOSE_EMPHASISED_TEXT" ctype="x-em" equiv-text="&lt;/em&gt;"/> krite
<source>LLM Context Size</source> <source>LLM Context Size</source>
<context-group purpose="location"> <context-group purpose="location">
<context context-type="sourcefile">src/app/data/paperless-config.ts</context> <context context-type="sourcefile">src/app/data/paperless-config.ts</context>
<context context-type="linenumber">372</context> <context context-type="linenumber">380</context>
</context-group> </context-group>
<target state="needs-translation">LLM Context Size</target> <target state="needs-translation">LLM Context Size</target>
</trans-unit> </trans-unit>
@@ -13327,7 +13343,7 @@ tüm <x id="CLOSE_EMPHASISED_TEXT" ctype="x-em" equiv-text="&lt;/em&gt;"/> krite
<source>LLM Backend</source> <source>LLM Backend</source>
<context-group purpose="location"> <context-group purpose="location">
<context context-type="sourcefile">src/app/data/paperless-config.ts</context> <context context-type="sourcefile">src/app/data/paperless-config.ts</context>
<context context-type="linenumber">379</context> <context context-type="linenumber">387</context>
</context-group> </context-group>
<target state="needs-translation">LLM Backend</target> <target state="needs-translation">LLM Backend</target>
</trans-unit> </trans-unit>
@@ -13335,7 +13351,7 @@ tüm <x id="CLOSE_EMPHASISED_TEXT" ctype="x-em" equiv-text="&lt;/em&gt;"/> krite
<source>LLM Model</source> <source>LLM Model</source>
<context-group purpose="location"> <context-group purpose="location">
<context context-type="sourcefile">src/app/data/paperless-config.ts</context> <context context-type="sourcefile">src/app/data/paperless-config.ts</context>
<context context-type="linenumber">387</context> <context context-type="linenumber">395</context>
</context-group> </context-group>
<target state="needs-translation">LLM Model</target> <target state="needs-translation">LLM Model</target>
</trans-unit> </trans-unit>
@@ -13343,7 +13359,7 @@ tüm <x id="CLOSE_EMPHASISED_TEXT" ctype="x-em" equiv-text="&lt;/em&gt;"/> krite
<source>LLM API Key</source> <source>LLM API Key</source>
<context-group purpose="location"> <context-group purpose="location">
<context context-type="sourcefile">src/app/data/paperless-config.ts</context> <context context-type="sourcefile">src/app/data/paperless-config.ts</context>
<context context-type="linenumber">394</context> <context context-type="linenumber">402</context>
</context-group> </context-group>
<target state="needs-translation">LLM API Key</target> <target state="needs-translation">LLM API Key</target>
</trans-unit> </trans-unit>
@@ -13351,7 +13367,7 @@ tüm <x id="CLOSE_EMPHASISED_TEXT" ctype="x-em" equiv-text="&lt;/em&gt;"/> krite
<source>LLM Endpoint</source> <source>LLM Endpoint</source>
<context-group purpose="location"> <context-group purpose="location">
<context context-type="sourcefile">src/app/data/paperless-config.ts</context> <context context-type="sourcefile">src/app/data/paperless-config.ts</context>
<context context-type="linenumber">401</context> <context context-type="linenumber">409</context>
</context-group> </context-group>
<target state="needs-translation">LLM Endpoint</target> <target state="needs-translation">LLM Endpoint</target>
</trans-unit> </trans-unit>
@@ -13359,7 +13375,7 @@ tüm <x id="CLOSE_EMPHASISED_TEXT" ctype="x-em" equiv-text="&lt;/em&gt;"/> krite
<source>LLM Output Language</source> <source>LLM Output Language</source>
<context-group purpose="location"> <context-group purpose="location">
<context context-type="sourcefile">src/app/data/paperless-config.ts</context> <context context-type="sourcefile">src/app/data/paperless-config.ts</context>
<context context-type="linenumber">408</context> <context context-type="linenumber">416</context>
</context-group> </context-group>
<target state="needs-translation">LLM Output Language</target> <target state="needs-translation">LLM Output Language</target>
</trans-unit> </trans-unit>
@@ -13367,7 +13383,7 @@ tüm <x id="CLOSE_EMPHASISED_TEXT" ctype="x-em" equiv-text="&lt;/em&gt;"/> krite
<source>Language to use for generated AI suggestions. When unset, AI suggestions use the user&apos;s display language if explicitly set.</source> <source>Language to use for generated AI suggestions. When unset, AI suggestions use the user&apos;s display language if explicitly set.</source>
<context-group purpose="location"> <context-group purpose="location">
<context context-type="sourcefile">src/app/data/paperless-config.ts</context> <context context-type="sourcefile">src/app/data/paperless-config.ts</context>
<context context-type="linenumber">412</context> <context context-type="linenumber">420</context>
</context-group> </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="needs-translation">Language to use for generated AI suggestions. When unset, AI suggestions use the user's display language if explicitly set.</target>
</trans-unit> </trans-unit>
@@ -13375,7 +13391,7 @@ tüm <x id="CLOSE_EMPHASISED_TEXT" ctype="x-em" equiv-text="&lt;/em&gt;"/> krite
<source>LLM Request Timeout</source> <source>LLM Request Timeout</source>
<context-group purpose="location"> <context-group purpose="location">
<context context-type="sourcefile">src/app/data/paperless-config.ts</context> <context context-type="sourcefile">src/app/data/paperless-config.ts</context>
<context context-type="linenumber">416</context> <context context-type="linenumber">424</context>
</context-group> </context-group>
<target state="needs-translation">LLM Request Timeout</target> <target state="needs-translation">LLM Request Timeout</target>
</trans-unit> </trans-unit>
@@ -13383,7 +13399,7 @@ tüm <x id="CLOSE_EMPHASISED_TEXT" ctype="x-em" equiv-text="&lt;/em&gt;"/> krite
<source>Timeout in seconds for LLM requests.</source> <source>Timeout in seconds for LLM requests.</source>
<context-group purpose="location"> <context-group purpose="location">
<context context-type="sourcefile">src/app/data/paperless-config.ts</context> <context context-type="sourcefile">src/app/data/paperless-config.ts</context>
<context context-type="linenumber">420</context> <context context-type="linenumber">428</context>
</context-group> </context-group>
<target state="needs-translation">Timeout in seconds for LLM requests.</target> <target state="needs-translation">Timeout in seconds for LLM requests.</target>
</trans-unit> </trans-unit>
+37 -21
View File
@@ -10741,7 +10741,7 @@
</context-group> </context-group>
<context-group purpose="location"> <context-group purpose="location">
<context context-type="sourcefile">src/app/components/document-list/document-list.component.ts</context> <context context-type="sourcefile">src/app/components/document-list/document-list.component.ts</context>
<context context-type="linenumber">348</context> <context context-type="linenumber">351</context>
</context-group> </context-group>
<context-group purpose="location"> <context-group purpose="location">
<context context-type="sourcefile">src/app/components/manage/document-attributes/document-attributes.component.html</context> <context context-type="sourcefile">src/app/components/manage/document-attributes/document-attributes.component.html</context>
@@ -10757,7 +10757,7 @@
</context-group> </context-group>
<context-group purpose="location"> <context-group purpose="location">
<context context-type="sourcefile">src/app/components/document-list/document-list.component.ts</context> <context context-type="sourcefile">src/app/components/document-list/document-list.component.ts</context>
<context context-type="linenumber">341</context> <context context-type="linenumber">344</context>
</context-group> </context-group>
<context-group purpose="location"> <context-group purpose="location">
<context context-type="sourcefile">src/app/components/manage/document-attributes/document-attributes.component.html</context> <context context-type="sourcefile">src/app/components/manage/document-attributes/document-attributes.component.html</context>
@@ -11041,7 +11041,7 @@
<source>Reset filters / selection</source> <source>Reset filters / selection</source>
<context-group purpose="location"> <context-group purpose="location">
<context context-type="sourcefile">src/app/components/document-list/document-list.component.ts</context> <context context-type="sourcefile">src/app/components/document-list/document-list.component.ts</context>
<context context-type="linenumber">329</context> <context context-type="linenumber">332</context>
</context-group> </context-group>
<target state="translated">Скинути фільтри / вибір</target> <target state="translated">Скинути фільтри / вибір</target>
</trans-unit> </trans-unit>
@@ -11049,7 +11049,7 @@
<source>Open first [selected] document</source> <source>Open first [selected] document</source>
<context-group purpose="location"> <context-group purpose="location">
<context context-type="sourcefile">src/app/components/document-list/document-list.component.ts</context> <context context-type="sourcefile">src/app/components/document-list/document-list.component.ts</context>
<context context-type="linenumber">357</context> <context context-type="linenumber">360</context>
</context-group> </context-group>
<target state="translated">Відкрити перший [selected] документ</target> <target state="translated">Відкрити перший [selected] документ</target>
</trans-unit> </trans-unit>
@@ -11057,7 +11057,7 @@
<source>Previous page</source> <source>Previous page</source>
<context-group purpose="location"> <context-group purpose="location">
<context context-type="sourcefile">src/app/components/document-list/document-list.component.ts</context> <context context-type="sourcefile">src/app/components/document-list/document-list.component.ts</context>
<context context-type="linenumber">373</context> <context context-type="linenumber">376</context>
</context-group> </context-group>
<target state="translated">Попередня сторінка</target> <target state="translated">Попередня сторінка</target>
</trans-unit> </trans-unit>
@@ -11065,7 +11065,7 @@
<source>Next page</source> <source>Next page</source>
<context-group purpose="location"> <context-group purpose="location">
<context context-type="sourcefile">src/app/components/document-list/document-list.component.ts</context> <context context-type="sourcefile">src/app/components/document-list/document-list.component.ts</context>
<context context-type="linenumber">385</context> <context context-type="linenumber">388</context>
</context-group> </context-group>
<target state="translated">Наступна сторінка</target> <target state="translated">Наступна сторінка</target>
</trans-unit> </trans-unit>
@@ -11073,7 +11073,7 @@
<source>View &quot;<x id="PH" equiv-text="this.list.activeSavedViewTitle"/>&quot; saved successfully.</source> <source>View &quot;<x id="PH" equiv-text="this.list.activeSavedViewTitle"/>&quot; saved successfully.</source>
<context-group purpose="location"> <context-group purpose="location">
<context context-type="sourcefile">src/app/components/document-list/document-list.component.ts</context> <context context-type="sourcefile">src/app/components/document-list/document-list.component.ts</context>
<context context-type="linenumber">419</context> <context context-type="linenumber">422</context>
</context-group> </context-group>
<target state="translated">Представлення "<x id="PH" equiv-text="this.list.activeSavedViewTitle"/>" успішно збережено.</target> <target state="translated">Представлення "<x id="PH" equiv-text="this.list.activeSavedViewTitle"/>" успішно збережено.</target>
</trans-unit> </trans-unit>
@@ -11081,7 +11081,7 @@
<source>Failed to save view &quot;<x id="PH" equiv-text="this.list.activeSavedViewTitle"/>&quot;.</source> <source>Failed to save view &quot;<x id="PH" equiv-text="this.list.activeSavedViewTitle"/>&quot;.</source>
<context-group purpose="location"> <context-group purpose="location">
<context context-type="sourcefile">src/app/components/document-list/document-list.component.ts</context> <context context-type="sourcefile">src/app/components/document-list/document-list.component.ts</context>
<context context-type="linenumber">425</context> <context context-type="linenumber">428</context>
</context-group> </context-group>
<target state="needs-translation">Failed to save view "<x id="PH" equiv-text="this.list.activeSavedViewTitle"/>".</target> <target state="needs-translation">Failed to save view "<x id="PH" equiv-text="this.list.activeSavedViewTitle"/>".</target>
</trans-unit> </trans-unit>
@@ -11089,7 +11089,7 @@
<source>View &quot;<x id="PH" equiv-text="savedView.name"/>&quot; created successfully.</source> <source>View &quot;<x id="PH" equiv-text="savedView.name"/>&quot; created successfully.</source>
<context-group purpose="location"> <context-group purpose="location">
<context context-type="sourcefile">src/app/components/document-list/document-list.component.ts</context> <context context-type="sourcefile">src/app/components/document-list/document-list.component.ts</context>
<context context-type="linenumber">494</context> <context context-type="linenumber">497</context>
</context-group> </context-group>
<target state="translated">Представлення "<x id="PH" equiv-text="savedView.name"/>" успішно створено.</target> <target state="translated">Представлення "<x id="PH" equiv-text="savedView.name"/>" успішно створено.</target>
</trans-unit> </trans-unit>
@@ -11097,7 +11097,7 @@
<source>View &quot;<x id="PH" equiv-text="savedView.name"/>&quot; created successfully, but could not update visibility settings.</source> <source>View &quot;<x id="PH" equiv-text="savedView.name"/>&quot; created successfully, but could not update visibility settings.</source>
<context-group purpose="location"> <context-group purpose="location">
<context context-type="sourcefile">src/app/components/document-list/document-list.component.ts</context> <context context-type="sourcefile">src/app/components/document-list/document-list.component.ts</context>
<context context-type="linenumber">500</context> <context context-type="linenumber">503</context>
</context-group> </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="needs-translation">View "<x id="PH" equiv-text="savedView.name"/>" created successfully, but could not update visibility settings.</target>
</trans-unit> </trans-unit>
@@ -13298,11 +13298,27 @@
</context-group> </context-group>
<target state="needs-translation">LLM Embedding Model</target> <target state="needs-translation">LLM Embedding Model</target>
</trans-unit> </trans-unit>
<trans-unit id="861068592166833023" datatype="html">
<source>LLM Embedding API Key</source>
<context-group purpose="location">
<context context-type="sourcefile">src/app/data/paperless-config.ts</context>
<context context-type="linenumber">358</context>
</context-group>
<target state="needs-translation">LLM Embedding API Key</target>
</trans-unit>
<trans-unit id="2929108042259892948" datatype="html">
<source>Used for embeddings when set, otherwise LLM API key is used.</source>
<context-group purpose="location">
<context context-type="sourcefile">src/app/data/paperless-config.ts</context>
<context context-type="linenumber">360</context>
</context-group>
<target state="needs-translation">Used for embeddings when set, otherwise LLM API key is used.</target>
</trans-unit>
<trans-unit id="3554114880473286122" datatype="html"> <trans-unit id="3554114880473286122" datatype="html">
<source>LLM Embedding Endpoint</source> <source>LLM Embedding Endpoint</source>
<context-group purpose="location"> <context-group purpose="location">
<context context-type="sourcefile">src/app/data/paperless-config.ts</context> <context context-type="sourcefile">src/app/data/paperless-config.ts</context>
<context context-type="linenumber">358</context> <context context-type="linenumber">366</context>
</context-group> </context-group>
<target state="needs-translation">LLM Embedding Endpoint</target> <target state="needs-translation">LLM Embedding Endpoint</target>
</trans-unit> </trans-unit>
@@ -13310,7 +13326,7 @@
<source>LLM Embedding Chunk Size</source> <source>LLM Embedding Chunk Size</source>
<context-group purpose="location"> <context-group purpose="location">
<context context-type="sourcefile">src/app/data/paperless-config.ts</context> <context context-type="sourcefile">src/app/data/paperless-config.ts</context>
<context context-type="linenumber">365</context> <context context-type="linenumber">373</context>
</context-group> </context-group>
<target state="needs-translation">LLM Embedding Chunk Size</target> <target state="needs-translation">LLM Embedding Chunk Size</target>
</trans-unit> </trans-unit>
@@ -13318,7 +13334,7 @@
<source>LLM Context Size</source> <source>LLM Context Size</source>
<context-group purpose="location"> <context-group purpose="location">
<context context-type="sourcefile">src/app/data/paperless-config.ts</context> <context context-type="sourcefile">src/app/data/paperless-config.ts</context>
<context context-type="linenumber">372</context> <context context-type="linenumber">380</context>
</context-group> </context-group>
<target state="needs-translation">LLM Context Size</target> <target state="needs-translation">LLM Context Size</target>
</trans-unit> </trans-unit>
@@ -13326,7 +13342,7 @@
<source>LLM Backend</source> <source>LLM Backend</source>
<context-group purpose="location"> <context-group purpose="location">
<context context-type="sourcefile">src/app/data/paperless-config.ts</context> <context context-type="sourcefile">src/app/data/paperless-config.ts</context>
<context context-type="linenumber">379</context> <context context-type="linenumber">387</context>
</context-group> </context-group>
<target state="needs-translation">LLM Backend</target> <target state="needs-translation">LLM Backend</target>
</trans-unit> </trans-unit>
@@ -13334,7 +13350,7 @@
<source>LLM Model</source> <source>LLM Model</source>
<context-group purpose="location"> <context-group purpose="location">
<context context-type="sourcefile">src/app/data/paperless-config.ts</context> <context context-type="sourcefile">src/app/data/paperless-config.ts</context>
<context context-type="linenumber">387</context> <context context-type="linenumber">395</context>
</context-group> </context-group>
<target state="needs-translation">LLM Model</target> <target state="needs-translation">LLM Model</target>
</trans-unit> </trans-unit>
@@ -13342,7 +13358,7 @@
<source>LLM API Key</source> <source>LLM API Key</source>
<context-group purpose="location"> <context-group purpose="location">
<context context-type="sourcefile">src/app/data/paperless-config.ts</context> <context context-type="sourcefile">src/app/data/paperless-config.ts</context>
<context context-type="linenumber">394</context> <context context-type="linenumber">402</context>
</context-group> </context-group>
<target state="needs-translation">LLM API Key</target> <target state="needs-translation">LLM API Key</target>
</trans-unit> </trans-unit>
@@ -13350,7 +13366,7 @@
<source>LLM Endpoint</source> <source>LLM Endpoint</source>
<context-group purpose="location"> <context-group purpose="location">
<context context-type="sourcefile">src/app/data/paperless-config.ts</context> <context context-type="sourcefile">src/app/data/paperless-config.ts</context>
<context context-type="linenumber">401</context> <context context-type="linenumber">409</context>
</context-group> </context-group>
<target state="needs-translation">LLM Endpoint</target> <target state="needs-translation">LLM Endpoint</target>
</trans-unit> </trans-unit>
@@ -13358,7 +13374,7 @@
<source>LLM Output Language</source> <source>LLM Output Language</source>
<context-group purpose="location"> <context-group purpose="location">
<context context-type="sourcefile">src/app/data/paperless-config.ts</context> <context context-type="sourcefile">src/app/data/paperless-config.ts</context>
<context context-type="linenumber">408</context> <context context-type="linenumber">416</context>
</context-group> </context-group>
<target state="needs-translation">LLM Output Language</target> <target state="needs-translation">LLM Output Language</target>
</trans-unit> </trans-unit>
@@ -13366,7 +13382,7 @@
<source>Language to use for generated AI suggestions. When unset, AI suggestions use the user&apos;s display language if explicitly set.</source> <source>Language to use for generated AI suggestions. When unset, AI suggestions use the user&apos;s display language if explicitly set.</source>
<context-group purpose="location"> <context-group purpose="location">
<context context-type="sourcefile">src/app/data/paperless-config.ts</context> <context context-type="sourcefile">src/app/data/paperless-config.ts</context>
<context context-type="linenumber">412</context> <context context-type="linenumber">420</context>
</context-group> </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="needs-translation">Language to use for generated AI suggestions. When unset, AI suggestions use the user's display language if explicitly set.</target>
</trans-unit> </trans-unit>
@@ -13374,7 +13390,7 @@
<source>LLM Request Timeout</source> <source>LLM Request Timeout</source>
<context-group purpose="location"> <context-group purpose="location">
<context context-type="sourcefile">src/app/data/paperless-config.ts</context> <context context-type="sourcefile">src/app/data/paperless-config.ts</context>
<context context-type="linenumber">416</context> <context context-type="linenumber">424</context>
</context-group> </context-group>
<target state="needs-translation">LLM Request Timeout</target> <target state="needs-translation">LLM Request Timeout</target>
</trans-unit> </trans-unit>
@@ -13382,7 +13398,7 @@
<source>Timeout in seconds for LLM requests.</source> <source>Timeout in seconds for LLM requests.</source>
<context-group purpose="location"> <context-group purpose="location">
<context context-type="sourcefile">src/app/data/paperless-config.ts</context> <context context-type="sourcefile">src/app/data/paperless-config.ts</context>
<context context-type="linenumber">420</context> <context context-type="linenumber">428</context>
</context-group> </context-group>
<target state="needs-translation">Timeout in seconds for LLM requests.</target> <target state="needs-translation">Timeout in seconds for LLM requests.</target>
</trans-unit> </trans-unit>
+37 -21
View File
@@ -10797,7 +10797,7 @@
</context-group> </context-group>
<context-group purpose="location"> <context-group purpose="location">
<context context-type="sourcefile">src/app/components/document-list/document-list.component.ts</context> <context context-type="sourcefile">src/app/components/document-list/document-list.component.ts</context>
<context context-type="linenumber">348</context> <context context-type="linenumber">351</context>
</context-group> </context-group>
<context-group purpose="location"> <context-group purpose="location">
<context context-type="sourcefile">src/app/components/manage/document-attributes/document-attributes.component.html</context> <context context-type="sourcefile">src/app/components/manage/document-attributes/document-attributes.component.html</context>
@@ -10813,7 +10813,7 @@
</context-group> </context-group>
<context-group purpose="location"> <context-group purpose="location">
<context context-type="sourcefile">src/app/components/document-list/document-list.component.ts</context> <context context-type="sourcefile">src/app/components/document-list/document-list.component.ts</context>
<context context-type="linenumber">341</context> <context context-type="linenumber">344</context>
</context-group> </context-group>
<context-group purpose="location"> <context-group purpose="location">
<context context-type="sourcefile">src/app/components/manage/document-attributes/document-attributes.component.html</context> <context context-type="sourcefile">src/app/components/manage/document-attributes/document-attributes.component.html</context>
@@ -11103,7 +11103,7 @@
<source>Reset filters / selection</source> <source>Reset filters / selection</source>
<context-group purpose="location"> <context-group purpose="location">
<context context-type="sourcefile">src/app/components/document-list/document-list.component.ts</context> <context context-type="sourcefile">src/app/components/document-list/document-list.component.ts</context>
<context context-type="linenumber">329</context> <context context-type="linenumber">332</context>
</context-group> </context-group>
<target state="final">Đặt lại bộ lọc / bỏ chọn</target> <target state="final">Đặt lại bộ lọc / bỏ chọn</target>
</trans-unit> </trans-unit>
@@ -11111,7 +11111,7 @@
<source>Open first [selected] document</source> <source>Open first [selected] document</source>
<context-group purpose="location"> <context-group purpose="location">
<context context-type="sourcefile">src/app/components/document-list/document-list.component.ts</context> <context context-type="sourcefile">src/app/components/document-list/document-list.component.ts</context>
<context context-type="linenumber">357</context> <context context-type="linenumber">360</context>
</context-group> </context-group>
<target state="final">Mở tài liệu [Đã chọn] đầu tiên</target> <target state="final">Mở tài liệu [Đã chọn] đầu tiên</target>
</trans-unit> </trans-unit>
@@ -11119,7 +11119,7 @@
<source>Previous page</source> <source>Previous page</source>
<context-group purpose="location"> <context-group purpose="location">
<context context-type="sourcefile">src/app/components/document-list/document-list.component.ts</context> <context context-type="sourcefile">src/app/components/document-list/document-list.component.ts</context>
<context context-type="linenumber">373</context> <context context-type="linenumber">376</context>
</context-group> </context-group>
<target state="final">Trang trước</target> <target state="final">Trang trước</target>
</trans-unit> </trans-unit>
@@ -11127,7 +11127,7 @@
<source>Next page</source> <source>Next page</source>
<context-group purpose="location"> <context-group purpose="location">
<context context-type="sourcefile">src/app/components/document-list/document-list.component.ts</context> <context context-type="sourcefile">src/app/components/document-list/document-list.component.ts</context>
<context context-type="linenumber">385</context> <context context-type="linenumber">388</context>
</context-group> </context-group>
<target state="final">Trang tiếp theo</target> <target state="final">Trang tiếp theo</target>
</trans-unit> </trans-unit>
@@ -11135,7 +11135,7 @@
<source>View &quot;<x id="PH" equiv-text="this.list.activeSavedViewTitle"/>&quot; saved successfully.</source> <source>View &quot;<x id="PH" equiv-text="this.list.activeSavedViewTitle"/>&quot; saved successfully.</source>
<context-group purpose="location"> <context-group purpose="location">
<context context-type="sourcefile">src/app/components/document-list/document-list.component.ts</context> <context context-type="sourcefile">src/app/components/document-list/document-list.component.ts</context>
<context context-type="linenumber">419</context> <context context-type="linenumber">422</context>
</context-group> </context-group>
<target state="final">Xem "<x id="PH" equiv-text="this.list.activeSavedViewTitle"/>" đã lưu thành công.</target> <target state="final">Xem "<x id="PH" equiv-text="this.list.activeSavedViewTitle"/>" đã lưu thành công.</target>
</trans-unit> </trans-unit>
@@ -11143,7 +11143,7 @@
<source>Failed to save view &quot;<x id="PH" equiv-text="this.list.activeSavedViewTitle"/>&quot;.</source> <source>Failed to save view &quot;<x id="PH" equiv-text="this.list.activeSavedViewTitle"/>&quot;.</source>
<context-group purpose="location"> <context-group purpose="location">
<context context-type="sourcefile">src/app/components/document-list/document-list.component.ts</context> <context context-type="sourcefile">src/app/components/document-list/document-list.component.ts</context>
<context context-type="linenumber">425</context> <context context-type="linenumber">428</context>
</context-group> </context-group>
<target state="final"> <target state="final">
Không thể lưu chế độ xem "". Không thể lưu chế độ xem "".
@@ -11153,7 +11153,7 @@
<source>View &quot;<x id="PH" equiv-text="savedView.name"/>&quot; created successfully.</source> <source>View &quot;<x id="PH" equiv-text="savedView.name"/>&quot; created successfully.</source>
<context-group purpose="location"> <context-group purpose="location">
<context context-type="sourcefile">src/app/components/document-list/document-list.component.ts</context> <context context-type="sourcefile">src/app/components/document-list/document-list.component.ts</context>
<context context-type="linenumber">494</context> <context context-type="linenumber">497</context>
</context-group> </context-group>
<target state="final">Xem "<x id="PH" equiv-text="savedView.name"/>" đã tạo thành công.</target> <target state="final">Xem "<x id="PH" equiv-text="savedView.name"/>" đã tạo thành công.</target>
</trans-unit> </trans-unit>
@@ -11161,7 +11161,7 @@
<source>View &quot;<x id="PH" equiv-text="savedView.name"/>&quot; created successfully, but could not update visibility settings.</source> <source>View &quot;<x id="PH" equiv-text="savedView.name"/>&quot; created successfully, but could not update visibility settings.</source>
<context-group purpose="location"> <context-group purpose="location">
<context context-type="sourcefile">src/app/components/document-list/document-list.component.ts</context> <context context-type="sourcefile">src/app/components/document-list/document-list.component.ts</context>
<context context-type="linenumber">500</context> <context context-type="linenumber">503</context>
</context-group> </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="needs-translation">View "<x id="PH" equiv-text="savedView.name"/>" created successfully, but could not update visibility settings.</target>
</trans-unit> </trans-unit>
@@ -13432,11 +13432,27 @@
</context-group> </context-group>
<target state="needs-translation">LLM Embedding Model</target> <target state="needs-translation">LLM Embedding Model</target>
</trans-unit> </trans-unit>
<trans-unit id="861068592166833023" datatype="html">
<source>LLM Embedding API Key</source>
<context-group purpose="location">
<context context-type="sourcefile">src/app/data/paperless-config.ts</context>
<context context-type="linenumber">358</context>
</context-group>
<target state="needs-translation">LLM Embedding API Key</target>
</trans-unit>
<trans-unit id="2929108042259892948" datatype="html">
<source>Used for embeddings when set, otherwise LLM API key is used.</source>
<context-group purpose="location">
<context context-type="sourcefile">src/app/data/paperless-config.ts</context>
<context context-type="linenumber">360</context>
</context-group>
<target state="needs-translation">Used for embeddings when set, otherwise LLM API key is used.</target>
</trans-unit>
<trans-unit id="3554114880473286122" datatype="html"> <trans-unit id="3554114880473286122" datatype="html">
<source>LLM Embedding Endpoint</source> <source>LLM Embedding Endpoint</source>
<context-group purpose="location"> <context-group purpose="location">
<context context-type="sourcefile">src/app/data/paperless-config.ts</context> <context context-type="sourcefile">src/app/data/paperless-config.ts</context>
<context context-type="linenumber">358</context> <context context-type="linenumber">366</context>
</context-group> </context-group>
<target state="needs-translation">LLM Embedding Endpoint</target> <target state="needs-translation">LLM Embedding Endpoint</target>
</trans-unit> </trans-unit>
@@ -13444,7 +13460,7 @@
<source>LLM Embedding Chunk Size</source> <source>LLM Embedding Chunk Size</source>
<context-group purpose="location"> <context-group purpose="location">
<context context-type="sourcefile">src/app/data/paperless-config.ts</context> <context context-type="sourcefile">src/app/data/paperless-config.ts</context>
<context context-type="linenumber">365</context> <context context-type="linenumber">373</context>
</context-group> </context-group>
<target state="needs-translation">LLM Embedding Chunk Size</target> <target state="needs-translation">LLM Embedding Chunk Size</target>
</trans-unit> </trans-unit>
@@ -13452,7 +13468,7 @@
<source>LLM Context Size</source> <source>LLM Context Size</source>
<context-group purpose="location"> <context-group purpose="location">
<context context-type="sourcefile">src/app/data/paperless-config.ts</context> <context context-type="sourcefile">src/app/data/paperless-config.ts</context>
<context context-type="linenumber">372</context> <context context-type="linenumber">380</context>
</context-group> </context-group>
<target state="needs-translation">LLM Context Size</target> <target state="needs-translation">LLM Context Size</target>
</trans-unit> </trans-unit>
@@ -13460,7 +13476,7 @@
<source>LLM Backend</source> <source>LLM Backend</source>
<context-group purpose="location"> <context-group purpose="location">
<context context-type="sourcefile">src/app/data/paperless-config.ts</context> <context context-type="sourcefile">src/app/data/paperless-config.ts</context>
<context context-type="linenumber">379</context> <context context-type="linenumber">387</context>
</context-group> </context-group>
<target state="needs-translation">LLM Backend</target> <target state="needs-translation">LLM Backend</target>
</trans-unit> </trans-unit>
@@ -13468,7 +13484,7 @@
<source>LLM Model</source> <source>LLM Model</source>
<context-group purpose="location"> <context-group purpose="location">
<context context-type="sourcefile">src/app/data/paperless-config.ts</context> <context context-type="sourcefile">src/app/data/paperless-config.ts</context>
<context context-type="linenumber">387</context> <context context-type="linenumber">395</context>
</context-group> </context-group>
<target state="needs-translation">LLM Model</target> <target state="needs-translation">LLM Model</target>
</trans-unit> </trans-unit>
@@ -13476,7 +13492,7 @@
<source>LLM API Key</source> <source>LLM API Key</source>
<context-group purpose="location"> <context-group purpose="location">
<context context-type="sourcefile">src/app/data/paperless-config.ts</context> <context context-type="sourcefile">src/app/data/paperless-config.ts</context>
<context context-type="linenumber">394</context> <context context-type="linenumber">402</context>
</context-group> </context-group>
<target state="needs-translation">LLM API Key</target> <target state="needs-translation">LLM API Key</target>
</trans-unit> </trans-unit>
@@ -13484,7 +13500,7 @@
<source>LLM Endpoint</source> <source>LLM Endpoint</source>
<context-group purpose="location"> <context-group purpose="location">
<context context-type="sourcefile">src/app/data/paperless-config.ts</context> <context context-type="sourcefile">src/app/data/paperless-config.ts</context>
<context context-type="linenumber">401</context> <context context-type="linenumber">409</context>
</context-group> </context-group>
<target state="needs-translation">LLM Endpoint</target> <target state="needs-translation">LLM Endpoint</target>
</trans-unit> </trans-unit>
@@ -13492,7 +13508,7 @@
<source>LLM Output Language</source> <source>LLM Output Language</source>
<context-group purpose="location"> <context-group purpose="location">
<context context-type="sourcefile">src/app/data/paperless-config.ts</context> <context context-type="sourcefile">src/app/data/paperless-config.ts</context>
<context context-type="linenumber">408</context> <context context-type="linenumber">416</context>
</context-group> </context-group>
<target state="needs-translation">LLM Output Language</target> <target state="needs-translation">LLM Output Language</target>
</trans-unit> </trans-unit>
@@ -13500,7 +13516,7 @@
<source>Language to use for generated AI suggestions. When unset, AI suggestions use the user&apos;s display language if explicitly set.</source> <source>Language to use for generated AI suggestions. When unset, AI suggestions use the user&apos;s display language if explicitly set.</source>
<context-group purpose="location"> <context-group purpose="location">
<context context-type="sourcefile">src/app/data/paperless-config.ts</context> <context context-type="sourcefile">src/app/data/paperless-config.ts</context>
<context context-type="linenumber">412</context> <context context-type="linenumber">420</context>
</context-group> </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="needs-translation">Language to use for generated AI suggestions. When unset, AI suggestions use the user's display language if explicitly set.</target>
</trans-unit> </trans-unit>
@@ -13508,7 +13524,7 @@
<source>LLM Request Timeout</source> <source>LLM Request Timeout</source>
<context-group purpose="location"> <context-group purpose="location">
<context context-type="sourcefile">src/app/data/paperless-config.ts</context> <context context-type="sourcefile">src/app/data/paperless-config.ts</context>
<context context-type="linenumber">416</context> <context context-type="linenumber">424</context>
</context-group> </context-group>
<target state="needs-translation">LLM Request Timeout</target> <target state="needs-translation">LLM Request Timeout</target>
</trans-unit> </trans-unit>
@@ -13516,7 +13532,7 @@
<source>Timeout in seconds for LLM requests.</source> <source>Timeout in seconds for LLM requests.</source>
<context-group purpose="location"> <context-group purpose="location">
<context context-type="sourcefile">src/app/data/paperless-config.ts</context> <context context-type="sourcefile">src/app/data/paperless-config.ts</context>
<context context-type="linenumber">420</context> <context context-type="linenumber">428</context>
</context-group> </context-group>
<target state="needs-translation">Timeout in seconds for LLM requests.</target> <target state="needs-translation">Timeout in seconds for LLM requests.</target>
</trans-unit> </trans-unit>
+37 -21
View File
@@ -10740,7 +10740,7 @@
</context-group> </context-group>
<context-group purpose="location"> <context-group purpose="location">
<context context-type="sourcefile">src/app/components/document-list/document-list.component.ts</context> <context context-type="sourcefile">src/app/components/document-list/document-list.component.ts</context>
<context context-type="linenumber">348</context> <context context-type="linenumber">351</context>
</context-group> </context-group>
<context-group purpose="location"> <context-group purpose="location">
<context context-type="sourcefile">src/app/components/manage/document-attributes/document-attributes.component.html</context> <context context-type="sourcefile">src/app/components/manage/document-attributes/document-attributes.component.html</context>
@@ -10756,7 +10756,7 @@
</context-group> </context-group>
<context-group purpose="location"> <context-group purpose="location">
<context context-type="sourcefile">src/app/components/document-list/document-list.component.ts</context> <context context-type="sourcefile">src/app/components/document-list/document-list.component.ts</context>
<context context-type="linenumber">341</context> <context context-type="linenumber">344</context>
</context-group> </context-group>
<context-group purpose="location"> <context-group purpose="location">
<context context-type="sourcefile">src/app/components/manage/document-attributes/document-attributes.component.html</context> <context context-type="sourcefile">src/app/components/manage/document-attributes/document-attributes.component.html</context>
@@ -11040,7 +11040,7 @@
<source>Reset filters / selection</source> <source>Reset filters / selection</source>
<context-group purpose="location"> <context-group purpose="location">
<context context-type="sourcefile">src/app/components/document-list/document-list.component.ts</context> <context context-type="sourcefile">src/app/components/document-list/document-list.component.ts</context>
<context context-type="linenumber">329</context> <context context-type="linenumber">332</context>
</context-group> </context-group>
<target state="translated">重置筛选 / 选择</target> <target state="translated">重置筛选 / 选择</target>
</trans-unit> </trans-unit>
@@ -11048,7 +11048,7 @@
<source>Open first [selected] document</source> <source>Open first [selected] document</source>
<context-group purpose="location"> <context-group purpose="location">
<context context-type="sourcefile">src/app/components/document-list/document-list.component.ts</context> <context context-type="sourcefile">src/app/components/document-list/document-list.component.ts</context>
<context context-type="linenumber">357</context> <context context-type="linenumber">360</context>
</context-group> </context-group>
<target state="translated">打开第一个 [已选中] 文档</target> <target state="translated">打开第一个 [已选中] 文档</target>
</trans-unit> </trans-unit>
@@ -11056,7 +11056,7 @@
<source>Previous page</source> <source>Previous page</source>
<context-group purpose="location"> <context-group purpose="location">
<context context-type="sourcefile">src/app/components/document-list/document-list.component.ts</context> <context context-type="sourcefile">src/app/components/document-list/document-list.component.ts</context>
<context context-type="linenumber">373</context> <context context-type="linenumber">376</context>
</context-group> </context-group>
<target state="translated">上一頁</target> <target state="translated">上一頁</target>
</trans-unit> </trans-unit>
@@ -11064,7 +11064,7 @@
<source>Next page</source> <source>Next page</source>
<context-group purpose="location"> <context-group purpose="location">
<context context-type="sourcefile">src/app/components/document-list/document-list.component.ts</context> <context context-type="sourcefile">src/app/components/document-list/document-list.component.ts</context>
<context context-type="linenumber">385</context> <context context-type="linenumber">388</context>
</context-group> </context-group>
<target state="translated">下一頁</target> <target state="translated">下一頁</target>
</trans-unit> </trans-unit>
@@ -11072,7 +11072,7 @@
<source>View &quot;<x id="PH" equiv-text="this.list.activeSavedViewTitle"/>&quot; saved successfully.</source> <source>View &quot;<x id="PH" equiv-text="this.list.activeSavedViewTitle"/>&quot; saved successfully.</source>
<context-group purpose="location"> <context-group purpose="location">
<context context-type="sourcefile">src/app/components/document-list/document-list.component.ts</context> <context context-type="sourcefile">src/app/components/document-list/document-list.component.ts</context>
<context context-type="linenumber">419</context> <context context-type="linenumber">422</context>
</context-group> </context-group>
<target state="translated">视图<x id="PH" equiv-text="this.list.activeSavedViewTitle"/>保存成功。</target> <target state="translated">视图<x id="PH" equiv-text="this.list.activeSavedViewTitle"/>保存成功。</target>
</trans-unit> </trans-unit>
@@ -11080,7 +11080,7 @@
<source>Failed to save view &quot;<x id="PH" equiv-text="this.list.activeSavedViewTitle"/>&quot;.</source> <source>Failed to save view &quot;<x id="PH" equiv-text="this.list.activeSavedViewTitle"/>&quot;.</source>
<context-group purpose="location"> <context-group purpose="location">
<context context-type="sourcefile">src/app/components/document-list/document-list.component.ts</context> <context context-type="sourcefile">src/app/components/document-list/document-list.component.ts</context>
<context context-type="linenumber">425</context> <context context-type="linenumber">428</context>
</context-group> </context-group>
<target state="translated">无法保存视图 "<x id="PH" equiv-text="this.list.activeSavedViewTitle"/>"。</target> <target state="translated">无法保存视图 "<x id="PH" equiv-text="this.list.activeSavedViewTitle"/>"。</target>
</trans-unit> </trans-unit>
@@ -11088,7 +11088,7 @@
<source>View &quot;<x id="PH" equiv-text="savedView.name"/>&quot; created successfully.</source> <source>View &quot;<x id="PH" equiv-text="savedView.name"/>&quot; created successfully.</source>
<context-group purpose="location"> <context-group purpose="location">
<context context-type="sourcefile">src/app/components/document-list/document-list.component.ts</context> <context context-type="sourcefile">src/app/components/document-list/document-list.component.ts</context>
<context context-type="linenumber">494</context> <context context-type="linenumber">497</context>
</context-group> </context-group>
<target state="translated">视图:<x id="PH" equiv-text="savedView.name"/>创建成功。</target> <target state="translated">视图:<x id="PH" equiv-text="savedView.name"/>创建成功。</target>
</trans-unit> </trans-unit>
@@ -11096,7 +11096,7 @@
<source>View &quot;<x id="PH" equiv-text="savedView.name"/>&quot; created successfully, but could not update visibility settings.</source> <source>View &quot;<x id="PH" equiv-text="savedView.name"/>&quot; created successfully, but could not update visibility settings.</source>
<context-group purpose="location"> <context-group purpose="location">
<context context-type="sourcefile">src/app/components/document-list/document-list.component.ts</context> <context context-type="sourcefile">src/app/components/document-list/document-list.component.ts</context>
<context context-type="linenumber">500</context> <context context-type="linenumber">503</context>
</context-group> </context-group>
<target state="translated">已成功创建视图“<x id="PH" equiv-text="savedView.name"/>”,但无法更新可见性设置。</target> <target state="translated">已成功创建视图“<x id="PH" equiv-text="savedView.name"/>”,但无法更新可见性设置。</target>
</trans-unit> </trans-unit>
@@ -13298,11 +13298,27 @@
</context-group> </context-group>
<target state="translated">LLM 嵌入模型</target> <target state="translated">LLM 嵌入模型</target>
</trans-unit> </trans-unit>
<trans-unit id="861068592166833023" datatype="html">
<source>LLM Embedding API Key</source>
<context-group purpose="location">
<context context-type="sourcefile">src/app/data/paperless-config.ts</context>
<context context-type="linenumber">358</context>
</context-group>
<target state="needs-translation">LLM Embedding API Key</target>
</trans-unit>
<trans-unit id="2929108042259892948" datatype="html">
<source>Used for embeddings when set, otherwise LLM API key is used.</source>
<context-group purpose="location">
<context context-type="sourcefile">src/app/data/paperless-config.ts</context>
<context context-type="linenumber">360</context>
</context-group>
<target state="needs-translation">Used for embeddings when set, otherwise LLM API key is used.</target>
</trans-unit>
<trans-unit id="3554114880473286122" datatype="html"> <trans-unit id="3554114880473286122" datatype="html">
<source>LLM Embedding Endpoint</source> <source>LLM Embedding Endpoint</source>
<context-group purpose="location"> <context-group purpose="location">
<context context-type="sourcefile">src/app/data/paperless-config.ts</context> <context context-type="sourcefile">src/app/data/paperless-config.ts</context>
<context context-type="linenumber">358</context> <context context-type="linenumber">366</context>
</context-group> </context-group>
<target state="translated">LLM 嵌入接口</target> <target state="translated">LLM 嵌入接口</target>
</trans-unit> </trans-unit>
@@ -13310,7 +13326,7 @@
<source>LLM Embedding Chunk Size</source> <source>LLM Embedding Chunk Size</source>
<context-group purpose="location"> <context-group purpose="location">
<context context-type="sourcefile">src/app/data/paperless-config.ts</context> <context context-type="sourcefile">src/app/data/paperless-config.ts</context>
<context context-type="linenumber">365</context> <context context-type="linenumber">373</context>
</context-group> </context-group>
<target state="translated">LLM 嵌入块大小</target> <target state="translated">LLM 嵌入块大小</target>
</trans-unit> </trans-unit>
@@ -13318,7 +13334,7 @@
<source>LLM Context Size</source> <source>LLM Context Size</source>
<context-group purpose="location"> <context-group purpose="location">
<context context-type="sourcefile">src/app/data/paperless-config.ts</context> <context context-type="sourcefile">src/app/data/paperless-config.ts</context>
<context context-type="linenumber">372</context> <context context-type="linenumber">380</context>
</context-group> </context-group>
<target state="translated">LLM 上下文大小</target> <target state="translated">LLM 上下文大小</target>
</trans-unit> </trans-unit>
@@ -13326,7 +13342,7 @@
<source>LLM Backend</source> <source>LLM Backend</source>
<context-group purpose="location"> <context-group purpose="location">
<context context-type="sourcefile">src/app/data/paperless-config.ts</context> <context context-type="sourcefile">src/app/data/paperless-config.ts</context>
<context context-type="linenumber">379</context> <context context-type="linenumber">387</context>
</context-group> </context-group>
<target state="translated">LLM 后端</target> <target state="translated">LLM 后端</target>
</trans-unit> </trans-unit>
@@ -13334,7 +13350,7 @@
<source>LLM Model</source> <source>LLM Model</source>
<context-group purpose="location"> <context-group purpose="location">
<context context-type="sourcefile">src/app/data/paperless-config.ts</context> <context context-type="sourcefile">src/app/data/paperless-config.ts</context>
<context context-type="linenumber">387</context> <context context-type="linenumber">395</context>
</context-group> </context-group>
<target state="translated">LLM 模型</target> <target state="translated">LLM 模型</target>
</trans-unit> </trans-unit>
@@ -13342,7 +13358,7 @@
<source>LLM API Key</source> <source>LLM API Key</source>
<context-group purpose="location"> <context-group purpose="location">
<context context-type="sourcefile">src/app/data/paperless-config.ts</context> <context context-type="sourcefile">src/app/data/paperless-config.ts</context>
<context context-type="linenumber">394</context> <context context-type="linenumber">402</context>
</context-group> </context-group>
<target state="translated">LLM API 密钥</target> <target state="translated">LLM API 密钥</target>
</trans-unit> </trans-unit>
@@ -13350,7 +13366,7 @@
<source>LLM Endpoint</source> <source>LLM Endpoint</source>
<context-group purpose="location"> <context-group purpose="location">
<context context-type="sourcefile">src/app/data/paperless-config.ts</context> <context context-type="sourcefile">src/app/data/paperless-config.ts</context>
<context context-type="linenumber">401</context> <context context-type="linenumber">409</context>
</context-group> </context-group>
<target state="translated">LLM 接口</target> <target state="translated">LLM 接口</target>
</trans-unit> </trans-unit>
@@ -13358,7 +13374,7 @@
<source>LLM Output Language</source> <source>LLM Output Language</source>
<context-group purpose="location"> <context-group purpose="location">
<context context-type="sourcefile">src/app/data/paperless-config.ts</context> <context context-type="sourcefile">src/app/data/paperless-config.ts</context>
<context context-type="linenumber">408</context> <context context-type="linenumber">416</context>
</context-group> </context-group>
<target state="translated">LLM 输出语言</target> <target state="translated">LLM 输出语言</target>
</trans-unit> </trans-unit>
@@ -13366,7 +13382,7 @@
<source>Language to use for generated AI suggestions. When unset, AI suggestions use the user&apos;s display language if explicitly set.</source> <source>Language to use for generated AI suggestions. When unset, AI suggestions use the user&apos;s display language if explicitly set.</source>
<context-group purpose="location"> <context-group purpose="location">
<context context-type="sourcefile">src/app/data/paperless-config.ts</context> <context context-type="sourcefile">src/app/data/paperless-config.ts</context>
<context context-type="linenumber">412</context> <context context-type="linenumber">420</context>
</context-group> </context-group>
<target state="translated">用于生成 AI 建议的语言。未设置时,如果用户明确设置了显示语言,AI 建议将使用该语言。</target> <target state="translated">用于生成 AI 建议的语言。未设置时,如果用户明确设置了显示语言,AI 建议将使用该语言。</target>
</trans-unit> </trans-unit>
@@ -13374,7 +13390,7 @@
<source>LLM Request Timeout</source> <source>LLM Request Timeout</source>
<context-group purpose="location"> <context-group purpose="location">
<context context-type="sourcefile">src/app/data/paperless-config.ts</context> <context context-type="sourcefile">src/app/data/paperless-config.ts</context>
<context context-type="linenumber">416</context> <context context-type="linenumber">424</context>
</context-group> </context-group>
<target state="translated">LLM 请求超时</target> <target state="translated">LLM 请求超时</target>
</trans-unit> </trans-unit>
@@ -13382,7 +13398,7 @@
<source>Timeout in seconds for LLM requests.</source> <source>Timeout in seconds for LLM requests.</source>
<context-group purpose="location"> <context-group purpose="location">
<context context-type="sourcefile">src/app/data/paperless-config.ts</context> <context context-type="sourcefile">src/app/data/paperless-config.ts</context>
<context context-type="linenumber">420</context> <context context-type="linenumber">428</context>
</context-group> </context-group>
<target state="translated">LLM 请求超时时间(秒)。</target> <target state="translated">LLM 请求超时时间(秒)。</target>
</trans-unit> </trans-unit>
+37 -21
View File
@@ -10741,7 +10741,7 @@
</context-group> </context-group>
<context-group purpose="location"> <context-group purpose="location">
<context context-type="sourcefile">src/app/components/document-list/document-list.component.ts</context> <context context-type="sourcefile">src/app/components/document-list/document-list.component.ts</context>
<context context-type="linenumber">348</context> <context context-type="linenumber">351</context>
</context-group> </context-group>
<context-group purpose="location"> <context-group purpose="location">
<context context-type="sourcefile">src/app/components/manage/document-attributes/document-attributes.component.html</context> <context context-type="sourcefile">src/app/components/manage/document-attributes/document-attributes.component.html</context>
@@ -10757,7 +10757,7 @@
</context-group> </context-group>
<context-group purpose="location"> <context-group purpose="location">
<context context-type="sourcefile">src/app/components/document-list/document-list.component.ts</context> <context context-type="sourcefile">src/app/components/document-list/document-list.component.ts</context>
<context context-type="linenumber">341</context> <context context-type="linenumber">344</context>
</context-group> </context-group>
<context-group purpose="location"> <context-group purpose="location">
<context context-type="sourcefile">src/app/components/manage/document-attributes/document-attributes.component.html</context> <context context-type="sourcefile">src/app/components/manage/document-attributes/document-attributes.component.html</context>
@@ -11041,7 +11041,7 @@
<source>Reset filters / selection</source> <source>Reset filters / selection</source>
<context-group purpose="location"> <context-group purpose="location">
<context context-type="sourcefile">src/app/components/document-list/document-list.component.ts</context> <context context-type="sourcefile">src/app/components/document-list/document-list.component.ts</context>
<context context-type="linenumber">329</context> <context context-type="linenumber">332</context>
</context-group> </context-group>
<target state="translated">重置篩條件/選項</target> <target state="translated">重置篩條件/選項</target>
</trans-unit> </trans-unit>
@@ -11049,7 +11049,7 @@
<source>Open first [selected] document</source> <source>Open first [selected] document</source>
<context-group purpose="location"> <context-group purpose="location">
<context context-type="sourcefile">src/app/components/document-list/document-list.component.ts</context> <context context-type="sourcefile">src/app/components/document-list/document-list.component.ts</context>
<context context-type="linenumber">357</context> <context context-type="linenumber">360</context>
</context-group> </context-group>
<target state="translated">開啟前 [selected] 個文件</target> <target state="translated">開啟前 [selected] 個文件</target>
</trans-unit> </trans-unit>
@@ -11057,7 +11057,7 @@
<source>Previous page</source> <source>Previous page</source>
<context-group purpose="location"> <context-group purpose="location">
<context context-type="sourcefile">src/app/components/document-list/document-list.component.ts</context> <context context-type="sourcefile">src/app/components/document-list/document-list.component.ts</context>
<context context-type="linenumber">373</context> <context context-type="linenumber">376</context>
</context-group> </context-group>
<target state="translated">上一頁</target> <target state="translated">上一頁</target>
</trans-unit> </trans-unit>
@@ -11065,7 +11065,7 @@
<source>Next page</source> <source>Next page</source>
<context-group purpose="location"> <context-group purpose="location">
<context context-type="sourcefile">src/app/components/document-list/document-list.component.ts</context> <context context-type="sourcefile">src/app/components/document-list/document-list.component.ts</context>
<context context-type="linenumber">385</context> <context context-type="linenumber">388</context>
</context-group> </context-group>
<target state="translated">下一頁</target> <target state="translated">下一頁</target>
</trans-unit> </trans-unit>
@@ -11073,7 +11073,7 @@
<source>View &quot;<x id="PH" equiv-text="this.list.activeSavedViewTitle"/>&quot; saved successfully.</source> <source>View &quot;<x id="PH" equiv-text="this.list.activeSavedViewTitle"/>&quot; saved successfully.</source>
<context-group purpose="location"> <context-group purpose="location">
<context context-type="sourcefile">src/app/components/document-list/document-list.component.ts</context> <context context-type="sourcefile">src/app/components/document-list/document-list.component.ts</context>
<context context-type="linenumber">419</context> <context context-type="linenumber">422</context>
</context-group> </context-group>
<target state="translated">檢視表「<x id="PH" equiv-text="this.list.activeSavedViewTitle"/>」儲存成功。</target> <target state="translated">檢視表「<x id="PH" equiv-text="this.list.activeSavedViewTitle"/>」儲存成功。</target>
</trans-unit> </trans-unit>
@@ -11081,7 +11081,7 @@
<source>Failed to save view &quot;<x id="PH" equiv-text="this.list.activeSavedViewTitle"/>&quot;.</source> <source>Failed to save view &quot;<x id="PH" equiv-text="this.list.activeSavedViewTitle"/>&quot;.</source>
<context-group purpose="location"> <context-group purpose="location">
<context context-type="sourcefile">src/app/components/document-list/document-list.component.ts</context> <context context-type="sourcefile">src/app/components/document-list/document-list.component.ts</context>
<context context-type="linenumber">425</context> <context context-type="linenumber">428</context>
</context-group> </context-group>
<target state="translated">檢視表「<x id="PH" equiv-text="this.list.activeSavedViewTitle"/>」儲存失敗。</target> <target state="translated">檢視表「<x id="PH" equiv-text="this.list.activeSavedViewTitle"/>」儲存失敗。</target>
</trans-unit> </trans-unit>
@@ -11089,7 +11089,7 @@
<source>View &quot;<x id="PH" equiv-text="savedView.name"/>&quot; created successfully.</source> <source>View &quot;<x id="PH" equiv-text="savedView.name"/>&quot; created successfully.</source>
<context-group purpose="location"> <context-group purpose="location">
<context context-type="sourcefile">src/app/components/document-list/document-list.component.ts</context> <context context-type="sourcefile">src/app/components/document-list/document-list.component.ts</context>
<context context-type="linenumber">494</context> <context context-type="linenumber">497</context>
</context-group> </context-group>
<target state="translated">檢視表「<x id="PH" equiv-text="savedView.name"/>」建立成功。</target> <target state="translated">檢視表「<x id="PH" equiv-text="savedView.name"/>」建立成功。</target>
</trans-unit> </trans-unit>
@@ -11097,7 +11097,7 @@
<source>View &quot;<x id="PH" equiv-text="savedView.name"/>&quot; created successfully, but could not update visibility settings.</source> <source>View &quot;<x id="PH" equiv-text="savedView.name"/>&quot; created successfully, but could not update visibility settings.</source>
<context-group purpose="location"> <context-group purpose="location">
<context context-type="sourcefile">src/app/components/document-list/document-list.component.ts</context> <context context-type="sourcefile">src/app/components/document-list/document-list.component.ts</context>
<context context-type="linenumber">500</context> <context context-type="linenumber">503</context>
</context-group> </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="needs-translation">View "<x id="PH" equiv-text="savedView.name"/>" created successfully, but could not update visibility settings.</target>
</trans-unit> </trans-unit>
@@ -13298,11 +13298,27 @@
</context-group> </context-group>
<target state="needs-translation">LLM Embedding Model</target> <target state="needs-translation">LLM Embedding Model</target>
</trans-unit> </trans-unit>
<trans-unit id="861068592166833023" datatype="html">
<source>LLM Embedding API Key</source>
<context-group purpose="location">
<context context-type="sourcefile">src/app/data/paperless-config.ts</context>
<context context-type="linenumber">358</context>
</context-group>
<target state="needs-translation">LLM Embedding API Key</target>
</trans-unit>
<trans-unit id="2929108042259892948" datatype="html">
<source>Used for embeddings when set, otherwise LLM API key is used.</source>
<context-group purpose="location">
<context context-type="sourcefile">src/app/data/paperless-config.ts</context>
<context context-type="linenumber">360</context>
</context-group>
<target state="needs-translation">Used for embeddings when set, otherwise LLM API key is used.</target>
</trans-unit>
<trans-unit id="3554114880473286122" datatype="html"> <trans-unit id="3554114880473286122" datatype="html">
<source>LLM Embedding Endpoint</source> <source>LLM Embedding Endpoint</source>
<context-group purpose="location"> <context-group purpose="location">
<context context-type="sourcefile">src/app/data/paperless-config.ts</context> <context context-type="sourcefile">src/app/data/paperless-config.ts</context>
<context context-type="linenumber">358</context> <context context-type="linenumber">366</context>
</context-group> </context-group>
<target state="needs-translation">LLM Embedding Endpoint</target> <target state="needs-translation">LLM Embedding Endpoint</target>
</trans-unit> </trans-unit>
@@ -13310,7 +13326,7 @@
<source>LLM Embedding Chunk Size</source> <source>LLM Embedding Chunk Size</source>
<context-group purpose="location"> <context-group purpose="location">
<context context-type="sourcefile">src/app/data/paperless-config.ts</context> <context context-type="sourcefile">src/app/data/paperless-config.ts</context>
<context context-type="linenumber">365</context> <context context-type="linenumber">373</context>
</context-group> </context-group>
<target state="needs-translation">LLM Embedding Chunk Size</target> <target state="needs-translation">LLM Embedding Chunk Size</target>
</trans-unit> </trans-unit>
@@ -13318,7 +13334,7 @@
<source>LLM Context Size</source> <source>LLM Context Size</source>
<context-group purpose="location"> <context-group purpose="location">
<context context-type="sourcefile">src/app/data/paperless-config.ts</context> <context context-type="sourcefile">src/app/data/paperless-config.ts</context>
<context context-type="linenumber">372</context> <context context-type="linenumber">380</context>
</context-group> </context-group>
<target state="needs-translation">LLM Context Size</target> <target state="needs-translation">LLM Context Size</target>
</trans-unit> </trans-unit>
@@ -13326,7 +13342,7 @@
<source>LLM Backend</source> <source>LLM Backend</source>
<context-group purpose="location"> <context-group purpose="location">
<context context-type="sourcefile">src/app/data/paperless-config.ts</context> <context context-type="sourcefile">src/app/data/paperless-config.ts</context>
<context context-type="linenumber">379</context> <context context-type="linenumber">387</context>
</context-group> </context-group>
<target state="needs-translation">LLM Backend</target> <target state="needs-translation">LLM Backend</target>
</trans-unit> </trans-unit>
@@ -13334,7 +13350,7 @@
<source>LLM Model</source> <source>LLM Model</source>
<context-group purpose="location"> <context-group purpose="location">
<context context-type="sourcefile">src/app/data/paperless-config.ts</context> <context context-type="sourcefile">src/app/data/paperless-config.ts</context>
<context context-type="linenumber">387</context> <context context-type="linenumber">395</context>
</context-group> </context-group>
<target state="needs-translation">LLM Model</target> <target state="needs-translation">LLM Model</target>
</trans-unit> </trans-unit>
@@ -13342,7 +13358,7 @@
<source>LLM API Key</source> <source>LLM API Key</source>
<context-group purpose="location"> <context-group purpose="location">
<context context-type="sourcefile">src/app/data/paperless-config.ts</context> <context context-type="sourcefile">src/app/data/paperless-config.ts</context>
<context context-type="linenumber">394</context> <context context-type="linenumber">402</context>
</context-group> </context-group>
<target state="needs-translation">LLM API Key</target> <target state="needs-translation">LLM API Key</target>
</trans-unit> </trans-unit>
@@ -13350,7 +13366,7 @@
<source>LLM Endpoint</source> <source>LLM Endpoint</source>
<context-group purpose="location"> <context-group purpose="location">
<context context-type="sourcefile">src/app/data/paperless-config.ts</context> <context context-type="sourcefile">src/app/data/paperless-config.ts</context>
<context context-type="linenumber">401</context> <context context-type="linenumber">409</context>
</context-group> </context-group>
<target state="needs-translation">LLM Endpoint</target> <target state="needs-translation">LLM Endpoint</target>
</trans-unit> </trans-unit>
@@ -13358,7 +13374,7 @@
<source>LLM Output Language</source> <source>LLM Output Language</source>
<context-group purpose="location"> <context-group purpose="location">
<context context-type="sourcefile">src/app/data/paperless-config.ts</context> <context context-type="sourcefile">src/app/data/paperless-config.ts</context>
<context context-type="linenumber">408</context> <context context-type="linenumber">416</context>
</context-group> </context-group>
<target state="needs-translation">LLM Output Language</target> <target state="needs-translation">LLM Output Language</target>
</trans-unit> </trans-unit>
@@ -13366,7 +13382,7 @@
<source>Language to use for generated AI suggestions. When unset, AI suggestions use the user&apos;s display language if explicitly set.</source> <source>Language to use for generated AI suggestions. When unset, AI suggestions use the user&apos;s display language if explicitly set.</source>
<context-group purpose="location"> <context-group purpose="location">
<context context-type="sourcefile">src/app/data/paperless-config.ts</context> <context context-type="sourcefile">src/app/data/paperless-config.ts</context>
<context context-type="linenumber">412</context> <context context-type="linenumber">420</context>
</context-group> </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="needs-translation">Language to use for generated AI suggestions. When unset, AI suggestions use the user's display language if explicitly set.</target>
</trans-unit> </trans-unit>
@@ -13374,7 +13390,7 @@
<source>LLM Request Timeout</source> <source>LLM Request Timeout</source>
<context-group purpose="location"> <context-group purpose="location">
<context context-type="sourcefile">src/app/data/paperless-config.ts</context> <context context-type="sourcefile">src/app/data/paperless-config.ts</context>
<context context-type="linenumber">416</context> <context context-type="linenumber">424</context>
</context-group> </context-group>
<target state="needs-translation">LLM Request Timeout</target> <target state="needs-translation">LLM Request Timeout</target>
</trans-unit> </trans-unit>
@@ -13382,7 +13398,7 @@
<source>Timeout in seconds for LLM requests.</source> <source>Timeout in seconds for LLM requests.</source>
<context-group purpose="location"> <context-group purpose="location">
<context context-type="sourcefile">src/app/data/paperless-config.ts</context> <context context-type="sourcefile">src/app/data/paperless-config.ts</context>
<context context-type="linenumber">420</context> <context context-type="linenumber">428</context>
</context-group> </context-group>
<target state="needs-translation">Timeout in seconds for LLM requests.</target> <target state="needs-translation">Timeout in seconds for LLM requests.</target>
</trans-unit> </trans-unit>
@@ -25,10 +25,20 @@ export class PDFFindController {
onIsPageVisible?: () => boolean onIsPageVisible?: () => boolean
} }
export const LinkTarget = {
NONE: 0,
SELF: 1,
BLANK: 2,
PARENT: 3,
TOP: 4,
}
export class PDFLinkService { export class PDFLinkService {
private document?: unknown private document?: unknown
private viewer?: unknown private viewer?: unknown
constructor(readonly options: Record<string, unknown> = {}) {}
setDocument(document: unknown): void { setDocument(document: unknown): void {
this.document = document this.document = document
} }
File diff suppressed because it is too large Load Diff
-568
View File
@@ -1,568 +0,0 @@
from __future__ import annotations
import logging
from typing import TYPE_CHECKING
from typing import Any
from typing import Literal
from django.contrib.auth.models import Group
from django.contrib.auth.models import User
from django.contrib.contenttypes.models import ContentType
from django.utils.text import slugify
from django.utils.translation import gettext as _
from drf_spectacular.utils import extend_schema_field
from guardian.core import ObjectPermissionChecker
from guardian.shortcuts import get_users_with_perms
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.exceptions import PermissionDenied
from rest_framework.fields import SerializerMethodField
from rest_framework.utils import model_meta
from documents import bulk_edit
from documents.models import Document
from documents.models import MatchingModel
from documents.models import Note
from documents.permissions import get_groups_with_only_permission
from documents.permissions import set_permissions_for_object
from documents.regex import validate_regex_pattern
if TYPE_CHECKING:
from collections.abc import Iterable
logger = logging.getLogger("paperless.serializers")
# https://www.django-rest-framework.org/api-guide/serializers/#example
class DynamicFieldsModelSerializer(serializers.ModelSerializer[Any]):
"""
A ModelSerializer that takes an additional `fields` argument that
controls which fields should be displayed.
"""
def __init__(self, *args, **kwargs) -> None:
# Don't pass the 'fields' arg up to the superclass
fields = kwargs.pop("fields", None)
# Instantiate the superclass normally
super().__init__(*args, **kwargs)
if fields is not None:
# Drop any fields that are not specified in the `fields` argument.
allowed = set(fields)
existing = set(self.fields)
for field_name in existing - allowed:
self.fields.pop(field_name)
class DocumentUpdateFieldsModelSerializer(DynamicFieldsModelSerializer):
stale_update_excluded_fields = frozenset({"filename", "archive_filename"})
def _get_update_fields(self, validated_data) -> list[str]:
model_fields = {
field.name
for field in self.Meta.model._meta.concrete_fields
if field.name not in self.stale_update_excluded_fields
}
update_fields = [
field_name for field_name in validated_data if field_name in model_fields
]
if "modified" in model_fields and "modified" not in update_fields:
update_fields.append("modified")
return update_fields
def update(self, instance, validated_data):
serializers.raise_errors_on_nested_writes("update", self, validated_data)
info = model_meta.get_field_info(instance)
m2m_fields = []
for attr, value in validated_data.items():
if attr in info.relations and info.relations[attr].to_many:
m2m_fields.append((attr, value))
else:
setattr(instance, attr, value)
# File names are managed by post-save file handling. Saving only the
# serializer-updated fields prevents stale in-memory path values from
# overwriting a concurrent move.
instance.save(update_fields=self._get_update_fields(validated_data))
for attr, value in m2m_fields:
field = getattr(instance, attr)
field.set(value)
return instance
class MatchingModelSerializer(serializers.ModelSerializer[Any]):
document_count = serializers.IntegerField(read_only=True)
def get_slug(self, obj) -> str:
return slugify(obj.name)
slug = SerializerMethodField()
def validate(self, data):
# TODO: remove pending https://github.com/encode/django-rest-framework/issues/7173
name = data.get(
"name",
self.instance.name if hasattr(self.instance, "name") else None,
)
owner = (
data["owner"]
if "owner" in data
else self.user
if hasattr(self, "user")
else None
)
pk = self.instance.pk if hasattr(self.instance, "pk") else None
if ("name" in data or "owner" in data) and self.Meta.model.objects.filter(
name=name,
owner=owner,
).exclude(pk=pk).exists():
raise serializers.ValidationError(
{"error": "Object violates owner / name unique constraint"},
)
return data
def validate_match(self, match):
if (
"matching_algorithm" in self.initial_data
and self.initial_data["matching_algorithm"] == MatchingModel.MATCH_REGEX
):
try:
validate_regex_pattern(match)
except ValueError as e:
logger.debug(f"Invalid regular expression: {e!s}")
raise serializers.ValidationError(
"Invalid regular expression, see log for details.",
)
return match
PERMISSION_ACTIONS = ("view", "change")
class SetPermissionsMixin:
def _validate_user_ids(self, user_ids):
users = User.objects.none()
if user_ids is not None:
users = User.objects.filter(id__in=user_ids)
if not users.count() == len(user_ids):
raise serializers.ValidationError(
"Some users in don't exist or were specified twice.",
)
return users
def _validate_group_ids(self, group_ids):
groups = Group.objects.none()
if group_ids is not None:
groups = Group.objects.filter(id__in=group_ids)
if not groups.count() == len(group_ids):
raise serializers.ValidationError(
"Some groups in don't exist or were specified twice.",
)
return groups
def validate_set_permissions(self, set_permissions=None):
permissions_dict = {action: {} for action in PERMISSION_ACTIONS}
if set_permissions is not None:
for action in PERMISSION_ACTIONS:
if action in set_permissions:
if "users" in set_permissions[action]:
users = set_permissions[action]["users"]
permissions_dict[action]["users"] = self._validate_user_ids(
users,
)
if "groups" in set_permissions[action]:
groups = set_permissions[action]["groups"]
permissions_dict[action]["groups"] = self._validate_group_ids(
groups,
)
else:
del permissions_dict[action]
return permissions_dict
def _set_permissions(self, permissions, object) -> None:
set_permissions_for_object(permissions, object)
class SerializerWithPerms(serializers.Serializer[dict[str, Any]]):
def __init__(self, *args, **kwargs) -> None:
self.user = kwargs.pop("user", None)
self.full_perms = kwargs.pop("full_perms", False)
self.all_fields = kwargs.pop("all_fields", False)
super().__init__(*args, **kwargs)
class PermissionSetSerializer(serializers.Serializer[dict[str, Any]]):
users = serializers.ListField(
child=serializers.IntegerField(),
required=False,
allow_null=True,
)
groups = serializers.ListField(
child=serializers.IntegerField(),
required=False,
allow_null=True,
)
class SetPermissionsSerializer(serializers.Serializer[dict[str, Any]]):
view = PermissionSetSerializer(required=False)
change = PermissionSetSerializer(required=False)
def to_internal_value(self, data):
if isinstance(data, dict):
unknown_keys = set(data) - set(PERMISSION_ACTIONS)
if unknown_keys:
raise serializers.ValidationError(
{key: "Unknown permission action." for key in sorted(unknown_keys)},
)
return super().to_internal_value(data)
class OwnedObjectSerializer(
SerializerWithPerms,
serializers.ModelSerializer[Any],
SetPermissionsMixin,
):
def __init__(self, *args, **kwargs) -> None:
super().__init__(*args, **kwargs)
if not self.all_fields:
try:
if self.full_perms:
self.fields.pop("user_can_change")
self.fields.pop("is_shared_by_requester")
else:
self.fields.pop("permissions")
except KeyError:
pass
def _get_perms(self, obj, codename: str, target: Literal["users", "groups"]):
"""
Get the given permissions from context or from django-guardian.
:param codename: The permission codename, e.g. 'view' or 'change'
:param target: 'users' or 'groups'
"""
key = f"{target}_{codename}_perms"
cached = self.context.get(key, {}).get(obj.pk)
if cached is not None:
return list(cached)
# Permission not found in the context, get it from guardian
if target == "users":
return list(
get_users_with_perms(
obj,
only_with_perms_in=[f"{codename}_{obj.__class__.__name__.lower()}"],
with_group_users=False,
).values_list("id", flat=True),
)
else: # groups
return list(
get_groups_with_only_permission(
obj,
codename=f"{codename}_{obj.__class__.__name__.lower()}",
).values_list("id", flat=True),
)
@extend_schema_field(
field={
"type": "object",
"properties": {
"view": {
"type": "object",
"properties": {
"users": {
"type": "array",
"items": {"type": "integer"},
},
"groups": {
"type": "array",
"items": {"type": "integer"},
},
},
},
"change": {
"type": "object",
"properties": {
"users": {
"type": "array",
"items": {"type": "integer"},
},
"groups": {
"type": "array",
"items": {"type": "integer"},
},
},
},
},
},
)
def get_permissions(self, obj) -> dict:
return {
"view": {
"users": self._get_perms(obj, "view", "users"),
"groups": self._get_perms(obj, "view", "groups"),
},
"change": {
"users": self._get_perms(obj, "change", "users"),
"groups": self._get_perms(obj, "change", "groups"),
},
}
def get_user_can_change(self, obj) -> bool:
if obj.owner is None or obj.owner == self.user:
return True
if self.user is None:
return False
if self.user.is_active and self.user.is_superuser:
# Mirrors guardian's own ObjectPermissionChecker.has_perm() shortcut --
# superusers aren't necessarily granted explicit object permissions,
# so the batched context below would otherwise incorrectly say no.
return True
# Prefer the page-level batch computed by BulkPermissionMixin
# (get_serializer_context) over a fresh per-object guardian check,
# which would otherwise query the permission tables once per row.
users_change_perms = self.context.get("users_change_perms")
groups_change_perms = self.context.get("groups_change_perms")
if users_change_perms is not None and groups_change_perms is not None:
if self.user.pk in users_change_perms.get(obj.pk, []):
return True
user_group_ids = getattr(self, "_user_group_ids", None)
if user_group_ids is None:
user_group_ids = set(self.user.groups.values_list("id", flat=True))
self._user_group_ids = user_group_ids
return bool(
user_group_ids.intersection(groups_change_perms.get(obj.pk, [])),
)
checker = ObjectPermissionChecker(self.user)
return checker.has_perm(f"change_{obj.__class__.__name__.lower()}", obj)
@staticmethod
def get_shared_object_pks(objects: Iterable):
"""
Return the primary keys of the subset of objects that are shared.
"""
try:
first_obj = next(iter(objects))
except StopIteration:
return set()
ctype = ContentType.objects.get_for_model(first_obj)
object_pks = list(obj.pk for obj in objects)
pk_type = type(first_obj.pk)
def get_pks_for_permission_type(model):
return map(
pk_type, # coerce the pk to be the same type of the provided objects
model.objects.filter(
content_type=ctype,
object_pk__in=object_pks,
)
.values_list("object_pk", flat=True)
.distinct(),
)
UserObjectPermission = get_user_obj_perms_model()
GroupObjectPermission = get_group_obj_perms_model()
user_permission_pks = get_pks_for_permission_type(UserObjectPermission)
group_permission_pks = get_pks_for_permission_type(GroupObjectPermission)
return set(user_permission_pks) | set(group_permission_pks)
def get_is_shared_by_requester(self, obj: Document) -> bool:
# First check the context to see if `shared_object_pks` is set by the parent.
shared_object_pks = self.context.get("shared_object_pks")
# If not just check if the current object is shared.
if shared_object_pks is None:
shared_object_pks = self.get_shared_object_pks([obj])
return obj.owner == self.user and obj.id in shared_object_pks
permissions = SerializerMethodField(read_only=True, required=False)
user_can_change = SerializerMethodField(read_only=True, required=False)
is_shared_by_requester = SerializerMethodField(read_only=True, required=False)
set_permissions = SetPermissionsSerializer(
label="Set permissions",
required=False,
write_only=True,
)
# other methods in mixin
def validate_unique_together(self, validated_data, instance=None) -> None:
# workaround for https://github.com/encode/django-rest-framework/issues/9358
if "owner" in validated_data and "name" in self.Meta.fields:
name = validated_data.get("name", instance.name if instance else None)
objects = (
self.Meta.model.objects.exclude(pk=instance.pk)
if instance
else self.Meta.model.objects.all()
)
not_unique = objects.filter(
owner=validated_data["owner"],
name=name,
).exists()
if not_unique:
raise serializers.ValidationError(
{"error": "Object violates owner / name unique constraint"},
)
def create(self, validated_data):
# default to current user if not set
request = self.context.get("request")
if (
"owner" not in validated_data
or (request is not None and "owner" not in request.data)
) and self.user:
validated_data["owner"] = self.user
permissions = None
if "set_permissions" in validated_data:
permissions = validated_data.pop("set_permissions")
self.validate_unique_together(validated_data)
instance = super().create(validated_data)
if permissions is not None:
self._set_permissions(permissions, instance)
return instance
def update(self, instance, validated_data):
user = getattr(self, "user", None)
is_superuser = user.is_superuser if user is not None else False
is_owner = instance.owner == user if user is not None else False
is_unowned = instance.owner is None
if (
("owner" in validated_data and validated_data["owner"] != instance.owner)
or "set_permissions" in validated_data
) and not (is_superuser or is_owner or is_unowned):
raise PermissionDenied(
_("Insufficient permissions."),
)
if "set_permissions" in validated_data:
self._set_permissions(validated_data["set_permissions"], instance)
self.validate_unique_together(validated_data, instance)
return super().update(instance, validated_data)
class OwnedObjectListSerializer(serializers.ListSerializer[Any]):
def to_representation(self, documents):
self.child.context["shared_object_pks"] = self.child.get_shared_object_pks(
documents,
)
return super().to_representation(documents)
class ReadWriteSerializerMethodField(serializers.SerializerMethodField):
"""
Based on https://stackoverflow.com/a/62579804
"""
def __init__(self, method_name=None, *args, **kwargs) -> None:
self.method_name = method_name
kwargs["source"] = "*"
super(serializers.SerializerMethodField, self).__init__(*args, **kwargs)
def to_internal_value(self, data):
return {self.field_name: data}
class DocumentListSerializer(serializers.Serializer[dict[str, list[int]]]):
documents = serializers.ListField(
required=True,
label="Documents",
write_only=True,
child=serializers.IntegerField(),
)
def _validate_document_id_list(self, documents, name="documents") -> None:
if not isinstance(documents, list):
raise serializers.ValidationError(f"{name} must be a list")
if not all(isinstance(i, int) for i in documents):
raise serializers.ValidationError(f"{name} must be a list of integers")
count = Document.objects.filter(id__in=documents).count()
if not count == len(documents):
raise serializers.ValidationError(
f"Some documents in {name} don't exist or were specified twice.",
)
def validate_documents(self, documents):
self._validate_document_id_list(documents)
return documents
class DocumentSelectionSerializer(DocumentListSerializer):
documents = serializers.ListField(
required=False,
label="Documents",
write_only=True,
child=serializers.IntegerField(),
)
all = serializers.BooleanField(
default=False,
required=False,
write_only=True,
)
filters = serializers.DictField(
required=False,
allow_empty=True,
write_only=True,
)
excluded_documents = serializers.ListField(
required=False,
default=list,
write_only=True,
child=serializers.IntegerField(),
)
def validate(self, attrs):
if attrs.get("all", False):
attrs.setdefault("documents", [])
return attrs
if attrs["excluded_documents"]:
raise serializers.ValidationError(
"excluded_documents is only supported when all is true.",
)
if "documents" not in attrs:
raise serializers.ValidationError(
"documents is required unless all is true.",
)
documents = attrs["documents"]
self._validate_document_id_list(documents)
return attrs
class SourceModeValidationMixin:
def validate_source_mode(self, source_mode: str) -> str:
if source_mode not in bulk_edit.SourceModeChoices.__dict__.values():
raise serializers.ValidationError("Invalid source_mode")
return source_mode
class BasicUserSerializer(serializers.ModelSerializer[User]):
# Different than paperless.serializers.UserSerializer
class Meta:
model = User
fields = ["id", "username", "first_name", "last_name"]
class NotesSerializer(serializers.ModelSerializer[Note]):
user = BasicUserSerializer(read_only=True)
class Meta:
model = Note
fields = ["id", "note", "created", "user"]
ordering = ["-created"]
-750
View File
@@ -1,750 +0,0 @@
from __future__ import annotations
import logging
from django.contrib.auth.models import User
from rest_framework import serializers
from documents import bulk_edit
from documents.models import Correspondent
from documents.models import CustomField
from documents.models import Document
from documents.models import DocumentType
from documents.models import StoragePath
from documents.models import Tag
from .base import DocumentListSerializer
from .base import DocumentSelectionSerializer
from .base import SerializerWithPerms
from .base import SetPermissionsMixin
from .base import SetPermissionsSerializer
from .base import SourceModeValidationMixin
from .metadata import CustomFieldInstanceSerializer
logger = logging.getLogger("paperless.serializers")
def _validate_rotation_degrees(degrees: int, field: str = "degrees") -> int:
# QPDF refuses any other angle, which would otherwise fail inside the task
if degrees % 90 != 0:
raise serializers.ValidationError(f"{field} must be a multiple of 90")
return degrees
class RotateDocumentsSerializer(DocumentSelectionSerializer, SourceModeValidationMixin):
degrees = serializers.IntegerField(required=True)
source_mode = serializers.CharField(
required=False,
default=bulk_edit.SourceModeChoices.LATEST_VERSION,
)
from_webui = serializers.BooleanField(required=False, default=False)
def validate_degrees(self, value: int) -> int:
return _validate_rotation_degrees(value)
class MergeDocumentsSerializer(DocumentListSerializer, SourceModeValidationMixin):
metadata_document_id = serializers.IntegerField(
required=False,
allow_null=True,
)
delete_originals = serializers.BooleanField(required=False, default=False)
archive_fallback = serializers.BooleanField(required=False, default=False)
source_mode = serializers.CharField(
required=False,
default=bulk_edit.SourceModeChoices.LATEST_VERSION,
)
from_webui = serializers.BooleanField(required=False, default=False)
class MergeDocumentsAsVersionsSerializer(DocumentListSerializer):
root_document_id = serializers.IntegerField(required=True)
version_label = serializers.CharField(
required=False,
allow_blank=True,
allow_null=True,
max_length=64,
)
def validate_version_label(self, value):
if value is None:
return None
normalized = value.strip()
return normalized or None
def validate(self, attrs):
documents = attrs["documents"]
if len(documents) < 2:
raise serializers.ValidationError(
"At least two documents are required.",
)
if attrs.get("version_label") is not None and len(documents) != 2:
raise serializers.ValidationError(
"version_label can only be used when merging one source document.",
)
if attrs["root_document_id"] not in documents:
raise serializers.ValidationError(
"root_document_id must be one of the selected documents.",
)
selected_documents = Document.objects.filter(id__in=documents)
if selected_documents.filter(root_document__isnull=False).exists():
raise serializers.ValidationError(
"Only top-level documents can be merged as versions.",
)
source_document_ids = set(documents) - {attrs["root_document_id"]}
if Document.global_objects.filter(
root_document_id__in=source_document_ids,
).exists():
raise serializers.ValidationError(
"Documents with existing versions cannot be merged into another document.",
)
return attrs
class PdfEditOperationSerializer(serializers.Serializer[dict[str, int]]):
page = serializers.IntegerField(min_value=1)
rotate = serializers.IntegerField(required=False)
doc = serializers.IntegerField(required=False, min_value=0)
def validate_rotate(self, value: int) -> int:
return _validate_rotation_degrees(value, field="rotate")
class EditPdfDocumentsSerializer(DocumentListSerializer, SourceModeValidationMixin):
operations = serializers.ListField(
child=PdfEditOperationSerializer(),
required=True,
allow_empty=False,
)
delete_original = serializers.BooleanField(required=False, default=False)
update_document = serializers.BooleanField(required=False, default=False)
include_metadata = serializers.BooleanField(required=False, default=True)
source_mode = serializers.CharField(
required=False,
default=bulk_edit.SourceModeChoices.LATEST_VERSION,
)
from_webui = serializers.BooleanField(required=False, default=False)
def validate(self, attrs):
documents = attrs["documents"]
if len(documents) > 1:
raise serializers.ValidationError(
"Edit PDF method only supports one document",
)
operations = attrs["operations"]
if any(op.get("doc", 0) >= len(operations) for op in operations):
raise serializers.ValidationError("doc index is out of bounds")
if attrs["update_document"]:
max_idx = max(op.get("doc", 0) for op in operations)
if max_idx > 0:
raise serializers.ValidationError(
"update_document only allowed with a single output document",
)
doc = Document.objects.get(id=documents[0])
if doc.page_count:
for op in operations:
if op["page"] > doc.page_count:
raise serializers.ValidationError(
f"Page {op['page']} is out of bounds for document with {doc.page_count} pages.",
)
return attrs
class RemovePasswordDocumentsSerializer(
DocumentListSerializer,
SourceModeValidationMixin,
):
password = serializers.CharField(required=True)
update_document = serializers.BooleanField(required=False, default=False)
delete_original = serializers.BooleanField(required=False, default=False)
include_metadata = serializers.BooleanField(required=False, default=True)
source_mode = serializers.CharField(
required=False,
default=bulk_edit.SourceModeChoices.LATEST_VERSION,
)
from_webui = serializers.BooleanField(required=False, default=False)
class DeleteDocumentsSerializer(DocumentSelectionSerializer):
pass
class ReprocessDocumentsSerializer(DocumentSelectionSerializer):
remote_ocr = serializers.BooleanField(required=False, default=False)
class BulkEditSerializer(
SerializerWithPerms,
DocumentSelectionSerializer,
SetPermissionsMixin,
SourceModeValidationMixin,
):
# TODO: remove this and related backwards compatibility code when API v9 is dropped
# split, delete_pages can be removed entirely
MOVED_DOCUMENT_ACTION_ENDPOINTS = {
"delete": "/api/documents/delete/",
"reprocess": "/api/documents/reprocess/",
"rotate": "/api/documents/rotate/",
"merge": "/api/documents/merge/",
"edit_pdf": "/api/documents/edit_pdf/",
"remove_password": "/api/documents/remove_password/",
"split": "/api/documents/edit_pdf/",
"delete_pages": "/api/documents/edit_pdf/",
}
LEGACY_DOCUMENT_ACTION_METHODS = tuple(MOVED_DOCUMENT_ACTION_ENDPOINTS.keys())
method = serializers.ChoiceField(
choices=[
"set_correspondent",
"set_document_type",
"set_storage_path",
"add_tag",
"remove_tag",
"modify_tags",
"modify_custom_fields",
"set_permissions",
*LEGACY_DOCUMENT_ACTION_METHODS,
],
label="Method",
write_only=True,
)
parameters = serializers.DictField(allow_empty=True, default={}, write_only=True)
from_webui = serializers.BooleanField(required=False, default=False)
def _validate_tag_id_list(self, tags, name="tags") -> None:
if not isinstance(tags, list):
raise serializers.ValidationError(f"{name} must be a list")
if not all(isinstance(i, int) for i in tags):
raise serializers.ValidationError(f"{name} must be a list of integers")
count = Tag.objects.filter(id__in=tags).count()
if not count == len(tags):
raise serializers.ValidationError(
f"Some tags in {name} don't exist or were specified twice.",
)
def _validate_custom_field_id_list_or_dict(
self,
custom_fields,
name="custom_fields",
) -> None:
ids = custom_fields
if isinstance(custom_fields, dict):
try:
ids = [int(i[0]) for i in custom_fields.items()]
except Exception as e:
logger.exception(f"Error validating custom fields: {e}")
raise serializers.ValidationError(
f"{name} must be a list of integers or a dict of id:value pairs, see the log for details",
)
elif not isinstance(custom_fields, list) or not all(
isinstance(i, int) for i in ids
):
raise serializers.ValidationError(
f"{name} must be a list of integers or a dict of id:value pairs",
)
count = CustomField.objects.filter(id__in=ids).count()
if not count == len(ids):
raise serializers.ValidationError(
f"Some custom fields in {name} don't exist or were specified twice.",
)
def _validate_custom_field_values(self, custom_fields, name):
if not isinstance(custom_fields, dict):
return custom_fields
validated = {}
errors = {}
for raw_field_id, value in custom_fields.items():
field_id = int(raw_field_id)
validator = CustomFieldInstanceSerializer(
data={"field": field_id, "value": value},
context=self.context,
)
if validator.is_valid():
validated[field_id] = validator.validated_data["value"]
else:
errors[str(field_id)] = validator.errors
if errors:
raise serializers.ValidationError({name: errors})
return validated
def validate_method(self, method):
if method == "set_correspondent":
return bulk_edit.set_correspondent
elif method == "set_document_type":
return bulk_edit.set_document_type
elif method == "set_storage_path":
return bulk_edit.set_storage_path
elif method == "add_tag":
return bulk_edit.add_tag
elif method == "remove_tag":
return bulk_edit.remove_tag
elif method == "modify_tags":
return bulk_edit.modify_tags
elif method == "modify_custom_fields":
return bulk_edit.modify_custom_fields
elif method == "delete":
return bulk_edit.delete
elif method == "redo_ocr" or method == "reprocess":
return bulk_edit.reprocess
elif method == "set_permissions":
return bulk_edit.set_permissions
elif method == "rotate":
return bulk_edit.rotate
elif method == "merge":
return bulk_edit.merge
elif method == "split":
return bulk_edit.split
elif method == "delete_pages":
return bulk_edit.delete_pages
elif method == "edit_pdf":
return bulk_edit.edit_pdf
elif method == "remove_password":
return bulk_edit.remove_password
else:
raise serializers.ValidationError("Unsupported method.")
def _validate_parameters_tags(self, parameters) -> None:
if "tag" in parameters:
tag_id = parameters["tag"]
try:
Tag.objects.get(id=tag_id)
except Tag.DoesNotExist:
raise serializers.ValidationError("Tag does not exist")
else:
raise serializers.ValidationError("tag not specified")
def _validate_parameters_document_type(self, parameters) -> None:
if "document_type" in parameters:
document_type_id = parameters["document_type"]
if document_type_id is None:
# None is ok
return
try:
DocumentType.objects.get(id=document_type_id)
except DocumentType.DoesNotExist:
raise serializers.ValidationError("Document type does not exist")
else:
raise serializers.ValidationError("document_type not specified")
def _validate_parameters_correspondent(self, parameters) -> None:
if "correspondent" in parameters:
correspondent_id = parameters["correspondent"]
if correspondent_id is None:
return
try:
Correspondent.objects.get(id=correspondent_id)
except Correspondent.DoesNotExist:
raise serializers.ValidationError("Correspondent does not exist")
else:
raise serializers.ValidationError("correspondent not specified")
def _validate_storage_path(self, parameters) -> None:
if "storage_path" in parameters:
storage_path_id = parameters["storage_path"]
if storage_path_id is None:
return
try:
StoragePath.objects.get(id=storage_path_id)
except StoragePath.DoesNotExist:
raise serializers.ValidationError(
"Storage path does not exist",
)
else:
raise serializers.ValidationError("storage path not specified")
def _validate_parameters_modify_tags(self, parameters) -> None:
if "add_tags" in parameters:
self._validate_tag_id_list(parameters["add_tags"], "add_tags")
else:
raise serializers.ValidationError("add_tags not specified")
if "remove_tags" in parameters:
self._validate_tag_id_list(parameters["remove_tags"], "remove_tags")
else:
raise serializers.ValidationError("remove_tags not specified")
def _validate_parameters_modify_custom_fields(self, parameters) -> None:
if "add_custom_fields" in parameters:
self._validate_custom_field_id_list_or_dict(
parameters["add_custom_fields"],
"add_custom_fields",
)
parameters["add_custom_fields"] = self._validate_custom_field_values(
parameters["add_custom_fields"],
"add_custom_fields",
)
else:
raise serializers.ValidationError("add_custom_fields not specified")
if "remove_custom_fields" in parameters:
self._validate_custom_field_id_list_or_dict(
parameters["remove_custom_fields"],
"remove_custom_fields",
)
else:
raise serializers.ValidationError("remove_custom_fields not specified")
def _validate_owner(self, owner) -> User:
owner_field = serializers.PrimaryKeyRelatedField(queryset=User.objects.all())
try:
return owner_field.run_validation(owner)
except serializers.ValidationError as e:
raise serializers.ValidationError(
"Specified owner cannot be found",
) from e
def _validate_parameters_set_permissions(self, parameters) -> None:
if "set_permissions" not in parameters:
raise serializers.ValidationError("set_permissions not specified")
set_permissions = parameters["set_permissions"]
if set_permissions is not None:
set_permissions = SetPermissionsSerializer().run_validation(
set_permissions,
)
parameters["set_permissions"] = self.validate_set_permissions(
set_permissions,
)
if "owner" in parameters and parameters["owner"] is not None:
parameters["owner"] = self._validate_owner(parameters["owner"]).pk
if "merge" not in parameters:
parameters["merge"] = False
def _validate_parameters_rotate(self, parameters) -> None:
if "degrees" not in parameters:
raise serializers.ValidationError("invalid rotation degrees")
try:
degrees = serializers.IntegerField().run_validation(parameters["degrees"])
except serializers.ValidationError as e:
raise serializers.ValidationError("invalid rotation degrees") from e
parameters["degrees"] = _validate_rotation_degrees(degrees)
def _validate_source_mode(self, parameters) -> None:
source_mode = parameters.get(
"source_mode",
bulk_edit.SourceModeChoices.LATEST_VERSION,
)
parameters["source_mode"] = self.validate_source_mode(source_mode)
def _validate_parameters_split(self, parameters, document_id) -> None:
if "pages" not in parameters:
raise serializers.ValidationError("pages not specified")
if not isinstance(parameters["pages"], str):
raise serializers.ValidationError("invalid pages specified")
page_count = Document.objects.get(id=document_id).page_count
if not page_count:
raise serializers.ValidationError("document page count is unknown")
pages = []
for group in parameters["pages"].split(","):
start, is_range, end = group.partition("-")
try:
first = int(start)
last = int(end) if is_range else first
except ValueError as e:
raise serializers.ValidationError("invalid pages specified") from e
# Bound the range before building it, a huge one would exhaust memory
if not 1 <= first <= last <= page_count:
raise serializers.ValidationError("invalid pages specified")
pages.append(list(range(first, last + 1)))
parameters["pages"] = pages
if "delete_originals" in parameters:
if not isinstance(parameters["delete_originals"], bool):
raise serializers.ValidationError("delete_originals must be a boolean")
else:
parameters["delete_originals"] = False
def _validate_parameters_delete_pages(self, parameters) -> None:
if "pages" not in parameters:
raise serializers.ValidationError("pages not specified")
if not isinstance(parameters["pages"], list):
raise serializers.ValidationError("pages must be a list")
if not all(isinstance(i, int) for i in parameters["pages"]):
raise serializers.ValidationError("pages must be a list of integers")
def _validate_parameters_merge(self, parameters) -> None:
if "delete_originals" in parameters:
if not isinstance(parameters["delete_originals"], bool):
raise serializers.ValidationError("delete_originals must be a boolean")
else:
parameters["delete_originals"] = False
if "archive_fallback" in parameters:
if not isinstance(parameters["archive_fallback"], bool):
raise serializers.ValidationError("archive_fallback must be a boolean")
else:
parameters["archive_fallback"] = False
def _validate_parameters_edit_pdf(self, parameters, document_id) -> None:
if "operations" not in parameters:
raise serializers.ValidationError("operations not specified")
operations_field = serializers.ListField(
child=PdfEditOperationSerializer(),
allow_empty=False,
)
try:
operations = operations_field.run_validation(parameters["operations"])
except serializers.ValidationError as e:
# Key the errors under "operations" so they match what the
# dedicated edit_pdf endpoint returns
raise serializers.ValidationError({"operations": e.detail}) from e
parameters["operations"] = operations
if "update_document" in parameters:
if not isinstance(parameters["update_document"], bool):
raise serializers.ValidationError("update_document must be a boolean")
else:
parameters["update_document"] = False
if "include_metadata" in parameters:
if not isinstance(parameters["include_metadata"], bool):
raise serializers.ValidationError("include_metadata must be a boolean")
else:
parameters["include_metadata"] = True
if any(op.get("doc", 0) >= len(operations) for op in operations):
raise serializers.ValidationError("doc index is out of bounds")
if parameters["update_document"]:
max_idx = max(op.get("doc", 0) for op in operations)
if max_idx > 0:
raise serializers.ValidationError(
"update_document only allowed with a single output document",
)
doc = Document.objects.get(id=document_id)
# doc existence is already validated
if doc.page_count:
for op in operations:
if op["page"] > doc.page_count:
raise serializers.ValidationError(
f"Page {op['page']} is out of bounds for document with {doc.page_count} pages.",
)
def _validate_parameters_reprocess(self, parameters) -> None:
if "remote_ocr" in parameters:
if not isinstance(parameters["remote_ocr"], bool):
raise serializers.ValidationError("remote_ocr must be a boolean")
else:
parameters["remote_ocr"] = False
def validate_parameters_remove_password(self, parameters):
if "password" not in parameters:
raise serializers.ValidationError("password not specified")
if not isinstance(parameters["password"], str):
raise serializers.ValidationError("password must be a string")
def validate(self, attrs):
attrs = super().validate(attrs)
if attrs.get("all", False) and attrs["method"] in [
bulk_edit.merge,
bulk_edit.split,
bulk_edit.delete_pages,
bulk_edit.edit_pdf,
bulk_edit.remove_password,
]:
raise serializers.ValidationError(
"This method does not support all=true.",
)
method = attrs["method"]
parameters = attrs["parameters"]
if "source_mode" in parameters:
self._validate_source_mode(parameters)
if method == bulk_edit.set_correspondent:
self._validate_parameters_correspondent(parameters)
elif method == bulk_edit.set_document_type:
self._validate_parameters_document_type(parameters)
elif method == bulk_edit.add_tag or method == bulk_edit.remove_tag:
self._validate_parameters_tags(parameters)
elif method == bulk_edit.modify_tags:
self._validate_parameters_modify_tags(parameters)
elif method == bulk_edit.set_storage_path:
self._validate_storage_path(parameters)
elif method == bulk_edit.modify_custom_fields:
self._validate_parameters_modify_custom_fields(parameters)
elif method == bulk_edit.set_permissions:
self._validate_parameters_set_permissions(parameters)
elif method == bulk_edit.rotate:
self._validate_parameters_rotate(parameters)
elif method == bulk_edit.split:
if len(attrs["documents"]) > 1:
raise serializers.ValidationError(
"Split method only supports one document",
)
self._validate_parameters_split(parameters, attrs["documents"][0])
elif method == bulk_edit.delete_pages:
if len(attrs["documents"]) > 1:
raise serializers.ValidationError(
"Delete pages method only supports one document",
)
self._validate_parameters_delete_pages(parameters)
elif method == bulk_edit.merge:
self._validate_parameters_merge(parameters)
elif method == bulk_edit.edit_pdf:
if len(attrs["documents"]) > 1:
raise serializers.ValidationError(
"Edit PDF method only supports one document",
)
self._validate_parameters_edit_pdf(parameters, attrs["documents"][0])
elif method == bulk_edit.remove_password:
self.validate_parameters_remove_password(parameters)
elif method == bulk_edit.reprocess:
self._validate_parameters_reprocess(parameters)
return attrs
class BulkDownloadSerializer(DocumentSelectionSerializer):
content = serializers.ChoiceField(
choices=["archive", "originals", "both"],
default="archive",
)
compression = serializers.ChoiceField(
choices=["none", "deflated", "bzip2", "lzma"],
default="none",
)
follow_formatting = serializers.BooleanField(
default=False,
)
def validate_compression(self, compression):
import zipfile
return {
"none": zipfile.ZIP_STORED,
"deflated": zipfile.ZIP_DEFLATED,
"bzip2": zipfile.ZIP_BZIP2,
"lzma": zipfile.ZIP_LZMA,
}[compression]
class BulkEditObjectsSerializer(SerializerWithPerms, SetPermissionsMixin):
objects = serializers.ListField(
required=False,
allow_empty=True,
label="Objects",
write_only=True,
child=serializers.IntegerField(),
)
all = serializers.BooleanField(
default=False,
required=False,
write_only=True,
)
filters = serializers.DictField(
required=False,
allow_empty=True,
write_only=True,
)
object_type = serializers.ChoiceField(
choices=[
"tags",
"correspondents",
"document_types",
"storage_paths",
],
label="Object Type",
write_only=True,
)
operation = serializers.ChoiceField(
choices=[
"set_permissions",
"delete",
],
label="Operation",
required=True,
write_only=True,
)
owner = serializers.PrimaryKeyRelatedField(
queryset=User.objects.all(),
required=False,
allow_null=True,
)
permissions = SetPermissionsSerializer(
label="Set permissions",
required=False,
write_only=True,
)
merge = serializers.BooleanField(
default=False,
write_only=True,
required=False,
)
def get_object_class(self, object_type):
object_class = None
if object_type == "tags":
object_class = Tag
elif object_type == "correspondents":
object_class = Correspondent
elif object_type == "document_types":
object_class = DocumentType
elif object_type == "storage_paths":
object_class = StoragePath
return object_class
def _validate_objects(self, objects, object_type):
if not isinstance(objects, list):
raise serializers.ValidationError("objects must be a list")
if not all(isinstance(i, int) for i in objects):
raise serializers.ValidationError("objects must be a list of integers")
object_class = self.get_object_class(object_type)
count = object_class.objects.filter(id__in=objects).count()
if not count == len(objects):
raise serializers.ValidationError(
"Some ids in objects don't exist or were specified twice.",
)
return objects
def _validate_permissions(self, permissions) -> dict:
return self.validate_set_permissions(
permissions,
)
def validate(self, attrs):
object_type = attrs["object_type"]
objects = attrs.get("objects")
apply_to_all = attrs.get("all", False)
operation = attrs.get("operation")
if apply_to_all:
attrs.setdefault("objects", [])
else:
if objects is None:
raise serializers.ValidationError(
"objects is required unless all is true.",
)
if len(objects) == 0:
raise serializers.ValidationError("objects must not be empty")
self._validate_objects(objects, object_type)
if operation == "set_permissions":
permissions = attrs.get("permissions")
if permissions is not None:
if not permissions:
raise serializers.ValidationError(
"permissions must not be empty",
)
attrs["permissions"] = self._validate_permissions(permissions)
return attrs
-474
View File
@@ -1,474 +0,0 @@
from __future__ import annotations
import logging
from typing import TYPE_CHECKING
from typing import Any
from typing import TypedDict
from django.conf import settings
from django.contrib.auth.models import User
from django.db.models import Q
from django.utils.dateparse import parse_datetime
from django.utils.timezone import get_current_timezone
from django.utils.timezone import is_naive
from django.utils.timezone import make_aware
from drf_spectacular.utils import extend_schema_field
from drf_spectacular.utils import extend_schema_serializer
from drf_writable_nested.serializers import NestedUpdateMixin
from rest_framework import serializers
from rest_framework.fields import SerializerMethodField
if settings.AUDIT_LOG_ENABLED:
from auditlog.context import set_actor
from documents import bulk_edit
from documents.models import CustomField
from documents.models import CustomFieldInstance
from documents.models import Document
from documents.models import Tag
from documents.permissions import permitted_document_ids
from documents.versioning import has_prefetched_effective_content
from documents.versioning import sort_versions_newest_first
from .base import DocumentUpdateFieldsModelSerializer
from .base import NotesSerializer
from .base import OwnedObjectListSerializer
from .base import OwnedObjectSerializer
from .metadata import CorrespondentField
from .metadata import CustomFieldInstanceSerializer
from .metadata import DocumentTypeField
from .metadata import StoragePathField
from .metadata import TagsField
from .upload import PostDocumentSerializer
if TYPE_CHECKING:
from datetime import datetime
from django.db.models.query import QuerySet
from rest_framework.relations import ManyRelatedField
from rest_framework.relations import RelatedField
logger = logging.getLogger("paperless.serializers")
def _get_viewable_duplicates(
document: Document,
user: User | None,
) -> QuerySet[Document]:
checksums = {document.checksum}
if document.archive_checksum:
checksums.add(document.archive_checksum)
duplicates = Document.global_objects.filter(
Q(checksum__in=checksums) | Q(archive_checksum__in=checksums),
).exclude(pk=document.pk)
duplicates = duplicates.filter(root_document__isnull=True)
duplicates = duplicates.order_by("-created")
allowed_ids = permitted_document_ids(user, include_deleted=True)
return duplicates.filter(id__in=allowed_ids)
class DuplicateDocumentSummarySerializer(serializers.Serializer[dict[str, Any]]):
id = serializers.IntegerField()
title = serializers.CharField()
deleted_at = serializers.DateTimeField(allow_null=True)
class _DocumentVersionInfo(TypedDict):
id: int
added: datetime
version_label: str | None
checksum: str | None
is_root: bool
class DocumentVersionInfoSerializer(serializers.Serializer[_DocumentVersionInfo]):
id = serializers.IntegerField()
added = serializers.DateTimeField()
version_label = serializers.CharField(required=False, allow_null=True)
checksum = serializers.CharField(required=False, allow_null=True)
is_root = serializers.BooleanField()
@extend_schema_serializer(
deprecate_fields=["created_date"],
)
class DocumentSerializer(
OwnedObjectSerializer,
NestedUpdateMixin,
DocumentUpdateFieldsModelSerializer,
):
correspondent = CorrespondentField(allow_null=True)
tags = TagsField(many=True)
document_type = DocumentTypeField(allow_null=True)
storage_path = StoragePathField(allow_null=True)
original_file_name = SerializerMethodField()
archived_file_name = SerializerMethodField()
created_date = serializers.DateField(required=False)
page_count = SerializerMethodField()
duplicate_documents = SerializerMethodField()
notes = NotesSerializer(many=True, required=False, read_only=True)
root_document: RelatedField[Document, Document, Any] | ManyRelatedField = (
serializers.PrimaryKeyRelatedField(read_only=True)
)
versions = SerializerMethodField()
custom_fields = CustomFieldInstanceSerializer(
many=True,
allow_null=False,
required=False,
)
owner = serializers.PrimaryKeyRelatedField(
queryset=User.objects.all(),
required=False,
allow_null=True,
)
remove_inbox_tags = serializers.BooleanField(
default=False,
write_only=True,
allow_null=True,
required=False,
)
def get_page_count(self, obj) -> int | None:
return obj.page_count
@extend_schema_field(DuplicateDocumentSummarySerializer(many=True))
def get_duplicate_documents(self, obj):
view = self.context.get("view")
if view and getattr(view, "action", None) != "retrieve":
return []
request = self.context.get("request")
user = request.user if request else None
duplicates = _get_viewable_duplicates(obj, user)
return list(duplicates.values("id", "title", "deleted_at"))
@extend_schema_field(DocumentVersionInfoSerializer(many=True))
def get_versions(self, obj):
root_doc = obj if obj.root_document_id is None else obj.root_document
if root_doc is None:
return []
prefetched_cache = getattr(obj, "_prefetched_objects_cache", None)
prefetched_versions = (
prefetched_cache.get("versions")
if isinstance(prefetched_cache, dict)
else None
)
versions: list[Document]
if prefetched_versions is not None:
versions = [*prefetched_versions, root_doc]
else:
versions_qs = Document.objects.filter(root_document=root_doc).only(
"id",
"added",
"checksum",
"version_label",
"root_document_id",
"version_index",
)
versions = [*versions_qs, root_doc]
versions = sort_versions_newest_first(versions)
def build_info(doc: Document) -> _DocumentVersionInfo:
return {
"id": doc.id,
"added": doc.added,
"version_label": doc.version_label,
"checksum": doc.checksum,
"is_root": doc.id == root_doc.id,
}
return [build_info(doc) for doc in versions]
def get_original_file_name(self, obj) -> str | None:
return obj.original_filename
def get_archived_file_name(self, obj) -> str | None:
if obj.has_archive_version:
return obj.get_public_filename(archive=True)
else:
return None
def to_representation(self, instance):
doc = super().to_representation(instance)
if "content" in self.fields and has_prefetched_effective_content(instance):
# Only resolve version-aware content when it's cheap: an SQL
# annotation or a versions prefetch is already on the instance.
# A caller that set up neither (e.g. TrashView, GlobalSearchView,
# which build their own querysets) gets the document's own,
# unresolved content instead of paying for an extra per-instance
# query -- same as before effective_content resolution existed.
doc["content"] = instance.get_effective_content() or ""
if self.truncate_content and "content" in self.fields:
doc["content"] = doc.get("content")[0:550]
return doc
def to_internal_value(self, data):
if (
"created" in data
and isinstance(data["created"], str)
and ":" in data["created"]
):
# Handle old format of isoformat datetime string
parsed = parse_datetime(data["created"])
if parsed:
if is_naive(parsed):
parsed = make_aware(parsed, get_current_timezone())
data["created"] = parsed.astimezone().date()
return super().to_internal_value(data)
def validate(self, attrs):
if (
"archive_serial_number" in attrs
and attrs["archive_serial_number"] is not None
and len(str(attrs["archive_serial_number"])) > 0
and Document.deleted_objects.filter(
archive_serial_number=attrs["archive_serial_number"],
).exists()
):
raise serializers.ValidationError(
{
"archive_serial_number": [
"Document with this Archive Serial Number already exists in the trash.",
],
},
)
return super().validate(attrs)
def update(self, instance: Document, validated_data):
if "created_date" in validated_data:
if "created" not in validated_data:
validated_data["created"] = validated_data["created_date"]
logger.warning(
"created_date is deprecated, use created instead",
)
validated_data.pop("created_date")
if instance.custom_fields.count() > 0 and "custom_fields" in validated_data:
incoming_custom_fields = [
field["field"] for field in validated_data["custom_fields"]
]
for custom_field_instance in instance.custom_fields.filter(
field__data_type=CustomField.FieldDataType.DOCUMENTLINK,
):
if (
custom_field_instance.field not in incoming_custom_fields
and custom_field_instance.value is not None
):
# Doc link field is being removed entirely
for doc_id in custom_field_instance.value:
bulk_edit.remove_doclink(
instance,
custom_field_instance.field,
doc_id,
)
if "tags" in validated_data:
# Respect tag hierarchy on updates:
# - Adding a child adds its ancestors
# - Removing a parent removes all its descendants
prev_tags = set(instance.tags.all())
requested_tags = set(validated_data["tags"])
# Tags newly added in this update and the ancestors they require
added_tags = requested_tags - prev_tags
required_by_add_tags = set(added_tags)
for t in added_tags:
required_by_add_tags.update(t.get_ancestors())
# Tags being removed in this update and all descendants, except
# those required by a tag that is being added in this same update
removed_tags = prev_tags - requested_tags
blocked_tags = set(removed_tags)
for t in removed_tags:
blocked_tags.update(t.get_descendants())
blocked_tags.difference_update(required_by_add_tags)
# Add all parent tags
final_tags = set(requested_tags)
for t in requested_tags:
final_tags.update(t.get_ancestors())
# Drop removed parents and their descendants
final_tags.difference_update(blocked_tags)
validated_data["tags"] = list(final_tags)
if validated_data.get("remove_inbox_tags"):
current_tag_ids = {t.pk for t in instance.tags.all()}
tags = (
validated_data["tags"]
if "tags" in validated_data
else list(instance.tags.all())
)
# Tags newly added in this update, plus their ancestors, are kept
keep_ids: set[int] = set()
for tag in tags:
if tag.pk not in current_tag_ids:
keep_ids.add(tag.pk)
keep_ids.update(int(pk) for pk in tag.get_ancestors_pks())
# Remove inbox tags and their descendants, except those being kept
remove_ids: set[int] = set()
for inbox_tag in (
Tag.objects.filter(is_inbox_tag=True)
.exclude(pk__in=keep_ids)
.only("pk", "tn_descendants_pks")
):
remove_ids.add(inbox_tag.pk)
remove_ids.update(int(pk) for pk in inbox_tag.get_descendants_pks())
validated_data["tags"] = [t for t in tags if t.pk not in remove_ids]
if settings.AUDIT_LOG_ENABLED:
with set_actor(self.user):
super().update(instance, validated_data)
else:
super().update(instance, validated_data)
# hard delete custom field instances that were soft deleted
CustomFieldInstance.deleted_objects.filter(document=instance).delete()
return instance
def __init__(self, *args, **kwargs) -> None:
self.truncate_content = kwargs.pop("truncate_content", False)
# return full permissions if we're doing a PATCH or PUT
context = kwargs.get("context")
if context is not None and (
context.get("request").method == "PATCH"
or context.get("request").method == "PUT"
):
kwargs["full_perms"] = True
super().__init__(*args, **kwargs)
class Meta:
model = Document
fields = (
"id",
"correspondent",
"document_type",
"storage_path",
"title",
"content",
"tags",
"created",
"created_date",
"modified",
"added",
"deleted_at",
"archive_serial_number",
"original_file_name",
"archived_file_name",
"duplicate_documents",
"owner",
"permissions",
"user_can_change",
"is_shared_by_requester",
"set_permissions",
"notes",
"custom_fields",
"remove_inbox_tags",
"page_count",
"mime_type",
"root_document",
"versions",
)
read_only_fields = ("deleted_at",)
list_serializer_class = OwnedObjectListSerializer
class SearchResultListSerializer(serializers.ListSerializer[Document]):
def to_representation(self, hits):
document_ids = [hit["id"] for hit in hits]
# Fetch all Document objects in the list in one SQL query.
documents = self.child.fetch_documents(document_ids)
self.child.context["documents"] = documents
# Also check if they are shared with other users / groups.
self.child.context["shared_object_pks"] = self.child.get_shared_object_pks(
documents.values(),
)
return super().to_representation(hits)
class SearchResultSerializer(DocumentSerializer):
@staticmethod
def fetch_documents(ids):
"""
Return a dict that maps given document IDs to Document objects.
"""
return {
document.id: document
for document in Document.objects.select_related(
"correspondent",
"storage_path",
"document_type",
"owner",
)
.prefetch_related("tags", "custom_fields", "notes")
.filter(id__in=ids)
}
def to_representation(self, hit):
# Again we first check if the parent has already fetched the documents.
documents = self.context.get("documents")
# Otherwise we fetch this document.
if documents is None: # pragma: no cover
# In practice we only serialize **lists** of SearchHit dicts.
# Keeping this check for completeness but marking it no cover for now.
documents = self.fetch_documents([hit["id"]])
document = documents[hit["id"]]
highlights = hit.get("highlights", {})
r = super().to_representation(document)
r["__search_hit__"] = {
"score": hit["score"],
"highlights": highlights.get("content", ""),
"note_highlights": highlights.get("notes") or None,
"rank": hit["rank"],
}
return r
class Meta(DocumentSerializer.Meta):
list_serializer_class = SearchResultListSerializer
class DocumentVersionSerializer(serializers.Serializer[dict[str, Any]]):
document = serializers.FileField(
label="Document",
write_only=True,
)
version_label = serializers.CharField(
label="Version label",
required=False,
allow_blank=True,
allow_null=True,
max_length=64,
)
validate_document = PostDocumentSerializer().validate_document
class DocumentVersionLabelSerializer(serializers.Serializer[dict[str, str | None]]):
version_label = serializers.CharField(
label="Version label",
required=True,
allow_blank=True,
allow_null=True,
max_length=64,
)
def validate_version_label(self, value):
if value is None:
return None
normalized = value.strip()
return normalized or None
-557
View File
@@ -1,557 +0,0 @@
from __future__ import annotations
import logging
import math
import re
from decimal import Decimal
from typing import Any
from django.core.exceptions import ValidationError
from django.core.validators import DecimalValidator
from django.core.validators import MaxLengthValidator
from django.core.validators import MaxValueValidator
from django.core.validators import MinValueValidator
from django.core.validators import RegexValidator
from django.core.validators import integer_validator
from django.db.models import Count
from django.db.models.functions import Lower
from django.utils.crypto import get_random_string
from django.utils.translation import gettext as _
from drf_spectacular.utils import extend_schema_field
from rest_framework import serializers
from rest_framework.exceptions import PermissionDenied
from rest_framework.filters import OrderingFilter
from documents import bulk_edit
from documents.models import Correspondent
from documents.models import CustomField
from documents.models import CustomFieldInstance
from documents.models import Document
from documents.models import DocumentType
from documents.models import PaperlessTask
from documents.models import StoragePath
from documents.models import Tag
from documents.permissions import get_document_count_filter_for_user
from documents.permissions import permitted_document_ids
from documents.permissions import restrict_queryset_to_visible
from documents.templating.filepath import validate_filepath_template_and_render
from documents.templating.utils import convert_format_str_to_template_format
from documents.validators import uri_validator
from .base import MatchingModelSerializer
from .base import OwnedObjectSerializer
from .base import ReadWriteSerializerMethodField
from .base import SerializerWithPerms
logger = logging.getLogger("paperless.serializers")
class CorrespondentSerializer(MatchingModelSerializer, OwnedObjectSerializer):
last_correspondence = serializers.DateField(read_only=True, required=False)
class Meta:
model = Correspondent
fields = (
"id",
"slug",
"name",
"match",
"matching_algorithm",
"is_insensitive",
"document_count",
"last_correspondence",
"owner",
"permissions",
"user_can_change",
"set_permissions",
)
class DocumentTypeSerializer(MatchingModelSerializer, OwnedObjectSerializer):
class Meta:
model = DocumentType
fields = (
"id",
"slug",
"name",
"match",
"matching_algorithm",
"is_insensitive",
"document_count",
"owner",
"permissions",
"user_can_change",
"set_permissions",
)
class DeprecatedColors:
COLOURS = (
(1, "#a6cee3"),
(2, "#1f78b4"),
(3, "#b2df8a"),
(4, "#33a02c"),
(5, "#fb9a99"),
(6, "#e31a1c"),
(7, "#fdbf6f"),
(8, "#ff7f00"),
(9, "#cab2d6"),
(10, "#6a3d9a"),
(11, "#b15928"),
(12, "#000000"),
(13, "#cccccc"),
)
@extend_schema_field(
serializers.ChoiceField(
choices=DeprecatedColors.COLOURS,
),
)
class ColorField(serializers.Field):
def to_internal_value(self, data):
for id, color in DeprecatedColors.COLOURS:
if id == data:
return color
raise serializers.ValidationError
def to_representation(self, value):
for id, color in DeprecatedColors.COLOURS:
if color == value:
return id
return 1
class TagSerializer(MatchingModelSerializer, OwnedObjectSerializer):
def get_text_color(self, obj) -> str:
try:
h = obj.color.lstrip("#")
rgb = tuple(int(h[i : i + 2], 16) / 256 for i in (0, 2, 4))
luminance = math.sqrt(
0.299 * math.pow(rgb[0], 2)
+ 0.587 * math.pow(rgb[1], 2)
+ 0.114 * math.pow(rgb[2], 2),
)
return "#ffffff" if luminance < 0.53 else "#000000"
except ValueError:
return "#000000"
text_color = serializers.SerializerMethodField()
# map to treenode's tn_parent
parent = serializers.PrimaryKeyRelatedField(
queryset=Tag.objects.all(),
allow_null=True,
required=False,
source="tn_parent",
)
@extend_schema_field(
field=serializers.ListSerializer(
child=serializers.PrimaryKeyRelatedField(
queryset=Tag.objects.all(),
),
),
)
def get_children(self, obj):
children_map = self.context.get("children_map")
if children_map is not None:
children = children_map.get(obj.pk, [])
else:
filter_q = self.context.get("document_count_filter")
request = self.context.get("request")
if filter_q is None:
user = getattr(request, "user", None) if request else None
filter_q = get_document_count_filter_for_user(user)
self.context["document_count_filter"] = filter_q
children = (
obj.get_children_queryset()
.select_related("owner")
.annotate(document_count=Count("documents", filter=filter_q))
)
user = getattr(request, "user", None) if request else self.user
children = restrict_queryset_to_visible(children, user, "view_tag")
view = self.context.get("view")
ordering = (
OrderingFilter().get_ordering(request, children, view)
if request and view
else None
)
ordering = ordering or (Lower("name"),)
children = children.order_by(*ordering)
if not children:
return []
serializer = TagSerializer(
children,
many=True,
user=self.user,
full_perms=self.full_perms,
all_fields=self.all_fields,
context=self.context,
)
return serializer.data
# children as nested Tag objects
children = serializers.SerializerMethodField()
class Meta:
model = Tag
fields = (
"id",
"slug",
"name",
"color",
"text_color",
"match",
"matching_algorithm",
"is_insensitive",
"is_inbox_tag",
"document_count",
"owner",
"permissions",
"user_can_change",
"set_permissions",
"parent",
"children",
)
def validate_color(self, color):
regex = r"#[0-9a-fA-F]{6}"
if not re.match(regex, color):
raise serializers.ValidationError(_("Invalid color."))
return color
def validate(self, attrs):
# Validate when changing parent
parent = attrs.get(
"tn_parent",
self.instance.get_parent() if self.instance else None,
)
if self.instance:
# Temporarily set parent on the instance if updating and use model clean()
original_parent = self.instance.get_parent()
try:
# Temporarily set tn_parent in-memory to validate clean()
self.instance.tn_parent = parent
self.instance.clean()
except ValidationError as e:
logger.debug("Tag parent validation failed: %s", e)
raise e
finally:
self.instance.tn_parent = original_parent
else:
# For new instances, create a transient Tag and validate
temp = Tag(tn_parent=parent)
try:
temp.clean()
except ValidationError as e:
logger.debug("Tag parent validation failed: %s", e)
raise e
return super().validate(attrs)
class CorrespondentField(serializers.PrimaryKeyRelatedField[Correspondent]):
def get_queryset(self):
return Correspondent.objects.all()
class TagsField(serializers.PrimaryKeyRelatedField[Tag]):
def get_queryset(self):
return Tag.objects.all()
class DocumentTypeField(serializers.PrimaryKeyRelatedField[DocumentType]):
def get_queryset(self):
return DocumentType.objects.all()
class StoragePathField(serializers.PrimaryKeyRelatedField[StoragePath]):
def get_queryset(self):
return StoragePath.objects.all()
class CustomFieldSerializer(serializers.ModelSerializer[CustomField]):
data_type = serializers.ChoiceField(
choices=CustomField.FieldDataType,
read_only=False,
)
document_count = serializers.IntegerField(read_only=True)
class Meta:
model = CustomField
fields = [
"id",
"name",
"data_type",
"extra_data",
"document_count",
]
def validate(self, attrs):
# TODO: remove pending https://github.com/encode/django-rest-framework/issues/7173
name = attrs.get(
"name",
self.instance.name if hasattr(self.instance, "name") else None,
)
objects = (
self.Meta.model.objects.exclude(
pk=self.instance.pk,
)
if self.instance is not None
else self.Meta.model.objects.all()
)
if ("name" in attrs) and objects.filter(
name=name,
).exists():
raise serializers.ValidationError(
{"error": "Object violates name unique constraint"},
)
if (
"data_type" in attrs
and attrs["data_type"] == CustomField.FieldDataType.SELECT
) or (
self.instance
and self.instance.data_type == CustomField.FieldDataType.SELECT
):
if (
"extra_data" not in attrs
or "select_options" not in attrs["extra_data"]
or not isinstance(attrs["extra_data"]["select_options"], list)
or len(attrs["extra_data"]["select_options"]) == 0
or not all(
len(option.get("label", "")) > 0
for option in attrs["extra_data"]["select_options"]
)
):
raise serializers.ValidationError(
{"error": "extra_data.select_options must be a valid list"},
)
# labels are valid, generate ids if not present
for option in attrs["extra_data"]["select_options"]:
if option.get("id") is None:
option["id"] = get_random_string(length=16)
elif (
"data_type" in attrs
and attrs["data_type"] == CustomField.FieldDataType.MONETARY
and "extra_data" in attrs
and "default_currency" in attrs["extra_data"]
and attrs["extra_data"]["default_currency"] is not None
and (
not isinstance(attrs["extra_data"]["default_currency"], str)
or (
len(attrs["extra_data"]["default_currency"]) > 0
and len(attrs["extra_data"]["default_currency"]) != 3
)
)
):
raise serializers.ValidationError(
{"error": "extra_data.default_currency must be a 3-character string"},
)
return super().validate(attrs)
def validate_documentlink_targets(user, doc_ids):
if Document.objects.filter(id__in=doc_ids).count() != len(doc_ids):
raise serializers.ValidationError(
"Some documents in value don't exist or were specified twice.",
)
if user is None:
return
if (
Document.objects.filter(id__in=doc_ids)
.exclude(id__in=permitted_document_ids(user, perm="change_document"))
.exists()
):
raise PermissionDenied(
_("Insufficient permissions."),
)
class CustomFieldInstanceSerializer(serializers.ModelSerializer[CustomFieldInstance]):
field = serializers.PrimaryKeyRelatedField(queryset=CustomField.objects.all())
value = ReadWriteSerializerMethodField(allow_null=True)
def create(self, validated_data):
# An instance is attached to a document
document: Document = validated_data["document"]
# And to a CustomField
custom_field: CustomField = validated_data["field"]
# This key must exist, as it is validated
data_store_name = CustomFieldInstance.get_value_field_name(
custom_field.data_type,
)
if custom_field.data_type == CustomField.FieldDataType.DOCUMENTLINK:
# prior to update so we can look for any docs that are going to be removed
bulk_edit.reflect_doclinks(document, custom_field, validated_data["value"])
# Actually update or create the instance, providing the value
# to fill in the correct attribute based on the type
instance, _ = CustomFieldInstance.objects.update_or_create(
document=document,
field=custom_field,
defaults={data_store_name: validated_data["value"]},
)
return instance
def get_value(self, obj: CustomFieldInstance) -> str | int | float | dict | None:
return obj.value
def validate(self, data):
"""
Probably because we're kind of doing it odd, validation from the model
doesn't run against the field "value", so we have to re-create it here.
Don't like it, but it is better than returning an HTTP 500 when the database
hates the value
"""
data = super().validate(data)
field: CustomField = data["field"]
if "value" in data and data["value"] is not None:
if (
field.data_type == CustomField.FieldDataType.URL
and len(data["value"]) > 0
):
uri_validator(data["value"])
elif field.data_type == CustomField.FieldDataType.INT:
integer_validator(data["value"])
try:
value_int = int(data["value"])
except (TypeError, ValueError):
raise serializers.ValidationError("Enter a valid integer.")
# Keep values within the PostgreSQL integer range
MinValueValidator(-2147483648)(value_int)
MaxValueValidator(2147483647)(value_int)
elif (
field.data_type == CustomField.FieldDataType.MONETARY
and data["value"] != ""
):
try:
# First try to validate as a number from legacy format
DecimalValidator(max_digits=12, decimal_places=2)(
Decimal(str(data["value"])),
)
except Exception:
# If that fails, try to validate as a monetary string
RegexValidator(
regex=r"^[A-Z]{3}-?\d+(\.\d{1,2})$",
message="Must be a two-decimal number with optional currency code e.g. GBP123.45",
)(data["value"])
elif field.data_type == CustomField.FieldDataType.STRING:
MaxLengthValidator(limit_value=128)(data["value"])
elif field.data_type == CustomField.FieldDataType.SELECT:
select_options = field.extra_data["select_options"]
try:
next(
option
for option in select_options
if option["id"] == data["value"]
)
except Exception:
raise serializers.ValidationError(
f"Value must be an id of an element in {select_options}",
)
elif field.data_type == CustomField.FieldDataType.DOCUMENTLINK:
if not (isinstance(data["value"], list) or data["value"] is None):
raise serializers.ValidationError(
"Value must be a list",
)
doc_ids = data["value"]
request = self.context.get("request")
validate_documentlink_targets(
getattr(request, "user", None) if request is not None else None,
doc_ids,
)
elif field.data_type == CustomField.FieldDataType.DATE:
data["value"] = serializers.DateField().to_internal_value(data["value"])
return data
class Meta:
model = CustomFieldInstance
fields = [
"value",
"field",
]
class StoragePathSerializer(MatchingModelSerializer, OwnedObjectSerializer):
class Meta:
model = StoragePath
fields = (
"id",
"slug",
"name",
"path",
"match",
"matching_algorithm",
"is_insensitive",
"document_count",
"owner",
"permissions",
"user_can_change",
"set_permissions",
)
def validate_path(self, path: str):
converted_path = convert_format_str_to_template_format(path)
if converted_path != path:
logger.warning(
f"Storage path {path} is not using the new style format, consider updating",
)
result = validate_filepath_template_and_render(converted_path)
if result is None:
raise serializers.ValidationError(_("Invalid variable detected."))
return converted_path
def update(self, instance, validated_data):
"""
When a storage path is updated, see if documents
using it require a rename/move
"""
doc_ids = [doc.id for doc in instance.documents.all()]
if doc_ids:
bulk_edit.bulk_update_documents.apply_async(
kwargs={"document_ids": doc_ids},
headers={"trigger_source": PaperlessTask.TriggerSource.SYSTEM},
)
return super().update(instance, validated_data)
class StoragePathTestSerializer(SerializerWithPerms):
path = serializers.CharField(
required=True,
label="Path",
write_only=True,
)
document = serializers.PrimaryKeyRelatedField(
queryset=Document.objects.none(),
required=True,
label="Document",
write_only=True,
)
def __init__(self, *args: Any, **kwargs: Any) -> None:
super().__init__(*args, **kwargs)
request = self.context.get("request")
user = getattr(request, "user", None) if request else None
if user is not None and user.is_authenticated:
document_field = self.fields.get("document")
if not isinstance(document_field, serializers.PrimaryKeyRelatedField):
return
document_field.queryset = Document.objects.filter(
id__in=permitted_document_ids(user),
)
-234
View File
@@ -1,234 +0,0 @@
from __future__ import annotations
import logging
import re
from django.conf import settings
from rest_framework import serializers
from documents.models import CustomField
from documents.models import SavedView
from documents.models import SavedViewFilterRule
from documents.models import UiSettings
from .base import OwnedObjectSerializer
logger = logging.getLogger("paperless.serializers")
class SavedViewFilterRuleSerializer(serializers.ModelSerializer[SavedViewFilterRule]):
class Meta:
model = SavedViewFilterRule
fields = ["rule_type", "value"]
class SavedViewSerializer(OwnedObjectSerializer):
filter_rules = SavedViewFilterRuleSerializer(many=True)
class Meta:
model = SavedView
fields = [
"id",
"name",
"icon",
"sort_field",
"sort_reverse",
"filter_rules",
"page_size",
"display_mode",
"display_fields",
"owner",
"permissions",
"user_can_change",
"set_permissions",
]
def _get_api_version(self) -> int:
request = self.context.get("request")
return int(
request.version if request else settings.REST_FRAMEWORK["DEFAULT_VERSION"],
)
def _update_legacy_visibility_preferences(
self,
saved_view_id: int,
*,
show_on_dashboard: bool | None,
show_in_sidebar: bool | None,
) -> UiSettings | None:
if show_on_dashboard is None and show_in_sidebar is None:
return None
request = self.context.get("request")
user = request.user if request else self.user
if user is None:
return None
ui_settings, _ = UiSettings.objects.get_or_create(
user=user,
defaults={"settings": {}},
)
current_settings = (
ui_settings.settings if isinstance(ui_settings.settings, dict) else {}
)
current_settings = dict(current_settings)
saved_views_settings = current_settings.get("saved_views")
if isinstance(saved_views_settings, dict):
saved_views_settings = dict(saved_views_settings)
else:
saved_views_settings = {}
dashboard_ids = {
int(raw_id)
for raw_id in saved_views_settings.get("dashboard_views_visible_ids", [])
if str(raw_id).isdigit()
}
sidebar_ids = {
int(raw_id)
for raw_id in saved_views_settings.get("sidebar_views_visible_ids", [])
if str(raw_id).isdigit()
}
if show_on_dashboard is not None:
if show_on_dashboard:
dashboard_ids.add(saved_view_id)
else:
dashboard_ids.discard(saved_view_id)
if show_in_sidebar is not None:
if show_in_sidebar:
sidebar_ids.add(saved_view_id)
else:
sidebar_ids.discard(saved_view_id)
saved_views_settings["dashboard_views_visible_ids"] = sorted(dashboard_ids)
saved_views_settings["sidebar_views_visible_ids"] = sorted(sidebar_ids)
current_settings["saved_views"] = saved_views_settings
ui_settings.settings = current_settings
ui_settings.save(update_fields=["settings"])
return ui_settings
def to_representation(self, instance):
# TODO: remove this and related backwards compatibility code when API v9 is dropped
ret = super().to_representation(instance)
request = self.context.get("request")
api_version = self._get_api_version()
if api_version < 10:
dashboard_ids = set()
sidebar_ids = set()
user = request.user if request else None
if user is not None and hasattr(user, "ui_settings"):
ui_settings = user.ui_settings.settings or None
saved_views = None
if isinstance(ui_settings, dict):
saved_views = ui_settings.get("saved_views", {})
if isinstance(saved_views, dict):
dashboard_ids = set(
saved_views.get("dashboard_views_visible_ids", []),
)
sidebar_ids = set(
saved_views.get("sidebar_views_visible_ids", []),
)
ret["show_on_dashboard"] = instance.id in dashboard_ids
ret["show_in_sidebar"] = instance.id in sidebar_ids
return ret
def to_internal_value(self, data):
# TODO: remove this and related backwards compatibility code when API v9 is dropped
api_version = self._get_api_version()
if api_version >= 10:
return super().to_internal_value(data)
normalized_data = data.copy()
legacy_visibility_fields = {}
boolean_field = serializers.BooleanField()
for field_name in ("show_on_dashboard", "show_in_sidebar"):
if field_name in normalized_data:
try:
legacy_visibility_fields[field_name] = (
boolean_field.to_internal_value(
normalized_data.get(field_name),
)
)
except serializers.ValidationError as exc:
raise serializers.ValidationError({field_name: exc.detail})
del normalized_data[field_name]
ret = super().to_internal_value(normalized_data)
ret.update(legacy_visibility_fields)
return ret
def validate(self, attrs):
attrs = super().validate(attrs)
if "display_fields" in attrs and attrs["display_fields"] is not None:
for field in attrs["display_fields"]:
if (
SavedView.DisplayFields.CUSTOM_FIELD[:-2] in field
): # i.e. check for 'custom_field_' prefix
field_id = int(re.search(r"\d+", field)[0])
if not CustomField.objects.filter(id=field_id).exists():
raise serializers.ValidationError(
f"Invalid field: {field}",
)
elif field not in SavedView.DisplayFields.values:
raise serializers.ValidationError(
f"Invalid field: {field}",
)
return attrs
def update(self, instance, validated_data):
request = self.context.get("request")
show_on_dashboard = validated_data.pop("show_on_dashboard", None)
show_in_sidebar = validated_data.pop("show_in_sidebar", None)
if "filter_rules" in validated_data:
rules_data = validated_data.pop("filter_rules")
else:
rules_data = None
if "user" in validated_data:
# backwards compatibility
validated_data["owner"] = validated_data.pop("user")
if (
"display_fields" in validated_data
and isinstance(
validated_data["display_fields"],
list,
)
and len(validated_data["display_fields"]) == 0
):
validated_data["display_fields"] = None
instance = super().update(instance, validated_data)
if rules_data is not None:
SavedViewFilterRule.objects.filter(saved_view=instance).delete()
for rule_data in rules_data:
SavedViewFilterRule.objects.create(saved_view=instance, **rule_data)
ui_settings = self._update_legacy_visibility_preferences(
instance.id,
show_on_dashboard=show_on_dashboard,
show_in_sidebar=show_in_sidebar,
)
if request is not None and ui_settings is not None:
request.user.ui_settings = ui_settings
return instance
def create(self, validated_data):
request = self.context.get("request")
show_on_dashboard = validated_data.pop("show_on_dashboard", None)
show_in_sidebar = validated_data.pop("show_in_sidebar", None)
rules_data = validated_data.pop("filter_rules")
if "user" in validated_data:
# backwards compatibility
validated_data["owner"] = validated_data.pop("user")
saved_view = super().create(validated_data)
for rule_data in rules_data:
SavedViewFilterRule.objects.create(saved_view=saved_view, **rule_data)
ui_settings = self._update_legacy_visibility_preferences(
saved_view.id,
show_on_dashboard=show_on_dashboard,
show_in_sidebar=show_in_sidebar,
)
if request is not None and ui_settings is not None:
request.user.ui_settings = ui_settings
return saved_view
-204
View File
@@ -1,204 +0,0 @@
from __future__ import annotations
import logging
from datetime import timedelta
from django.core.exceptions import ValidationError
from django.core.validators import EmailValidator
from django.utils import timezone
from django.utils.crypto import get_random_string
from django.utils.translation import gettext as _
from rest_framework import serializers
from rest_framework.exceptions import PermissionDenied
from rest_framework.fields import SerializerMethodField
from documents.models import Document
from documents.models import ShareLink
from documents.models import ShareLinkBundle
from documents.permissions import has_perms_owner_aware
from .base import DocumentListSerializer
from .base import OwnedObjectSerializer
logger = logging.getLogger("paperless.serializers")
class EmailSerializer(DocumentListSerializer):
addresses = serializers.CharField(
required=True,
label="Email addresses",
help_text="Comma-separated email addresses",
)
subject = serializers.CharField(
required=True,
label="Email subject",
)
message = serializers.CharField(
required=True,
label="Email message",
)
use_archive_version = serializers.BooleanField(
default=True,
label="Use archive version",
help_text="Use archive version of documents if available",
)
def validate_addresses(self, addresses):
address_list = [addr.strip() for addr in addresses.split(",")]
if not address_list:
raise serializers.ValidationError("At least one email address is required")
email_validator = EmailValidator()
try:
for address in address_list:
email_validator(address)
except ValidationError:
raise serializers.ValidationError(f"Invalid email address: {address}")
return ",".join(address_list)
def validate_documents(self, documents):
super().validate_documents(documents)
if not documents:
raise serializers.ValidationError("At least one document is required")
return documents
class ShareLinkSerializer(OwnedObjectSerializer):
document_title = serializers.CharField(
source="document.title",
read_only=True,
)
class Meta:
model = ShareLink
fields = (
"id",
"created",
"expiration",
"slug",
"document",
"document_title",
"file_version",
)
def create(self, validated_data):
validated_data["slug"] = get_random_string(50)
return super().create(validated_data)
def validate_document(self, document):
if (
self.user is not None
and self.user.has_perm("documents.view_document")
and has_perms_owner_aware(
self.user,
"view_document",
document,
)
):
return document
raise PermissionDenied(
_("Insufficient permissions."),
)
class ShareLinkBundleSerializer(OwnedObjectSerializer):
document_ids = serializers.ListField(
child=serializers.IntegerField(min_value=1),
allow_empty=False,
write_only=True,
)
expiration_days = serializers.IntegerField(
required=False,
allow_null=True,
min_value=1,
write_only=True,
)
documents = serializers.PrimaryKeyRelatedField(
many=True,
read_only=True,
)
document_count = SerializerMethodField()
class Meta:
model = ShareLinkBundle
fields = (
"id",
"created",
"expiration",
"expiration_days",
"slug",
"file_version",
"status",
"size_bytes",
"last_error",
"built_at",
"documents",
"document_ids",
"document_count",
)
read_only_fields = (
"id",
"created",
"expiration",
"slug",
"status",
"size_bytes",
"last_error",
"built_at",
"documents",
"document_count",
)
def validate_document_ids(self, value):
unique_ids = set(value)
if len(unique_ids) != len(value):
raise serializers.ValidationError(
_("Duplicate document identifiers are not allowed."),
)
return value
def create(self, validated_data):
document_ids = validated_data.pop("document_ids")
expiration_days = validated_data.pop("expiration_days", None)
validated_data["slug"] = get_random_string(50)
if expiration_days:
validated_data["expiration"] = timezone.now() + timedelta(
days=expiration_days,
)
else:
validated_data["expiration"] = None
share_link_bundle = super().create(validated_data)
documents = list(
Document.objects.filter(pk__in=document_ids).only(
"pk",
),
)
documents_by_id = {doc.pk: doc for doc in documents}
missing = [
str(doc_id) for doc_id in document_ids if doc_id not in documents_by_id
]
if missing:
raise serializers.ValidationError(
{
"document_ids": _(
"Documents not found: %(ids)s",
)
% {"ids": ", ".join(missing)},
},
)
ordered_documents = [documents_by_id[doc_id] for doc_id in document_ids]
share_link_bundle.documents.set(ordered_documents)
share_link_bundle.document_total = len(ordered_documents)
return share_link_bundle
def get_document_count(self, obj: ShareLinkBundle) -> int:
return getattr(obj, "document_total") or obj.documents.count()
-63
View File
@@ -1,63 +0,0 @@
from __future__ import annotations
import logging
from rest_framework import serializers
from documents.models import Document
from documents.models import UiSettings
from .base import SerializerWithPerms
logger = logging.getLogger("paperless.serializers")
class UiSettingsViewSerializer(serializers.ModelSerializer[UiSettings]):
settings = serializers.DictField(required=False, allow_null=True)
class Meta:
model = UiSettings
depth = 1
fields = [
"id",
"settings",
]
def validate_settings(self, settings):
# we never save update checking backend setting
if "update_checking" in settings:
try:
settings["update_checking"].pop("backend_setting")
except KeyError:
pass
return settings
def create(self, validated_data):
ui_settings = UiSettings.objects.update_or_create(
user=validated_data.get("user"),
defaults={"settings": validated_data.get("settings", None)},
)
return ui_settings
class TrashSerializer(SerializerWithPerms):
documents = serializers.ListField(
required=False,
label="Documents",
write_only=True,
child=serializers.IntegerField(),
)
action = serializers.ChoiceField(
choices=["restore", "empty"],
label="Action",
write_only=True,
)
def validate_documents(self, documents: list[int]) -> list[int]:
count = Document.deleted_objects.filter(id__in=documents).count()
if not count == len(documents):
raise serializers.ValidationError(
"Some documents in the list have not yet been deleted.",
)
return documents
-246
View File
@@ -1,246 +0,0 @@
from __future__ import annotations
import logging
from typing import Any
from rest_framework import serializers
from documents.models import Document
from documents.models import PaperlessTask
from documents.permissions import permitted_document_ids
from .base import OwnedObjectSerializer
logger = logging.getLogger("paperless.serializers")
class TaskSerializerV10(OwnedObjectSerializer):
"""Task serializer for API v10+ using new field names."""
related_document_ids = serializers.ListField(
child=serializers.IntegerField(),
read_only=True,
)
task_type_display = serializers.CharField(
source="get_task_type_display",
read_only=True,
)
trigger_source_display = serializers.CharField(
source="get_trigger_source_display",
read_only=True,
)
status_display = serializers.CharField(
source="get_status_display",
read_only=True,
)
class Meta:
model = PaperlessTask
fields = (
"id",
"task_id",
"task_type",
"task_type_display",
"trigger_source",
"trigger_source_display",
"status",
"status_display",
"date_created",
"date_started",
"date_done",
"duration_seconds",
"wait_time_seconds",
"input_data",
"result_data",
"related_document_ids",
"acknowledged",
"owner",
)
read_only_fields = fields
class TaskSerializerV9(serializers.ModelSerializer[PaperlessTask]):
"""Task serializer for API v9 backwards compatibility.
Maps old field names to the new model fields so existing clients continue
to work unchanged.
"""
# v9 field: task_name -> task_type (with value remapping for renamed tasks)
task_name = serializers.SerializerMethodField()
# v9 field: task_file_name -> input_data.filename
task_file_name = serializers.SerializerMethodField()
# v9 field: type -> trigger_source (mapped to old enum labels)
type = serializers.SerializerMethodField()
# v9 field: status -> uppercase Celery state strings
status = serializers.SerializerMethodField()
# v9 field: result -> derived from result_data
result = serializers.SerializerMethodField()
# v9 field: related_document -> first document ID from result_data
related_document = serializers.SerializerMethodField()
# v9 field: duplicate_documents -> list of duplicate IDs from result_data
duplicate_documents = serializers.SerializerMethodField()
class Meta:
model = PaperlessTask
fields = (
"id",
"task_id",
"task_name",
"task_file_name",
"type",
"status",
"date_created",
"date_done",
"result",
"acknowledged",
"related_document",
"duplicate_documents",
"owner",
)
read_only_fields = fields
_TASK_TYPE_TO_V9_NAME = {
PaperlessTask.TaskType.SANITY_CHECK: "check_sanity",
PaperlessTask.TaskType.LLM_INDEX: "llmindex_update",
}
def get_result(self, obj: PaperlessTask) -> str | None:
"""Reconstruct a human-readable result string from result_data for v9 clients."""
if not obj.result_data:
return None
if doc_id := obj.result_data.get("document_id"):
return f"Success. New document id {doc_id} created"
if reason := obj.result_data.get("reason"):
return reason
if dup_id := obj.result_data.get("duplicate_of"):
return f"Not consuming: It is a duplicate of document #{dup_id}"
if error := obj.result_data.get("error_message"):
return error
return None
def get_task_name(self, obj: PaperlessTask) -> str:
return self._TASK_TYPE_TO_V9_NAME.get(obj.task_type, obj.task_type)
def get_task_file_name(self, obj: PaperlessTask) -> str | None:
if not obj.input_data:
return None
return obj.input_data.get("filename")
_STATUS_TO_V9 = {
PaperlessTask.Status.PENDING: "PENDING",
PaperlessTask.Status.STARTED: "STARTED",
PaperlessTask.Status.SUCCESS: "SUCCESS",
PaperlessTask.Status.FAILURE: "FAILURE",
PaperlessTask.Status.REVOKED: "REVOKED",
}
def get_status(self, obj: PaperlessTask) -> str:
return self._STATUS_TO_V9.get(obj.status, obj.status.upper())
_TRIGGER_SOURCE_TO_V9_TYPE = {
PaperlessTask.TriggerSource.SCHEDULED: "scheduled_task",
PaperlessTask.TriggerSource.SYSTEM: "auto_task",
# Email and folder-consumer documents are system-initiated, not manually triggered
PaperlessTask.TriggerSource.EMAIL_CONSUME: "auto_task",
PaperlessTask.TriggerSource.FOLDER_CONSUME: "auto_task",
}
def get_type(self, obj: PaperlessTask) -> str:
return self._TRIGGER_SOURCE_TO_V9_TYPE.get(obj.trigger_source, "manual_task")
def get_related_document(self, obj: PaperlessTask) -> int | None:
ids = obj.related_document_ids
return ids[0] if ids else None
def get_duplicate_documents(
self,
obj: PaperlessTask,
) -> list[dict[str, Any]]:
if not obj.result_data:
return []
dup_of = obj.result_data.get("duplicate_of")
if dup_of is None:
return []
request = self.context.get("request")
if request is None:
return []
user = request.user
qs = Document.global_objects.filter(pk=dup_of)
if not user.is_staff:
allowed_ids = permitted_document_ids(user, include_deleted=True)
qs = qs.filter(pk__in=allowed_ids)
return list(qs.values("id", "title", "deleted_at"))
class TaskSummarySerializer(serializers.Serializer[dict[str, Any]]):
task_type = serializers.CharField()
total_count = serializers.IntegerField()
pending_count = serializers.IntegerField()
success_count = serializers.IntegerField()
failure_count = serializers.IntegerField()
avg_duration_seconds = serializers.FloatField(allow_null=True)
avg_wait_time_seconds = serializers.FloatField(allow_null=True)
last_run = serializers.DateTimeField(allow_null=True)
last_success = serializers.DateTimeField(allow_null=True)
last_failure = serializers.DateTimeField(allow_null=True)
class RunTaskSerializer(serializers.Serializer[dict[str, str]]):
task_type = serializers.ChoiceField(
choices=PaperlessTask.TaskType.choices,
label="Task Type",
write_only=True,
)
class AcknowledgeTasksViewSerializer(serializers.Serializer[dict[str, Any]]):
tasks = serializers.ListField(
required=False,
label="Tasks",
write_only=True,
child=serializers.IntegerField(),
)
all = serializers.BooleanField(
required=False,
default=False,
label="All",
write_only=True,
)
def _validate_task_id_list(self, tasks, name="tasks") -> None:
if not isinstance(tasks, list):
raise serializers.ValidationError(f"{name} must be a list")
if not all(isinstance(i, int) for i in tasks):
raise serializers.ValidationError(f"{name} must be a list of integers")
queryset = self.context.get("queryset", PaperlessTask.objects.all())
count = queryset.filter(id__in=tasks).count()
if not count == len(tasks):
raise serializers.ValidationError(
f"Some tasks in {name} don't exist or were specified twice.",
)
def validate_tasks(self, tasks):
self._validate_task_id_list(tasks)
return tasks
def validate(self, attrs):
acknowledge_all = attrs.get("all", False)
task_ids = attrs.get("tasks")
if acknowledge_all and task_ids is not None:
raise serializers.ValidationError(
"Set either all or tasks, not both.",
)
if not acknowledge_all and task_ids is None:
raise serializers.ValidationError(
"Either all must be true or tasks must be provided.",
)
return attrs
-199
View File
@@ -1,199 +0,0 @@
from __future__ import annotations
import logging
from datetime import datetime
from typing import Any
import magic
from django.conf import settings
from django.utils.translation import gettext as _
from rest_framework import serializers
from documents.models import Correspondent
from documents.models import CustomField
from documents.models import Document
from documents.models import DocumentType
from documents.models import StoragePath
from documents.models import Tag
from documents.parsers import is_mime_type_supported
from .metadata import CustomFieldInstanceSerializer
logger = logging.getLogger("paperless.serializers")
class PostDocumentSerializer(serializers.Serializer[dict[str, Any]]):
created = serializers.DateTimeField(
label="Created",
allow_null=True,
write_only=True,
required=False,
)
document = serializers.FileField(
label="Document",
write_only=True,
)
title = serializers.CharField(
label="Title",
write_only=True,
required=False,
)
correspondent = serializers.PrimaryKeyRelatedField(
queryset=Correspondent.objects.all(),
label="Correspondent",
allow_null=True,
write_only=True,
required=False,
)
document_type = serializers.PrimaryKeyRelatedField(
queryset=DocumentType.objects.all(),
label="Document type",
allow_null=True,
write_only=True,
required=False,
)
storage_path = serializers.PrimaryKeyRelatedField(
queryset=StoragePath.objects.all(),
label="Storage path",
allow_null=True,
write_only=True,
required=False,
)
tags = serializers.PrimaryKeyRelatedField(
many=True,
queryset=Tag.objects.all(),
label="Tags",
write_only=True,
required=False,
)
archive_serial_number = serializers.IntegerField(
label="ASN",
write_only=True,
required=False,
min_value=Document.ARCHIVE_SERIAL_NUMBER_MIN,
max_value=Document.ARCHIVE_SERIAL_NUMBER_MAX,
)
# Accept either a list of custom field ids or a dict mapping id -> value
custom_fields = serializers.JSONField(
label="Custom fields",
write_only=True,
required=False,
)
from_webui = serializers.BooleanField(
label="Documents are from Paperless-ngx WebUI",
write_only=True,
required=False,
)
def validate_document(self, document):
document_data = document.file.read()
mime_type = magic.from_buffer(document_data, mime=True)
if not is_mime_type_supported(mime_type):
if (
mime_type in settings.CONSUMER_PDF_RECOVERABLE_MIME_TYPES
and document.name.endswith(
".pdf",
)
):
# If the file is an invalid PDF, we can try to recover it later in the consumer
mime_type = "application/pdf"
else:
raise serializers.ValidationError(
_("File type %(type)s not supported") % {"type": mime_type},
)
return document.name, document_data
def validate_correspondent(self, correspondent):
if correspondent:
return correspondent.id
else:
return None
def validate_document_type(self, document_type):
if document_type:
return document_type.id
else:
return None
def validate_storage_path(self, storage_path):
if storage_path:
return storage_path.id
else:
return None
def validate_tags(self, tags):
if tags:
return [tag.id for tag in tags]
else:
return None
def validate_custom_fields(self, custom_fields):
if not custom_fields:
return None
# Normalize single values to a list
if isinstance(custom_fields, int):
custom_fields = [custom_fields]
if isinstance(custom_fields, dict):
custom_field_serializer = CustomFieldInstanceSerializer()
normalized = {}
for field_id, value in custom_fields.items():
try:
field_id_int = int(field_id)
except (TypeError, ValueError):
raise serializers.ValidationError(
_("Custom field id must be an integer: %(id)s")
% {"id": field_id},
)
try:
field = CustomField.objects.get(id=field_id_int)
except CustomField.DoesNotExist:
raise serializers.ValidationError(
_("Custom field with id %(id)s does not exist")
% {"id": field_id_int},
)
custom_field_serializer.validate(
{
"field": field,
"value": value,
},
)
normalized[field_id_int] = value
return normalized
elif isinstance(custom_fields, list):
try:
ids = [int(i) for i in custom_fields]
except (TypeError, ValueError):
raise serializers.ValidationError(
_(
"Custom fields must be a list of integers or an object mapping ids to values.",
),
)
if CustomField.objects.filter(id__in=ids).count() != len(set(ids)):
raise serializers.ValidationError(
_("Some custom fields don't exist or were specified twice."),
)
return ids
raise serializers.ValidationError(
_(
"Custom fields must be a list of integers or an object mapping ids to values.",
),
)
# custom_fields_w_values handled via validate_custom_fields
def validate_created(self, created):
# support datetime format for created for backwards compatibility
if isinstance(created, datetime):
return created.date()
-584
View File
@@ -1,584 +0,0 @@
from __future__ import annotations
import logging
from django.db.models import Count
from rest_framework import fields
from rest_framework import serializers
from documents.data_models import DocumentSource
from documents.filters import CustomFieldQueryParser
from documents.models import Workflow
from documents.models import WorkflowAction
from documents.models import WorkflowActionEmail
from documents.models import WorkflowActionWebhook
from documents.models import WorkflowTrigger
from documents.templating.workflows import validate_workflow_template
from documents.validators import url_validator
from .metadata import CorrespondentField
from .metadata import DocumentTypeField
from .metadata import StoragePathField
from .metadata import TagsField
logger = logging.getLogger("paperless.serializers")
class WorkflowTriggerSerializer(serializers.ModelSerializer[WorkflowTrigger]):
id = serializers.IntegerField(required=False, allow_null=True)
sources = fields.MultipleChoiceField(
choices=WorkflowTrigger.DocumentSourceChoices.choices,
allow_empty=True,
default={
DocumentSource.ConsumeFolder,
DocumentSource.ApiUpload,
DocumentSource.MailFetch,
},
)
type = serializers.ChoiceField(
choices=WorkflowTrigger.WorkflowTriggerType.choices,
label="Trigger Type",
)
class Meta:
model = WorkflowTrigger
fields = [
"id",
"sources",
"type",
"filter_path",
"filter_filename",
"filter_mailrule",
"matching_algorithm",
"match",
"is_insensitive",
"filter_has_tags",
"filter_has_all_tags",
"filter_has_not_tags",
"filter_custom_field_query",
"filter_has_any_correspondents",
"filter_has_not_correspondents",
"filter_has_any_document_types",
"filter_has_not_document_types",
"filter_has_any_storage_paths",
"filter_has_not_storage_paths",
"filter_has_correspondent",
"filter_has_document_type",
"filter_has_storage_path",
"schedule_offset_days",
"schedule_is_recurring",
"schedule_recurring_interval_days",
"schedule_date_field",
"schedule_date_custom_field",
]
def validate(self, attrs):
# Empty strings treated as None to avoid unexpected behavior
if (
"filter_filename" in attrs
and attrs["filter_filename"] is not None
and len(attrs["filter_filename"]) == 0
):
attrs["filter_filename"] = None
if (
"filter_path" in attrs
and attrs["filter_path"] is not None
and len(attrs["filter_path"]) == 0
):
attrs["filter_path"] = None
if (
"filter_custom_field_query" in attrs
and attrs["filter_custom_field_query"] is not None
and len(attrs["filter_custom_field_query"]) == 0
):
attrs["filter_custom_field_query"] = None
if (
"filter_custom_field_query" in attrs
and attrs["filter_custom_field_query"] is not None
):
parser = CustomFieldQueryParser("filter_custom_field_query")
parser.parse(attrs["filter_custom_field_query"])
trigger_type = attrs.get("type", getattr(self.instance, "type", None))
if (
trigger_type == WorkflowTrigger.WorkflowTriggerType.CONSUMPTION
and "filter_mailrule" not in attrs
and ("filter_filename" not in attrs or attrs["filter_filename"] is None)
and ("filter_path" not in attrs or attrs["filter_path"] is None)
):
raise serializers.ValidationError(
"File name, path or mail rule filter are required",
)
return attrs
@staticmethod
def normalize_workflow_trigger_sources(trigger) -> None:
"""
Convert sources to strings to handle django-multiselectfield v1.0 changes
"""
if trigger and "sources" in trigger:
trigger["sources"] = [
str(s.value if hasattr(s, "value") else s) for s in trigger["sources"]
]
def create(self, validated_data):
WorkflowTriggerSerializer.normalize_workflow_trigger_sources(validated_data)
return super().create(validated_data)
def update(self, instance, validated_data):
WorkflowTriggerSerializer.normalize_workflow_trigger_sources(validated_data)
return super().update(instance, validated_data)
class WorkflowActionEmailSerializer(serializers.ModelSerializer[WorkflowActionEmail]):
id = serializers.IntegerField(allow_null=True, required=False)
class Meta:
model = WorkflowActionEmail
fields = [
"id",
"subject",
"body",
"to",
"include_document",
]
class WorkflowActionWebhookSerializer(
serializers.ModelSerializer[WorkflowActionWebhook],
):
id = serializers.IntegerField(allow_null=True, required=False)
def validate_url(self, url):
url_validator(url)
return url
class Meta:
model = WorkflowActionWebhook
fields = [
"id",
"url",
"use_params",
"as_json",
"params",
"body",
"headers",
"include_document",
]
class WorkflowActionSerializer(serializers.ModelSerializer[WorkflowAction]):
id = serializers.IntegerField(required=False, allow_null=True)
assign_correspondent = CorrespondentField(allow_null=True, required=False)
assign_tags = TagsField(many=True, allow_null=True, required=False)
assign_document_type = DocumentTypeField(allow_null=True, required=False)
assign_storage_path = StoragePathField(allow_null=True, required=False)
email = WorkflowActionEmailSerializer(allow_null=True, required=False)
webhook = WorkflowActionWebhookSerializer(allow_null=True, required=False)
class Meta:
model = WorkflowAction
fields = [
"id",
"type",
"assign_title",
"assign_tags",
"assign_correspondent",
"assign_document_type",
"assign_storage_path",
"assign_owner",
"assign_view_users",
"assign_view_groups",
"assign_change_users",
"assign_change_groups",
"assign_custom_fields",
"assign_custom_fields_values",
"remove_all_tags",
"remove_tags",
"remove_all_correspondents",
"remove_correspondents",
"remove_all_document_types",
"remove_document_types",
"remove_all_storage_paths",
"remove_storage_paths",
"remove_custom_fields",
"remove_all_custom_fields",
"remove_all_owners",
"remove_owners",
"remove_all_permissions",
"remove_view_users",
"remove_view_groups",
"remove_change_users",
"remove_change_groups",
"email",
"webhook",
"passwords",
"ai_suggestion_fields",
"ai_create_missing",
"ai_overwrite_existing",
]
def validate(self, attrs):
if "assign_title" in attrs and attrs["assign_title"] is not None:
if len(attrs["assign_title"]) == 0:
# Empty strings treated as None to avoid unexpected behavior
attrs["assign_title"] = None
else:
try:
validate_workflow_template(attrs["assign_title"])
except (ValueError, KeyError) as e:
raise serializers.ValidationError(
{"assign_title": f"{e.args[0]}"},
)
if attrs.get("assign_custom_fields_values"):
# Empty strings treated as None to avoid unexpected behavior
attrs["assign_custom_fields_values"] = {
field_id: (None if value == "" else value)
for field_id, value in attrs["assign_custom_fields_values"].items()
}
if (
"type" in attrs
and attrs["type"] == WorkflowAction.WorkflowActionType.EMAIL
and "email" not in attrs
):
raise serializers.ValidationError(
"Email data is required for email actions",
)
if (
"type" in attrs
and attrs["type"] == WorkflowAction.WorkflowActionType.WEBHOOK
and "webhook" not in attrs
):
raise serializers.ValidationError(
"Webhook data is required for webhook actions",
)
if (
"type" in attrs
and attrs["type"] == WorkflowAction.WorkflowActionType.PASSWORD_REMOVAL
):
passwords = attrs.get("passwords")
# ensure passwords is a non-empty list of non-empty strings
if (
passwords is None
or not isinstance(passwords, list)
or len(passwords) == 0
or any(not isinstance(pw, str) for pw in passwords)
or any(len(pw.strip()) == 0 for pw in passwords)
):
raise serializers.ValidationError(
"Passwords are required for password removal actions",
)
if (
"type" in attrs
and attrs["type"] == WorkflowAction.WorkflowActionType.APPLY_AI_SUGGESTIONS
):
fields = attrs.get("ai_suggestion_fields")
valid_fields = set(WorkflowAction.AISuggestionField.values)
if (
fields is None
or not isinstance(fields, list)
or len(fields) == 0
or any(field not in valid_fields for field in fields)
):
raise serializers.ValidationError(
"At least one valid field is required for apply AI "
f"suggestions actions, options are: {sorted(valid_fields)}",
)
return attrs
class WorkflowSerializer(serializers.ModelSerializer[Workflow]):
order = serializers.IntegerField(required=False)
triggers = WorkflowTriggerSerializer(many=True)
actions = WorkflowActionSerializer(many=True)
class Meta:
model = Workflow
fields = [
"id",
"name",
"order",
"enabled",
"triggers",
"actions",
]
def validate(self, attrs):
attrs = super().validate(attrs)
if "actions" in attrs:
has_remote_ocr_action = any(
action.get("type") == WorkflowAction.WorkflowActionType.REMOTE_OCR
for action in attrs["actions"]
)
has_ai_suggestions_action = any(
action.get("type")
== WorkflowAction.WorkflowActionType.APPLY_AI_SUGGESTIONS
for action in attrs["actions"]
)
else:
has_remote_ocr_action = self.instance is not None and (
self.instance.actions.filter(
type=WorkflowAction.WorkflowActionType.REMOTE_OCR,
).exists()
)
has_ai_suggestions_action = self.instance is not None and (
self.instance.actions.filter(
type=WorkflowAction.WorkflowActionType.APPLY_AI_SUGGESTIONS,
).exists()
)
if "triggers" in attrs:
has_consumption_trigger = any(
trigger.get("type") == WorkflowTrigger.WorkflowTriggerType.CONSUMPTION
for trigger in attrs["triggers"]
)
has_non_consumption_trigger = any(
trigger.get("type") != WorkflowTrigger.WorkflowTriggerType.CONSUMPTION
for trigger in attrs["triggers"]
)
else:
has_consumption_trigger = self.instance is not None and (
self.instance.triggers.filter(
type=WorkflowTrigger.WorkflowTriggerType.CONSUMPTION,
).exists()
)
has_non_consumption_trigger = self.instance is not None and (
self.instance.triggers.exclude(
type=WorkflowTrigger.WorkflowTriggerType.CONSUMPTION,
).exists()
)
# Remote OCR can only work with consumption triggers
if has_remote_ocr_action and not has_consumption_trigger:
raise serializers.ValidationError(
"Remote OCR actions require a consumption started trigger",
)
# Suggestions are made from the document content, which does not exist
# until after consumption has finished
if has_ai_suggestions_action and not has_non_consumption_trigger:
raise serializers.ValidationError(
"Apply AI suggestions actions require a trigger other than "
"consumption started",
)
return attrs
def update_triggers_and_actions(
self,
instance: Workflow,
triggers,
actions,
) -> None:
set_triggers = []
set_actions = []
if triggers is not None and triggers is not serializers.empty:
for trigger in triggers:
filter_has_tags = trigger.pop("filter_has_tags", None)
filter_has_all_tags = trigger.pop("filter_has_all_tags", None)
filter_has_not_tags = trigger.pop("filter_has_not_tags", None)
filter_has_any_correspondents = trigger.pop(
"filter_has_any_correspondents",
None,
)
filter_has_not_correspondents = trigger.pop(
"filter_has_not_correspondents",
None,
)
filter_has_any_document_types = trigger.pop(
"filter_has_any_document_types",
None,
)
filter_has_not_document_types = trigger.pop(
"filter_has_not_document_types",
None,
)
filter_has_any_storage_paths = trigger.pop(
"filter_has_any_storage_paths",
None,
)
filter_has_not_storage_paths = trigger.pop(
"filter_has_not_storage_paths",
None,
)
# Convert sources to strings to handle django-multiselectfield v1.0 changes
WorkflowTriggerSerializer.normalize_workflow_trigger_sources(trigger)
trigger_instance, _ = WorkflowTrigger.objects.update_or_create(
id=trigger.get("id"),
defaults=trigger,
)
if filter_has_tags is not None:
trigger_instance.filter_has_tags.set(filter_has_tags)
if filter_has_all_tags is not None:
trigger_instance.filter_has_all_tags.set(filter_has_all_tags)
if filter_has_not_tags is not None:
trigger_instance.filter_has_not_tags.set(filter_has_not_tags)
if filter_has_any_correspondents is not None:
trigger_instance.filter_has_any_correspondents.set(
filter_has_any_correspondents,
)
if filter_has_not_correspondents is not None:
trigger_instance.filter_has_not_correspondents.set(
filter_has_not_correspondents,
)
if filter_has_any_document_types is not None:
trigger_instance.filter_has_any_document_types.set(
filter_has_any_document_types,
)
if filter_has_not_document_types is not None:
trigger_instance.filter_has_not_document_types.set(
filter_has_not_document_types,
)
if filter_has_any_storage_paths is not None:
trigger_instance.filter_has_any_storage_paths.set(
filter_has_any_storage_paths,
)
if filter_has_not_storage_paths is not None:
trigger_instance.filter_has_not_storage_paths.set(
filter_has_not_storage_paths,
)
set_triggers.append(trigger_instance)
if actions is not None and actions is not serializers.empty:
for index, action in enumerate(actions):
action["order"] = index
assign_tags = action.pop("assign_tags", None)
assign_view_users = action.pop("assign_view_users", None)
assign_view_groups = action.pop("assign_view_groups", None)
assign_change_users = action.pop("assign_change_users", None)
assign_change_groups = action.pop("assign_change_groups", None)
assign_custom_fields = action.pop("assign_custom_fields", None)
remove_tags = action.pop("remove_tags", None)
remove_correspondents = action.pop("remove_correspondents", None)
remove_document_types = action.pop("remove_document_types", None)
remove_storage_paths = action.pop("remove_storage_paths", None)
remove_custom_fields = action.pop("remove_custom_fields", None)
remove_owners = action.pop("remove_owners", None)
remove_view_users = action.pop("remove_view_users", None)
remove_view_groups = action.pop("remove_view_groups", None)
remove_change_users = action.pop("remove_change_users", None)
remove_change_groups = action.pop("remove_change_groups", None)
email_data = action.pop("email", None)
webhook_data = action.pop("webhook", None)
action_instance, _ = WorkflowAction.objects.update_or_create(
id=action.get("id"),
defaults=action,
)
if email_data is not None:
serializer = WorkflowActionEmailSerializer(data=email_data)
serializer.is_valid(raise_exception=True)
email, _ = WorkflowActionEmail.objects.update_or_create(
id=email_data.get("id"),
defaults=serializer.validated_data,
)
action_instance.email = email
action_instance.save()
if webhook_data is not None:
serializer = WorkflowActionWebhookSerializer(data=webhook_data)
serializer.is_valid(raise_exception=True)
webhook, _ = WorkflowActionWebhook.objects.update_or_create(
id=webhook_data.get("id"),
defaults=serializer.validated_data,
)
action_instance.webhook = webhook
action_instance.save()
if assign_tags is not None:
action_instance.assign_tags.set(assign_tags)
if assign_view_users is not None:
action_instance.assign_view_users.set(assign_view_users)
if assign_view_groups is not None:
action_instance.assign_view_groups.set(assign_view_groups)
if assign_change_users is not None:
action_instance.assign_change_users.set(assign_change_users)
if assign_change_groups is not None:
action_instance.assign_change_groups.set(assign_change_groups)
if assign_custom_fields is not None:
action_instance.assign_custom_fields.set(assign_custom_fields)
if remove_tags is not None:
action_instance.remove_tags.set(remove_tags)
if remove_correspondents is not None:
action_instance.remove_correspondents.set(remove_correspondents)
if remove_document_types is not None:
action_instance.remove_document_types.set(remove_document_types)
if remove_storage_paths is not None:
action_instance.remove_storage_paths.set(remove_storage_paths)
if remove_custom_fields is not None:
action_instance.remove_custom_fields.set(remove_custom_fields)
if remove_owners is not None:
action_instance.remove_owners.set(remove_owners)
if remove_view_users is not None:
action_instance.remove_view_users.set(remove_view_users)
if remove_view_groups is not None:
action_instance.remove_view_groups.set(remove_view_groups)
if remove_change_users is not None:
action_instance.remove_change_users.set(remove_change_users)
if remove_change_groups is not None:
action_instance.remove_change_groups.set(remove_change_groups)
set_actions.append(action_instance)
if triggers is not serializers.empty:
instance.triggers.set(set_triggers)
if actions is not serializers.empty:
instance.actions.set(set_actions)
instance.save()
def prune_triggers_and_actions(self) -> None:
"""
ManyToMany fields dont support e.g. on_delete so we need to discard unattached
triggers and actions manually
"""
WorkflowTrigger.objects.annotate(
workflow_count=Count("workflows"),
).filter(workflow_count=0).delete()
WorkflowAction.objects.annotate(
workflow_count=Count("workflows"),
).filter(workflow_count=0).delete()
WorkflowActionEmail.objects.filter(action=None).delete()
WorkflowActionWebhook.objects.filter(action=None).delete()
def create(self, validated_data) -> Workflow:
if "triggers" in validated_data:
triggers = validated_data.pop("triggers")
if "actions" in validated_data:
actions = validated_data.pop("actions")
for action in actions:
action.pop("id", None)
instance = super().create(validated_data)
self.update_triggers_and_actions(instance, triggers, actions)
return instance
def update(self, instance: Workflow, validated_data) -> Workflow:
triggers = validated_data.pop("triggers", serializers.empty)
actions = validated_data.pop("actions", serializers.empty)
instance = super().update(instance, validated_data)
self.update_triggers_and_actions(instance, triggers, actions)
self.prune_triggers_and_actions()
return instance
+51 -51
View File
@@ -203,7 +203,7 @@ class TestBulkEditAPI(DirectoriesMixin, APITestCase):
self.doc1.refresh_from_db() self.doc1.refresh_from_db()
self.assertFalse(self.doc1.tags.filter(pk=self.t1.pk).exists()) self.assertFalse(self.doc1.tags.filter(pk=self.t1.pk).exists())
@mock.patch("documents.serialisers.bulk_edit.bulk_edit.modify_tags") @mock.patch("documents.serialisers.bulk_edit.modify_tags")
def test_api_modify_tags(self, m) -> None: def test_api_modify_tags(self, m) -> None:
self.setup_mock(m, "modify_tags") self.setup_mock(m, "modify_tags")
response = self.client.post( response = self.client.post(
@@ -227,7 +227,7 @@ class TestBulkEditAPI(DirectoriesMixin, APITestCase):
self.assertEqual(kwargs["add_tags"], [self.t1.id]) self.assertEqual(kwargs["add_tags"], [self.t1.id])
self.assertEqual(kwargs["remove_tags"], [self.t2.id]) self.assertEqual(kwargs["remove_tags"], [self.t2.id])
@mock.patch("documents.serialisers.bulk_edit.bulk_edit.modify_tags") @mock.patch("documents.serialisers.bulk_edit.modify_tags")
def test_api_modify_tags_not_provided(self, m) -> None: def test_api_modify_tags_not_provided(self, m) -> None:
""" """
GIVEN: GIVEN:
@@ -255,7 +255,7 @@ class TestBulkEditAPI(DirectoriesMixin, APITestCase):
self.assertEqual(response.status_code, status.HTTP_400_BAD_REQUEST) self.assertEqual(response.status_code, status.HTTP_400_BAD_REQUEST)
m.assert_not_called() m.assert_not_called()
@mock.patch("documents.serialisers.bulk_edit.bulk_edit.modify_custom_fields") @mock.patch("documents.serialisers.bulk_edit.modify_custom_fields")
def test_api_modify_custom_fields(self, m) -> None: def test_api_modify_custom_fields(self, m) -> None:
self.setup_mock(m, "modify_custom_fields") self.setup_mock(m, "modify_custom_fields")
response = self.client.post( response = self.client.post(
@@ -281,7 +281,7 @@ class TestBulkEditAPI(DirectoriesMixin, APITestCase):
self.assertEqual(kwargs["add_custom_fields"], [self.cf1.id]) self.assertEqual(kwargs["add_custom_fields"], [self.cf1.id])
self.assertEqual(kwargs["remove_custom_fields"], [self.cf2.id]) self.assertEqual(kwargs["remove_custom_fields"], [self.cf2.id])
@mock.patch("documents.serialisers.bulk_edit.bulk_edit.modify_custom_fields") @mock.patch("documents.serialisers.bulk_edit.modify_custom_fields")
def test_api_modify_custom_fields_documentlink_forbidden_for_unpermitted_target( def test_api_modify_custom_fields_documentlink_forbidden_for_unpermitted_target(
self, self,
m, m,
@@ -325,7 +325,7 @@ class TestBulkEditAPI(DirectoriesMixin, APITestCase):
self.assertEqual(response.status_code, status.HTTP_403_FORBIDDEN) self.assertEqual(response.status_code, status.HTTP_403_FORBIDDEN)
m.assert_not_called() m.assert_not_called()
@mock.patch("documents.serialisers.bulk_edit.bulk_edit.modify_custom_fields") @mock.patch("documents.serialisers.bulk_edit.modify_custom_fields")
def test_api_modify_custom_fields_with_values(self, m) -> None: def test_api_modify_custom_fields_with_values(self, m) -> None:
self.setup_mock(m, "modify_custom_fields") self.setup_mock(m, "modify_custom_fields")
response = self.client.post( response = self.client.post(
@@ -349,7 +349,7 @@ class TestBulkEditAPI(DirectoriesMixin, APITestCase):
self.assertEqual(kwargs["add_custom_fields"], {self.cf1.id: "foo"}) self.assertEqual(kwargs["add_custom_fields"], {self.cf1.id: "foo"})
self.assertEqual(kwargs["remove_custom_fields"], [self.cf2.id]) self.assertEqual(kwargs["remove_custom_fields"], [self.cf2.id])
@mock.patch("documents.serialisers.bulk_edit.bulk_edit.modify_custom_fields") @mock.patch("documents.serialisers.bulk_edit.modify_custom_fields")
def test_api_modify_custom_fields_rejects_invalid_value(self, m) -> None: def test_api_modify_custom_fields_rejects_invalid_value(self, m) -> None:
self.setup_mock(m, "modify_custom_fields") self.setup_mock(m, "modify_custom_fields")
@@ -373,7 +373,7 @@ class TestBulkEditAPI(DirectoriesMixin, APITestCase):
self.assertIn(str(self.cf1.id), response.data["add_custom_fields"]) self.assertIn(str(self.cf1.id), response.data["add_custom_fields"])
m.assert_not_called() m.assert_not_called()
@mock.patch("documents.serialisers.bulk_edit.bulk_edit.modify_custom_fields") @mock.patch("documents.serialisers.bulk_edit.modify_custom_fields")
def test_api_modify_custom_fields_invalid_params(self, m) -> None: def test_api_modify_custom_fields_invalid_params(self, m) -> None:
""" """
GIVEN: GIVEN:
@@ -493,7 +493,7 @@ class TestBulkEditAPI(DirectoriesMixin, APITestCase):
self.assertEqual(response.status_code, status.HTTP_400_BAD_REQUEST) self.assertEqual(response.status_code, status.HTTP_400_BAD_REQUEST)
m.assert_not_called() m.assert_not_called()
@mock.patch("documents.serialisers.bulk_edit.bulk_edit.delete") @mock.patch("documents.serialisers.bulk_edit.delete")
def test_api_delete(self, m) -> None: def test_api_delete(self, m) -> None:
self.setup_mock(m, "delete") self.setup_mock(m, "delete")
response = self.client.post( response = self.client.post(
@@ -509,7 +509,7 @@ class TestBulkEditAPI(DirectoriesMixin, APITestCase):
self.assertEqual(args[0], [self.doc1.id]) self.assertEqual(args[0], [self.doc1.id])
self.assertEqual(len(kwargs), 0) self.assertEqual(len(kwargs), 0)
@mock.patch("documents.views.bulk_edit.bulk_edit.delete") @mock.patch("documents.views.bulk_edit.delete")
def test_delete_documents_endpoint(self, m) -> None: def test_delete_documents_endpoint(self, m) -> None:
self.setup_mock(m, "delete") self.setup_mock(m, "delete")
response = self.client.post( response = self.client.post(
@@ -523,7 +523,7 @@ class TestBulkEditAPI(DirectoriesMixin, APITestCase):
self.assertEqual(args[0], [self.doc1.id]) self.assertEqual(args[0], [self.doc1.id])
self.assertEqual(len(kwargs), 0) self.assertEqual(len(kwargs), 0)
@mock.patch("documents.views.bulk_edit.bulk_edit.delete") @mock.patch("documents.views.bulk_edit.delete")
def test_delete_documents_endpoint_with_excluded_documents(self, m) -> None: def test_delete_documents_endpoint_with_excluded_documents(self, m) -> None:
self.setup_mock(m, "delete") self.setup_mock(m, "delete")
response = self.client.post( response = self.client.post(
@@ -547,7 +547,7 @@ class TestBulkEditAPI(DirectoriesMixin, APITestCase):
self.assertEqual(args[0], [self.doc1.id]) self.assertEqual(args[0], [self.doc1.id])
self.assertEqual(len(kwargs), 0) self.assertEqual(len(kwargs), 0)
@mock.patch("documents.views.bulk_edit.bulk_edit.reprocess") @mock.patch("documents.views.bulk_edit.reprocess")
def test_reprocess_documents_endpoint(self, m) -> None: def test_reprocess_documents_endpoint(self, m) -> None:
self.setup_mock(m, "reprocess") self.setup_mock(m, "reprocess")
response = self.client.post( response = self.client.post(
@@ -561,7 +561,7 @@ class TestBulkEditAPI(DirectoriesMixin, APITestCase):
self.assertEqual(args[0], [self.doc1.id]) self.assertEqual(args[0], [self.doc1.id])
self.assertEqual(kwargs, {"remote_ocr": False}) self.assertEqual(kwargs, {"remote_ocr": False})
@mock.patch("documents.views.bulk_edit.bulk_edit.reprocess") @mock.patch("documents.views.bulk_edit.reprocess")
def test_reprocess_documents_endpoint_remote_ocr(self, m) -> None: def test_reprocess_documents_endpoint_remote_ocr(self, m) -> None:
""" """
GIVEN: GIVEN:
@@ -583,7 +583,7 @@ class TestBulkEditAPI(DirectoriesMixin, APITestCase):
self.assertEqual(args[0], [self.doc1.id]) self.assertEqual(args[0], [self.doc1.id])
self.assertEqual(kwargs, {"remote_ocr": True}) self.assertEqual(kwargs, {"remote_ocr": True})
@mock.patch("documents.serialisers.bulk_edit.bulk_edit.set_storage_path") @mock.patch("documents.serialisers.bulk_edit.set_storage_path")
def test_api_set_storage_path(self, m) -> None: def test_api_set_storage_path(self, m) -> None:
""" """
GIVEN: GIVEN:
@@ -613,7 +613,7 @@ class TestBulkEditAPI(DirectoriesMixin, APITestCase):
self.assertListEqual(args[0], [self.doc1.id]) self.assertListEqual(args[0], [self.doc1.id])
self.assertEqual(kwargs["storage_path"], self.sp1.id) self.assertEqual(kwargs["storage_path"], self.sp1.id)
@mock.patch("documents.serialisers.bulk_edit.bulk_edit.set_storage_path") @mock.patch("documents.serialisers.bulk_edit.set_storage_path")
def test_api_unset_storage_path(self, m) -> None: def test_api_unset_storage_path(self, m) -> None:
""" """
GIVEN: GIVEN:
@@ -738,7 +738,7 @@ class TestBulkEditAPI(DirectoriesMixin, APITestCase):
response.content, response.content,
) )
@mock.patch("documents.serialisers.bulk_edit.bulk_edit.set_storage_path") @mock.patch("documents.serialisers.bulk_edit.set_storage_path")
def test_api_bulk_edit_with_all_true_resolves_documents_from_filters( def test_api_bulk_edit_with_all_true_resolves_documents_from_filters(
self, self,
m, m,
@@ -764,7 +764,7 @@ class TestBulkEditAPI(DirectoriesMixin, APITestCase):
self.assertEqual(args[0], [self.doc2.id]) self.assertEqual(args[0], [self.doc2.id])
self.assertEqual(kwargs["storage_path"], self.sp1.id) self.assertEqual(kwargs["storage_path"], self.sp1.id)
@mock.patch("documents.serialisers.bulk_edit.bulk_edit.set_storage_path") @mock.patch("documents.serialisers.bulk_edit.set_storage_path")
def test_api_bulk_edit_with_all_true_excludes_documents(self, m) -> None: def test_api_bulk_edit_with_all_true_excludes_documents(self, m) -> None:
self.setup_mock(m, "set_storage_path") self.setup_mock(m, "set_storage_path")
@@ -787,7 +787,7 @@ class TestBulkEditAPI(DirectoriesMixin, APITestCase):
self.assertCountEqual(args[0], [self.doc1.id, self.doc3.id, self.doc5.id]) self.assertCountEqual(args[0], [self.doc1.id, self.doc3.id, self.doc5.id])
self.assertEqual(kwargs["storage_path"], self.sp1.id) self.assertEqual(kwargs["storage_path"], self.sp1.id)
@mock.patch("documents.serialisers.bulk_edit.bulk_edit.set_storage_path") @mock.patch("documents.serialisers.bulk_edit.set_storage_path")
def test_api_bulk_edit_with_all_true_resolves_owned_duplicates(self, m) -> None: def test_api_bulk_edit_with_all_true_resolves_owned_duplicates(self, m) -> None:
self.setup_mock(m, "set_storage_path") self.setup_mock(m, "set_storage_path")
user = UserFactory(username="duplicate-owner") user = UserFactory(username="duplicate-owner")
@@ -824,7 +824,7 @@ class TestBulkEditAPI(DirectoriesMixin, APITestCase):
self.assertEqual(kwargs["storage_path"], self.sp1.id) self.assertEqual(kwargs["storage_path"], self.sp1.id)
@mock.patch("documents.search.get_backend") @mock.patch("documents.search.get_backend")
@mock.patch("documents.serialisers.bulk_edit.bulk_edit.set_storage_path") @mock.patch("documents.serialisers.bulk_edit.set_storage_path")
def test_api_bulk_edit_with_all_true_resolves_documents_from_search_filters( def test_api_bulk_edit_with_all_true_resolves_documents_from_search_filters(
self, self,
m, m,
@@ -1199,7 +1199,7 @@ class TestBulkEditAPI(DirectoriesMixin, APITestCase):
) )
self.assertEqual(response.status_code, status.HTTP_200_OK) self.assertEqual(response.status_code, status.HTTP_200_OK)
@mock.patch("documents.serialisers.bulk_edit.bulk_edit.set_permissions") @mock.patch("documents.serialisers.bulk_edit.set_permissions")
def test_set_permissions(self, m) -> None: def test_set_permissions(self, m) -> None:
self.setup_mock(m, "set_permissions") self.setup_mock(m, "set_permissions")
user1 = User.objects.create(username="user1") user1 = User.objects.create(username="user1")
@@ -1234,7 +1234,7 @@ class TestBulkEditAPI(DirectoriesMixin, APITestCase):
self.assertCountEqual(args[0], [self.doc2.id, self.doc3.id]) self.assertCountEqual(args[0], [self.doc2.id, self.doc3.id])
self.assertEqual(len(kwargs["set_permissions"]["view"]["users"]), 2) self.assertEqual(len(kwargs["set_permissions"]["view"]["users"]), 2)
@mock.patch("documents.serialisers.bulk_edit.bulk_edit.set_permissions") @mock.patch("documents.serialisers.bulk_edit.set_permissions")
def test_set_permissions_requires_set_permissions_parameter(self, m) -> None: def test_set_permissions_requires_set_permissions_parameter(self, m) -> None:
self.setup_mock(m, "set_permissions") self.setup_mock(m, "set_permissions")
@@ -1258,7 +1258,7 @@ class TestBulkEditAPI(DirectoriesMixin, APITestCase):
self.assertIn(b"set_permissions not specified", response.content) self.assertIn(b"set_permissions not specified", response.content)
m.assert_not_called() m.assert_not_called()
@mock.patch("documents.serialisers.bulk_edit.bulk_edit.set_permissions") @mock.patch("documents.serialisers.bulk_edit.set_permissions")
def test_set_permissions_rejects_malformed_set_permissions(self, m) -> None: def test_set_permissions_rejects_malformed_set_permissions(self, m) -> None:
""" """
GIVEN: GIVEN:
@@ -1293,7 +1293,7 @@ class TestBulkEditAPI(DirectoriesMixin, APITestCase):
self.assertIn(expected_message, response.content) self.assertIn(expected_message, response.content)
m.assert_not_called() m.assert_not_called()
@mock.patch("documents.serialisers.bulk_edit.bulk_edit.set_permissions") @mock.patch("documents.serialisers.bulk_edit.set_permissions")
def test_set_permissions_rejects_invalid_owner(self, m) -> None: def test_set_permissions_rejects_invalid_owner(self, m) -> None:
""" """
GIVEN: GIVEN:
@@ -1335,7 +1335,7 @@ class TestBulkEditAPI(DirectoriesMixin, APITestCase):
self.assertIn(b"Specified owner cannot be found", response.content) self.assertIn(b"Specified owner cannot be found", response.content)
m.assert_not_called() m.assert_not_called()
@mock.patch("documents.serialisers.bulk_edit.bulk_edit.set_permissions") @mock.patch("documents.serialisers.bulk_edit.set_permissions")
def test_set_permissions_null_is_a_noop(self, m) -> None: def test_set_permissions_null_is_a_noop(self, m) -> None:
""" """
GIVEN: GIVEN:
@@ -1371,7 +1371,7 @@ class TestBulkEditAPI(DirectoriesMixin, APITestCase):
{"view": {}, "change": {}}, {"view": {}, "change": {}},
) )
@mock.patch("documents.serialisers.bulk_edit.bulk_edit.set_permissions") @mock.patch("documents.serialisers.bulk_edit.set_permissions")
def test_set_permissions_passes_validated_owner_id(self, m) -> None: def test_set_permissions_passes_validated_owner_id(self, m) -> None:
""" """
GIVEN: GIVEN:
@@ -1402,7 +1402,7 @@ class TestBulkEditAPI(DirectoriesMixin, APITestCase):
m.assert_called_once() m.assert_called_once()
self.assertEqual(m.call_args.kwargs["owner"], self.user.id) self.assertEqual(m.call_args.kwargs["owner"], self.user.id)
@mock.patch("documents.serialisers.bulk_edit.bulk_edit.set_permissions") @mock.patch("documents.serialisers.bulk_edit.set_permissions")
def test_set_permissions_merge(self, m) -> None: def test_set_permissions_merge(self, m) -> None:
self.setup_mock(m, "set_permissions") self.setup_mock(m, "set_permissions")
user1 = User.objects.create(username="user1") user1 = User.objects.create(username="user1")
@@ -1454,8 +1454,8 @@ class TestBulkEditAPI(DirectoriesMixin, APITestCase):
_, kwargs = m.call_args _, kwargs = m.call_args
self.assertEqual(kwargs["merge"], True) self.assertEqual(kwargs["merge"], True)
@mock.patch("documents.serialisers.bulk_edit.bulk_edit.set_storage_path") @mock.patch("documents.serialisers.bulk_edit.set_storage_path")
@mock.patch("documents.views.bulk_edit.bulk_edit.merge") @mock.patch("documents.views.bulk_edit.merge")
def test_insufficient_global_perms(self, mock_merge, mock_set_storage) -> None: def test_insufficient_global_perms(self, mock_merge, mock_set_storage) -> None:
""" """
GIVEN: GIVEN:
@@ -1518,7 +1518,7 @@ class TestBulkEditAPI(DirectoriesMixin, APITestCase):
self.assertEqual(response.status_code, status.HTTP_403_FORBIDDEN) self.assertEqual(response.status_code, status.HTTP_403_FORBIDDEN)
mock_merge.assert_not_called() mock_merge.assert_not_called()
@mock.patch("documents.serialisers.bulk_edit.bulk_edit.set_permissions") @mock.patch("documents.serialisers.bulk_edit.set_permissions")
def test_insufficient_permissions_ownership(self, m) -> None: def test_insufficient_permissions_ownership(self, m) -> None:
""" """
GIVEN: GIVEN:
@@ -1572,7 +1572,7 @@ class TestBulkEditAPI(DirectoriesMixin, APITestCase):
self.assertEqual(response.status_code, status.HTTP_200_OK) self.assertEqual(response.status_code, status.HTTP_200_OK)
m.assert_called_once() m.assert_called_once()
@mock.patch("documents.serialisers.bulk_edit.bulk_edit.set_storage_path") @mock.patch("documents.serialisers.bulk_edit.set_storage_path")
def test_insufficient_permissions_edit(self, m) -> None: def test_insufficient_permissions_edit(self, m) -> None:
""" """
GIVEN: GIVEN:
@@ -1626,7 +1626,7 @@ class TestBulkEditAPI(DirectoriesMixin, APITestCase):
m.assert_called_once() m.assert_called_once()
@mock.patch("documents.views.bulk_edit.bulk_edit.rotate") @mock.patch("documents.views.bulk_edit.rotate")
def test_rotate(self, m) -> None: def test_rotate(self, m) -> None:
self.setup_mock(m, "rotate") self.setup_mock(m, "rotate")
response = self.client.post( response = self.client.post(
@@ -1648,7 +1648,7 @@ class TestBulkEditAPI(DirectoriesMixin, APITestCase):
self.assertEqual(kwargs["source_mode"], "latest_version") self.assertEqual(kwargs["source_mode"], "latest_version")
self.assertEqual(kwargs["user"], self.user) self.assertEqual(kwargs["user"], self.user)
@mock.patch("documents.views.bulk_edit.bulk_edit.rotate") @mock.patch("documents.views.bulk_edit.rotate")
def test_rotate_invalid_params(self, m) -> None: def test_rotate_invalid_params(self, m) -> None:
response = self.client.post( response = self.client.post(
"/api/documents/rotate/", "/api/documents/rotate/",
@@ -1688,7 +1688,7 @@ class TestBulkEditAPI(DirectoriesMixin, APITestCase):
self.assertIn(b"degrees must be a multiple of 90", response.content) self.assertIn(b"degrees must be a multiple of 90", response.content)
m.assert_not_called() m.assert_not_called()
@mock.patch("documents.serialisers.bulk_edit.bulk_edit.rotate") @mock.patch("documents.serialisers.bulk_edit.rotate")
def test_bulk_edit_rotate_rejects_invalid_degrees(self, m) -> None: def test_bulk_edit_rotate_rejects_invalid_degrees(self, m) -> None:
""" """
GIVEN: GIVEN:
@@ -1725,7 +1725,7 @@ class TestBulkEditAPI(DirectoriesMixin, APITestCase):
self.assertIn(expected_message, response.content) self.assertIn(expected_message, response.content)
m.assert_not_called() m.assert_not_called()
@mock.patch("documents.serialisers.bulk_edit.bulk_edit.rotate") @mock.patch("documents.serialisers.bulk_edit.rotate")
def test_bulk_edit_rotate_passes_integer_degrees(self, m) -> None: def test_bulk_edit_rotate_passes_integer_degrees(self, m) -> None:
""" """
GIVEN: GIVEN:
@@ -1753,7 +1753,7 @@ class TestBulkEditAPI(DirectoriesMixin, APITestCase):
m.assert_called_once() m.assert_called_once()
self.assertEqual(m.call_args.kwargs["degrees"], -90) self.assertEqual(m.call_args.kwargs["degrees"], -90)
@mock.patch("documents.serialisers.bulk_edit.bulk_edit.split") @mock.patch("documents.serialisers.bulk_edit.split")
def test_bulk_edit_split_rejects_invalid_pages(self, m) -> None: def test_bulk_edit_split_rejects_invalid_pages(self, m) -> None:
""" """
GIVEN: GIVEN:
@@ -1785,7 +1785,7 @@ class TestBulkEditAPI(DirectoriesMixin, APITestCase):
self.assertIn(b"invalid pages specified", response.content) self.assertIn(b"invalid pages specified", response.content)
m.assert_not_called() m.assert_not_called()
@mock.patch("documents.serialisers.bulk_edit.bulk_edit.split") @mock.patch("documents.serialisers.bulk_edit.split")
def test_bulk_edit_split_rejects_unknown_page_count(self, m) -> None: def test_bulk_edit_split_rejects_unknown_page_count(self, m) -> None:
""" """
GIVEN: GIVEN:
@@ -1815,7 +1815,7 @@ class TestBulkEditAPI(DirectoriesMixin, APITestCase):
self.assertIn(b"document page count is unknown", response.content) self.assertIn(b"document page count is unknown", response.content)
m.assert_not_called() m.assert_not_called()
@mock.patch("documents.serialisers.bulk_edit.bulk_edit.split") @mock.patch("documents.serialisers.bulk_edit.split")
def test_bulk_edit_split_parses_pages(self, m) -> None: def test_bulk_edit_split_parses_pages(self, m) -> None:
""" """
GIVEN: GIVEN:
@@ -1843,7 +1843,7 @@ class TestBulkEditAPI(DirectoriesMixin, APITestCase):
m.assert_called_once() m.assert_called_once()
self.assertEqual(m.call_args.kwargs["pages"], [[1], [2, 3, 4], [5]]) self.assertEqual(m.call_args.kwargs["pages"], [[1], [2, 3, 4], [5]])
@mock.patch("documents.views.bulk_edit.bulk_edit.rotate") @mock.patch("documents.views.bulk_edit.rotate")
def test_rotate_insufficient_permissions(self, m) -> None: def test_rotate_insufficient_permissions(self, m) -> None:
self.doc1.owner = User.objects.get(username="temp_admin") self.doc1.owner = User.objects.get(username="temp_admin")
self.doc1.save() self.doc1.save()
@@ -1882,7 +1882,7 @@ class TestBulkEditAPI(DirectoriesMixin, APITestCase):
self.assertEqual(response.status_code, status.HTTP_200_OK) self.assertEqual(response.status_code, status.HTTP_200_OK)
m.assert_called_once() m.assert_called_once()
@mock.patch("documents.views.bulk_edit.bulk_edit.merge") @mock.patch("documents.views.bulk_edit.merge")
def test_merge(self, m) -> None: def test_merge(self, m) -> None:
self.setup_mock(m, "merge") self.setup_mock(m, "merge")
response = self.client.post( response = self.client.post(
@@ -1904,7 +1904,7 @@ class TestBulkEditAPI(DirectoriesMixin, APITestCase):
self.assertEqual(kwargs["source_mode"], "latest_version") self.assertEqual(kwargs["source_mode"], "latest_version")
self.assertEqual(kwargs["user"], self.user) self.assertEqual(kwargs["user"], self.user)
@mock.patch("documents.views.bulk_edit.bulk_edit.merge") @mock.patch("documents.views.bulk_edit.merge")
def test_merge_and_delete_insufficient_permissions(self, m) -> None: def test_merge_and_delete_insufficient_permissions(self, m) -> None:
self.doc1.owner = User.objects.get(username="temp_admin") self.doc1.owner = User.objects.get(username="temp_admin")
self.doc1.save() self.doc1.save()
@@ -1945,7 +1945,7 @@ class TestBulkEditAPI(DirectoriesMixin, APITestCase):
self.assertEqual(response.status_code, status.HTTP_200_OK) self.assertEqual(response.status_code, status.HTTP_200_OK)
m.assert_called_once() m.assert_called_once()
@mock.patch("documents.views.bulk_edit.bulk_edit.merge") @mock.patch("documents.views.bulk_edit.merge")
def test_merge_and_delete_requires_change_permission(self, m) -> None: def test_merge_and_delete_requires_change_permission(self, m) -> None:
self.setup_mock(m, "merge") self.setup_mock(m, "merge")
user = UserFactory(username="no-change") user = UserFactory(username="no-change")
@@ -1966,7 +1966,7 @@ class TestBulkEditAPI(DirectoriesMixin, APITestCase):
self.assertEqual(response.status_code, status.HTTP_403_FORBIDDEN) self.assertEqual(response.status_code, status.HTTP_403_FORBIDDEN)
m.assert_not_called() m.assert_not_called()
@mock.patch("documents.views.bulk_edit.bulk_edit.merge") @mock.patch("documents.views.bulk_edit.merge")
def test_merge_invalid_parameters(self, m) -> None: def test_merge_invalid_parameters(self, m) -> None:
self.setup_mock(m, "merge") self.setup_mock(m, "merge")
response = self.client.post( response = self.client.post(
@@ -1999,7 +1999,7 @@ class TestBulkEditAPI(DirectoriesMixin, APITestCase):
for method, parameters in method_payloads.items(): for method, parameters in method_payloads.items():
with self.subTest(method=method, version=version): with self.subTest(method=method, version=version):
with mock.patch( with mock.patch(
f"documents.views.bulk_edit.bulk_edit.{method}", f"documents.views.bulk_edit.{method}",
) as mocked_method: ) as mocked_method:
self.setup_mock(mocked_method, method) self.setup_mock(mocked_method, method)
with self.assertLogs("paperless.api", level="WARNING") as logs: with self.assertLogs("paperless.api", level="WARNING") as logs:
@@ -2088,7 +2088,7 @@ class TestBulkEditAPI(DirectoriesMixin, APITestCase):
{"operations": ["This list may not be empty."]}, {"operations": ["This list may not be empty."]},
) )
@mock.patch("documents.views.bulk_edit.bulk_edit.edit_pdf") @mock.patch("documents.views.bulk_edit.edit_pdf")
def test_edit_pdf(self, m) -> None: def test_edit_pdf(self, m) -> None:
self.setup_mock(m, "edit_pdf") self.setup_mock(m, "edit_pdf")
response = self.client.post( response = self.client.post(
@@ -2248,7 +2248,7 @@ class TestBulkEditAPI(DirectoriesMixin, APITestCase):
self.assertEqual(response.status_code, status.HTTP_400_BAD_REQUEST) self.assertEqual(response.status_code, status.HTTP_400_BAD_REQUEST)
self.assertIn(b"Invalid source_mode", response.content) self.assertIn(b"Invalid source_mode", response.content)
@mock.patch("documents.views.bulk_edit.bulk_edit.edit_pdf") @mock.patch("documents.views.bulk_edit.edit_pdf")
def test_edit_pdf_rejects_invalid_operation_values(self, m) -> None: def test_edit_pdf_rejects_invalid_operation_values(self, m) -> None:
""" """
GIVEN: GIVEN:
@@ -2314,7 +2314,7 @@ class TestBulkEditAPI(DirectoriesMixin, APITestCase):
{"operations": {"0": {"rotate": ["rotate must be a multiple of 90"]}}}, {"operations": {"0": {"rotate": ["rotate must be a multiple of 90"]}}},
) )
@mock.patch("documents.views.bulk_edit.bulk_edit.edit_pdf") @mock.patch("documents.views.bulk_edit.edit_pdf")
def test_edit_pdf_page_out_of_bounds(self, m) -> None: def test_edit_pdf_page_out_of_bounds(self, m) -> None:
self.setup_mock(m, "edit_pdf") self.setup_mock(m, "edit_pdf")
response = self.client.post( response = self.client.post(
@@ -2331,7 +2331,7 @@ class TestBulkEditAPI(DirectoriesMixin, APITestCase):
self.assertIn(b"out of bounds", response.content) self.assertIn(b"out of bounds", response.content)
m.assert_not_called() m.assert_not_called()
@mock.patch("documents.views.bulk_edit.bulk_edit.edit_pdf") @mock.patch("documents.views.bulk_edit.edit_pdf")
def test_edit_pdf_insufficient_permissions(self, m) -> None: def test_edit_pdf_insufficient_permissions(self, m) -> None:
self.doc1.owner = User.objects.get(username="temp_admin") self.doc1.owner = User.objects.get(username="temp_admin")
self.doc1.save() self.doc1.save()
@@ -2368,7 +2368,7 @@ class TestBulkEditAPI(DirectoriesMixin, APITestCase):
self.assertEqual(response.status_code, status.HTTP_200_OK) self.assertEqual(response.status_code, status.HTTP_200_OK)
m.assert_called_once() m.assert_called_once()
@mock.patch("documents.views.bulk_edit.bulk_edit.edit_pdf") @mock.patch("documents.views.bulk_edit.edit_pdf")
def test_edit_pdf_update_requires_change_permission(self, m) -> None: def test_edit_pdf_update_requires_change_permission(self, m) -> None:
self.setup_mock(m, "edit_pdf") self.setup_mock(m, "edit_pdf")
user = UserFactory(username="no-change") user = UserFactory(username="no-change")
@@ -2389,8 +2389,8 @@ class TestBulkEditAPI(DirectoriesMixin, APITestCase):
self.assertEqual(response.status_code, status.HTTP_403_FORBIDDEN) self.assertEqual(response.status_code, status.HTTP_403_FORBIDDEN)
m.assert_not_called() m.assert_not_called()
@mock.patch("documents.views.bulk_edit.bulk_edit.remove_password") @mock.patch("documents.views.bulk_edit.remove_password")
@mock.patch("documents.views.bulk_edit.bulk_edit.edit_pdf") @mock.patch("documents.views.bulk_edit.edit_pdf")
def test_delete_original_requires_delete_permission( def test_delete_original_requires_delete_permission(
self, self,
edit_pdf_mock, edit_pdf_mock,
@@ -2433,7 +2433,7 @@ class TestBulkEditAPI(DirectoriesMixin, APITestCase):
self.assertEqual(response.status_code, status.HTTP_403_FORBIDDEN) self.assertEqual(response.status_code, status.HTTP_403_FORBIDDEN)
operation_mock.assert_not_called() operation_mock.assert_not_called()
@mock.patch("documents.views.bulk_edit.bulk_edit.remove_password") @mock.patch("documents.views.bulk_edit.remove_password")
def test_remove_password(self, m) -> None: def test_remove_password(self, m) -> None:
self.setup_mock(m, "remove_password") self.setup_mock(m, "remove_password")
response = self.client.post( response = self.client.post(
@@ -2481,7 +2481,7 @@ class TestBulkEditAPI(DirectoriesMixin, APITestCase):
) )
self.assertEqual(response.status_code, status.HTTP_400_BAD_REQUEST) self.assertEqual(response.status_code, status.HTTP_400_BAD_REQUEST)
@mock.patch("documents.views.bulk_edit.bulk_edit.remove_password") @mock.patch("documents.views.bulk_edit.remove_password")
def test_remove_password_insufficient_permissions(self, m) -> None: def test_remove_password_insufficient_permissions(self, m) -> None:
self.doc1.owner = User.objects.get(username="temp_admin") self.doc1.owner = User.objects.get(username="temp_admin")
self.doc1.save() self.doc1.save()
+6 -8
View File
@@ -30,7 +30,7 @@ class TestChatStreamingViewInputValidation(APITestCase):
def test_oversized_question_is_rejected(self) -> None: def test_oversized_question_is_rejected(self) -> None:
with mock.patch( with mock.patch(
"documents.views.chat.AIConfig", "documents.views.AIConfig",
return_value=self._mock_ai_enabled(), return_value=self._mock_ai_enabled(),
): ):
resp = self.client.post( resp = self.client.post(
@@ -57,11 +57,11 @@ class TestChatStreamingViewInputValidation(APITestCase):
chunks = [f"token{i} " for i in range(40)] chunks = [f"token{i} " for i in range(40)]
with ( with (
mock.patch( mock.patch(
"documents.views.chat.AIConfig", "documents.views.AIConfig",
return_value=self._mock_ai_enabled(), return_value=self._mock_ai_enabled(),
), ),
mock.patch( mock.patch(
"documents.views.chat.stream_chat_with_documents", "documents.views.stream_chat_with_documents",
return_value=iter(chunks), return_value=iter(chunks),
), ),
): ):
@@ -78,7 +78,7 @@ class TestChatStreamingViewInputValidation(APITestCase):
def test_missing_question_is_rejected(self) -> None: def test_missing_question_is_rejected(self) -> None:
with mock.patch( with mock.patch(
"documents.views.chat.AIConfig", "documents.views.AIConfig",
return_value=self._mock_ai_enabled(), return_value=self._mock_ai_enabled(),
): ):
resp = self.client.post( resp = self.client.post(
@@ -102,11 +102,9 @@ class TestChatStreamingViewUnrestrictedFlag:
never touches the real vector store; returns the patched callable so never touches the real vector store; returns the patched callable so
tests can inspect how it was called. tests can inspect how it was called.
""" """
mocker.patch( mocker.patch("documents.views.AIConfig").return_value.ai_enabled = True
"documents.views.chat.AIConfig",
).return_value.ai_enabled = True
return mocker.patch( return mocker.patch(
"documents.views.chat.stream_chat_with_documents", "documents.views.stream_chat_with_documents",
return_value=iter(()), return_value=iter(()),
) )
@@ -17,7 +17,7 @@ from documents.filters import EffectiveContentFilter
from documents.filters import TitleContentFilter from documents.filters import TitleContentFilter
from documents.models import Document from documents.models import Document
from documents.versioning import annotate_effective_content from documents.versioning import annotate_effective_content
from documents.views.base import DocumentSelectionMixin from documents.views import DocumentSelectionMixin
from paperless_testing.dirs import DirectoriesMixin from paperless_testing.dirs import DirectoriesMixin
from paperless_testing.factories import UserFactory from paperless_testing.factories import UserFactory
from paperless_testing.http import read_streaming_response from paperless_testing.http import read_streaming_response
@@ -515,9 +515,7 @@ class TestDocumentVersioningApi(DirectoriesMixin, APITestCase):
root_document=root, root_document=root,
) )
with mock.patch( with mock.patch("documents.views.DocumentViewSet.get_metadata") as metadata:
"documents.views.documents.DocumentViewSet.get_metadata",
) as metadata:
metadata.return_value = [] metadata.return_value = []
resp = self.client.get( resp = self.client.get(
f"/api/documents/{root.id}/metadata/?version={version.id}", f"/api/documents/{root.id}/metadata/?version={version.id}",
@@ -575,7 +573,7 @@ class TestDocumentVersioningApi(DirectoriesMixin, APITestCase):
async_task = mock.Mock() async_task = mock.Mock()
async_task.id = "task-123" async_task.id = "task-123"
with mock.patch("documents.views.documents.consume_file") as consume_mock: with mock.patch("documents.views.consume_file") as consume_mock:
consume_mock.apply_async.return_value = async_task consume_mock.apply_async.return_value = async_task
resp = self.client.post( resp = self.client.post(
f"/api/documents/{root.id}/update_version/", f"/api/documents/{root.id}/update_version/",
@@ -611,7 +609,7 @@ class TestDocumentVersioningApi(DirectoriesMixin, APITestCase):
async_task = mock.Mock() async_task = mock.Mock()
async_task.id = "task-123" async_task.id = "task-123"
with mock.patch("documents.views.documents.consume_file") as consume_mock: with mock.patch("documents.views.consume_file") as consume_mock:
consume_mock.apply_async.return_value = async_task consume_mock.apply_async.return_value = async_task
resp = self.client.post( resp = self.client.post(
f"/api/documents/{version.id}/update_version/", f"/api/documents/{version.id}/update_version/",
@@ -636,7 +634,7 @@ class TestDocumentVersioningApi(DirectoriesMixin, APITestCase):
) )
upload = self._make_pdf_upload() upload = self._make_pdf_upload()
with mock.patch("documents.views.documents.consume_file") as consume_mock: with mock.patch("documents.views.consume_file") as consume_mock:
consume_mock.apply_async.side_effect = Exception("boom") consume_mock.apply_async.side_effect = Exception("boom")
resp = self.client.post( resp = self.client.post(
f"/api/documents/{root.id}/update_version/", f"/api/documents/{root.id}/update_version/",
@@ -675,7 +673,7 @@ class TestDocumentVersioningApi(DirectoriesMixin, APITestCase):
) )
self.client.force_authenticate(user=user) self.client.force_authenticate(user=user)
with mock.patch("documents.views.documents.consume_file") as consume_mock: with mock.patch("documents.views.consume_file") as consume_mock:
resp = self.client.post( resp = self.client.post(
f"/api/documents/{root.id}/update_version/", f"/api/documents/{root.id}/update_version/",
{"document": self._make_pdf_upload()}, {"document": self._make_pdf_upload()},
+11 -11
View File
@@ -2605,7 +2605,7 @@ class TestDocumentApi(DirectoriesMixin, ConsumeTaskMixin, APITestCase):
response = self.client.get("/api/documents/34676/suggestions/") response = self.client.get("/api/documents/34676/suggestions/")
self.assertEqual(response.status_code, status.HTTP_404_NOT_FOUND) self.assertEqual(response.status_code, status.HTTP_404_NOT_FOUND)
@mock.patch("documents.views.documents.get_ai_document_classification") @mock.patch("documents.views.get_ai_document_classification")
@override_settings(AI_ENABLED=True) @override_settings(AI_ENABLED=True)
def test_suggestions_still_uses_classifier_when_ai_enabled( def test_suggestions_still_uses_classifier_when_ai_enabled(
self, self,
@@ -2628,10 +2628,10 @@ class TestDocumentApi(DirectoriesMixin, ConsumeTaskMixin, APITestCase):
) )
mock_get_ai_classification.assert_not_called() mock_get_ai_classification.assert_not_called()
@mock.patch("documents.views.documents.match_storage_paths") @mock.patch("documents.views.match_storage_paths")
@mock.patch("documents.views.documents.match_document_types") @mock.patch("documents.views.match_document_types")
@mock.patch("documents.views.documents.match_tags") @mock.patch("documents.views.match_tags")
@mock.patch("documents.views.documents.match_correspondents") @mock.patch("documents.views.match_correspondents")
@override_settings(NUMBER_OF_SUGGESTED_DATES=10) @override_settings(NUMBER_OF_SUGGESTED_DATES=10)
def test_get_suggestions( def test_get_suggestions(
self, self,
@@ -2663,11 +2663,11 @@ class TestDocumentApi(DirectoriesMixin, ConsumeTaskMixin, APITestCase):
}, },
) )
@mock.patch("documents.views.documents.load_classifier") @mock.patch("documents.views.load_classifier")
@mock.patch("documents.views.documents.match_storage_paths") @mock.patch("documents.views.match_storage_paths")
@mock.patch("documents.views.documents.match_document_types") @mock.patch("documents.views.match_document_types")
@mock.patch("documents.views.documents.match_tags") @mock.patch("documents.views.match_tags")
@mock.patch("documents.views.documents.match_correspondents") @mock.patch("documents.views.match_correspondents")
@override_settings(NUMBER_OF_SUGGESTED_DATES=10) @override_settings(NUMBER_OF_SUGGESTED_DATES=10)
def test_get_suggestions_cached( def test_get_suggestions_cached(
self, self,
@@ -2754,7 +2754,7 @@ class TestDocumentApi(DirectoriesMixin, ConsumeTaskMixin, APITestCase):
response = self.client.get(f"/api/documents/{doc.pk}/suggestions/") response = self.client.get(f"/api/documents/{doc.pk}/suggestions/")
self.assertEqual(response.status_code, status.HTTP_200_OK) self.assertEqual(response.status_code, status.HTTP_200_OK)
@mock.patch("documents.views.documents.get_date_parser") @mock.patch("documents.views.get_date_parser")
@override_settings(NUMBER_OF_SUGGESTED_DATES=0) @override_settings(NUMBER_OF_SUGGESTED_DATES=0)
def test_get_suggestions_dates_disabled( def test_get_suggestions_dates_disabled(
self, self,
@@ -11,7 +11,7 @@ from documents.models import CustomFieldInstance
from documents.models import Document from documents.models import Document
from documents.models import SavedView from documents.models import SavedView
from documents.models import SavedViewFilterRule from documents.models import SavedViewFilterRule
from documents.serialisers.documents import DocumentSerializer from documents.serialisers import DocumentSerializer
from paperless_testing.dirs import DirectoriesMixin from paperless_testing.dirs import DirectoriesMixin
from paperless_testing.factories import UserFactory from paperless_testing.factories import UserFactory
@@ -22,7 +22,7 @@ import pytest
from rest_framework import status from rest_framework import status
import documents.search._backend import documents.search._backend
from documents.views.base import _MAX_QUERY_LENGTH from documents.views import _MAX_QUERY_LENGTH
if TYPE_CHECKING: if TYPE_CHECKING:
from rest_framework.test import APIClient from rest_framework.test import APIClient
+1 -1
View File
@@ -259,7 +259,7 @@ class TestSystemStatus(APITestCase):
"Celery worker responded unexpectedly.", "Celery worker responded unexpectedly.",
) )
@mock.patch("documents.views.system.sleep") @mock.patch("documents.views.sleep")
@mock.patch("celery.app.control.Inspect.ping") @mock.patch("celery.app.control.Inspect.ping")
def test_system_status_celery_ping_retry_success( def test_system_status_celery_ping_retry_success(
self, self,
+2 -2
View File
@@ -918,7 +918,7 @@ class TestRun:
mock_apply_async = mock.Mock(return_value=mock_async_result) mock_apply_async = mock.Mock(return_value=mock_async_result)
with mock.patch( with mock.patch(
"documents.views.tasks.train_classifier.apply_async", "documents.views.train_classifier.apply_async",
mock_apply_async, mock_apply_async,
): ):
response = admin_client.post( response = admin_client.post(
@@ -973,7 +973,7 @@ class TestRun:
mock_apply_async = mock.Mock(return_value=mock_async_result) mock_apply_async = mock.Mock(return_value=mock_async_result)
with mock.patch( with mock.patch(
"documents.views.tasks.sanity_check.apply_async", "documents.views.sanity_check.apply_async",
mock_apply_async, mock_apply_async,
): ):
response = admin_client.post( response = admin_client.post(
@@ -12,7 +12,7 @@ from documents.models import Document
from documents.versioning import LATEST_VERSION_CONTENT_PREFETCH_ATTR from documents.versioning import LATEST_VERSION_CONTENT_PREFETCH_ATTR
from documents.versioning import has_prefetched_effective_content from documents.versioning import has_prefetched_effective_content
from documents.versioning import latest_version_content_prefetch from documents.versioning import latest_version_content_prefetch
from documents.views.documents import DocumentViewSet from documents.views import DocumentViewSet
from paperless_testing.factories import DocumentFactory from paperless_testing.factories import DocumentFactory
if TYPE_CHECKING: if TYPE_CHECKING:
+1 -1
View File
@@ -27,7 +27,7 @@ from documents.models import CustomFieldInstance
from documents.models import Document from documents.models import Document
from documents.models import DocumentType from documents.models import DocumentType
from documents.models import StoragePath from documents.models import StoragePath
from documents.serialisers.documents import DocumentSerializer from documents.serialisers import DocumentSerializer
from documents.tasks import empty_trash from documents.tasks import empty_trash
from paperless_testing.assertions import FileSystemAssertsMixin from paperless_testing.assertions import FileSystemAssertsMixin
from paperless_testing.dirs import DirectoriesMixin from paperless_testing.dirs import DirectoriesMixin
@@ -9,7 +9,7 @@ from rest_framework.test import APITestCase
from documents.bulk_edit import merge_as_versions from documents.bulk_edit import merge_as_versions
from documents.models import Document from documents.models import Document
from documents.serialisers.bulk_edit import MergeDocumentsAsVersionsSerializer from documents.serialisers import MergeDocumentsAsVersionsSerializer
from paperless_testing.factories import UserFactory from paperless_testing.factories import UserFactory
from paperless_testing.permissions import grant_global from paperless_testing.permissions import grant_global
@@ -349,7 +349,7 @@ class TestMergeDocumentsAsVersionsAPI(APITestCase):
) )
self.client.force_authenticate(user=self.user) self.client.force_authenticate(user=self.user)
@mock.patch("documents.views.bulk_edit.bulk_edit.merge_as_versions") @mock.patch("documents.views.bulk_edit.merge_as_versions")
def test_merges_documents_as_versions(self, merge_mock) -> None: def test_merges_documents_as_versions(self, merge_mock) -> None:
merge_mock.return_value = "OK" merge_mock.return_value = "OK"
merge_mock.__name__ = "merge_as_versions" merge_mock.__name__ = "merge_as_versions"
@@ -375,7 +375,7 @@ class TestMergeDocumentsAsVersionsAPI(APITestCase):
user=self.user, user=self.user,
) )
@mock.patch("documents.views.bulk_edit.bulk_edit.merge_as_versions") @mock.patch("documents.views.bulk_edit.merge_as_versions")
def test_requires_change_permission(self, merge_mock) -> None: def test_requires_change_permission(self, merge_mock) -> None:
merge_mock.__name__ = "merge_as_versions" merge_mock.__name__ = "merge_as_versions"
user = UserFactory(username="no-change") user = UserFactory(username="no-change")
@@ -397,7 +397,7 @@ class TestMergeDocumentsAsVersionsAPI(APITestCase):
self.assertEqual(response.status_code, status.HTTP_403_FORBIDDEN) self.assertEqual(response.status_code, status.HTTP_403_FORBIDDEN)
merge_mock.assert_not_called() merge_mock.assert_not_called()
@mock.patch("documents.views.bulk_edit.bulk_edit.merge_as_versions") @mock.patch("documents.views.bulk_edit.merge_as_versions")
def test_requires_delete_permission(self, merge_mock) -> None: def test_requires_delete_permission(self, merge_mock) -> None:
merge_mock.__name__ = "merge_as_versions" merge_mock.__name__ = "merge_as_versions"
# Owns them and may change them, but may not make them stop being documents # Owns them and may change them, but may not make them stop being documents
@@ -420,7 +420,7 @@ class TestMergeDocumentsAsVersionsAPI(APITestCase):
self.assertEqual(response.status_code, status.HTTP_403_FORBIDDEN) self.assertEqual(response.status_code, status.HTTP_403_FORBIDDEN)
merge_mock.assert_not_called() merge_mock.assert_not_called()
@mock.patch("documents.views.bulk_edit.bulk_edit.merge_as_versions") @mock.patch("documents.views.bulk_edit.merge_as_versions")
def test_rejects_unselected_root(self, merge_mock) -> None: def test_rejects_unselected_root(self, merge_mock) -> None:
doc3 = Document.objects.create( doc3 = Document.objects.create(
checksum="C", checksum="C",
@@ -440,7 +440,7 @@ class TestMergeDocumentsAsVersionsAPI(APITestCase):
self.assertEqual(response.status_code, status.HTTP_400_BAD_REQUEST) self.assertEqual(response.status_code, status.HTTP_400_BAD_REQUEST)
merge_mock.assert_not_called() merge_mock.assert_not_called()
@mock.patch("documents.views.bulk_edit.bulk_edit.merge_as_versions") @mock.patch("documents.views.bulk_edit.merge_as_versions")
def test_rejects_source_document_with_versions(self, merge_mock) -> None: def test_rejects_source_document_with_versions(self, merge_mock) -> None:
Document.objects.create( Document.objects.create(
checksum="C", checksum="C",
@@ -21,7 +21,7 @@ from documents.models import Tag
from documents.permissions import permitted_document_ids from documents.permissions import permitted_document_ids
from documents.permissions import permitted_object_ids from documents.permissions import permitted_object_ids
from documents.permissions import restrict_queryset_to_visible from documents.permissions import restrict_queryset_to_visible
from documents.serialisers.documents import _get_viewable_duplicates from documents.serialisers import _get_viewable_duplicates
from paperless_testing.factories import CorrespondentFactory from paperless_testing.factories import CorrespondentFactory
from paperless_testing.factories import DocumentFactory from paperless_testing.factories import DocumentFactory
from paperless_testing.factories import DocumentTypeFactory from paperless_testing.factories import DocumentTypeFactory
@@ -191,7 +191,7 @@ class TestAiChatAllDocumentsPermissionBoundary:
ENDPOINT = "/api/documents/chat/" ENDPOINT = "/api/documents/chat/"
@override_settings(AI_ENABLED=True) @override_settings(AI_ENABLED=True)
@patch("documents.views.chat.stream_chat_with_documents") @patch("documents.views.stream_chat_with_documents")
def test_chat_all_documents_excludes_unshared_document(self, mock_stream_chat): def test_chat_all_documents_excludes_unshared_document(self, mock_stream_chat):
mock_stream_chat.return_value = iter([b"data"]) mock_stream_chat.return_value = iter([b"data"])
@@ -461,8 +461,8 @@ class TestDocumentOperationPermissionChecksRootDocument:
) )
with ( with (
patch("documents.views.bulk_edit.bulk_edit.merge") as mock_merge, patch("documents.views.bulk_edit.merge") as mock_merge,
patch("documents.views.bulk_edit.bulk_edit.rotate") as mock_rotate, patch("documents.views.bulk_edit.rotate") as mock_rotate,
): ):
mock_merge.__name__ = "merge" mock_merge.__name__ = "merge"
mock_rotate.__name__ = "rotate" mock_rotate.__name__ = "rotate"
@@ -15,7 +15,7 @@ from rest_framework.test import APITestCase
from documents.filters import ShareLinkBundleFilterSet from documents.filters import ShareLinkBundleFilterSet
from documents.models import ShareLink from documents.models import ShareLink
from documents.models import ShareLinkBundle from documents.models import ShareLinkBundle
from documents.serialisers.sharing import ShareLinkBundleSerializer from documents.serialisers import ShareLinkBundleSerializer
from documents.tasks import build_share_link_bundle from documents.tasks import build_share_link_bundle
from documents.tasks import cleanup_expired_share_link_bundles from documents.tasks import cleanup_expired_share_link_bundles
from paperless_testing.dirs import DirectoriesMixin from paperless_testing.dirs import DirectoriesMixin
@@ -34,7 +34,7 @@ class ShareLinkBundleAPITests(DirectoriesMixin, APITestCase):
self.client.force_authenticate(self.user) self.client.force_authenticate(self.user)
self.document = DocumentFactory.create() self.document = DocumentFactory.create()
@mock.patch("documents.views.sharing.build_share_link_bundle.apply_async") @mock.patch("documents.views.build_share_link_bundle.apply_async")
def test_create_bundle_triggers_build_job(self, delay_mock) -> None: def test_create_bundle_triggers_build_job(self, delay_mock) -> None:
payload = { payload = {
"document_ids": [self.document.pk], "document_ids": [self.document.pk],
@@ -51,7 +51,7 @@ class ShareLinkBundleAPITests(DirectoriesMixin, APITestCase):
delay_mock.assert_called_once() delay_mock.assert_called_once()
self.assertEqual(delay_mock.call_args.kwargs["kwargs"]["bundle_id"], bundle.pk) self.assertEqual(delay_mock.call_args.kwargs["kwargs"]["bundle_id"], bundle.pk)
@mock.patch("documents.views.sharing.build_share_link_bundle.apply_async") @mock.patch("documents.views.build_share_link_bundle.apply_async")
def test_create_bundle_requires_global_document_view_permission( def test_create_bundle_requires_global_document_view_permission(
self, self,
delay_mock, delay_mock,
@@ -90,7 +90,7 @@ class ShareLinkBundleAPITests(DirectoriesMixin, APITestCase):
self.assertEqual(response.status_code, status.HTTP_400_BAD_REQUEST) self.assertEqual(response.status_code, status.HTTP_400_BAD_REQUEST)
self.assertIn("document_ids", response.data) self.assertIn("document_ids", response.data)
@mock.patch("documents.views.sharing.permitted_document_ids", return_value=set()) @mock.patch("documents.views.permitted_document_ids", return_value=set())
def test_create_bundle_rejects_insufficient_permissions(self, perms_mock) -> None: def test_create_bundle_rejects_insufficient_permissions(self, perms_mock) -> None:
payload = { payload = {
"document_ids": [self.document.pk], "document_ids": [self.document.pk],
@@ -104,7 +104,7 @@ class ShareLinkBundleAPITests(DirectoriesMixin, APITestCase):
self.assertIn("document_ids", response.data) self.assertIn("document_ids", response.data)
perms_mock.assert_called() perms_mock.assert_called()
@mock.patch("documents.views.sharing.build_share_link_bundle.apply_async") @mock.patch("documents.views.build_share_link_bundle.apply_async")
def test_rebuild_bundle_resets_state(self, delay_mock) -> None: def test_rebuild_bundle_resets_state(self, delay_mock) -> None:
bundle = ShareLinkBundle.objects.create( bundle = ShareLinkBundle.objects.create(
slug="rebuild-slug", slug="rebuild-slug",
+1 -1
View File
@@ -9,7 +9,7 @@ from documents.models import Tag
from documents.models import Workflow from documents.models import Workflow
from documents.models import WorkflowAction from documents.models import WorkflowAction
from documents.models import WorkflowTrigger from documents.models import WorkflowTrigger
from documents.serialisers.metadata import TagSerializer from documents.serialisers import TagSerializer
from documents.signals.handlers import run_workflows from documents.signals.handlers import run_workflows
from paperless_testing.dirs import DirectoriesMixin from paperless_testing.dirs import DirectoriesMixin
from paperless_testing.factories import UserFactory from paperless_testing.factories import UserFactory
+23 -23
View File
@@ -348,8 +348,8 @@ class TestAISuggestions(DirectoriesMixin, TestCase):
self.path1 = StoragePath.objects.create(name="path1") self.path1 = StoragePath.objects.create(name="path1")
super().setUp() super().setUp()
@patch("documents.views.documents.get_llm_suggestion_cache") @patch("documents.views.get_llm_suggestion_cache")
@patch("documents.views.documents.refresh_llm_suggestions_cache") @patch("documents.views.refresh_llm_suggestions_cache")
@override_settings( @override_settings(
AI_ENABLED=True, AI_ENABLED=True,
LLM_BACKEND="mock_backend", LLM_BACKEND="mock_backend",
@@ -397,8 +397,8 @@ class TestAISuggestions(DirectoriesMixin, TestCase):
backend=f"mock_backend:user={self.user.pk}", backend=f"mock_backend:user={self.user.pk}",
) )
@patch("documents.views.documents.get_llm_suggestion_cache") @patch("documents.views.get_llm_suggestion_cache")
@patch("documents.views.documents.refresh_llm_suggestions_cache") @patch("documents.views.refresh_llm_suggestions_cache")
@override_settings( @override_settings(
AI_ENABLED=True, AI_ENABLED=True,
LLM_BACKEND="mock_backend", LLM_BACKEND="mock_backend",
@@ -447,7 +447,7 @@ class TestAISuggestions(DirectoriesMixin, TestCase):
self.assertEqual(response.json()["tags"], []) self.assertEqual(response.json()["tags"], [])
self.assertEqual(response.json()["suggested_tags"], []) self.assertEqual(response.json()["suggested_tags"], [])
@patch("documents.views.documents.get_ai_document_classification") @patch("documents.views.get_ai_document_classification")
@override_settings( @override_settings(
AI_ENABLED=True, AI_ENABLED=True,
LLM_BACKEND="mock_backend", LLM_BACKEND="mock_backend",
@@ -497,7 +497,7 @@ class TestAISuggestions(DirectoriesMixin, TestCase):
None, None,
) )
@patch("documents.views.documents.get_ai_document_classification") @patch("documents.views.get_ai_document_classification")
@override_settings( @override_settings(
AI_ENABLED=True, AI_ENABLED=True,
LLM_BACKEND="mock_backend", LLM_BACKEND="mock_backend",
@@ -535,7 +535,7 @@ class TestAISuggestions(DirectoriesMixin, TestCase):
"KI Title", "KI Title",
) )
@patch("documents.views.documents.get_ai_document_classification") @patch("documents.views.get_ai_document_classification")
@override_settings( @override_settings(
AI_ENABLED=True, AI_ENABLED=True,
LLM_BACKEND="mock_backend", LLM_BACKEND="mock_backend",
@@ -574,7 +574,7 @@ class TestAISuggestions(DirectoriesMixin, TestCase):
"Titre IA", "Titre IA",
) )
@patch("documents.views.documents.get_ai_document_classification") @patch("documents.views.get_ai_document_classification")
@override_settings( @override_settings(
AI_ENABLED=True, AI_ENABLED=True,
LLM_BACKEND="mock_backend", LLM_BACKEND="mock_backend",
@@ -610,7 +610,7 @@ class TestAISuggestions(DirectoriesMixin, TestCase):
), ),
) )
@patch("documents.views.documents.get_ai_document_classification") @patch("documents.views.get_ai_document_classification")
@override_settings( @override_settings(
AI_ENABLED=True, AI_ENABLED=True,
LLM_BACKEND="mock_backend", LLM_BACKEND="mock_backend",
@@ -682,7 +682,7 @@ class TestAISuggestions(DirectoriesMixin, TestCase):
), ),
) )
@patch("documents.views.documents.get_ai_document_classification") @patch("documents.views.get_ai_document_classification")
@override_settings( @override_settings(
AI_ENABLED=True, AI_ENABLED=True,
LLM_BACKEND="openai-like", LLM_BACKEND="openai-like",
@@ -711,7 +711,7 @@ class TestAISuggestions(DirectoriesMixin, TestCase):
get_llm_suggestion_cache(self.document.pk, backend="openai-like"), get_llm_suggestion_cache(self.document.pk, backend="openai-like"),
) )
@patch("documents.views.documents.get_ai_document_classification") @patch("documents.views.get_ai_document_classification")
@override_settings( @override_settings(
AI_ENABLED=True, AI_ENABLED=True,
LLM_BACKEND="openai-like", LLM_BACKEND="openai-like",
@@ -738,7 +738,7 @@ class TestAISuggestions(DirectoriesMixin, TestCase):
get_llm_suggestion_cache(self.document.pk, backend="openai-like"), get_llm_suggestion_cache(self.document.pk, backend="openai-like"),
) )
@patch("documents.views.documents.get_ai_document_classification") @patch("documents.views.get_ai_document_classification")
@override_settings( @override_settings(
AI_ENABLED=True, AI_ENABLED=True,
LLM_BACKEND="openai-like", LLM_BACKEND="openai-like",
@@ -770,7 +770,7 @@ class TestAISuggestions(DirectoriesMixin, TestCase):
get_llm_suggestion_cache(self.document.pk, backend="openai-like"), get_llm_suggestion_cache(self.document.pk, backend="openai-like"),
) )
@patch("documents.views.documents.get_ai_document_classification") @patch("documents.views.get_ai_document_classification")
@override_settings( @override_settings(
AI_ENABLED=True, AI_ENABLED=True,
LLM_BACKEND="mock_backend", LLM_BACKEND="mock_backend",
@@ -808,7 +808,7 @@ class TestAISuggestions(DirectoriesMixin, TestCase):
self.assertEqual(response.json()["tags"], [self.tag1.pk]) self.assertEqual(response.json()["tags"], [self.tag1.pk])
self.assertEqual(response.json()["suggested_tags"], ["Follow-up"]) self.assertEqual(response.json()["suggested_tags"], ["Follow-up"])
@patch("documents.views.documents.get_ai_document_classification") @patch("documents.views.get_ai_document_classification")
@override_settings( @override_settings(
AI_ENABLED=True, AI_ENABLED=True,
LLM_BACKEND="mock_backend", LLM_BACKEND="mock_backend",
@@ -847,7 +847,7 @@ class TestAISuggestions(DirectoriesMixin, TestCase):
self.assertEqual(response.json()["tags"], [self.tag1.pk]) self.assertEqual(response.json()["tags"], [self.tag1.pk])
self.assertEqual(response.json()["suggested_tags"], []) self.assertEqual(response.json()["suggested_tags"], [])
@patch("documents.views.documents.get_ai_document_classification") @patch("documents.views.get_ai_document_classification")
@override_settings( @override_settings(
AI_ENABLED=True, AI_ENABLED=True,
LLM_BACKEND="mock_backend", LLM_BACKEND="mock_backend",
@@ -969,8 +969,8 @@ class TestAIChatStreamingView(DirectoriesMixin, TestCase):
self.assertEqual(response.status_code, 400) self.assertEqual(response.status_code, 400)
self.assertIn(b"AI is required for this feature", response.content) self.assertIn(b"AI is required for this feature", response.content)
@patch("documents.views.chat.stream_chat_with_documents") @patch("documents.views.stream_chat_with_documents")
@patch("documents.views.chat.permitted_document_ids") @patch("documents.views.permitted_document_ids")
@override_settings(AI_ENABLED=True) @override_settings(AI_ENABLED=True)
def test_post_no_document_id(self, mock_permitted_ids, mock_stream_chat) -> None: def test_post_no_document_id(self, mock_permitted_ids, mock_stream_chat) -> None:
self.grant_view_document_permission() self.grant_view_document_permission()
@@ -989,8 +989,8 @@ class TestAIChatStreamingView(DirectoriesMixin, TestCase):
self.assertEqual(list(call_kwargs["documents"]), [self.document]) self.assertEqual(list(call_kwargs["documents"]), [self.document])
self.assertIsNone(call_kwargs["output_language"]) self.assertIsNone(call_kwargs["output_language"])
@patch("documents.views.chat.stream_chat_with_documents") @patch("documents.views.stream_chat_with_documents")
@patch("documents.views.chat.permitted_document_ids") @patch("documents.views.permitted_document_ids")
@override_settings(AI_ENABLED=True) @override_settings(AI_ENABLED=True)
def test_post_uses_user_display_language( def test_post_uses_user_display_language(
self, self,
@@ -1015,7 +1015,7 @@ class TestAIChatStreamingView(DirectoriesMixin, TestCase):
self.assertEqual(list(call_kwargs["documents"]), [self.document]) self.assertEqual(list(call_kwargs["documents"]), [self.document])
self.assertEqual(call_kwargs["output_language"], "de-de") self.assertEqual(call_kwargs["output_language"], "de-de")
@patch("documents.views.chat.stream_chat_with_documents") @patch("documents.views.stream_chat_with_documents")
@override_settings(AI_ENABLED=True) @override_settings(AI_ENABLED=True)
def test_post_with_document_id(self, mock_stream_chat) -> None: def test_post_with_document_id(self, mock_stream_chat) -> None:
self.grant_view_document_permission() self.grant_view_document_permission()
@@ -1039,7 +1039,7 @@ class TestAIChatStreamingView(DirectoriesMixin, TestCase):
self.assertEqual(response.status_code, 400) self.assertEqual(response.status_code, 400)
self.assertIn(b"Document not found", response.content) self.assertIn(b"Document not found", response.content)
@patch("documents.views.chat.has_perms_owner_aware") @patch("documents.views.has_perms_owner_aware")
@override_settings(AI_ENABLED=True) @override_settings(AI_ENABLED=True)
def test_post_with_document_id_no_permission(self, mock_has_perms) -> None: def test_post_with_document_id_no_permission(self, mock_has_perms) -> None:
self.grant_view_document_permission() self.grant_view_document_permission()
@@ -1052,7 +1052,7 @@ class TestAIChatStreamingView(DirectoriesMixin, TestCase):
self.assertEqual(response.status_code, 403) self.assertEqual(response.status_code, 403)
self.assertIn(b"Insufficient permissions", response.content) self.assertIn(b"Insufficient permissions", response.content)
@patch("documents.views.chat.stream_chat_with_documents") @patch("documents.views.stream_chat_with_documents")
@override_settings(AI_ENABLED=True) @override_settings(AI_ENABLED=True)
def test_post_no_document_id_requires_view_document_permission( def test_post_no_document_id_requires_view_document_permission(
self, self,
@@ -1066,7 +1066,7 @@ class TestAIChatStreamingView(DirectoriesMixin, TestCase):
self.assertEqual(response.status_code, 403) self.assertEqual(response.status_code, 403)
mock_stream_chat.assert_not_called() mock_stream_chat.assert_not_called()
@patch("documents.views.chat.stream_chat_with_documents") @patch("documents.views.stream_chat_with_documents")
@override_settings(AI_ENABLED=True) @override_settings(AI_ENABLED=True)
def test_post_with_document_id_requires_view_document_permission( def test_post_with_document_id_requires_view_document_permission(
self, self,
+1 -1
View File
@@ -61,7 +61,7 @@ from documents.models import WorkflowActionWebhook
from documents.models import WorkflowRun from documents.models import WorkflowRun
from documents.models import WorkflowTrigger from documents.models import WorkflowTrigger
from documents.plugins.base import StopConsumeTaskError from documents.plugins.base import StopConsumeTaskError
from documents.serialisers.workflows import WorkflowTriggerSerializer from documents.serialisers import WorkflowTriggerSerializer
from documents.signals import document_consumption_finished from documents.signals import document_consumption_finished
from documents.tests.utils import SampleDirMixin from documents.tests.utils import SampleDirMixin
from documents.workflows.actions import execute_password_removal_action from documents.workflows.actions import execute_password_removal_action
File diff suppressed because it is too large Load Diff
View File
-611
View File
@@ -1,611 +0,0 @@
import logging
from collections import defaultdict
from typing import TYPE_CHECKING
from typing import Any
from typing import Final
from typing import Literal
from typing import NamedTuple
from unicodedata import normalize
from urllib.parse import quote
from django.contrib.auth.models import User
from django.contrib.contenttypes.models import ContentType
from django.db.models import Count
from django.db.models import Model
from django.http import FileResponse
from django.http import HttpResponseBadRequest
from django.http import HttpResponseForbidden
from django.utils.translation import gettext_lazy as _
from guardian.utils import get_group_obj_perms_model
from guardian.utils import get_user_obj_perms_model
from rest_framework import parsers
from rest_framework.exceptions import PermissionDenied
from rest_framework.exceptions import ValidationError
from rest_framework.generics import GenericAPIView
from rest_framework.permissions import IsAuthenticated
from rest_framework.response import Response
from documents import bulk_edit
from documents.filters import DocumentFilterSet
from documents.models import Document
from documents.models import PaperlessTask
from documents.permissions import annotate_document_count_for_related_queryset
from documents.permissions import get_document_count_filter_for_user
from documents.permissions import has_perms_owner_aware
from documents.permissions import permitted_document_ids
from documents.search import SearchHit
from documents.serialisers.base import SerializerWithPerms
from documents.utils import get_boolean
from documents.versioning import get_root_document
logger = logging.getLogger("paperless.api")
_TANTIVY_SEARCH_PARAM_NAMES = ("text", "title_search", "query", "more_like_id")
# whoosh-compat's fieldname tagger (used only for SearchMode.QUERY, via the
# whoosh grammar in parse_user_query) is O(n^2) in plain word characters:
# measured at ~0.96s/10k chars, ~3.67s/20k, ~14.4s/40k against the real field
# registry. Django's DATA_UPLOAD_MAX_MEMORY_SIZE default (2.5 MB) does not
# bound this on the POST-body selection-filter path, so an unbounded query
# is a single-request CPU exhaustion vector. 4096 chars caps the worst case
# at roughly 0.16s (quadratic extrapolation from the measurements above),
# far beyond any plausible hand-typed advanced query, while still being fast
# enough to absorb inside a request handler. Applied to all three modes at
# this shared choke point: TEXT and TITLE route through simple_search_tokens
# instead and measure linear even at 20k chars, so the cap is hygiene for
# them, not a fix, but a single limit here is simpler than one exemption.
# Not exposed as a PAPERLESS_* setting: this is a hard security boundary,
# not a tunable, and a raisable ceiling would let a misconfiguration
# reintroduce the exact hazard this exists to close.
_MAX_QUERY_LENGTH: Final[int] = 4096
def _get_tantivy_query_and_mode(params):
from documents.search import QueryTooLongError
from documents.search import SearchMode
if "text" in params:
raw, mode = str(params["text"]), SearchMode.TEXT
elif "title_search" in params:
raw, mode = str(params["title_search"]), SearchMode.TITLE
elif "query" in params:
raw, mode = str(params["query"]), SearchMode.QUERY
else:
return None # pragma: no cover
if len(raw) > _MAX_QUERY_LENGTH:
raise QueryTooLongError(len(raw), _MAX_QUERY_LENGTH)
return raw, mode
def _get_more_like_id(query_params: dict[str, Any], user: User | None) -> int:
try:
more_like_doc_id = int(query_params["more_like_id"])
more_like_doc = Document.objects.select_related("owner").get(
pk=more_like_doc_id,
)
except (TypeError, ValueError, Document.DoesNotExist):
raise PermissionDenied(_("Invalid more_like_id"))
if user and not has_perms_owner_aware(
user,
"view_document",
more_like_doc,
):
raise PermissionDenied(_("Insufficient permissions."))
return more_like_doc_id
class SearchParams(NamedTuple):
sort_field_name: str | None
sort_reverse: bool
use_tantivy_sort: bool
page_num: int
page_size: int
class SearchResultPage(NamedTuple):
ordered_ids: list[int]
hits: list[SearchHit]
page_offset: int
class ResolvedRequestDocs(NamedTuple):
request_doc: Document
root_doc: Document
class PassUserMixin(GenericAPIView[Any]):
"""
Pass a user object to serializer
"""
def get_serializer(self, *args, **kwargs):
serializer_class = self.get_serializer_class()
if isinstance(serializer_class, type) and issubclass(
serializer_class,
SerializerWithPerms,
):
kwargs.setdefault("user", self.request.user)
try:
full_perms = get_boolean(
str(self.request.query_params.get("full_perms", "false")),
)
except ValueError:
full_perms = False
kwargs.setdefault(
"full_perms",
full_perms,
)
return super().get_serializer(*args, **kwargs)
class BulkPermissionMixin:
"""
Prefetch Django-Guardian permissions for a list before serialization, to avoid N+1 queries.
"""
def _get_object_perms(
self,
objects: list,
perm_codenames: list[str],
actor: Literal["users", "groups"],
) -> dict[int, dict[str, list[int]]]:
"""
Collect object-level permissions for either users or groups.
"""
model = self.queryset.model
obj_perm_model = (
get_user_obj_perms_model(model)
if actor == "users"
else get_group_obj_perms_model(model)
)
id_field = "user_id" if actor == "users" else "group_id"
ctype = ContentType.objects.get_for_model(model)
object_pks = [obj.pk for obj in objects]
perms_qs = obj_perm_model.objects.filter(
content_type=ctype,
object_pk__in=object_pks,
permission__codename__in=perm_codenames,
).values_list("object_pk", id_field, "permission__codename")
perms: dict[int, dict[str, list[int]]] = defaultdict(lambda: defaultdict(list))
for object_pk, actor_id, codename in perms_qs:
perms[int(object_pk)][codename].append(actor_id)
# Ensure that all objects have all codenames, even if empty
for pk in object_pks:
for codename in perm_codenames:
perms[pk][codename]
return perms
def get_serializer_context(self):
"""
Get all permissions of the current list of objects at once and pass them to the serializer.
This avoid fetching permissions object by object in database.
"""
context = super().get_serializer_context()
if getattr(self, "action", None) != "list":
# Batching only pays off across a page of objects; for single-object
# actions (retrieve, update, ...) the per-object fallback in
# get_user_can_change()/_get_perms() is cheap and avoids scanning
# the whole queryset here.
return context
# Check which objects are being paginated
page = getattr(self, "paginator", None)
if page and hasattr(page, "page"):
queryset = page.page.object_list
elif hasattr(self, "page"):
queryset = self.page
else:
queryset = self.filter_queryset(self.get_queryset())
model_name = self.queryset.model.__name__.lower()
permission_name_view = f"view_{model_name}"
permission_name_change = f"change_{model_name}"
user_perms = self._get_object_perms(
objects=queryset,
perm_codenames=[permission_name_view, permission_name_change],
actor="users",
)
group_perms = self._get_object_perms(
objects=queryset,
perm_codenames=[permission_name_view, permission_name_change],
actor="groups",
)
context["users_view_perms"] = {
pk: user_perms[pk][permission_name_view] for pk in user_perms
}
context["users_change_perms"] = {
pk: user_perms[pk][permission_name_change] for pk in user_perms
}
context["groups_view_perms"] = {
pk: group_perms[pk][permission_name_view] for pk in group_perms
}
context["groups_change_perms"] = {
pk: group_perms[pk][permission_name_change] for pk in group_perms
}
return context
class PermissionsAwareDocumentCountMixin(BulkPermissionMixin, PassUserMixin):
"""Mixin to add document count to queryset, permissions-aware if needed"""
# Direct FK/M2M relation name from this model to Document, used for the
# cheap Count(filter=...) path (Correspondent, DocumentType, StoragePath).
document_count_related_name: str = "documents"
# Set both of these instead, for models that only reach Document through
# an M2M/through-model table (Tag, CustomField). A plain Count(filter=...)
# over such a relation is fine for a direct FK, but forces a much more
# expensive plan once an M2M bridge table is involved -- see
# annotate_document_count_for_related_queryset() for why.
document_count_through: type[Model] | None = None
document_count_source_field: str | None = None
def _get_document_count_source_field(self) -> str:
if self.document_count_source_field is None:
msg = (
"document_count_source_field must be set when "
"document_count_through is configured"
)
raise ValueError(msg)
return self.document_count_source_field
def get_document_count_filter(self):
request = getattr(self, "request", None)
user = getattr(request, "user", None) if request else None
return get_document_count_filter_for_user(
user,
related_name=self.document_count_related_name,
)
def get_queryset(self):
base_qs = super().get_queryset()
if self.document_count_through:
user = getattr(getattr(self, "request", None), "user", None)
return annotate_document_count_for_related_queryset(
base_qs,
through_model=self.document_count_through,
related_object_field=self._get_document_count_source_field(),
user=user,
)
filter = self.get_document_count_filter()
return base_qs.annotate(
document_count=Count(
self.document_count_related_name,
filter=filter,
distinct=True,
),
)
class DocumentSelectionMixin:
def _get_search_document_ids(
self,
*,
user: User,
filters: dict[str, Any],
) -> list[int] | None:
search_filters = [
filter_name
for filter_name in _TANTIVY_SEARCH_PARAM_NAMES
if filter_name in filters
]
if not search_filters:
return None
if len(search_filters) > 1:
raise ValidationError(
{
"detail": _(
"Specify only one of text, title_search, query, or more_like_id.",
),
},
)
from documents.search import SearchQueryError
from documents.search import get_backend
from documents.search import search_query_error_messages
filter_name = search_filters[0]
backend = get_backend()
search_user = None if user.is_superuser else user
try:
if filter_name == "more_like_id":
more_like_doc_id = _get_more_like_id(filters, user)
search_ids = backend.more_like_this_ids(
more_like_doc_id,
user=search_user,
)
else:
query_str, search_mode = _get_tantivy_query_and_mode(filters)
search_ids = backend.search_ids(
query_str,
user=search_user,
search_mode=search_mode,
)
except SearchQueryError as e:
# Same user-fixable-query mapping as the search list endpoint:
# a bad date/number in a bulk selection filter is a 400 naming
# the value, never a 500.
raise ValidationError({"query": search_query_error_messages(e)}) from e
return search_ids
def _resolve_document_ids(
self,
*,
user: User,
validated_data: dict[str, Any],
) -> list[int]:
if not validated_data.get("all", False):
# if all is not true, just pass through the provided document ids
return validated_data["documents"]
# otherwise, reconstruct the document list based on the provided filters
filters = validated_data.get("filters") or {}
orm_filters = {
key: value
for key, value in filters.items()
if key not in _TANTIVY_SEARCH_PARAM_NAMES
}
# Operations are addressed to roots, a caller that wants
# to act on a specific version passes its id explicitly instead
permitted_documents = Document.objects.filter(
id__in=permitted_document_ids(user),
root_document__isnull=True,
)
# orm-filtered docs
filtered_documents = DocumentFilterSet(
data=orm_filters,
queryset=permitted_documents,
user=user,
).qs.distinct()
# tantivy-filtered docs (if search params provided)
search_filtered_ids = self._get_search_document_ids(
user=user,
filters=filters,
)
if search_filtered_ids is not None:
filtered_documents = filtered_documents.filter(pk__in=search_filtered_ids)
if validated_data.get("excluded_documents"):
filtered_documents = filtered_documents.exclude(
pk__in=validated_data["excluded_documents"],
)
return list(filtered_documents.values_list("pk", flat=True))
class DocumentOperationPermissionMixin(PassUserMixin, DocumentSelectionMixin):
permission_classes = (IsAuthenticated,)
parser_classes = (parsers.JSONParser,)
METHOD_NAMES_REQUIRING_USER = {
"split",
"merge",
"rotate",
"delete_pages",
"edit_pdf",
"remove_password",
"merge_as_versions",
}
# merge_as_versions doesn't queue any consume tasks
METHOD_NAMES_REQUIRING_TRIGGER_SOURCE = METHOD_NAMES_REQUIRING_USER - {
"merge_as_versions",
}
def _has_document_permissions(
self,
*,
user: User,
documents: list[int],
method,
parameters: dict[str, Any],
) -> bool:
if user.is_superuser:
return True
root_docs = {
get_root_document(doc)
for doc in Document.objects.select_related(
"owner",
"root_document__owner",
).filter(pk__in=documents)
}
user_is_owner_of_all_documents = all(
(doc.owner == user or doc.owner is None) for doc in root_docs
)
# check global and object permissions for all documents
has_perms = (
user.has_perm(
"documents.change_document",
)
and not Document.global_objects.filter(
pk__in=[doc.pk for doc in root_docs],
)
.exclude(
pk__in=permitted_document_ids(user, perm="change_document"),
)
.exists()
)
# check ownership for methods that change original document
if (
(
has_perms
and method
in [
bulk_edit.set_permissions,
bulk_edit.delete,
bulk_edit.rotate,
bulk_edit.delete_pages,
bulk_edit.edit_pdf,
bulk_edit.merge_as_versions,
bulk_edit.remove_password,
]
)
or (
method in [bulk_edit.merge, bulk_edit.split]
and parameters.get("delete_originals")
)
or (method == bulk_edit.edit_pdf and parameters.get("update_document"))
):
has_perms = has_perms and user_is_owner_of_all_documents
# check global add permissions for methods that create documents
if (
has_perms
and (
method in [bulk_edit.split, bulk_edit.merge]
or (
method in [bulk_edit.edit_pdf, bulk_edit.remove_password]
and not parameters.get("update_document")
)
)
and not user.has_perm("documents.add_document")
):
has_perms = False
# check global delete permissions for methods that delete documents
if (
has_perms
and (
method == bulk_edit.delete
# Sources stop being documents of their own, and removing one
# again afterwards needs delete_document
or method == bulk_edit.merge_as_versions
or (
method in [bulk_edit.merge, bulk_edit.split]
and parameters.get("delete_originals")
)
or (
method in [bulk_edit.edit_pdf, bulk_edit.remove_password]
and parameters.get("delete_original")
and not parameters.get("update_document")
)
)
and not user.has_perm("documents.delete_document")
):
has_perms = False
return has_perms
def _execute_document_action(
self,
*,
method,
validated_data: dict[str, Any],
operation_label: str,
):
documents = self._resolve_document_ids(
user=self.request.user,
validated_data=validated_data,
)
parameters = {
k: v
for k, v in validated_data.items()
if k
not in {
"documents",
"all",
"filters",
"excluded_documents",
"from_webui",
}
}
user = self.request.user
from_webui = validated_data.get("from_webui", False)
if method.__name__ in self.METHOD_NAMES_REQUIRING_USER:
parameters["user"] = user
if method.__name__ in self.METHOD_NAMES_REQUIRING_TRIGGER_SOURCE:
parameters["trigger_source"] = (
PaperlessTask.TriggerSource.WEB_UI
if from_webui
else PaperlessTask.TriggerSource.API_UPLOAD
)
if not self._has_document_permissions(
user=user,
documents=documents,
method=method,
parameters=parameters,
):
return HttpResponseForbidden("Insufficient permissions")
try:
result = method(documents, **parameters)
return Response({"result": result})
except Exception as e:
logger.warning(f"An error occurred performing {operation_label}: {e!s}")
return HttpResponseBadRequest(
f"Error performing {operation_label}, check logs for more detail.",
)
def serve_file(
*,
doc: Document,
use_archive: bool,
disposition: str,
follow_formatting: bool = False,
) -> FileResponse:
if use_archive:
if TYPE_CHECKING:
assert doc.archive_filename
file_handle = doc.archive_file
filename = (
doc.archive_filename
if follow_formatting
else doc.get_public_filename(archive=True)
)
mime_type = "application/pdf"
else:
if TYPE_CHECKING:
assert doc.filename
file_handle = doc.source_file
filename = doc.filename if follow_formatting else doc.get_public_filename()
mime_type = doc.mime_type
# Support browser previewing csv files by using text mime type
if mime_type in {"application/csv", "text/csv"} and disposition == "inline":
mime_type = "text/plain"
# Tell browsers to use UTF-8 for the text files we parse as UTF-8
if mime_type in {"text/plain", "text/csv", "application/csv"}:
mime_type = f"{mime_type}; charset=utf-8"
response = FileResponse(file_handle, content_type=mime_type)
# Firefox is not able to handle unicode characters in filename field
# RFC 5987 addresses this issue
# see https://datatracker.ietf.org/doc/html/rfc5987#section-4.2
# Chromium cannot handle commas in the filename
filename_normalized = (
normalize("NFKD", filename.replace(",", "_"))
.encode(
"ascii",
"ignore",
)
.decode("ascii")
.replace("\\", "_")
.replace('"', "_")
)
filename_encoded = quote(filename)
content_disposition = (
f"{disposition}; "
f'filename="{filename_normalized}"; '
f"filename*=utf-8''{filename_encoded}"
)
response["Content-Disposition"] = content_disposition
return response
-601
View File
@@ -1,601 +0,0 @@
import logging
import os
import tempfile
import zipfile
from http import HTTPStatus
from pathlib import Path
from typing import Any
from django.conf import settings
from django.db.models import Q
from django.http import FileResponse
from django.http import HttpResponseBadRequest
from django.http import HttpResponseForbidden
from drf_spectacular.types import OpenApiTypes
from drf_spectacular.utils import extend_schema
from drf_spectacular.utils import extend_schema_view
from drf_spectacular.utils import inline_serializer
from rest_framework import parsers
from rest_framework import serializers
from rest_framework.generics import GenericAPIView
from rest_framework.permissions import IsAuthenticated
from rest_framework.response import Response
from documents import bulk_edit
from documents.bulk_download import ArchiveOnlyStrategy
from documents.bulk_download import OriginalAndArchiveStrategy
from documents.bulk_download import OriginalsOnlyStrategy
from documents.filters import CorrespondentFilterSet
from documents.filters import DocumentTypeFilterSet
from documents.filters import StoragePathFilterSet
from documents.filters import TagFilterSet
from documents.models import CustomFieldInstance
from documents.models import Document
from documents.models import PaperlessTask
from documents.permissions import ViewDocumentsPermissions
from documents.permissions import permitted_document_ids
from documents.permissions import permitted_object_ids
from documents.permissions import set_permissions_for_objects
from documents.serialisers.bulk_edit import BulkDownloadSerializer
from documents.serialisers.bulk_edit import BulkEditObjectsSerializer
from documents.serialisers.bulk_edit import BulkEditSerializer
from documents.serialisers.bulk_edit import DeleteDocumentsSerializer
from documents.serialisers.bulk_edit import EditPdfDocumentsSerializer
from documents.serialisers.bulk_edit import MergeDocumentsAsVersionsSerializer
from documents.serialisers.bulk_edit import MergeDocumentsSerializer
from documents.serialisers.bulk_edit import RemovePasswordDocumentsSerializer
from documents.serialisers.bulk_edit import ReprocessDocumentsSerializer
from documents.serialisers.bulk_edit import RotateDocumentsSerializer
from documents.versioning import get_latest_version_for_root
from documents.versioning import get_root_document
from .base import DocumentOperationPermissionMixin
from .base import DocumentSelectionMixin
from .base import PassUserMixin
if settings.AUDIT_LOG_ENABLED:
from auditlog.models import LogEntry
logger = logging.getLogger("paperless.api")
@extend_schema_view(
post=extend_schema(
operation_id="bulk_edit",
description="Perform a bulk edit operation on a list of documents",
external_docs={
"description": "Further documentation",
"url": "https://docs.paperless-ngx.com/api/#bulk-editing",
},
responses={
200: inline_serializer(
name="BulkEditDocumentsResult",
fields={
"result": serializers.CharField(),
},
),
},
),
)
class BulkEditView(DocumentOperationPermissionMixin):
MODIFIED_FIELD_BY_METHOD = {
"set_correspondent": "correspondent",
"set_document_type": "document_type",
"set_storage_path": "storage_path",
"add_tag": "tags",
"remove_tag": "tags",
"modify_tags": "tags",
"modify_custom_fields": "custom_fields",
"set_permissions": None,
"delete": "deleted_at",
# These operations create new documents/versions no longer altering
# fields on the selected document in place
"rotate": None,
"delete_pages": None,
"split": None,
"merge": None,
"edit_pdf": None,
"reprocess": "checksum",
"remove_password": None,
}
serializer_class = BulkEditSerializer
@staticmethod
def _snapshot_field(doc_ids: list[int], field: str) -> dict[int, Any]:
"""
Returns each document's current value of field, for the audit log.
Tags and custom fields are one row per value, so they are gathered
into a sorted list of pks per document (empty when there are none).
Reading them through Document.values() instead would join those rows
and return one arbitrary value per document.
"""
if field == "tags":
rows = (
Document.tags.through.objects.filter(document_id__in=doc_ids)
.order_by("tag_id")
.values_list("document_id", "tag_id")
)
elif field == "custom_fields":
rows = (
CustomFieldInstance.objects.filter(document_id__in=doc_ids)
.order_by("pk")
.values_list("document_id", "pk")
)
else:
return dict(
Document.objects.filter(pk__in=doc_ids).values_list("pk", field),
)
values: dict[int, list[int]] = {doc_id: [] for doc_id in doc_ids}
for doc_id, pk in rows:
values[doc_id].append(pk)
return values
def post(self, request, *args, **kwargs):
request_method = request.data.get("method")
api_version = int(request.version or settings.REST_FRAMEWORK["DEFAULT_VERSION"])
# TODO: remove this and related backwards compatibility code when API v9 is dropped
if request_method in BulkEditSerializer.LEGACY_DOCUMENT_ACTION_METHODS:
endpoint = BulkEditSerializer.MOVED_DOCUMENT_ACTION_ENDPOINTS[
request_method
]
logger.warning(
"Deprecated bulk_edit method '%s' requested on API version %s. "
"Use '%s' instead.",
request_method,
api_version,
endpoint,
)
serializer = self.get_serializer(data=request.data)
serializer.is_valid(raise_exception=True)
user = self.request.user
method = serializer.validated_data.get("method")
parameters = serializer.validated_data.get("parameters")
from_webui = serializer.validated_data.get("from_webui", False)
documents = self._resolve_document_ids(
user=user,
validated_data=serializer.validated_data,
)
if method.__name__ in self.METHOD_NAMES_REQUIRING_USER:
parameters["user"] = user
if method.__name__ in self.METHOD_NAMES_REQUIRING_TRIGGER_SOURCE:
parameters["trigger_source"] = (
PaperlessTask.TriggerSource.WEB_UI
if from_webui
else PaperlessTask.TriggerSource.API_UPLOAD
)
if not self._has_document_permissions(
user=user,
documents=documents,
method=method,
parameters=parameters,
):
return HttpResponseForbidden("Insufficient permissions")
try:
modified_field = self.MODIFIED_FIELD_BY_METHOD.get(method.__name__, None)
if settings.AUDIT_LOG_ENABLED and modified_field:
old_values = self._snapshot_field(documents, modified_field)
result = method(documents, **parameters)
if settings.AUDIT_LOG_ENABLED and modified_field:
new_values = self._snapshot_field(documents, modified_field)
for doc in Document.objects.filter(pk__in=documents):
LogEntry.objects.log_create(
instance=doc,
changes={
modified_field: [
old_values[doc.pk],
new_values[doc.pk],
],
},
action=LogEntry.Action.UPDATE,
actor=user,
additional_data={
"reason": f"Bulk edit: {method.__name__}",
},
)
return Response({"result": result})
except Exception as e:
logger.warning(f"An error occurred performing bulk edit: {e!s}")
return HttpResponseBadRequest(
"Error performing bulk edit, check logs for more detail.",
)
@extend_schema_view(
post=extend_schema(
operation_id="documents_rotate",
description="Rotate one or more documents",
responses={
200: inline_serializer(
name="RotateDocumentsResult",
fields={
"result": serializers.CharField(),
},
),
},
),
)
class RotateDocumentsView(DocumentOperationPermissionMixin):
serializer_class = RotateDocumentsSerializer
def post(self, request, *args, **kwargs):
serializer = self.get_serializer(data=request.data)
serializer.is_valid(raise_exception=True)
return self._execute_document_action(
method=bulk_edit.rotate,
validated_data=serializer.validated_data,
operation_label="document rotate",
)
@extend_schema_view(
post=extend_schema(
operation_id="documents_merge",
description="Merge selected documents into a new document",
responses={
200: inline_serializer(
name="MergeDocumentsResult",
fields={
"result": serializers.CharField(),
},
),
},
),
)
class MergeDocumentsView(DocumentOperationPermissionMixin):
serializer_class = MergeDocumentsSerializer
def post(self, request, *args, **kwargs):
serializer = self.get_serializer(data=request.data)
serializer.is_valid(raise_exception=True)
return self._execute_document_action(
method=bulk_edit.merge,
validated_data=serializer.validated_data,
operation_label="document merge",
)
@extend_schema_view(
post=extend_schema(
operation_id="documents_merge_as_versions",
description="Merge selected documents as versions of a chosen root document",
responses={
200: inline_serializer(
name="MergeDocumentsAsVersionsResult",
fields={
"result": serializers.CharField(),
},
),
},
),
)
class MergeDocumentsAsVersionsView(DocumentOperationPermissionMixin):
serializer_class = MergeDocumentsAsVersionsSerializer
def post(self, request, *args, **kwargs):
serializer = self.get_serializer(data=request.data)
serializer.is_valid(raise_exception=True)
return self._execute_document_action(
method=bulk_edit.merge_as_versions,
validated_data=serializer.validated_data,
operation_label="document merge as versions",
)
@extend_schema_view(
post=extend_schema(
operation_id="documents_delete",
description="Move selected documents to trash",
responses={
200: inline_serializer(
name="DeleteDocumentsResult",
fields={
"result": serializers.CharField(),
},
),
},
),
)
class DeleteDocumentsView(DocumentOperationPermissionMixin):
serializer_class = DeleteDocumentsSerializer
def post(self, request, *args, **kwargs):
serializer = self.get_serializer(data=request.data)
serializer.is_valid(raise_exception=True)
return self._execute_document_action(
method=bulk_edit.delete,
validated_data=serializer.validated_data,
operation_label="document delete",
)
@extend_schema_view(
post=extend_schema(
operation_id="documents_reprocess",
description="Reprocess selected documents",
responses={
200: inline_serializer(
name="ReprocessDocumentsResult",
fields={
"result": serializers.CharField(),
},
),
},
),
)
class ReprocessDocumentsView(DocumentOperationPermissionMixin):
serializer_class = ReprocessDocumentsSerializer
def post(self, request, *args, **kwargs):
serializer = self.get_serializer(data=request.data)
serializer.is_valid(raise_exception=True)
return self._execute_document_action(
method=bulk_edit.reprocess,
validated_data=serializer.validated_data,
operation_label="document reprocess",
)
@extend_schema_view(
post=extend_schema(
operation_id="documents_edit_pdf",
description="Perform PDF edit operations on a selected document",
responses={
200: inline_serializer(
name="EditPdfDocumentsResult",
fields={
"result": serializers.CharField(),
},
),
},
),
)
class EditPdfDocumentsView(DocumentOperationPermissionMixin):
serializer_class = EditPdfDocumentsSerializer
def post(self, request, *args, **kwargs):
serializer = self.get_serializer(data=request.data)
serializer.is_valid(raise_exception=True)
return self._execute_document_action(
method=bulk_edit.edit_pdf,
validated_data=serializer.validated_data,
operation_label="PDF edit",
)
@extend_schema_view(
post=extend_schema(
operation_id="documents_remove_password",
description="Remove password protection from selected PDFs",
responses={
200: inline_serializer(
name="RemovePasswordDocumentsResult",
fields={
"result": serializers.CharField(),
},
),
},
),
)
class RemovePasswordDocumentsView(DocumentOperationPermissionMixin):
serializer_class = RemovePasswordDocumentsSerializer
def post(self, request, *args, **kwargs):
serializer = self.get_serializer(data=request.data)
serializer.is_valid(raise_exception=True)
return self._execute_document_action(
method=bulk_edit.remove_password,
validated_data=serializer.validated_data,
operation_label="password removal",
)
@extend_schema_view(
post=extend_schema(
operation_id="bulk_download",
description="Download multiple documents as a ZIP archive.",
responses={
(HTTPStatus.OK, "application/zip"): OpenApiTypes.BINARY,
HTTPStatus.FORBIDDEN: None,
},
),
)
class BulkDownloadView(DocumentSelectionMixin, GenericAPIView[Any]):
permission_classes = (IsAuthenticated, ViewDocumentsPermissions)
serializer_class = BulkDownloadSerializer
parser_classes = (parsers.JSONParser,)
def post(self, request, format=None):
serializer = self.get_serializer(data=request.data)
serializer.is_valid(raise_exception=True)
ids = self._resolve_document_ids(
user=request.user,
validated_data=serializer.validated_data,
)
documents = Document.objects.filter(pk__in=ids)
versioned_documents = []
compression = serializer.validated_data.get("compression")
content = serializer.validated_data.get("content")
follow_filename_format = serializer.validated_data.get("follow_formatting")
permitted_ids = set(permitted_document_ids(request.user))
for document in documents:
root_doc = get_root_document(document)
if root_doc.pk not in permitted_ids:
return HttpResponseForbidden("Insufficient permissions")
versioned_documents.append(
get_latest_version_for_root(
root_doc,
),
)
if content == "both":
strategy_class = OriginalAndArchiveStrategy
elif content == "originals":
strategy_class = OriginalsOnlyStrategy
else:
strategy_class = ArchiveOnlyStrategy
settings.SCRATCH_DIR.mkdir(parents=True, exist_ok=True)
fd, temp_name = tempfile.mkstemp(
dir=settings.SCRATCH_DIR,
suffix="-compressed-archive",
)
os.close(fd)
temp_path = Path(temp_name)
try:
with zipfile.ZipFile(temp_path, "w", compression) as zipf:
strategy = strategy_class(
zipf,
follow_formatting=follow_filename_format,
)
for document in versioned_documents:
strategy.add_document(document)
f = temp_path.open("rb")
temp_path.unlink()
except Exception:
temp_path.unlink(missing_ok=True)
raise
return FileResponse(
f,
as_attachment=True,
filename="documents.zip",
content_type="application/zip",
)
@extend_schema_view(
post=extend_schema(
operation_id="bulk_edit_objects",
description="Perform a bulk edit operation on a list of objects",
external_docs={
"description": "Further documentation",
"url": "https://docs.paperless-ngx.com/api/#objects",
},
responses={
200: inline_serializer(
name="BulkEditResult",
fields={
"result": serializers.CharField(),
},
),
},
),
)
class BulkEditObjectsView(PassUserMixin):
permission_classes = (IsAuthenticated,)
serializer_class = BulkEditObjectsSerializer
parser_classes = (parsers.JSONParser,)
def post(self, request, *args, **kwargs):
serializer = self.get_serializer(data=request.data)
serializer.is_valid(raise_exception=True)
user = self.request.user
object_type = serializer.validated_data.get("object_type")
object_ids = serializer.validated_data.get("objects")
apply_to_all = serializer.validated_data.get("all")
object_class = serializer.get_object_class(object_type)
operation = serializer.validated_data.get("operation")
model_name = object_class._meta.model_name
perm_codename = (
f"change_{model_name}"
if operation == "set_permissions"
else f"delete_{model_name}"
)
if apply_to_all:
# Support all to avoid sending large lists of ids for bulk operations, with optional filters
filters = serializer.validated_data.get("filters") or {}
filterset_class = {
"tags": TagFilterSet,
"correspondents": CorrespondentFilterSet,
"document_types": DocumentTypeFilterSet,
"storage_paths": StoragePathFilterSet,
}[object_type]
user_permitted_objects = object_class.objects.filter(
id__in=permitted_object_ids(user, object_class, perm_codename),
)
objs = filterset_class(
data=filters,
queryset=user_permitted_objects,
).qs
if object_type == "tags":
editable_ids = set(user_permitted_objects.values_list("pk", flat=True))
all_ids = set(objs.values_list("pk", flat=True))
for tag in objs:
all_ids.update(
descendant.pk
for descendant in tag.get_descendants()
if descendant.pk in editable_ids
)
objs = object_class.objects.filter(pk__in=all_ids)
objs = objs.select_related("owner")
object_ids = list(objs.values_list("pk", flat=True))
else:
objs = object_class.objects.select_related("owner").filter(
pk__in=object_ids,
)
if not user.is_superuser:
perm = f"documents.{perm_codename}"
# Limited to the owner (or unowned), same as documents, see BulkEditView
has_perms = (
user.has_perm(perm)
and not objs.exclude(
Q(owner=user) | Q(owner__isnull=True),
).exists()
)
if not has_perms:
return HttpResponseForbidden("Insufficient permissions")
if operation == "set_permissions":
permissions = serializer.validated_data.get("permissions")
owner = serializer.validated_data.get("owner")
merge = serializer.validated_data.get("merge")
try:
qs = object_class.objects.filter(id__in=object_ids)
# if merge is true, we dont want to remove the owner
if "owner" in serializer.validated_data and (
not merge or (merge and owner is not None)
):
# if merge is true, we dont want to overwrite the owner
qs_owner_update = qs.filter(owner__isnull=True) if merge else qs
qs_owner_update.update(owner=owner)
if "permissions" in serializer.validated_data:
set_permissions_for_objects(
permissions=permissions,
model=object_class,
pks=qs.values_list("pk", flat=True),
merge=merge,
)
except Exception as e:
logger.warning(
f"An error occurred performing bulk permissions edit: {e!s}",
)
return HttpResponseBadRequest(
"Error performing bulk permissions edit, check logs for more detail.",
)
elif operation == "delete":
objs.delete()
return Response({"result": "OK"})
-81
View File
@@ -1,81 +0,0 @@
from typing import Any
from django.http import HttpResponseBadRequest
from django.http import HttpResponseForbidden
from django.http import StreamingHttpResponse
from django.utils.decorators import method_decorator
from django.views.decorators.cache import cache_control
from django.views.decorators.csrf import ensure_csrf_cookie
from rest_framework import serializers
from rest_framework.generics import GenericAPIView
from rest_framework.permissions import IsAuthenticated
from documents.models import Document
from documents.permissions import ViewDocumentsPermissions
from documents.permissions import has_perms_owner_aware
from documents.permissions import permitted_document_ids
from documents.permissions import user_is_unrestricted
from paperless.config import AIConfig
from paperless_ai.ai_classifier import get_llm_output_language
from paperless_ai.chat import stream_chat_with_documents
class ChatStreamingSerializer(serializers.Serializer[dict[str, Any]]):
q = serializers.CharField(required=True, max_length=4000)
document_id = serializers.IntegerField(required=False, allow_null=True)
@method_decorator(
[
ensure_csrf_cookie,
cache_control(no_cache=True),
],
name="dispatch",
)
class ChatStreamingView(GenericAPIView[Any]):
permission_classes = (IsAuthenticated, ViewDocumentsPermissions)
serializer_class = ChatStreamingSerializer
def post(self, request, *args, **kwargs):
ai_config = AIConfig()
if not ai_config.ai_enabled:
return HttpResponseBadRequest("AI is required for this feature")
serializer = self.get_serializer(data=request.data)
serializer.is_valid(raise_exception=True)
question = serializer.validated_data["q"]
doc_id = serializer.validated_data.get("document_id")
if doc_id:
try:
document = Document.objects.get(id=doc_id)
except Document.DoesNotExist:
return HttpResponseBadRequest("Document not found")
if not has_perms_owner_aware(request.user, "view_document", document):
return HttpResponseForbidden("Insufficient permissions")
documents = Document.objects.filter(pk=document.pk)
unrestricted = False
else:
documents = Document.objects.filter(
id__in=permitted_document_ids(request.user),
)
unrestricted = user_is_unrestricted(request.user)
output_language = get_llm_output_language(
ai_config=ai_config,
user=request.user,
)
response = StreamingHttpResponse(
stream_chat_with_documents(
query_str=question,
documents=documents,
unrestricted=unrestricted,
output_language=output_language,
),
content_type="text/event-stream",
)
return response
File diff suppressed because it is too large Load Diff
-84
View File
@@ -1,84 +0,0 @@
from pathlib import Path
import magic
from django.conf import settings
from django.http import FileResponse
from django.http import Http404
from django.http import HttpRequest
from django.utils.translation import get_language
from django.views.generic import TemplateView
from paperless.models import ApplicationConfiguration
class IndexView(TemplateView):
template_name = "index.html"
def get_frontend_language(self):
if hasattr(
self.request.user,
"ui_settings",
) and self.request.user.ui_settings.settings.get("language"):
lang = self.request.user.ui_settings.settings.get("language")
else:
lang = get_language()
# This is here for the following reason:
# Django identifies languages in the form "en-us"
# However, angular generates locales as "en-US".
# this translates between these two forms.
if "-" in lang:
first = lang[: lang.index("-")]
second = lang[lang.index("-") + 1 :]
return f"{first}-{second.upper()}"
return lang
def get_context_data(self, **kwargs):
context = super().get_context_data(**kwargs)
context["cookie_prefix"] = settings.COOKIE_PREFIX
context["username"] = self.request.user.username
context["full_name"] = self.request.user.get_full_name()
context["styles_css"] = f"frontend/{self.get_frontend_language()}/styles.css"
context["polyfills_js"] = (
f"frontend/{self.get_frontend_language()}/polyfills.js"
)
context["main_js"] = f"frontend/{self.get_frontend_language()}/main.js"
context["webmanifest"] = (
f"frontend/{self.get_frontend_language()}/manifest.webmanifest"
)
context["apple_touch_icon"] = (
f"frontend/{self.get_frontend_language()}/apple-touch-icon.png"
)
return context
def serve_logo(request: HttpRequest, filename: str | None = None) -> FileResponse:
"""
Serves the configured logo file with Content-Disposition: attachment.
Prevents inline execution of SVGs. See GHSA-6p53-hqqw-8j62
"""
config = ApplicationConfiguration.objects.first()
app_logo = config.app_logo
if app_logo:
path = Path(app_logo.path)
logo_name = app_logo.name
else:
if not settings.APP_LOGO:
raise Http404("No logo configured")
logo_root = (Path(settings.MEDIA_ROOT) / "logo").resolve()
path = (Path(settings.MEDIA_ROOT) / settings.APP_LOGO.lstrip("/")).resolve()
if not path.is_relative_to(logo_root) or not path.is_file():
raise Http404("Configured logo not found")
logo_name = path.name
content_type = magic.from_file(path, mime=True) or "application/octet-stream"
logo_file = app_logo.open("rb") if app_logo else path.open("rb")
return FileResponse(
logo_file,
content_type=content_type,
filename=logo_name,
as_attachment=True,
)
-100
View File
@@ -1,100 +0,0 @@
from collections import deque
from pathlib import Path
from django.conf import settings
from django.http import Http404
from drf_spectacular.types import OpenApiTypes
from drf_spectacular.utils import OpenApiParameter
from drf_spectacular.utils import extend_schema
from drf_spectacular.utils import extend_schema_view
from rest_framework import serializers
from rest_framework.exceptions import ValidationError
from rest_framework.permissions import IsAuthenticated
from rest_framework.response import Response
from rest_framework.viewsets import ViewSet
from documents.permissions import PaperlessAdminPermissions
@extend_schema_view(
list=extend_schema(
description="Logs view",
responses={
(200, "application/json"): serializers.ListSerializer(
child=serializers.CharField(),
),
},
),
retrieve=extend_schema(
description="Single log view",
operation_id="retrieve_log",
parameters=[
OpenApiParameter(
name="id",
type=OpenApiTypes.STR,
location=OpenApiParameter.PATH,
),
OpenApiParameter(
name="limit",
type=OpenApiTypes.INT,
location=OpenApiParameter.QUERY,
description="Return only the last N entries from the log file",
required=False,
),
],
responses={
(200, "application/json"): serializers.ListSerializer(
child=serializers.CharField(),
),
(404, "application/json"): None,
},
),
)
class LogViewSet(ViewSet):
permission_classes = (IsAuthenticated, PaperlessAdminPermissions)
ALLOWED_LOG_FILES = {
"paperless": "paperless.log",
"mail": "mail.log",
"celery": "celery.log",
}
def get_log_file(self, log_key: str) -> Path:
return Path(settings.LOGGING_DIR) / self.ALLOWED_LOG_FILES[log_key]
def retrieve(self, request, *args, **kwargs):
log_key = kwargs.get("pk")
if log_key not in self.ALLOWED_LOG_FILES:
raise Http404
log_file = self.get_log_file(log_key)
if not log_file.is_file():
raise Http404
limit_param = request.query_params.get("limit")
if limit_param is not None:
try:
limit = int(limit_param)
except (TypeError, ValueError):
raise ValidationError({"limit": "Must be a positive integer"})
if limit < 1:
raise ValidationError({"limit": "Must be a positive integer"})
else:
limit = None
with log_file.open() as f:
if limit is None:
lines = [line.rstrip() for line in f.readlines()]
else:
lines = [line.rstrip() for line in deque(f, maxlen=limit)]
return Response(lines)
def list(self, request, *args, **kwargs):
existing_logs = [
log_key
for log_key in self.ALLOWED_LOG_FILES
if self.get_log_file(log_key).is_file()
]
return Response(existing_logs)
-291
View File
@@ -1,291 +0,0 @@
from http import HTTPStatus
from pathlib import Path
from django.conf import settings
from django.db.models import Max
from django.db.models.functions import Lower
from django_filters.rest_framework import DjangoFilterBackend
from drf_spectacular.types import OpenApiTypes
from drf_spectacular.utils import extend_schema
from drf_spectacular.utils import extend_schema_view
from rest_framework.decorators import action
from rest_framework.filters import OrderingFilter
from rest_framework.permissions import IsAuthenticated
from rest_framework.response import Response
from rest_framework.viewsets import ModelViewSet
from documents import bulk_edit
from documents.file_handling import format_filename
from documents.filters import CorrespondentFilterSet
from documents.filters import CustomFieldFilterSet
from documents.filters import DocumentTypeFilterSet
from documents.filters import PermittedObjectsFilter
from documents.filters import StoragePathFilterSet
from documents.filters import TagFilterSet
from documents.models import Correspondent
from documents.models import CustomField
from documents.models import CustomFieldInstance
from documents.models import Document
from documents.models import DocumentType
from documents.models import PaperlessTask
from documents.models import StoragePath
from documents.models import Tag
from documents.permissions import PaperlessObjectPermissions
from documents.permissions import ViewDocumentsPermissions
from documents.permissions import annotate_document_count_for_related_queryset
from documents.permissions import permitted_object_ids
from documents.schema import generate_object_with_permissions_schema
from documents.serialisers.metadata import CorrespondentSerializer
from documents.serialisers.metadata import CustomFieldSerializer
from documents.serialisers.metadata import DocumentTypeSerializer
from documents.serialisers.metadata import StoragePathSerializer
from documents.serialisers.metadata import StoragePathTestSerializer
from documents.serialisers.metadata import TagSerializer
from documents.tasks import update_document_parent_tags
from paperless.views import StandardPagination
from .base import PermissionsAwareDocumentCountMixin
@extend_schema_view(**generate_object_with_permissions_schema(CorrespondentSerializer))
class CorrespondentViewSet(
PermissionsAwareDocumentCountMixin,
ModelViewSet[Correspondent],
):
model = Correspondent
queryset = Correspondent.objects.select_related("owner").order_by(Lower("name"))
serializer_class = CorrespondentSerializer
pagination_class = StandardPagination
permission_classes = (IsAuthenticated, PaperlessObjectPermissions)
filter_backends = (
DjangoFilterBackend,
OrderingFilter,
PermittedObjectsFilter,
)
filterset_class = CorrespondentFilterSet
ordering_fields = (
"name",
"matching_algorithm",
"match",
"document_count",
"last_correspondence",
)
def list(self, request, *args, **kwargs):
if request.query_params.get("last_correspondence", None):
self.queryset = self.queryset.annotate(
last_correspondence=Max(
"documents__created",
filter=self.get_document_count_filter(),
),
)
return super().list(request, *args, **kwargs)
def retrieve(self, request, *args, **kwargs):
self.queryset = self.queryset.annotate(
last_correspondence=Max(
"documents__created",
filter=self.get_document_count_filter(),
),
)
return super().retrieve(request, *args, **kwargs)
@extend_schema_view(**generate_object_with_permissions_schema(TagSerializer))
class TagViewSet(PermissionsAwareDocumentCountMixin, ModelViewSet[Tag]):
model = Tag
serializer_class = TagSerializer
document_count_through = Document.tags.through
document_count_source_field = "tag_id"
queryset = Tag.objects.select_related("owner").order_by(
Lower("name"),
)
pagination_class = StandardPagination
permission_classes = (IsAuthenticated, PaperlessObjectPermissions)
filter_backends = (
DjangoFilterBackend,
OrderingFilter,
PermittedObjectsFilter,
)
filterset_class = TagFilterSet
ordering_fields = ("color", "name", "matching_algorithm", "match", "document_count")
def get_serializer_context(self):
context = super().get_serializer_context()
context["document_count_filter"] = self.get_document_count_filter()
if hasattr(self, "_children_map"):
context["children_map"] = self._children_map
return context
def list(self, request, *args, **kwargs):
"""
Build a children map once to avoid per-parent queries in the serializer.
"""
queryset = self.filter_queryset(self.get_queryset())
ordering = OrderingFilter().get_ordering(request, queryset, self) or (
Lower("name"),
)
queryset = queryset.order_by(*ordering)
all_tags = list(queryset)
descendant_pks = {pk for tag in all_tags for pk in tag.get_descendants_pks()}
if descendant_pks:
user = getattr(getattr(self, "request", None), "user", None)
children_source = list(
annotate_document_count_for_related_queryset(
Tag.objects.filter(
pk__in=descendant_pks | {t.pk for t in all_tags},
)
.filter(pk__in=permitted_object_ids(user, Tag, "view_tag"))
.select_related("owner"),
through_model=self.document_count_through,
related_object_field=self._get_document_count_source_field(),
user=user,
).order_by(*ordering),
)
else:
children_source = all_tags
children_map = {}
for tag in children_source:
children_map.setdefault(tag.tn_parent_id, []).append(tag)
self._children_map = children_map
page = self.paginate_queryset(queryset)
serializer = self.get_serializer(page, many=True)
response = self.get_paginated_response(serializer.data)
response.data["display_count"] = len(children_source)
api_version = int(request.version or settings.REST_FRAMEWORK["DEFAULT_VERSION"])
if descendant_pks and api_version < 10:
# Include children in the "all" field, if needed
response.data["all"] = [tag.pk for tag in children_source]
return response
def perform_update(self, serializer):
old_parent = self.get_object().get_parent()
tag = serializer.save()
new_parent = tag.get_parent()
if new_parent and old_parent != new_parent:
update_document_parent_tags(tag, new_parent)
@extend_schema_view(**generate_object_with_permissions_schema(DocumentTypeSerializer))
class DocumentTypeViewSet(
PermissionsAwareDocumentCountMixin,
ModelViewSet[DocumentType],
):
model = DocumentType
queryset = DocumentType.objects.select_related("owner").order_by(Lower("name"))
serializer_class = DocumentTypeSerializer
pagination_class = StandardPagination
permission_classes = (IsAuthenticated, PaperlessObjectPermissions)
filter_backends = (
DjangoFilterBackend,
OrderingFilter,
PermittedObjectsFilter,
)
filterset_class = DocumentTypeFilterSet
ordering_fields = ("name", "matching_algorithm", "match", "document_count")
@extend_schema_view(
**generate_object_with_permissions_schema(StoragePathSerializer),
test=extend_schema(
operation_id="storage_paths_test",
description="Test a storage path template against a document.",
request=StoragePathTestSerializer,
responses={
(HTTPStatus.OK, "application/json"): OpenApiTypes.STR,
},
),
)
class StoragePathViewSet(PermissionsAwareDocumentCountMixin, ModelViewSet[StoragePath]):
model = StoragePath
queryset = StoragePath.objects.select_related("owner").order_by(
Lower("name"),
)
serializer_class = StoragePathSerializer
pagination_class = StandardPagination
permission_classes = (IsAuthenticated, PaperlessObjectPermissions)
filter_backends = (
DjangoFilterBackend,
OrderingFilter,
PermittedObjectsFilter,
)
filterset_class = StoragePathFilterSet
ordering_fields = ("name", "path", "matching_algorithm", "match", "document_count")
def get_permissions(self):
if self.action == "test":
# Test action does not require object level permissions
self.permission_classes = (IsAuthenticated, ViewDocumentsPermissions)
return super().get_permissions()
def destroy(self, request, *args, **kwargs):
"""
When a storage path is deleted, see if documents
using it require a rename/move
"""
instance = self.get_object()
doc_ids = [doc.id for doc in instance.documents.all()]
# perform the deletion so renaming/moving can happen
response = super().destroy(request, *args, **kwargs)
if doc_ids:
bulk_edit.bulk_update_documents.apply_async(
kwargs={"document_ids": doc_ids},
headers={"trigger_source": PaperlessTask.TriggerSource.SYSTEM},
)
return response
@action(methods=["post"], detail=False)
def test(self, request):
"""
Test storage path against a document
"""
serializer = StoragePathTestSerializer(
data=request.data,
context={"request": request},
)
serializer.is_valid(raise_exception=True)
document = serializer.validated_data.get("document")
path = serializer.validated_data.get("path")
result = format_filename(document, path)
if result:
extension = (
Path(str(document.filename)).suffix if document.filename else ""
) or document.file_type
result_path = Path(result)
result = str(result_path.with_name(f"{result_path.name}{extension}"))
return Response(result)
class CustomFieldViewSet(PermissionsAwareDocumentCountMixin, ModelViewSet[CustomField]):
permission_classes = (IsAuthenticated, PaperlessObjectPermissions)
serializer_class = CustomFieldSerializer
pagination_class = StandardPagination
filter_backends = (
DjangoFilterBackend,
OrderingFilter,
)
filterset_class = CustomFieldFilterSet
model = CustomField
document_count_through = CustomFieldInstance
document_count_source_field = "field_id"
queryset = CustomField.objects.all().order_by("name")
-31
View File
@@ -1,31 +0,0 @@
from drf_spectacular.utils import extend_schema_view
from rest_framework.filters import OrderingFilter
from rest_framework.permissions import IsAuthenticated
from rest_framework.viewsets import ModelViewSet
from documents.filters import PermittedObjectsFilter
from documents.models import SavedView
from documents.permissions import PaperlessObjectPermissions
from documents.schema import generate_object_with_permissions_schema
from documents.serialisers.saved_views import SavedViewSerializer
from paperless.views import StandardPagination
from .base import BulkPermissionMixin
from .base import PassUserMixin
@extend_schema_view(**generate_object_with_permissions_schema(SavedViewSerializer))
class SavedViewViewSet(BulkPermissionMixin, PassUserMixin, ModelViewSet[SavedView]):
model = SavedView
queryset = SavedView.objects.select_related("owner").prefetch_related(
"filter_rules",
)
serializer_class = SavedViewSerializer
pagination_class = StandardPagination
permission_classes = (IsAuthenticated, PaperlessObjectPermissions)
filter_backends = (
OrderingFilter,
PermittedObjectsFilter,
)
ordering_fields = ("name",)
-601
View File
@@ -1,601 +0,0 @@
from typing import Any
from django.contrib.auth.models import Group
from django.contrib.auth.models import User
from django.db.models import Case
from django.db.models import Count
from django.db.models import IntegerField
from django.db.models import Max
from django.db.models import Sum
from django.db.models import When
from django.http import HttpResponseBadRequest
from django.http import HttpResponseForbidden
from drf_spectacular.types import OpenApiTypes
from drf_spectacular.utils import OpenApiParameter
from drf_spectacular.utils import extend_schema
from drf_spectacular.utils import extend_schema_view
from drf_spectacular.utils import inline_serializer
from rest_framework import parsers
from rest_framework import serializers
from rest_framework.generics import GenericAPIView
from rest_framework.permissions import IsAuthenticated
from rest_framework.response import Response
from documents.models import Correspondent
from documents.models import CustomField
from documents.models import Document
from documents.models import DocumentType
from documents.models import SavedView
from documents.models import StoragePath
from documents.models import Tag
from documents.models import Workflow
from documents.permissions import ViewDocumentsPermissions
from documents.permissions import get_objects_for_user_owner_aware
from documents.permissions import has_global_statistics_permission
from documents.permissions import permitted_document_ids
from documents.serialisers.base import DocumentSelectionSerializer
from documents.serialisers.documents import DocumentSerializer
from documents.serialisers.documents import SearchResultSerializer
from documents.serialisers.metadata import CorrespondentSerializer
from documents.serialisers.metadata import CustomFieldSerializer
from documents.serialisers.metadata import DocumentTypeSerializer
from documents.serialisers.metadata import StoragePathSerializer
from documents.serialisers.metadata import TagSerializer
from documents.serialisers.saved_views import SavedViewSerializer
from documents.serialisers.workflows import WorkflowSerializer
from documents.versioning import annotate_effective_content
from paperless.serialisers import GroupSerializer
from paperless.serialisers import UserSerializer
from paperless_mail.models import MailAccount
from paperless_mail.models import MailRule
from paperless_mail.serialisers import MailAccountSerializer
from paperless_mail.serialisers import MailRuleSerializer
from .base import _MAX_QUERY_LENGTH
from .base import DocumentSelectionMixin
from .base import PassUserMixin
@extend_schema_view(
post=extend_schema(
description="Get selection data for the selected documents",
responses={
(200, "application/json"): inline_serializer(
name="SelectionData",
fields={
"selected_correspondents": serializers.ListSerializer(
child=inline_serializer(
name="CorrespondentCounts",
fields={
"id": serializers.IntegerField(),
"document_count": serializers.IntegerField(),
},
),
),
"selected_tags": serializers.ListSerializer(
child=inline_serializer(
name="TagCounts",
fields={
"id": serializers.IntegerField(),
"document_count": serializers.IntegerField(),
},
),
),
"selected_document_types": serializers.ListSerializer(
child=inline_serializer(
name="DocumentTypeCounts",
fields={
"id": serializers.IntegerField(),
"document_count": serializers.IntegerField(),
},
),
),
"selected_storage_paths": serializers.ListSerializer(
child=inline_serializer(
name="StoragePathCounts",
fields={
"id": serializers.IntegerField(),
"document_count": serializers.IntegerField(),
},
),
),
"selected_custom_fields": serializers.ListSerializer(
child=inline_serializer(
name="CustomFieldCounts",
fields={
"id": serializers.IntegerField(),
"document_count": serializers.IntegerField(),
},
),
),
},
),
},
),
)
class SelectionDataView(DocumentSelectionMixin, GenericAPIView[Any]):
permission_classes = (IsAuthenticated, ViewDocumentsPermissions)
serializer_class = DocumentSelectionSerializer
parser_classes = (parsers.MultiPartParser, parsers.JSONParser)
def post(self, request, format=None):
serializer = self.get_serializer(data=request.data)
serializer.is_valid(raise_exception=True)
ids = self._resolve_document_ids(
user=request.user,
validated_data=serializer.validated_data,
)
permitted_documents = Document.objects.filter(
id__in=permitted_document_ids(request.user),
)
if permitted_documents.filter(pk__in=ids).count() != len(ids):
return HttpResponseForbidden("Insufficient permissions")
correspondents = Correspondent.objects.annotate(
document_count=Count(
Case(When(documents__id__in=ids, then=1), output_field=IntegerField()),
),
)
tags = Tag.objects.annotate(
document_count=Count(
Case(When(documents__id__in=ids, then=1), output_field=IntegerField()),
),
)
types = DocumentType.objects.annotate(
document_count=Count(
Case(When(documents__id__in=ids, then=1), output_field=IntegerField()),
),
)
storage_paths = StoragePath.objects.annotate(
document_count=Count(
Case(When(documents__id__in=ids, then=1), output_field=IntegerField()),
),
)
custom_fields = CustomField.objects.annotate(
document_count=Count(
Case(
When(
fields__document__id__in=ids,
then=1,
),
output_field=IntegerField(),
),
),
)
r = Response(
{
"selected_correspondents": [
{"id": t.id, "document_count": t.document_count}
for t in correspondents
],
"selected_tags": [
{"id": t.id, "document_count": t.document_count} for t in tags
],
"selected_document_types": [
{"id": t.id, "document_count": t.document_count} for t in types
],
"selected_storage_paths": [
{"id": t.id, "document_count": t.document_count}
for t in storage_paths
],
"selected_custom_fields": [
{"id": t.id, "document_count": t.document_count}
for t in custom_fields
],
},
)
return r
@extend_schema_view(
get=extend_schema(
description="Get a list of all available tags",
parameters=[
OpenApiParameter(
name="term",
required=False,
type=str,
description="Term to search for",
),
OpenApiParameter(
name="limit",
required=False,
type=int,
description="Number of completions to return",
),
],
responses={
(200, "application/json"): serializers.ListSerializer(
child=serializers.CharField(),
),
},
),
)
class SearchAutoCompleteView(GenericAPIView[Any]):
permission_classes = (IsAuthenticated, ViewDocumentsPermissions)
def get(self, request, format=None):
user = self.request.user if hasattr(self.request, "user") else None
if "term" in request.query_params:
term = request.query_params["term"].strip()
else:
return HttpResponseBadRequest("Term required")
if "limit" in request.query_params:
limit = int(request.query_params["limit"])
if limit <= 0:
return HttpResponseBadRequest("Invalid limit")
else:
limit = 10
from documents.search import get_backend
return Response(get_backend().autocomplete(term, limit, user))
@extend_schema_view(
get=extend_schema(
description="Global search",
parameters=[
OpenApiParameter(
name="query",
required=True,
type=str,
description="Query to search for",
),
OpenApiParameter(
name="db_only",
required=False,
type=bool,
description="Search only the database",
),
],
responses={
(200, "application/json"): inline_serializer(
name="SearchResult",
fields={
"total": serializers.IntegerField(),
"documents": DocumentSerializer(many=True),
"saved_views": SavedViewSerializer(many=True),
"tags": TagSerializer(many=True),
"correspondents": CorrespondentSerializer(many=True),
"document_types": DocumentTypeSerializer(many=True),
"storage_paths": StoragePathSerializer(many=True),
"users": UserSerializer(many=True),
"groups": GroupSerializer(many=True),
"mail_rules": MailRuleSerializer(many=True),
"mail_accounts": MailAccountSerializer(many=True),
"workflows": WorkflowSerializer(many=True),
"custom_fields": CustomFieldSerializer(many=True),
},
),
},
),
)
class GlobalSearchView(PassUserMixin):
permission_classes = (IsAuthenticated,)
serializer_class = SearchResultSerializer
def get(self, request, *args, **kwargs):
from documents.search import SearchMode
from documents.search import get_backend
query = request.query_params.get("query", None)
if query is None:
return HttpResponseBadRequest("Query required")
if len(query) < 3:
return HttpResponseBadRequest("Query must be at least 3 characters")
if len(query) > _MAX_QUERY_LENGTH:
return HttpResponseBadRequest(
f"Query must be at most {_MAX_QUERY_LENGTH} characters",
)
db_only = request.query_params.get("db_only", False)
OBJECT_LIMIT = 3
docs = []
if request.user.has_perm("documents.view_document"):
# Never more than OBJECT_LIMIT rows come back here, so annotating
# is cheap -- and without it these results show the root
# document's superseded content.
all_docs = annotate_effective_content(
Document.objects.filter(
id__in=permitted_document_ids(request.user),
),
)
if db_only:
docs = all_docs.filter(title__icontains=query)[:OBJECT_LIMIT]
else:
user = None if request.user.is_superuser else request.user
matching_ids = get_backend().search_ids(
query,
user=user,
search_mode=SearchMode.TEXT,
limit=OBJECT_LIMIT * 3,
)
docs_by_id = all_docs.in_bulk(matching_ids)
docs = [
docs_by_id[doc_id]
for doc_id in matching_ids
if doc_id in docs_by_id
][:OBJECT_LIMIT]
saved_views = (
get_objects_for_user_owner_aware(
request.user,
"view_savedview",
SavedView,
).filter(name__icontains=query)
if request.user.has_perm("documents.view_savedview")
else []
)
saved_views = saved_views[:OBJECT_LIMIT]
tags = (
get_objects_for_user_owner_aware(request.user, "view_tag", Tag).filter(
name__icontains=query,
)
if request.user.has_perm("documents.view_tag")
else []
)
tags = tags[:OBJECT_LIMIT]
correspondents = (
get_objects_for_user_owner_aware(
request.user,
"view_correspondent",
Correspondent,
).filter(name__icontains=query)
if request.user.has_perm("documents.view_correspondent")
else []
)
correspondents = correspondents[:OBJECT_LIMIT]
document_types = (
get_objects_for_user_owner_aware(
request.user,
"view_documenttype",
DocumentType,
).filter(name__icontains=query)
if request.user.has_perm("documents.view_documenttype")
else []
)
document_types = document_types[:OBJECT_LIMIT]
storage_paths = (
get_objects_for_user_owner_aware(
request.user,
"view_storagepath",
StoragePath,
).filter(name__icontains=query)
if request.user.has_perm("documents.view_storagepath")
else []
)
storage_paths = storage_paths[:OBJECT_LIMIT]
users = (
User.objects.filter(username__icontains=query)
if request.user.has_perm("auth.view_user")
else []
)
users = users[:OBJECT_LIMIT]
groups = (
Group.objects.filter(name__icontains=query)
if request.user.has_perm("auth.view_group")
else []
)
groups = groups[:OBJECT_LIMIT]
mail_rules = (
get_objects_for_user_owner_aware(
request.user,
"view_mailrule",
MailRule,
).filter(name__icontains=query)
if request.user.has_perm("paperless_mail.view_mailrule")
else []
)
mail_rules = mail_rules[:OBJECT_LIMIT]
mail_accounts = (
get_objects_for_user_owner_aware(
request.user,
"view_mailaccount",
MailAccount,
).filter(name__icontains=query)
if request.user.has_perm("paperless_mail.view_mailaccount")
else []
)
mail_accounts = mail_accounts[:OBJECT_LIMIT]
workflows = (
Workflow.objects.filter(name__icontains=query)
if request.user.has_perm("documents.view_workflow")
else []
)
workflows = workflows[:OBJECT_LIMIT]
custom_fields = (
CustomField.objects.filter(name__icontains=query)
if request.user.has_perm("documents.view_customfield")
else []
)
custom_fields = custom_fields[:OBJECT_LIMIT]
context = {
"request": request,
}
docs_serializer = DocumentSerializer(docs, many=True, context=context)
saved_views_serializer = SavedViewSerializer(
saved_views,
many=True,
context=context,
)
tags_serializer = TagSerializer(tags, many=True, context=context)
correspondents_serializer = CorrespondentSerializer(
correspondents,
many=True,
context=context,
)
document_types_serializer = DocumentTypeSerializer(
document_types,
many=True,
context=context,
)
storage_paths_serializer = StoragePathSerializer(
storage_paths,
many=True,
context=context,
)
users_serializer = UserSerializer(users, many=True, context=context)
groups_serializer = GroupSerializer(groups, many=True, context=context)
mail_rules_serializer = MailRuleSerializer(
mail_rules,
many=True,
context=context,
)
mail_accounts_serializer = MailAccountSerializer(
mail_accounts,
many=True,
context=context,
)
workflows_serializer = WorkflowSerializer(workflows, many=True, context=context)
custom_fields_serializer = CustomFieldSerializer(
custom_fields,
many=True,
context=context,
)
return Response(
{
"total": len(docs)
+ len(saved_views)
+ len(tags)
+ len(correspondents)
+ len(document_types)
+ len(storage_paths)
+ len(users)
+ len(groups)
+ len(mail_rules)
+ len(mail_accounts)
+ len(workflows)
+ len(custom_fields),
"documents": docs_serializer.data,
"saved_views": saved_views_serializer.data,
"tags": tags_serializer.data,
"correspondents": correspondents_serializer.data,
"document_types": document_types_serializer.data,
"storage_paths": storage_paths_serializer.data,
"users": users_serializer.data,
"groups": groups_serializer.data,
"mail_rules": mail_rules_serializer.data,
"mail_accounts": mail_accounts_serializer.data,
"workflows": workflows_serializer.data,
"custom_fields": custom_fields_serializer.data,
},
)
@extend_schema_view(
get=extend_schema(
description="Get statistics for the current user",
responses={
(200, "application/json"): OpenApiTypes.OBJECT,
},
),
)
class StatisticsView(GenericAPIView[Any]):
permission_classes = (IsAuthenticated,)
def get(self, request, format=None):
user = request.user if request.user is not None else None
can_view_global_stats = has_global_statistics_permission(user) or user is None
documents = (
Document.objects.all()
if can_view_global_stats
else Document.objects.filter(id__in=permitted_document_ids(user))
).filter(root_document__isnull=True)
tags = (
Tag.objects.all()
if can_view_global_stats
else get_objects_for_user_owner_aware(user, "documents.view_tag", Tag)
).only("id", "is_inbox_tag")
correspondent_count = (
Correspondent.objects.count()
if can_view_global_stats
else get_objects_for_user_owner_aware(
user,
"documents.view_correspondent",
Correspondent,
).count()
)
document_type_count = (
DocumentType.objects.count()
if can_view_global_stats
else get_objects_for_user_owner_aware(
user,
"documents.view_documenttype",
DocumentType,
).count()
)
storage_path_count = (
StoragePath.objects.count()
if can_view_global_stats
else get_objects_for_user_owner_aware(
user,
"documents.view_storagepath",
StoragePath,
).count()
)
inbox_tag_pks = list(
tags.filter(is_inbox_tag=True).values_list("pk", flat=True),
)
documents_inbox = (
documents.filter(tags__id__in=inbox_tag_pks).values("id").distinct().count()
if inbox_tag_pks
else None
)
# Single SQL request for document stats and mime type counts
mime_type_stats = list(
documents.values("mime_type")
.annotate(
mime_type_count=Count("id"),
mime_type_chars=Sum("content_length"),
)
.order_by("-mime_type_count"),
)
# Calculate totals from grouped results
documents_total = sum(row["mime_type_count"] for row in mime_type_stats)
character_count = sum(row["mime_type_chars"] or 0 for row in mime_type_stats)
document_file_type_counts = [
{"mime_type": row["mime_type"], "mime_type_count": row["mime_type_count"]}
for row in mime_type_stats
]
current_asn = Document.objects.aggregate(
Max("archive_serial_number", default=0),
).get(
"archive_serial_number__max",
)
return Response(
{
"documents_total": documents_total,
"documents_inbox": documents_inbox,
"inbox_tag": (
inbox_tag_pks[0] if inbox_tag_pks else None
), # backwards compatibility
"inbox_tags": (inbox_tag_pks or None),
"document_file_type_counts": document_file_type_counts,
"character_count": character_count,
"tag_count": len(tags),
"correspondent_count": correspondent_count,
"document_type_count": document_type_count,
"storage_path_count": storage_path_count,
"current_asn": current_asn,
},
)
-291
View File
@@ -1,291 +0,0 @@
from http import HTTPStatus
from unicodedata import normalize
from urllib.parse import quote
from django.db.models import Count
from django.http import FileResponse
from django.http import HttpResponse
from django.http import HttpResponseRedirect
from django.utils import timezone
from django.utils.translation import gettext_lazy as _
from django.views import View
from django_filters.rest_framework import DjangoFilterBackend
from drf_spectacular.utils import extend_schema
from drf_spectacular.utils import extend_schema_view
from drf_spectacular.utils import inline_serializer
from rest_framework import serializers
from rest_framework import status
from rest_framework.decorators import action
from rest_framework.exceptions import ValidationError
from rest_framework.filters import OrderingFilter
from rest_framework.mixins import CreateModelMixin
from rest_framework.mixins import DestroyModelMixin
from rest_framework.mixins import ListModelMixin
from rest_framework.mixins import RetrieveModelMixin
from rest_framework.permissions import IsAuthenticated
from rest_framework.response import Response
from rest_framework.viewsets import GenericViewSet
from rest_framework.viewsets import ModelViewSet
from documents.filters import PermittedObjectsFilter
from documents.filters import ShareLinkBundleFilterSet
from documents.filters import ShareLinkFilterSet
from documents.models import Document
from documents.models import PaperlessTask
from documents.models import ShareLink
from documents.models import ShareLinkBundle
from documents.permissions import PaperlessObjectPermissions
from documents.permissions import ViewDocumentsPermissions
from documents.permissions import permitted_document_ids
from documents.serialisers.sharing import ShareLinkBundleSerializer
from documents.serialisers.sharing import ShareLinkSerializer
from documents.tasks import build_share_link_bundle
from paperless.views import StandardPagination
from .base import PassUserMixin
from .base import serve_file
class ShareLinkViewSet(
PassUserMixin,
CreateModelMixin,
RetrieveModelMixin,
DestroyModelMixin,
ListModelMixin,
GenericViewSet,
):
model = ShareLink
queryset = ShareLink.objects.select_related("document")
serializer_class = ShareLinkSerializer
pagination_class = StandardPagination
permission_classes = (IsAuthenticated, PaperlessObjectPermissions)
filter_backends = (
DjangoFilterBackend,
OrderingFilter,
PermittedObjectsFilter,
)
filterset_class = ShareLinkFilterSet
ordering_fields = ("created", "expiration", "document__title")
@extend_schema_view(
rebuild=extend_schema(
operation_id="share_link_bundles_rebuild",
description="Reset and re-queue a share link bundle for processing.",
responses={
HTTPStatus.OK: ShareLinkBundleSerializer,
(HTTPStatus.BAD_REQUEST, "application/json"): inline_serializer(
name="RebuildBundleError",
fields={"detail": serializers.CharField()},
),
},
),
)
class ShareLinkBundleViewSet(PassUserMixin, ModelViewSet[ShareLinkBundle]):
model = ShareLinkBundle
# Bundles are immutable once created; rebuild via the dedicated action
# rather than PUT/PATCH.
http_method_names = ["get", "post", "delete", "head", "options"]
queryset = ShareLinkBundle.objects.all()
serializer_class = ShareLinkBundleSerializer
pagination_class = StandardPagination
permission_classes = (IsAuthenticated, PaperlessObjectPermissions)
filter_backends = (
DjangoFilterBackend,
OrderingFilter,
PermittedObjectsFilter,
)
filterset_class = ShareLinkBundleFilterSet
ordering_fields = ("created", "expiration", "status")
def get_permissions(self):
permissions = super().get_permissions()
if self.action == "create":
permissions.append(ViewDocumentsPermissions())
return permissions
def get_queryset(self):
return (
super()
.get_queryset()
.prefetch_related("documents")
.annotate(document_total=Count("documents", distinct=True))
)
def create(self, request, *args, **kwargs):
serializer = self.get_serializer(data=request.data)
serializer.is_valid(raise_exception=True)
document_ids = serializer.validated_data["document_ids"]
documents_qs = Document.objects.filter(pk__in=document_ids).select_related(
"owner",
)
found_ids = set(documents_qs.values_list("pk", flat=True))
missing = sorted(set(document_ids) - found_ids)
if missing:
raise ValidationError(
{
"document_ids": _(
"Documents not found: %(ids)s",
)
% {"ids": ", ".join(str(item) for item in missing)},
},
)
documents = list(documents_qs)
permitted_ids = set(permitted_document_ids(request.user))
for document in documents:
if document.pk not in permitted_ids:
raise ValidationError(
{
"document_ids": _(
"Insufficient permissions to share document %(id)s.",
)
% {"id": document.pk},
},
)
document_map = {document.pk: document for document in documents}
ordered_documents = [document_map[doc_id] for doc_id in document_ids]
bundle = serializer.save(
owner=request.user,
documents=ordered_documents,
)
bundle.remove_file()
bundle.status = ShareLinkBundle.Status.PENDING
bundle.last_error = None
bundle.size_bytes = None
bundle.built_at = None
bundle.file_path = ""
bundle.save(
update_fields=[
"status",
"last_error",
"size_bytes",
"built_at",
"file_path",
],
)
build_share_link_bundle.apply_async(
kwargs={"bundle_id": bundle.pk},
headers={"trigger_source": PaperlessTask.TriggerSource.MANUAL},
)
bundle.document_total = len(ordered_documents)
response_serializer = self.get_serializer(bundle)
headers = self.get_success_headers(response_serializer.data)
return Response(
response_serializer.data,
status=status.HTTP_201_CREATED,
headers=headers,
)
@action(detail=True, methods=["post"])
def rebuild(self, request, pk=None):
bundle = self.get_object()
if bundle.status == ShareLinkBundle.Status.PROCESSING:
return Response(
{"detail": _("Bundle is already being processed.")},
status=status.HTTP_400_BAD_REQUEST,
)
bundle.remove_file()
bundle.status = ShareLinkBundle.Status.PENDING
bundle.last_error = None
bundle.size_bytes = None
bundle.built_at = None
bundle.file_path = ""
bundle.save(
update_fields=[
"status",
"last_error",
"size_bytes",
"built_at",
"file_path",
],
)
build_share_link_bundle.apply_async(
kwargs={"bundle_id": bundle.pk},
headers={"trigger_source": PaperlessTask.TriggerSource.MANUAL},
)
bundle.document_total = (
getattr(bundle, "document_total", None) or bundle.documents.count()
)
serializer = self.get_serializer(bundle)
return Response(serializer.data)
class SharedLinkView(View):
authentication_classes = []
permission_classes = []
def get(self, request, slug):
share_link = ShareLink.objects.filter(slug=slug).first()
if share_link is not None:
if (
share_link.expiration is not None
and share_link.expiration < timezone.now()
):
return HttpResponseRedirect("/accounts/login/?sharelink_expired=1")
try:
return serve_file(
doc=share_link.document,
use_archive=share_link.file_version == ShareLink.FileVersion.ARCHIVE
and share_link.document.has_archive_version,
disposition="inline",
)
except FileNotFoundError:
return HttpResponseRedirect("/accounts/login/?sharelink_notfound=1")
bundle = ShareLinkBundle.objects.filter(slug=slug).first()
if bundle is None:
return HttpResponseRedirect("/accounts/login/?sharelink_notfound=1")
if bundle.expiration is not None and bundle.expiration < timezone.now():
return HttpResponseRedirect("/accounts/login/?sharelink_expired=1")
if bundle.status in {
ShareLinkBundle.Status.PENDING,
ShareLinkBundle.Status.PROCESSING,
}:
return HttpResponse(
_(
"The share link bundle is still being prepared. Please try again later.",
),
status=status.HTTP_202_ACCEPTED,
)
file_path = bundle.absolute_file_path
if (
bundle.status == ShareLinkBundle.Status.FAILED
or file_path is None
or not file_path.exists()
):
return HttpResponse(
_(
"The share link bundle is unavailable.",
),
status=status.HTTP_503_SERVICE_UNAVAILABLE,
)
response = FileResponse(file_path.open("rb"), content_type="application/zip")
short_slug = bundle.slug[:12]
download_name = f"paperless-share-{short_slug}.zip"
filename_normalized = (
normalize("NFKD", download_name)
.encode(
"ascii",
"ignore",
)
.decode("ascii")
)
filename_encoded = quote(download_name)
response["Content-Disposition"] = (
f"attachment; filename='{filename_normalized}'; "
f"filename*=utf-8''{filename_encoded}"
)
return response
-611
View File
@@ -1,611 +0,0 @@
import logging
import os
import platform
import re
from datetime import datetime
from datetime import timedelta
from time import sleep
from typing import Any
from urllib.parse import urlparse
import httpx
from django.conf import settings
from django.contrib.auth.models import User
from django.core.cache import cache
from django.db import connections
from django.db.migrations.loader import MigrationLoader
from django.db.migrations.recorder import MigrationRecorder
from django.db.models import Count
from django.db.models import Q
from django.http import HttpResponse
from django.http import HttpResponseForbidden
from django.utils import timezone
from django.utils.timezone import make_aware
from drf_spectacular.types import OpenApiTypes
from drf_spectacular.utils import extend_schema
from drf_spectacular.utils import extend_schema_view
from drf_spectacular.utils import inline_serializer
from packaging import version as packaging_version
from redis import Redis
from rest_framework import serializers
from rest_framework.exceptions import ValidationError
from rest_framework.generics import GenericAPIView
from rest_framework.mixins import ListModelMixin
from rest_framework.permissions import IsAuthenticated
from rest_framework.request import Request
from rest_framework.response import Response
from documents.filters import PermittedObjectsFilter
from documents.models import Document
from documents.models import PaperlessTask
from documents.models import UiSettings
from documents.permissions import PaperlessObjectPermissions
from documents.permissions import TrashPermissions
from documents.permissions import has_system_status_permission
from documents.permissions import permitted_document_ids
from documents.serialisers.documents import DocumentSerializer
from documents.serialisers.system import TrashSerializer
from documents.serialisers.system import UiSettingsViewSerializer
from documents.tasks import empty_trash
from paperless import version
from paperless.celery import app as celery_app
from paperless.config import AIConfig
from paperless.config import GeneralConfig
from paperless.config import RemoteOCRConfig
from paperless.parsers.remote import RemoteEngineConfig
from paperless.views import StandardPagination
from paperless_mail.oauth import PaperlessMailOAuth2Manager
from .base import PassUserMixin
logger = logging.getLogger("paperless.api")
class UiSettingsView(GenericAPIView[Any]):
queryset = UiSettings.objects.all()
permission_classes = (IsAuthenticated, PaperlessObjectPermissions)
serializer_class = UiSettingsViewSerializer
def get(self, request, format=None):
serializer = self.get_serializer(data=request.data)
serializer.is_valid(raise_exception=True)
user = User.objects.select_related("ui_settings").get(pk=request.user.id)
ui_settings = {}
if hasattr(user, "ui_settings"):
ui_settings = user.ui_settings.settings
if "update_checking" in ui_settings:
ui_settings["update_checking"]["backend_setting"] = (
settings.ENABLE_UPDATE_CHECK
)
else:
ui_settings["update_checking"] = {
"backend_setting": settings.ENABLE_UPDATE_CHECK,
}
ui_settings["trash_delay"] = settings.EMPTY_TRASH_DELAY
general_config = GeneralConfig()
ui_settings["version"] = version.__full_version_str__
ui_settings["app_title"] = settings.APP_TITLE
if general_config.app_title is not None and len(general_config.app_title) > 0:
ui_settings["app_title"] = general_config.app_title
ui_settings["app_logo"] = settings.APP_LOGO
if general_config.app_logo is not None and len(general_config.app_logo) > 0:
ui_settings["app_logo"] = general_config.app_logo
ui_settings["auditlog_enabled"] = settings.AUDIT_LOG_ENABLED
ui_settings["remote_ocr"] = {
"configured": RemoteEngineConfig.from_app_config().engine_is_valid(),
"mode": RemoteOCRConfig().remote_ocr_mode,
}
if settings.GMAIL_OAUTH_ENABLED or settings.OUTLOOK_OAUTH_ENABLED:
manager = PaperlessMailOAuth2Manager()
if settings.GMAIL_OAUTH_ENABLED:
ui_settings["gmail_oauth_url"] = manager.get_gmail_authorization_url()
request.session["oauth_state"] = manager.state
if settings.OUTLOOK_OAUTH_ENABLED:
ui_settings["outlook_oauth_url"] = (
manager.get_outlook_authorization_url()
)
request.session["oauth_state"] = manager.state
ui_settings["email_enabled"] = settings.EMAIL_ENABLED
ai_config = AIConfig()
ui_settings["ai_enabled"] = ai_config.ai_enabled
user_resp = {
"id": user.id,
"username": user.username,
"is_staff": user.is_staff,
"is_superuser": user.is_superuser,
"groups": list(user.groups.values_list("id", flat=True)),
}
if len(user.first_name) > 0:
user_resp["first_name"] = user.first_name
if len(user.last_name) > 0:
user_resp["last_name"] = user.last_name
# strip <app_label>.
roles = map(lambda perm: re.sub(r"^\w+.", "", perm), user.get_all_permissions())
return Response(
{
"user": user_resp,
"settings": ui_settings,
"permissions": roles,
},
)
def post(self, request, format=None):
serializer = self.get_serializer(data=request.data)
serializer.is_valid(raise_exception=True)
serializer.save(user=self.request.user)
return Response(
{
"success": True,
},
)
@extend_schema_view(
get=extend_schema(
description="Get the current version of the Paperless-NGX server",
responses={
(200, "application/json"): OpenApiTypes.OBJECT,
},
),
)
class RemoteVersionView(GenericAPIView[Any]):
cache_key = "remote_version_view_latest_release"
def get(self, request, format=None):
current_version = packaging_version.parse(version.__full_version_str__)
remote_version = cache.get(self.cache_key)
if remote_version is None:
try:
resp = httpx.get(
"https://api.github.com/repos/paperless-ngx/paperless-ngx/releases/latest",
headers={"Accept": "application/json"},
)
resp.raise_for_status()
data = resp.json()
remote_version = data["tag_name"]
# Some early tags used ngx-x.y.z
remote_version = remote_version.removeprefix("ngx-")
except ValueError as e:
logger.debug(f"An error occurred parsing remote version json: {e}")
except httpx.HTTPError as e:
logger.debug(f"An error occurred checking for available updates: {e}")
if remote_version:
cache.set(self.cache_key, remote_version, 60 * 15)
else:
remote_version = "0.0.0"
is_greater_than_current = (
packaging_version.parse(remote_version) > current_version
)
return Response(
{
"version": remote_version,
"update_available": is_greater_than_current,
},
)
@extend_schema_view(
get=extend_schema(
description="Get the current system status of the Paperless-NGX server",
responses={
(200, "application/json"): inline_serializer(
name="SystemStatus",
fields={
"pngx_version": serializers.CharField(),
"server_os": serializers.CharField(),
"install_type": serializers.CharField(),
"storage": inline_serializer(
name="Storage",
fields={
"total": serializers.IntegerField(),
"available": serializers.IntegerField(),
},
),
"database": inline_serializer(
name="Database",
fields={
"type": serializers.CharField(),
"url": serializers.CharField(),
"status": serializers.CharField(),
"error": serializers.CharField(),
"migration_status": inline_serializer(
name="MigrationStatus",
fields={
"latest_migration": serializers.CharField(),
"unapplied_migrations": serializers.ListSerializer(
child=serializers.CharField(),
),
},
),
},
),
"tasks": inline_serializer(
name="Tasks",
fields={
"redis_url": serializers.CharField(),
"redis_status": serializers.CharField(),
"redis_error": serializers.CharField(),
"celery_status": serializers.CharField(),
"summary": inline_serializer(
name="TasksSummaryOverview",
fields={
"days": serializers.IntegerField(),
"total_count": serializers.IntegerField(),
"pending_count": serializers.IntegerField(),
"success_count": serializers.IntegerField(),
"failure_count": serializers.IntegerField(),
},
),
},
),
"index": inline_serializer(
name="Index",
fields={
"status": serializers.CharField(),
"error": serializers.CharField(),
"last_modified": serializers.DateTimeField(),
},
),
"classifier": inline_serializer(
name="Classifier",
fields={
"status": serializers.CharField(),
"error": serializers.CharField(),
"last_trained": serializers.DateTimeField(),
},
),
"sanity_check": inline_serializer(
name="SanityCheck",
fields={
"status": serializers.CharField(),
"error": serializers.CharField(),
"last_run": serializers.DateTimeField(),
},
),
},
),
},
),
)
class SystemStatusView(PassUserMixin):
permission_classes = (IsAuthenticated,)
TASK_SUMMARY_DAYS = 30
def get(self, request, format=None):
if not has_system_status_permission(request.user):
return HttpResponseForbidden("Insufficient permissions")
current_version = version.__full_version_str__
install_type = "bare-metal"
if os.environ.get("KUBERNETES_SERVICE_HOST") is not None:
install_type = "kubernetes"
elif os.environ.get("PNGX_CONTAINERIZED") == "1":
install_type = "docker"
db_conn = connections["default"]
db_url = str(db_conn.settings_dict["NAME"])
db_error = None
try:
db_conn.ensure_connection()
db_status = "OK"
loader = MigrationLoader(connection=db_conn)
all_migrations = [f"{app}.{name}" for app, name in loader.graph.nodes]
applied_migrations = [
f"{m.app}.{m.name}"
for m in MigrationRecorder.Migration.objects.all().order_by("id")
]
except Exception as e: # pragma: no cover
applied_migrations = []
db_status = "ERROR"
logger.exception(
f"System status detected a possible problem while connecting to the database: {e}",
)
db_error = "Error connecting to database, check logs for more detail."
media_stats = os.statvfs(settings.MEDIA_ROOT)
redis_url = settings._CHANNELS_REDIS_URL
redis_url_parsed = urlparse(redis_url)
redis_constructed_url = f"{redis_url_parsed.scheme}://{redis_url_parsed.path or redis_url_parsed.hostname}"
if redis_url_parsed.hostname is not None:
redis_constructed_url += f":{redis_url_parsed.port}"
redis_error = None
with Redis.from_url(url=redis_url) as client:
try:
client.ping()
redis_status = "OK"
except Exception as e:
redis_status = "ERROR"
logger.exception(
f"System status detected a possible problem while connecting to redis: {e}",
)
redis_error = "Error connecting to redis, check logs for more detail."
celery_error = None
celery_url = None
try:
celery_ping = None
for ping_attempt in range(3):
celery_ping = celery_app.control.inspect().ping()
if celery_ping:
break
if ping_attempt < 2:
sleep(0.25)
if not celery_ping:
celery_active = "WARNING"
celery_error = (
"No celery workers responded to ping. This may be temporary."
)
else:
celery_url, first_worker_ping = next(iter(celery_ping.items()))
if (
isinstance(first_worker_ping, dict)
and first_worker_ping.get("ok") == "pong"
):
celery_active = "OK"
else:
celery_active = "WARNING"
celery_error = "Celery worker responded unexpectedly."
except Exception as e:
celery_active = "ERROR"
logger.exception(
f"System status detected a possible problem while connecting to celery: {e}",
)
celery_error = "Error connecting to celery, check logs for more detail."
index_error = None
try:
from documents.search import get_backend
get_backend() # triggers open/rebuild; raises on error
index_status = "OK"
# Use the most-recently modified file in the index directory as a proxy
# for last index write time (Tantivy has no single last_modified() call).
index_dir = settings.INDEX_DIR
mtimes = [p.stat().st_mtime for p in index_dir.iterdir() if p.is_file()]
index_last_modified = (
make_aware(datetime.fromtimestamp(max(mtimes))) if mtimes else None
)
except Exception as e:
index_status = "ERROR"
index_error = "Error opening index, check logs for more detail."
logger.exception(
f"System status detected a possible problem while opening the index: {e}",
)
index_last_modified = None
last_trained_task = (
PaperlessTask.objects.filter(
task_type=PaperlessTask.TaskType.TRAIN_CLASSIFIER,
status__in=PaperlessTask.COMPLETE_STATUSES, # ignore running tasks
)
.order_by("-date_done")
.first()
)
classifier_status = "OK"
classifier_error = None
if last_trained_task is None:
classifier_status = "WARNING"
classifier_error = "No classifier training tasks found"
elif last_trained_task.status != PaperlessTask.Status.SUCCESS:
classifier_status = "ERROR"
classifier_error = (
last_trained_task.result_data.get("error_message")
if last_trained_task.result_data
else None
)
classifier_last_trained = (
last_trained_task.date_done if last_trained_task else None
)
last_sanity_check = (
PaperlessTask.objects.filter(
task_type=PaperlessTask.TaskType.SANITY_CHECK,
status__in=PaperlessTask.COMPLETE_STATUSES, # ignore running tasks
)
.order_by("-date_done")
.first()
)
sanity_check_status = "OK"
sanity_check_error = None
if last_sanity_check is None:
sanity_check_status = "WARNING"
sanity_check_error = "No sanity check tasks found"
elif last_sanity_check.status != PaperlessTask.Status.SUCCESS:
sanity_check_status = "ERROR"
sanity_check_error = (
last_sanity_check.result_data.get("error_message")
if last_sanity_check.result_data
else None
)
sanity_check_last_run = (
last_sanity_check.date_done if last_sanity_check else None
)
ai_config = AIConfig()
if not ai_config.llm_index_enabled:
llmindex_status = "DISABLED"
llmindex_error = None
llmindex_last_modified = None
else:
last_llmindex_update = (
PaperlessTask.objects.filter(
task_type=PaperlessTask.TaskType.LLM_INDEX,
)
.order_by("-date_done")
.first()
)
llmindex_status = "OK"
llmindex_error = None
if last_llmindex_update is None:
llmindex_status = "WARNING"
llmindex_error = "No LLM index update tasks found"
elif last_llmindex_update.status == PaperlessTask.Status.FAILURE:
llmindex_status = "ERROR"
llmindex_error = (
last_llmindex_update.result_data.get("error_message")
if last_llmindex_update.result_data
else None
)
llmindex_last_modified = (
last_llmindex_update.date_done if last_llmindex_update else None
)
summary_cutoff = timezone.now() - timedelta(days=self.TASK_SUMMARY_DAYS)
task_summary_agg = PaperlessTask.objects.filter(
date_created__gte=summary_cutoff,
).aggregate(
total_count=Count("id"),
pending_count=Count(
"id",
filter=Q(status=PaperlessTask.Status.PENDING),
),
success_count=Count(
"id",
filter=Q(status=PaperlessTask.Status.SUCCESS),
),
failure_count=Count(
"id",
filter=Q(status=PaperlessTask.Status.FAILURE),
),
)
task_summary = {
"days": self.TASK_SUMMARY_DAYS,
**task_summary_agg,
}
return Response(
{
"pngx_version": current_version,
"server_os": platform.platform(),
"install_type": install_type,
"storage": {
"total": media_stats.f_frsize * media_stats.f_blocks,
"available": media_stats.f_frsize * media_stats.f_bavail,
},
"database": {
"type": db_conn.vendor,
"url": db_url,
"status": db_status,
"error": db_error,
"migration_status": {
"latest_migration": applied_migrations[-1],
"unapplied_migrations": [
m for m in all_migrations if m not in applied_migrations
],
},
},
"tasks": {
"redis_url": redis_constructed_url,
"redis_status": redis_status,
"redis_error": redis_error,
"celery_status": celery_active,
"celery_url": celery_url,
"celery_error": celery_error,
"index_status": index_status,
"index_last_modified": index_last_modified,
"index_error": index_error,
"classifier_status": classifier_status,
"classifier_last_trained": classifier_last_trained,
"classifier_error": classifier_error,
"sanity_check_status": sanity_check_status,
"sanity_check_last_run": sanity_check_last_run,
"sanity_check_error": sanity_check_error,
"llmindex_status": llmindex_status,
"llmindex_last_modified": llmindex_last_modified,
"llmindex_error": llmindex_error,
"summary": task_summary,
},
},
)
class TrashView(ListModelMixin, PassUserMixin):
permission_classes = (IsAuthenticated, TrashPermissions)
serializer_class = TrashSerializer
class _TrashPermittedObjectsFilter(PermittedObjectsFilter):
include_granted = False
filter_backends = (_TrashPermittedObjectsFilter,)
pagination_class = StandardPagination
model = Document
# A version is listed separately only when its root is not in the trash.
queryset = Document.deleted_objects.exclude(
root_document_id__in=Document.deleted_objects.values("id"),
)
def get(self, request: Request, format: str | None = None) -> Response:
self.serializer_class = DocumentSerializer
return self.list(request, format)
def post(
self,
request: Request,
*args: Any,
**kwargs: Any,
) -> Response | HttpResponse:
serializer = self.get_serializer(data=request.data)
serializer.is_valid(raise_exception=True)
doc_ids = serializer.validated_data.get("documents")
docs = (
Document.global_objects.filter(id__in=doc_ids)
if doc_ids is not None
else self.filter_queryset(self.get_queryset()).all()
)
if docs.exclude(
pk__in=permitted_document_ids(
request.user,
perm="delete_document",
include_deleted=True,
),
).exists():
return HttpResponseForbidden("Insufficient permissions")
action = serializer.validated_data.get("action")
if action == "restore":
restored = list(self.get_queryset().filter(id__in=doc_ids))
if len(restored) != len(doc_ids):
raise ValidationError(
{
"documents": [
"Restore the root document instead of one of its versions.",
],
},
)
for doc in restored:
doc.restore(strict=False)
if restored:
from documents.search import get_backend
with get_backend().batch_update() as batch:
batch.add_or_update_ids([doc.pk for doc in restored])
elif action == "empty":
if doc_ids is None:
doc_ids = [doc.id for doc in docs]
empty_trash(doc_ids=doc_ids)
return Response({"result": "OK", "doc_ids": doc_ids})
-363
View File
@@ -1,363 +0,0 @@
import logging
from datetime import timedelta
from django.db.models import Avg
from django.db.models import Count
from django.db.models import Max
from django.db.models import Q
from django.http import HttpResponseForbidden
from django.http import HttpResponseServerError
from django.utils import timezone
from django_filters.rest_framework import DjangoFilterBackend
from drf_spectacular.openapi import AutoSchema
from drf_spectacular.utils import OpenApiParameter
from drf_spectacular.utils import extend_schema
from drf_spectacular.utils import extend_schema_view
from drf_spectacular.utils import inline_serializer
from rest_framework import serializers
from rest_framework import status
from rest_framework.decorators import action
from rest_framework.exceptions import ValidationError
from rest_framework.filters import OrderingFilter
from rest_framework.permissions import IsAuthenticated
from rest_framework.response import Response
from rest_framework.viewsets import ReadOnlyModelViewSet
from documents.filters import PaperlessTaskFilterSet
from documents.models import PaperlessTask
from documents.permissions import AcknowledgeTasksPermissions
from documents.permissions import PaperlessObjectPermissions
from documents.permissions import has_system_status_permission
from documents.serialisers.tasks import AcknowledgeTasksViewSerializer
from documents.serialisers.tasks import RunTaskSerializer
from documents.serialisers.tasks import TaskSerializerV9
from documents.serialisers.tasks import TaskSerializerV10
from documents.serialisers.tasks import TaskSummarySerializer
from documents.tasks import llmindex_index
from documents.tasks import sanity_check
from documents.tasks import train_classifier
from paperless.views import StandardPagination
logger = logging.getLogger("paperless.api")
class _TasksViewSetSchema(AutoSchema):
_UNPAGINATED_ACTIONS = frozenset({"summary", "active", "status_counts"})
def _get_paginator(self):
if getattr(self.view, "action", None) in self._UNPAGINATED_ACTIONS:
return None
return super()._get_paginator()
@extend_schema_view(
list=extend_schema(
parameters=[
OpenApiParameter(
name="task_id",
type=str,
location=OpenApiParameter.QUERY,
required=False,
description="Filter tasks by Celery UUID",
),
],
),
acknowledge=extend_schema(
operation_id="acknowledge_tasks",
description="Acknowledge a list of tasks, or all visible unacknowledged tasks",
request=AcknowledgeTasksViewSerializer,
responses={
(200, "application/json"): inline_serializer(
name="AcknowledgeTasks",
fields={
"result": serializers.IntegerField(),
},
),
},
),
run=extend_schema(
operation_id="run_task",
description="Manually dispatch a background task. Superuser only.",
request=RunTaskSerializer,
responses={
(200, "application/json"): inline_serializer(
name="RunTask",
fields={"task_id": serializers.CharField()},
),
(400, "application/json"): inline_serializer(
name="RunTaskError",
fields={"error": serializers.CharField()},
),
},
),
summary=extend_schema(
responses={200: TaskSummarySerializer(many=True)},
parameters=[
OpenApiParameter(
name="days",
type={"type": "integer", "minimum": 1, "maximum": 365, "default": 30},
location=OpenApiParameter.QUERY,
required=False,
description="Number of days to include in aggregation (default 30, min 1, max 365)",
),
],
),
status_counts=extend_schema(
responses={
200: inline_serializer(
name="TaskStatusCounts",
fields={
"all": serializers.IntegerField(),
"needs_attention": serializers.IntegerField(),
"in_progress": serializers.IntegerField(),
"completed": serializers.IntegerField(),
},
),
},
),
active=extend_schema(
description="Currently pending and running tasks (capped at 50).",
responses={200: TaskSerializerV10(many=True)},
),
)
class TasksViewSet(ReadOnlyModelViewSet[PaperlessTask]):
schema = _TasksViewSetSchema()
permission_classes = (IsAuthenticated, PaperlessObjectPermissions)
pagination_class = StandardPagination
filter_backends = (
DjangoFilterBackend,
OrderingFilter,
)
filterset_class = PaperlessTaskFilterSet
ordering_fields = [
"date_created",
"date_done",
"status",
"task_type",
"duration_seconds",
"wait_time_seconds",
]
ordering = ["-date_created"]
# Needed for drf-spectacular schema generation (get_queryset touches request.user)
queryset = PaperlessTask.objects.none()
# v9 backwards compat: maps old task_name values to new task_type values
_V9_TASK_NAME_TO_TYPE = {
"check_sanity": PaperlessTask.TaskType.SANITY_CHECK,
"llmindex_update": PaperlessTask.TaskType.LLM_INDEX,
}
# v9 backwards compat: maps old "type" query param values to new TriggerSource.
# Must match the reverse of TaskSerializerV9._TRIGGER_SOURCE_TO_V9_TYPE.
_V9_TYPE_TO_TRIGGER_SOURCES = {
"auto_task": [
PaperlessTask.TriggerSource.SYSTEM,
PaperlessTask.TriggerSource.EMAIL_CONSUME,
PaperlessTask.TriggerSource.FOLDER_CONSUME,
],
"scheduled_task": [PaperlessTask.TriggerSource.SCHEDULED],
"manual_task": [
PaperlessTask.TriggerSource.MANUAL,
PaperlessTask.TriggerSource.WEB_UI,
PaperlessTask.TriggerSource.API_UPLOAD,
],
}
_RUNNABLE_TASKS = {
PaperlessTask.TaskType.TRAIN_CLASSIFIER: (train_classifier, {}),
PaperlessTask.TaskType.SANITY_CHECK: (sanity_check, {"raise_on_error": False}),
PaperlessTask.TaskType.LLM_INDEX: (llmindex_index, {"rebuild": False}),
}
_STATUS_COUNT_EXCLUDED_FILTERS = frozenset({"status", "is_complete"})
def get_serializer_class(self):
# v9: use backwards-compatible serializer with old field names
if self.request.version and int(self.request.version) < 10:
return TaskSerializerV9
return TaskSerializerV10
def paginate_queryset(self, queryset):
# v9: tasks endpoint was not paginated; preserve plain-list response
if self.request.version and int(self.request.version) < 10:
return None
return super().paginate_queryset(queryset)
def get_queryset(self):
is_v9 = self.request.version and int(self.request.version) < 10
if self.request.user.is_staff:
queryset = PaperlessTask.objects.all()
else:
# Own tasks + unowned (system/scheduled) tasks. Tasks owned by other
# users are never visible to non-staff regardless of API version.
queryset = PaperlessTask.objects.filter(
Q(owner=self.request.user) | Q(owner__isnull=True),
)
# v9 backwards compat: map old query params to new field names
if is_v9:
task_name = self.request.query_params.get("task_name")
if task_name is not None:
mapped = self._V9_TASK_NAME_TO_TYPE.get(task_name, task_name)
queryset = queryset.filter(task_type=mapped)
task_type_old = self.request.query_params.get("type")
if task_type_old is not None:
sources = self._V9_TYPE_TO_TRIGGER_SOURCES.get(task_type_old)
if sources:
queryset = queryset.filter(trigger_source__in=sources)
# v10+: direct task_id param for backwards compat
task_id = self.request.query_params.get("task_id")
if task_id is not None:
queryset = queryset.filter(task_id=task_id)
return queryset
def get_status_count_queryset(self):
"""Apply task filters except the status dimensions represented by the counts."""
query_params = self.request.query_params.copy()
for param in self._STATUS_COUNT_EXCLUDED_FILTERS:
query_params.pop(param, None)
filterset = self.filterset_class(
data=query_params,
queryset=self.get_queryset(),
request=self.request,
)
if not filterset.is_valid():
raise ValidationError(filterset.errors)
return filterset.qs
@action(
methods=["post"],
detail=False,
permission_classes=[IsAuthenticated, AcknowledgeTasksPermissions],
)
def acknowledge(self, request):
queryset = self.get_queryset()
serializer = AcknowledgeTasksViewSerializer(
data=request.data,
context={"queryset": queryset},
)
serializer.is_valid(raise_exception=True)
if serializer.validated_data.get("all", False):
tasks = queryset.filter(acknowledged=False)
else:
task_ids = serializer.validated_data.get("tasks")
tasks = queryset.filter(id__in=task_ids)
count = tasks.update(acknowledged=True)
return Response({"result": count})
def get_permissions(self):
if self.action == "summary" and has_system_status_permission(
getattr(self.request, "user", None),
):
return [IsAuthenticated()]
return super().get_permissions()
@action(methods=["get"], detail=False)
def summary(self, request):
"""Aggregated task statistics per task_type over the last N days (default 30)."""
try:
days = min(365, max(1, int(request.query_params.get("days", 30))))
except (TypeError, ValueError):
return Response(
{"days": "Must be a positive integer."},
status=status.HTTP_400_BAD_REQUEST,
)
cutoff = timezone.now() - timedelta(days=days)
if has_system_status_permission(request.user):
queryset = PaperlessTask.objects.filter(date_created__gte=cutoff)
else:
queryset = self.get_queryset().filter(date_created__gte=cutoff)
data = queryset.values("task_type").annotate(
total_count=Count("id"),
pending_count=Count("id", filter=Q(status=PaperlessTask.Status.PENDING)),
success_count=Count("id", filter=Q(status=PaperlessTask.Status.SUCCESS)),
failure_count=Count("id", filter=Q(status=PaperlessTask.Status.FAILURE)),
avg_duration_seconds=Avg(
"duration_seconds",
filter=Q(duration_seconds__isnull=False),
),
avg_wait_time_seconds=Avg(
"wait_time_seconds",
filter=Q(wait_time_seconds__isnull=False),
),
last_run=Max("date_created"),
last_success=Max(
"date_done",
filter=Q(status=PaperlessTask.Status.SUCCESS),
),
last_failure=Max(
"date_done",
filter=Q(status=PaperlessTask.Status.FAILURE),
),
)
serializer = TaskSummarySerializer(data, many=True)
return Response(serializer.data)
@action(methods=["get"], detail=False)
def status_counts(self, request):
"""Aggregated task counts for task UI sections."""
queryset = self.get_status_count_queryset()
counts = queryset.aggregate(
all=Count("id"),
needs_attention=Count(
"id",
filter=Q(
status__in=[
PaperlessTask.Status.FAILURE,
PaperlessTask.Status.REVOKED,
],
),
),
in_progress=Count(
"id",
filter=Q(
status__in=[
PaperlessTask.Status.PENDING,
PaperlessTask.Status.STARTED,
],
),
),
completed=Count("id", filter=Q(status=PaperlessTask.Status.SUCCESS)),
)
return Response(counts)
@action(methods=["get"], detail=False)
def active(self, request):
"""Currently pending and running tasks (capped at 50)."""
queryset = (
self.get_queryset()
.filter(
status__in=[PaperlessTask.Status.PENDING, PaperlessTask.Status.STARTED],
)
.order_by("-date_created")[:50]
)
serializer = self.get_serializer(queryset, many=True)
return Response(serializer.data)
@action(methods=["post"], detail=False)
def run(self, request):
"""Manually dispatch a background task. Superuser only."""
if not request.user.is_superuser:
return HttpResponseForbidden("Insufficient permissions")
serializer = RunTaskSerializer(data=request.data)
serializer.is_valid(raise_exception=True)
task_type = serializer.validated_data.get("task_type")
if task_type not in self._RUNNABLE_TASKS:
return Response(
{"error": f"Task type '{task_type}' cannot be manually triggered"},
status=status.HTTP_400_BAD_REQUEST,
)
try:
task_func, task_kwargs = self._RUNNABLE_TASKS[task_type]
async_result = task_func.apply_async(
kwargs=task_kwargs,
headers={"trigger_source": PaperlessTask.TriggerSource.MANUAL},
)
return Response({"task_id": async_result.id})
except Exception as e:
logger.warning(f"Error running task: {e!s}")
return HttpResponseServerError(
"Error running task, check logs for more detail.",
)
-108
View File
@@ -1,108 +0,0 @@
import os
import tempfile
from datetime import datetime
from pathlib import Path
from time import mktime
from typing import Any
from unicodedata import normalize
import pathvalidate
from django.conf import settings
from django.http import HttpResponseForbidden
from drf_spectacular.types import OpenApiTypes
from drf_spectacular.utils import extend_schema
from drf_spectacular.utils import extend_schema_view
from rest_framework import parsers
from rest_framework.generics import GenericAPIView
from rest_framework.permissions import IsAuthenticated
from rest_framework.response import Response
from documents.data_models import ConsumableDocument
from documents.data_models import DocumentMetadataOverrides
from documents.data_models import DocumentSource
from documents.models import PaperlessTask
from documents.serialisers.upload import PostDocumentSerializer
from documents.tasks import consume_file
@extend_schema_view(
post=extend_schema(
description="Upload a document via the API",
external_docs={
"description": "Further documentation",
"url": "https://docs.paperless-ngx.com/api/#file-uploads",
},
responses={
(200, "application/json"): OpenApiTypes.STR,
},
),
)
class PostDocumentView(GenericAPIView[Any]):
permission_classes = (IsAuthenticated,)
serializer_class = PostDocumentSerializer
parser_classes = (parsers.MultiPartParser,)
def post(self, request, *args, **kwargs):
if not request.user.has_perm("documents.add_document"):
return HttpResponseForbidden("Insufficient permissions")
serializer = self.get_serializer(data=request.data)
serializer.is_valid(raise_exception=True)
doc_name, doc_data = serializer.validated_data.get("document")
doc_name = normalize("NFC", doc_name)
correspondent_id = serializer.validated_data.get("correspondent")
document_type_id = serializer.validated_data.get("document_type")
storage_path_id = serializer.validated_data.get("storage_path")
tag_ids = serializer.validated_data.get("tags")
title = serializer.validated_data.get("title")
created = serializer.validated_data.get("created")
archive_serial_number = serializer.validated_data.get("archive_serial_number")
cf = serializer.validated_data.get("custom_fields")
from_webui = serializer.validated_data.get("from_webui")
t = int(mktime(datetime.now().timetuple()))
settings.SCRATCH_DIR.mkdir(parents=True, exist_ok=True)
temp_file_path = Path(tempfile.mkdtemp(dir=settings.SCRATCH_DIR)) / Path(
pathvalidate.sanitize_filename(doc_name),
)
temp_file_path.write_bytes(doc_data)
os.utime(temp_file_path, times=(t, t))
input_doc = ConsumableDocument(
source=DocumentSource.WebUI if from_webui else DocumentSource.ApiUpload,
original_file=temp_file_path,
)
custom_fields = None
if isinstance(cf, dict) and cf:
custom_fields = cf
elif isinstance(cf, list) and cf:
custom_fields = dict.fromkeys(cf, None)
input_doc_overrides = DocumentMetadataOverrides(
filename=doc_name,
title=title,
correspondent_id=correspondent_id,
document_type_id=document_type_id,
storage_path_id=storage_path_id,
tag_ids=tag_ids,
created=created,
asn=archive_serial_number,
owner_id=request.user.id,
custom_fields=custom_fields,
)
async_task = consume_file.apply_async(
kwargs={"input_doc": input_doc, "overrides": input_doc_overrides},
headers={
"trigger_source": (
PaperlessTask.TriggerSource.WEB_UI
if from_webui
else PaperlessTask.TriggerSource.API_UPLOAD
),
},
)
return Response(async_task.id)
-110
View File
@@ -1,110 +0,0 @@
from django.db.models import Prefetch
from django.http import HttpResponseBadRequest
from rest_framework.permissions import IsAuthenticated
from rest_framework.viewsets import ModelViewSet
from documents.models import Workflow
from documents.models import WorkflowAction
from documents.models import WorkflowTrigger
from documents.permissions import PaperlessObjectPermissions
from documents.serialisers.workflows import WorkflowActionSerializer
from documents.serialisers.workflows import WorkflowSerializer
from documents.serialisers.workflows import WorkflowTriggerSerializer
from paperless.views import StandardPagination
class WorkflowTriggerViewSet(ModelViewSet[WorkflowTrigger]):
permission_classes = (IsAuthenticated, PaperlessObjectPermissions)
serializer_class = WorkflowTriggerSerializer
pagination_class = StandardPagination
model = WorkflowTrigger
queryset = WorkflowTrigger.objects.all()
def partial_update(self, request, *args, **kwargs):
if "id" in request.data and str(request.data["id"]) != str(kwargs["pk"]):
return HttpResponseBadRequest(
"ID in body does not match URL",
)
return super().partial_update(request, *args, **kwargs)
class WorkflowActionViewSet(ModelViewSet[WorkflowAction]):
permission_classes = (IsAuthenticated, PaperlessObjectPermissions)
serializer_class = WorkflowActionSerializer
pagination_class = StandardPagination
model = WorkflowAction
queryset = WorkflowAction.objects.all().prefetch_related(
"assign_tags",
"assign_view_users",
"assign_view_groups",
"assign_change_users",
"assign_change_groups",
"assign_custom_fields",
)
def partial_update(self, request, *args, **kwargs):
if "id" in request.data and str(request.data["id"]) != str(kwargs["pk"]):
return HttpResponseBadRequest(
"ID in body does not match URL",
)
return super().partial_update(request, *args, **kwargs)
class WorkflowViewSet(ModelViewSet[Workflow]):
permission_classes = (IsAuthenticated, PaperlessObjectPermissions)
serializer_class = WorkflowSerializer
pagination_class = StandardPagination
model = Workflow
queryset = (
Workflow.objects.all()
.order_by("order")
.prefetch_related(
Prefetch(
"triggers",
queryset=WorkflowTrigger.objects.prefetch_related(
"filter_has_tags",
"filter_has_all_tags",
"filter_has_not_tags",
"filter_has_any_correspondents",
"filter_has_not_correspondents",
"filter_has_any_document_types",
"filter_has_not_document_types",
"filter_has_any_storage_paths",
"filter_has_not_storage_paths",
),
),
Prefetch(
"actions",
queryset=WorkflowAction.objects.order_by(
"order",
"pk",
).prefetch_related(
"assign_tags",
"assign_view_users",
"assign_view_groups",
"assign_change_users",
"assign_change_groups",
"assign_custom_fields",
"remove_tags",
"remove_correspondents",
"remove_document_types",
"remove_storage_paths",
"remove_custom_fields",
"remove_owners",
"remove_view_users",
"remove_view_groups",
"remove_change_users",
"remove_change_groups",
),
),
)
)
+70 -66
View File
@@ -2,8 +2,8 @@ msgid ""
msgstr "" msgstr ""
"Project-Id-Version: paperless-ngx\n" "Project-Id-Version: paperless-ngx\n"
"Report-Msgid-Bugs-To: \n" "Report-Msgid-Bugs-To: \n"
"POT-Creation-Date: 2026-09-18 01:29+0000\n" "POT-Creation-Date: 2026-09-23 19:00+0000\n"
"PO-Revision-Date: 2026-09-18 01:30\n" "PO-Revision-Date: 2026-09-23 19:01\n"
"Last-Translator: \n" "Last-Translator: \n"
"Language-Team: Afrikaans\n" "Language-Team: Afrikaans\n"
"Language: af_ZA\n" "Language: af_ZA\n"
@@ -1615,7 +1615,7 @@ msgid "workflow runs"
msgstr "" msgstr ""
#: documents/serialisers.py:514 documents/serialisers.py:871 #: documents/serialisers.py:514 documents/serialisers.py:871
#: documents/serialisers.py:2883 documents/views.py:343 documents/views.py:2726 #: documents/serialisers.py:2885 documents/views.py:342 documents/views.py:2725
#: paperless_mail/serialisers.py:156 #: paperless_mail/serialisers.py:156
msgid "Insufficient permissions." msgid "Insufficient permissions."
msgstr "" msgstr ""
@@ -1624,38 +1624,38 @@ msgstr ""
msgid "Invalid color." msgid "Invalid color."
msgstr "Ongeldige kleur." msgstr "Ongeldige kleur."
#: documents/serialisers.py:2350 #: documents/serialisers.py:2352
#, python-format #, python-format
msgid "File type %(type)s not supported" msgid "File type %(type)s not supported"
msgstr "Lêertipe %(type)s word nie ondersteun nie" msgstr "Lêertipe %(type)s word nie ondersteun nie"
#: documents/serialisers.py:2394 #: documents/serialisers.py:2396
#, python-format #, python-format
msgid "Custom field id must be an integer: %(id)s" msgid "Custom field id must be an integer: %(id)s"
msgstr "" msgstr ""
#: documents/serialisers.py:2401 #: documents/serialisers.py:2403
#, python-format #, python-format
msgid "Custom field with id %(id)s does not exist" msgid "Custom field with id %(id)s does not exist"
msgstr "" msgstr ""
#: documents/serialisers.py:2418 documents/serialisers.py:2428 #: documents/serialisers.py:2420 documents/serialisers.py:2430
msgid "Custom fields must be a list of integers or an object mapping ids to values." msgid "Custom fields must be a list of integers or an object mapping ids to values."
msgstr "" msgstr ""
#: documents/serialisers.py:2423 #: documents/serialisers.py:2425
msgid "Some custom fields don't exist or were specified twice." msgid "Some custom fields don't exist or were specified twice."
msgstr "" msgstr ""
#: documents/serialisers.py:2570 #: documents/serialisers.py:2572
msgid "Invalid variable detected." msgid "Invalid variable detected."
msgstr "Ongeldige veranderlike bespeur." msgstr "Ongeldige veranderlike bespeur."
#: documents/serialisers.py:2939 #: documents/serialisers.py:2941
msgid "Duplicate document identifiers are not allowed." msgid "Duplicate document identifiers are not allowed."
msgstr "" msgstr ""
#: documents/serialisers.py:2969 documents/views.py:4763 #: documents/serialisers.py:2971 documents/views.py:4780
#, python-format #, python-format
msgid "Documents not found: %(ids)s" msgid "Documents not found: %(ids)s"
msgstr "" msgstr ""
@@ -1910,40 +1910,40 @@ msgstr ""
msgid "Unable to parse URI {value}" msgid "Unable to parse URI {value}"
msgstr "" msgstr ""
#: documents/views.py:336 documents/views.py:2723 #: documents/views.py:335 documents/views.py:2722
msgid "Invalid more_like_id" msgid "Invalid more_like_id"
msgstr "" msgstr ""
#: documents/views.py:1670 #: documents/views.py:1669
msgid "Invalid AI configuration." msgid "Invalid AI configuration."
msgstr "" msgstr ""
#: documents/views.py:1681 #: documents/views.py:1680
msgid "AI backend request timed out." msgid "AI backend request timed out."
msgstr "" msgstr ""
#: documents/views.py:1693 #: documents/views.py:1692
msgid "AI backend rejected the request. Check logs for details." msgid "AI backend rejected the request. Check logs for details."
msgstr "" msgstr ""
#: documents/views.py:2548 documents/views.py:2864 #: documents/views.py:2547 documents/views.py:2863
msgid "Specify only one of text, title_search, query, or more_like_id." msgid "Specify only one of text, title_search, query, or more_like_id."
msgstr "" msgstr ""
#: documents/views.py:4776 #: documents/views.py:4793
#, python-format #, python-format
msgid "Insufficient permissions to share document %(id)s." msgid "Insufficient permissions to share document %(id)s."
msgstr "" msgstr ""
#: documents/views.py:4822 #: documents/views.py:4839
msgid "Bundle is already being processed." msgid "Bundle is already being processed."
msgstr "" msgstr ""
#: documents/views.py:4886 #: documents/views.py:4903
msgid "The share link bundle is still being prepared. Please try again later." msgid "The share link bundle is still being prepared. Please try again later."
msgstr "" msgstr ""
#: documents/views.py:4900 #: documents/views.py:4917
msgid "The share link bundle is unavailable." msgid "The share link bundle is unavailable."
msgstr "" msgstr ""
@@ -2188,190 +2188,194 @@ msgid "Sets the LLM embedding model"
msgstr "" msgstr ""
#: paperless/models.py:369 #: paperless/models.py:369
msgid "Sets the LLM embedding endpoint, optional" msgid "Sets the LLM embedding API key"
msgstr "" msgstr ""
#: paperless/models.py:376 #: paperless/models.py:376
msgid "Sets the LLM embedding endpoint, optional"
msgstr ""
#: paperless/models.py:383
msgid "Sets the LLM embedding chunk size" msgid "Sets the LLM embedding chunk size"
msgstr "" msgstr ""
#: paperless/models.py:382 #: paperless/models.py:389
msgid "Sets the LLM context size" msgid "Sets the LLM context size"
msgstr "" msgstr ""
#: paperless/models.py:388 #: paperless/models.py:395
msgid "Sets the LLM backend" msgid "Sets the LLM backend"
msgstr "" msgstr ""
#: paperless/models.py:396 #: paperless/models.py:403
msgid "Sets the LLM model" msgid "Sets the LLM model"
msgstr "" msgstr ""
#: paperless/models.py:403 #: paperless/models.py:410
msgid "Sets the LLM API key" msgid "Sets the LLM API key"
msgstr "" msgstr ""
#: paperless/models.py:410 #: paperless/models.py:417
msgid "Sets the LLM endpoint, optional" msgid "Sets the LLM endpoint, optional"
msgstr "" msgstr ""
#: paperless/models.py:417 #: paperless/models.py:424
msgid "Sets the LLM output language" msgid "Sets the LLM output language"
msgstr "" msgstr ""
#: paperless/models.py:424 #: paperless/models.py:431
msgid "Sets the LLM timeout in seconds" msgid "Sets the LLM timeout in seconds"
msgstr "" msgstr ""
#: paperless/models.py:430 #: paperless/models.py:437
msgid "paperless application settings" msgid "paperless application settings"
msgstr "" msgstr ""
#: paperless/settings/__init__.py:558 #: paperless/settings/__init__.py:559
msgid "English (US)" msgid "English (US)"
msgstr "Engels (VS)" msgstr "Engels (VS)"
#: paperless/settings/__init__.py:559 #: paperless/settings/__init__.py:560
msgid "Arabic" msgid "Arabic"
msgstr "Arabies" msgstr "Arabies"
#: paperless/settings/__init__.py:560 #: paperless/settings/__init__.py:561
msgid "Afrikaans" msgid "Afrikaans"
msgstr "" msgstr ""
#: paperless/settings/__init__.py:561 #: paperless/settings/__init__.py:562
msgid "Belarusian" msgid "Belarusian"
msgstr "Belorussies" msgstr "Belorussies"
#: paperless/settings/__init__.py:562 #: paperless/settings/__init__.py:563
msgid "Bulgarian" msgid "Bulgarian"
msgstr "" msgstr ""
#: paperless/settings/__init__.py:563 #: paperless/settings/__init__.py:564
msgid "Catalan" msgid "Catalan"
msgstr "Katalaans" msgstr "Katalaans"
#: paperless/settings/__init__.py:564 #: paperless/settings/__init__.py:565
msgid "Czech" msgid "Czech"
msgstr "Tsjeggies" msgstr "Tsjeggies"
#: paperless/settings/__init__.py:565 #: paperless/settings/__init__.py:566
msgid "Danish" msgid "Danish"
msgstr "Deens" msgstr "Deens"
#: paperless/settings/__init__.py:566 #: paperless/settings/__init__.py:567
msgid "German" msgid "German"
msgstr "Duits" msgstr "Duits"
#: paperless/settings/__init__.py:567 #: paperless/settings/__init__.py:568
msgid "Greek" msgid "Greek"
msgstr "" msgstr ""
#: paperless/settings/__init__.py:568 #: paperless/settings/__init__.py:569
msgid "English (GB)" msgid "English (GB)"
msgstr "Engels (GB)" msgstr "Engels (GB)"
#: paperless/settings/__init__.py:569 #: paperless/settings/__init__.py:570
msgid "Spanish" msgid "Spanish"
msgstr "Spaans" msgstr "Spaans"
#: paperless/settings/__init__.py:570 #: paperless/settings/__init__.py:571
msgid "Persian" msgid "Persian"
msgstr "" msgstr ""
#: paperless/settings/__init__.py:571 #: paperless/settings/__init__.py:572
msgid "Finnish" msgid "Finnish"
msgstr "Fins" msgstr "Fins"
#: paperless/settings/__init__.py:572 #: paperless/settings/__init__.py:573
msgid "French" msgid "French"
msgstr "Frans" msgstr "Frans"
#: paperless/settings/__init__.py:573 #: paperless/settings/__init__.py:574
msgid "Hungarian" msgid "Hungarian"
msgstr "" msgstr ""
#: paperless/settings/__init__.py:574 #: paperless/settings/__init__.py:575
msgid "Indonesian" msgid "Indonesian"
msgstr "" msgstr ""
#: paperless/settings/__init__.py:575 #: paperless/settings/__init__.py:576
msgid "Italian" msgid "Italian"
msgstr "Italiaans" msgstr "Italiaans"
#: paperless/settings/__init__.py:576 #: paperless/settings/__init__.py:577
msgid "Japanese" msgid "Japanese"
msgstr "" msgstr ""
#: paperless/settings/__init__.py:577 #: paperless/settings/__init__.py:578
msgid "Korean" msgid "Korean"
msgstr "" msgstr ""
#: paperless/settings/__init__.py:578 #: paperless/settings/__init__.py:579
msgid "Luxembourgish" msgid "Luxembourgish"
msgstr "Luxemburgs" msgstr "Luxemburgs"
#: paperless/settings/__init__.py:579 #: paperless/settings/__init__.py:580
msgid "Norwegian" msgid "Norwegian"
msgstr "" msgstr ""
#: paperless/settings/__init__.py:580 #: paperless/settings/__init__.py:581
msgid "Dutch" msgid "Dutch"
msgstr "Nederlands" msgstr "Nederlands"
#: paperless/settings/__init__.py:581 #: paperless/settings/__init__.py:582
msgid "Polish" msgid "Polish"
msgstr "Pools" msgstr "Pools"
#: paperless/settings/__init__.py:582 #: paperless/settings/__init__.py:583
msgid "Portuguese (Brazil)" msgid "Portuguese (Brazil)"
msgstr "Portugees (Brasilië)" msgstr "Portugees (Brasilië)"
#: paperless/settings/__init__.py:583 #: paperless/settings/__init__.py:584
msgid "Portuguese" msgid "Portuguese"
msgstr "Portugees" msgstr "Portugees"
#: paperless/settings/__init__.py:584 #: paperless/settings/__init__.py:585
msgid "Romanian" msgid "Romanian"
msgstr "Roemeens" msgstr "Roemeens"
#: paperless/settings/__init__.py:585 #: paperless/settings/__init__.py:586
msgid "Russian" msgid "Russian"
msgstr "Russies" msgstr "Russies"
#: paperless/settings/__init__.py:586 #: paperless/settings/__init__.py:587
msgid "Slovak" msgid "Slovak"
msgstr "" msgstr ""
#: paperless/settings/__init__.py:587 #: paperless/settings/__init__.py:588
msgid "Slovenian" msgid "Slovenian"
msgstr "Sloweens" msgstr "Sloweens"
#: paperless/settings/__init__.py:588 #: paperless/settings/__init__.py:589
msgid "Serbian" msgid "Serbian"
msgstr "Serwies" msgstr "Serwies"
#: paperless/settings/__init__.py:589 #: paperless/settings/__init__.py:590
msgid "Swedish" msgid "Swedish"
msgstr "Sweeds" msgstr "Sweeds"
#: paperless/settings/__init__.py:590 #: paperless/settings/__init__.py:591
msgid "Turkish" msgid "Turkish"
msgstr "Turks" msgstr "Turks"
#: paperless/settings/__init__.py:591 #: paperless/settings/__init__.py:592
msgid "Ukrainian" msgid "Ukrainian"
msgstr "" msgstr ""
#: paperless/settings/__init__.py:592 #: paperless/settings/__init__.py:593
msgid "Vietnamese" msgid "Vietnamese"
msgstr "" msgstr ""
#: paperless/settings/__init__.py:593 #: paperless/settings/__init__.py:594
msgid "Chinese Simplified" msgid "Chinese Simplified"
msgstr "Vereenvoudigde Sjinees" msgstr "Vereenvoudigde Sjinees"
#: paperless/settings/__init__.py:594 #: paperless/settings/__init__.py:595
msgid "Chinese Traditional" msgid "Chinese Traditional"
msgstr "" msgstr ""

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