From 63c19e7f751e3ba1de8b89b70c495873db564a30 Mon Sep 17 00:00:00 2001 From: GitHub Actions <41898282+github-actions[bot]@users.noreply.github.com> Date: Tue, 23 Jun 2026 14:34:24 +0000 Subject: [PATCH 1/3] Auto translate strings --- src-ui/messages.xlf | 219 +++++++++++++++---------- src/locale/en_US/LC_MESSAGES/django.po | 138 ++++++++-------- 2 files changed, 204 insertions(+), 153 deletions(-) diff --git a/src-ui/messages.xlf b/src-ui/messages.xlf index 5949d2357..5dc2bf681 100644 --- a/src-ui/messages.xlf +++ b/src-ui/messages.xlf @@ -768,7 +768,7 @@ src/app/components/admin/tasks/tasks.component.html - 16 + 19 @@ -783,7 +783,7 @@ src/app/components/admin/tasks/tasks.component.html - 23 + 26 src/app/components/admin/trash/trash.component.html @@ -1700,7 +1700,7 @@ src/app/components/common/input/tags/tags.component.ts - 80 + 81 src/app/components/common/suggestions-dropdown/suggestions-dropdown.component.html @@ -1830,11 +1830,18 @@ 147 + + Dismiss all + + src/app/components/admin/tasks/tasks.component.html + 15 + + All src/app/components/admin/tasks/tasks.component.html - 36 + 39 src/app/components/admin/tasks/tasks.component.ts @@ -1842,7 +1849,7 @@ src/app/components/common/custom-fields-query-dropdown/custom-fields-query-dropdown.component.html - 151 + 154 src/app/components/common/filterable-dropdown/filterable-dropdown.component.html @@ -1873,36 +1880,36 @@ Filter by src/app/components/admin/tasks/tasks.component.html - 56 + 59 All types src/app/components/admin/tasks/tasks.component.html - 61 + 64 src/app/components/admin/tasks/tasks.component.ts - 209 + 215 All sources src/app/components/admin/tasks/tasks.component.html - 70 + 73 src/app/components/admin/tasks/tasks.component.ts - 221 + 227 Reset filters src/app/components/admin/tasks/tasks.component.html - 101 + 104 src/app/components/document-list/document-list.component.html @@ -1917,14 +1924,14 @@ {VAR_PLURAL, plural, =1 {1 task} other { tasks}} src/app/components/admin/tasks/tasks.component.html - 122 + 125 Name src/app/components/admin/tasks/tasks.component.html - 144 + 147 src/app/components/admin/tasks/tasks.component.ts @@ -2035,7 +2042,7 @@ Created src/app/components/admin/tasks/tasks.component.html - 145 + 148 src/app/components/common/dates-dropdown/dates-dropdown.component.html @@ -2066,21 +2073,21 @@ Results src/app/components/admin/tasks/tasks.component.html - 147 + 150 Info src/app/components/admin/tasks/tasks.component.html - 149 + 152 Actions src/app/components/admin/tasks/tasks.component.html - 150 + 153 src/app/components/admin/trash/trash.component.html @@ -2151,18 +2158,22 @@ click for full output src/app/components/admin/tasks/tasks.component.html - 201 + 204 Dismiss src/app/components/admin/tasks/tasks.component.html - 214 + 217 src/app/components/admin/tasks/tasks.component.ts - 310 + 317 + + + src/app/components/admin/tasks/tasks.component.ts + 351 src/app/components/document-detail/document-detail.component.ts @@ -2177,28 +2188,28 @@ Open Document src/app/components/admin/tasks/tasks.component.html - 219 + 222 Result message src/app/components/admin/tasks/tasks.component.html - 232 + 235 Duplicate src/app/components/admin/tasks/tasks.component.html - 239 + 242 Open src/app/components/admin/tasks/tasks.component.html - 247 + 250 src/app/components/app-frame/global-search/global-search.component.html @@ -2229,21 +2240,21 @@ Input data src/app/components/admin/tasks/tasks.component.html - 257 + 260 Result data src/app/components/admin/tasks/tasks.component.html - 263 + 266 No tasks match the current filters. src/app/components/admin/tasks/tasks.component.html - 285 + 288 @@ -2420,60 +2431,78 @@ Dismiss selected src/app/components/admin/tasks/tasks.component.ts - 233 + 239 Dismiss visible src/app/components/admin/tasks/tasks.component.ts - 234 + 240 Confirm Dismiss src/app/components/admin/tasks/tasks.component.ts - 307 + 314 Dismiss tasks? src/app/components/admin/tasks/tasks.component.ts - 308 + 315 Error dismissing tasks src/app/components/admin/tasks/tasks.component.ts - 319 + 326 + + + src/app/components/admin/tasks/tasks.component.ts + 360 Error dismissing task src/app/components/admin/tasks/tasks.component.ts - 331 + 338 + + + + Confirm Dismiss All + + src/app/components/admin/tasks/tasks.component.ts + 348 + + + + Dismiss all tasks? + + src/app/components/admin/tasks/tasks.component.ts + 349 Success. New document id created src/app/components/admin/tasks/tasks.component.ts - 377 + 408 Duplicate of document # src/app/components/admin/tasks/tasks.component.ts - 387 + 418 src/app/components/admin/tasks/tasks.component.ts - 421 + 452 @@ -3664,42 +3693,42 @@ {VAR_PLURAL, plural, =1 {One page} other { pages}} src/app/components/common/confirm-dialog/merge-confirm-dialog/merge-confirm-dialog.component.html - 25 + 28 Use metadata from: src/app/components/common/confirm-dialog/merge-confirm-dialog/merge-confirm-dialog.component.html - 34 + 38 Regenerate all metadata src/app/components/common/confirm-dialog/merge-confirm-dialog/merge-confirm-dialog.component.html - 36 + 40 Try to include archive version in merge for non-PDF files src/app/components/common/confirm-dialog/merge-confirm-dialog/merge-confirm-dialog.component.html - 44 + 48 Delete original documents after successful merge src/app/components/common/confirm-dialog/merge-confirm-dialog/merge-confirm-dialog.component.html - 48 + 52 Note that only PDFs will be included. src/app/components/common/confirm-dialog/merge-confirm-dialog/merge-confirm-dialog.component.html - 51 + 55 @@ -3814,7 +3843,7 @@ Saved field "". src/app/components/common/custom-fields-dropdown/custom-fields-dropdown.component.ts - 130 + 129 src/app/components/manage/document-attributes/custom-fields/custom-fields.component.ts @@ -3825,7 +3854,7 @@ Error saving field. src/app/components/common/custom-fields-dropdown/custom-fields-dropdown.component.ts - 139 + 138 src/app/components/manage/document-attributes/custom-fields/custom-fields.component.ts @@ -3910,11 +3939,11 @@ src/app/components/common/custom-fields-query-dropdown/custom-fields-query-dropdown.component.html - 94 + 96 src/app/components/common/custom-fields-query-dropdown/custom-fields-query-dropdown.component.html - 100 + 102 @@ -3925,29 +3954,29 @@ src/app/components/common/custom-fields-query-dropdown/custom-fields-query-dropdown.component.html - 95 + 97 src/app/components/common/custom-fields-query-dropdown/custom-fields-query-dropdown.component.html - 101 + 103 Search docs... src/app/components/common/custom-fields-query-dropdown/custom-fields-query-dropdown.component.html - 69 + 70 src/app/components/common/custom-fields-query-dropdown/custom-fields-query-dropdown.component.html - 117 + 119 Any src/app/components/common/custom-fields-query-dropdown/custom-fields-query-dropdown.component.html - 149 + 152 src/app/components/common/filterable-dropdown/filterable-dropdown.component.html @@ -3958,21 +3987,21 @@ Not src/app/components/common/custom-fields-query-dropdown/custom-fields-query-dropdown.component.html - 154 + 157 Add query src/app/components/common/custom-fields-query-dropdown/custom-fields-query-dropdown.component.html - 173 + 176 Add expression src/app/components/common/custom-fields-query-dropdown/custom-fields-query-dropdown.component.html - 176 + 179 @@ -4641,23 +4670,23 @@ src/app/components/common/system-status-dialog/system-status-dialog.component.html - 197 + 199 src/app/components/common/system-status-dialog/system-status-dialog.component.html - 231 + 233 src/app/components/common/system-status-dialog/system-status-dialog.component.html - 265 + 267 src/app/components/common/system-status-dialog/system-status-dialog.component.html - 275 + 277 src/app/components/common/system-status-dialog/system-status-dialog.component.html - 313 + 315 src/app/components/common/toast/toast.component.html @@ -5979,11 +6008,11 @@ src/app/components/common/input/select/select.component.html - 61 + 62 src/app/components/common/input/tags/tags.component.html - 65 + 66 @@ -5994,7 +6023,7 @@ src/app/components/common/input/select/select.component.ts - 172 + 176 @@ -6098,7 +6127,7 @@ Private src/app/components/common/input/select/select.component.ts - 71 + 72 src/app/components/common/tag/tag.component.html @@ -6121,7 +6150,7 @@ No items found src/app/components/common/input/select/select.component.ts - 106 + 110 @@ -6135,21 +6164,21 @@ Add tag src/app/components/common/input/tags/tags.component.html - 17 + 18 Remove tag src/app/components/common/input/tags/tags.component.html - 23 + 24 Filter documents with these Tags src/app/components/common/input/tags/tags.component.html - 55 + 56 @@ -6441,7 +6470,7 @@ src/app/components/common/system-status-dialog/system-status-dialog.component.html - 332 + 334 src/app/components/manage/mail/mail.component.html @@ -7150,28 +7179,28 @@ Recent Task Activity ( days) src/app/components/common/system-status-dialog/system-status-dialog.component.html - 145 + 147 Total src/app/components/common/system-status-dialog/system-status-dialog.component.html - 150 + 152 Successful src/app/components/common/system-status-dialog/system-status-dialog.component.html - 154 + 156 Failed src/app/components/common/system-status-dialog/system-status-dialog.component.html - 158 + 160 src/app/data/share-link-bundle.ts @@ -7182,7 +7211,7 @@ Pending src/app/components/common/system-status-dialog/system-status-dialog.component.html - 162 + 164 src/app/data/share-link-bundle.ts @@ -7193,96 +7222,96 @@ No recent tasks src/app/components/common/system-status-dialog/system-status-dialog.component.html - 167 + 169 Health src/app/components/common/system-status-dialog/system-status-dialog.component.html - 178 + 180 Search Index src/app/components/common/system-status-dialog/system-status-dialog.component.html - 182 + 184 Last Updated src/app/components/common/system-status-dialog/system-status-dialog.component.html - 195 + 197 Classifier src/app/components/common/system-status-dialog/system-status-dialog.component.html - 200 + 202 Run Task src/app/components/common/system-status-dialog/system-status-dialog.component.html - 222 + 224 src/app/components/common/system-status-dialog/system-status-dialog.component.html - 256 + 258 src/app/components/common/system-status-dialog/system-status-dialog.component.html - 304 + 306 Last Trained src/app/components/common/system-status-dialog/system-status-dialog.component.html - 229 + 231 Sanity Checker src/app/components/common/system-status-dialog/system-status-dialog.component.html - 234 + 236 Last Run src/app/components/common/system-status-dialog/system-status-dialog.component.html - 263 + 265 src/app/components/common/system-status-dialog/system-status-dialog.component.html - 311 + 313 WebSocket Connection src/app/components/common/system-status-dialog/system-status-dialog.component.html - 268 + 270 OK src/app/components/common/system-status-dialog/system-status-dialog.component.html - 272 + 274 AI Index src/app/components/common/system-status-dialog/system-status-dialog.component.html - 281 + 283 @@ -10910,6 +10939,20 @@ 361 + + LLM Request Timeout + + src/app/data/paperless-config.ts + 365 + + + + Timeout in seconds for LLM requests. + + src/app/data/paperless-config.ts + 369 + + Processing diff --git a/src/locale/en_US/LC_MESSAGES/django.po b/src/locale/en_US/LC_MESSAGES/django.po index 609030003..629693d88 100644 --- a/src/locale/en_US/LC_MESSAGES/django.po +++ b/src/locale/en_US/LC_MESSAGES/django.po @@ -2,7 +2,7 @@ msgid "" msgstr "" "Project-Id-Version: paperless-ngx\n" "Report-Msgid-Bugs-To: \n" -"POT-Creation-Date: 2026-06-03 22:14+0000\n" +"POT-Creation-Date: 2026-06-23 14:33+0000\n" "PO-Revision-Date: 2022-02-17 04:17\n" "Last-Translator: \n" "Language-Team: English\n" @@ -21,39 +21,39 @@ msgstr "" msgid "Documents" msgstr "" -#: documents/filters.py:463 +#: documents/filters.py:464 msgid "Value must be valid JSON." msgstr "" -#: documents/filters.py:482 +#: documents/filters.py:483 msgid "Invalid custom field query expression" msgstr "" -#: documents/filters.py:492 +#: documents/filters.py:493 msgid "Invalid expression list. Must be nonempty." msgstr "" -#: documents/filters.py:513 +#: documents/filters.py:514 msgid "Invalid logical operator {op!r}" msgstr "" -#: documents/filters.py:527 +#: documents/filters.py:528 msgid "Maximum number of query conditions exceeded." msgstr "" -#: documents/filters.py:591 +#: documents/filters.py:592 msgid "{name!r} is not a valid custom field." msgstr "" -#: documents/filters.py:628 +#: documents/filters.py:629 msgid "{data_type} does not support query expr {expr!r}." msgstr "" -#: documents/filters.py:743 documents/models.py:136 +#: documents/filters.py:744 documents/models.py:136 msgid "Maximum nesting depth exceeded." msgstr "" -#: documents/filters.py:990 +#: documents/filters.py:1052 msgid "Custom field not found" msgstr "" @@ -1351,49 +1351,49 @@ msgstr "" msgid "workflow runs" msgstr "" -#: documents/serialisers.py:463 documents/serialisers.py:815 -#: documents/serialisers.py:2681 documents/views.py:295 documents/views.py:2468 +#: documents/serialisers.py:503 documents/serialisers.py:855 +#: documents/serialisers.py:2744 documents/views.py:297 documents/views.py:2482 #: paperless_mail/serialisers.py:155 msgid "Insufficient permissions." msgstr "" -#: documents/serialisers.py:651 +#: documents/serialisers.py:691 msgid "Invalid color." msgstr "" -#: documents/serialisers.py:2175 +#: documents/serialisers.py:2216 #, python-format msgid "File type %(type)s not supported" msgstr "" -#: documents/serialisers.py:2219 +#: documents/serialisers.py:2260 #, python-format msgid "Custom field id must be an integer: %(id)s" msgstr "" -#: documents/serialisers.py:2226 +#: documents/serialisers.py:2267 #, python-format msgid "Custom field with id %(id)s does not exist" msgstr "" -#: documents/serialisers.py:2243 documents/serialisers.py:2253 +#: documents/serialisers.py:2284 documents/serialisers.py:2294 msgid "" "Custom fields must be a list of integers or an object mapping ids to values." msgstr "" -#: documents/serialisers.py:2248 +#: documents/serialisers.py:2289 msgid "Some custom fields don't exist or were specified twice." msgstr "" -#: documents/serialisers.py:2395 +#: documents/serialisers.py:2436 msgid "Invalid variable detected." msgstr "" -#: documents/serialisers.py:2737 +#: documents/serialisers.py:2800 msgid "Duplicate document identifiers are not allowed." msgstr "" -#: documents/serialisers.py:2767 documents/views.py:4345 +#: documents/serialisers.py:2830 documents/views.py:4429 #, python-format msgid "Documents not found: %(ids)s" msgstr "" @@ -1661,32 +1661,36 @@ msgstr "" msgid "Unable to parse URI {value}" msgstr "" -#: documents/views.py:288 documents/views.py:2465 +#: documents/views.py:290 documents/views.py:2479 msgid "Invalid more_like_id" msgstr "" -#: documents/views.py:1511 +#: documents/views.py:1513 msgid "Invalid AI configuration." msgstr "" -#: documents/views.py:2290 documents/views.py:2606 +#: documents/views.py:1522 +msgid "AI backend request timed out." +msgstr "" + +#: documents/views.py:2304 documents/views.py:2625 msgid "Specify only one of text, title_search, query, or more_like_id." msgstr "" -#: documents/views.py:4357 +#: documents/views.py:4441 #, python-format msgid "Insufficient permissions to share document %(id)s." msgstr "" -#: documents/views.py:4403 +#: documents/views.py:4487 msgid "Bundle is already being processed." msgstr "" -#: documents/views.py:4463 +#: documents/views.py:4547 msgid "The share link bundle is still being prepared. Please try again later." msgstr "" -#: documents/views.py:4473 +#: documents/views.py:4557 msgid "The share link bundle is unavailable." msgstr "" @@ -1935,154 +1939,158 @@ msgid "Sets the LLM output language" msgstr "" #: paperless/models.py:370 +msgid "Sets the LLM timeout in seconds" +msgstr "" + +#: paperless/models.py:376 msgid "paperless application settings" msgstr "" -#: paperless/settings/__init__.py:539 +#: paperless/settings/__init__.py:545 msgid "English (US)" msgstr "" -#: paperless/settings/__init__.py:540 +#: paperless/settings/__init__.py:546 msgid "Arabic" msgstr "" -#: paperless/settings/__init__.py:541 +#: paperless/settings/__init__.py:547 msgid "Afrikaans" msgstr "" -#: paperless/settings/__init__.py:542 +#: paperless/settings/__init__.py:548 msgid "Belarusian" msgstr "" -#: paperless/settings/__init__.py:543 +#: paperless/settings/__init__.py:549 msgid "Bulgarian" msgstr "" -#: paperless/settings/__init__.py:544 +#: paperless/settings/__init__.py:550 msgid "Catalan" msgstr "" -#: paperless/settings/__init__.py:545 +#: paperless/settings/__init__.py:551 msgid "Czech" msgstr "" -#: paperless/settings/__init__.py:546 +#: paperless/settings/__init__.py:552 msgid "Danish" msgstr "" -#: paperless/settings/__init__.py:547 +#: paperless/settings/__init__.py:553 msgid "German" msgstr "" -#: paperless/settings/__init__.py:548 +#: paperless/settings/__init__.py:554 msgid "Greek" msgstr "" -#: paperless/settings/__init__.py:549 +#: paperless/settings/__init__.py:555 msgid "English (GB)" msgstr "" -#: paperless/settings/__init__.py:550 +#: paperless/settings/__init__.py:556 msgid "Spanish" msgstr "" -#: paperless/settings/__init__.py:551 +#: paperless/settings/__init__.py:557 msgid "Persian" msgstr "" -#: paperless/settings/__init__.py:552 +#: paperless/settings/__init__.py:558 msgid "Finnish" msgstr "" -#: paperless/settings/__init__.py:553 +#: paperless/settings/__init__.py:559 msgid "French" msgstr "" -#: paperless/settings/__init__.py:554 +#: paperless/settings/__init__.py:560 msgid "Hungarian" msgstr "" -#: paperless/settings/__init__.py:555 +#: paperless/settings/__init__.py:561 msgid "Indonesian" msgstr "" -#: paperless/settings/__init__.py:556 +#: paperless/settings/__init__.py:562 msgid "Italian" msgstr "" -#: paperless/settings/__init__.py:557 +#: paperless/settings/__init__.py:563 msgid "Japanese" msgstr "" -#: paperless/settings/__init__.py:558 +#: paperless/settings/__init__.py:564 msgid "Korean" msgstr "" -#: paperless/settings/__init__.py:559 +#: paperless/settings/__init__.py:565 msgid "Luxembourgish" msgstr "" -#: paperless/settings/__init__.py:560 +#: paperless/settings/__init__.py:566 msgid "Norwegian" msgstr "" -#: paperless/settings/__init__.py:561 +#: paperless/settings/__init__.py:567 msgid "Dutch" msgstr "" -#: paperless/settings/__init__.py:562 +#: paperless/settings/__init__.py:568 msgid "Polish" msgstr "" -#: paperless/settings/__init__.py:563 +#: paperless/settings/__init__.py:569 msgid "Portuguese (Brazil)" msgstr "" -#: paperless/settings/__init__.py:564 +#: paperless/settings/__init__.py:570 msgid "Portuguese" msgstr "" -#: paperless/settings/__init__.py:565 +#: paperless/settings/__init__.py:571 msgid "Romanian" msgstr "" -#: paperless/settings/__init__.py:566 +#: paperless/settings/__init__.py:572 msgid "Russian" msgstr "" -#: paperless/settings/__init__.py:567 +#: paperless/settings/__init__.py:573 msgid "Slovak" msgstr "" -#: paperless/settings/__init__.py:568 +#: paperless/settings/__init__.py:574 msgid "Slovenian" msgstr "" -#: paperless/settings/__init__.py:569 +#: paperless/settings/__init__.py:575 msgid "Serbian" msgstr "" -#: paperless/settings/__init__.py:570 +#: paperless/settings/__init__.py:576 msgid "Swedish" msgstr "" -#: paperless/settings/__init__.py:571 +#: paperless/settings/__init__.py:577 msgid "Turkish" msgstr "" -#: paperless/settings/__init__.py:572 +#: paperless/settings/__init__.py:578 msgid "Ukrainian" msgstr "" -#: paperless/settings/__init__.py:573 +#: paperless/settings/__init__.py:579 msgid "Vietnamese" msgstr "" -#: paperless/settings/__init__.py:574 +#: paperless/settings/__init__.py:580 msgid "Chinese Simplified" msgstr "" -#: paperless/settings/__init__.py:575 +#: paperless/settings/__init__.py:581 msgid "Chinese Traditional" msgstr "" From 00baacb26c8e669d12c480a59274e7dc541fb82a Mon Sep 17 00:00:00 2001 From: shamoon <4887959+shamoon@users.noreply.github.com> Date: Tue, 23 Jun 2026 23:37:55 -0700 Subject: [PATCH 2/3] Update SECURITY.md to clarify design choice --- SECURITY.md | 1 + 1 file changed, 1 insertion(+) diff --git a/SECURITY.md b/SECURITY.md index 14e6d43ac..a7eafcc40 100644 --- a/SECURITY.md +++ b/SECURITY.md @@ -63,6 +63,7 @@ The following are not generally considered vulnerabilities unless accompanied by - optional webhook, mail, AI, OCR, or integration behavior described without a product-level vulnerability - missing limits or hardening settings presented without concrete impact - generic AI or static-analysis output that is not confirmed against the current codebase and a real deployment scenario +- the ability to attach objects that a user cannot access to a document by ID is an intentional design choice, and not considered a vulnerability ## Transparency From a8bfa25efd368361a0118aab3d6a0a6fddd3c68a Mon Sep 17 00:00:00 2001 From: shamoon <4887959+shamoon@users.noreply.github.com> Date: Sat, 27 Jun 2026 06:53:36 -0600 Subject: [PATCH 3/3] Fix (beta): preserve Unicode in localization prompt (#13055) --- src/paperless_ai/ai_classifier.py | 2 +- src/paperless_ai/tests/test_ai_classifier.py | 17 +++++++++++++++++ 2 files changed, 18 insertions(+), 1 deletion(-) diff --git a/src/paperless_ai/ai_classifier.py b/src/paperless_ai/ai_classifier.py index f9c2f1e06..41bf8e903 100644 --- a/src/paperless_ai/ai_classifier.py +++ b/src/paperless_ai/ai_classifier.py @@ -87,7 +87,7 @@ def build_localization_prompt(suggestions: dict, output_language: str) -> str: Return the same JSON schema with all fields present. Suggestions: - {json.dumps(suggestions)} + {json.dumps(suggestions, ensure_ascii=False)} """.strip() diff --git a/src/paperless_ai/tests/test_ai_classifier.py b/src/paperless_ai/tests/test_ai_classifier.py index 45822b14b..470c7fe07 100644 --- a/src/paperless_ai/tests/test_ai_classifier.py +++ b/src/paperless_ai/tests/test_ai_classifier.py @@ -239,6 +239,23 @@ def test_get_language_name_falls_back_to_language_code(): assert get_language_name("zz-zz") == "zz-zz" +def test_build_localization_prompt_preserves_unicode_characters(): + prompt = build_localization_prompt( + { + "title": "Gebührenbescheid", + "tags": [], + "correspondents": [], + "document_types": [], + "storage_paths": [], + "dates": [], + }, + output_language="de-de", + ) + + assert "Gebührenbescheid" in prompt + assert "\\u00fc" not in prompt + + @patch("paperless_ai.ai_classifier.query_similar_documents") def test_get_context_for_document( mock_query_similar_documents,