Merge remote-tracking branch 'upstream/dev' into feature/popover-previews

This commit is contained in:
Michael Shamoon 2021-03-03 21:19:51 -08:00
commit cba507258d
85 changed files with 8063 additions and 1702 deletions
.github/workflows
PipfilePipfile.lockREADME.md
ansible
defaults
molecule/default
tasks
docs
requirements.txt
src-ui
src

@ -47,8 +47,9 @@ jobs:
molecule converge
molecule idempotence
molecule verify
molecule destroy
working-directory: "${{ github.repository }}"
env:
TARGET_GITHUB_SHA: "${{ github.event.pull_request.head.sha }}"
# # https://galaxy.ansible.com/docs/contributing/importing.html
# release:
# runs-on: ubuntu-latest

@ -9,12 +9,12 @@ verify_ssl = true
name = "piwheels"
[packages]
dateparser = "~=0.7.6"
dateparser = "~=1.0.0"
django = "~=3.1.3"
django-cors-headers = "*"
django-extensions = "*"
django-filter = "~=2.4.0"
django-q = "~=1.3.4"
django-q = "==1.3.4"
djangorestframework = "~=3.12.2"
filelock = "*"
fuzzywuzzy = {extras = ["speedup"], version = "*"}
@ -53,7 +53,7 @@ concurrent-log-handler = "*"
# uvloop 0.15+ incompatible with python 3.6
uvloop = "~=0.14.0"
# TODO: keep an eye on piwheel builds and update this once available (https://www.piwheels.org/project/cryptography/)
cryptography = "~=3.3.2"
cryptography = "~=3.4"
"pdfminer.six" = "*"
[dev-packages]

123
Pipfile.lock generated

@ -1,7 +1,7 @@
{
"_meta": {
"hash": {
"sha256": "71959eb287fc97969263be5e3a1b1f4f369b7a5ace85bd1947a25b9b92e17e8a"
"sha256": "49f8a0718a7982bc4ca7e1315c17849523b0d29c38f13cff88f8f883e0e9943a"
},
"pipfile-spec": 6,
"requires": {},
@ -28,11 +28,11 @@
},
"arrow": {
"hashes": [
"sha256:e098abbd9af3665aea81bdd6c869e93af4feb078e98468dd351c383af187aac5",
"sha256:ff08d10cda1d36c68657d6ad20d74fbea493d980f8b2d45344e00d6ed2bf6ed4"
"sha256:7909d9fd30d32fa8fd173fdeb3f7125aaf6dedd1a837276fe1d8cea2c0e86d76",
"sha256:b1e106a0ab754e540f4aeb08747900830b688adef02d81240e65afc0e781a870"
],
"markers": "python_version >= '2.7' and python_version not in '3.0, 3.1, 3.2, 3.3, 3.4'",
"version": "==0.17.0"
"markers": "python_version >= '3.6'",
"version": "==1.0.1"
},
"asgiref": {
"hashes": [
@ -60,11 +60,11 @@
},
"autobahn": {
"hashes": [
"sha256:41a3a3f89cde48643baf4e105d9491c566295f9abee951379e59121784044b8b",
"sha256:7e6b1bf95196b733978bab2d54a7ab8899c16ce11be369dc58422c07b7eea726"
"sha256:884f79c50fdc55ade2c315946a9caa145e8b10075eee9d2c2594ea5e8f5226aa",
"sha256:bf7a9d302a34d0f719d43c57f65ca1f2f5c982dd6ea0c11e1e190ef6f43710fe"
],
"markers": "python_version >= '3.6'",
"version": "==21.2.1"
"markers": "python_version >= '3.7'",
"version": "==21.2.2"
},
"automat": {
"hashes": [
@ -76,10 +76,10 @@
},
"blessed": {
"hashes": [
"sha256:0a74a8d3f0366db600d061273df77d44f0db07daade7bb7a4d49c8bc22ed9f74",
"sha256:580429e7e0c6f6a42ea81b0ae5a4993b6205c6ccbb635d034b4277af8175753e"
"sha256:1312879f971330a1b7f2c6341f2ae7e2cbac244bfc9d0ecfbbecd4b0293bc755",
"sha256:5b5e2f0563d5a668c282f3f5946f7b1abb70c85829461900e607e74d7725106e"
],
"version": "==1.17.12"
"version": "==1.18.0"
},
"certifi": {
"hashes": [
@ -190,24 +190,22 @@
},
"cryptography": {
"hashes": [
"sha256:0d7b69674b738068fa6ffade5c962ecd14969690585aaca0a1b1fc9058938a72",
"sha256:1bd0ccb0a1ed775cd7e2144fe46df9dc03eefd722bbcf587b3e0616ea4a81eff",
"sha256:3c284fc1e504e88e51c428db9c9274f2da9f73fdf5d7e13a36b8ecb039af6e6c",
"sha256:49570438e60f19243e7e0d504527dd5fe9b4b967b5a1ff21cc12b57602dd85d3",
"sha256:541dd758ad49b45920dda3b5b48c968f8b2533d8981bcdb43002798d8f7a89ed",
"sha256:5a60d3780149e13b7a6ff7ad6526b38846354d11a15e21068e57073e29e19bed",
"sha256:7951a966613c4211b6612b0352f5bf29989955ee592c4a885d8c7d0f830d0433",
"sha256:922f9602d67c15ade470c11d616f2b2364950602e370c76f0c94c94ae672742e",
"sha256:a0f0b96c572fc9f25c3f4ddbf4688b9b38c69836713fb255f4a2715d93cbaf44",
"sha256:a777c096a49d80f9d2979695b835b0f9c9edab73b59e4ceb51f19724dda887ed",
"sha256:a9a4ac9648d39ce71c2f63fe7dc6db144b9fa567ddfc48b9fde1b54483d26042",
"sha256:aa4969f24d536ae2268c902b2c3d62ab464b5a66bcb247630d208a79a8098e9b",
"sha256:c7390f9b2119b2b43160abb34f63277a638504ef8df99f11cb52c1fda66a2e6f",
"sha256:ddd06e71c449a4fe10d0c60846280ee35d69ce49e3e413ce46d5f129e1468083",
"sha256:e18e6ab84dfb0ab997faf8cca25a86ff15dfea4027b986322026cc99e0a892da"
"sha256:066bc53f052dfeda2f2d7c195cf16fb3e5ff13e1b6b7415b468514b40b381a5b",
"sha256:0923ba600d00718d63a3976f23cab19aef10c1765038945628cd9be047ad0336",
"sha256:2d32223e5b0ee02943f32b19245b61a62db83a882f0e76cc564e1cec60d48f87",
"sha256:4169a27b818de4a1860720108b55a2801f32b6ae79e7f99c00d79f2a2822eeb7",
"sha256:57ad77d32917bc55299b16d3b996ffa42a1c73c6cfa829b14043c561288d2799",
"sha256:5ecf2bcb34d17415e89b546dbb44e73080f747e504273e4d4987630493cded1b",
"sha256:600cf9bfe75e96d965509a4c0b2b183f74a4fa6f5331dcb40fb7b77b7c2484df",
"sha256:66b57a9ca4b3221d51b237094b0303843b914b7d5afd4349970bb26518e350b0",
"sha256:926ae3dfd160050158b9ca25d419fb7ee658974564b01aa10c059a75dffab7e8",
"sha256:93cfe5b7ff006de13e1e89830810ecbd014791b042cbe5eec253be11ac2b28f3",
"sha256:9e98b452132963678e3ac6c73f7010fe53adf72209a32854d55690acac3f6724",
"sha256:df186fcbf86dc1ce56305becb8434e4b6b7504bc724b71ad7a3239e0c9d14ef2",
"sha256:fec7fb46b10da10d9e1d078d1ff8ed9e05ae14f431fdbd11145edd0550b9a964"
],
"index": "pypi",
"version": "==3.3.2"
"version": "==3.4.6"
},
"daphne": {
"hashes": [
@ -219,11 +217,11 @@
},
"dateparser": {
"hashes": [
"sha256:7552c994f893b5cb8fcf103b4cd2ff7f57aab9bfd2619fdf0cf571c0740fd90b",
"sha256:e875efd8c57c85c2d02b238239878db59ff1971f5a823457fcc69e493bf6ebfa"
"sha256:159cc4e01a593706a15cd4e269a0b3345edf3aef8bf9278a57dac8adf5bf1e4a",
"sha256:17202df32c7a36e773136ff353aa3767e987f8b3e27374c39fd21a30a803d6f8"
],
"index": "pypi",
"version": "==0.7.6"
"version": "==1.0.0"
},
"django": {
"hashes": [
@ -415,11 +413,11 @@
},
"imap-tools": {
"hashes": [
"sha256:0eaa9b990fae336601dd44f353fac2d35ea25ca3b1b682a83700511635fc30ae",
"sha256:1c809e286d439e41fbe796c522ad4e565fd47a4260253343fa1b1045b6bfe8b1"
"sha256:44641716f0c5c07df78c5713405675fac50220d4f8e2906c9ed4aabd9c356fa8",
"sha256:bab9a6edf848a58bdd3959ba55e0eb75039ff188a3779371d0b8db674a4945e8"
],
"index": "pypi",
"version": "==0.37.0"
"version": "==0.38.1"
},
"img2pdf": {
"hashes": [
@ -591,11 +589,11 @@
},
"ocrmypdf": {
"hashes": [
"sha256:0f624456a50be0b0bc8c0b59704d159f637616c093a1cabe8bb383706561bcf7",
"sha256:b829ad640a6160423162012e094ee2f7cd074ec99efadd7f7486954ec9182985"
"sha256:2fca4046e3a33e5902dd89c3003a3f31c7d584dc43f14c7c97f57fce20d2e469",
"sha256:5c386fcf2c0f2635533c2bad0edcd2d455f667a134d180dc61cbb3d4d5f0c8e2"
],
"index": "pypi",
"version": "==11.6.2"
"version": "==11.7.0"
},
"pathvalidate": {
"hashes": [
@ -784,14 +782,6 @@
"markers": "python_version >= '2.7' and python_version not in '3.0, 3.1, 3.2, 3.3'",
"version": "==2.20"
},
"pyhamcrest": {
"hashes": [
"sha256:412e00137858f04bde0729913874a48485665f2d36fe9ee449f26be864af9316",
"sha256:7ead136e03655af85069b6f47b23eb7c3e5c221aa9f022a4fbb499f5b7308f29"
],
"markers": "python_version >= '3.5'",
"version": "==2.0.2"
},
"pyopenssl": {
"hashes": [
"sha256:4c231c759543ba02560fcd2480c48dcec4dae34c9da7d3747c508227e0624b51",
@ -1097,45 +1087,22 @@
},
"tqdm": {
"hashes": [
"sha256:65185676e9fdf20d154cffd1c5de8e39ef9696ff7e59fe0156b1b08e468736af",
"sha256:70657337ec104eb4f3fb229285358f23f045433f6aea26846cdd55f0fd68945c"
"sha256:2c44efa73b8914dba7807aefd09653ac63c22b5b4ea34f7a80973f418f1a3089",
"sha256:c23ac707e8e8aabb825e4d91f8e17247f9cc14b0d64dd9e97be0781e9e525bba"
],
"index": "pypi",
"version": "==4.57.0"
"version": "==4.58.0"
},
"twisted": {
"extras": [
"tls"
],
"hashes": [
"sha256:0150dae5adc962d15e00054cc6926f1e64763fb8dd26e1632593ac06e592104b",
"sha256:040eb6641125d2a9a09cf198ec7b83dd8858c6f51f6770325ed9959c00f5098f",
"sha256:147780b8caf21ba2aef3688628eaf13d7e7fe02a86747cd54bfaf2140538f042",
"sha256:158ddb80719a4813d292293ac44ba41d8b56555ed009d90994a278237ee63d2c",
"sha256:15e52271f08f62e2230ff093e0278aa01c9dac057c4557cadadd2429eed86a3e",
"sha256:2182000d6ffc05d269e6c03bfcec8b57e20259ca1086180edaedec3f1e689292",
"sha256:25ffcf37944bdad4a99981bc74006d735a678d2b5c193781254fbbb6d69e3b22",
"sha256:3281d9ce889f7b21bdb73658e887141aa45a102baf3b2320eafcfba954fcefec",
"sha256:356e8d8dd3590e790e3dba4db139eb8a17aca64b46629c622e1b1597a4a92478",
"sha256:70952c56e4965b9f53b180daecf20a9595cf22b8d0935cd3bd664c90273c3ab2",
"sha256:7408c6635ee1b96587289283ebe90ee15dbf9614b05857b446055116bc822d29",
"sha256:7c547fd0215db9da8a1bc23182b309e84a232364cc26d829e9ee196ce840b114",
"sha256:894f6f3cfa57a15ea0d0714e4283913a5f2511dbd18653dd148eba53b3919797",
"sha256:94ac3d55a58c90e2075c5fe1853f2aa3892b73e3bf56395f743aefde8605eeaa",
"sha256:a58e61a2a01e5bcbe3b575c0099a2bcb8d70a75b1a087338e0c48dd6e01a5f15",
"sha256:c09c47ff9750a8e3aa60ad169c4b95006d455a29b80ad0901f031a103b2991cd",
"sha256:ca3a0b8c9110800e576d89b5337373e52018b41069bc879f12fa42b7eb2d0274",
"sha256:cd1dc5c85b58494138a3917752b54bb1daa0045d234b7c132c37a61d5483ebad",
"sha256:cdbc4c7f0cd7a2218b575844e970f05a1be1861c607b0e048c9bceca0c4d42f7",
"sha256:d267125cc0f1e8a0eed6319ba4ac7477da9b78a535601c49ecd20c875576433a",
"sha256:d72c55b5d56e176563b91d11952d13b01af8725c623e498db5507b6614fc1e10",
"sha256:d95803193561a243cb0401b0567c6b7987d3f2a67046770e1dccd1c9e49a9780",
"sha256:e92703bed0cc21d6cb5c61d66922b3b1564015ca8a51325bd164a5e33798d504",
"sha256:f058bd0168271de4dcdc39845b52dd0a4a2fecf5f1246335f13f5e96eaebb467",
"sha256:f3c19e5bd42bbe4bf345704ad7c326c74d3fd7a1b3844987853bef180be638d4"
"sha256:77544a8945cf69b98d2946689bbe0c75de7d145cdf11f391dd487eae8fc95a12",
"sha256:aab38085ea6cda5b378b519a0ec99986874921ee8881318626b0a3414bb2631e"
],
"markers": "python_version >= '2.7' and python_version not in '3.0, 3.1, 3.2, 3.3, 3.4'",
"version": "==20.3.0"
"markers": "python_full_version >= '3.5.4'",
"version": "==21.2.0"
},
"txaio": {
"hashes": [
@ -1490,11 +1457,11 @@
},
"faker": {
"hashes": [
"sha256:31a58ec5a8f4672f24da3b5ddea02c82a712de1de3179b432948e5c34d787aca",
"sha256:aadfe0efe11ecbbbc5b3b0b0fab050c2acbd2d8e5201769546d43d236bfff663"
"sha256:90b69e9e05d622edb2fa5ebfda7bef41c88675cace85e72689fde5b8723d00a3",
"sha256:da395fe545f40d4366b82b1a02448847a4586bd2b28af393b3edbd1e45d1e0fc"
],
"markers": "python_version >= '3.6'",
"version": "==6.4.1"
"version": "==6.5.0"
},
"filelock": {
"hashes": [

@ -104,9 +104,13 @@ Paperless has been around a while now, and people are starting to build stuff on
These projects also exist, but their status and compatibility with paperless-ng is unknown.
* [Paperless Desktop](https://github.com/thomasbrueggemann/paperless-desktop): A desktop UI for your Paperless installation. Runs on Mac, Linux, and Windows.
* [paperless-cli](https://github.com/stgarf/paperless-cli): A golang command line binary to interact with a Paperless instance.
This project also exists, but needs updates to be compatile with paperless-ng.
* [Paperless Desktop](https://github.com/thomasbrueggemann/paperless-desktop): A desktop UI for your Paperless installation. Runs on Mac, Linux, and Windows.
Known issues on Mac: (Could not load reminders and documents)
# Important Note
Document scanners are typically used to scan sensitive documents. Things like your social insurance number, tax records, invoices, etc. Everything is stored in the clear without encryption. This means that Paperless should never be run on an untrusted host. Instead, I recommend that if you do want to use it, run it locally on a server in your own home.

@ -18,8 +18,9 @@ paperlessng_directory: /opt/paperless-ng
paperlessng_consumption_dir: "{{ paperlessng_directory }}/consumption"
paperlessng_data_dir: "{{ paperlessng_directory }}/data"
paperlessng_media_root: "{{ paperlessng_directory }}/media"
paperlessng_static_dir: "{{ paperlessng_directory }}/static"
paperlessng_staticdir: "{{ paperlessng_directory }}/static"
paperlessng_filename_format:
paperlessng_logging_dir: "{{ paperlessng_data_dir }}/log"
paperlessng_virtualenv: "{{ paperlessng_directory }}/.venv"
# Hosting & Security
@ -36,12 +37,15 @@ paperlessng_enable_http_remote_user: False
paperlessng_ocr_languages:
- eng
paperlessng_ocr_mode: skip
paperlessng_ocr_clean: clean
paperlessng_ocr_deskew: True
paperlessng_ocr_rotate_pages: True
paperlessng_ocr_rotate_pages_threshold: 12
paperlessng_ocr_output_type: pdfa
paperlessng_ocr_pages: 0
paperlessng_ocr_image_dpi:
# see https://ocrmypdf.readthedocs.io/en/latest/api.html#ocrmypdf.ocr
paperlessng_ocr_user_args:
#- "deskew": True # https://github.com/jonaswinkler/paperless-ng/issues/231
- "optimize": 1
paperlessng_use_jbig2enc: True
paperlessng_big2enc_lossy: False
@ -57,10 +61,11 @@ paperlessng_consumer_polling: 0
paperlessng_consumer_delete_duplicates: False
paperlessng_consumer_recursive: False
paperlessng_consumer_subdirs_as_tags: False
paperlessng_convert_memory_limit: 0
paperlessng_convert_tmpdir:
paperlessng_optimize_thumbnails: True
paperlessng_post_consume_script:
paperlessng_filename_date_order:
paperlessng_filename_parse_transforms:
paperlessng_thumbnail_font_name: /usr/share/fonts/liberation/LiberationSerif-Regular.ttf
paperlessng_ignore_dates: ""

@ -4,7 +4,7 @@
tasks:
- name: set current github commit as version when available
set_fact:
paperlessng_version: "{{ lookup('env', 'GITHUB_SHA') | default('master', True) }}"
paperlessng_version: "{{ lookup('env', 'TARGET_GITHUB_SHA') | default('master', True) }}"
- name: update to newest paperless-ng release
include_role:
name: ansible

@ -43,7 +43,7 @@
- name: install ocr languages
apt:
pkg: "{{ paperlessng_ocr_languages | map('regex_replace', '^(.*)$', 'tesseract-ocr-\\1') | list }}"
pkg: "{{ paperlessng_ocr_languages | map('regex_replace', '^(.*)$', 'tesseract-ocr-\\1') | map('replace', '_', '-') | list }}"
- name: set up notesalexp repository key (for jbig2enc)
apt_key:
@ -256,7 +256,7 @@
- "{{ paperlessng_consumption_dir }}"
- "{{ paperlessng_data_dir }}"
- "{{ paperlessng_media_root }}"
- "{{ paperlessng_static_dir }}"
- "{{ paperlessng_staticdir }}"
- name: rename initial config
command:
@ -280,9 +280,11 @@
- regexp: PAPERLESS_MEDIA_ROOT
line: "PAPERLESS_MEDIA_ROOT={{ paperlessng_media_root }}"
- regexp: PAPERLESS_STATICDIR
line: "PAPERLESS_STATICDIR={{ paperlessng_static_dir }}"
line: "PAPERLESS_STATICDIR={{ paperlessng_staticdir }}"
- regexp: PAPERLESS_FILENAME_FORMAT
line: "PAPERLESS_FILENAME_FORMAT={{ paperlessng_filename_format }}"
- regexp: PAPERLESS_LOGGING_DIR
line: "PAPERLESS_LOGGING_DIR={{ paperlessng_logging_dir }}"
# Hosting & Security
- regexp: PAPERLESS_SECRET_KEY
line: "PAPERLESS_SECRET_KEY={{ paperlessng_secret_key }}"
@ -302,9 +304,17 @@
line: "PAPERLESS_ENABLE_HTTP_REMOTE_USER={{ paperlessng_enable_http_remote_user }}"
# OCR settings
- regexp: PAPERLESS_OCR_LANGUAGE
line: "PAPERLESS_OCR_LANGUAGE={{ paperlessng_ocr_languages | join('+') }}"
line: "PAPERLESS_OCR_LANGUAGE={{ paperlessng_ocr_languages | join('+') | replace('-','_') }}"
- regexp: PAPERLESS_OCR_MODE
line: "PAPERLESS_OCR_MODE={{ paperlessng_ocr_mode }}"
- regexp: PAPERLESS_OCR_CLEAN
line: "PAPERLESS_OCR_CLEAN={{ paperlessng_ocr_clean }}"
- regexp: PAPERLESS_OCR_DESKEW
line: "PAPERLESS_OCR_DESKEW={{ paperlessng_ocr_deskew }}"
- regexp: PAPERLESS_OCR_ROTATE_PAGES
line: "PAPERLESS_OCR_ROTATE_PAGES={{ paperlessng_ocr_rotate_pages }}"
- regexp: PAPERLESS_OCR_ROTATE_PAGES_THRESHOLD
line: "PAPERLESS_OCR_ROTATE_PAGES_THRESHOLD={{ paperlessng_ocr_rotate_pages_threshold }}"
- regexp: PAPERLESS_OCR_OUTPUT_TYPE
line: "PAPERLESS_OCR_OUTPUT_TYPE={{ paperlessng_ocr_output_type }}"
- regexp: PAPERLESS_OCR_PAGES
@ -331,6 +341,10 @@
line: "PAPERLESS_CONSUMER_RECURSIVE={{ paperlessng_consumer_recursive }}"
- regexp: PAPERLESS_CONSUMER_SUBDIRS_AS_TAGS
line: "PAPERLESS_CONSUMER_SUBDIRS_AS_TAGS={{ paperlessng_consumer_subdirs_as_tags }}"
- regexp: PAPERLESS_CONVERT_MEMORY_LIMIT
line: "PAPERLESS_CONVERT_MEMORY_LIMIT={{ paperlessng_convert_memory_limit }}"
- regexp: PAPERLESS_CONVERT_TMPDIR
line: "PAPERLESS_CONVERT_TMPDIR={{ paperlessng_convert_tmpdir }}"
- regexp: PAPERLESS_OPTIMIZE_THUMBNAILS
line: "PAPERLESS_OPTIMIZE_THUMBNAILS={{ paperlessng_optimize_thumbnails }}"
- regexp: PAPERLESS_POST_CONSUME_SCRIPT

@ -184,17 +184,17 @@ Downgrades are possible. However, some updates also contain database migrations
In order to move back from a version that applied database migrations, you'll have to revert the database migration *before* downgrading,
and then downgrade paperless.
This table lists the most recent database migrations for each versions:
This table lists the compatible versions for each database migration number.
+---------+-------------------------+
| Version | Latest migration number |
+---------+-------------------------+
| 1.0.0 | 1011 |
+---------+-------------------------+
| 1.1.0 | 1011 |
+---------+-------------------------+
| 1.1.1 | 1012 |
+---------+-------------------------+
+------------------+-----------------+
| Migration number | Version range |
+------------------+-----------------+
| 1011 | 1.0.0 |
+------------------+-----------------+
| 1012 | 1.1.0 - 1.2.1 |
+------------------+-----------------+
| 1013 | 1.3.0 - current |
+------------------+-----------------+
Execute the following management command to migrate your database:

@ -284,3 +284,53 @@ The endpoint supports the following optional form fields:
The endpoint will immediately return "OK" if the document consumption process
was started successfully. No additional status information about the consumption
process itself is available, since that happens in a different process.
.. _api-versioning:
API Versioning
##############
The REST API is versioned since Paperless-ng 1.3.0.
* Versioning ensures that changes to the API don't break older clients.
* Clients specify the specific version of the API they wish to use with every request and Paperless will handle the request using the specified API version.
* Even if the underlying data model changes, older API versions will always serve compatible data.
* If no version is specified, Paperless will serve version 1 to ensure compatibility with older clients that do not request a specific API version.
API versions are specified by submitting an additional HTTP ``Accept`` header with every request:
.. code::
Accept: application/json; version=6
If an invalid version is specified, Paperless 1.3.0 will respond with "406 Not Acceptable" and an error message in the body.
Earlier versions of Paperless will serve API version 1 regardless of whether a version is specified via the ``Accept`` header.
If a client wishes to verify whether it is compatible with any given server, the following procedure should be performed:
1. Perform an *authenticated* request against any API endpoint. If the server is on version 1.3.0 or newer, the server will
add two custom headers to the response:
.. code::
X-Api-Version: 2
X-Version: 1.3.0
2. Determine whether the client is compatible with this server based on the presence/absence of these headers and their values if present.
API Changelog
=============
Version 1
---------
Initial API version.
Version 2
---------
* Added field ``Tag.color``. This read/write string field contains a hex color such as ``#a6cee3``.
* Added read-only field ``Tag.text_color``. This field contains the text color to use for a specific tag, which is either black or white depending on the brightness of ``Tag.color``.
* Removed field ``Tag.colour``.

@ -5,10 +5,31 @@
Changelog
*********
paperless-ng 1.3.0
##################
This release contains new database migrations.
* Added a color picker for tag colors.
* Added translations into Italian and Romanian. Thank you!
* Close individual documents from the sidebar.
* `BolkoSchreiber <https://github.com/BolkoSchreiber>`_ added an option to disable/enable thumbnail inversion in dark mode.
* Fixed an issue with the auto matching algorithm when more than 256 tags were used.
* `Simon Taddiken <https://github.com/skuzzle>`_ added the ability to customize the header used for remote user authentication with SSO applications.
* The REST API is versioned from this point onwards. See the documentation about :ref:`api-versioning` for details.
paperless-ng 1.2.1
##################
* `Rodrigo Avelino <https://github.com/rodavelino>`_ translated Paperless into Portuguese (Brazil).
* `Rodrigo Avelino <https://github.com/rodavelino>`_ translated Paperless into Portuguese (Brazil)!
* The date input fields now respect the currently selected date format.
@ -16,6 +37,8 @@ paperless-ng 1.2.1
* When using regular expression matching, the regular expression is now validated before saving the tag/correspondent/type.
* Regression fix: Dates on the front end did not respect date locale settings in some cases.
paperless-ng 1.2.0
##################

@ -191,8 +191,28 @@ PAPERLESS_ENABLE_HTTP_REMOTE_USER=<bool>
Allows authentication via HTTP_REMOTE_USER which is used by some SSO
applications.
Defaults to `false` which disables this feature.
.. warning::
This will allow authentication by simply adding a ``Remote-User: <username>`` header
to a request. Use with care! You especially *must* ensure that any such header is not
passed from your proxy server to paperless.
If you're exposing paperless to the internet directly, do not use this.
Also see the warning `in the official documentation <https://docs.djangoproject.com/en/3.1/howto/auth-remote-user/#configuration>`.
Defaults to `false` which disables this feature.
PAPERLESS_HTTP_REMOTE_USER_HEADER_NAME=<str>
If `PAPERLESS_ENABLE_HTTP_REMOTE_USER` is enabled, this property allows to
customize the name of the HTTP header from which the authenticated username
is extracted. Values are in terms of
[HttpRequest.META](https://docs.djangoproject.com/en/3.1/ref/request-response/#django.http.HttpRequest.META).
Thus, the configured value must start with `HTTP_` followed by the
normalized actual header name.
Defaults to `HTTP_REMOTE_USER`.
.. _configuration-ocr:
OCR settings

@ -5,29 +5,82 @@ Paperless development
This section describes the steps you need to take to start development on paperless-ng.
1. Check out the source from github. The repository is organized in the following way:
Check out the source from github. The repository is organized in the following way:
* ``master`` always represents the latest release and will only see changes
when a new release is made.
* ``dev`` contains the code that will be in the next release.
* ``feature-X`` contain bigger changes that will be in some release, but not
necessarily the next one.
Apart from that, the folder structure is as follows:
* ``master`` always represents the latest release and will only see changes
when a new release is made.
* ``dev`` contains the code that will be in the next release.
* ``feature-X`` contain bigger changes that will be in some release, but not
necessarily the next one.
* ``docs/`` - Documentation.
* ``src-ui/`` - Code of the front end.
* ``src/`` - Code of the back end.
* ``scripts/`` - Various scripts that help with different parts of development.
* ``docker/`` - Files required to build the docker image.
When making functional changes to paperless, *always* make your changes on the ``dev`` branch.
2. Install some dependencies.
Apart from that, the folder structure is as follows:
* Python 3.6.
* All dependencies listed in the :ref:`Bare metal route <setup-bare_metal>`
* redis. You can either install redis or use the included scritps/start-services.sh
to use docker to fire up a redis instance (and some other services such as tika,
gotenberg and a postgresql server).
* ``docs/`` - Documentation.
* ``src-ui/`` - Code of the front end.
* ``src/`` - Code of the back end.
* ``scripts/`` - Various scripts that help with different parts of development.
* ``docker/`` - Files required to build the docker image.
Initial setup and first start
=============================
After you forked and cloned the code from github you need to perform a first-time setup.
To do the setup you need to perform the steps from the following chapters in a certain order:
1. Install prerequisites + pipenv as mentioned in :ref:`Bare metal route <setup-bare_metal>`
2. Copy ``paperless.conf.example`` to ``paperless.conf`` and enable debug mode.
3. Install the Angular CLI interface:
.. code:: shell-session
$ npm install -g @angular/cli
4. Create ``consume`` and ``media`` folders in the cloned root folder.
.. code:: shell-session
mkdir -p consume media
5. You can now either ...
* install redis or
* use the included scripts/start-services.sh to use docker to fire up a redis instance (and some other services such as tika, gotenberg and a postgresql server) or
* spin up a bare redis container
.. code:: shell-session
docker run -d -p 6379:6379 -restart unless-stopped redis:latest
6. Install the python dependencies by performing in the src/ directory.
.. code:: shell-session
pipenv install --dev
7. Generate the static UI so you can perform a login to get session that is required for frontend development (this needs to be done one time only). From root folder:
.. code:: shell-session
compile-frontend.sh
8. Apply migrations and create a superuser for your dev instance:
.. code:: shell-session
python3 manage.py migrate
python3 manage.py createsuperuser
9. Now spin up the dev backend. Depending on which part of paperless you're developing for, you need to have some or all of them running.
.. code:: shell-session
python3 manage.py runserver & python3 manage.py document_consumer & python3 manage.py qcluster
10. Login with the superuser credentials provided in step 8 at ``http://localhost:8000`` to create a session that enables you to use the backend.
Backend development environment is now ready, to start Frontend development go to ``/src-ui`` and run ``ng serve``. From there you can use ``http://localhost:4200`` for a preview.
Back end development
====================
@ -35,21 +88,18 @@ Back end development
The backend is a django application. I use PyCharm for development, but you can use whatever
you want.
Install the python dependencies by performing ``pipenv install --dev`` in the src/ directory.
This will also create a virtual environment, which you can enter with ``pipenv shell`` or
execute one-shot commands in with ``pipenv run``.
Copy ``paperless.conf.example`` to ``paperless.conf`` and enable debug mode.
Configure the IDE to use the src/ folder as the base source folder. Configure the following
launch configurations in your IDE:
* python3 manage.py runserver
* python3 manage.py qcluster
* python3 manage.py consumer
* python3 manage.py document_consumer
Depending on which part of paperless you're developing for, you need to have some or all of
them running.
To start them all:
.. code:: shell-session
python3 manage.py runserver & python3 manage.py document_consumer & python3 manage.py qcluster
Testing and code style:
@ -62,7 +112,7 @@ Testing and code style:
The line length rule E501 is generally useful for getting multiple source files
next to each other on the screen. However, in some cases, its just not possible
to make some lines fit, especially complicated IF cases. Append `` # NOQA: E501``
to make some lines fit, especially complicated IF cases. Append ``# NOQA: E501``
to disable this check for certain lines.
Front end development
@ -109,6 +159,92 @@ This will build the front end and put it in a location from which the Django ser
it as static content. This way, you can verify that authentication is working.
Localization
============
Paperless is available in many different languages. Since paperless consists both of a django
application and an Angular front end, both these parts have to be translated separately.
Front end localization
----------------------
* The Angular front end does localization according to the `Angular documentation <https://angular.io/guide/i18n>`_.
* The source language of the project is "en_US".
* The source strings end up in the file "src-ui/messages.xlf".
* The translated strings need to be placed in the "src-ui/src/locale/" folder.
* In order to extract added or changed strings from the source files, call ``ng xi18n --ivy``.
Adding new languages requires adding the translated files in the "src-ui/src/locale/" fodler and adjusting a couple files.
1. Adjust "src-ui/angular.json":
.. code:: json
"i18n": {
"sourceLocale": "en-US",
"locales": {
"de": "src/locale/messages.de.xlf",
"nl-NL": "src/locale/messages.nl_NL.xlf",
"fr": "src/locale/messages.fr.xlf",
"en-GB": "src/locale/messages.en_GB.xlf",
"pt-BR": "src/locale/messages.pt_BR.xlf",
"language-code": "language-file"
}
}
2. Add the language to the available options in "src-ui/src/app/services/settings.service.ts":
.. code:: typescript
getLanguageOptions(): LanguageOption[] {
return [
{code: "en-us", name: $localize`English (US)`, englishName: "English (US)", dateInputFormat: "mm/dd/yyyy"},
{code: "en-gb", name: $localize`English (GB)`, englishName: "English (GB)", dateInputFormat: "dd/mm/yyyy"},
{code: "de", name: $localize`German`, englishName: "German", dateInputFormat: "dd.mm.yyyy"},
{code: "nl", name: $localize`Dutch`, englishName: "Dutch", dateInputFormat: "dd-mm-yyyy"},
{code: "fr", name: $localize`French`, englishName: "French", dateInputFormat: "dd/mm/yyyy"},
{code: "pt-br", name: $localize`Portuguese (Brazil)`, englishName: "Portuguese (Brazil)", dateInputFormat: "dd/mm/yyyy"}
// Add your new language here
]
}
``dateInputFormat`` is a special string that defines the behavior of the date input fields and absolutely needs to contain "dd", "mm" and "yyyy".
3. Import and register the Angular data for this locale in "src-ui/src/app/app.module.ts":
.. code:: typescript
import localeDe from '@angular/common/locales/de';
registerLocaleData(localeDe)
Back end localization
---------------------
A majority of the strings that appear in the back end appear only when the admin is used. However,
some of these are still shown on the front end (such as error messages).
* The django application does localization according to the `django documentation <https://docs.djangoproject.com/en/3.1/topics/i18n/translation/>`_.
* The source language of the project is "en_US".
* Localization files end up in the folder "src/locale/".
* In order to extract strings from the application, call ``python3 manage.py makemessages -l en_US``. This is important after making changes to translatable strings.
* The message files need to be compiled for them to show up in the application. Call ``python3 manage.py compilemessages`` to do this. The generated files don't get
committed into git, since these are derived artifacts. The build pipeline takes care of executing this command.
Adding new languages requires adding the translated files in the "src/locale/" folder and adjusting the file "src/paperless/settings.py" to include the new language:
.. code:: python
LANGUAGES = [
("en-us", _("English (US)")),
("en-gb", _("English (GB)")),
("de", _("German")),
("nl-nl", _("Dutch")),
("fr", _("French")),
("pt-br", _("Portuguese (Brazil)")),
# Add language here.
]
Building the documentation
==========================

@ -284,6 +284,12 @@ writing. Windows is not and will never be supported.
* ``libmagic-dev`` for mime type detection
* ``mime-support`` for mime type detection
Use this list for your preferred package management:
.. code::
python3 python3-pip python3-dev imagemagick fonts-liberation optipng gnupg libpq-dev libmagic-dev mime-support
These dependencies are required for OCRmyPDF, which is used for text recognition.
* ``unpaper``
@ -297,6 +303,12 @@ writing. Windows is not and will never be supported.
* ``tesseract-ocr`` >= 4.0.0 for OCR
* ``tesseract-ocr`` language packs (``tesseract-ocr-eng``, ``tesseract-ocr-deu``, etc)
Use this list for your preferred package management:
.. code::
unpaper ghostscript icc-profiles-free qpdf liblept5 libxml2 pngquant zlib1g tesseract-ocr
On Raspberry Pi, these libraries are required as well:
* ``libatlas-base-dev``

@ -8,13 +8,13 @@
-i https://pypi.python.org/simple
--extra-index-url https://www.piwheels.org/simple
aioredis==1.3.1
arrow==0.17.0; python_version >= '2.7' and python_version not in '3.0, 3.1, 3.2, 3.3, 3.4'
arrow==1.0.1; python_version >= '3.6'
asgiref==3.3.1; python_version >= '3.5'
async-timeout==3.0.1; python_full_version >= '3.5.3'
attrs==20.3.0; python_version >= '2.7' and python_version not in '3.0, 3.1, 3.2, 3.3'
autobahn==21.2.1; python_version >= '3.6'
autobahn==21.2.2; python_version >= '3.7'
automat==20.2.0
blessed==1.17.12
blessed==1.18.0
certifi==2020.12.5
cffi==1.14.5
channels-redis==3.2.0
@ -24,9 +24,9 @@ click==7.1.2; python_version >= '2.7' and python_version not in '3.0, 3.1, 3.2,
coloredlogs==15.0; python_version >= '2.7' and python_version not in '3.0, 3.1, 3.2, 3.3, 3.4'
concurrent-log-handler==0.9.19
constantly==15.1.0
cryptography==3.3.2
cryptography==3.4.6
daphne==3.0.1; python_version >= '3.6'
dateparser==0.7.6
dateparser==1.0.0
django-cors-headers==3.7.0
django-extensions==3.1.1
django-filter==2.4.0
@ -43,7 +43,7 @@ httptools==0.1.1
humanfriendly==9.1; python_version >= '2.7' and python_version not in '3.0, 3.1, 3.2, 3.3, 3.4'
hyperlink==21.0.0
idna==2.10; python_version >= '2.7' and python_version not in '3.0, 3.1, 3.2, 3.3'
imap-tools==0.37.0
imap-tools==0.38.1
img2pdf==0.4.0
incremental==17.5.0
inotify-simple==1.3.5; python_version >= '2.7' and python_version not in '3.0, 3.1, 3.2, 3.3'
@ -53,7 +53,7 @@ langdetect==1.0.8
lxml==4.6.2; python_version >= '2.7' and python_version not in '3.0, 3.1, 3.2, 3.3, 3.4'
msgpack==1.0.2
numpy==1.19.5
ocrmypdf==11.6.2
ocrmypdf==11.7.0
pathvalidate==2.3.2
pdfminer.six==20201018
pikepdf==2.5.2
@ -64,7 +64,6 @@ psycopg2-binary==2.8.6
pyasn1-modules==0.2.8
pyasn1==0.4.8
pycparser==2.20; python_version >= '2.7' and python_version not in '3.0, 3.1, 3.2, 3.3'
pyhamcrest==2.0.2; python_version >= '3.5'
pyopenssl==20.0.1; python_version >= '2.7' and python_version not in '3.0, 3.1, 3.2, 3.3, 3.4'
python-dateutil==2.8.1
python-dotenv==0.15.0
@ -85,8 +84,8 @@ sortedcontainers==2.3.0
sqlparse==0.4.1; python_version >= '3.5'
threadpoolctl==2.1.0; python_version >= '3.5'
tika==1.24
tqdm==4.57.0
twisted[tls]==20.3.0; python_version >= '2.7' and python_version not in '3.0, 3.1, 3.2, 3.3, 3.4'
tqdm==4.58.0
twisted[tls]==21.2.0; python_full_version >= '3.5.4'
txaio==21.2.1; python_version >= '3.6'
tzlocal==2.1
urllib3==1.26.3; python_version >= '2.7' and python_version not in '3.0, 3.1, 3.2, 3.3, 3.4' and python_version < '4'

@ -20,7 +20,9 @@
"nl-NL": "src/locale/messages.nl_NL.xlf",
"fr": "src/locale/messages.fr.xlf",
"en-GB": "src/locale/messages.en_GB.xlf",
"pt-BR": "src/locale/messages.pt_BR.xlf"
"pt-BR": "src/locale/messages.pt_BR.xlf",
"it": "src/locale/messages.it.xlf",
"ro": "src/locale/messages.ro.xlf"
}
},
"architect": {

@ -419,7 +419,7 @@
<source>Do you really want to delete the tag &quot;<x id="PH" equiv-text="object.name"/>&quot;?</source>
<context-group purpose="location">
<context context-type="sourcefile">src/app/components/manage/tag-list/tag-list.component.ts</context>
<context context-type="linenumber">30</context>
<context context-type="linenumber">26</context>
</context-group>
</trans-unit>
<trans-unit id="cafc87479686947e2590b9f588a88040aeaf660b" datatype="html">
@ -517,35 +517,35 @@
<source>Saved view &quot;<x id="PH" equiv-text="savedView.name"/>&quot; deleted.</source>
<context-group purpose="location">
<context context-type="sourcefile">src/app/components/manage/settings/settings.component.ts</context>
<context context-type="linenumber">67</context>
<context context-type="linenumber">68</context>
</context-group>
</trans-unit>
<trans-unit id="5647210819299459618" datatype="html">
<source>Settings saved successfully.</source>
<context-group purpose="location">
<context context-type="sourcefile">src/app/components/manage/settings/settings.component.ts</context>
<context context-type="linenumber">87</context>
<context context-type="linenumber">89</context>
</context-group>
</trans-unit>
<trans-unit id="6839066544204061364" datatype="html">
<source>Use system language</source>
<context-group purpose="location">
<context context-type="sourcefile">src/app/components/manage/settings/settings.component.ts</context>
<context context-type="linenumber">92</context>
<context context-type="linenumber">94</context>
</context-group>
</trans-unit>
<trans-unit id="7729897675462249787" datatype="html">
<source>Use date format of display language</source>
<context-group purpose="location">
<context context-type="sourcefile">src/app/components/manage/settings/settings.component.ts</context>
<context context-type="linenumber">98</context>
<context context-type="linenumber">100</context>
</context-group>
</trans-unit>
<trans-unit id="8488620293789898901" datatype="html">
<source>Error while storing settings on server: <x id="PH" equiv-text="JSON.stringify(error.error)"/></source>
<context-group purpose="location">
<context context-type="sourcefile">src/app/components/manage/settings/settings.component.ts</context>
<context context-type="linenumber">115</context>
<context context-type="linenumber">117</context>
</context-group>
</trans-unit>
<trans-unit id="121cc5391cd2a5115bc2b3160379ee5b36cd7716" datatype="html">
@ -566,14 +566,14 @@
<source>Notifications</source>
<context-group purpose="location">
<context context-type="sourcefile">src/app/components/manage/settings/settings.component.html</context>
<context context-type="linenumber">115</context>
<context context-type="linenumber">116</context>
</context-group>
</trans-unit>
<trans-unit id="99dee94e92dbd9e21a008d4569f9719ed206ae37" datatype="html">
<source>Saved views</source>
<context-group purpose="location">
<context context-type="sourcefile">src/app/components/manage/settings/settings.component.html</context>
<context context-type="linenumber">133</context>
<context context-type="linenumber">134</context>
</context-group>
</trans-unit>
<trans-unit id="bbe41ac2ea4a6c00ea941a41b33105048f8e9f13" datatype="html">
@ -681,102 +681,109 @@
<context context-type="linenumber">98</context>
</context-group>
</trans-unit>
<trans-unit id="71bad20b37410c8972c9aa0f7c62996534b84339" datatype="html">
<source>Invert thumbnails in dark mode</source>
<context-group purpose="location">
<context context-type="sourcefile">src/app/components/manage/settings/settings.component.html</context>
<context context-type="linenumber">99</context>
</context-group>
</trans-unit>
<trans-unit id="3863a86cd9e69a61d143d3daf51df44203df4a82" datatype="html">
<source>Bulk editing</source>
<context-group purpose="location">
<context context-type="sourcefile">src/app/components/manage/settings/settings.component.html</context>
<context context-type="linenumber">102</context>
<context context-type="linenumber">103</context>
</context-group>
</trans-unit>
<trans-unit id="c0ac61661c6c326d6e0e00c231b95cf2ac0c6586" datatype="html">
<source>Show confirmation dialogs</source>
<context-group purpose="location">
<context context-type="sourcefile">src/app/components/manage/settings/settings.component.html</context>
<context context-type="linenumber">106</context>
<context context-type="linenumber">107</context>
</context-group>
</trans-unit>
<trans-unit id="291bbe56ecbe945dcf05580a57d679fa7bd1e06a" datatype="html">
<source>Deleting documents will always ask for confirmation.</source>
<context-group purpose="location">
<context context-type="sourcefile">src/app/components/manage/settings/settings.component.html</context>
<context context-type="linenumber">106</context>
<context context-type="linenumber">107</context>
</context-group>
</trans-unit>
<trans-unit id="8cfddc13e04f5545ac63f419ef363505d6f78c2e" datatype="html">
<source>Apply on close</source>
<context-group purpose="location">
<context context-type="sourcefile">src/app/components/manage/settings/settings.component.html</context>
<context context-type="linenumber">107</context>
<context context-type="linenumber">108</context>
</context-group>
</trans-unit>
<trans-unit id="8680abbea249ebe9c2fe35556559c8e1a9eb5841" datatype="html">
<source>Document processing</source>
<context-group purpose="location">
<context context-type="sourcefile">src/app/components/manage/settings/settings.component.html</context>
<context context-type="linenumber">118</context>
<context context-type="linenumber">119</context>
</context-group>
</trans-unit>
<trans-unit id="2ad4d76b36341c589d94004ad2a213fd4d6f5ca0" datatype="html">
<source>Show notifications when new documents are detected</source>
<context-group purpose="location">
<context context-type="sourcefile">src/app/components/manage/settings/settings.component.html</context>
<context context-type="linenumber">122</context>
<context context-type="linenumber">123</context>
</context-group>
</trans-unit>
<trans-unit id="e775f4f7c40249d31426ae61a21616a0c9d8e84f" datatype="html">
<source>Show notifications when document processing completes successfully</source>
<context-group purpose="location">
<context context-type="sourcefile">src/app/components/manage/settings/settings.component.html</context>
<context context-type="linenumber">123</context>
<context context-type="linenumber">124</context>
</context-group>
</trans-unit>
<trans-unit id="e3844dd174d8e817ddb551fae28f14ae80ca36b6" datatype="html">
<source>Show notifications when document processing fails</source>
<context-group purpose="location">
<context context-type="sourcefile">src/app/components/manage/settings/settings.component.html</context>
<context context-type="linenumber">124</context>
<context context-type="linenumber">125</context>
</context-group>
</trans-unit>
<trans-unit id="af113f7c9f7e13145c3461f61a1aedf12d57bd71" datatype="html">
<source>Suppress notifications on dashboard</source>
<context-group purpose="location">
<context context-type="sourcefile">src/app/components/manage/settings/settings.component.html</context>
<context context-type="linenumber">125</context>
<context context-type="linenumber">126</context>
</context-group>
</trans-unit>
<trans-unit id="e27bd3804d2936a6897e81c2e52e294490e5e5a8" datatype="html">
<source>This will suppress all messages about document processing status on the dashboard.</source>
<context-group purpose="location">
<context context-type="sourcefile">src/app/components/manage/settings/settings.component.html</context>
<context context-type="linenumber">125</context>
<context context-type="linenumber">126</context>
</context-group>
</trans-unit>
<trans-unit id="8cb90334f5dfd7fc67205085f59381e2a334ccfc" datatype="html">
<source>Appears on</source>
<context-group purpose="location">
<context context-type="sourcefile">src/app/components/manage/settings/settings.component.html</context>
<context context-type="linenumber">145</context>
<context context-type="linenumber">146</context>
</context-group>
</trans-unit>
<trans-unit id="6717cf1acf04728fc2b7c39f6d3297f8ff15fde5" datatype="html">
<source>Show on dashboard</source>
<context-group purpose="location">
<context context-type="sourcefile">src/app/components/manage/settings/settings.component.html</context>
<context context-type="linenumber">148</context>
<context context-type="linenumber">149</context>
</context-group>
</trans-unit>
<trans-unit id="541bfc5b123b3f8867fd681eaceefb663a811973" datatype="html">
<source>Show in sidebar</source>
<context-group purpose="location">
<context context-type="sourcefile">src/app/components/manage/settings/settings.component.html</context>
<context context-type="linenumber">152</context>
<context context-type="linenumber">153</context>
</context-group>
</trans-unit>
<trans-unit id="abba764a7a595d04dc8c3b26e04b3780d4fdb540" datatype="html">
<source>No saved views defined.</source>
<context-group purpose="location">
<context context-type="sourcefile">src/app/components/manage/settings/settings.component.html</context>
<context context-type="linenumber">162</context>
<context context-type="linenumber">163</context>
</context-group>
</trans-unit>
<trans-unit id="ef60a738a565f498b858e903e42bc5ffc3cc1299" datatype="html">
@ -867,28 +874,28 @@
<source>Create new tag</source>
<context-group purpose="location">
<context context-type="sourcefile">src/app/components/manage/tag-list/tag-edit-dialog/tag-edit-dialog.component.ts</context>
<context context-type="linenumber">21</context>
<context context-type="linenumber">22</context>
</context-group>
</trans-unit>
<trans-unit id="5872175735754226507" datatype="html">
<source>Edit tag</source>
<context-group purpose="location">
<context context-type="sourcefile">src/app/components/manage/tag-list/tag-edit-dialog/tag-edit-dialog.component.ts</context>
<context context-type="linenumber">25</context>
<context context-type="linenumber">26</context>
</context-group>
</trans-unit>
<trans-unit id="f2a30b4e1a89a8a0db0bd147b54d6626b9a9bc42" datatype="html">
<source>Inbox tag</source>
<context-group purpose="location">
<context context-type="sourcefile">src/app/components/manage/tag-list/tag-edit-dialog/tag-edit-dialog.component.html</context>
<context context-type="linenumber">21</context>
<context context-type="linenumber">13</context>
</context-group>
</trans-unit>
<trans-unit id="5e2f1a4ea12a1b8606ee3f0548d0ba64bf266077" datatype="html">
<source>Inbox tags are automatically assigned to all consumed documents.</source>
<context-group purpose="location">
<context context-type="sourcefile">src/app/components/manage/tag-list/tag-edit-dialog/tag-edit-dialog.component.html</context>
<context context-type="linenumber">21</context>
<context context-type="linenumber">13</context>
</context-group>
</trans-unit>
<trans-unit id="6672809941092516947" datatype="html">
@ -973,42 +980,42 @@
<source>Manage</source>
<context-group purpose="location">
<context context-type="sourcefile">src/app/components/app-frame/app-frame.component.html</context>
<context context-type="linenumber">107</context>
<context context-type="linenumber">112</context>
</context-group>
</trans-unit>
<trans-unit id="408cb6073e60c5d966296a3207fc596adca75e01" datatype="html">
<source>Admin</source>
<context-group purpose="location">
<context context-type="sourcefile">src/app/components/app-frame/app-frame.component.html</context>
<context context-type="linenumber">149</context>
<context context-type="linenumber">154</context>
</context-group>
</trans-unit>
<trans-unit id="321e4419a943044e674beb55b8039f42a9761ca5" datatype="html">
<source>Info</source>
<context-group purpose="location">
<context context-type="sourcefile">src/app/components/app-frame/app-frame.component.html</context>
<context context-type="linenumber">155</context>
<context context-type="linenumber">160</context>
</context-group>
</trans-unit>
<trans-unit id="fcfd4675b4c90f08d18d3abede9a9a4dff4cfdc7" datatype="html">
<source>Documentation</source>
<context-group purpose="location">
<context context-type="sourcefile">src/app/components/app-frame/app-frame.component.html</context>
<context context-type="linenumber">162</context>
<context context-type="linenumber">167</context>
</context-group>
</trans-unit>
<trans-unit id="355a222236bc01b9a8cd3cb9ecf76891125aed69" datatype="html">
<source>GitHub</source>
<context-group purpose="location">
<context context-type="sourcefile">src/app/components/app-frame/app-frame.component.html</context>
<context context-type="linenumber">170</context>
<context context-type="linenumber">175</context>
</context-group>
</trans-unit>
<trans-unit id="ea3a452c5238897cabc5781308cceb2d37dcf258" datatype="html">
<source>Suggest an idea</source>
<context-group purpose="location">
<context context-type="sourcefile">src/app/components/app-frame/app-frame.component.html</context>
<context context-type="linenumber">176</context>
<context context-type="linenumber">181</context>
</context-group>
</trans-unit>
<trans-unit id="af665f8de8fabe306aaf27443957e69bcbbce63c" datatype="html">
@ -1029,84 +1036,98 @@
<source>Close all</source>
<context-group purpose="location">
<context context-type="sourcefile">src/app/components/app-frame/app-frame.component.html</context>
<context context-type="linenumber">101</context>
<context context-type="linenumber">106</context>
</context-group>
</trans-unit>
<trans-unit id="5701618810648052610" datatype="html">
<source>Title</source>
<context-group purpose="location">
<context context-type="sourcefile">src/app/components/document-list/filter-editor/filter-editor.component.ts</context>
<context context-type="linenumber">73</context>
</context-group>
</trans-unit>
<trans-unit id="3100631071441658964" datatype="html">
<source>Title &amp; content</source>
<context-group purpose="location">
<context context-type="sourcefile">src/app/components/document-list/filter-editor/filter-editor.component.ts</context>
<context context-type="linenumber">74</context>
</context-group>
</trans-unit>
<trans-unit id="5195932016807797291" datatype="html">
<source>Correspondent: <x id="PH" equiv-text="this.correspondents.find(c =&gt; c.id == +rule.value)?.name"/></source>
<context-group purpose="location">
<context context-type="sourcefile">src/app/components/document-list/filter-editor/filter-editor.component.ts</context>
<context context-type="linenumber">29</context>
<context context-type="linenumber">32</context>
</context-group>
</trans-unit>
<trans-unit id="8170755470576301659" datatype="html">
<source>Without correspondent</source>
<context-group purpose="location">
<context context-type="sourcefile">src/app/components/document-list/filter-editor/filter-editor.component.ts</context>
<context context-type="linenumber">31</context>
<context context-type="linenumber">34</context>
</context-group>
</trans-unit>
<trans-unit id="8705701325879965907" datatype="html">
<source>Type: <x id="PH" equiv-text="this.documentTypes.find(dt =&gt; dt.id == +rule.value)?.name"/></source>
<context-group purpose="location">
<context context-type="sourcefile">src/app/components/document-list/filter-editor/filter-editor.component.ts</context>
<context context-type="linenumber">36</context>
<context context-type="linenumber">39</context>
</context-group>
</trans-unit>
<trans-unit id="4362173610367509215" datatype="html">
<source>Without document type</source>
<context-group purpose="location">
<context context-type="sourcefile">src/app/components/document-list/filter-editor/filter-editor.component.ts</context>
<context context-type="linenumber">38</context>
<context context-type="linenumber">41</context>
</context-group>
</trans-unit>
<trans-unit id="8180755793012580465" datatype="html">
<source>Tag: <x id="PH" equiv-text="this.tags.find(t =&gt; t.id == +rule.value)?.name"/></source>
<context-group purpose="location">
<context context-type="sourcefile">src/app/components/document-list/filter-editor/filter-editor.component.ts</context>
<context context-type="linenumber">42</context>
<context context-type="linenumber">45</context>
</context-group>
</trans-unit>
<trans-unit id="6494566478302448576" datatype="html">
<source>Without any tag</source>
<context-group purpose="location">
<context context-type="sourcefile">src/app/components/document-list/filter-editor/filter-editor.component.ts</context>
<context context-type="linenumber">46</context>
<context context-type="linenumber">49</context>
</context-group>
</trans-unit>
<trans-unit id="6523384805359286307" datatype="html">
<source>Title: <x id="PH" equiv-text="rule.value"/></source>
<context-group purpose="location">
<context context-type="sourcefile">src/app/components/document-list/filter-editor/filter-editor.component.ts</context>
<context context-type="linenumber">50</context>
<context context-type="linenumber">53</context>
</context-group>
</trans-unit>
<trans-unit id="02d184c288f567825a1fcbf83bcd3099a10853d5" datatype="html">
<source>Filter tags</source>
<context-group purpose="location">
<context context-type="sourcefile">src/app/components/document-list/filter-editor/filter-editor.component.html</context>
<context context-type="linenumber">12</context>
<context context-type="linenumber">20</context>
</context-group>
</trans-unit>
<trans-unit id="4b089ca12c472cf0b46167bb5afe4b527b301bbc" datatype="html">
<source>Filter correspondents</source>
<context-group purpose="location">
<context context-type="sourcefile">src/app/components/document-list/filter-editor/filter-editor.component.html</context>
<context context-type="linenumber">20</context>
<context context-type="linenumber">28</context>
</context-group>
</trans-unit>
<trans-unit id="0ad509732aaf702b7ea8c771c7809fa84bc85908" datatype="html">
<source>Filter document types</source>
<context-group purpose="location">
<context context-type="sourcefile">src/app/components/document-list/filter-editor/filter-editor.component.html</context>
<context context-type="linenumber">27</context>
<context context-type="linenumber">35</context>
</context-group>
</trans-unit>
<trans-unit id="2d9d55f1b70142ff4597ba32179d16888fd9c6b2" datatype="html">
<source>Reset filters</source>
<context-group purpose="location">
<context context-type="sourcefile">src/app/components/document-list/filter-editor/filter-editor.component.html</context>
<context context-type="linenumber">50</context>
<context context-type="linenumber">58</context>
</context-group>
</trans-unit>
<trans-unit id="7593728289020204896" datatype="html">
@ -1128,28 +1149,28 @@
<source>Last 7 days</source>
<context-group purpose="location">
<context context-type="sourcefile">src/app/components/common/date-dropdown/date-dropdown.component.ts</context>
<context context-type="linenumber">24</context>
<context context-type="linenumber">34</context>
</context-group>
</trans-unit>
<trans-unit id="4463380307954693363" datatype="html">
<source>Last month</source>
<context-group purpose="location">
<context context-type="sourcefile">src/app/components/common/date-dropdown/date-dropdown.component.ts</context>
<context context-type="linenumber">25</context>
<context context-type="linenumber">35</context>
</context-group>
</trans-unit>
<trans-unit id="8697368973702409683" datatype="html">
<source>Last 3 months</source>
<context-group purpose="location">
<context context-type="sourcefile">src/app/components/common/date-dropdown/date-dropdown.component.ts</context>
<context context-type="linenumber">26</context>
<context context-type="linenumber">36</context>
</context-group>
</trans-unit>
<trans-unit id="3566342898065860218" datatype="html">
<source>Last year</source>
<context-group purpose="location">
<context context-type="sourcefile">src/app/components/common/date-dropdown/date-dropdown.component.ts</context>
<context context-type="linenumber">27</context>
<context context-type="linenumber">37</context>
</context-group>
</trans-unit>
<trans-unit id="be2add3a3d9e4e2556b8f9048a15a9c0f00bf1ad" datatype="html">
@ -1163,7 +1184,7 @@
<source>Before</source>
<context-group purpose="location">
<context context-type="sourcefile">src/app/components/common/date-dropdown/date-dropdown.component.html</context>
<context context-type="linenumber">29</context>
<context context-type="linenumber">38</context>
</context-group>
</trans-unit>
<trans-unit id="99ee4faa69cd2ea8e3678c1f557c0ff1f05aae46" datatype="html">
@ -1602,7 +1623,7 @@
<source>Invalid date.</source>
<context-group purpose="location">
<context context-type="sourcefile">src/app/components/common/input/date/date.component.html</context>
<context context-type="linenumber">13</context>
<context context-type="linenumber">14</context>
</context-group>
</trans-unit>
<trans-unit id="2807800733729323332" datatype="html">
@ -1630,49 +1651,63 @@
<source>English (US)</source>
<context-group purpose="location">
<context context-type="sourcefile">src/app/services/settings.service.ts</context>
<context context-type="linenumber">88</context>
<context context-type="linenumber">90</context>
</context-group>
</trans-unit>
<trans-unit id="6987083569809053351" datatype="html">
<source>English (GB)</source>
<context-group purpose="location">
<context context-type="sourcefile">src/app/services/settings.service.ts</context>
<context context-type="linenumber">89</context>
<context context-type="linenumber">91</context>
</context-group>
</trans-unit>
<trans-unit id="1858110241312746425" datatype="html">
<source>German</source>
<context-group purpose="location">
<context context-type="sourcefile">src/app/services/settings.service.ts</context>
<context context-type="linenumber">90</context>
<context context-type="linenumber">92</context>
</context-group>
</trans-unit>
<trans-unit id="3071065188816255493" datatype="html">
<source>Dutch</source>
<context-group purpose="location">
<context context-type="sourcefile">src/app/services/settings.service.ts</context>
<context context-type="linenumber">91</context>
<context context-type="linenumber">93</context>
</context-group>
</trans-unit>
<trans-unit id="7633754075223722162" datatype="html">
<source>French</source>
<context-group purpose="location">
<context context-type="sourcefile">src/app/services/settings.service.ts</context>
<context context-type="linenumber">92</context>
<context context-type="linenumber">94</context>
</context-group>
</trans-unit>
<trans-unit id="9184513005098760425" datatype="html">
<source>Portuguese (Brazil)</source>
<context-group purpose="location">
<context context-type="sourcefile">src/app/services/settings.service.ts</context>
<context context-type="linenumber">93</context>
<context context-type="linenumber">95</context>
</context-group>
</trans-unit>
<trans-unit id="2935232983274991580" datatype="html">
<source>Italian</source>
<context-group purpose="location">
<context context-type="sourcefile">src/app/services/settings.service.ts</context>
<context context-type="linenumber">96</context>
</context-group>
</trans-unit>
<trans-unit id="8118856427047826368" datatype="html">
<source>Romanian</source>
<context-group purpose="location">
<context context-type="sourcefile">src/app/services/settings.service.ts</context>
<context context-type="linenumber">97</context>
</context-group>
</trans-unit>
<trans-unit id="4912706592792948707" datatype="html">
<source>ISO 8601</source>
<context-group purpose="location">
<context context-type="sourcefile">src/app/services/settings.service.ts</context>
<context context-type="linenumber">98</context>
<context context-type="linenumber">102</context>
</context-group>
</trans-unit>
<trans-unit id="2119857572761283468" datatype="html">
@ -1798,13 +1833,6 @@
<context context-type="linenumber">18</context>
</context-group>
</trans-unit>
<trans-unit id="5701618810648052610" datatype="html">
<source>Title</source>
<context-group purpose="location">
<context context-type="sourcefile">src/app/services/rest/document.service.ts</context>
<context context-type="linenumber">19</context>
</context-group>
</trans-unit>
<trans-unit id="5066119607229701477" datatype="html">
<source>Document type</source>
<context-group purpose="location">
@ -1833,97 +1861,6 @@
<context context-type="linenumber">23</context>
</context-group>
</trans-unit>
<trans-unit id="2056433880533904076" datatype="html">
<source>Light blue</source>
<context-group purpose="location">
<context context-type="sourcefile">src/app/data/paperless-tag.ts</context>
<context context-type="linenumber">6</context>
</context-group>
</trans-unit>
<trans-unit id="4082253113407591781" datatype="html">
<source>Blue</source>
<context-group purpose="location">
<context context-type="sourcefile">src/app/data/paperless-tag.ts</context>
<context context-type="linenumber">7</context>
</context-group>
</trans-unit>
<trans-unit id="1143414876575720034" datatype="html">
<source>Light green</source>
<context-group purpose="location">
<context context-type="sourcefile">src/app/data/paperless-tag.ts</context>
<context context-type="linenumber">8</context>
</context-group>
</trans-unit>
<trans-unit id="119581980963263815" datatype="html">
<source>Green</source>
<context-group purpose="location">
<context context-type="sourcefile">src/app/data/paperless-tag.ts</context>
<context context-type="linenumber">9</context>
</context-group>
</trans-unit>
<trans-unit id="3250646524116252719" datatype="html">
<source>Light red</source>
<context-group purpose="location">
<context context-type="sourcefile">src/app/data/paperless-tag.ts</context>
<context context-type="linenumber">10</context>
</context-group>
</trans-unit>
<trans-unit id="1628552745302385832" datatype="html">
<source>Red </source>
<context-group purpose="location">
<context context-type="sourcefile">src/app/data/paperless-tag.ts</context>
<context context-type="linenumber">11</context>
</context-group>
</trans-unit>
<trans-unit id="5479028842846122610" datatype="html">
<source>Light orange</source>
<context-group purpose="location">
<context context-type="sourcefile">src/app/data/paperless-tag.ts</context>
<context context-type="linenumber">12</context>
</context-group>
</trans-unit>
<trans-unit id="8598918991528773310" datatype="html">
<source>Orange</source>
<context-group purpose="location">
<context context-type="sourcefile">src/app/data/paperless-tag.ts</context>
<context context-type="linenumber">13</context>
</context-group>
</trans-unit>
<trans-unit id="1789283185177957430" datatype="html">
<source>Light violet</source>
<context-group purpose="location">
<context context-type="sourcefile">src/app/data/paperless-tag.ts</context>
<context context-type="linenumber">14</context>
</context-group>
</trans-unit>
<trans-unit id="2682868487071320453" datatype="html">
<source>Violet</source>
<context-group purpose="location">
<context context-type="sourcefile">src/app/data/paperless-tag.ts</context>
<context context-type="linenumber">15</context>
</context-group>
</trans-unit>
<trans-unit id="1449010446077321264" datatype="html">
<source>Brown</source>
<context-group purpose="location">
<context context-type="sourcefile">src/app/data/paperless-tag.ts</context>
<context context-type="linenumber">16</context>
</context-group>
</trans-unit>
<trans-unit id="30300572504753589" datatype="html">
<source>Black</source>
<context-group purpose="location">
<context context-type="sourcefile">src/app/data/paperless-tag.ts</context>
<context context-type="linenumber">17</context>
</context-group>
</trans-unit>
<trans-unit id="461048771215121187" datatype="html">
<source>Light grey</source>
<context-group purpose="location">
<context context-type="sourcefile">src/app/data/paperless-tag.ts</context>
<context context-type="linenumber">18</context>
</context-group>
</trans-unit>
<trans-unit id="4561076822163447092" datatype="html">
<source>Create new item</source>
<context-group purpose="location">

@ -2035,6 +2035,11 @@
"to-fast-properties": "^2.0.0"
}
},
"@ctrl/tinycolor": {
"version": "3.4.0",
"resolved": "https://registry.npmjs.org/@ctrl/tinycolor/-/tinycolor-3.4.0.tgz",
"integrity": "sha512-JZButFdZ1+/xAfpguQHoabIXkcqRRKpMrWKBkpEZZyxfY9C1DpADFB8PEqGSTeFr135SaTRfKqGKx5xSCLI7ZQ=="
},
"@istanbuljs/schema": {
"version": "0.1.2",
"resolved": "https://registry.npmjs.org/@istanbuljs/schema/-/schema-0.1.2.tgz",
@ -7895,6 +7900,11 @@
"object-visit": "^1.0.0"
}
},
"material-colors": {
"version": "1.2.6",
"resolved": "https://registry.npmjs.org/material-colors/-/material-colors-1.2.6.tgz",
"integrity": "sha512-6qE4B9deFBIa9YSpOc9O0Sgc43zTeVYbgDT5veRKSlB2+ZuHNoVVxA1L/ckMUayV9Ay9y7Z/SZCLcGteW9i7bg=="
},
"md5.js": {
"version": "1.3.5",
"resolved": "https://registry.npmjs.org/md5.js/-/md5.js-1.3.5.tgz",
@ -8333,6 +8343,16 @@
}
}
},
"ngx-color": {
"version": "6.2.0",
"resolved": "https://registry.npmjs.org/ngx-color/-/ngx-color-6.2.0.tgz",
"integrity": "sha512-n04tcMnCpOgmI24egST94YwHmnSoAxK8O1T2t3nGrTwWbvw5XBRJvImNFnoNrriBXzc4Gx4hFehH5MU8CZxp1w==",
"requires": {
"@ctrl/tinycolor": "^3.1.6",
"material-colors": "^1.2.6",
"tslib": "^2.0.0"
}
},
"ngx-cookie-service": {
"version": "10.1.1",
"resolved": "https://registry.npmjs.org/ngx-cookie-service/-/ngx-cookie-service-10.1.1.tgz",

@ -25,6 +25,7 @@
"bootstrap": "^4.5.0",
"file-saver": "^2.0.5",
"ng-bootstrap": "^1.6.3",
"ngx-color": "^6.2.0",
"ngx-cookie-service": "^10.1.1",
"ngx-file-drop": "^10.0.0",
"ngx-infinite-scroll": "^9.1.0",

@ -61,18 +61,26 @@ import { CustomDatePipe } from './pipes/custom-date.pipe';
import { DateComponent } from './components/common/input/date/date.component';
import { ISODateTimeAdapter } from './utils/ngb-iso-date-time-adapter';
import { LocalizedDateParserFormatter } from './utils/ngb-date-parser-formatter';
import { ApiVersionInterceptor } from './interceptors/api-version.interceptor';
import { ColorSliderModule } from 'ngx-color/slider';
import { ColorComponent } from './components/common/input/color/color.component';
import localeFr from '@angular/common/locales/fr';
import localeNl from '@angular/common/locales/nl';
import localeDe from '@angular/common/locales/de';
import localePt from '@angular/common/locales/pt-PT';
import localePt from '@angular/common/locales/pt';
import localeIt from '@angular/common/locales/it';
import localeEnGb from '@angular/common/locales/en-GB';
import localeRo from '@angular/common/locales/ro';
registerLocaleData(localeFr)
registerLocaleData(localeNl)
registerLocaleData(localeDe)
registerLocaleData(localePt, "pt-BR")
registerLocaleData(localeIt)
registerLocaleData(localeEnGb)
registerLocaleData(localeRo)
@NgModule({
declarations: [
@ -123,7 +131,8 @@ registerLocaleData(localeEnGb)
NumberComponent,
SafePipe,
CustomDatePipe,
DateComponent
DateComponent,
ColorComponent
],
imports: [
BrowserModule,
@ -134,7 +143,8 @@ registerLocaleData(localeEnGb)
ReactiveFormsModule,
NgxFileDropModule,
InfiniteScrollModule,
NgSelectModule
NgSelectModule,
ColorSliderModule
],
providers: [
DatePipe,
@ -142,6 +152,10 @@ registerLocaleData(localeEnGb)
provide: HTTP_INTERCEPTORS,
useClass: CsrfInterceptor,
multi: true
},{
provide: HTTP_INTERCEPTORS,
useClass: ApiVersionInterceptor,
multi: true
},
FilterPipe,
DocumentTitlePipe,

@ -92,6 +92,11 @@
<svg class="sidebaricon" fill="currentColor">
<use xlink:href="assets/bootstrap-icons.svg#file-text"/>
</svg>&nbsp;{{d.title | documentTitle}}
<span class="close bg-light" (click)="closeDocument(d); $event.preventDefault()">
<svg xmlns="http://www.w3.org/2000/svg" fill="currentColor" class="bi bi-x" viewBox="0 0 16 16">
<use xlink:href="assets/bootstrap-icons.svg#x"/>
</svg>
</span>
</a>
</li>
<li class="nav-item w-100" *ngIf="openDocuments.length > 1">

@ -62,16 +62,45 @@
flex-wrap: nowrap;
}
.nav-item .nav-link-additional {
margin-top: 0.2rem;
margin-left: 0.25rem;
padding-top: 0.5rem;
.nav-item {
position: relative;
svg {
margin-bottom: 2px;
&:hover .close {
display: block;
}
.close {
display: none;
position: absolute;
cursor: pointer;
opacity: 1;
top: 0;
padding: .25rem .3rem 0;
right: .4rem;
width: 1.8rem;
height: 100%;
svg {
opacity: 0.5;
}
&:hover svg {
opacity: 1;
}
}
.nav-link-additional {
margin-top: 0.2rem;
margin-left: 0.25rem;
padding-top: 0.5rem;
svg {
margin-bottom: 2px;
}
}
}
/*
* Navbar
*/

@ -1,7 +1,7 @@
import { Component, OnDestroy, OnInit } from '@angular/core';
import { Component, OnInit } from '@angular/core';
import { FormControl } from '@angular/forms';
import { ActivatedRoute, Router } from '@angular/router';
import { from, Observable, Subscription } from 'rxjs';
import { ActivatedRoute, Router, Params } from '@angular/router';
import { from, Observable, Subscription, BehaviorSubject } from 'rxjs';
import { debounceTime, distinctUntilChanged, map, switchMap } from 'rxjs/operators';
import { PaperlessDocument } from 'src/app/data/paperless-document';
import { OpenDocumentsService } from 'src/app/services/open-documents.service';
@ -16,7 +16,7 @@ import { Meta } from '@angular/platform-browser';
templateUrl: './app-frame.component.html',
styleUrls: ['./app-frame.component.scss']
})
export class AppFrameComponent implements OnInit, OnDestroy {
export class AppFrameComponent implements OnInit {
constructor (
public router: Router,
@ -26,7 +26,7 @@ export class AppFrameComponent implements OnInit, OnDestroy {
public savedViewService: SavedViewService,
private meta: Meta
) {
}
versionString = `${environment.appTitle} ${environment.version}`
@ -39,9 +39,9 @@ export class AppFrameComponent implements OnInit, OnDestroy {
searchField = new FormControl('')
openDocuments: PaperlessDocument[] = []
openDocumentsSubscription: Subscription
get openDocuments(): PaperlessDocument[] {
return this.openDocumentsService.getOpenDocuments()
}
searchAutoComplete = (text$: Observable<string>) =>
text$.pipe(
@ -77,12 +77,24 @@ export class AppFrameComponent implements OnInit, OnDestroy {
this.router.navigate(['search'], {queryParams: {query: this.searchField.value}})
}
closeDocument(d: PaperlessDocument) {
this.closeMenu()
this.openDocumentsService.closeDocument(d)
let route = this.activatedRoute.snapshot
while (route.firstChild) {
route = route.firstChild
}
if (route.component == DocumentDetailComponent && route.params['id'] == d.id) {
this.router.navigate([""])
}
}
closeAll() {
this.closeMenu()
this.openDocumentsService.closeAll()
// TODO: is there a better way to do this?
let route = this.activatedRoute
let route = this.activatedRoute.snapshot
while (route.firstChild) {
route = route.firstChild
}
@ -92,13 +104,6 @@ export class AppFrameComponent implements OnInit, OnDestroy {
}
ngOnInit() {
this.openDocuments = this.openDocumentsService.getOpenDocuments()
}
ngOnDestroy() {
if (this.openDocumentsSubscription) {
this.openDocumentsSubscription.unsubscribe()
}
}
get displayName() {

@ -20,7 +20,7 @@
</div>
<div class="input-group input-group-sm">
<input class="form-control" [placeholder]="datePlaceHolder" id="dateAfter" (dateSelect)="onChangeDebounce()" (change)="onChangeDebounce()"
<input class="form-control" [placeholder]="datePlaceHolder" (dateSelect)="onChangeDebounce()" (change)="onChangeDebounce()"
[(ngModel)]="dateAfter" ngbDatepicker #dateAfterPicker="ngbDatepicker">
<div class="input-group-append">
<button class="btn btn-outline-secondary" (click)="dateAfterPicker.toggle()" type="button">
@ -45,7 +45,7 @@
</div>
<div class="input-group input-group-sm">
<input class="form-control" [placeholder]="datePlaceHolder" id="dateBefore" (dateSelect)="onChangeDebounce()" (change)="onChangeDebounce()"
<input class="form-control" [placeholder]="datePlaceHolder" (dateSelect)="onChangeDebounce()" (change)="onChangeDebounce()"
[(ngModel)]="dateBefore" ngbDatepicker #dateBeforePicker="ngbDatepicker">
<div class="input-group-append">
<button class="btn btn-outline-secondary" (click)="dateBeforePicker.toggle()" type="button">

@ -0,0 +1,33 @@
<div class="form-group">
<label [for]="inputId">{{title}}</label>
<div class="input-group" [class.is-invalid]="error">
<div class="input-group-prepend">
<span class="input-group-text" [style.background-color]="value">&nbsp;&nbsp;&nbsp;</span>
</div>
<ng-template #popContent>
<div style="min-width: 200px;" class="pb-3">
<color-slider [color]="value" (onChangeComplete)="colorChanged($event.color.hex)"></color-slider>
</div>
</ng-template>
<input class="form-control" [class.is-invalid]="error" [id]="inputId" [(ngModel)]="value" (change)="onChange(value)" [autoClose]="'outside'" [ngbPopover]="popContent" placement="bottom" popoverClass="shadow">
<div class="input-group-append">
<button class="btn btn-outline-secondary" type="button" (click)="randomize()">
<svg xmlns="http://www.w3.org/2000/svg" width="16" height="16" fill="currentColor" class="bi bi-dice-5" viewBox="0 0 16 16">
<path d="M13 1a2 2 0 0 1 2 2v10a2 2 0 0 1-2 2H3a2 2 0 0 1-2-2V3a2 2 0 0 1 2-2h10zM3 0a3 3 0 0 0-3 3v10a3 3 0 0 0 3 3h10a3 3 0 0 0 3-3V3a3 3 0 0 0-3-3H3z"/>
<path d="M5.5 4a1.5 1.5 0 1 1-3 0 1.5 1.5 0 0 1 3 0zm8 0a1.5 1.5 0 1 1-3 0 1.5 1.5 0 0 1 3 0zm0 8a1.5 1.5 0 1 1-3 0 1.5 1.5 0 0 1 3 0zm-8 0a1.5 1.5 0 1 1-3 0 1.5 1.5 0 0 1 3 0zm4-4a1.5 1.5 0 1 1-3 0 1.5 1.5 0 0 1 3 0z"/>
</svg>
</button>
</div>
</div>
<small *ngIf="hint" class="form-text text-muted">{{hint}}</small>
<div class="invalid-feedback">
{{error}}
</div>
</div>

@ -0,0 +1,25 @@
import { ComponentFixture, TestBed } from '@angular/core/testing';
import { ColorComponent } from './color.component';
describe('ColorComponent', () => {
let component: ColorComponent;
let fixture: ComponentFixture<ColorComponent>;
beforeEach(async () => {
await TestBed.configureTestingModule({
declarations: [ ColorComponent ]
})
.compileComponents();
});
beforeEach(() => {
fixture = TestBed.createComponent(ColorComponent);
component = fixture.componentInstance;
fixture.detectChanges();
});
it('should create', () => {
expect(component).toBeTruthy();
});
});

@ -0,0 +1,30 @@
import { Component, forwardRef } from '@angular/core';
import { NG_VALUE_ACCESSOR } from '@angular/forms';
import { randomColor } from 'src/app/utils/color';
import { AbstractInputComponent } from '../abstract-input';
@Component({
providers: [{
provide: NG_VALUE_ACCESSOR,
useExisting: forwardRef(() => ColorComponent),
multi: true
}],
selector: 'app-input-color',
templateUrl: './color.component.html',
styleUrls: ['./color.component.scss']
})
export class ColorComponent extends AbstractInputComponent<string> {
constructor() {
super()
}
randomize() {
this.colorChanged(randomColor())
}
colorChanged(value) {
this.value = value
this.onChange(value)
}
}

@ -1,7 +1,7 @@
<div class="form-group">
<label [for]="inputId">{{title}}</label>
<div class="input-group">
<input [class.is-invalid]="error" class="form-control" [placeholder]="placeholder" [id]="inputId" (dateSelect)="onChange(value)" (change)="onChange(value)"
<div class="input-group" [class.is-invalid]="error">
<input class="form-control" [class.is-invalid]="error" [placeholder]="placeholder" [id]="inputId" (dateSelect)="onChange(value)" (change)="onChange(value)"
name="dp" [(ngModel)]="value" ngbDatepicker #datePicker="ngbDatepicker" #datePickerContent="ngModel">
<div class="input-group-append">
<button class="btn btn-outline-secondary calendar" (click)="datePicker.toggle()" type="button">
@ -10,6 +10,7 @@
</svg>
</button>
</div>
<div class="invalid-feedback" *ngIf="error" i18n>Invalid date.</div>
</div>
<div class="invalid-feedback" i18n>Invalid date.</div>
<small *ngIf="hint" class="form-text text-muted">{{hint}}</small>
</div>

@ -1,2 +1,2 @@
<span *ngIf="!clickable" class="badge" [style.background]="getColour().value" [style.color]="getColour().textColor">{{tag.name}}</span>
<a [routerLink]="" [title]="linkTitle" *ngIf="clickable" class="badge" [style.background]="getColour().value" [style.color]="getColour().textColor">{{tag.name}}</a>
<span *ngIf="!clickable" class="badge" [style.background]="tag.color" [style.color]="tag.text_color">{{tag.name}}</span>
<a [routerLink]="" [title]="linkTitle" *ngIf="clickable" class="badge" [style.background]="tag.color" [style.color]="tag.text_color">{{tag.name}}</a>

@ -1,5 +1,5 @@
import { Component, Input, OnInit } from '@angular/core';
import { TAG_COLOURS, PaperlessTag } from 'src/app/data/paperless-tag';
import { PaperlessTag } from 'src/app/data/paperless-tag';
@Component({
selector: 'app-tag',
@ -22,8 +22,4 @@ export class TagComponent implements OnInit {
ngOnInit(): void {
}
getColour() {
return TAG_COLOURS.find(c => c.id == this.tag.colour)
}
}

@ -1,7 +1,7 @@
<div class="card mb-3 shadow-sm" [class.card-selected]="selected" [class.document-card]="selectable" [class.popover-hidden]="popoverHidden" (mouseleave)="mouseLeaveCard()">
<div class="row no-gutters">
<div class="col-md-2 d-none d-lg-block doc-img-background rounded-left" [class.doc-img-background-selected]="selected" (click)="this.toggleSelected.emit($event)">
<img [src]="getThumbUrl()" class="card-img doc-img border-right rounded-left">
<img [src]="getThumbUrl()" class="card-img doc-img border-right rounded-left" [class.inverted]="getIsThumbInverted()">
<div style="top: 0; left: 0" class="position-absolute border-right border-bottom bg-light p-1" [class.document-card-check]="!selected">
<div class="custom-control custom-checkbox">

@ -3,6 +3,7 @@ import { DomSanitizer } from '@angular/platform-browser';
import { PaperlessDocument } from 'src/app/data/paperless-document';
import { PaperlessDocumentMetadata } from 'src/app/data/paperless-document-metadata';
import { DocumentService } from 'src/app/services/rest/document.service';
import { SettingsService, SETTINGS_KEYS } from 'src/app/services/settings.service';
import { NgbPopover } from '@ng-bootstrap/ng-bootstrap';
@Component({
@ -12,7 +13,7 @@ import { NgbPopover } from '@ng-bootstrap/ng-bootstrap';
})
export class DocumentCardLargeComponent implements OnInit {
constructor(private documentService: DocumentService, private sanitizer: DomSanitizer) { }
constructor(private documentService: DocumentService, private sanitizer: DomSanitizer, private settingsService: SettingsService) { }
@Input()
selected = false
@ -65,6 +66,10 @@ export class DocumentCardLargeComponent implements OnInit {
})
}
getIsThumbInverted() {
return this.settingsService.get(SETTINGS_KEYS.DARK_MODE_THUMB_INVERTED)
}
getDetailsAsString() {
if (typeof this.details === 'string') {
return this.details.substring(0, 500)

@ -1,7 +1,7 @@
<div class="col p-2 h-100">
<div class="card h-100 shadow-sm document-card" [class.card-selected]="selected" [class.popover-hidden]="popoverHidden" (mouseleave)="mouseLeaveCard()">
<div class="border-bottom doc-img-container" [class.doc-img-background-selected]="selected" (click)="this.toggleSelected.emit($event)">
<img class="card-img doc-img rounded-top" [src]="getThumbUrl()">
<img class="card-img doc-img rounded-top" [class.inverted]="getIsThumbInverted()" [src]="getThumbUrl()">
<div class="border-right border-bottom bg-light p-1 rounded document-card-check">
<div class="custom-control custom-checkbox">

@ -3,6 +3,7 @@ import { map } from 'rxjs/operators';
import { PaperlessDocument } from 'src/app/data/paperless-document';
import { PaperlessDocumentMetadata } from 'src/app/data/paperless-document-metadata';
import { DocumentService } from 'src/app/services/rest/document.service';
import { SettingsService, SETTINGS_KEYS } from 'src/app/services/settings.service';
import { NgbPopover } from '@ng-bootstrap/ng-bootstrap';
@Component({
@ -12,7 +13,7 @@ import { NgbPopover } from '@ng-bootstrap/ng-bootstrap';
})
export class DocumentCardSmallComponent implements OnInit {
constructor(private documentService: DocumentService) { }
constructor(private documentService: DocumentService, private settingsService: SettingsService) { }
@Input()
selected = false
@ -44,6 +45,10 @@ export class DocumentCardSmallComponent implements OnInit {
})
}
getIsThumbInverted() {
return this.settingsService.get(SETTINGS_KEYS.DARK_MODE_THUMB_INVERTED)
}
getThumbUrl() {
return this.documentService.getThumbUrl(this.document.id)
}

@ -2,7 +2,15 @@
<div class="col mb-2 mb-xl-0">
<div class="form-inline d-flex align-items-center">
<label class="text-muted mr-2 mb-0" i18n>Filter by:</label>
<input class="form-control form-control-sm flex-fill w-auto" type="text" [(ngModel)]="titleFilter" placeholder="Title" i18n-placeholder>
<div class="input-group input-group-sm flex-fill w-auto">
<div class="input-group-prepend" ngbDropdown>
<button class="btn btn-outline-primary" ngbDropdownToggle>{{textFilterTargetName}}</button>
<div class="dropdown-menu shadow" ngbDropdownMenu>
<button *ngFor="let t of textFilterTargets" ngbDropdownItem [class.active]="textFilterTarget == t.id" (click)="changeTextFilterTarget(t.id)">{{t.name}}</button>
</div>
</div>
<input class="form-control form-control-sm" type="text" [(ngModel)]="textFilter">
</div>
</div>
</div>
<div class="w-100 d-xl-none"></div>

@ -8,10 +8,13 @@ import { DocumentTypeService } from 'src/app/services/rest/document-type.service
import { TagService } from 'src/app/services/rest/tag.service';
import { CorrespondentService } from 'src/app/services/rest/correspondent.service';
import { FilterRule } from 'src/app/data/filter-rule';
import { FILTER_ADDED_AFTER, FILTER_ADDED_BEFORE, FILTER_CORRESPONDENT, FILTER_CREATED_AFTER, FILTER_CREATED_BEFORE, FILTER_DOCUMENT_TYPE, FILTER_HAS_ANY_TAG, FILTER_HAS_TAG, FILTER_TITLE } from 'src/app/data/filter-rule-type';
import { FILTER_ADDED_AFTER, FILTER_ADDED_BEFORE, FILTER_CORRESPONDENT, FILTER_CREATED_AFTER, FILTER_CREATED_BEFORE, FILTER_DOCUMENT_TYPE, FILTER_HAS_ANY_TAG, FILTER_HAS_TAG, FILTER_TITLE, FILTER_TITLE_CONTENT } from 'src/app/data/filter-rule-type';
import { FilterableDropdownSelectionModel } from '../../common/filterable-dropdown/filterable-dropdown.component';
import { ToggleableItemState } from '../../common/filterable-dropdown/toggleable-dropdown-button/toggleable-dropdown-button.component';
const TEXT_FILTER_TARGET_TITLE = "title"
const TEXT_FILTER_TARGET_TITLE_CONTENT = "title-content"
@Component({
selector: 'app-filter-editor',
templateUrl: './filter-editor.component.html',
@ -64,7 +67,19 @@ export class FilterEditorComponent implements OnInit, OnDestroy {
correspondents: PaperlessCorrespondent[] = []
documentTypes: PaperlessDocumentType[] = []
_titleFilter = ""
_textFilter = ""
textFilterTargets = [
{id: TEXT_FILTER_TARGET_TITLE, name: $localize`Title`},
{id: TEXT_FILTER_TARGET_TITLE_CONTENT, name: $localize`Title & content`}
]
textFilterTarget = TEXT_FILTER_TARGET_TITLE_CONTENT
get textFilterTargetName() {
return this.textFilterTargets.find(t => t.id == this.textFilterTarget)?.name
}
tagSelectionModel = new FilterableDropdownSelectionModel()
correspondentSelectionModel = new FilterableDropdownSelectionModel()
@ -80,7 +95,7 @@ export class FilterEditorComponent implements OnInit, OnDestroy {
this.documentTypeSelectionModel.clear(false)
this.tagSelectionModel.clear(false)
this.correspondentSelectionModel.clear(false)
this._titleFilter = null
this._textFilter = null
this.dateAddedBefore = null
this.dateAddedAfter = null
this.dateCreatedBefore = null
@ -89,7 +104,12 @@ export class FilterEditorComponent implements OnInit, OnDestroy {
value.forEach(rule => {
switch (rule.rule_type) {
case FILTER_TITLE:
this._titleFilter = rule.value
this._textFilter = rule.value
this.textFilterTarget = TEXT_FILTER_TARGET_TITLE
break
case FILTER_TITLE_CONTENT:
this._textFilter = rule.value
this.textFilterTarget = TEXT_FILTER_TARGET_TITLE_CONTENT
break
case FILTER_CREATED_AFTER:
this.dateCreatedAfter = rule.value
@ -121,8 +141,11 @@ export class FilterEditorComponent implements OnInit, OnDestroy {
get filterRules(): FilterRule[] {
let filterRules: FilterRule[] = []
if (this._titleFilter) {
filterRules.push({rule_type: FILTER_TITLE, value: this._titleFilter})
if (this._textFilter && this.textFilterTarget == TEXT_FILTER_TARGET_TITLE_CONTENT) {
filterRules.push({rule_type: FILTER_TITLE_CONTENT, value: this._textFilter})
}
if (this._textFilter && this.textFilterTarget == TEXT_FILTER_TARGET_TITLE) {
filterRules.push({rule_type: FILTER_TITLE, value: this._textFilter})
}
if (this.tagSelectionModel.isNoneSelected()) {
filterRules.push({rule_type: FILTER_HAS_ANY_TAG, value: "false"})
@ -165,15 +188,15 @@ export class FilterEditorComponent implements OnInit, OnDestroy {
this.filterRulesChange.next(this.filterRules)
}
get titleFilter() {
return this._titleFilter
get textFilter() {
return this._textFilter
}
set titleFilter(value) {
this.titleFilterDebounce.next(value)
set textFilter(value) {
this.textFilterDebounce.next(value)
}
titleFilterDebounce: Subject<string>
textFilterDebounce: Subject<string>
subscription: Subscription
ngOnInit() {
@ -181,19 +204,19 @@ export class FilterEditorComponent implements OnInit, OnDestroy {
this.correspondentService.listAll().subscribe(result => this.correspondents = result.results)
this.documentTypeService.listAll().subscribe(result => this.documentTypes = result.results)
this.titleFilterDebounce = new Subject<string>()
this.textFilterDebounce = new Subject<string>()
this.subscription = this.titleFilterDebounce.pipe(
this.subscription = this.textFilterDebounce.pipe(
debounceTime(400),
distinctUntilChanged()
).subscribe(title => {
this._titleFilter = title
).subscribe(text => {
this._textFilter = text
this.updateRules()
})
}
ngOnDestroy() {
this.titleFilterDebounce.complete()
this.textFilterDebounce.complete()
}
resetSelected() {
@ -223,4 +246,9 @@ export class FilterEditorComponent implements OnInit, OnDestroy {
onDocumentTypeDropdownOpen() {
this.documentTypeSelectionModel.apply()
}
changeTextFilterTarget(target) {
this.textFilterTarget = target
this.updateRules()
}
}

@ -85,6 +85,7 @@
<div class="col">
<app-input-check i18n-title title="Use system settings" formControlName="darkModeUseSystem"></app-input-check>
<app-input-check [hidden]="settingsForm.value.darkModeUseSystem" i18n-title title="Enable dark mode" formControlName="darkModeEnabled"></app-input-check>
<app-input-check i18n-title title="Invert thumbnails in dark mode" formControlName="darkModeInvertThumbs"></app-input-check>
</div>
</div>

@ -21,6 +21,7 @@ export class SettingsComponent implements OnInit {
'documentListItemPerPage': new FormControl(this.settings.get(SETTINGS_KEYS.DOCUMENT_LIST_SIZE)),
'darkModeUseSystem': new FormControl(this.settings.get(SETTINGS_KEYS.DARK_MODE_USE_SYSTEM)),
'darkModeEnabled': new FormControl(this.settings.get(SETTINGS_KEYS.DARK_MODE_ENABLED)),
'darkModeInvertThumbs': new FormControl(this.settings.get(SETTINGS_KEYS.DARK_MODE_THUMB_INVERTED)),
'savedViews': this.savedViewGroup,
'displayLanguage': new FormControl(this.settings.getLanguage()),
'dateLocale': new FormControl(this.settings.get(SETTINGS_KEYS.DATE_LOCALE)),
@ -73,6 +74,7 @@ export class SettingsComponent implements OnInit {
this.settings.set(SETTINGS_KEYS.DOCUMENT_LIST_SIZE, this.settingsForm.value.documentListItemPerPage)
this.settings.set(SETTINGS_KEYS.DARK_MODE_USE_SYSTEM, this.settingsForm.value.darkModeUseSystem)
this.settings.set(SETTINGS_KEYS.DARK_MODE_ENABLED, (this.settingsForm.value.darkModeEnabled == true).toString())
this.settings.set(SETTINGS_KEYS.DARK_MODE_THUMB_INVERTED, (this.settingsForm.value.darkModeInvertThumbs == true).toString())
this.settings.set(SETTINGS_KEYS.DATE_LOCALE, this.settingsForm.value.dateLocale)
this.settings.set(SETTINGS_KEYS.DATE_FORMAT, this.settingsForm.value.dateFormat)
this.settings.set(SETTINGS_KEYS.NOTIFICATIONS_CONSUMER_NEW_DOCUMENT, this.settingsForm.value.notificationsConsumerNewDocument)

@ -8,15 +8,7 @@
<div class="modal-body">
<app-input-text i18n-title title="Name" formControlName="name" [error]="error?.name"></app-input-text>
<div class="form-group paperless-input-select">
<label for="colour" i18n>Color</label>
<ng-select name="colour" formControlName="colour" [items]="getColours()" bindValue="id" bindLabel="name" [clearable]="false">
<ng-template ng-option-tmp ng-label-tmp let-item="item">
<span class="badge" [style.background]="item.value" [style.color]="item.textColor">{{item.name}}</span>
</ng-template>
</ng-select>
</div>
<app-input-color i18n-title title="Color" formControlName="color" [error]="error?.color"></app-input-color>
<app-input-check i18n-title title="Inbox tag" formControlName="is_inbox_tag" i18n-hint hint="Inbox tags are automatically assigned to all consumed documents."></app-input-check>
<app-input-select i18n-title title="Matching algorithm" [items]="getMatchingAlgorithms()" formControlName="matching_algorithm"></app-input-select>

@ -2,9 +2,10 @@ import { Component } from '@angular/core';
import { FormControl, FormGroup } from '@angular/forms';
import { NgbActiveModal } from '@ng-bootstrap/ng-bootstrap';
import { EditDialogComponent } from 'src/app/components/common/edit-dialog/edit-dialog.component';
import { TAG_COLOURS, PaperlessTag } from 'src/app/data/paperless-tag';
import { PaperlessTag } from 'src/app/data/paperless-tag';
import { TagService } from 'src/app/services/rest/tag.service';
import { ToastService } from 'src/app/services/toast.service';
import { randomColor } from 'src/app/utils/color';
@Component({
selector: 'app-tag-edit-dialog',
@ -13,7 +14,7 @@ import { ToastService } from 'src/app/services/toast.service';
})
export class TagEditDialogComponent extends EditDialogComponent<PaperlessTag> {
constructor(service: TagService, activeModal: NgbActiveModal, toastService: ToastService) {
constructor(service: TagService, activeModal: NgbActiveModal, toastService: ToastService) {
super(service, activeModal, toastService)
}
@ -28,7 +29,7 @@ export class TagEditDialogComponent extends EditDialogComponent<PaperlessTag> {
getForm(): FormGroup {
return new FormGroup({
name: new FormControl(''),
colour: new FormControl(1),
color: new FormControl(randomColor()),
is_inbox_tag: new FormControl(false),
matching_algorithm: new FormControl(1),
match: new FormControl(""),
@ -36,12 +37,4 @@ export class TagEditDialogComponent extends EditDialogComponent<PaperlessTag> {
})
}
getColours() {
return TAG_COLOURS
}
getColor(id: number) {
return TAG_COLOURS.find(c => c.id == id)
}
}

@ -26,8 +26,8 @@
<tbody>
<tr *ngFor="let tag of data">
<td scope="row">{{ tag.name }}</td>
<td scope="row"><span class="badge" [style.color]="getColor(tag.colour).textColor"
[style.background-color]="getColor(tag.colour).value">{{ getColor(tag.colour).name }}</span></td>
<td scope="row"><span class="badge" [style.color]="tag.text_color"
[style.background-color]="tag.color">{{tag.color}}</span></td>
<td scope="row">{{ getMatching(tag) }}</td>
<td scope="row">{{ tag.document_count }}</td>
<td scope="row">

@ -1,7 +1,7 @@
import { Component } from '@angular/core';
import { NgbModal } from '@ng-bootstrap/ng-bootstrap';
import { FILTER_HAS_TAG } from 'src/app/data/filter-rule-type';
import { TAG_COLOURS, PaperlessTag } from 'src/app/data/paperless-tag';
import { PaperlessTag } from 'src/app/data/paperless-tag';
import { DocumentListViewService } from 'src/app/services/document-list-view.service';
import { TagService } from 'src/app/services/rest/tag.service';
import { ToastService } from 'src/app/services/toast.service';
@ -22,10 +22,6 @@ export class TagListComponent extends GenericListComponent<PaperlessTag> {
super(tagService, modalService, TagEditDialogComponent, toastService)
}
getColor(id) {
return TAG_COLOURS.find(c => c.id == id)
}
getDeleteMessage(object: PaperlessTag) {
return $localize`Do you really want to delete the tag "${object.name}"?`
}

@ -20,6 +20,8 @@ export const FILTER_DOES_NOT_HAVE_TAG = 17
export const FILTER_ASN_ISNULL = 18
export const FILTER_TITLE_CONTENT = 19
export const FILTER_RULE_TYPES: FilterRuleType[] = [
{id: FILTER_TITLE, filtervar: "title__icontains", datatype: "string", multi: false, default: ""},
@ -47,7 +49,9 @@ export const FILTER_RULE_TYPES: FilterRuleType[] = [
{id: FILTER_MODIFIED_BEFORE, filtervar: "modified__date__lt", datatype: "date", multi: false},
{id: FILTER_MODIFIED_AFTER, filtervar: "modified__date__gt", datatype: "date", multi: false},
{id: FILTER_ASN_ISNULL, filtervar: "archive_serial_number__isnull", datatype: "boolean", multi: false}
{id: FILTER_ASN_ISNULL, filtervar: "archive_serial_number__isnull", datatype: "boolean", multi: false},
{id: FILTER_TITLE_CONTENT, filtervar: "title_content", datatype: "string", multi: false}
]
export interface FilterRuleType {

@ -1,26 +1,10 @@
import { MatchingModel } from './matching-model';
import { ObjectWithId } from './object-with-id';
export const TAG_COLOURS = [
{id: 1, value: "#a6cee3", name: $localize`Light blue`, textColor: "#000000"},
{id: 2, value: "#1f78b4", name: $localize`Blue`, textColor: "#ffffff"},
{id: 3, value: "#b2df8a", name: $localize`Light green`, textColor: "#000000"},
{id: 4, value: "#33a02c", name: $localize`Green`, textColor: "#ffffff"},
{id: 5, value: "#fb9a99", name: $localize`Light red`, textColor: "#000000"},
{id: 6, value: "#e31a1c", name: $localize`Red `, textColor: "#ffffff"},
{id: 7, value: "#fdbf6f", name: $localize`Light orange`, textColor: "#000000"},
{id: 8, value: "#ff7f00", name: $localize`Orange`, textColor: "#000000"},
{id: 9, value: "#cab2d6", name: $localize`Light violet`, textColor: "#000000"},
{id: 10, value: "#6a3d9a", name: $localize`Violet`, textColor: "#ffffff"},
{id: 11, value: "#b15928", name: $localize`Brown`, textColor: "#ffffff"},
{id: 12, value: "#000000", name: $localize`Black`, textColor: "#ffffff"},
{id: 13, value: "#cccccc", name: $localize`Light grey`, textColor: "#000000"}
]
import { MatchingModel } from "./matching-model";
export interface PaperlessTag extends MatchingModel {
colour?: number
color?: string
text_color?: string
is_inbox_tag?: boolean

@ -0,0 +1,16 @@
import { TestBed } from '@angular/core/testing';
import { ApiVersionInterceptor } from './api-version.interceptor';
describe('ApiVersionInterceptor', () => {
beforeEach(() => TestBed.configureTestingModule({
providers: [
ApiVersionInterceptor
]
}));
it('should be created', () => {
const interceptor: ApiVersionInterceptor = TestBed.inject(ApiVersionInterceptor);
expect(interceptor).toBeTruthy();
});
});

@ -0,0 +1,25 @@
import { Injectable } from '@angular/core';
import {
HttpRequest,
HttpHandler,
HttpEvent,
HttpInterceptor
} from '@angular/common/http';
import { Observable } from 'rxjs';
import { environment } from 'src/environments/environment';
@Injectable()
export class ApiVersionInterceptor implements HttpInterceptor {
constructor() {}
intercept(request: HttpRequest<unknown>, next: HttpHandler): Observable<HttpEvent<unknown>> {
request = request.clone({
setHeaders: {
'Accept': `application/json; version=${environment.apiVersion}`
}
})
return next.handle(request);
}
}

@ -13,17 +13,20 @@ const FORMAT_TO_ISO_FORMAT = {
})
export class CustomDatePipe extends DatePipe implements PipeTransform {
private defaultLocale: string
constructor(@Inject(LOCALE_ID) locale: string, private settings: SettingsService) {
super(locale)
this.defaultLocale = locale
}
transform(value: any, format?: string, timezone?: string, locale?: string): string | null {
let l = locale || this.settings.get(SETTINGS_KEYS.DATE_LOCALE)
let l = locale || this.settings.get(SETTINGS_KEYS.DATE_LOCALE) || this.defaultLocale
let f = format || this.settings.get(SETTINGS_KEYS.DATE_FORMAT)
if (l == "iso-8601") {
return super.transform(value, FORMAT_TO_ISO_FORMAT[f], timezone)
} else {
return super.transform(value, format || this.settings.get(SETTINGS_KEYS.DATE_FORMAT), timezone, locale)
return super.transform(value, format || this.settings.get(SETTINGS_KEYS.DATE_FORMAT), timezone, l)
}
}

@ -26,6 +26,7 @@ export const SETTINGS_KEYS = {
DOCUMENT_LIST_SIZE: 'general-settings:documentListSize',
DARK_MODE_USE_SYSTEM: 'general-settings:dark-mode:use-system',
DARK_MODE_ENABLED: 'general-settings:dark-mode:enabled',
DARK_MODE_THUMB_INVERTED: 'general-settings:dark-mode:thumb-inverted',
DATE_LOCALE: 'general-settings:date-display:date-locale',
DATE_FORMAT: 'general-settings:date-display:date-format',
NOTIFICATIONS_CONSUMER_NEW_DOCUMENT: 'general-settings:notifications:consumer-new-documents',
@ -40,6 +41,7 @@ const SETTINGS: PaperlessSettings[] = [
{key: SETTINGS_KEYS.DOCUMENT_LIST_SIZE, type: "number", default: 50},
{key: SETTINGS_KEYS.DARK_MODE_USE_SYSTEM, type: "boolean", default: true},
{key: SETTINGS_KEYS.DARK_MODE_ENABLED, type: "boolean", default: false},
{key: SETTINGS_KEYS.DARK_MODE_THUMB_INVERTED, type: "boolean", default: true},
{key: SETTINGS_KEYS.DATE_LOCALE, type: "string", default: ""},
{key: SETTINGS_KEYS.DATE_FORMAT, type: "string", default: "mediumDate"},
{key: SETTINGS_KEYS.NOTIFICATIONS_CONSUMER_NEW_DOCUMENT, type: "boolean", default: true},
@ -88,7 +90,9 @@ export class SettingsService {
{code: "de", name: $localize`German`, englishName: "German", dateInputFormat: "dd.mm.yyyy"},
{code: "nl", name: $localize`Dutch`, englishName: "Dutch", dateInputFormat: "dd-mm-yyyy"},
{code: "fr", name: $localize`French`, englishName: "French", dateInputFormat: "dd/mm/yyyy"},
{code: "pt-br", name: $localize`Portuguese (Brazil)`, englishName: "Portuguese (Brazil)", dateInputFormat: "dd/mm/yyyy"}
{code: "pt-br", name: $localize`Portuguese (Brazil)`, englishName: "Portuguese (Brazil)", dateInputFormat: "dd/mm/yyyy"},
{code: "it", name: $localize`Italian`, englishName: "Italian", dateInputFormat: "dd/mm/yyyy"},
{code: "ro", name: $localize`Romanian`, englishName: "Romanian", dateInputFormat: "dd.mm.yyyy"}
]
}

@ -0,0 +1,48 @@
function componentToHex(c) {
var hex = Math.floor(c).toString(16)
return hex.length == 1 ? "0" + hex : hex
}
/**
* https://axonflux.com/handy-rgb-to-hsl-and-rgb-to-hsv-color-model-c
*
* Converts an HSL color value to RGB. Conversion formula
* adapted from http://en.wikipedia.org/wiki/HSL_color_space.
* Assumes h, s, and l are contained in the set [0, 1] and
* returns r, g, and b in the set [0, 255].
*
* @param Number h The hue
* @param Number s The saturation
* @param Number l The lightness
* @return Array The RGB representation
*/
function hslToRgb(h, s, l){
var r, g, b
if(s == 0){
r = g = b = l // achromatic
}else{
function hue2rgb(p, q, t){
if(t < 0) t += 1
if(t > 1) t -= 1
if(t < 1/6) return p + (q - p) * 6 * t
if(t < 1/2) return q
if(t < 2/3) return p + (q - p) * (2/3 - t) * 6
return p
}
var q = l < 0.5 ? l * (1 + s) : l + s - l * s
var p = 2 * l - q
r = hue2rgb(p, q, h + 1/3)
g = hue2rgb(p, q, h)
b = hue2rgb(p, q, h - 1/3)
}
return [r * 255, g * 255, b * 255]
}
export function randomColor() {
let rgb = hslToRgb(Math.random(), 0.6, Math.random() * 0.4 + 0.4)
return `#${componentToHex(rgb[0])}${componentToHex(rgb[1])}${componentToHex(rgb[2])}`
}

@ -1,8 +1,9 @@
export const environment = {
production: true,
apiBaseUrl: "/api/",
apiVersion: "2",
appTitle: "Paperless-ng",
version: "1.2.1",
version: "1.3.0",
webSocketHost: window.location.host,
webSocketProtocol: (window.location.protocol == "https:" ? "wss:" : "ws:")
};

@ -5,6 +5,7 @@
export const environment = {
production: false,
apiBaseUrl: "http://localhost:8000/api/",
apiVersion: "2",
appTitle: "Paperless-ng",
version: "DEVELOPMENT",
webSocketHost: "localhost:8000",

@ -478,7 +478,7 @@
<target>Möchten Sie das Tag &quot;<x equiv-text="object.name" id="PH"/>&quot; wirklich löschen?</target>
<context-group purpose="location">
<context context-type="sourcefile">src/app/components/manage/tag-list/tag-list.component.ts</context>
<context context-type="linenumber">30</context>
<context context-type="linenumber">26</context>
</context-group>
</trans-unit>
<trans-unit datatype="html" id="cafc87479686947e2590b9f588a88040aeaf660b">
@ -590,7 +590,7 @@
<target>Gespeicherte Ansicht &quot;<x equiv-text="savedView.name" id="PH"/>&quot; gelöscht.</target>
<context-group purpose="location">
<context context-type="sourcefile">src/app/components/manage/settings/settings.component.ts</context>
<context context-type="linenumber">67</context>
<context context-type="linenumber">68</context>
</context-group>
</trans-unit>
<trans-unit datatype="html" id="5647210819299459618">
@ -598,7 +598,7 @@
<target>Einstellungen erfolgreich gespeichert.</target>
<context-group purpose="location">
<context context-type="sourcefile">src/app/components/manage/settings/settings.component.ts</context>
<context context-type="linenumber">87</context>
<context context-type="linenumber">89</context>
</context-group>
</trans-unit>
<trans-unit datatype="html" id="6839066544204061364">
@ -606,7 +606,7 @@
<target>Benutze Systemsprache</target>
<context-group purpose="location">
<context context-type="sourcefile">src/app/components/manage/settings/settings.component.ts</context>
<context context-type="linenumber">92</context>
<context context-type="linenumber">94</context>
</context-group>
</trans-unit>
<trans-unit datatype="html" id="7729897675462249787">
@ -614,7 +614,7 @@
<target>Benutze Datumsformat der Anzeigesprache</target>
<context-group purpose="location">
<context context-type="sourcefile">src/app/components/manage/settings/settings.component.ts</context>
<context context-type="linenumber">98</context>
<context context-type="linenumber">100</context>
</context-group>
</trans-unit>
<trans-unit datatype="html" id="8488620293789898901">
@ -622,7 +622,7 @@
<target>Fehler beim Speichern der Einstellungen auf dem Server: <x equiv-text="JSON.stringify(error.error)" id="PH"/></target>
<context-group purpose="location">
<context context-type="sourcefile">src/app/components/manage/settings/settings.component.ts</context>
<context context-type="linenumber">115</context>
<context context-type="linenumber">117</context>
</context-group>
</trans-unit>
<trans-unit datatype="html" id="121cc5391cd2a5115bc2b3160379ee5b36cd7716">
@ -646,7 +646,7 @@
<target>Benachrichtigungen</target>
<context-group purpose="location">
<context context-type="sourcefile">src/app/components/manage/settings/settings.component.html</context>
<context context-type="linenumber">115</context>
<context context-type="linenumber">116</context>
</context-group>
</trans-unit>
<trans-unit datatype="html" id="99dee94e92dbd9e21a008d4569f9719ed206ae37">
@ -654,7 +654,7 @@
<target>Gespeicherte Ansichten</target>
<context-group purpose="location">
<context context-type="sourcefile">src/app/components/manage/settings/settings.component.html</context>
<context context-type="linenumber">133</context>
<context context-type="linenumber">134</context>
</context-group>
</trans-unit>
<trans-unit datatype="html" id="bbe41ac2ea4a6c00ea941a41b33105048f8e9f13">
@ -777,12 +777,20 @@
<context context-type="linenumber">98</context>
</context-group>
</trans-unit>
<trans-unit datatype="html" id="71bad20b37410c8972c9aa0f7c62996534b84339">
<source>Invert thumbnails in dark mode</source>
<target>Miniaturbilder im dunklen Modus invertieren</target>
<context-group purpose="location">
<context context-type="sourcefile">src/app/components/manage/settings/settings.component.html</context>
<context context-type="linenumber">99</context>
</context-group>
</trans-unit>
<trans-unit datatype="html" id="3863a86cd9e69a61d143d3daf51df44203df4a82">
<source>Bulk editing</source>
<target>Massenbearbeitung</target>
<context-group purpose="location">
<context context-type="sourcefile">src/app/components/manage/settings/settings.component.html</context>
<context context-type="linenumber">102</context>
<context context-type="linenumber">103</context>
</context-group>
</trans-unit>
<trans-unit datatype="html" id="c0ac61661c6c326d6e0e00c231b95cf2ac0c6586">
@ -790,7 +798,7 @@
<target>Bestätigungsdialoge anzeigen</target>
<context-group purpose="location">
<context context-type="sourcefile">src/app/components/manage/settings/settings.component.html</context>
<context context-type="linenumber">106</context>
<context context-type="linenumber">107</context>
</context-group>
</trans-unit>
<trans-unit datatype="html" id="291bbe56ecbe945dcf05580a57d679fa7bd1e06a">
@ -798,7 +806,7 @@
<target>Beim Löschen von Dokumenten wird immer nach einer Bestätigung gefragt.</target>
<context-group purpose="location">
<context context-type="sourcefile">src/app/components/manage/settings/settings.component.html</context>
<context context-type="linenumber">106</context>
<context context-type="linenumber">107</context>
</context-group>
</trans-unit>
<trans-unit datatype="html" id="8cfddc13e04f5545ac63f419ef363505d6f78c2e">
@ -806,7 +814,7 @@
<target>Anwenden beim Schließen</target>
<context-group purpose="location">
<context context-type="sourcefile">src/app/components/manage/settings/settings.component.html</context>
<context context-type="linenumber">107</context>
<context context-type="linenumber">108</context>
</context-group>
</trans-unit>
<trans-unit datatype="html" id="8680abbea249ebe9c2fe35556559c8e1a9eb5841">
@ -814,7 +822,7 @@
<target>Dokumentverarbeitung</target>
<context-group purpose="location">
<context context-type="sourcefile">src/app/components/manage/settings/settings.component.html</context>
<context context-type="linenumber">118</context>
<context context-type="linenumber">119</context>
</context-group>
</trans-unit>
<trans-unit datatype="html" id="2ad4d76b36341c589d94004ad2a213fd4d6f5ca0">
@ -822,7 +830,7 @@
<target>Zeige Benachrichtigungen wenn neue Dokumente erkannt werden</target>
<context-group purpose="location">
<context context-type="sourcefile">src/app/components/manage/settings/settings.component.html</context>
<context context-type="linenumber">122</context>
<context context-type="linenumber">123</context>
</context-group>
</trans-unit>
<trans-unit datatype="html" id="e775f4f7c40249d31426ae61a21616a0c9d8e84f">
@ -830,7 +838,7 @@
<target>Zeige Benachrichtigungen wenn neue Dokumente erfolgreich hinzugefügt wurden</target>
<context-group purpose="location">
<context context-type="sourcefile">src/app/components/manage/settings/settings.component.html</context>
<context context-type="linenumber">123</context>
<context context-type="linenumber">124</context>
</context-group>
</trans-unit>
<trans-unit datatype="html" id="e3844dd174d8e817ddb551fae28f14ae80ca36b6">
@ -838,7 +846,7 @@
<target>Zeige Benachrichtigungen wenn Dokumente nicht hinzugefügt werden konnten</target>
<context-group purpose="location">
<context context-type="sourcefile">src/app/components/manage/settings/settings.component.html</context>
<context context-type="linenumber">124</context>
<context context-type="linenumber">125</context>
</context-group>
</trans-unit>
<trans-unit datatype="html" id="af113f7c9f7e13145c3461f61a1aedf12d57bd71">
@ -846,7 +854,7 @@
<target>Unterdrücke Benachrichtigungen auf der Startseite.</target>
<context-group purpose="location">
<context context-type="sourcefile">src/app/components/manage/settings/settings.component.html</context>
<context context-type="linenumber">125</context>
<context context-type="linenumber">126</context>
</context-group>
</trans-unit>
<trans-unit datatype="html" id="e27bd3804d2936a6897e81c2e52e294490e5e5a8">
@ -854,7 +862,7 @@
<target>Dadurch werden alle Benachrichtigungen über die Dokumentenverarbeitung auf der Startseite unterdrückt.</target>
<context-group purpose="location">
<context context-type="sourcefile">src/app/components/manage/settings/settings.component.html</context>
<context context-type="linenumber">125</context>
<context context-type="linenumber">126</context>
</context-group>
</trans-unit>
<trans-unit datatype="html" id="8cb90334f5dfd7fc67205085f59381e2a334ccfc">
@ -862,7 +870,7 @@
<target>Erscheint auf</target>
<context-group purpose="location">
<context context-type="sourcefile">src/app/components/manage/settings/settings.component.html</context>
<context context-type="linenumber">145</context>
<context context-type="linenumber">146</context>
</context-group>
</trans-unit>
<trans-unit datatype="html" id="6717cf1acf04728fc2b7c39f6d3297f8ff15fde5">
@ -870,7 +878,7 @@
<target>Auf Startseite zeigen</target>
<context-group purpose="location">
<context context-type="sourcefile">src/app/components/manage/settings/settings.component.html</context>
<context context-type="linenumber">148</context>
<context context-type="linenumber">149</context>
</context-group>
</trans-unit>
<trans-unit datatype="html" id="541bfc5b123b3f8867fd681eaceefb663a811973">
@ -878,7 +886,7 @@
<target>In Seitenleiste zeigen</target>
<context-group purpose="location">
<context context-type="sourcefile">src/app/components/manage/settings/settings.component.html</context>
<context context-type="linenumber">152</context>
<context context-type="linenumber">153</context>
</context-group>
</trans-unit>
<trans-unit datatype="html" id="abba764a7a595d04dc8c3b26e04b3780d4fdb540">
@ -886,7 +894,7 @@
<target>Keine gespeicherten Ansichten vorhanden.</target>
<context-group purpose="location">
<context context-type="sourcefile">src/app/components/manage/settings/settings.component.html</context>
<context context-type="linenumber">162</context>
<context context-type="linenumber">163</context>
</context-group>
</trans-unit>
<trans-unit datatype="html" id="ef60a738a565f498b858e903e42bc5ffc3cc1299">
@ -990,7 +998,7 @@
<target>Neues Tag erstellen</target>
<context-group purpose="location">
<context context-type="sourcefile">src/app/components/manage/tag-list/tag-edit-dialog/tag-edit-dialog.component.ts</context>
<context context-type="linenumber">21</context>
<context context-type="linenumber">22</context>
</context-group>
</trans-unit>
<trans-unit datatype="html" id="5872175735754226507">
@ -998,7 +1006,7 @@
<target>Tag bearbeiten</target>
<context-group purpose="location">
<context context-type="sourcefile">src/app/components/manage/tag-list/tag-edit-dialog/tag-edit-dialog.component.ts</context>
<context context-type="linenumber">25</context>
<context context-type="linenumber">26</context>
</context-group>
</trans-unit>
<trans-unit datatype="html" id="f2a30b4e1a89a8a0db0bd147b54d6626b9a9bc42">
@ -1006,7 +1014,7 @@
<target>Posteingangs-Tag</target>
<context-group purpose="location">
<context context-type="sourcefile">src/app/components/manage/tag-list/tag-edit-dialog/tag-edit-dialog.component.html</context>
<context context-type="linenumber">21</context>
<context context-type="linenumber">13</context>
</context-group>
</trans-unit>
<trans-unit datatype="html" id="5e2f1a4ea12a1b8606ee3f0548d0ba64bf266077">
@ -1014,7 +1022,7 @@
<target>Ein Tag mit dieser Option wird automatisch allen neuen Dokumenten zugewiesen.</target>
<context-group purpose="location">
<context context-type="sourcefile">src/app/components/manage/tag-list/tag-edit-dialog/tag-edit-dialog.component.html</context>
<context context-type="linenumber">21</context>
<context context-type="linenumber">13</context>
</context-group>
</trans-unit>
<trans-unit datatype="html" id="6672809941092516947">
@ -1111,7 +1119,7 @@
<target>Verwalten</target>
<context-group purpose="location">
<context context-type="sourcefile">src/app/components/app-frame/app-frame.component.html</context>
<context context-type="linenumber">107</context>
<context context-type="linenumber">112</context>
</context-group>
</trans-unit>
<trans-unit datatype="html" id="408cb6073e60c5d966296a3207fc596adca75e01">
@ -1119,7 +1127,7 @@
<target>Administration</target>
<context-group purpose="location">
<context context-type="sourcefile">src/app/components/app-frame/app-frame.component.html</context>
<context context-type="linenumber">149</context>
<context context-type="linenumber">154</context>
</context-group>
</trans-unit>
<trans-unit datatype="html" id="321e4419a943044e674beb55b8039f42a9761ca5">
@ -1127,7 +1135,7 @@
<target>Info</target>
<context-group purpose="location">
<context context-type="sourcefile">src/app/components/app-frame/app-frame.component.html</context>
<context context-type="linenumber">155</context>
<context context-type="linenumber">160</context>
</context-group>
</trans-unit>
<trans-unit datatype="html" id="fcfd4675b4c90f08d18d3abede9a9a4dff4cfdc7">
@ -1135,7 +1143,7 @@
<target>Dokumentation</target>
<context-group purpose="location">
<context context-type="sourcefile">src/app/components/app-frame/app-frame.component.html</context>
<context context-type="linenumber">162</context>
<context context-type="linenumber">167</context>
</context-group>
</trans-unit>
<trans-unit datatype="html" id="355a222236bc01b9a8cd3cb9ecf76891125aed69">
@ -1143,7 +1151,7 @@
<target>GitHub</target>
<context-group purpose="location">
<context context-type="sourcefile">src/app/components/app-frame/app-frame.component.html</context>
<context context-type="linenumber">170</context>
<context context-type="linenumber">175</context>
</context-group>
</trans-unit>
<trans-unit datatype="html" id="ea3a452c5238897cabc5781308cceb2d37dcf258">
@ -1151,7 +1159,7 @@
<target>Eine Idee vorschlagen</target>
<context-group purpose="location">
<context context-type="sourcefile">src/app/components/app-frame/app-frame.component.html</context>
<context context-type="linenumber">176</context>
<context context-type="linenumber">181</context>
</context-group>
</trans-unit>
<trans-unit datatype="html" id="af665f8de8fabe306aaf27443957e69bcbbce63c">
@ -1175,7 +1183,23 @@
<target>Alle schließen</target>
<context-group purpose="location">
<context context-type="sourcefile">src/app/components/app-frame/app-frame.component.html</context>
<context context-type="linenumber">101</context>
<context context-type="linenumber">106</context>
</context-group>
</trans-unit>
<trans-unit datatype="html" id="5701618810648052610">
<source>Title</source>
<target>Titel</target>
<context-group purpose="location">
<context context-type="sourcefile">src/app/components/document-list/filter-editor/filter-editor.component.ts</context>
<context context-type="linenumber">73</context>
</context-group>
</trans-unit>
<trans-unit datatype="html" id="3100631071441658964">
<source>Title &amp; content</source>
<target>Titel &amp; Inhalt</target>
<context-group purpose="location">
<context context-type="sourcefile">src/app/components/document-list/filter-editor/filter-editor.component.ts</context>
<context context-type="linenumber">74</context>
</context-group>
</trans-unit>
<trans-unit datatype="html" id="5195932016807797291">
@ -1183,7 +1207,7 @@
<target>Korrespondent: <x equiv-text="this.correspondents.find(c =&gt; c.id == +rule.value)?.name" id="PH"/></target>
<context-group purpose="location">
<context context-type="sourcefile">src/app/components/document-list/filter-editor/filter-editor.component.ts</context>
<context context-type="linenumber">29</context>
<context context-type="linenumber">32</context>
</context-group>
</trans-unit>
<trans-unit datatype="html" id="8170755470576301659">
@ -1191,7 +1215,7 @@
<target>Ohne Korrespondent</target>
<context-group purpose="location">
<context context-type="sourcefile">src/app/components/document-list/filter-editor/filter-editor.component.ts</context>
<context context-type="linenumber">31</context>
<context context-type="linenumber">34</context>
</context-group>
</trans-unit>
<trans-unit datatype="html" id="8705701325879965907">
@ -1199,7 +1223,7 @@
<target>Typ: <x equiv-text="this.documentTypes.find(dt =&gt; dt.id == +rule.value)?.name" id="PH"/></target>
<context-group purpose="location">
<context context-type="sourcefile">src/app/components/document-list/filter-editor/filter-editor.component.ts</context>
<context context-type="linenumber">36</context>
<context context-type="linenumber">39</context>
</context-group>
</trans-unit>
<trans-unit datatype="html" id="4362173610367509215">
@ -1207,7 +1231,7 @@
<target>Ohne Dokumenttyp</target>
<context-group purpose="location">
<context context-type="sourcefile">src/app/components/document-list/filter-editor/filter-editor.component.ts</context>
<context context-type="linenumber">38</context>
<context context-type="linenumber">41</context>
</context-group>
</trans-unit>
<trans-unit datatype="html" id="8180755793012580465">
@ -1215,7 +1239,7 @@
<target>Tag: <x equiv-text="this.tags.find(t =&gt; t.id == +rule.value)?.name" id="PH"/></target>
<context-group purpose="location">
<context context-type="sourcefile">src/app/components/document-list/filter-editor/filter-editor.component.ts</context>
<context context-type="linenumber">42</context>
<context context-type="linenumber">45</context>
</context-group>
</trans-unit>
<trans-unit datatype="html" id="6494566478302448576">
@ -1223,7 +1247,7 @@
<target>Ohne Tag</target>
<context-group purpose="location">
<context context-type="sourcefile">src/app/components/document-list/filter-editor/filter-editor.component.ts</context>
<context context-type="linenumber">46</context>
<context context-type="linenumber">49</context>
</context-group>
</trans-unit>
<trans-unit datatype="html" id="6523384805359286307">
@ -1231,7 +1255,7 @@
<target>Titel: <x equiv-text="rule.value" id="PH"/></target>
<context-group purpose="location">
<context context-type="sourcefile">src/app/components/document-list/filter-editor/filter-editor.component.ts</context>
<context context-type="linenumber">50</context>
<context context-type="linenumber">53</context>
</context-group>
</trans-unit>
<trans-unit datatype="html" id="02d184c288f567825a1fcbf83bcd3099a10853d5">
@ -1239,7 +1263,7 @@
<target>Tags filtern</target>
<context-group purpose="location">
<context context-type="sourcefile">src/app/components/document-list/filter-editor/filter-editor.component.html</context>
<context context-type="linenumber">12</context>
<context context-type="linenumber">20</context>
</context-group>
</trans-unit>
<trans-unit datatype="html" id="4b089ca12c472cf0b46167bb5afe4b527b301bbc">
@ -1247,7 +1271,7 @@
<target>Korrespondenten filtern</target>
<context-group purpose="location">
<context context-type="sourcefile">src/app/components/document-list/filter-editor/filter-editor.component.html</context>
<context context-type="linenumber">20</context>
<context context-type="linenumber">28</context>
</context-group>
</trans-unit>
<trans-unit datatype="html" id="0ad509732aaf702b7ea8c771c7809fa84bc85908">
@ -1255,7 +1279,7 @@
<target>Dokumenttypen filtern</target>
<context-group purpose="location">
<context context-type="sourcefile">src/app/components/document-list/filter-editor/filter-editor.component.html</context>
<context context-type="linenumber">27</context>
<context context-type="linenumber">35</context>
</context-group>
</trans-unit>
<trans-unit datatype="html" id="2d9d55f1b70142ff4597ba32179d16888fd9c6b2">
@ -1263,7 +1287,7 @@
<target>Filter zurücksetzen</target>
<context-group purpose="location">
<context context-type="sourcefile">src/app/components/document-list/filter-editor/filter-editor.component.html</context>
<context context-type="linenumber">50</context>
<context context-type="linenumber">58</context>
</context-group>
</trans-unit>
<trans-unit datatype="html" id="7593728289020204896">
@ -1288,7 +1312,7 @@
<target>Letzte 7 Tage</target>
<context-group purpose="location">
<context context-type="sourcefile">src/app/components/common/date-dropdown/date-dropdown.component.ts</context>
<context context-type="linenumber">24</context>
<context context-type="linenumber">34</context>
</context-group>
</trans-unit>
<trans-unit datatype="html" id="4463380307954693363">
@ -1296,7 +1320,7 @@
<target>Letzten Monat</target>
<context-group purpose="location">
<context context-type="sourcefile">src/app/components/common/date-dropdown/date-dropdown.component.ts</context>
<context context-type="linenumber">25</context>
<context context-type="linenumber">35</context>
</context-group>
</trans-unit>
<trans-unit datatype="html" id="8697368973702409683">
@ -1304,7 +1328,7 @@
<target>Letzte 3 Monate</target>
<context-group purpose="location">
<context context-type="sourcefile">src/app/components/common/date-dropdown/date-dropdown.component.ts</context>
<context context-type="linenumber">26</context>
<context context-type="linenumber">36</context>
</context-group>
</trans-unit>
<trans-unit datatype="html" id="3566342898065860218">
@ -1312,7 +1336,7 @@
<target>Letztes Jahr</target>
<context-group purpose="location">
<context context-type="sourcefile">src/app/components/common/date-dropdown/date-dropdown.component.ts</context>
<context context-type="linenumber">27</context>
<context context-type="linenumber">37</context>
</context-group>
</trans-unit>
<trans-unit datatype="html" id="be2add3a3d9e4e2556b8f9048a15a9c0f00bf1ad">
@ -1328,7 +1352,7 @@
<target>Vor</target>
<context-group purpose="location">
<context context-type="sourcefile">src/app/components/common/date-dropdown/date-dropdown.component.html</context>
<context context-type="linenumber">29</context>
<context context-type="linenumber">38</context>
</context-group>
</trans-unit>
<trans-unit datatype="html" id="99ee4faa69cd2ea8e3678c1f557c0ff1f05aae46">
@ -1829,7 +1853,7 @@
<target>Ungültiges Datum.</target>
<context-group purpose="location">
<context context-type="sourcefile">src/app/components/common/input/date/date.component.html</context>
<context context-type="linenumber">13</context>
<context context-type="linenumber">14</context>
</context-group>
</trans-unit>
<trans-unit datatype="html" id="2807800733729323332">
@ -1861,7 +1885,7 @@
<target>Englisch (US)</target>
<context-group purpose="location">
<context context-type="sourcefile">src/app/services/settings.service.ts</context>
<context context-type="linenumber">88</context>
<context context-type="linenumber">90</context>
</context-group>
</trans-unit>
<trans-unit datatype="html" id="6987083569809053351">
@ -1869,7 +1893,7 @@
<target>Englisch (UK)</target>
<context-group purpose="location">
<context context-type="sourcefile">src/app/services/settings.service.ts</context>
<context context-type="linenumber">89</context>
<context context-type="linenumber">91</context>
</context-group>
</trans-unit>
<trans-unit datatype="html" id="1858110241312746425">
@ -1877,7 +1901,7 @@
<target>Deutsch</target>
<context-group purpose="location">
<context context-type="sourcefile">src/app/services/settings.service.ts</context>
<context context-type="linenumber">90</context>
<context context-type="linenumber">92</context>
</context-group>
</trans-unit>
<trans-unit datatype="html" id="3071065188816255493">
@ -1885,7 +1909,7 @@
<target>Niederländisch</target>
<context-group purpose="location">
<context context-type="sourcefile">src/app/services/settings.service.ts</context>
<context context-type="linenumber">91</context>
<context context-type="linenumber">93</context>
</context-group>
</trans-unit>
<trans-unit datatype="html" id="7633754075223722162">
@ -1893,7 +1917,7 @@
<target>Französisch</target>
<context-group purpose="location">
<context context-type="sourcefile">src/app/services/settings.service.ts</context>
<context context-type="linenumber">92</context>
<context context-type="linenumber">94</context>
</context-group>
</trans-unit>
<trans-unit datatype="html" id="9184513005098760425">
@ -1901,7 +1925,23 @@
<target>Portugiesisch (Brasilien)</target>
<context-group purpose="location">
<context context-type="sourcefile">src/app/services/settings.service.ts</context>
<context context-type="linenumber">93</context>
<context context-type="linenumber">95</context>
</context-group>
</trans-unit>
<trans-unit datatype="html" id="2935232983274991580">
<source>Italian</source>
<target>Italienisch</target>
<context-group purpose="location">
<context context-type="sourcefile">src/app/services/settings.service.ts</context>
<context context-type="linenumber">96</context>
</context-group>
</trans-unit>
<trans-unit datatype="html" id="8118856427047826368">
<source>Romanian</source>
<target>Rumänisch</target>
<context-group purpose="location">
<context context-type="sourcefile">src/app/services/settings.service.ts</context>
<context context-type="linenumber">97</context>
</context-group>
</trans-unit>
<trans-unit datatype="html" id="4912706592792948707">
@ -1909,7 +1949,7 @@
<target>ISO 8601</target>
<context-group purpose="location">
<context context-type="sourcefile">src/app/services/settings.service.ts</context>
<context context-type="linenumber">98</context>
<context context-type="linenumber">102</context>
</context-group>
</trans-unit>
<trans-unit datatype="html" id="2119857572761283468">
@ -2052,14 +2092,6 @@
<context context-type="linenumber">18</context>
</context-group>
</trans-unit>
<trans-unit datatype="html" id="5701618810648052610">
<source>Title</source>
<target>Titel</target>
<context-group purpose="location">
<context context-type="sourcefile">src/app/services/rest/document.service.ts</context>
<context context-type="linenumber">19</context>
</context-group>
</trans-unit>
<trans-unit datatype="html" id="5066119607229701477">
<source>Document type</source>
<target>Dokumenttyp</target>
@ -2092,110 +2124,6 @@
<context context-type="linenumber">23</context>
</context-group>
</trans-unit>
<trans-unit datatype="html" id="2056433880533904076">
<source>Light blue</source>
<target>Blau, hell</target>
<context-group purpose="location">
<context context-type="sourcefile">src/app/data/paperless-tag.ts</context>
<context context-type="linenumber">6</context>
</context-group>
</trans-unit>
<trans-unit datatype="html" id="4082253113407591781">
<source>Blue</source>
<target>Blau</target>
<context-group purpose="location">
<context context-type="sourcefile">src/app/data/paperless-tag.ts</context>
<context context-type="linenumber">7</context>
</context-group>
</trans-unit>
<trans-unit datatype="html" id="1143414876575720034">
<source>Light green</source>
<target>Grün, hell</target>
<context-group purpose="location">
<context context-type="sourcefile">src/app/data/paperless-tag.ts</context>
<context context-type="linenumber">8</context>
</context-group>
</trans-unit>
<trans-unit datatype="html" id="119581980963263815">
<source>Green</source>
<target>Grün</target>
<context-group purpose="location">
<context context-type="sourcefile">src/app/data/paperless-tag.ts</context>
<context context-type="linenumber">9</context>
</context-group>
</trans-unit>
<trans-unit datatype="html" id="3250646524116252719">
<source>Light red</source>
<target>Rot, hell</target>
<context-group purpose="location">
<context context-type="sourcefile">src/app/data/paperless-tag.ts</context>
<context context-type="linenumber">10</context>
</context-group>
</trans-unit>
<trans-unit datatype="html" id="1628552745302385832">
<source>Red </source>
<target>Rot</target>
<context-group purpose="location">
<context context-type="sourcefile">src/app/data/paperless-tag.ts</context>
<context context-type="linenumber">11</context>
</context-group>
</trans-unit>
<trans-unit datatype="html" id="5479028842846122610">
<source>Light orange</source>
<target>Orange, hell</target>
<context-group purpose="location">
<context context-type="sourcefile">src/app/data/paperless-tag.ts</context>
<context context-type="linenumber">12</context>
</context-group>
</trans-unit>
<trans-unit datatype="html" id="8598918991528773310">
<source>Orange</source>
<target>Orange</target>
<context-group purpose="location">
<context context-type="sourcefile">src/app/data/paperless-tag.ts</context>
<context context-type="linenumber">13</context>
</context-group>
</trans-unit>
<trans-unit datatype="html" id="1789283185177957430">
<source>Light violet</source>
<target>Violet, hell</target>
<context-group purpose="location">
<context context-type="sourcefile">src/app/data/paperless-tag.ts</context>
<context context-type="linenumber">14</context>
</context-group>
</trans-unit>
<trans-unit datatype="html" id="2682868487071320453">
<source>Violet</source>
<target>Violet</target>
<context-group purpose="location">
<context context-type="sourcefile">src/app/data/paperless-tag.ts</context>
<context context-type="linenumber">15</context>
</context-group>
</trans-unit>
<trans-unit datatype="html" id="1449010446077321264">
<source>Brown</source>
<target>Braun</target>
<context-group purpose="location">
<context context-type="sourcefile">src/app/data/paperless-tag.ts</context>
<context context-type="linenumber">16</context>
</context-group>
</trans-unit>
<trans-unit datatype="html" id="30300572504753589">
<source>Black</source>
<target>Schwarz</target>
<context-group purpose="location">
<context context-type="sourcefile">src/app/data/paperless-tag.ts</context>
<context context-type="linenumber">17</context>
</context-group>
</trans-unit>
<trans-unit datatype="html" id="461048771215121187">
<source>Light grey</source>
<target>Grau, hell</target>
<context-group purpose="location">
<context context-type="sourcefile">src/app/data/paperless-tag.ts</context>
<context context-type="linenumber">18</context>
</context-group>
</trans-unit>
<trans-unit datatype="html" id="4561076822163447092">
<source>Create new item</source>
<target>Neues Element erstellen</target>

@ -478,7 +478,7 @@
<target>Do you really want to delete the tag &quot;<x equiv-text="object.name" id="PH"/>&quot;?</target>
<context-group purpose="location">
<context context-type="sourcefile">src/app/components/manage/tag-list/tag-list.component.ts</context>
<context context-type="linenumber">30</context>
<context context-type="linenumber">26</context>
</context-group>
</trans-unit>
<trans-unit datatype="html" id="cafc87479686947e2590b9f588a88040aeaf660b">
@ -990,7 +990,7 @@
<target>Create new tag</target>
<context-group purpose="location">
<context context-type="sourcefile">src/app/components/manage/tag-list/tag-edit-dialog/tag-edit-dialog.component.ts</context>
<context context-type="linenumber">21</context>
<context context-type="linenumber">22</context>
</context-group>
</trans-unit>
<trans-unit datatype="html" id="5872175735754226507">
@ -998,7 +998,7 @@
<target>Edit tag</target>
<context-group purpose="location">
<context context-type="sourcefile">src/app/components/manage/tag-list/tag-edit-dialog/tag-edit-dialog.component.ts</context>
<context context-type="linenumber">25</context>
<context context-type="linenumber">26</context>
</context-group>
</trans-unit>
<trans-unit datatype="html" id="f2a30b4e1a89a8a0db0bd147b54d6626b9a9bc42">
@ -1006,7 +1006,7 @@
<target>Inbox tag</target>
<context-group purpose="location">
<context context-type="sourcefile">src/app/components/manage/tag-list/tag-edit-dialog/tag-edit-dialog.component.html</context>
<context context-type="linenumber">21</context>
<context context-type="linenumber">13</context>
</context-group>
</trans-unit>
<trans-unit datatype="html" id="5e2f1a4ea12a1b8606ee3f0548d0ba64bf266077">
@ -1014,7 +1014,7 @@
<target>Inbox tags are automatically assigned to all consumed documents.</target>
<context-group purpose="location">
<context context-type="sourcefile">src/app/components/manage/tag-list/tag-edit-dialog/tag-edit-dialog.component.html</context>
<context context-type="linenumber">21</context>
<context context-type="linenumber">13</context>
</context-group>
</trans-unit>
<trans-unit datatype="html" id="6672809941092516947">
@ -1288,7 +1288,7 @@
<target>Last 7 days</target>
<context-group purpose="location">
<context context-type="sourcefile">src/app/components/common/date-dropdown/date-dropdown.component.ts</context>
<context context-type="linenumber">24</context>
<context context-type="linenumber">34</context>
</context-group>
</trans-unit>
<trans-unit datatype="html" id="4463380307954693363">
@ -1296,7 +1296,7 @@
<target>Last month</target>
<context-group purpose="location">
<context context-type="sourcefile">src/app/components/common/date-dropdown/date-dropdown.component.ts</context>
<context context-type="linenumber">25</context>
<context context-type="linenumber">35</context>
</context-group>
</trans-unit>
<trans-unit datatype="html" id="8697368973702409683">
@ -1304,7 +1304,7 @@
<target>Last 3 months</target>
<context-group purpose="location">
<context context-type="sourcefile">src/app/components/common/date-dropdown/date-dropdown.component.ts</context>
<context context-type="linenumber">26</context>
<context context-type="linenumber">36</context>
</context-group>
</trans-unit>
<trans-unit datatype="html" id="3566342898065860218">
@ -1312,7 +1312,7 @@
<target>Last year</target>
<context-group purpose="location">
<context context-type="sourcefile">src/app/components/common/date-dropdown/date-dropdown.component.ts</context>
<context context-type="linenumber">27</context>
<context context-type="linenumber">37</context>
</context-group>
</trans-unit>
<trans-unit datatype="html" id="be2add3a3d9e4e2556b8f9048a15a9c0f00bf1ad">
@ -1328,7 +1328,7 @@
<target>Before</target>
<context-group purpose="location">
<context context-type="sourcefile">src/app/components/common/date-dropdown/date-dropdown.component.html</context>
<context context-type="linenumber">29</context>
<context context-type="linenumber">38</context>
</context-group>
</trans-unit>
<trans-unit datatype="html" id="99ee4faa69cd2ea8e3678c1f557c0ff1f05aae46">
@ -1829,7 +1829,7 @@
<target>Invalid date.</target>
<context-group purpose="location">
<context context-type="sourcefile">src/app/components/common/input/date/date.component.html</context>
<context context-type="linenumber">13</context>
<context context-type="linenumber">14</context>
</context-group>
</trans-unit>
<trans-unit datatype="html" id="2807800733729323332">
@ -1904,12 +1904,20 @@
<context context-type="linenumber">93</context>
</context-group>
</trans-unit>
<trans-unit datatype="html" id="2935232983274991580">
<source>Italian</source>
<target>Italian</target>
<context-group purpose="location">
<context context-type="sourcefile">src/app/services/settings.service.ts</context>
<context context-type="linenumber">94</context>
</context-group>
</trans-unit>
<trans-unit datatype="html" id="4912706592792948707">
<source>ISO 8601</source>
<target>ISO 8601</target>
<context-group purpose="location">
<context context-type="sourcefile">src/app/services/settings.service.ts</context>
<context context-type="linenumber">98</context>
<context context-type="linenumber">99</context>
</context-group>
</trans-unit>
<trans-unit datatype="html" id="2119857572761283468">
@ -2092,110 +2100,6 @@
<context context-type="linenumber">23</context>
</context-group>
</trans-unit>
<trans-unit datatype="html" id="2056433880533904076">
<source>Light blue</source>
<target>Light blue</target>
<context-group purpose="location">
<context context-type="sourcefile">src/app/data/paperless-tag.ts</context>
<context context-type="linenumber">6</context>
</context-group>
</trans-unit>
<trans-unit datatype="html" id="4082253113407591781">
<source>Blue</source>
<target>Blue</target>
<context-group purpose="location">
<context context-type="sourcefile">src/app/data/paperless-tag.ts</context>
<context context-type="linenumber">7</context>
</context-group>
</trans-unit>
<trans-unit datatype="html" id="1143414876575720034">
<source>Light green</source>
<target>Light green</target>
<context-group purpose="location">
<context context-type="sourcefile">src/app/data/paperless-tag.ts</context>
<context context-type="linenumber">8</context>
</context-group>
</trans-unit>
<trans-unit datatype="html" id="119581980963263815">
<source>Green</source>
<target>Green</target>
<context-group purpose="location">
<context context-type="sourcefile">src/app/data/paperless-tag.ts</context>
<context context-type="linenumber">9</context>
</context-group>
</trans-unit>
<trans-unit datatype="html" id="3250646524116252719">
<source>Light red</source>
<target>Light red</target>
<context-group purpose="location">
<context context-type="sourcefile">src/app/data/paperless-tag.ts</context>
<context context-type="linenumber">10</context>
</context-group>
</trans-unit>
<trans-unit datatype="html" id="1628552745302385832">
<source>Red </source>
<target>Red </target>
<context-group purpose="location">
<context context-type="sourcefile">src/app/data/paperless-tag.ts</context>
<context context-type="linenumber">11</context>
</context-group>
</trans-unit>
<trans-unit datatype="html" id="5479028842846122610">
<source>Light orange</source>
<target>Light orange</target>
<context-group purpose="location">
<context context-type="sourcefile">src/app/data/paperless-tag.ts</context>
<context context-type="linenumber">12</context>
</context-group>
</trans-unit>
<trans-unit datatype="html" id="8598918991528773310">
<source>Orange</source>
<target>Orange</target>
<context-group purpose="location">
<context context-type="sourcefile">src/app/data/paperless-tag.ts</context>
<context context-type="linenumber">13</context>
</context-group>
</trans-unit>
<trans-unit datatype="html" id="1789283185177957430">
<source>Light violet</source>
<target>Light violet</target>
<context-group purpose="location">
<context context-type="sourcefile">src/app/data/paperless-tag.ts</context>
<context context-type="linenumber">14</context>
</context-group>
</trans-unit>
<trans-unit datatype="html" id="2682868487071320453">
<source>Violet</source>
<target>Violet</target>
<context-group purpose="location">
<context context-type="sourcefile">src/app/data/paperless-tag.ts</context>
<context context-type="linenumber">15</context>
</context-group>
</trans-unit>
<trans-unit datatype="html" id="1449010446077321264">
<source>Brown</source>
<target>Brown</target>
<context-group purpose="location">
<context context-type="sourcefile">src/app/data/paperless-tag.ts</context>
<context context-type="linenumber">16</context>
</context-group>
</trans-unit>
<trans-unit datatype="html" id="30300572504753589">
<source>Black</source>
<target>Black</target>
<context-group purpose="location">
<context context-type="sourcefile">src/app/data/paperless-tag.ts</context>
<context context-type="linenumber">17</context>
</context-group>
</trans-unit>
<trans-unit datatype="html" id="461048771215121187">
<source>Light grey</source>
<target>Light grey</target>
<context-group purpose="location">
<context context-type="sourcefile">src/app/data/paperless-tag.ts</context>
<context context-type="linenumber">18</context>
</context-group>
</trans-unit>
<trans-unit datatype="html" id="4561076822163447092">
<source>Create new item</source>
<target>Create new item</target>

@ -478,7 +478,7 @@
<target>Voulez-vous vraiment supprimer l'étiquette &quot;<x equiv-text="object.name" id="PH"/>&quot; ?</target>
<context-group purpose="location">
<context context-type="sourcefile">src/app/components/manage/tag-list/tag-list.component.ts</context>
<context context-type="linenumber">30</context>
<context context-type="linenumber">26</context>
</context-group>
</trans-unit>
<trans-unit datatype="html" id="cafc87479686947e2590b9f588a88040aeaf660b">
@ -590,7 +590,7 @@
<target>Vue &quot;<x equiv-text="savedView.name" id="PH"/>&quot; supprimée.</target>
<context-group purpose="location">
<context context-type="sourcefile">src/app/components/manage/settings/settings.component.ts</context>
<context context-type="linenumber">67</context>
<context context-type="linenumber">68</context>
</context-group>
</trans-unit>
<trans-unit datatype="html" id="5647210819299459618">
@ -598,7 +598,7 @@
<target>Paramètres enregistrés avec succès.</target>
<context-group purpose="location">
<context context-type="sourcefile">src/app/components/manage/settings/settings.component.ts</context>
<context context-type="linenumber">87</context>
<context context-type="linenumber">89</context>
</context-group>
</trans-unit>
<trans-unit datatype="html" id="6839066544204061364">
@ -606,7 +606,7 @@
<target>Utiliser la langue du système</target>
<context-group purpose="location">
<context context-type="sourcefile">src/app/components/manage/settings/settings.component.ts</context>
<context context-type="linenumber">92</context>
<context context-type="linenumber">94</context>
</context-group>
</trans-unit>
<trans-unit datatype="html" id="7729897675462249787">
@ -614,7 +614,7 @@
<target>Utiliser le format de date de la langue d'affichage</target>
<context-group purpose="location">
<context context-type="sourcefile">src/app/components/manage/settings/settings.component.ts</context>
<context context-type="linenumber">98</context>
<context context-type="linenumber">100</context>
</context-group>
</trans-unit>
<trans-unit datatype="html" id="8488620293789898901">
@ -622,7 +622,7 @@
<target>Une erreur s'est produite lors de l'enregistrement des paramètres sur le serveur : <x equiv-text="JSON.stringify(error.error)" id="PH"/></target>
<context-group purpose="location">
<context context-type="sourcefile">src/app/components/manage/settings/settings.component.ts</context>
<context context-type="linenumber">115</context>
<context context-type="linenumber">117</context>
</context-group>
</trans-unit>
<trans-unit datatype="html" id="121cc5391cd2a5115bc2b3160379ee5b36cd7716">
@ -646,7 +646,7 @@
<target>Notifications</target>
<context-group purpose="location">
<context context-type="sourcefile">src/app/components/manage/settings/settings.component.html</context>
<context context-type="linenumber">115</context>
<context context-type="linenumber">116</context>
</context-group>
</trans-unit>
<trans-unit datatype="html" id="99dee94e92dbd9e21a008d4569f9719ed206ae37">
@ -654,7 +654,7 @@
<target>Vues enregistrées</target>
<context-group purpose="location">
<context context-type="sourcefile">src/app/components/manage/settings/settings.component.html</context>
<context context-type="linenumber">133</context>
<context context-type="linenumber">134</context>
</context-group>
</trans-unit>
<trans-unit datatype="html" id="bbe41ac2ea4a6c00ea941a41b33105048f8e9f13">
@ -777,12 +777,20 @@
<context context-type="linenumber">98</context>
</context-group>
</trans-unit>
<trans-unit datatype="html" id="71bad20b37410c8972c9aa0f7c62996534b84339">
<source>Invert thumbnails in dark mode</source>
<target>Inverser les vignettes en mode sombre</target>
<context-group purpose="location">
<context context-type="sourcefile">src/app/components/manage/settings/settings.component.html</context>
<context context-type="linenumber">99</context>
</context-group>
</trans-unit>
<trans-unit datatype="html" id="3863a86cd9e69a61d143d3daf51df44203df4a82">
<source>Bulk editing</source>
<target>Edition en masse</target>
<context-group purpose="location">
<context context-type="sourcefile">src/app/components/manage/settings/settings.component.html</context>
<context context-type="linenumber">102</context>
<context context-type="linenumber">103</context>
</context-group>
</trans-unit>
<trans-unit datatype="html" id="c0ac61661c6c326d6e0e00c231b95cf2ac0c6586">
@ -790,7 +798,7 @@
<target>Afficher les messages de confirmation</target>
<context-group purpose="location">
<context context-type="sourcefile">src/app/components/manage/settings/settings.component.html</context>
<context context-type="linenumber">106</context>
<context context-type="linenumber">107</context>
</context-group>
</trans-unit>
<trans-unit datatype="html" id="291bbe56ecbe945dcf05580a57d679fa7bd1e06a">
@ -798,7 +806,7 @@
<target>La suppression de documents requiert toujours une confirmation.</target>
<context-group purpose="location">
<context context-type="sourcefile">src/app/components/manage/settings/settings.component.html</context>
<context context-type="linenumber">106</context>
<context context-type="linenumber">107</context>
</context-group>
</trans-unit>
<trans-unit datatype="html" id="8cfddc13e04f5545ac63f419ef363505d6f78c2e">
@ -806,7 +814,7 @@
<target>Appliquer lors de la fermeture</target>
<context-group purpose="location">
<context context-type="sourcefile">src/app/components/manage/settings/settings.component.html</context>
<context context-type="linenumber">107</context>
<context context-type="linenumber">108</context>
</context-group>
</trans-unit>
<trans-unit datatype="html" id="8680abbea249ebe9c2fe35556559c8e1a9eb5841">
@ -814,7 +822,7 @@
<target>Traitement de documents</target>
<context-group purpose="location">
<context context-type="sourcefile">src/app/components/manage/settings/settings.component.html</context>
<context context-type="linenumber">118</context>
<context context-type="linenumber">119</context>
</context-group>
</trans-unit>
<trans-unit datatype="html" id="2ad4d76b36341c589d94004ad2a213fd4d6f5ca0">
@ -822,7 +830,7 @@
<target>Afficher des notifications lorsque de nouveaux documents sont détectés</target>
<context-group purpose="location">
<context context-type="sourcefile">src/app/components/manage/settings/settings.component.html</context>
<context context-type="linenumber">122</context>
<context context-type="linenumber">123</context>
</context-group>
</trans-unit>
<trans-unit datatype="html" id="e775f4f7c40249d31426ae61a21616a0c9d8e84f">
@ -830,7 +838,7 @@
<target>Afficher des notifications lorsque le traitement des documents se termine avec succès</target>
<context-group purpose="location">
<context context-type="sourcefile">src/app/components/manage/settings/settings.component.html</context>
<context context-type="linenumber">123</context>
<context context-type="linenumber">124</context>
</context-group>
</trans-unit>
<trans-unit datatype="html" id="e3844dd174d8e817ddb551fae28f14ae80ca36b6">
@ -838,7 +846,7 @@
<target>Afficher des notifications en cas d'échec du traitement des documents</target>
<context-group purpose="location">
<context context-type="sourcefile">src/app/components/manage/settings/settings.component.html</context>
<context context-type="linenumber">124</context>
<context context-type="linenumber">125</context>
</context-group>
</trans-unit>
<trans-unit datatype="html" id="af113f7c9f7e13145c3461f61a1aedf12d57bd71">
@ -846,7 +854,7 @@
<target>Supprimer les notifications du tableau de bord</target>
<context-group purpose="location">
<context context-type="sourcefile">src/app/components/manage/settings/settings.component.html</context>
<context context-type="linenumber">125</context>
<context context-type="linenumber">126</context>
</context-group>
</trans-unit>
<trans-unit datatype="html" id="e27bd3804d2936a6897e81c2e52e294490e5e5a8">
@ -854,7 +862,7 @@
<target>Cela supprimera tous les messages liés au traitement de documents sur le tableau de bord.</target>
<context-group purpose="location">
<context context-type="sourcefile">src/app/components/manage/settings/settings.component.html</context>
<context context-type="linenumber">125</context>
<context context-type="linenumber">126</context>
</context-group>
</trans-unit>
<trans-unit datatype="html" id="8cb90334f5dfd7fc67205085f59381e2a334ccfc">
@ -862,7 +870,7 @@
<target>Apparaît sur</target>
<context-group purpose="location">
<context context-type="sourcefile">src/app/components/manage/settings/settings.component.html</context>
<context context-type="linenumber">145</context>
<context context-type="linenumber">146</context>
</context-group>
</trans-unit>
<trans-unit datatype="html" id="6717cf1acf04728fc2b7c39f6d3297f8ff15fde5">
@ -870,7 +878,7 @@
<target>Montrer sur le tableau de bord</target>
<context-group purpose="location">
<context context-type="sourcefile">src/app/components/manage/settings/settings.component.html</context>
<context context-type="linenumber">148</context>
<context context-type="linenumber">149</context>
</context-group>
</trans-unit>
<trans-unit datatype="html" id="541bfc5b123b3f8867fd681eaceefb663a811973">
@ -878,7 +886,7 @@
<target>Montrer dans la barre latérale</target>
<context-group purpose="location">
<context context-type="sourcefile">src/app/components/manage/settings/settings.component.html</context>
<context context-type="linenumber">152</context>
<context context-type="linenumber">153</context>
</context-group>
</trans-unit>
<trans-unit datatype="html" id="abba764a7a595d04dc8c3b26e04b3780d4fdb540">
@ -886,7 +894,7 @@
<target>Aucune vue sauvegardée n'est définie.</target>
<context-group purpose="location">
<context context-type="sourcefile">src/app/components/manage/settings/settings.component.html</context>
<context context-type="linenumber">162</context>
<context context-type="linenumber">163</context>
</context-group>
</trans-unit>
<trans-unit datatype="html" id="ef60a738a565f498b858e903e42bc5ffc3cc1299">
@ -990,7 +998,7 @@
<target>Créer une nouvelle étiquette</target>
<context-group purpose="location">
<context context-type="sourcefile">src/app/components/manage/tag-list/tag-edit-dialog/tag-edit-dialog.component.ts</context>
<context context-type="linenumber">21</context>
<context context-type="linenumber">22</context>
</context-group>
</trans-unit>
<trans-unit datatype="html" id="5872175735754226507">
@ -998,7 +1006,7 @@
<target>Éditer l'étiquette</target>
<context-group purpose="location">
<context context-type="sourcefile">src/app/components/manage/tag-list/tag-edit-dialog/tag-edit-dialog.component.ts</context>
<context context-type="linenumber">25</context>
<context context-type="linenumber">26</context>
</context-group>
</trans-unit>
<trans-unit datatype="html" id="f2a30b4e1a89a8a0db0bd147b54d6626b9a9bc42">
@ -1006,7 +1014,7 @@
<target>Étiquette de boîte de réception</target>
<context-group purpose="location">
<context context-type="sourcefile">src/app/components/manage/tag-list/tag-edit-dialog/tag-edit-dialog.component.html</context>
<context context-type="linenumber">21</context>
<context context-type="linenumber">13</context>
</context-group>
</trans-unit>
<trans-unit datatype="html" id="5e2f1a4ea12a1b8606ee3f0548d0ba64bf266077">
@ -1014,7 +1022,7 @@
<target>Les étiquettes de boîte de réception sont automatiquement affectées à tous les documents traités.</target>
<context-group purpose="location">
<context context-type="sourcefile">src/app/components/manage/tag-list/tag-edit-dialog/tag-edit-dialog.component.html</context>
<context context-type="linenumber">21</context>
<context context-type="linenumber">13</context>
</context-group>
</trans-unit>
<trans-unit datatype="html" id="6672809941092516947">
@ -1111,7 +1119,7 @@
<target>Gestion</target>
<context-group purpose="location">
<context context-type="sourcefile">src/app/components/app-frame/app-frame.component.html</context>
<context context-type="linenumber">107</context>
<context context-type="linenumber">112</context>
</context-group>
</trans-unit>
<trans-unit datatype="html" id="408cb6073e60c5d966296a3207fc596adca75e01">
@ -1119,7 +1127,7 @@
<target>Administration</target>
<context-group purpose="location">
<context context-type="sourcefile">src/app/components/app-frame/app-frame.component.html</context>
<context context-type="linenumber">149</context>
<context context-type="linenumber">154</context>
</context-group>
</trans-unit>
<trans-unit datatype="html" id="321e4419a943044e674beb55b8039f42a9761ca5">
@ -1127,7 +1135,7 @@
<target>Info</target>
<context-group purpose="location">
<context context-type="sourcefile">src/app/components/app-frame/app-frame.component.html</context>
<context context-type="linenumber">155</context>
<context context-type="linenumber">160</context>
</context-group>
</trans-unit>
<trans-unit datatype="html" id="fcfd4675b4c90f08d18d3abede9a9a4dff4cfdc7">
@ -1135,7 +1143,7 @@
<target>Documentation</target>
<context-group purpose="location">
<context context-type="sourcefile">src/app/components/app-frame/app-frame.component.html</context>
<context context-type="linenumber">162</context>
<context context-type="linenumber">167</context>
</context-group>
</trans-unit>
<trans-unit datatype="html" id="355a222236bc01b9a8cd3cb9ecf76891125aed69">
@ -1143,7 +1151,7 @@
<target>GitHub</target>
<context-group purpose="location">
<context context-type="sourcefile">src/app/components/app-frame/app-frame.component.html</context>
<context context-type="linenumber">170</context>
<context context-type="linenumber">175</context>
</context-group>
</trans-unit>
<trans-unit datatype="html" id="ea3a452c5238897cabc5781308cceb2d37dcf258">
@ -1151,7 +1159,7 @@
<target>Suggérer une idée</target>
<context-group purpose="location">
<context context-type="sourcefile">src/app/components/app-frame/app-frame.component.html</context>
<context context-type="linenumber">176</context>
<context context-type="linenumber">181</context>
</context-group>
</trans-unit>
<trans-unit datatype="html" id="af665f8de8fabe306aaf27443957e69bcbbce63c">
@ -1175,7 +1183,23 @@
<target>Fermer tout</target>
<context-group purpose="location">
<context context-type="sourcefile">src/app/components/app-frame/app-frame.component.html</context>
<context context-type="linenumber">101</context>
<context context-type="linenumber">106</context>
</context-group>
</trans-unit>
<trans-unit datatype="html" id="5701618810648052610">
<source>Title</source>
<target>Titre</target>
<context-group purpose="location">
<context context-type="sourcefile">src/app/components/document-list/filter-editor/filter-editor.component.ts</context>
<context context-type="linenumber">73</context>
</context-group>
</trans-unit>
<trans-unit datatype="html" id="3100631071441658964">
<source>Title &amp; content</source>
<target>Titre &amp; contenu</target>
<context-group purpose="location">
<context context-type="sourcefile">src/app/components/document-list/filter-editor/filter-editor.component.ts</context>
<context context-type="linenumber">74</context>
</context-group>
</trans-unit>
<trans-unit datatype="html" id="5195932016807797291">
@ -1183,7 +1207,7 @@
<target>Correspondant : <x equiv-text="this.correspondents.find(c =&gt; c.id == +rule.value)?.name" id="PH"/></target>
<context-group purpose="location">
<context context-type="sourcefile">src/app/components/document-list/filter-editor/filter-editor.component.ts</context>
<context context-type="linenumber">29</context>
<context context-type="linenumber">32</context>
</context-group>
</trans-unit>
<trans-unit datatype="html" id="8170755470576301659">
@ -1191,7 +1215,7 @@
<target>Sans correspondant</target>
<context-group purpose="location">
<context context-type="sourcefile">src/app/components/document-list/filter-editor/filter-editor.component.ts</context>
<context context-type="linenumber">31</context>
<context context-type="linenumber">34</context>
</context-group>
</trans-unit>
<trans-unit datatype="html" id="8705701325879965907">
@ -1199,7 +1223,7 @@
<target>Type : <x equiv-text="this.documentTypes.find(dt =&gt; dt.id == +rule.value)?.name" id="PH"/></target>
<context-group purpose="location">
<context context-type="sourcefile">src/app/components/document-list/filter-editor/filter-editor.component.ts</context>
<context context-type="linenumber">36</context>
<context context-type="linenumber">39</context>
</context-group>
</trans-unit>
<trans-unit datatype="html" id="4362173610367509215">
@ -1207,7 +1231,7 @@
<target>Sans type de document</target>
<context-group purpose="location">
<context context-type="sourcefile">src/app/components/document-list/filter-editor/filter-editor.component.ts</context>
<context context-type="linenumber">38</context>
<context context-type="linenumber">41</context>
</context-group>
</trans-unit>
<trans-unit datatype="html" id="8180755793012580465">
@ -1215,7 +1239,7 @@
<target>Étiquette : <x equiv-text="this.tags.find(t =&gt; t.id == +rule.value)?.name" id="PH"/></target>
<context-group purpose="location">
<context context-type="sourcefile">src/app/components/document-list/filter-editor/filter-editor.component.ts</context>
<context context-type="linenumber">42</context>
<context context-type="linenumber">45</context>
</context-group>
</trans-unit>
<trans-unit datatype="html" id="6494566478302448576">
@ -1223,7 +1247,7 @@
<target>Sans étiquette</target>
<context-group purpose="location">
<context context-type="sourcefile">src/app/components/document-list/filter-editor/filter-editor.component.ts</context>
<context context-type="linenumber">46</context>
<context context-type="linenumber">49</context>
</context-group>
</trans-unit>
<trans-unit datatype="html" id="6523384805359286307">
@ -1231,7 +1255,7 @@
<target>Titre : <x equiv-text="rule.value" id="PH"/></target>
<context-group purpose="location">
<context context-type="sourcefile">src/app/components/document-list/filter-editor/filter-editor.component.ts</context>
<context context-type="linenumber">50</context>
<context context-type="linenumber">53</context>
</context-group>
</trans-unit>
<trans-unit datatype="html" id="02d184c288f567825a1fcbf83bcd3099a10853d5">
@ -1239,7 +1263,7 @@
<target>Filtrer les étiquettes</target>
<context-group purpose="location">
<context context-type="sourcefile">src/app/components/document-list/filter-editor/filter-editor.component.html</context>
<context context-type="linenumber">12</context>
<context context-type="linenumber">20</context>
</context-group>
</trans-unit>
<trans-unit datatype="html" id="4b089ca12c472cf0b46167bb5afe4b527b301bbc">
@ -1247,7 +1271,7 @@
<target>Filtrer les correspondants</target>
<context-group purpose="location">
<context context-type="sourcefile">src/app/components/document-list/filter-editor/filter-editor.component.html</context>
<context context-type="linenumber">20</context>
<context context-type="linenumber">28</context>
</context-group>
</trans-unit>
<trans-unit datatype="html" id="0ad509732aaf702b7ea8c771c7809fa84bc85908">
@ -1255,7 +1279,7 @@
<target>Filtrer les types de documents</target>
<context-group purpose="location">
<context context-type="sourcefile">src/app/components/document-list/filter-editor/filter-editor.component.html</context>
<context context-type="linenumber">27</context>
<context context-type="linenumber">35</context>
</context-group>
</trans-unit>
<trans-unit datatype="html" id="2d9d55f1b70142ff4597ba32179d16888fd9c6b2">
@ -1263,7 +1287,7 @@
<target>Réinitialiser les filtres</target>
<context-group purpose="location">
<context context-type="sourcefile">src/app/components/document-list/filter-editor/filter-editor.component.html</context>
<context context-type="linenumber">50</context>
<context context-type="linenumber">58</context>
</context-group>
</trans-unit>
<trans-unit datatype="html" id="7593728289020204896">
@ -1288,7 +1312,7 @@
<target>Les 7 derniers jours</target>
<context-group purpose="location">
<context context-type="sourcefile">src/app/components/common/date-dropdown/date-dropdown.component.ts</context>
<context context-type="linenumber">24</context>
<context context-type="linenumber">34</context>
</context-group>
</trans-unit>
<trans-unit datatype="html" id="4463380307954693363">
@ -1296,7 +1320,7 @@
<target>Le mois dernier</target>
<context-group purpose="location">
<context context-type="sourcefile">src/app/components/common/date-dropdown/date-dropdown.component.ts</context>
<context context-type="linenumber">25</context>
<context context-type="linenumber">35</context>
</context-group>
</trans-unit>
<trans-unit datatype="html" id="8697368973702409683">
@ -1304,7 +1328,7 @@
<target>Les 3 derniers mois</target>
<context-group purpose="location">
<context context-type="sourcefile">src/app/components/common/date-dropdown/date-dropdown.component.ts</context>
<context context-type="linenumber">26</context>
<context context-type="linenumber">36</context>
</context-group>
</trans-unit>
<trans-unit datatype="html" id="3566342898065860218">
@ -1312,7 +1336,7 @@
<target>L'année passée</target>
<context-group purpose="location">
<context context-type="sourcefile">src/app/components/common/date-dropdown/date-dropdown.component.ts</context>
<context context-type="linenumber">27</context>
<context context-type="linenumber">37</context>
</context-group>
</trans-unit>
<trans-unit datatype="html" id="be2add3a3d9e4e2556b8f9048a15a9c0f00bf1ad">
@ -1328,7 +1352,7 @@
<target>Avant</target>
<context-group purpose="location">
<context context-type="sourcefile">src/app/components/common/date-dropdown/date-dropdown.component.html</context>
<context context-type="linenumber">29</context>
<context context-type="linenumber">38</context>
</context-group>
</trans-unit>
<trans-unit datatype="html" id="99ee4faa69cd2ea8e3678c1f557c0ff1f05aae46">
@ -1829,7 +1853,7 @@
<target>Date incorrecte.</target>
<context-group purpose="location">
<context context-type="sourcefile">src/app/components/common/input/date/date.component.html</context>
<context context-type="linenumber">13</context>
<context context-type="linenumber">14</context>
</context-group>
</trans-unit>
<trans-unit datatype="html" id="2807800733729323332">
@ -1861,7 +1885,7 @@
<target>Anglais (US)</target>
<context-group purpose="location">
<context context-type="sourcefile">src/app/services/settings.service.ts</context>
<context context-type="linenumber">88</context>
<context context-type="linenumber">90</context>
</context-group>
</trans-unit>
<trans-unit datatype="html" id="6987083569809053351">
@ -1869,7 +1893,7 @@
<target>Anglais (GB)</target>
<context-group purpose="location">
<context context-type="sourcefile">src/app/services/settings.service.ts</context>
<context context-type="linenumber">89</context>
<context context-type="linenumber">91</context>
</context-group>
</trans-unit>
<trans-unit datatype="html" id="1858110241312746425">
@ -1877,7 +1901,7 @@
<target>Allemand</target>
<context-group purpose="location">
<context context-type="sourcefile">src/app/services/settings.service.ts</context>
<context context-type="linenumber">90</context>
<context context-type="linenumber">92</context>
</context-group>
</trans-unit>
<trans-unit datatype="html" id="3071065188816255493">
@ -1885,7 +1909,7 @@
<target>Néerlandais</target>
<context-group purpose="location">
<context context-type="sourcefile">src/app/services/settings.service.ts</context>
<context context-type="linenumber">91</context>
<context context-type="linenumber">93</context>
</context-group>
</trans-unit>
<trans-unit datatype="html" id="7633754075223722162">
@ -1893,7 +1917,7 @@
<target>Français</target>
<context-group purpose="location">
<context context-type="sourcefile">src/app/services/settings.service.ts</context>
<context context-type="linenumber">92</context>
<context context-type="linenumber">94</context>
</context-group>
</trans-unit>
<trans-unit datatype="html" id="9184513005098760425">
@ -1901,7 +1925,23 @@
<target>Portugais (Brésil)</target>
<context-group purpose="location">
<context context-type="sourcefile">src/app/services/settings.service.ts</context>
<context context-type="linenumber">93</context>
<context context-type="linenumber">95</context>
</context-group>
</trans-unit>
<trans-unit datatype="html" id="2935232983274991580">
<source>Italian</source>
<target>Italien</target>
<context-group purpose="location">
<context context-type="sourcefile">src/app/services/settings.service.ts</context>
<context context-type="linenumber">96</context>
</context-group>
</trans-unit>
<trans-unit datatype="html" id="8118856427047826368">
<source>Romanian</source>
<target>Roumain</target>
<context-group purpose="location">
<context context-type="sourcefile">src/app/services/settings.service.ts</context>
<context context-type="linenumber">97</context>
</context-group>
</trans-unit>
<trans-unit datatype="html" id="4912706592792948707">
@ -1909,7 +1949,7 @@
<target>ISO 8601</target>
<context-group purpose="location">
<context context-type="sourcefile">src/app/services/settings.service.ts</context>
<context context-type="linenumber">98</context>
<context context-type="linenumber">102</context>
</context-group>
</trans-unit>
<trans-unit datatype="html" id="2119857572761283468">
@ -2052,14 +2092,6 @@
<context context-type="linenumber">18</context>
</context-group>
</trans-unit>
<trans-unit datatype="html" id="5701618810648052610">
<source>Title</source>
<target>Titre</target>
<context-group purpose="location">
<context context-type="sourcefile">src/app/services/rest/document.service.ts</context>
<context context-type="linenumber">19</context>
</context-group>
</trans-unit>
<trans-unit datatype="html" id="5066119607229701477">
<source>Document type</source>
<target>Type de document</target>
@ -2092,110 +2124,6 @@
<context context-type="linenumber">23</context>
</context-group>
</trans-unit>
<trans-unit datatype="html" id="2056433880533904076">
<source>Light blue</source>
<target>Bleu clair</target>
<context-group purpose="location">
<context context-type="sourcefile">src/app/data/paperless-tag.ts</context>
<context context-type="linenumber">6</context>
</context-group>
</trans-unit>
<trans-unit datatype="html" id="4082253113407591781">
<source>Blue</source>
<target>Bleu</target>
<context-group purpose="location">
<context context-type="sourcefile">src/app/data/paperless-tag.ts</context>
<context context-type="linenumber">7</context>
</context-group>
</trans-unit>
<trans-unit datatype="html" id="1143414876575720034">
<source>Light green</source>
<target>Vert clair</target>
<context-group purpose="location">
<context context-type="sourcefile">src/app/data/paperless-tag.ts</context>
<context context-type="linenumber">8</context>
</context-group>
</trans-unit>
<trans-unit datatype="html" id="119581980963263815">
<source>Green</source>
<target>Vert</target>
<context-group purpose="location">
<context context-type="sourcefile">src/app/data/paperless-tag.ts</context>
<context context-type="linenumber">9</context>
</context-group>
</trans-unit>
<trans-unit datatype="html" id="3250646524116252719">
<source>Light red</source>
<target>Rouge clair</target>
<context-group purpose="location">
<context context-type="sourcefile">src/app/data/paperless-tag.ts</context>
<context context-type="linenumber">10</context>
</context-group>
</trans-unit>
<trans-unit datatype="html" id="1628552745302385832">
<source>Red </source>
<target>Rouge</target>
<context-group purpose="location">
<context context-type="sourcefile">src/app/data/paperless-tag.ts</context>
<context context-type="linenumber">11</context>
</context-group>
</trans-unit>
<trans-unit datatype="html" id="5479028842846122610">
<source>Light orange</source>
<target>Orange clair</target>
<context-group purpose="location">
<context context-type="sourcefile">src/app/data/paperless-tag.ts</context>
<context context-type="linenumber">12</context>
</context-group>
</trans-unit>
<trans-unit datatype="html" id="8598918991528773310">
<source>Orange</source>
<target>Orange</target>
<context-group purpose="location">
<context context-type="sourcefile">src/app/data/paperless-tag.ts</context>
<context context-type="linenumber">13</context>
</context-group>
</trans-unit>
<trans-unit datatype="html" id="1789283185177957430">
<source>Light violet</source>
<target>Violet clair</target>
<context-group purpose="location">
<context context-type="sourcefile">src/app/data/paperless-tag.ts</context>
<context context-type="linenumber">14</context>
</context-group>
</trans-unit>
<trans-unit datatype="html" id="2682868487071320453">
<source>Violet</source>
<target>Violet</target>
<context-group purpose="location">
<context context-type="sourcefile">src/app/data/paperless-tag.ts</context>
<context context-type="linenumber">15</context>
</context-group>
</trans-unit>
<trans-unit datatype="html" id="1449010446077321264">
<source>Brown</source>
<target>Brun</target>
<context-group purpose="location">
<context context-type="sourcefile">src/app/data/paperless-tag.ts</context>
<context context-type="linenumber">16</context>
</context-group>
</trans-unit>
<trans-unit datatype="html" id="30300572504753589">
<source>Black</source>
<target>Noir</target>
<context-group purpose="location">
<context context-type="sourcefile">src/app/data/paperless-tag.ts</context>
<context context-type="linenumber">17</context>
</context-group>
</trans-unit>
<trans-unit datatype="html" id="461048771215121187">
<source>Light grey</source>
<target>Gris clair</target>
<context-group purpose="location">
<context context-type="sourcefile">src/app/data/paperless-tag.ts</context>
<context context-type="linenumber">18</context>
</context-group>
</trans-unit>
<trans-unit datatype="html" id="4561076822163447092">
<source>Create new item</source>
<target>Créer un nouvel élément</target>

File diff suppressed because it is too large Load Diff

@ -478,7 +478,7 @@
<target>Wil je het etiket echt verwijderen &quot;<x equiv-text="object.name" id="PH"/>&quot;?</target>
<context-group purpose="location">
<context context-type="sourcefile">src/app/components/manage/tag-list/tag-list.component.ts</context>
<context context-type="linenumber">30</context>
<context context-type="linenumber">26</context>
</context-group>
</trans-unit>
<trans-unit datatype="html" id="cafc87479686947e2590b9f588a88040aeaf660b">
@ -606,7 +606,7 @@
<target>Gebruik de systeemtaal</target>
<context-group purpose="location">
<context context-type="sourcefile">src/app/components/manage/settings/settings.component.ts</context>
<context context-type="linenumber">91</context>
<context context-type="linenumber">92</context>
</context-group>
</trans-unit>
<trans-unit datatype="html" id="7729897675462249787">
@ -614,15 +614,7 @@
<target>Datumopmaak van weergavetaal gebruiken</target>
<context-group purpose="location">
<context context-type="sourcefile">src/app/components/manage/settings/settings.component.ts</context>
<context context-type="linenumber">96</context>
</context-group>
</trans-unit>
<trans-unit datatype="html" id="4912706592792948707">
<source>ISO 8601</source>
<target>ISO 8601</target>
<context-group purpose="location">
<context context-type="sourcefile">src/app/components/manage/settings/settings.component.ts</context>
<context context-type="linenumber">97</context>
<context context-type="linenumber">98</context>
</context-group>
</trans-unit>
<trans-unit datatype="html" id="8488620293789898901">
@ -630,7 +622,7 @@
<target>Fout bij het opslaan van de instellingen: <x equiv-text="JSON.stringify(error.error)" id="PH"/></target>
<context-group purpose="location">
<context context-type="sourcefile">src/app/components/manage/settings/settings.component.ts</context>
<context context-type="linenumber">114</context>
<context context-type="linenumber">115</context>
</context-group>
</trans-unit>
<trans-unit datatype="html" id="121cc5391cd2a5115bc2b3160379ee5b36cd7716">
@ -998,7 +990,7 @@
<target>Nieuw etiket maken</target>
<context-group purpose="location">
<context context-type="sourcefile">src/app/components/manage/tag-list/tag-edit-dialog/tag-edit-dialog.component.ts</context>
<context context-type="linenumber">21</context>
<context context-type="linenumber">22</context>
</context-group>
</trans-unit>
<trans-unit datatype="html" id="5872175735754226507">
@ -1006,7 +998,7 @@
<target>Etiket bewerken</target>
<context-group purpose="location">
<context context-type="sourcefile">src/app/components/manage/tag-list/tag-edit-dialog/tag-edit-dialog.component.ts</context>
<context context-type="linenumber">25</context>
<context context-type="linenumber">26</context>
</context-group>
</trans-unit>
<trans-unit datatype="html" id="f2a30b4e1a89a8a0db0bd147b54d6626b9a9bc42">
@ -1014,7 +1006,7 @@
<target>&quot;Postvak in&quot;-etiket</target>
<context-group purpose="location">
<context context-type="sourcefile">src/app/components/manage/tag-list/tag-edit-dialog/tag-edit-dialog.component.html</context>
<context context-type="linenumber">21</context>
<context context-type="linenumber">13</context>
</context-group>
</trans-unit>
<trans-unit datatype="html" id="5e2f1a4ea12a1b8606ee3f0548d0ba64bf266077">
@ -1022,7 +1014,7 @@
<target>&quot;Postvak in&quot;-etiketten worden automatisch toegewezen aan alle verwerkte documenten.&quot;</target>
<context-group purpose="location">
<context context-type="sourcefile">src/app/components/manage/tag-list/tag-edit-dialog/tag-edit-dialog.component.html</context>
<context context-type="linenumber">21</context>
<context context-type="linenumber">13</context>
</context-group>
</trans-unit>
<trans-unit datatype="html" id="6672809941092516947">
@ -1296,7 +1288,7 @@
<target>Afgelopen 7 dagen</target>
<context-group purpose="location">
<context context-type="sourcefile">src/app/components/common/date-dropdown/date-dropdown.component.ts</context>
<context context-type="linenumber">24</context>
<context context-type="linenumber">34</context>
</context-group>
</trans-unit>
<trans-unit datatype="html" id="4463380307954693363">
@ -1304,7 +1296,7 @@
<target>Afgelopen maand</target>
<context-group purpose="location">
<context context-type="sourcefile">src/app/components/common/date-dropdown/date-dropdown.component.ts</context>
<context context-type="linenumber">25</context>
<context context-type="linenumber">35</context>
</context-group>
</trans-unit>
<trans-unit datatype="html" id="8697368973702409683">
@ -1312,7 +1304,7 @@
<target>Afgelopen 3 maanden</target>
<context-group purpose="location">
<context context-type="sourcefile">src/app/components/common/date-dropdown/date-dropdown.component.ts</context>
<context context-type="linenumber">26</context>
<context context-type="linenumber">36</context>
</context-group>
</trans-unit>
<trans-unit datatype="html" id="3566342898065860218">
@ -1320,7 +1312,7 @@
<target>Afgelopen jaar</target>
<context-group purpose="location">
<context context-type="sourcefile">src/app/components/common/date-dropdown/date-dropdown.component.ts</context>
<context context-type="linenumber">27</context>
<context context-type="linenumber">37</context>
</context-group>
</trans-unit>
<trans-unit datatype="html" id="be2add3a3d9e4e2556b8f9048a15a9c0f00bf1ad">
@ -1336,7 +1328,7 @@
<target>Voor</target>
<context-group purpose="location">
<context context-type="sourcefile">src/app/components/common/date-dropdown/date-dropdown.component.html</context>
<context context-type="linenumber">29</context>
<context context-type="linenumber">38</context>
</context-group>
</trans-unit>
<trans-unit datatype="html" id="99ee4faa69cd2ea8e3678c1f557c0ff1f05aae46">
@ -1832,6 +1824,14 @@
<context context-type="linenumber">21</context>
</context-group>
</trans-unit>
<trans-unit datatype="html" id="d6529debfc1613db22d6fa096ebfeb8a85fa739d">
<source>Invalid date.</source>
<target>Ongeldige datum.</target>
<context-group purpose="location">
<context context-type="sourcefile">src/app/components/common/input/date/date.component.html</context>
<context context-type="linenumber">14</context>
</context-group>
</trans-unit>
<trans-unit datatype="html" id="2807800733729323332">
<source>Yes</source>
<target>Ja</target>
@ -1861,7 +1861,7 @@
<target>Engels (US)</target>
<context-group purpose="location">
<context context-type="sourcefile">src/app/services/settings.service.ts</context>
<context context-type="linenumber">82</context>
<context context-type="linenumber">88</context>
</context-group>
</trans-unit>
<trans-unit datatype="html" id="6987083569809053351">
@ -1869,7 +1869,7 @@
<target>Engels (Brits)</target>
<context-group purpose="location">
<context context-type="sourcefile">src/app/services/settings.service.ts</context>
<context context-type="linenumber">83</context>
<context context-type="linenumber">89</context>
</context-group>
</trans-unit>
<trans-unit datatype="html" id="1858110241312746425">
@ -1877,7 +1877,7 @@
<target>Duits</target>
<context-group purpose="location">
<context context-type="sourcefile">src/app/services/settings.service.ts</context>
<context context-type="linenumber">84</context>
<context context-type="linenumber">90</context>
</context-group>
</trans-unit>
<trans-unit datatype="html" id="3071065188816255493">
@ -1885,7 +1885,7 @@
<target>Nederlands</target>
<context-group purpose="location">
<context context-type="sourcefile">src/app/services/settings.service.ts</context>
<context context-type="linenumber">85</context>
<context context-type="linenumber">91</context>
</context-group>
</trans-unit>
<trans-unit datatype="html" id="7633754075223722162">
@ -1893,7 +1893,31 @@
<target>Frans</target>
<context-group purpose="location">
<context context-type="sourcefile">src/app/services/settings.service.ts</context>
<context context-type="linenumber">86</context>
<context context-type="linenumber">92</context>
</context-group>
</trans-unit>
<trans-unit datatype="html" id="9184513005098760425">
<source>Portuguese (Brazil)</source>
<target>Portugees (Brazilië)</target>
<context-group purpose="location">
<context context-type="sourcefile">src/app/services/settings.service.ts</context>
<context context-type="linenumber">93</context>
</context-group>
</trans-unit>
<trans-unit datatype="html" id="2935232983274991580">
<source>Italian</source>
<target>Italiaans</target>
<context-group purpose="location">
<context context-type="sourcefile">src/app/services/settings.service.ts</context>
<context context-type="linenumber">94</context>
</context-group>
</trans-unit>
<trans-unit datatype="html" id="4912706592792948707">
<source>ISO 8601</source>
<target>ISO 8601</target>
<context-group purpose="location">
<context context-type="sourcefile">src/app/services/settings.service.ts</context>
<context context-type="linenumber">99</context>
</context-group>
</trans-unit>
<trans-unit datatype="html" id="2119857572761283468">
@ -2076,110 +2100,6 @@
<context context-type="linenumber">23</context>
</context-group>
</trans-unit>
<trans-unit datatype="html" id="2056433880533904076">
<source>Light blue</source>
<target>Licht blauw</target>
<context-group purpose="location">
<context context-type="sourcefile">src/app/data/paperless-tag.ts</context>
<context context-type="linenumber">6</context>
</context-group>
</trans-unit>
<trans-unit datatype="html" id="4082253113407591781">
<source>Blue</source>
<target>Blauw</target>
<context-group purpose="location">
<context context-type="sourcefile">src/app/data/paperless-tag.ts</context>
<context context-type="linenumber">7</context>
</context-group>
</trans-unit>
<trans-unit datatype="html" id="1143414876575720034">
<source>Light green</source>
<target>Licht groen</target>
<context-group purpose="location">
<context context-type="sourcefile">src/app/data/paperless-tag.ts</context>
<context context-type="linenumber">8</context>
</context-group>
</trans-unit>
<trans-unit datatype="html" id="119581980963263815">
<source>Green</source>
<target>Groen</target>
<context-group purpose="location">
<context context-type="sourcefile">src/app/data/paperless-tag.ts</context>
<context context-type="linenumber">9</context>
</context-group>
</trans-unit>
<trans-unit datatype="html" id="3250646524116252719">
<source>Light red</source>
<target>Licht rood</target>
<context-group purpose="location">
<context context-type="sourcefile">src/app/data/paperless-tag.ts</context>
<context context-type="linenumber">10</context>
</context-group>
</trans-unit>
<trans-unit datatype="html" id="1628552745302385832">
<source>Red </source>
<target>Rood</target>
<context-group purpose="location">
<context context-type="sourcefile">src/app/data/paperless-tag.ts</context>
<context context-type="linenumber">11</context>
</context-group>
</trans-unit>
<trans-unit datatype="html" id="5479028842846122610">
<source>Light orange</source>
<target>Licht oranje</target>
<context-group purpose="location">
<context context-type="sourcefile">src/app/data/paperless-tag.ts</context>
<context context-type="linenumber">12</context>
</context-group>
</trans-unit>
<trans-unit datatype="html" id="8598918991528773310">
<source>Orange</source>
<target>Oranje</target>
<context-group purpose="location">
<context context-type="sourcefile">src/app/data/paperless-tag.ts</context>
<context context-type="linenumber">13</context>
</context-group>
</trans-unit>
<trans-unit datatype="html" id="1789283185177957430">
<source>Light violet</source>
<target>Licht paars</target>
<context-group purpose="location">
<context context-type="sourcefile">src/app/data/paperless-tag.ts</context>
<context context-type="linenumber">14</context>
</context-group>
</trans-unit>
<trans-unit datatype="html" id="2682868487071320453">
<source>Violet</source>
<target>Paars</target>
<context-group purpose="location">
<context context-type="sourcefile">src/app/data/paperless-tag.ts</context>
<context context-type="linenumber">15</context>
</context-group>
</trans-unit>
<trans-unit datatype="html" id="1449010446077321264">
<source>Brown</source>
<target>Bruin</target>
<context-group purpose="location">
<context context-type="sourcefile">src/app/data/paperless-tag.ts</context>
<context context-type="linenumber">16</context>
</context-group>
</trans-unit>
<trans-unit datatype="html" id="30300572504753589">
<source>Black</source>
<target>Zwart</target>
<context-group purpose="location">
<context context-type="sourcefile">src/app/data/paperless-tag.ts</context>
<context context-type="linenumber">17</context>
</context-group>
</trans-unit>
<trans-unit datatype="html" id="461048771215121187">
<source>Light grey</source>
<target>Licht grijs</target>
<context-group purpose="location">
<context context-type="sourcefile">src/app/data/paperless-tag.ts</context>
<context context-type="linenumber">18</context>
</context-group>
</trans-unit>
<trans-unit datatype="html" id="4561076822163447092">
<source>Create new item</source>
<target>Maak nieuw item</target>

@ -478,7 +478,7 @@
<target>Você realmente deseja excluir a etiqueta &quot;<x equiv-text="object.name" id="PH"/>&quot;?</target>
<context-group purpose="location">
<context context-type="sourcefile">src/app/components/manage/tag-list/tag-list.component.ts</context>
<context context-type="linenumber">30</context>
<context context-type="linenumber">26</context>
</context-group>
</trans-unit>
<trans-unit datatype="html" id="cafc87479686947e2590b9f588a88040aeaf660b">
@ -590,7 +590,7 @@
<target>Visualização &quot;<x equiv-text="savedView.name" id="PH"/>&quot; excluída.</target>
<context-group purpose="location">
<context context-type="sourcefile">src/app/components/manage/settings/settings.component.ts</context>
<context context-type="linenumber">67</context>
<context context-type="linenumber">68</context>
</context-group>
</trans-unit>
<trans-unit datatype="html" id="5647210819299459618">
@ -598,7 +598,7 @@
<target>Configurações salvas com sucesso.</target>
<context-group purpose="location">
<context context-type="sourcefile">src/app/components/manage/settings/settings.component.ts</context>
<context context-type="linenumber">87</context>
<context context-type="linenumber">89</context>
</context-group>
</trans-unit>
<trans-unit datatype="html" id="6839066544204061364">
@ -606,7 +606,7 @@
<target>Usar linguagem do sistema</target>
<context-group purpose="location">
<context context-type="sourcefile">src/app/components/manage/settings/settings.component.ts</context>
<context context-type="linenumber">92</context>
<context context-type="linenumber">94</context>
</context-group>
</trans-unit>
<trans-unit datatype="html" id="7729897675462249787">
@ -614,7 +614,7 @@
<target>Usar formato de data da linguagem de exibição</target>
<context-group purpose="location">
<context context-type="sourcefile">src/app/components/manage/settings/settings.component.ts</context>
<context context-type="linenumber">98</context>
<context context-type="linenumber">100</context>
</context-group>
</trans-unit>
<trans-unit datatype="html" id="8488620293789898901">
@ -622,7 +622,7 @@
<target>Erro ao salvar configurações: <x equiv-text="JSON.stringify(error.error)" id="PH"/></target>
<context-group purpose="location">
<context context-type="sourcefile">src/app/components/manage/settings/settings.component.ts</context>
<context context-type="linenumber">115</context>
<context context-type="linenumber">117</context>
</context-group>
</trans-unit>
<trans-unit datatype="html" id="121cc5391cd2a5115bc2b3160379ee5b36cd7716">
@ -646,7 +646,7 @@
<target>Notificações</target>
<context-group purpose="location">
<context context-type="sourcefile">src/app/components/manage/settings/settings.component.html</context>
<context context-type="linenumber">115</context>
<context context-type="linenumber">116</context>
</context-group>
</trans-unit>
<trans-unit datatype="html" id="99dee94e92dbd9e21a008d4569f9719ed206ae37">
@ -654,7 +654,7 @@
<target>Visualizações</target>
<context-group purpose="location">
<context context-type="sourcefile">src/app/components/manage/settings/settings.component.html</context>
<context context-type="linenumber">133</context>
<context context-type="linenumber">134</context>
</context-group>
</trans-unit>
<trans-unit datatype="html" id="bbe41ac2ea4a6c00ea941a41b33105048f8e9f13">
@ -777,12 +777,20 @@
<context context-type="linenumber">98</context>
</context-group>
</trans-unit>
<trans-unit datatype="html" id="71bad20b37410c8972c9aa0f7c62996534b84339">
<source>Invert thumbnails in dark mode</source>
<target>Inverter imagens em modo noturno</target>
<context-group purpose="location">
<context context-type="sourcefile">src/app/components/manage/settings/settings.component.html</context>
<context context-type="linenumber">99</context>
</context-group>
</trans-unit>
<trans-unit datatype="html" id="3863a86cd9e69a61d143d3daf51df44203df4a82">
<source>Bulk editing</source>
<target>Edição em massa</target>
<context-group purpose="location">
<context context-type="sourcefile">src/app/components/manage/settings/settings.component.html</context>
<context context-type="linenumber">102</context>
<context context-type="linenumber">103</context>
</context-group>
</trans-unit>
<trans-unit datatype="html" id="c0ac61661c6c326d6e0e00c231b95cf2ac0c6586">
@ -790,7 +798,7 @@
<target>Mostrar janelas de confirmação</target>
<context-group purpose="location">
<context context-type="sourcefile">src/app/components/manage/settings/settings.component.html</context>
<context context-type="linenumber">106</context>
<context context-type="linenumber">107</context>
</context-group>
</trans-unit>
<trans-unit datatype="html" id="291bbe56ecbe945dcf05580a57d679fa7bd1e06a">
@ -798,7 +806,7 @@
<target>Ao excluir um documento, sempre será pedido uma confirmação.</target>
<context-group purpose="location">
<context context-type="sourcefile">src/app/components/manage/settings/settings.component.html</context>
<context context-type="linenumber">106</context>
<context context-type="linenumber">107</context>
</context-group>
</trans-unit>
<trans-unit datatype="html" id="8cfddc13e04f5545ac63f419ef363505d6f78c2e">
@ -806,7 +814,7 @@
<target>Aplicar ao fechar</target>
<context-group purpose="location">
<context context-type="sourcefile">src/app/components/manage/settings/settings.component.html</context>
<context context-type="linenumber">107</context>
<context context-type="linenumber">108</context>
</context-group>
</trans-unit>
<trans-unit datatype="html" id="8680abbea249ebe9c2fe35556559c8e1a9eb5841">
@ -814,7 +822,7 @@
<target>Processamento de documentos</target>
<context-group purpose="location">
<context context-type="sourcefile">src/app/components/manage/settings/settings.component.html</context>
<context context-type="linenumber">118</context>
<context context-type="linenumber">119</context>
</context-group>
</trans-unit>
<trans-unit datatype="html" id="2ad4d76b36341c589d94004ad2a213fd4d6f5ca0">
@ -822,7 +830,7 @@
<target>Exibir notificações quando novos documentos forem detectados</target>
<context-group purpose="location">
<context context-type="sourcefile">src/app/components/manage/settings/settings.component.html</context>
<context context-type="linenumber">122</context>
<context context-type="linenumber">123</context>
</context-group>
</trans-unit>
<trans-unit datatype="html" id="e775f4f7c40249d31426ae61a21616a0c9d8e84f">
@ -830,7 +838,7 @@
<target>Exibir notificações quando o processamento de um documento concluir com sucesso</target>
<context-group purpose="location">
<context context-type="sourcefile">src/app/components/manage/settings/settings.component.html</context>
<context context-type="linenumber">123</context>
<context context-type="linenumber">124</context>
</context-group>
</trans-unit>
<trans-unit datatype="html" id="e3844dd174d8e817ddb551fae28f14ae80ca36b6">
@ -838,7 +846,7 @@
<target>Exibir notificações quando o processamento de um documento falhar</target>
<context-group purpose="location">
<context context-type="sourcefile">src/app/components/manage/settings/settings.component.html</context>
<context context-type="linenumber">124</context>
<context context-type="linenumber">125</context>
</context-group>
</trans-unit>
<trans-unit datatype="html" id="af113f7c9f7e13145c3461f61a1aedf12d57bd71">
@ -846,7 +854,7 @@
<target>Não exibir notificações no painel de controle</target>
<context-group purpose="location">
<context context-type="sourcefile">src/app/components/manage/settings/settings.component.html</context>
<context context-type="linenumber">125</context>
<context context-type="linenumber">126</context>
</context-group>
</trans-unit>
<trans-unit datatype="html" id="e27bd3804d2936a6897e81c2e52e294490e5e5a8">
@ -854,7 +862,7 @@
<target>Isso esconderá todas as mensagens sobre o status de processamento de documentos no painel de controle.</target>
<context-group purpose="location">
<context context-type="sourcefile">src/app/components/manage/settings/settings.component.html</context>
<context context-type="linenumber">125</context>
<context context-type="linenumber">126</context>
</context-group>
</trans-unit>
<trans-unit datatype="html" id="8cb90334f5dfd7fc67205085f59381e2a334ccfc">
@ -862,7 +870,7 @@
<target>Aparece em</target>
<context-group purpose="location">
<context context-type="sourcefile">src/app/components/manage/settings/settings.component.html</context>
<context context-type="linenumber">145</context>
<context context-type="linenumber">146</context>
</context-group>
</trans-unit>
<trans-unit datatype="html" id="6717cf1acf04728fc2b7c39f6d3297f8ff15fde5">
@ -870,7 +878,7 @@
<target>Exibir no painel de controle</target>
<context-group purpose="location">
<context context-type="sourcefile">src/app/components/manage/settings/settings.component.html</context>
<context context-type="linenumber">148</context>
<context context-type="linenumber">149</context>
</context-group>
</trans-unit>
<trans-unit datatype="html" id="541bfc5b123b3f8867fd681eaceefb663a811973">
@ -878,7 +886,7 @@
<target>Mostrar na navegação lateral</target>
<context-group purpose="location">
<context context-type="sourcefile">src/app/components/manage/settings/settings.component.html</context>
<context context-type="linenumber">152</context>
<context context-type="linenumber">153</context>
</context-group>
</trans-unit>
<trans-unit datatype="html" id="abba764a7a595d04dc8c3b26e04b3780d4fdb540">
@ -886,7 +894,7 @@
<target>Nenhuma visualização definida.</target>
<context-group purpose="location">
<context context-type="sourcefile">src/app/components/manage/settings/settings.component.html</context>
<context context-type="linenumber">162</context>
<context context-type="linenumber">163</context>
</context-group>
</trans-unit>
<trans-unit datatype="html" id="ef60a738a565f498b858e903e42bc5ffc3cc1299">
@ -990,7 +998,7 @@
<target>Criar nova etiqueta</target>
<context-group purpose="location">
<context context-type="sourcefile">src/app/components/manage/tag-list/tag-edit-dialog/tag-edit-dialog.component.ts</context>
<context context-type="linenumber">21</context>
<context context-type="linenumber">22</context>
</context-group>
</trans-unit>
<trans-unit datatype="html" id="5872175735754226507">
@ -998,7 +1006,7 @@
<target>Editar etiqueta</target>
<context-group purpose="location">
<context context-type="sourcefile">src/app/components/manage/tag-list/tag-edit-dialog/tag-edit-dialog.component.ts</context>
<context context-type="linenumber">25</context>
<context context-type="linenumber">26</context>
</context-group>
</trans-unit>
<trans-unit datatype="html" id="f2a30b4e1a89a8a0db0bd147b54d6626b9a9bc42">
@ -1006,7 +1014,7 @@
<target>Etiqueta caixa de entrada</target>
<context-group purpose="location">
<context context-type="sourcefile">src/app/components/manage/tag-list/tag-edit-dialog/tag-edit-dialog.component.html</context>
<context context-type="linenumber">21</context>
<context context-type="linenumber">13</context>
</context-group>
</trans-unit>
<trans-unit datatype="html" id="5e2f1a4ea12a1b8606ee3f0548d0ba64bf266077">
@ -1014,7 +1022,7 @@
<target>Etiquetas de caixa de entrada são atribuídas automaticamente para todos os documentos consumidos.</target>
<context-group purpose="location">
<context context-type="sourcefile">src/app/components/manage/tag-list/tag-edit-dialog/tag-edit-dialog.component.html</context>
<context context-type="linenumber">21</context>
<context context-type="linenumber">13</context>
</context-group>
</trans-unit>
<trans-unit datatype="html" id="6672809941092516947">
@ -1111,7 +1119,7 @@
<target>Gerenciar</target>
<context-group purpose="location">
<context context-type="sourcefile">src/app/components/app-frame/app-frame.component.html</context>
<context context-type="linenumber">107</context>
<context context-type="linenumber">112</context>
</context-group>
</trans-unit>
<trans-unit datatype="html" id="408cb6073e60c5d966296a3207fc596adca75e01">
@ -1119,7 +1127,7 @@
<target>Admin</target>
<context-group purpose="location">
<context context-type="sourcefile">src/app/components/app-frame/app-frame.component.html</context>
<context context-type="linenumber">149</context>
<context context-type="linenumber">154</context>
</context-group>
</trans-unit>
<trans-unit datatype="html" id="321e4419a943044e674beb55b8039f42a9761ca5">
@ -1127,7 +1135,7 @@
<target>Informação</target>
<context-group purpose="location">
<context context-type="sourcefile">src/app/components/app-frame/app-frame.component.html</context>
<context context-type="linenumber">155</context>
<context context-type="linenumber">160</context>
</context-group>
</trans-unit>
<trans-unit datatype="html" id="fcfd4675b4c90f08d18d3abede9a9a4dff4cfdc7">
@ -1135,7 +1143,7 @@
<target>Documentação</target>
<context-group purpose="location">
<context context-type="sourcefile">src/app/components/app-frame/app-frame.component.html</context>
<context context-type="linenumber">162</context>
<context context-type="linenumber">167</context>
</context-group>
</trans-unit>
<trans-unit datatype="html" id="355a222236bc01b9a8cd3cb9ecf76891125aed69">
@ -1143,7 +1151,7 @@
<target>GitHub</target>
<context-group purpose="location">
<context context-type="sourcefile">src/app/components/app-frame/app-frame.component.html</context>
<context context-type="linenumber">170</context>
<context context-type="linenumber">175</context>
</context-group>
</trans-unit>
<trans-unit datatype="html" id="ea3a452c5238897cabc5781308cceb2d37dcf258">
@ -1151,7 +1159,7 @@
<target>Sugerir uma idéia</target>
<context-group purpose="location">
<context context-type="sourcefile">src/app/components/app-frame/app-frame.component.html</context>
<context context-type="linenumber">176</context>
<context context-type="linenumber">181</context>
</context-group>
</trans-unit>
<trans-unit datatype="html" id="af665f8de8fabe306aaf27443957e69bcbbce63c">
@ -1175,7 +1183,23 @@
<target>Fechar todos</target>
<context-group purpose="location">
<context context-type="sourcefile">src/app/components/app-frame/app-frame.component.html</context>
<context context-type="linenumber">101</context>
<context context-type="linenumber">106</context>
</context-group>
</trans-unit>
<trans-unit datatype="html" id="5701618810648052610">
<source>Title</source>
<target>Título</target>
<context-group purpose="location">
<context context-type="sourcefile">src/app/components/document-list/filter-editor/filter-editor.component.ts</context>
<context context-type="linenumber">73</context>
</context-group>
</trans-unit>
<trans-unit datatype="html" id="3100631071441658964">
<source>Title &amp; content</source>
<target>Título &amp; conteúdo</target>
<context-group purpose="location">
<context context-type="sourcefile">src/app/components/document-list/filter-editor/filter-editor.component.ts</context>
<context context-type="linenumber">74</context>
</context-group>
</trans-unit>
<trans-unit datatype="html" id="5195932016807797291">
@ -1183,7 +1207,7 @@
<target>Correspondente: <x equiv-text="this.correspondents.find(c =&gt; c.id == +rule.value)?.name" id="PH"/></target>
<context-group purpose="location">
<context context-type="sourcefile">src/app/components/document-list/filter-editor/filter-editor.component.ts</context>
<context context-type="linenumber">29</context>
<context context-type="linenumber">32</context>
</context-group>
</trans-unit>
<trans-unit datatype="html" id="8170755470576301659">
@ -1191,7 +1215,7 @@
<target>Sem correspondente</target>
<context-group purpose="location">
<context context-type="sourcefile">src/app/components/document-list/filter-editor/filter-editor.component.ts</context>
<context context-type="linenumber">31</context>
<context context-type="linenumber">34</context>
</context-group>
</trans-unit>
<trans-unit datatype="html" id="8705701325879965907">
@ -1199,7 +1223,7 @@
<target>Tipo: <x equiv-text="this.documentTypes.find(dt =&gt; dt.id == +rule.value)?.name" id="PH"/></target>
<context-group purpose="location">
<context context-type="sourcefile">src/app/components/document-list/filter-editor/filter-editor.component.ts</context>
<context context-type="linenumber">36</context>
<context context-type="linenumber">39</context>
</context-group>
</trans-unit>
<trans-unit datatype="html" id="4362173610367509215">
@ -1207,7 +1231,7 @@
<target>Sem tipo de documento</target>
<context-group purpose="location">
<context context-type="sourcefile">src/app/components/document-list/filter-editor/filter-editor.component.ts</context>
<context context-type="linenumber">38</context>
<context context-type="linenumber">41</context>
</context-group>
</trans-unit>
<trans-unit datatype="html" id="8180755793012580465">
@ -1215,7 +1239,7 @@
<target>Etiqueta: <x equiv-text="this.tags.find(t =&gt; t.id == +rule.value)?.name" id="PH"/></target>
<context-group purpose="location">
<context context-type="sourcefile">src/app/components/document-list/filter-editor/filter-editor.component.ts</context>
<context context-type="linenumber">42</context>
<context context-type="linenumber">45</context>
</context-group>
</trans-unit>
<trans-unit datatype="html" id="6494566478302448576">
@ -1223,7 +1247,7 @@
<target>Sem etiquetas</target>
<context-group purpose="location">
<context context-type="sourcefile">src/app/components/document-list/filter-editor/filter-editor.component.ts</context>
<context context-type="linenumber">46</context>
<context context-type="linenumber">49</context>
</context-group>
</trans-unit>
<trans-unit datatype="html" id="6523384805359286307">
@ -1231,7 +1255,7 @@
<target>Título: <x equiv-text="rule.value" id="PH"/></target>
<context-group purpose="location">
<context context-type="sourcefile">src/app/components/document-list/filter-editor/filter-editor.component.ts</context>
<context context-type="linenumber">50</context>
<context context-type="linenumber">53</context>
</context-group>
</trans-unit>
<trans-unit datatype="html" id="02d184c288f567825a1fcbf83bcd3099a10853d5">
@ -1239,7 +1263,7 @@
<target>Filtrar etiquetas</target>
<context-group purpose="location">
<context context-type="sourcefile">src/app/components/document-list/filter-editor/filter-editor.component.html</context>
<context context-type="linenumber">12</context>
<context context-type="linenumber">20</context>
</context-group>
</trans-unit>
<trans-unit datatype="html" id="4b089ca12c472cf0b46167bb5afe4b527b301bbc">
@ -1247,7 +1271,7 @@
<target>Filtrar correspondentes</target>
<context-group purpose="location">
<context context-type="sourcefile">src/app/components/document-list/filter-editor/filter-editor.component.html</context>
<context context-type="linenumber">20</context>
<context context-type="linenumber">28</context>
</context-group>
</trans-unit>
<trans-unit datatype="html" id="0ad509732aaf702b7ea8c771c7809fa84bc85908">
@ -1255,7 +1279,7 @@
<target>Filtrar tipos de documento</target>
<context-group purpose="location">
<context context-type="sourcefile">src/app/components/document-list/filter-editor/filter-editor.component.html</context>
<context context-type="linenumber">27</context>
<context context-type="linenumber">35</context>
</context-group>
</trans-unit>
<trans-unit datatype="html" id="2d9d55f1b70142ff4597ba32179d16888fd9c6b2">
@ -1263,7 +1287,7 @@
<target>Limpar filtros</target>
<context-group purpose="location">
<context context-type="sourcefile">src/app/components/document-list/filter-editor/filter-editor.component.html</context>
<context context-type="linenumber">50</context>
<context context-type="linenumber">58</context>
</context-group>
</trans-unit>
<trans-unit datatype="html" id="7593728289020204896">
@ -1288,7 +1312,7 @@
<target>Últimos 7 dias</target>
<context-group purpose="location">
<context context-type="sourcefile">src/app/components/common/date-dropdown/date-dropdown.component.ts</context>
<context context-type="linenumber">24</context>
<context context-type="linenumber">34</context>
</context-group>
</trans-unit>
<trans-unit datatype="html" id="4463380307954693363">
@ -1296,7 +1320,7 @@
<target>Último mês</target>
<context-group purpose="location">
<context context-type="sourcefile">src/app/components/common/date-dropdown/date-dropdown.component.ts</context>
<context context-type="linenumber">25</context>
<context context-type="linenumber">35</context>
</context-group>
</trans-unit>
<trans-unit datatype="html" id="8697368973702409683">
@ -1304,7 +1328,7 @@
<target>Últimos 3 meses</target>
<context-group purpose="location">
<context context-type="sourcefile">src/app/components/common/date-dropdown/date-dropdown.component.ts</context>
<context context-type="linenumber">26</context>
<context context-type="linenumber">36</context>
</context-group>
</trans-unit>
<trans-unit datatype="html" id="3566342898065860218">
@ -1312,7 +1336,7 @@
<target>Último ano</target>
<context-group purpose="location">
<context context-type="sourcefile">src/app/components/common/date-dropdown/date-dropdown.component.ts</context>
<context context-type="linenumber">27</context>
<context context-type="linenumber">37</context>
</context-group>
</trans-unit>
<trans-unit datatype="html" id="be2add3a3d9e4e2556b8f9048a15a9c0f00bf1ad">
@ -1328,7 +1352,7 @@
<target>Depois</target>
<context-group purpose="location">
<context context-type="sourcefile">src/app/components/common/date-dropdown/date-dropdown.component.html</context>
<context context-type="linenumber">29</context>
<context context-type="linenumber">38</context>
</context-group>
</trans-unit>
<trans-unit datatype="html" id="99ee4faa69cd2ea8e3678c1f557c0ff1f05aae46">
@ -1729,7 +1753,7 @@
</trans-unit>
<trans-unit datatype="html" id="90917e1a0a7bb59e9d11bdde9183e9391963e17b">
<source>{VAR_PLURAL, plural, =1 {One more document} other {<x id="INTERPOLATION"/> more documents}}</source>
<target>{VAR_PLURAL, plural, =1 {Mais um documento} other {Mais <x id="INTERPOLATION"/> documentos}</target>
<target>{VAR_PLURAL, plural, =1 {Mais um documento} other {Mais <x id="INTERPOLATION"/> documentos}}</target>
<context-group purpose="location">
<context context-type="sourcefile">src/app/components/dashboard/widgets/upload-file-widget/upload-file-widget.component.html</context>
<context context-type="linenumber">25</context>
@ -1829,7 +1853,7 @@
<target>Data inválida.</target>
<context-group purpose="location">
<context context-type="sourcefile">src/app/components/common/input/date/date.component.html</context>
<context context-type="linenumber">13</context>
<context context-type="linenumber">14</context>
</context-group>
</trans-unit>
<trans-unit datatype="html" id="2807800733729323332">
@ -1861,7 +1885,7 @@
<target>Inglês (US)</target>
<context-group purpose="location">
<context context-type="sourcefile">src/app/services/settings.service.ts</context>
<context context-type="linenumber">88</context>
<context context-type="linenumber">90</context>
</context-group>
</trans-unit>
<trans-unit datatype="html" id="6987083569809053351">
@ -1869,7 +1893,7 @@
<target>Inglês (GB)</target>
<context-group purpose="location">
<context context-type="sourcefile">src/app/services/settings.service.ts</context>
<context context-type="linenumber">89</context>
<context context-type="linenumber">91</context>
</context-group>
</trans-unit>
<trans-unit datatype="html" id="1858110241312746425">
@ -1877,7 +1901,7 @@
<target>Alemão</target>
<context-group purpose="location">
<context context-type="sourcefile">src/app/services/settings.service.ts</context>
<context context-type="linenumber">90</context>
<context context-type="linenumber">92</context>
</context-group>
</trans-unit>
<trans-unit datatype="html" id="3071065188816255493">
@ -1885,7 +1909,7 @@
<target>Holandês</target>
<context-group purpose="location">
<context context-type="sourcefile">src/app/services/settings.service.ts</context>
<context context-type="linenumber">91</context>
<context context-type="linenumber">93</context>
</context-group>
</trans-unit>
<trans-unit datatype="html" id="7633754075223722162">
@ -1893,7 +1917,7 @@
<target>Francês</target>
<context-group purpose="location">
<context context-type="sourcefile">src/app/services/settings.service.ts</context>
<context context-type="linenumber">92</context>
<context context-type="linenumber">94</context>
</context-group>
</trans-unit>
<trans-unit datatype="html" id="9184513005098760425">
@ -1901,7 +1925,23 @@
<target>Português (Brasil)</target>
<context-group purpose="location">
<context context-type="sourcefile">src/app/services/settings.service.ts</context>
<context context-type="linenumber">93</context>
<context context-type="linenumber">95</context>
</context-group>
</trans-unit>
<trans-unit datatype="html" id="2935232983274991580">
<source>Italian</source>
<target>Italiano</target>
<context-group purpose="location">
<context context-type="sourcefile">src/app/services/settings.service.ts</context>
<context context-type="linenumber">96</context>
</context-group>
</trans-unit>
<trans-unit datatype="html" id="8118856427047826368">
<source>Romanian</source>
<target>Romeno</target>
<context-group purpose="location">
<context context-type="sourcefile">src/app/services/settings.service.ts</context>
<context context-type="linenumber">97</context>
</context-group>
</trans-unit>
<trans-unit datatype="html" id="4912706592792948707">
@ -1909,7 +1949,7 @@
<target>ISO 8601</target>
<context-group purpose="location">
<context context-type="sourcefile">src/app/services/settings.service.ts</context>
<context context-type="linenumber">98</context>
<context context-type="linenumber">102</context>
</context-group>
</trans-unit>
<trans-unit datatype="html" id="2119857572761283468">
@ -2052,14 +2092,6 @@
<context context-type="linenumber">18</context>
</context-group>
</trans-unit>
<trans-unit datatype="html" id="5701618810648052610">
<source>Title</source>
<target>Título</target>
<context-group purpose="location">
<context context-type="sourcefile">src/app/services/rest/document.service.ts</context>
<context context-type="linenumber">19</context>
</context-group>
</trans-unit>
<trans-unit datatype="html" id="5066119607229701477">
<source>Document type</source>
<target>Tipo de Documento</target>
@ -2092,110 +2124,6 @@
<context context-type="linenumber">23</context>
</context-group>
</trans-unit>
<trans-unit datatype="html" id="2056433880533904076">
<source>Light blue</source>
<target>Azul claro</target>
<context-group purpose="location">
<context context-type="sourcefile">src/app/data/paperless-tag.ts</context>
<context context-type="linenumber">6</context>
</context-group>
</trans-unit>
<trans-unit datatype="html" id="4082253113407591781">
<source>Blue</source>
<target>Azul</target>
<context-group purpose="location">
<context context-type="sourcefile">src/app/data/paperless-tag.ts</context>
<context context-type="linenumber">7</context>
</context-group>
</trans-unit>
<trans-unit datatype="html" id="1143414876575720034">
<source>Light green</source>
<target>Verde claro</target>
<context-group purpose="location">
<context context-type="sourcefile">src/app/data/paperless-tag.ts</context>
<context context-type="linenumber">8</context>
</context-group>
</trans-unit>
<trans-unit datatype="html" id="119581980963263815">
<source>Green</source>
<target>Verde</target>
<context-group purpose="location">
<context context-type="sourcefile">src/app/data/paperless-tag.ts</context>
<context context-type="linenumber">9</context>
</context-group>
</trans-unit>
<trans-unit datatype="html" id="3250646524116252719">
<source>Light red</source>
<target>Vermelho claro</target>
<context-group purpose="location">
<context context-type="sourcefile">src/app/data/paperless-tag.ts</context>
<context context-type="linenumber">10</context>
</context-group>
</trans-unit>
<trans-unit datatype="html" id="1628552745302385832">
<source>Red </source>
<target>Vermelho</target>
<context-group purpose="location">
<context context-type="sourcefile">src/app/data/paperless-tag.ts</context>
<context context-type="linenumber">11</context>
</context-group>
</trans-unit>
<trans-unit datatype="html" id="5479028842846122610">
<source>Light orange</source>
<target>Laranja claro</target>
<context-group purpose="location">
<context context-type="sourcefile">src/app/data/paperless-tag.ts</context>
<context context-type="linenumber">12</context>
</context-group>
</trans-unit>
<trans-unit datatype="html" id="8598918991528773310">
<source>Orange</source>
<target>Laranja</target>
<context-group purpose="location">
<context context-type="sourcefile">src/app/data/paperless-tag.ts</context>
<context context-type="linenumber">13</context>
</context-group>
</trans-unit>
<trans-unit datatype="html" id="1789283185177957430">
<source>Light violet</source>
<target>Violeta claro</target>
<context-group purpose="location">
<context context-type="sourcefile">src/app/data/paperless-tag.ts</context>
<context context-type="linenumber">14</context>
</context-group>
</trans-unit>
<trans-unit datatype="html" id="2682868487071320453">
<source>Violet</source>
<target>Violeta</target>
<context-group purpose="location">
<context context-type="sourcefile">src/app/data/paperless-tag.ts</context>
<context context-type="linenumber">15</context>
</context-group>
</trans-unit>
<trans-unit datatype="html" id="1449010446077321264">
<source>Brown</source>
<target>Marrom</target>
<context-group purpose="location">
<context context-type="sourcefile">src/app/data/paperless-tag.ts</context>
<context context-type="linenumber">16</context>
</context-group>
</trans-unit>
<trans-unit datatype="html" id="30300572504753589">
<source>Black</source>
<target>Preto</target>
<context-group purpose="location">
<context context-type="sourcefile">src/app/data/paperless-tag.ts</context>
<context context-type="linenumber">17</context>
</context-group>
</trans-unit>
<trans-unit datatype="html" id="461048771215121187">
<source>Light grey</source>
<target>Cinza claro</target>
<context-group purpose="location">
<context context-type="sourcefile">src/app/data/paperless-tag.ts</context>
<context context-type="linenumber">18</context>
</context-group>
</trans-unit>
<trans-unit datatype="html" id="4561076822163447092">
<source>Create new item</source>
<target>Criar novo item</target>

File diff suppressed because it is too large Load Diff

@ -64,6 +64,10 @@ $border-color-dark-mode: #47494f;
background-color: $bg-dark-mode;
color: $text-color-dark-mode;
border-color: $border-color-dark-mode $border-color-dark-mode $bg-dark-mode;
.close {
background-color: inherit !important;
}
}
&:hover {
@ -140,15 +144,18 @@ $border-color-dark-mode: #47494f;
.doc-img {
mix-blend-mode: normal;
filter: invert(95%) hue-rotate(180deg);
border-radius: 0;
border-color: $bg-dark-mode;
filter: invert(10%);
&.border-right {
border-right: none !important;
}
}
.doc-img.inverted {
filter: invert(95%) hue-rotate(180deg);
}
.card-selected .doc-img {
mix-blend-mode: luminosity;
}

Binary file not shown.

@ -19,12 +19,12 @@ class TagAdmin(admin.ModelAdmin):
list_display = (
"name",
"colour",
"color",
"match",
"matching_algorithm"
)
list_filter = ("colour", "matching_algorithm")
list_editable = ("colour", "match", "matching_algorithm")
list_filter = ("color", "matching_algorithm")
list_editable = ("color", "match", "matching_algorithm")
class DocumentTypeAdmin(admin.ModelAdmin):

@ -123,10 +123,11 @@ class DocumentClassifier(object):
m.update(y.to_bytes(4, 'little', signed=True))
labels_correspondent.append(y)
tags = [tag.pk for tag in doc.tags.filter(
tags = sorted([tag.pk for tag in doc.tags.filter(
matching_algorithm=MatchingModel.MATCH_AUTO
)]
m.update(bytearray(tags))
)])
for tag in tags:
m.update(tag.to_bytes(4, 'little', signed=True))
labels_tags.append(tags)
if not data:

@ -1,3 +1,4 @@
from django.db.models import Q
from django_filters.rest_framework import BooleanFilter, FilterSet, Filter
from .models import Correspondent, Document, Tag, DocumentType, Log
@ -70,6 +71,16 @@ class InboxFilter(Filter):
return qs
class TitleContentFilter(Filter):
def filter(self, qs, value):
if value:
return qs.filter(Q(title__icontains=value) |
Q(content__icontains=value))
else:
return qs
class DocumentFilterSet(FilterSet):
is_tagged = BooleanFilter(
@ -85,6 +96,8 @@ class DocumentFilterSet(FilterSet):
is_in_inbox = InboxFilter()
title_content = TitleContentFilter()
class Meta:
model = Document
fields = {

@ -0,0 +1,70 @@
# Generated by Django 3.1.4 on 2020-12-02 21:43
from django.db import migrations, models
COLOURS_OLD = {
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",
}
def forward(apps, schema_editor):
Tag = apps.get_model('documents', 'Tag')
for tag in Tag.objects.all():
colour_old_id = tag.colour_old
rgb = COLOURS_OLD[colour_old_id]
tag.color = rgb
tag.save()
def reverse(apps, schema_editor):
Tag = apps.get_model('documents', 'Tag')
def _get_colour_id(rdb):
for idx, rdbx in COLOURS_OLD.items():
if rdbx == rdb:
return idx
# Return colour 1 if we can't match anything
return 1
for tag in Tag.objects.all():
colour_id = _get_colour_id(tag.color)
tag.colour_old = colour_id
tag.save()
class Migration(migrations.Migration):
dependencies = [
('documents', '1012_fix_archive_files'),
]
operations = [
migrations.RenameField(
model_name='tag',
old_name='colour',
new_name='colour_old',
),
migrations.AddField(
model_name='tag',
name='color',
field=models.CharField(default='#a6cee3', max_length=7, verbose_name='color'),
),
migrations.RunPython(forward, reverse),
migrations.RemoveField(
model_name='tag',
name='colour_old',
)
]

@ -0,0 +1,18 @@
# Generated by Django 3.1.7 on 2021-02-28 15:14
from django.db import migrations, models
class Migration(migrations.Migration):
dependencies = [
('documents', '1013_migrate_tag_colour'),
]
operations = [
migrations.AlterField(
model_name='savedviewfilterrule',
name='rule_type',
field=models.PositiveIntegerField(choices=[(0, 'title contains'), (1, 'content contains'), (2, 'ASN is'), (3, 'correspondent is'), (4, 'document type is'), (5, 'is in inbox'), (6, 'has tag'), (7, 'has any tag'), (8, 'created before'), (9, 'created after'), (10, 'created year is'), (11, 'created month is'), (12, 'created day is'), (13, 'added before'), (14, 'added after'), (15, 'modified before'), (16, 'modified after'), (17, 'does not have tag'), (18, 'does not have ASN'), (19, 'title or content contains')], verbose_name='rule type'),
),
]

@ -77,25 +77,11 @@ class Correspondent(MatchingModel):
class Tag(MatchingModel):
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")
)
colour = models.PositiveIntegerField(
color = models.CharField(
_("color"),
choices=COLOURS, default=1)
max_length=7,
default="#a6cee3"
)
is_inbox_tag = models.BooleanField(
_("is inbox tag"),
@ -399,6 +385,8 @@ class SavedViewFilterRule(models.Model):
(15, _("modified before")),
(16, _("modified after")),
(17, _("does not have tag")),
(18, _("does not have ASN")),
(19, _("title or content contains")),
]
saved_view = models.ForeignKey(

@ -1,6 +1,7 @@
import re
import magic
import math
from django.utils.text import slugify
from rest_framework import serializers
from rest_framework.fields import SerializerMethodField
@ -88,7 +89,40 @@ class DocumentTypeSerializer(MatchingModelSerializer):
)
class TagSerializer(MatchingModelSerializer):
class ColorField(serializers.Field):
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")
)
def to_internal_value(self, data):
for id, color in self.COLOURS:
if id == data:
return color
raise serializers.ValidationError()
def to_representation(self, value):
for id, color in self.COLOURS:
if color == value:
return id
return 1
class TagSerializerVersion1(MatchingModelSerializer):
colour = ColorField(source='color', default="#a6cee3")
class Meta:
model = Tag
@ -105,6 +139,45 @@ class TagSerializer(MatchingModelSerializer):
)
class TagSerializer(MatchingModelSerializer):
def get_text_color(self, obj):
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()
class Meta:
model = Tag
fields = (
"id",
"slug",
"name",
"color",
"text_color",
"match",
"matching_algorithm",
"is_insensitive",
"is_inbox_tag",
"document_count"
)
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
class CorrespondentField(serializers.PrimaryKeyRelatedField):
def get_queryset(self):
return Correspondent.objects.all()

@ -15,7 +15,7 @@
<link rel="icon" type="image/x-icon" href="favicon.ico">
<link rel="manifest" href="{% static webmanifest %}">
<link rel="stylesheet" href="{% static styles_css %}">
<link rel="apple-touch-icon" href="apple-touch-icon.png">
<link rel="apple-touch-icon" href="{% static apple_touch_icon %}">
</head>
<body>
<app-root>{% translate "Paperless-ng is loading..." %}</app-root>

@ -807,6 +807,69 @@ class TestDocumentApi(DirectoriesMixin, APITestCase):
}, format='json')
self.assertEqual(response.status_code, 201, endpoint)
def test_tag_color_default(self):
response = self.client.post("/api/tags/", {
"name": "tag"
}, format="json")
self.assertEqual(response.status_code, 201)
self.assertEqual(Tag.objects.get(id=response.data['id']).color, "#a6cee3")
self.assertEqual(self.client.get(f"/api/tags/{response.data['id']}/", format="json").data['colour'], 1)
def test_tag_color(self):
response = self.client.post("/api/tags/", {
"name": "tag",
"colour": 3
}, format="json")
self.assertEqual(response.status_code, 201)
self.assertEqual(Tag.objects.get(id=response.data['id']).color, "#b2df8a")
self.assertEqual(self.client.get(f"/api/tags/{response.data['id']}/", format="json").data['colour'], 3)
def test_tag_color_invalid(self):
response = self.client.post("/api/tags/", {
"name": "tag",
"colour": 34
}, format="json")
self.assertEqual(response.status_code, 400)
def test_tag_color_custom(self):
tag = Tag.objects.create(name="test", color="#abcdef")
self.assertEqual(self.client.get(f"/api/tags/{tag.id}/", format="json").data['colour'], 1)
class TestDocumentApiV2(DirectoriesMixin, APITestCase):
def setUp(self):
super(TestDocumentApiV2, self).setUp()
self.user = User.objects.create_superuser(username="temp_admin")
self.client.force_login(user=self.user)
self.client.defaults['HTTP_ACCEPT'] = 'application/json; version=2'
def test_tag_validate_color(self):
self.assertEqual(self.client.post("/api/tags/", {"name": "test", "color": "#12fFaA"}, format="json").status_code, 201)
self.assertEqual(self.client.post("/api/tags/", {"name": "test1", "color": "abcdef"}, format="json").status_code, 400)
self.assertEqual(self.client.post("/api/tags/", {"name": "test2", "color": "#abcdfg"}, format="json").status_code, 400)
self.assertEqual(self.client.post("/api/tags/", {"name": "test3", "color": "#asd"}, format="json").status_code, 400)
self.assertEqual(self.client.post("/api/tags/", {"name": "test4", "color": "#12121212"}, format="json").status_code, 400)
def test_tag_text_color(self):
t = Tag.objects.create(name="tag1", color="#000000")
self.assertEqual(self.client.get(f"/api/tags/{t.id}/", format="json").data['text_color'], "#ffffff")
t.color = "#ffffff"
t.save()
self.assertEqual(self.client.get(f"/api/tags/{t.id}/", format="json").data['text_color'], "#000000")
t.color = "asdf"
t.save()
self.assertEqual(self.client.get(f"/api/tags/{t.id}/", format="json").data['text_color'], "#000000")
t.color = "123"
t.save()
self.assertEqual(self.client.get(f"/api/tags/{t.id}/", format="json").data['text_color'], "#000000")
class TestBulkEdit(DirectoriesMixin, APITestCase):
@ -1293,3 +1356,16 @@ class TestApiAuth(APITestCase):
self.assertEqual(self.client.get("/api/documents/bulk_edit/").status_code, 401)
self.assertEqual(self.client.get("/api/documents/bulk_download/").status_code, 401)
self.assertEqual(self.client.get("/api/documents/selection_data/").status_code, 401)
def test_api_version_no_auth(self):
response = self.client.get("/api/")
self.assertNotIn("X-Api-Version", response)
self.assertNotIn("X-Version", response)
def test_api_version_with_auth(self):
user = User.objects.create_superuser(username="test")
self.client.force_login(user)
response = self.client.get("/api/")
self.assertIn("X-Api-Version", response)
self.assertIn("X-Version", response)

@ -0,0 +1,37 @@
from documents.tests.utils import DirectoriesMixin, TestMigrations
class TestMigrateTagColor(DirectoriesMixin, TestMigrations):
migrate_from = '1012_fix_archive_files'
migrate_to = '1013_migrate_tag_colour'
def setUpBeforeMigration(self, apps):
Tag = apps.get_model("documents", "Tag")
self.t1_id = Tag.objects.create(name="tag1").id
self.t2_id = Tag.objects.create(name="tag2", colour=1).id
self.t3_id = Tag.objects.create(name="tag3", colour=5).id
def testMimeTypesMigrated(self):
Tag = self.apps.get_model('documents', 'Tag')
self.assertEqual(Tag.objects.get(id=self.t1_id).color, "#a6cee3")
self.assertEqual(Tag.objects.get(id=self.t2_id).color, "#a6cee3")
self.assertEqual(Tag.objects.get(id=self.t3_id).color, "#fb9a99")
class TestMigrateTagColorBackwards(DirectoriesMixin, TestMigrations):
migrate_from = '1013_migrate_tag_colour'
migrate_to = '1012_fix_archive_files'
def setUpBeforeMigration(self, apps):
Tag = apps.get_model("documents", "Tag")
self.t1_id = Tag.objects.create(name="tag1").id
self.t2_id = Tag.objects.create(name="tag2", color="#cab2d6").id
self.t3_id = Tag.objects.create(name="tag3", color="#123456").id
def testMimeTypesReverted(self):
Tag = self.apps.get_model('documents', 'Tag')
self.assertEqual(Tag.objects.get(id=self.t1_id).colour, 1)
self.assertEqual(Tag.objects.get(id=self.t2_id).colour, 9)
self.assertEqual(Tag.objects.get(id=self.t3_id).colour, 1)

@ -50,6 +50,7 @@ from .parsers import get_parser_class_for_mime_type
from .serialisers import (
CorrespondentSerializer,
DocumentSerializer,
TagSerializerVersion1,
TagSerializer,
DocumentTypeSerializer,
PostDocumentSerializer,
@ -89,6 +90,7 @@ class IndexView(TemplateView):
context['polyfills_js'] = f"frontend/{self.get_language()}/polyfills.js" # NOQA: E501
context['main_js'] = f"frontend/{self.get_language()}/main.js"
context['webmanifest'] = f"frontend/{self.get_language()}/manifest.webmanifest" # NOQA: E501
context['apple_touch_icon'] = f"frontend/{self.get_language()}/apple-touch-icon.png" # NOQA: E501
return context
@ -118,7 +120,12 @@ class TagViewSet(ModelViewSet):
queryset = Tag.objects.annotate(
document_count=Count('documents')).order_by(Lower('name'))
serializer_class = TagSerializer
def get_serializer_class(self):
if int(self.request.version) == 1:
return TagSerializerVersion1
else:
return TagSerializer
pagination_class = StandardPagination
permission_classes = (IsAuthenticated,)
filter_backends = (DjangoFilterBackend, OrderingFilter)

@ -11,7 +11,7 @@ msgid ""
msgstr ""
"Project-Id-Version: PACKAGE VERSION\n"
"Report-Msgid-Bugs-To: \n"
"POT-Creation-Date: 2021-02-24 16:49+0100\n"
"POT-Creation-Date: 2021-02-28 12:40+0100\n"
"PO-Revision-Date: 2021-02-16 18:37+0000\n"
"Last-Translator: Jonas Winkler, 2021\n"
"Language-Team: German (https://www.transifex.com/paperless/teams/115905/de/)\n"
@ -49,7 +49,7 @@ msgstr "Ungenaues Wort"
msgid "Automatic"
msgstr "Automatisch"
#: documents/models.py:41 documents/models.py:364 paperless_mail/models.py:25
#: documents/models.py:41 documents/models.py:350 paperless_mail/models.py:25
#: paperless_mail/models.py:109
msgid "name"
msgstr "Name"
@ -66,7 +66,7 @@ msgstr "Zuweisungsalgorithmus"
msgid "is insensitive"
msgstr "Groß-/Kleinschreibung irrelevant"
#: documents/models.py:74 documents/models.py:134
#: documents/models.py:74 documents/models.py:120
msgid "correspondent"
msgstr "Korrespondent"
@ -74,15 +74,15 @@ msgstr "Korrespondent"
msgid "correspondents"
msgstr "Korrespondenten"
#: documents/models.py:97
#: documents/models.py:81
msgid "color"
msgstr "Farbe"
#: documents/models.py:101
#: documents/models.py:87
msgid "is inbox tag"
msgstr "Posteingangs-Tag"
#: documents/models.py:103
#: documents/models.py:89
msgid ""
"Marks this tag as an inbox tag: All newly consumed documents will be tagged "
"with inbox tags."
@ -90,39 +90,39 @@ msgstr ""
"Markiert das Tag als Posteingangs-Tag. Neue Dokumente werden immer mit "
"diesem Tag versehen."
#: documents/models.py:108
#: documents/models.py:94
msgid "tag"
msgstr "Tag"
#: documents/models.py:109 documents/models.py:165
#: documents/models.py:95 documents/models.py:151
msgid "tags"
msgstr "Tags"
#: documents/models.py:115 documents/models.py:147
#: documents/models.py:101 documents/models.py:133
msgid "document type"
msgstr "Dokumenttyp"
#: documents/models.py:116
#: documents/models.py:102
msgid "document types"
msgstr "Dokumenttypen"
#: documents/models.py:124
#: documents/models.py:110
msgid "Unencrypted"
msgstr "Nicht verschlüsselt"
#: documents/models.py:125
#: documents/models.py:111
msgid "Encrypted with GNU Privacy Guard"
msgstr "Verschlüsselt mit GNU Privacy Guard"
#: documents/models.py:138
#: documents/models.py:124
msgid "title"
msgstr "Titel"
#: documents/models.py:151
#: documents/models.py:137
msgid "content"
msgstr "Inhalt"
#: documents/models.py:153
#: documents/models.py:139
msgid ""
"The raw, text-only data of the document. This field is primarily used for "
"searching."
@ -130,241 +130,245 @@ msgstr ""
"Der Inhalt des Dokuments in Textform. Dieses Feld wird primär für die Suche "
"verwendet."
#: documents/models.py:158
#: documents/models.py:144
msgid "mime type"
msgstr "MIME-Typ"
#: documents/models.py:169
#: documents/models.py:155
msgid "checksum"
msgstr "Prüfsumme"
#: documents/models.py:173
#: documents/models.py:159
msgid "The checksum of the original document."
msgstr "Die Prüfsumme des originalen Dokuments."
#: documents/models.py:177
#: documents/models.py:163
msgid "archive checksum"
msgstr "Archiv-Prüfsumme"
#: documents/models.py:182
#: documents/models.py:168
msgid "The checksum of the archived document."
msgstr "Die Prüfsumme des archivierten Dokuments."
#: documents/models.py:186 documents/models.py:342
#: documents/models.py:172 documents/models.py:328
msgid "created"
msgstr "Ausgestellt"
#: documents/models.py:190
#: documents/models.py:176
msgid "modified"
msgstr "Geändert"
#: documents/models.py:194
#: documents/models.py:180
msgid "storage type"
msgstr "Speichertyp"
#: documents/models.py:202
#: documents/models.py:188
msgid "added"
msgstr "Hinzugefügt"
#: documents/models.py:206
#: documents/models.py:192
msgid "filename"
msgstr "Dateiname"
#: documents/models.py:212
#: documents/models.py:198
msgid "Current filename in storage"
msgstr "Aktueller Dateiname im Datenspeicher"
#: documents/models.py:216
#: documents/models.py:202
msgid "archive filename"
msgstr "Archiv-Dateiname"
#: documents/models.py:222
#: documents/models.py:208
msgid "Current archive filename in storage"
msgstr "Aktueller Dateiname im Archiv"
#: documents/models.py:226
#: documents/models.py:212
msgid "archive serial number"
msgstr "Archiv-Seriennummer"
#: documents/models.py:231
#: documents/models.py:217
msgid "The position of this document in your physical document archive."
msgstr "Die Position dieses Dokuments in Ihrem physischen Dokumentenarchiv."
#: documents/models.py:237
#: documents/models.py:223
msgid "document"
msgstr "Dokument"
#: documents/models.py:238
#: documents/models.py:224
msgid "documents"
msgstr "Dokumente"
#: documents/models.py:325
#: documents/models.py:311
msgid "debug"
msgstr "Debug"
#: documents/models.py:326
#: documents/models.py:312
msgid "information"
msgstr "Information"
#: documents/models.py:327
#: documents/models.py:313
msgid "warning"
msgstr "Warnung"
#: documents/models.py:328
#: documents/models.py:314
msgid "error"
msgstr "Fehler"
#: documents/models.py:329
#: documents/models.py:315
msgid "critical"
msgstr "Kritisch"
#: documents/models.py:333
#: documents/models.py:319
msgid "group"
msgstr "Gruppe"
#: documents/models.py:336
#: documents/models.py:322
msgid "message"
msgstr "Nachricht"
#: documents/models.py:339
#: documents/models.py:325
msgid "level"
msgstr "Level"
#: documents/models.py:346
#: documents/models.py:332
msgid "log"
msgstr "Protokoll"
#: documents/models.py:347
#: documents/models.py:333
msgid "logs"
msgstr "Protokoll"
#: documents/models.py:358 documents/models.py:408
#: documents/models.py:344 documents/models.py:394
msgid "saved view"
msgstr "Gespeicherte Ansicht"
#: documents/models.py:359
#: documents/models.py:345
msgid "saved views"
msgstr "Gespeicherte Ansichten"
#: documents/models.py:362
#: documents/models.py:348
msgid "user"
msgstr "Benutzer"
#: documents/models.py:368
#: documents/models.py:354
msgid "show on dashboard"
msgstr "Auf Startseite zeigen"
#: documents/models.py:371
#: documents/models.py:357
msgid "show in sidebar"
msgstr "In Seitenleiste zeigen"
#: documents/models.py:375
#: documents/models.py:361
msgid "sort field"
msgstr "Sortierfeld"
#: documents/models.py:378
#: documents/models.py:364
msgid "sort reverse"
msgstr "Umgekehrte Sortierung"
#: documents/models.py:384
#: documents/models.py:370
msgid "title contains"
msgstr "Titel enthält"
#: documents/models.py:385
#: documents/models.py:371
msgid "content contains"
msgstr "Inhalt enthält"
#: documents/models.py:386
#: documents/models.py:372
msgid "ASN is"
msgstr "ASN ist"
#: documents/models.py:387
#: documents/models.py:373
msgid "correspondent is"
msgstr "Korrespondent ist"
#: documents/models.py:388
#: documents/models.py:374
msgid "document type is"
msgstr "Dokumenttyp ist"
#: documents/models.py:389
#: documents/models.py:375
msgid "is in inbox"
msgstr "Ist im Posteingang"
#: documents/models.py:390
#: documents/models.py:376
msgid "has tag"
msgstr "Hat Tag"
#: documents/models.py:391
#: documents/models.py:377
msgid "has any tag"
msgstr "Hat irgendein Tag"
#: documents/models.py:392
#: documents/models.py:378
msgid "created before"
msgstr "Ausgestellt vor"
#: documents/models.py:393
#: documents/models.py:379
msgid "created after"
msgstr "Ausgestellt nach"
#: documents/models.py:394
#: documents/models.py:380
msgid "created year is"
msgstr "Ausgestellt im Jahr"
#: documents/models.py:395
#: documents/models.py:381
msgid "created month is"
msgstr "Ausgestellt im Monat"
#: documents/models.py:396
#: documents/models.py:382
msgid "created day is"
msgstr "Ausgestellt am Tag"
#: documents/models.py:397
#: documents/models.py:383
msgid "added before"
msgstr "Hinzugefügt vor"
#: documents/models.py:398
#: documents/models.py:384
msgid "added after"
msgstr "Hinzugefügt nach"
#: documents/models.py:399
#: documents/models.py:385
msgid "modified before"
msgstr "Geändert vor"
#: documents/models.py:400
#: documents/models.py:386
msgid "modified after"
msgstr "Geändert nach"
#: documents/models.py:401
#: documents/models.py:387
msgid "does not have tag"
msgstr "Hat nicht folgendes Tag"
#: documents/models.py:412
#: documents/models.py:398
msgid "rule type"
msgstr "Regeltyp"
#: documents/models.py:416
#: documents/models.py:402
msgid "value"
msgstr "Wert"
#: documents/models.py:422
#: documents/models.py:408
msgid "filter rule"
msgstr "Filterregel"
#: documents/models.py:423
#: documents/models.py:409
msgid "filter rules"
msgstr "Filterregeln"
#: documents/serialisers.py:52
#: documents/serialisers.py:53
#, python-format
msgid "Invalid regular expresssion: %(error)s"
msgstr "Ungültiger regulärer Ausdruck: %(error)s"
#: documents/serialisers.py:378
#: documents/serialisers.py:177
msgid "Invalid color."
msgstr "Ungültige Farbe."
#: documents/serialisers.py:451
#, python-format
msgid "File type %(type)s not supported"
msgstr "Dateityp %(type)s nicht unterstützt"
#: documents/templates/index.html:20
#: documents/templates/index.html:21
msgid "Paperless-ng is loading..."
msgstr "Paperless-ng wird geladen..."
@ -406,30 +410,38 @@ msgstr "Passwort"
msgid "Sign in"
msgstr "Anmelden"
#: paperless/settings.py:291
#: paperless/settings.py:297
msgid "English (US)"
msgstr "Englisch (US)"
#: paperless/settings.py:292
#: paperless/settings.py:298
msgid "English (GB)"
msgstr "Englisch (UK)"
#: paperless/settings.py:293
#: paperless/settings.py:299
msgid "German"
msgstr "Deutsch"
#: paperless/settings.py:294
#: paperless/settings.py:300
msgid "Dutch"
msgstr "Niederländisch"
#: paperless/settings.py:295
#: paperless/settings.py:301
msgid "French"
msgstr "Französisch"
#: paperless/settings.py:296
#: paperless/settings.py:302
msgid "Portuguese (Brazil)"
msgstr "Portugiesisch (Brasilien)"
#: paperless/settings.py:303
msgid "Italian"
msgstr "Italienisch"
#: paperless/settings.py:304
msgid "Romanian"
msgstr "Rumänisch"
#: paperless/urls.py:118
msgid "Paperless-ng administration"
msgstr "Paperless-ng Administration"

@ -12,7 +12,7 @@ msgid ""
msgstr ""
"Project-Id-Version: PACKAGE VERSION\n"
"Report-Msgid-Bugs-To: \n"
"POT-Creation-Date: 2021-02-24 16:49+0100\n"
"POT-Creation-Date: 2021-02-26 12:56+0100\n"
"PO-Revision-Date: 2021-02-16 18:37+0000\n"
"Last-Translator: Jonas Winkler, 2021\n"
"Language-Team: English (United Kingdom) (https://www.transifex.com/paperless/teams/115905/en_GB/)\n"
@ -50,7 +50,7 @@ msgstr "Fuzzy word"
msgid "Automatic"
msgstr "Automatic"
#: documents/models.py:41 documents/models.py:364 paperless_mail/models.py:25
#: documents/models.py:41 documents/models.py:350 paperless_mail/models.py:25
#: paperless_mail/models.py:109
msgid "name"
msgstr "name"
@ -67,7 +67,7 @@ msgstr "matching algorithm"
msgid "is insensitive"
msgstr "is insensitive"
#: documents/models.py:74 documents/models.py:134
#: documents/models.py:74 documents/models.py:120
msgid "correspondent"
msgstr "correspondent"
@ -75,15 +75,15 @@ msgstr "correspondent"
msgid "correspondents"
msgstr "correspondents"
#: documents/models.py:97
#: documents/models.py:81
msgid "color"
msgstr "colour"
#: documents/models.py:101
#: documents/models.py:87
msgid "is inbox tag"
msgstr "is inbox tag"
#: documents/models.py:103
#: documents/models.py:89
msgid ""
"Marks this tag as an inbox tag: All newly consumed documents will be tagged "
"with inbox tags."
@ -91,39 +91,39 @@ msgstr ""
"Marks this tag as an inbox tag: All newly consumed documents will be tagged "
"with inbox tags."
#: documents/models.py:108
#: documents/models.py:94
msgid "tag"
msgstr "tag"
#: documents/models.py:109 documents/models.py:165
#: documents/models.py:95 documents/models.py:151
msgid "tags"
msgstr "tags"
#: documents/models.py:115 documents/models.py:147
#: documents/models.py:101 documents/models.py:133
msgid "document type"
msgstr "document type"
#: documents/models.py:116
#: documents/models.py:102
msgid "document types"
msgstr "document types"
#: documents/models.py:124
#: documents/models.py:110
msgid "Unencrypted"
msgstr "Unencrypted"
#: documents/models.py:125
#: documents/models.py:111
msgid "Encrypted with GNU Privacy Guard"
msgstr "Encrypted with GNU Privacy Guard"
#: documents/models.py:138
#: documents/models.py:124
msgid "title"
msgstr "title"
#: documents/models.py:151
#: documents/models.py:137
msgid "content"
msgstr "content"
#: documents/models.py:153
#: documents/models.py:139
msgid ""
"The raw, text-only data of the document. This field is primarily used for "
"searching."
@ -131,241 +131,245 @@ msgstr ""
"The raw, text-only data of the document. This field is primarily used for "
"searching."
#: documents/models.py:158
#: documents/models.py:144
msgid "mime type"
msgstr "mime type"
#: documents/models.py:169
#: documents/models.py:155
msgid "checksum"
msgstr "checksum"
#: documents/models.py:173
#: documents/models.py:159
msgid "The checksum of the original document."
msgstr "The checksum of the original document."
#: documents/models.py:177
#: documents/models.py:163
msgid "archive checksum"
msgstr "archive checksum"
#: documents/models.py:182
#: documents/models.py:168
msgid "The checksum of the archived document."
msgstr "The checksum of the archived document."
#: documents/models.py:186 documents/models.py:342
#: documents/models.py:172 documents/models.py:328
msgid "created"
msgstr "created"
#: documents/models.py:190
#: documents/models.py:176
msgid "modified"
msgstr "modified"
#: documents/models.py:194
#: documents/models.py:180
msgid "storage type"
msgstr "storage type"
#: documents/models.py:202
#: documents/models.py:188
msgid "added"
msgstr "added"
#: documents/models.py:206
#: documents/models.py:192
msgid "filename"
msgstr "filename"
#: documents/models.py:212
#: documents/models.py:198
msgid "Current filename in storage"
msgstr "Current filename in storage"
#: documents/models.py:216
#: documents/models.py:202
msgid "archive filename"
msgstr "archive filename"
#: documents/models.py:222
#: documents/models.py:208
msgid "Current archive filename in storage"
msgstr "Current archive filename in storage"
#: documents/models.py:226
#: documents/models.py:212
msgid "archive serial number"
msgstr "archive serial number"
#: documents/models.py:231
#: documents/models.py:217
msgid "The position of this document in your physical document archive."
msgstr "The position of this document in your physical document archive."
#: documents/models.py:237
#: documents/models.py:223
msgid "document"
msgstr "document"
#: documents/models.py:238
#: documents/models.py:224
msgid "documents"
msgstr "documents"
#: documents/models.py:325
#: documents/models.py:311
msgid "debug"
msgstr "debug"
#: documents/models.py:326
#: documents/models.py:312
msgid "information"
msgstr "information"
#: documents/models.py:327
#: documents/models.py:313
msgid "warning"
msgstr "warning"
#: documents/models.py:328
#: documents/models.py:314
msgid "error"
msgstr "error"
#: documents/models.py:329
#: documents/models.py:315
msgid "critical"
msgstr "critical"
#: documents/models.py:333
#: documents/models.py:319
msgid "group"
msgstr "group"
#: documents/models.py:336
#: documents/models.py:322
msgid "message"
msgstr "message"
#: documents/models.py:339
#: documents/models.py:325
msgid "level"
msgstr "level"
#: documents/models.py:346
#: documents/models.py:332
msgid "log"
msgstr "log"
#: documents/models.py:347
#: documents/models.py:333
msgid "logs"
msgstr "logs"
#: documents/models.py:358 documents/models.py:408
#: documents/models.py:344 documents/models.py:394
msgid "saved view"
msgstr "saved view"
#: documents/models.py:359
#: documents/models.py:345
msgid "saved views"
msgstr "saved views"
#: documents/models.py:362
#: documents/models.py:348
msgid "user"
msgstr "user"
#: documents/models.py:368
#: documents/models.py:354
msgid "show on dashboard"
msgstr "show on dashboard"
#: documents/models.py:371
#: documents/models.py:357
msgid "show in sidebar"
msgstr "show in sidebar"
#: documents/models.py:375
#: documents/models.py:361
msgid "sort field"
msgstr "sort field"
#: documents/models.py:378
#: documents/models.py:364
msgid "sort reverse"
msgstr "sort reverse"
#: documents/models.py:384
#: documents/models.py:370
msgid "title contains"
msgstr "title contains"
#: documents/models.py:385
#: documents/models.py:371
msgid "content contains"
msgstr "content contains"
#: documents/models.py:386
#: documents/models.py:372
msgid "ASN is"
msgstr "ASN is"
#: documents/models.py:387
#: documents/models.py:373
msgid "correspondent is"
msgstr "correspondent is"
#: documents/models.py:388
#: documents/models.py:374
msgid "document type is"
msgstr "document type is"
#: documents/models.py:389
#: documents/models.py:375
msgid "is in inbox"
msgstr "is in inbox"
#: documents/models.py:390
#: documents/models.py:376
msgid "has tag"
msgstr "has tag"
#: documents/models.py:391
#: documents/models.py:377
msgid "has any tag"
msgstr "has any tag"
#: documents/models.py:392
#: documents/models.py:378
msgid "created before"
msgstr "created before"
#: documents/models.py:393
#: documents/models.py:379
msgid "created after"
msgstr "created after"
#: documents/models.py:394
#: documents/models.py:380
msgid "created year is"
msgstr "created year is"
#: documents/models.py:395
#: documents/models.py:381
msgid "created month is"
msgstr "created month is"
#: documents/models.py:396
#: documents/models.py:382
msgid "created day is"
msgstr "created day is"
#: documents/models.py:397
#: documents/models.py:383
msgid "added before"
msgstr "added before"
#: documents/models.py:398
#: documents/models.py:384
msgid "added after"
msgstr "added after"
#: documents/models.py:399
#: documents/models.py:385
msgid "modified before"
msgstr "modified before"
#: documents/models.py:400
#: documents/models.py:386
msgid "modified after"
msgstr "modified after"
#: documents/models.py:401
#: documents/models.py:387
msgid "does not have tag"
msgstr "does not have tag"
#: documents/models.py:412
#: documents/models.py:398
msgid "rule type"
msgstr "rule type"
#: documents/models.py:416
#: documents/models.py:402
msgid "value"
msgstr "value"
#: documents/models.py:422
#: documents/models.py:408
msgid "filter rule"
msgstr "filter rule"
#: documents/models.py:423
#: documents/models.py:409
msgid "filter rules"
msgstr "filter rules"
#: documents/serialisers.py:52
#: documents/serialisers.py:53
#, python-format
msgid "Invalid regular expresssion: %(error)s"
msgstr "Invalid regular expresssion: %(error)s"
#: documents/serialisers.py:378
#: documents/serialisers.py:177
msgid "Invalid color."
msgstr "Invalid colour."
#: documents/serialisers.py:451
#, python-format
msgid "File type %(type)s not supported"
msgstr "File type %(type)s not supported"
#: documents/templates/index.html:20
#: documents/templates/index.html:21
msgid "Paperless-ng is loading..."
msgstr "Paperless-ng is loading..."
@ -405,30 +409,34 @@ msgstr "Password"
msgid "Sign in"
msgstr "Sign in"
#: paperless/settings.py:291
#: paperless/settings.py:297
msgid "English (US)"
msgstr "English (US)"
#: paperless/settings.py:292
#: paperless/settings.py:298
msgid "English (GB)"
msgstr "English (GB)"
#: paperless/settings.py:293
#: paperless/settings.py:299
msgid "German"
msgstr "German"
#: paperless/settings.py:294
#: paperless/settings.py:300
msgid "Dutch"
msgstr "Dutch"
#: paperless/settings.py:295
#: paperless/settings.py:301
msgid "French"
msgstr "French"
#: paperless/settings.py:296
#: paperless/settings.py:302
msgid "Portuguese (Brazil)"
msgstr "Portuguese (Brazil)"
#: paperless/settings.py:303
msgid "Italian"
msgstr "Italian"
#: paperless/urls.py:118
msgid "Paperless-ng administration"
msgstr "Paperless-ng administration"

@ -8,7 +8,7 @@ msgid ""
msgstr ""
"Project-Id-Version: PACKAGE VERSION\n"
"Report-Msgid-Bugs-To: \n"
"POT-Creation-Date: 2021-02-24 16:49+0100\n"
"POT-Creation-Date: 2021-02-28 12:40+0100\n"
"PO-Revision-Date: YEAR-MO-DA HO:MI+ZONE\n"
"Last-Translator: FULL NAME <EMAIL@ADDRESS>\n"
"Language-Team: LANGUAGE <LL@li.org>\n"
@ -45,7 +45,7 @@ msgstr ""
msgid "Automatic"
msgstr ""
#: documents/models.py:41 documents/models.py:364 paperless_mail/models.py:25
#: documents/models.py:41 documents/models.py:350 paperless_mail/models.py:25
#: paperless_mail/models.py:109
msgid "name"
msgstr ""
@ -62,7 +62,7 @@ msgstr ""
msgid "is insensitive"
msgstr ""
#: documents/models.py:74 documents/models.py:134
#: documents/models.py:74 documents/models.py:120
msgid "correspondent"
msgstr ""
@ -70,293 +70,297 @@ msgstr ""
msgid "correspondents"
msgstr ""
#: documents/models.py:97
#: documents/models.py:81
msgid "color"
msgstr ""
#: documents/models.py:101
#: documents/models.py:87
msgid "is inbox tag"
msgstr ""
#: documents/models.py:103
#: documents/models.py:89
msgid ""
"Marks this tag as an inbox tag: All newly consumed documents will be tagged "
"with inbox tags."
msgstr ""
#: documents/models.py:108
#: documents/models.py:94
msgid "tag"
msgstr ""
#: documents/models.py:109 documents/models.py:165
#: documents/models.py:95 documents/models.py:151
msgid "tags"
msgstr ""
#: documents/models.py:115 documents/models.py:147
#: documents/models.py:101 documents/models.py:133
msgid "document type"
msgstr ""
#: documents/models.py:116
#: documents/models.py:102
msgid "document types"
msgstr ""
#: documents/models.py:124
#: documents/models.py:110
msgid "Unencrypted"
msgstr ""
#: documents/models.py:125
#: documents/models.py:111
msgid "Encrypted with GNU Privacy Guard"
msgstr ""
#: documents/models.py:138
#: documents/models.py:124
msgid "title"
msgstr ""
#: documents/models.py:151
#: documents/models.py:137
msgid "content"
msgstr ""
#: documents/models.py:153
#: documents/models.py:139
msgid ""
"The raw, text-only data of the document. This field is primarily used for "
"searching."
msgstr ""
#: documents/models.py:158
#: documents/models.py:144
msgid "mime type"
msgstr ""
#: documents/models.py:169
#: documents/models.py:155
msgid "checksum"
msgstr ""
#: documents/models.py:173
#: documents/models.py:159
msgid "The checksum of the original document."
msgstr ""
#: documents/models.py:177
#: documents/models.py:163
msgid "archive checksum"
msgstr ""
#: documents/models.py:182
#: documents/models.py:168
msgid "The checksum of the archived document."
msgstr ""
#: documents/models.py:186 documents/models.py:342
#: documents/models.py:172 documents/models.py:328
msgid "created"
msgstr ""
#: documents/models.py:190
#: documents/models.py:176
msgid "modified"
msgstr ""
#: documents/models.py:194
#: documents/models.py:180
msgid "storage type"
msgstr ""
#: documents/models.py:202
#: documents/models.py:188
msgid "added"
msgstr ""
#: documents/models.py:206
#: documents/models.py:192
msgid "filename"
msgstr ""
#: documents/models.py:212
#: documents/models.py:198
msgid "Current filename in storage"
msgstr ""
#: documents/models.py:216
#: documents/models.py:202
msgid "archive filename"
msgstr ""
#: documents/models.py:222
#: documents/models.py:208
msgid "Current archive filename in storage"
msgstr ""
#: documents/models.py:226
#: documents/models.py:212
msgid "archive serial number"
msgstr ""
#: documents/models.py:231
#: documents/models.py:217
msgid "The position of this document in your physical document archive."
msgstr ""
#: documents/models.py:237
#: documents/models.py:223
msgid "document"
msgstr ""
#: documents/models.py:238
#: documents/models.py:224
msgid "documents"
msgstr ""
#: documents/models.py:325
#: documents/models.py:311
msgid "debug"
msgstr ""
#: documents/models.py:326
#: documents/models.py:312
msgid "information"
msgstr ""
#: documents/models.py:327
#: documents/models.py:313
msgid "warning"
msgstr ""
#: documents/models.py:328
#: documents/models.py:314
msgid "error"
msgstr ""
#: documents/models.py:329
#: documents/models.py:315
msgid "critical"
msgstr ""
#: documents/models.py:333
#: documents/models.py:319
msgid "group"
msgstr ""
#: documents/models.py:336
#: documents/models.py:322
msgid "message"
msgstr ""
#: documents/models.py:339
#: documents/models.py:325
msgid "level"
msgstr ""
#: documents/models.py:346
#: documents/models.py:332
msgid "log"
msgstr ""
#: documents/models.py:347
#: documents/models.py:333
msgid "logs"
msgstr ""
#: documents/models.py:358 documents/models.py:408
#: documents/models.py:344 documents/models.py:394
msgid "saved view"
msgstr ""
#: documents/models.py:359
#: documents/models.py:345
msgid "saved views"
msgstr ""
#: documents/models.py:362
#: documents/models.py:348
msgid "user"
msgstr ""
#: documents/models.py:368
#: documents/models.py:354
msgid "show on dashboard"
msgstr ""
#: documents/models.py:371
#: documents/models.py:357
msgid "show in sidebar"
msgstr ""
#: documents/models.py:375
#: documents/models.py:361
msgid "sort field"
msgstr ""
#: documents/models.py:378
#: documents/models.py:364
msgid "sort reverse"
msgstr ""
#: documents/models.py:384
#: documents/models.py:370
msgid "title contains"
msgstr ""
#: documents/models.py:385
#: documents/models.py:371
msgid "content contains"
msgstr ""
#: documents/models.py:386
#: documents/models.py:372
msgid "ASN is"
msgstr ""
#: documents/models.py:387
#: documents/models.py:373
msgid "correspondent is"
msgstr ""
#: documents/models.py:388
#: documents/models.py:374
msgid "document type is"
msgstr ""
#: documents/models.py:389
#: documents/models.py:375
msgid "is in inbox"
msgstr ""
#: documents/models.py:390
#: documents/models.py:376
msgid "has tag"
msgstr ""
#: documents/models.py:391
#: documents/models.py:377
msgid "has any tag"
msgstr ""
#: documents/models.py:392
#: documents/models.py:378
msgid "created before"
msgstr ""
#: documents/models.py:393
#: documents/models.py:379
msgid "created after"
msgstr ""
#: documents/models.py:394
#: documents/models.py:380
msgid "created year is"
msgstr ""
#: documents/models.py:395
#: documents/models.py:381
msgid "created month is"
msgstr ""
#: documents/models.py:396
#: documents/models.py:382
msgid "created day is"
msgstr ""
#: documents/models.py:397
#: documents/models.py:383
msgid "added before"
msgstr ""
#: documents/models.py:398
#: documents/models.py:384
msgid "added after"
msgstr ""
#: documents/models.py:399
#: documents/models.py:385
msgid "modified before"
msgstr ""
#: documents/models.py:400
#: documents/models.py:386
msgid "modified after"
msgstr ""
#: documents/models.py:401
#: documents/models.py:387
msgid "does not have tag"
msgstr ""
#: documents/models.py:412
#: documents/models.py:398
msgid "rule type"
msgstr ""
#: documents/models.py:416
#: documents/models.py:402
msgid "value"
msgstr ""
#: documents/models.py:422
#: documents/models.py:408
msgid "filter rule"
msgstr ""
#: documents/models.py:423
#: documents/models.py:409
msgid "filter rules"
msgstr ""
#: documents/serialisers.py:52
#: documents/serialisers.py:53
#, python-format
msgid "Invalid regular expresssion: %(error)s"
msgstr ""
#: documents/serialisers.py:378
#: documents/serialisers.py:177
msgid "Invalid color."
msgstr ""
#: documents/serialisers.py:451
#, python-format
msgid "File type %(type)s not supported"
msgstr ""
#: documents/templates/index.html:20
#: documents/templates/index.html:21
msgid "Paperless-ng is loading..."
msgstr ""
@ -396,30 +400,38 @@ msgstr ""
msgid "Sign in"
msgstr ""
#: paperless/settings.py:291
#: paperless/settings.py:297
msgid "English (US)"
msgstr ""
#: paperless/settings.py:292
#: paperless/settings.py:298
msgid "English (GB)"
msgstr ""
#: paperless/settings.py:293
#: paperless/settings.py:299
msgid "German"
msgstr ""
#: paperless/settings.py:294
#: paperless/settings.py:300
msgid "Dutch"
msgstr ""
#: paperless/settings.py:295
#: paperless/settings.py:301
msgid "French"
msgstr ""
#: paperless/settings.py:296
#: paperless/settings.py:302
msgid "Portuguese (Brazil)"
msgstr ""
#: paperless/settings.py:303
msgid "Italian"
msgstr ""
#: paperless/settings.py:304
msgid "Romanian"
msgstr ""
#: paperless/urls.py:118
msgid "Paperless-ng administration"
msgstr ""

@ -12,7 +12,7 @@ msgid ""
msgstr ""
"Project-Id-Version: PACKAGE VERSION\n"
"Report-Msgid-Bugs-To: \n"
"POT-Creation-Date: 2021-02-24 16:49+0100\n"
"POT-Creation-Date: 2021-02-28 12:40+0100\n"
"PO-Revision-Date: 2021-02-16 18:37+0000\n"
"Last-Translator: Philmo67, 2021\n"
"Language-Team: French (https://www.transifex.com/paperless/teams/115905/fr/)\n"
@ -50,7 +50,7 @@ msgstr "Mot approximatif"
msgid "Automatic"
msgstr "Automatique"
#: documents/models.py:41 documents/models.py:364 paperless_mail/models.py:25
#: documents/models.py:41 documents/models.py:350 paperless_mail/models.py:25
#: paperless_mail/models.py:109
msgid "name"
msgstr "nom"
@ -67,7 +67,7 @@ msgstr "algorithme de rapprochement"
msgid "is insensitive"
msgstr "est insensible à la casse"
#: documents/models.py:74 documents/models.py:134
#: documents/models.py:74 documents/models.py:120
msgid "correspondent"
msgstr "correspondant"
@ -75,15 +75,15 @@ msgstr "correspondant"
msgid "correspondents"
msgstr "correspondants"
#: documents/models.py:97
#: documents/models.py:81
msgid "color"
msgstr "couleur"
#: documents/models.py:101
#: documents/models.py:87
msgid "is inbox tag"
msgstr "est une étiquette de boîte de réception"
#: documents/models.py:103
#: documents/models.py:89
msgid ""
"Marks this tag as an inbox tag: All newly consumed documents will be tagged "
"with inbox tags."
@ -91,39 +91,39 @@ msgstr ""
"Marque cette étiquette comme étiquette de boîte de réception : ces "
"étiquettes sont affectées à tous les documents nouvellement traités."
#: documents/models.py:108
#: documents/models.py:94
msgid "tag"
msgstr "étiquette"
#: documents/models.py:109 documents/models.py:165
#: documents/models.py:95 documents/models.py:151
msgid "tags"
msgstr "étiquettes"
#: documents/models.py:115 documents/models.py:147
#: documents/models.py:101 documents/models.py:133
msgid "document type"
msgstr "type de document"
#: documents/models.py:116
#: documents/models.py:102
msgid "document types"
msgstr "types de document"
#: documents/models.py:124
#: documents/models.py:110
msgid "Unencrypted"
msgstr "Non chiffré"
#: documents/models.py:125
#: documents/models.py:111
msgid "Encrypted with GNU Privacy Guard"
msgstr "Chiffré avec GNU Privacy Guard"
#: documents/models.py:138
#: documents/models.py:124
msgid "title"
msgstr "titre"
#: documents/models.py:151
#: documents/models.py:137
msgid "content"
msgstr "contenu"
#: documents/models.py:153
#: documents/models.py:139
msgid ""
"The raw, text-only data of the document. This field is primarily used for "
"searching."
@ -131,242 +131,246 @@ msgstr ""
"Les données brutes du document, en format texte uniquement. Ce champ est "
"principalement utilisé pour la recherche."
#: documents/models.py:158
#: documents/models.py:144
msgid "mime type"
msgstr "type mime"
#: documents/models.py:169
#: documents/models.py:155
msgid "checksum"
msgstr "somme de contrôle"
#: documents/models.py:173
#: documents/models.py:159
msgid "The checksum of the original document."
msgstr "La somme de contrôle du document original."
#: documents/models.py:177
#: documents/models.py:163
msgid "archive checksum"
msgstr "somme de contrôle de l'archive"
#: documents/models.py:182
#: documents/models.py:168
msgid "The checksum of the archived document."
msgstr "La somme de contrôle du document archivé."
#: documents/models.py:186 documents/models.py:342
#: documents/models.py:172 documents/models.py:328
msgid "created"
msgstr "créé le"
#: documents/models.py:190
#: documents/models.py:176
msgid "modified"
msgstr "modifié"
#: documents/models.py:194
#: documents/models.py:180
msgid "storage type"
msgstr "forme d'enregistrement :"
#: documents/models.py:202
#: documents/models.py:188
msgid "added"
msgstr "date d'ajout"
#: documents/models.py:206
#: documents/models.py:192
msgid "filename"
msgstr "nom du fichier"
#: documents/models.py:212
#: documents/models.py:198
msgid "Current filename in storage"
msgstr "Nom du fichier courant en base de données"
#: documents/models.py:216
#: documents/models.py:202
msgid "archive filename"
msgstr "nom de fichier de l'archive"
#: documents/models.py:222
#: documents/models.py:208
msgid "Current archive filename in storage"
msgstr "Nom du fichier d'archive courant en base de données"
#: documents/models.py:226
#: documents/models.py:212
msgid "archive serial number"
msgstr "numéro de série de l'archive"
#: documents/models.py:231
#: documents/models.py:217
msgid "The position of this document in your physical document archive."
msgstr ""
"Le classement de ce document dans votre archive de documents physiques."
#: documents/models.py:237
#: documents/models.py:223
msgid "document"
msgstr "document"
#: documents/models.py:238
#: documents/models.py:224
msgid "documents"
msgstr "documents"
#: documents/models.py:325
#: documents/models.py:311
msgid "debug"
msgstr "débogage"
#: documents/models.py:326
#: documents/models.py:312
msgid "information"
msgstr "information"
#: documents/models.py:327
#: documents/models.py:313
msgid "warning"
msgstr "avertissement"
#: documents/models.py:328
#: documents/models.py:314
msgid "error"
msgstr "erreur"
#: documents/models.py:329
#: documents/models.py:315
msgid "critical"
msgstr "critique"
#: documents/models.py:333
#: documents/models.py:319
msgid "group"
msgstr "groupe"
#: documents/models.py:336
#: documents/models.py:322
msgid "message"
msgstr "message"
#: documents/models.py:339
#: documents/models.py:325
msgid "level"
msgstr "niveau"
#: documents/models.py:346
#: documents/models.py:332
msgid "log"
msgstr "rapport"
#: documents/models.py:347
#: documents/models.py:333
msgid "logs"
msgstr "rapports"
#: documents/models.py:358 documents/models.py:408
#: documents/models.py:344 documents/models.py:394
msgid "saved view"
msgstr "vue enregistrée"
#: documents/models.py:359
#: documents/models.py:345
msgid "saved views"
msgstr "vues enregistrées"
#: documents/models.py:362
#: documents/models.py:348
msgid "user"
msgstr "utilisateur"
#: documents/models.py:368
#: documents/models.py:354
msgid "show on dashboard"
msgstr "montrer sur le tableau de bord"
#: documents/models.py:371
#: documents/models.py:357
msgid "show in sidebar"
msgstr "montrer dans la barre latérale"
#: documents/models.py:375
#: documents/models.py:361
msgid "sort field"
msgstr "champ de tri"
#: documents/models.py:378
#: documents/models.py:364
msgid "sort reverse"
msgstr "tri inverse"
#: documents/models.py:384
#: documents/models.py:370
msgid "title contains"
msgstr "le titre contient"
#: documents/models.py:385
#: documents/models.py:371
msgid "content contains"
msgstr "le contenu contient"
#: documents/models.py:386
#: documents/models.py:372
msgid "ASN is"
msgstr "le NSA est"
#: documents/models.py:387
#: documents/models.py:373
msgid "correspondent is"
msgstr "le correspondant est"
#: documents/models.py:388
#: documents/models.py:374
msgid "document type is"
msgstr "le type de document est"
#: documents/models.py:389
#: documents/models.py:375
msgid "is in inbox"
msgstr "est dans la boîte de réception"
#: documents/models.py:390
#: documents/models.py:376
msgid "has tag"
msgstr "porte l'étiquette"
#: documents/models.py:391
#: documents/models.py:377
msgid "has any tag"
msgstr "porte l'une des étiquettes"
#: documents/models.py:392
#: documents/models.py:378
msgid "created before"
msgstr "créé avant"
#: documents/models.py:393
#: documents/models.py:379
msgid "created after"
msgstr "créé après"
#: documents/models.py:394
#: documents/models.py:380
msgid "created year is"
msgstr "l'année de création est"
#: documents/models.py:395
#: documents/models.py:381
msgid "created month is"
msgstr "le mois de création est"
#: documents/models.py:396
#: documents/models.py:382
msgid "created day is"
msgstr "le jour de création est"
#: documents/models.py:397
#: documents/models.py:383
msgid "added before"
msgstr "ajouté avant"
#: documents/models.py:398
#: documents/models.py:384
msgid "added after"
msgstr "ajouté après"
#: documents/models.py:399
#: documents/models.py:385
msgid "modified before"
msgstr "modifié avant"
#: documents/models.py:400
#: documents/models.py:386
msgid "modified after"
msgstr "modifié après"
#: documents/models.py:401
#: documents/models.py:387
msgid "does not have tag"
msgstr "ne porte pas d'étiquette"
#: documents/models.py:412
#: documents/models.py:398
msgid "rule type"
msgstr "type de règle"
#: documents/models.py:416
#: documents/models.py:402
msgid "value"
msgstr "valeur"
#: documents/models.py:422
#: documents/models.py:408
msgid "filter rule"
msgstr "règle de filtrage"
#: documents/models.py:423
#: documents/models.py:409
msgid "filter rules"
msgstr "règles de filtrage"
#: documents/serialisers.py:52
#: documents/serialisers.py:53
#, python-format
msgid "Invalid regular expresssion: %(error)s"
msgstr "Expression régulière incorrecte : %(error)s"
#: documents/serialisers.py:378
#: documents/serialisers.py:177
msgid "Invalid color."
msgstr "Couleur incorrecte."
#: documents/serialisers.py:451
#, python-format
msgid "File type %(type)s not supported"
msgstr "Type de fichier %(type)s non pris en charge"
#: documents/templates/index.html:20
#: documents/templates/index.html:21
msgid "Paperless-ng is loading..."
msgstr "Paperless-ng est en cours de chargement..."
@ -408,30 +412,38 @@ msgstr "Mot de passe"
msgid "Sign in"
msgstr "S'identifier"
#: paperless/settings.py:291
#: paperless/settings.py:297
msgid "English (US)"
msgstr "Anglais (US)"
#: paperless/settings.py:292
#: paperless/settings.py:298
msgid "English (GB)"
msgstr "Anglais (GB)"
#: paperless/settings.py:293
#: paperless/settings.py:299
msgid "German"
msgstr "Allemand"
#: paperless/settings.py:294
#: paperless/settings.py:300
msgid "Dutch"
msgstr "Néerlandais"
#: paperless/settings.py:295
#: paperless/settings.py:301
msgid "French"
msgstr "Français"
#: paperless/settings.py:296
#: paperless/settings.py:302
msgid "Portuguese (Brazil)"
msgstr "Portugais (Brésil)"
#: paperless/settings.py:303
msgid "Italian"
msgstr "Italien"
#: paperless/settings.py:304
msgid "Romanian"
msgstr "Roumain"
#: paperless/urls.py:118
msgid "Paperless-ng administration"
msgstr "Administration de Paperless-ng"

@ -0,0 +1,686 @@
# SOME DESCRIPTIVE TITLE.
# Copyright (C) YEAR THE PACKAGE'S COPYRIGHT HOLDER
# This file is distributed under the same license as the PACKAGE package.
# FIRST AUTHOR <EMAIL@ADDRESS>, YEAR.
#
# Translators:
# Ioma Taani, 2021
# Jonas Winkler, 2021
# Oliver Thomas Cervera <cervera93-10@yahoo.it>, 2021
# Alex Camilleri <camilleri.alex@gmail.com>, 2021
#
#, fuzzy
msgid ""
msgstr ""
"Project-Id-Version: PACKAGE VERSION\n"
"Report-Msgid-Bugs-To: \n"
"POT-Creation-Date: 2021-02-28 12:40+0100\n"
"PO-Revision-Date: 2021-02-16 18:37+0000\n"
"Last-Translator: Alex Camilleri <camilleri.alex@gmail.com>, 2021\n"
"Language-Team: Italian (https://www.transifex.com/paperless/teams/115905/it/)\n"
"MIME-Version: 1.0\n"
"Content-Type: text/plain; charset=UTF-8\n"
"Content-Transfer-Encoding: 8bit\n"
"Language: it\n"
"Plural-Forms: nplurals=2; plural=(n != 1);\n"
#: documents/apps.py:10
msgid "Documents"
msgstr "Documenti"
#: documents/models.py:32
msgid "Any word"
msgstr "Qualsiasi parola"
#: documents/models.py:33
msgid "All words"
msgstr "Tutte le parole"
#: documents/models.py:34
msgid "Exact match"
msgstr "Corrispondenza esatta"
#: documents/models.py:35
msgid "Regular expression"
msgstr "Espressione regolare"
#: documents/models.py:36
msgid "Fuzzy word"
msgstr "Parole fuzzy"
#: documents/models.py:37
msgid "Automatic"
msgstr "Automatico"
#: documents/models.py:41 documents/models.py:350 paperless_mail/models.py:25
#: paperless_mail/models.py:109
msgid "name"
msgstr "nome"
#: documents/models.py:45
msgid "match"
msgstr "corrispondenza"
#: documents/models.py:49
msgid "matching algorithm"
msgstr "algoritmo di corrispondenza"
#: documents/models.py:55
msgid "is insensitive"
msgstr "non distingue maiuscole e minuscole"
#: documents/models.py:74 documents/models.py:120
msgid "correspondent"
msgstr "corrispondente"
#: documents/models.py:75
msgid "correspondents"
msgstr "corrispondenti"
#: documents/models.py:81
msgid "color"
msgstr "colore"
#: documents/models.py:87
msgid "is inbox tag"
msgstr "è tag di arrivo"
#: documents/models.py:89
msgid ""
"Marks this tag as an inbox tag: All newly consumed documents will be tagged "
"with inbox tags."
msgstr ""
"Contrassegna questo tag come tag in arrivo: tutti i documenti elaborati "
"verranno taggati con questo tag."
#: documents/models.py:94
msgid "tag"
msgstr "tag"
#: documents/models.py:95 documents/models.py:151
msgid "tags"
msgstr "tag"
#: documents/models.py:101 documents/models.py:133
msgid "document type"
msgstr "tipo di documento"
#: documents/models.py:102
msgid "document types"
msgstr "tipi di documento"
#: documents/models.py:110
msgid "Unencrypted"
msgstr "Non criptato"
#: documents/models.py:111
msgid "Encrypted with GNU Privacy Guard"
msgstr "Criptato con GNU Privacy Guard"
#: documents/models.py:124
msgid "title"
msgstr "titolo"
#: documents/models.py:137
msgid "content"
msgstr "contenuto"
#: documents/models.py:139
msgid ""
"The raw, text-only data of the document. This field is primarily used for "
"searching."
msgstr ""
"I dati grezzi o solo testo del documento. Questo campo è usato "
"principalmente per la ricerca."
#: documents/models.py:144
msgid "mime type"
msgstr "tipo mime"
#: documents/models.py:155
msgid "checksum"
msgstr "checksum"
#: documents/models.py:159
msgid "The checksum of the original document."
msgstr "Il checksum del documento originale."
#: documents/models.py:163
msgid "archive checksum"
msgstr "checksum dell'archivio"
#: documents/models.py:168
msgid "The checksum of the archived document."
msgstr "Il checksum del documento archiviato."
#: documents/models.py:172 documents/models.py:328
msgid "created"
msgstr "creato il"
#: documents/models.py:176
msgid "modified"
msgstr "modificato il"
#: documents/models.py:180
msgid "storage type"
msgstr "tipo di storage"
#: documents/models.py:188
msgid "added"
msgstr "aggiunto il"
#: documents/models.py:192
msgid "filename"
msgstr "nome del file"
#: documents/models.py:198
msgid "Current filename in storage"
msgstr "Nome del file corrente nello storage"
#: documents/models.py:202
msgid "archive filename"
msgstr "Nome file in archivio"
#: documents/models.py:208
msgid "Current archive filename in storage"
msgstr "Il nome del file nell'archiviazione"
#: documents/models.py:212
msgid "archive serial number"
msgstr "numero seriale dell'archivio"
#: documents/models.py:217
msgid "The position of this document in your physical document archive."
msgstr "Posizione di questo documento all'interno dell'archivio fisico."
#: documents/models.py:223
msgid "document"
msgstr "documento"
#: documents/models.py:224
msgid "documents"
msgstr "documenti"
#: documents/models.py:311
msgid "debug"
msgstr "debug"
#: documents/models.py:312
msgid "information"
msgstr "informazione"
#: documents/models.py:313
msgid "warning"
msgstr "avvertimento"
#: documents/models.py:314
msgid "error"
msgstr "errore"
#: documents/models.py:315
msgid "critical"
msgstr "critico"
#: documents/models.py:319
msgid "group"
msgstr "gruppo"
#: documents/models.py:322
msgid "message"
msgstr "messaggio"
#: documents/models.py:325
msgid "level"
msgstr "livello"
#: documents/models.py:332
msgid "log"
msgstr "log"
#: documents/models.py:333
msgid "logs"
msgstr "log"
#: documents/models.py:344 documents/models.py:394
msgid "saved view"
msgstr "vista salvata"
#: documents/models.py:345
msgid "saved views"
msgstr "viste salvate"
#: documents/models.py:348
msgid "user"
msgstr "utente"
#: documents/models.py:354
msgid "show on dashboard"
msgstr "mostra sul cruscotto"
#: documents/models.py:357
msgid "show in sidebar"
msgstr "mostra nella barra laterale"
#: documents/models.py:361
msgid "sort field"
msgstr "campo di ordinamento"
#: documents/models.py:364
msgid "sort reverse"
msgstr "ordine invertito"
#: documents/models.py:370
msgid "title contains"
msgstr "il titolo contiene"
#: documents/models.py:371
msgid "content contains"
msgstr "il contenuto contiene"
#: documents/models.py:372
msgid "ASN is"
msgstr "ASN è"
#: documents/models.py:373
msgid "correspondent is"
msgstr "la corrispondenza è"
#: documents/models.py:374
msgid "document type is"
msgstr "il tipo di documento è"
#: documents/models.py:375
msgid "is in inbox"
msgstr "è in arrivo"
#: documents/models.py:376
msgid "has tag"
msgstr "ha etichetta"
#: documents/models.py:377
msgid "has any tag"
msgstr "ha qualsiasi etichetta"
#: documents/models.py:378
msgid "created before"
msgstr "creato prima del"
#: documents/models.py:379
msgid "created after"
msgstr "creato dopo il"
#: documents/models.py:380
msgid "created year is"
msgstr "l'anno di creazione è"
#: documents/models.py:381
msgid "created month is"
msgstr "il mese di creazione è"
#: documents/models.py:382
msgid "created day is"
msgstr "il giorno di creazione è"
#: documents/models.py:383
msgid "added before"
msgstr "aggiunto prima del"
#: documents/models.py:384
msgid "added after"
msgstr "aggiunto dopo il"
#: documents/models.py:385
msgid "modified before"
msgstr "modificato prima del"
#: documents/models.py:386
msgid "modified after"
msgstr "modificato dopo"
#: documents/models.py:387
msgid "does not have tag"
msgstr "non ha tag"
#: documents/models.py:398
msgid "rule type"
msgstr "tipo di regola"
#: documents/models.py:402
msgid "value"
msgstr "valore"
#: documents/models.py:408
msgid "filter rule"
msgstr "regola filtro"
#: documents/models.py:409
msgid "filter rules"
msgstr "regole filtro"
#: documents/serialisers.py:53
#, python-format
msgid "Invalid regular expresssion: %(error)s"
msgstr "Espressione regolare non valida: %(error)s"
#: documents/serialisers.py:177
msgid "Invalid color."
msgstr "Colore non valido."
#: documents/serialisers.py:451
#, python-format
msgid "File type %(type)s not supported"
msgstr "Il tipo di file %(type)s non è supportato"
#: documents/templates/index.html:21
msgid "Paperless-ng is loading..."
msgstr "Paperless-ng si sta caricando..."
#: documents/templates/registration/logged_out.html:13
msgid "Paperless-ng signed out"
msgstr "Paperless-ng è uscito"
#: documents/templates/registration/logged_out.html:41
msgid "You have been successfully logged out. Bye!"
msgstr "Vi siete disconnessi. Ciao!"
#: documents/templates/registration/logged_out.html:42
msgid "Sign in again"
msgstr "Rientra nuovamente"
#: documents/templates/registration/login.html:13
msgid "Paperless-ng sign in"
msgstr "Accedi a Paperless-ng"
#: documents/templates/registration/login.html:42
msgid "Please sign in."
msgstr "Accedi"
#: documents/templates/registration/login.html:45
msgid "Your username and password didn't match. Please try again."
msgstr "Il nome utente e la password non sono corretti. Riprovare."
#: documents/templates/registration/login.html:48
msgid "Username"
msgstr "Nome utente"
#: documents/templates/registration/login.html:49
msgid "Password"
msgstr "Password"
#: documents/templates/registration/login.html:54
msgid "Sign in"
msgstr "Accedi"
#: paperless/settings.py:297
msgid "English (US)"
msgstr "Inglese (US)"
#: paperless/settings.py:298
msgid "English (GB)"
msgstr "Inglese (GB)"
#: paperless/settings.py:299
msgid "German"
msgstr "Tedesco"
#: paperless/settings.py:300
msgid "Dutch"
msgstr "Olandese"
#: paperless/settings.py:301
msgid "French"
msgstr "Francese"
#: paperless/settings.py:302
msgid "Portuguese (Brazil)"
msgstr "Portoghese (Brasile)"
#: paperless/settings.py:303
msgid "Italian"
msgstr "Italiano"
#: paperless/settings.py:304
msgid "Romanian"
msgstr "Rumeno"
#: paperless/urls.py:118
msgid "Paperless-ng administration"
msgstr "Amministrazione di Paperless-ng"
#: paperless_mail/admin.py:25
msgid "Filter"
msgstr "Filtro"
#: paperless_mail/admin.py:27
msgid ""
"Paperless will only process mails that match ALL of the filters given below."
msgstr ""
"Paperless-ng processerà solo la posta che rientra in TUTTI i filtri "
"impostati."
#: paperless_mail/admin.py:37
msgid "Actions"
msgstr "Azioni"
#: paperless_mail/admin.py:39
msgid ""
"The action applied to the mail. This action is only performed when documents"
" were consumed from the mail. Mails without attachments will remain entirely"
" untouched."
msgstr ""
"L'azione che viene applicata alla email. Questa azione viene eseguita solo "
"quando dei documenti vengono elaborati dalla email. Le email senza allegati "
"vengono ignorate."
#: paperless_mail/admin.py:46
msgid "Metadata"
msgstr "Metadati"
#: paperless_mail/admin.py:48
msgid ""
"Assign metadata to documents consumed from this rule automatically. If you "
"do not assign tags, types or correspondents here, paperless will still "
"process all matching rules that you have defined."
msgstr ""
"Assegna automaticamente i metadati ai documenti elaborati da questa regola. "
"Se non assegni qui dei tag, tipi di documenti o corrispondenti, Paperless "
"userà comunque le regole corrispondenti che hai configurato."
#: paperless_mail/apps.py:9
msgid "Paperless mail"
msgstr "Email Paperless"
#: paperless_mail/models.py:11
msgid "mail account"
msgstr "account email"
#: paperless_mail/models.py:12
msgid "mail accounts"
msgstr "account email"
#: paperless_mail/models.py:19
msgid "No encryption"
msgstr "Nessuna crittografia"
#: paperless_mail/models.py:20
msgid "Use SSL"
msgstr "Usa SSL"
#: paperless_mail/models.py:21
msgid "Use STARTTLS"
msgstr "Usa STARTTLS"
#: paperless_mail/models.py:29
msgid "IMAP server"
msgstr "Server IMAP"
#: paperless_mail/models.py:33
msgid "IMAP port"
msgstr "Porta IMAP"
#: paperless_mail/models.py:36
msgid ""
"This is usually 143 for unencrypted and STARTTLS connections, and 993 for "
"SSL connections."
msgstr ""
"Di solito si usa 143 per STARTTLS o nessuna crittografia e 993 per SSL."
#: paperless_mail/models.py:40
msgid "IMAP security"
msgstr "Sicurezza IMAP"
#: paperless_mail/models.py:46
msgid "username"
msgstr "nome utente"
#: paperless_mail/models.py:50
msgid "password"
msgstr "password"
#: paperless_mail/models.py:60
msgid "mail rule"
msgstr "regola email"
#: paperless_mail/models.py:61
msgid "mail rules"
msgstr "regole email"
#: paperless_mail/models.py:67
msgid "Only process attachments."
msgstr "Elabora solo gli allegati."
#: paperless_mail/models.py:68
msgid "Process all files, including 'inline' attachments."
msgstr "Elabora tutti i file, inclusi gli allegati nel corpo."
#: paperless_mail/models.py:78
msgid "Mark as read, don't process read mails"
msgstr "Segna come letto, non elaborare le email lette"
#: paperless_mail/models.py:79
msgid "Flag the mail, don't process flagged mails"
msgstr "Contrassegna la email, non elaborare le email elaborate."
#: paperless_mail/models.py:80
msgid "Move to specified folder"
msgstr "Sposta in una cartella"
#: paperless_mail/models.py:81
msgid "Delete"
msgstr "Elimina"
#: paperless_mail/models.py:88
msgid "Use subject as title"
msgstr "Usa oggetto come titolo"
#: paperless_mail/models.py:89
msgid "Use attachment filename as title"
msgstr "Usa il nome dell'allegato come titolo"
#: paperless_mail/models.py:99
msgid "Do not assign a correspondent"
msgstr "Non assegnare un corrispondente"
#: paperless_mail/models.py:101
msgid "Use mail address"
msgstr "Usa indirizzo email"
#: paperless_mail/models.py:103
msgid "Use name (or mail address if not available)"
msgstr "Usa nome (o indirizzo email se non disponibile)"
#: paperless_mail/models.py:105
msgid "Use correspondent selected below"
msgstr "Usa il corrispondente selezionato qui sotto"
#: paperless_mail/models.py:113
msgid "order"
msgstr "priorità"
#: paperless_mail/models.py:120
msgid "account"
msgstr "account"
#: paperless_mail/models.py:124
msgid "folder"
msgstr "cartella"
#: paperless_mail/models.py:128
msgid "filter from"
msgstr "filtra da"
#: paperless_mail/models.py:131
msgid "filter subject"
msgstr "filtra oggetto"
#: paperless_mail/models.py:134
msgid "filter body"
msgstr "filtra corpo"
#: paperless_mail/models.py:138
msgid "filter attachment filename"
msgstr "filtra nome allegato"
#: paperless_mail/models.py:140
msgid ""
"Only consume documents which entirely match this filename if specified. "
"Wildcards such as *.pdf or *invoice* are allowed. Case insensitive."
msgstr ""
"Elabora i documenti che corrispondono a questo nome. Puoi usare wildcard "
"come *.pdf o *fattura*. Non fa differenza fra maiuscole e minuscole."
#: paperless_mail/models.py:146
msgid "maximum age"
msgstr "età massima"
#: paperless_mail/models.py:148
msgid "Specified in days."
msgstr "Definito in giorni."
#: paperless_mail/models.py:151
msgid "attachment type"
msgstr "tipo di allegato"
#: paperless_mail/models.py:154
msgid ""
"Inline attachments include embedded images, so it's best to combine this "
"option with a filename filter."
msgstr ""
"Gli allegati in linea includono le immagini nel corpo, quindi è meglio "
"combinare questa opzione con il filtro nome."
#: paperless_mail/models.py:159
msgid "action"
msgstr "azione"
#: paperless_mail/models.py:165
msgid "action parameter"
msgstr "parametro azione"
#: paperless_mail/models.py:167
msgid ""
"Additional parameter for the action selected above, i.e., the target folder "
"of the move to folder action."
msgstr ""
"Parametro aggiuntivo per l'azione selezionata, ad esempio la cartella di "
"destinazione per l'azione che sposta in una cartella."
#: paperless_mail/models.py:173
msgid "assign title from"
msgstr "assegna tittolo da"
#: paperless_mail/models.py:183
msgid "assign this tag"
msgstr "assegna questo tag"
#: paperless_mail/models.py:191
msgid "assign this document type"
msgstr "assegna questo tipo di documento"
#: paperless_mail/models.py:195
msgid "assign correspondent from"
msgstr "assegna corrispondente da"
#: paperless_mail/models.py:205
msgid "assign this correspondent"
msgstr "assegna questo corrispondente"

@ -6,15 +6,16 @@
# Translators:
# Jonas Winkler, 2021
# Jo Vandeginste <jo.vandeginste@gmail.com>, 2021
# Ben <bzweekhorst@gmail.com>, 2021
#
#, fuzzy
msgid ""
msgstr ""
"Project-Id-Version: PACKAGE VERSION\n"
"Report-Msgid-Bugs-To: \n"
"POT-Creation-Date: 2021-02-16 14:52+0100\n"
"POT-Creation-Date: 2021-02-28 12:40+0100\n"
"PO-Revision-Date: 2021-02-16 18:37+0000\n"
"Last-Translator: Jo Vandeginste <jo.vandeginste@gmail.com>, 2021\n"
"Last-Translator: Ben <bzweekhorst@gmail.com>, 2021\n"
"Language-Team: Dutch (Netherlands) (https://www.transifex.com/paperless/teams/115905/nl_NL/)\n"
"MIME-Version: 1.0\n"
"Content-Type: text/plain; charset=UTF-8\n"
@ -50,7 +51,7 @@ msgstr "Gelijkaardig woord"
msgid "Automatic"
msgstr "Automatisch"
#: documents/models.py:41 documents/models.py:364 paperless_mail/models.py:25
#: documents/models.py:41 documents/models.py:350 paperless_mail/models.py:25
#: paperless_mail/models.py:109
msgid "name"
msgstr "naam"
@ -67,7 +68,7 @@ msgstr "Algoritme voor het bepalen van de overeenkomst"
msgid "is insensitive"
msgstr "is niet hoofdlettergevoelig"
#: documents/models.py:74 documents/models.py:134
#: documents/models.py:74 documents/models.py:120
msgid "correspondent"
msgstr "correspondent"
@ -75,15 +76,15 @@ msgstr "correspondent"
msgid "correspondents"
msgstr "correspondenten"
#: documents/models.py:97
#: documents/models.py:81
msgid "color"
msgstr "Kleur"
#: documents/models.py:101
#: documents/models.py:87
msgid "is inbox tag"
msgstr "is \"Postvak in\"-etiket"
#: documents/models.py:103
#: documents/models.py:89
msgid ""
"Marks this tag as an inbox tag: All newly consumed documents will be tagged "
"with inbox tags."
@ -91,39 +92,39 @@ msgstr ""
"Markeer dit etiket als een \"Postvak in\"-etiket: alle nieuw verwerkte "
"documenten krijgen de \"Postvak in\"-etiketten."
#: documents/models.py:108
#: documents/models.py:94
msgid "tag"
msgstr "etiket"
#: documents/models.py:109 documents/models.py:165
#: documents/models.py:95 documents/models.py:151
msgid "tags"
msgstr "etiketten"
#: documents/models.py:115 documents/models.py:147
#: documents/models.py:101 documents/models.py:133
msgid "document type"
msgstr "documenttype"
#: documents/models.py:116
#: documents/models.py:102
msgid "document types"
msgstr "documenttypen"
#: documents/models.py:124
#: documents/models.py:110
msgid "Unencrypted"
msgstr "Niet versleuteld"
#: documents/models.py:125
#: documents/models.py:111
msgid "Encrypted with GNU Privacy Guard"
msgstr "Versleuteld met GNU Privacy Guard"
#: documents/models.py:138
#: documents/models.py:124
msgid "title"
msgstr "titel"
#: documents/models.py:151
#: documents/models.py:137
msgid "content"
msgstr "inhoud"
#: documents/models.py:153
#: documents/models.py:139
msgid ""
"The raw, text-only data of the document. This field is primarily used for "
"searching."
@ -131,236 +132,245 @@ msgstr ""
"De onbewerkte gegevens van het document. Dit veld wordt voornamelijk "
"gebruikt om te zoeken."
#: documents/models.py:158
#: documents/models.py:144
msgid "mime type"
msgstr "mimetype"
#: documents/models.py:169
#: documents/models.py:155
msgid "checksum"
msgstr "checksum"
#: documents/models.py:173
#: documents/models.py:159
msgid "The checksum of the original document."
msgstr "Het controlecijfer van het originele document."
#: documents/models.py:177
#: documents/models.py:163
msgid "archive checksum"
msgstr "archief checksum"
#: documents/models.py:182
#: documents/models.py:168
msgid "The checksum of the archived document."
msgstr "De checksum van het gearchiveerde document."
#: documents/models.py:186 documents/models.py:342
#: documents/models.py:172 documents/models.py:328
msgid "created"
msgstr "aangemaakt"
#: documents/models.py:190
#: documents/models.py:176
msgid "modified"
msgstr "gewijzigd"
#: documents/models.py:194
#: documents/models.py:180
msgid "storage type"
msgstr "type opslag"
#: documents/models.py:202
#: documents/models.py:188
msgid "added"
msgstr "toegevoegd"
#: documents/models.py:206
#: documents/models.py:192
msgid "filename"
msgstr "bestandsnaam"
#: documents/models.py:212
#: documents/models.py:198
msgid "Current filename in storage"
msgstr "Huidige bestandsnaam in opslag"
#: documents/models.py:216
#: documents/models.py:202
msgid "archive filename"
msgstr "Bestandsnaam in archief"
#: documents/models.py:222
#: documents/models.py:208
msgid "Current archive filename in storage"
msgstr "Huidige bestandsnaam in archief"
#: documents/models.py:226
#: documents/models.py:212
msgid "archive serial number"
msgstr "serienummer in archief"
#: documents/models.py:231
#: documents/models.py:217
msgid "The position of this document in your physical document archive."
msgstr "De positie van dit document in je fysieke documentenarchief."
#: documents/models.py:237
#: documents/models.py:223
msgid "document"
msgstr "document"
#: documents/models.py:238
#: documents/models.py:224
msgid "documents"
msgstr "documenten"
#: documents/models.py:325
#: documents/models.py:311
msgid "debug"
msgstr "debug"
#: documents/models.py:326
#: documents/models.py:312
msgid "information"
msgstr "informatie"
#: documents/models.py:327
#: documents/models.py:313
msgid "warning"
msgstr "waarschuwing"
#: documents/models.py:328
#: documents/models.py:314
msgid "error"
msgstr "fout"
#: documents/models.py:329
#: documents/models.py:315
msgid "critical"
msgstr "kritisch"
#: documents/models.py:333
#: documents/models.py:319
msgid "group"
msgstr "groep"
#: documents/models.py:336
#: documents/models.py:322
msgid "message"
msgstr "bericht"
#: documents/models.py:339
#: documents/models.py:325
msgid "level"
msgstr "niveau"
#: documents/models.py:346
#: documents/models.py:332
msgid "log"
msgstr "bericht"
#: documents/models.py:347
#: documents/models.py:333
msgid "logs"
msgstr "berichten"
#: documents/models.py:358 documents/models.py:408
#: documents/models.py:344 documents/models.py:394
msgid "saved view"
msgstr "opgeslagen view"
#: documents/models.py:359
#: documents/models.py:345
msgid "saved views"
msgstr "opgeslagen views"
#: documents/models.py:362
#: documents/models.py:348
msgid "user"
msgstr "gebruiker"
#: documents/models.py:368
#: documents/models.py:354
msgid "show on dashboard"
msgstr "weergeven op dashboard"
#: documents/models.py:371
#: documents/models.py:357
msgid "show in sidebar"
msgstr "weergeven in zijbalk"
#: documents/models.py:375
#: documents/models.py:361
msgid "sort field"
msgstr "sorteerveld"
#: documents/models.py:378
#: documents/models.py:364
msgid "sort reverse"
msgstr "omgekeerd sorteren"
#: documents/models.py:384
#: documents/models.py:370
msgid "title contains"
msgstr "titel bevat"
#: documents/models.py:385
#: documents/models.py:371
msgid "content contains"
msgstr "inhoud bevat"
#: documents/models.py:386
#: documents/models.py:372
msgid "ASN is"
msgstr "ASN is"
#: documents/models.py:387
#: documents/models.py:373
msgid "correspondent is"
msgstr "correspondent is"
#: documents/models.py:388
#: documents/models.py:374
msgid "document type is"
msgstr "documenttype is"
#: documents/models.py:389
#: documents/models.py:375
msgid "is in inbox"
msgstr "zit in \"Postvak in\""
#: documents/models.py:390
#: documents/models.py:376
msgid "has tag"
msgstr "heeft etiket"
#: documents/models.py:391
#: documents/models.py:377
msgid "has any tag"
msgstr "heeft één van de etiketten"
#: documents/models.py:392
#: documents/models.py:378
msgid "created before"
msgstr "aangemaakt voor"
#: documents/models.py:393
#: documents/models.py:379
msgid "created after"
msgstr "aangemaakt na"
#: documents/models.py:394
#: documents/models.py:380
msgid "created year is"
msgstr "aangemaakt jaar is"
#: documents/models.py:395
#: documents/models.py:381
msgid "created month is"
msgstr "aangemaakte maand is"
#: documents/models.py:396
#: documents/models.py:382
msgid "created day is"
msgstr "aangemaakte dag is"
#: documents/models.py:397
#: documents/models.py:383
msgid "added before"
msgstr "toegevoegd voor"
#: documents/models.py:398
#: documents/models.py:384
msgid "added after"
msgstr "toegevoegd na"
#: documents/models.py:399
#: documents/models.py:385
msgid "modified before"
msgstr "gewijzigd voor"
#: documents/models.py:400
#: documents/models.py:386
msgid "modified after"
msgstr "gewijzigd na"
#: documents/models.py:401
#: documents/models.py:387
msgid "does not have tag"
msgstr "heeft geen etiket"
#: documents/models.py:412
#: documents/models.py:398
msgid "rule type"
msgstr "type regel"
#: documents/models.py:416
#: documents/models.py:402
msgid "value"
msgstr "waarde"
#: documents/models.py:422
#: documents/models.py:408
msgid "filter rule"
msgstr "filterregel"
#: documents/models.py:423
#: documents/models.py:409
msgid "filter rules"
msgstr "filterregels"
#: documents/serialisers.py:370
#: documents/serialisers.py:53
#, python-format
msgid "Invalid regular expresssion: %(error)s"
msgstr "Ongeldige reguliere expressie: %(error)s"
#: documents/serialisers.py:177
msgid "Invalid color."
msgstr "Ongeldig kleur."
#: documents/serialisers.py:451
#, python-format
msgid "File type %(type)s not supported"
msgstr "Bestandstype %(type)s niet ondersteund"
#: documents/templates/index.html:20
#: documents/templates/index.html:21
msgid "Paperless-ng is loading..."
msgstr "Paperless-ng is aan het laden..."
@ -400,27 +410,39 @@ msgstr "Wachtwoord"
msgid "Sign in"
msgstr "Aanmelden"
#: paperless/settings.py:291
#: paperless/settings.py:297
msgid "English (US)"
msgstr "Engels (US)"
#: paperless/settings.py:292
#: paperless/settings.py:298
msgid "English (GB)"
msgstr "Engels (Brits)"
#: paperless/settings.py:293
#: paperless/settings.py:299
msgid "German"
msgstr "Duits"
#: paperless/settings.py:294
#: paperless/settings.py:300
msgid "Dutch"
msgstr "Nederlands"
#: paperless/settings.py:295
#: paperless/settings.py:301
msgid "French"
msgstr "Frans"
#: paperless/urls.py:114
#: paperless/settings.py:302
msgid "Portuguese (Brazil)"
msgstr "Portugees (Brazilië)"
#: paperless/settings.py:303
msgid "Italian"
msgstr "Italiaans"
#: paperless/settings.py:304
msgid "Romanian"
msgstr "Roemeens"
#: paperless/urls.py:118
msgid "Paperless-ng administration"
msgstr "Paperless-ng administratie"

@ -12,7 +12,7 @@ msgid ""
msgstr ""
"Project-Id-Version: PACKAGE VERSION\n"
"Report-Msgid-Bugs-To: \n"
"POT-Creation-Date: 2021-02-24 16:49+0100\n"
"POT-Creation-Date: 2021-02-28 12:40+0100\n"
"PO-Revision-Date: 2021-02-16 18:37+0000\n"
"Last-Translator: Rodrigo A <rodrigo.avelino@meliuz.com.br>, 2021\n"
"Language-Team: Portuguese (Brazil) (https://www.transifex.com/paperless/teams/115905/pt_BR/)\n"
@ -50,7 +50,7 @@ msgstr "Palavra difusa (fuzzy)"
msgid "Automatic"
msgstr "Automático"
#: documents/models.py:41 documents/models.py:364 paperless_mail/models.py:25
#: documents/models.py:41 documents/models.py:350 paperless_mail/models.py:25
#: paperless_mail/models.py:109
msgid "name"
msgstr "nome"
@ -67,7 +67,7 @@ msgstr "algoritmo de detecção"
msgid "is insensitive"
msgstr "diferencia maiúsculas de minúsculas"
#: documents/models.py:74 documents/models.py:134
#: documents/models.py:74 documents/models.py:120
msgid "correspondent"
msgstr "correspondente"
@ -75,15 +75,15 @@ msgstr "correspondente"
msgid "correspondents"
msgstr "correspondentes"
#: documents/models.py:97
#: documents/models.py:81
msgid "color"
msgstr "cor"
#: documents/models.py:101
#: documents/models.py:87
msgid "is inbox tag"
msgstr "é etiqueta caixa de entrada"
#: documents/models.py:103
#: documents/models.py:89
msgid ""
"Marks this tag as an inbox tag: All newly consumed documents will be tagged "
"with inbox tags."
@ -91,39 +91,39 @@ msgstr ""
"Marca essa etiqueta como caixa de entrada: Todos os novos documentos "
"consumidos terão as etiquetas de caixa de entrada."
#: documents/models.py:108
#: documents/models.py:94
msgid "tag"
msgstr "etiqueta"
#: documents/models.py:109 documents/models.py:165
#: documents/models.py:95 documents/models.py:151
msgid "tags"
msgstr "etiquetas"
#: documents/models.py:115 documents/models.py:147
#: documents/models.py:101 documents/models.py:133
msgid "document type"
msgstr "tipo de documento"
#: documents/models.py:116
#: documents/models.py:102
msgid "document types"
msgstr "tipos de documento"
#: documents/models.py:124
#: documents/models.py:110
msgid "Unencrypted"
msgstr "Não encriptado"
#: documents/models.py:125
#: documents/models.py:111
msgid "Encrypted with GNU Privacy Guard"
msgstr "Encriptado com GNU Privacy Guard"
#: documents/models.py:138
#: documents/models.py:124
msgid "title"
msgstr "título"
#: documents/models.py:151
#: documents/models.py:137
msgid "content"
msgstr "conteúdo"
#: documents/models.py:153
#: documents/models.py:139
msgid ""
"The raw, text-only data of the document. This field is primarily used for "
"searching."
@ -131,241 +131,245 @@ msgstr ""
"O conteúdo de texto bruto do documento. Esse campo é usado principalmente "
"para busca."
#: documents/models.py:158
#: documents/models.py:144
msgid "mime type"
msgstr "tipo mime"
#: documents/models.py:169
#: documents/models.py:155
msgid "checksum"
msgstr "some de verificação"
#: documents/models.py:173
#: documents/models.py:159
msgid "The checksum of the original document."
msgstr "A soma de verificação original do documento."
#: documents/models.py:177
#: documents/models.py:163
msgid "archive checksum"
msgstr "Soma de verificação de arquivamento."
#: documents/models.py:182
#: documents/models.py:168
msgid "The checksum of the archived document."
msgstr "A soma de verificação do documento arquivado."
#: documents/models.py:186 documents/models.py:342
#: documents/models.py:172 documents/models.py:328
msgid "created"
msgstr "criado"
#: documents/models.py:190
#: documents/models.py:176
msgid "modified"
msgstr "modificado"
#: documents/models.py:194
#: documents/models.py:180
msgid "storage type"
msgstr "tipo de armazenamento"
#: documents/models.py:202
#: documents/models.py:188
msgid "added"
msgstr "adicionado"
#: documents/models.py:206
#: documents/models.py:192
msgid "filename"
msgstr "nome do arquivo"
#: documents/models.py:212
#: documents/models.py:198
msgid "Current filename in storage"
msgstr "Nome do arquivo atual armazenado"
#: documents/models.py:216
#: documents/models.py:202
msgid "archive filename"
msgstr "nome do arquivo para arquivamento"
#: documents/models.py:222
#: documents/models.py:208
msgid "Current archive filename in storage"
msgstr "Nome do arquivo para arquivamento armazenado"
#: documents/models.py:226
#: documents/models.py:212
msgid "archive serial number"
msgstr "número de sério de arquivamento"
#: documents/models.py:231
#: documents/models.py:217
msgid "The position of this document in your physical document archive."
msgstr "A posição deste documento no seu arquivamento físico."
#: documents/models.py:237
#: documents/models.py:223
msgid "document"
msgstr "documento"
#: documents/models.py:238
#: documents/models.py:224
msgid "documents"
msgstr "documentos"
#: documents/models.py:325
#: documents/models.py:311
msgid "debug"
msgstr "debug"
#: documents/models.py:326
#: documents/models.py:312
msgid "information"
msgstr "informação"
#: documents/models.py:327
#: documents/models.py:313
msgid "warning"
msgstr "aviso"
#: documents/models.py:328
#: documents/models.py:314
msgid "error"
msgstr "erro"
#: documents/models.py:329
#: documents/models.py:315
msgid "critical"
msgstr "crítico"
#: documents/models.py:333
#: documents/models.py:319
msgid "group"
msgstr "grupo"
#: documents/models.py:336
#: documents/models.py:322
msgid "message"
msgstr "mensagem"
#: documents/models.py:339
#: documents/models.py:325
msgid "level"
msgstr "nível"
#: documents/models.py:346
#: documents/models.py:332
msgid "log"
msgstr "log"
#: documents/models.py:347
#: documents/models.py:333
msgid "logs"
msgstr "logs"
#: documents/models.py:358 documents/models.py:408
#: documents/models.py:344 documents/models.py:394
msgid "saved view"
msgstr "visualização"
#: documents/models.py:359
#: documents/models.py:345
msgid "saved views"
msgstr "visualizações"
#: documents/models.py:362
#: documents/models.py:348
msgid "user"
msgstr "usuário"
#: documents/models.py:368
#: documents/models.py:354
msgid "show on dashboard"
msgstr "exibir no painel de controle"
#: documents/models.py:371
#: documents/models.py:357
msgid "show in sidebar"
msgstr "exibir no painel lateral"
#: documents/models.py:375
#: documents/models.py:361
msgid "sort field"
msgstr "ordenar campo"
#: documents/models.py:378
#: documents/models.py:364
msgid "sort reverse"
msgstr "odernar reverso"
#: documents/models.py:384
#: documents/models.py:370
msgid "title contains"
msgstr "título contém"
#: documents/models.py:385
#: documents/models.py:371
msgid "content contains"
msgstr "conteúdo contém"
#: documents/models.py:386
#: documents/models.py:372
msgid "ASN is"
msgstr "NSA é"
#: documents/models.py:387
#: documents/models.py:373
msgid "correspondent is"
msgstr "correspondente é"
#: documents/models.py:388
#: documents/models.py:374
msgid "document type is"
msgstr "tipo de documento é"
#: documents/models.py:389
#: documents/models.py:375
msgid "is in inbox"
msgstr "é caixa de entrada"
#: documents/models.py:390
#: documents/models.py:376
msgid "has tag"
msgstr "contém etiqueta"
#: documents/models.py:391
#: documents/models.py:377
msgid "has any tag"
msgstr "contém qualquer etiqueta"
#: documents/models.py:392
#: documents/models.py:378
msgid "created before"
msgstr "criado antes de"
#: documents/models.py:393
#: documents/models.py:379
msgid "created after"
msgstr "criado depois de"
#: documents/models.py:394
#: documents/models.py:380
msgid "created year is"
msgstr "ano de criação é"
#: documents/models.py:395
#: documents/models.py:381
msgid "created month is"
msgstr "mês de criação é"
#: documents/models.py:396
#: documents/models.py:382
msgid "created day is"
msgstr "dia de criação é"
#: documents/models.py:397
#: documents/models.py:383
msgid "added before"
msgstr "adicionado antes de"
#: documents/models.py:398
#: documents/models.py:384
msgid "added after"
msgstr "adicionado depois de"
#: documents/models.py:399
#: documents/models.py:385
msgid "modified before"
msgstr "modificado antes de"
#: documents/models.py:400
#: documents/models.py:386
msgid "modified after"
msgstr "modificado depois de"
#: documents/models.py:401
#: documents/models.py:387
msgid "does not have tag"
msgstr "não tem etiqueta"
#: documents/models.py:412
#: documents/models.py:398
msgid "rule type"
msgstr "tipo de regra"
#: documents/models.py:416
#: documents/models.py:402
msgid "value"
msgstr "valor"
#: documents/models.py:422
#: documents/models.py:408
msgid "filter rule"
msgstr "regra de filtragem"
#: documents/models.py:423
#: documents/models.py:409
msgid "filter rules"
msgstr "regras de filtragem"
#: documents/serialisers.py:52
#: documents/serialisers.py:53
#, python-format
msgid "Invalid regular expresssion: %(error)s"
msgstr "Expressão regular inválida: %(error)s"
#: documents/serialisers.py:378
#: documents/serialisers.py:177
msgid "Invalid color."
msgstr "Cor inválida."
#: documents/serialisers.py:451
#, python-format
msgid "File type %(type)s not supported"
msgstr "Tipo de arquivo %(type)s não suportado"
#: documents/templates/index.html:20
#: documents/templates/index.html:21
msgid "Paperless-ng is loading..."
msgstr "Paperless-ng está carregando..."
@ -405,30 +409,38 @@ msgstr "Senha"
msgid "Sign in"
msgstr "Entrar"
#: paperless/settings.py:291
#: paperless/settings.py:297
msgid "English (US)"
msgstr "Inglês (EUA)"
#: paperless/settings.py:292
#: paperless/settings.py:298
msgid "English (GB)"
msgstr "Inglês (GB)"
#: paperless/settings.py:293
#: paperless/settings.py:299
msgid "German"
msgstr "Alemão"
#: paperless/settings.py:294
#: paperless/settings.py:300
msgid "Dutch"
msgstr "Holandês"
#: paperless/settings.py:295
#: paperless/settings.py:301
msgid "French"
msgstr "Francês"
#: paperless/settings.py:296
#: paperless/settings.py:302
msgid "Portuguese (Brazil)"
msgstr "Português (Brasil)"
#: paperless/settings.py:303
msgid "Italian"
msgstr "Italiano"
#: paperless/settings.py:304
msgid "Romanian"
msgstr "Romeno"
#: paperless/urls.py:118
msgid "Paperless-ng administration"
msgstr "Administração do Paperless-ng"

@ -0,0 +1,687 @@
# SOME DESCRIPTIVE TITLE.
# Copyright (C) YEAR THE PACKAGE'S COPYRIGHT HOLDER
# This file is distributed under the same license as the PACKAGE package.
# FIRST AUTHOR <EMAIL@ADDRESS>, YEAR.
#
# Translators:
# Horea Petrila <petrilahorea@gmail.com>, 2021
# Cubic Lemon <lemonsarecubic@gmail.com>, 2021
#
#, fuzzy
msgid ""
msgstr ""
"Project-Id-Version: PACKAGE VERSION\n"
"Report-Msgid-Bugs-To: \n"
"POT-Creation-Date: 2021-02-28 12:40+0100\n"
"PO-Revision-Date: 2021-02-16 18:37+0000\n"
"Last-Translator: Cubic Lemon <lemonsarecubic@gmail.com>, 2021\n"
"Language-Team: Romanian (https://www.transifex.com/paperless/teams/115905/ro/)\n"
"MIME-Version: 1.0\n"
"Content-Type: text/plain; charset=UTF-8\n"
"Content-Transfer-Encoding: 8bit\n"
"Language: ro\n"
"Plural-Forms: nplurals=3; plural=(n==1?0:(((n%100>19)||((n%100==0)&&(n!=0)))?2:1));\n"
#: documents/apps.py:10
msgid "Documents"
msgstr "Documente"
#: documents/models.py:32
msgid "Any word"
msgstr "Orice cuvant"
#: documents/models.py:33
msgid "All words"
msgstr "Toate cuvintele"
#: documents/models.py:34
msgid "Exact match"
msgstr "Potrivire exacta"
#: documents/models.py:35
msgid "Regular expression"
msgstr "Expresie regulata"
#: documents/models.py:36
msgid "Fuzzy word"
msgstr "Cuvant neclar"
#: documents/models.py:37
msgid "Automatic"
msgstr "Automat"
#: documents/models.py:41 documents/models.py:350 paperless_mail/models.py:25
#: paperless_mail/models.py:109
msgid "name"
msgstr "nume"
#: documents/models.py:45
msgid "match"
msgstr "potrivire"
#: documents/models.py:49
msgid "matching algorithm"
msgstr "algoritm de potrivire"
#: documents/models.py:55
msgid "is insensitive"
msgstr "ignora majusculele"
#: documents/models.py:74 documents/models.py:120
msgid "correspondent"
msgstr "corespondent"
#: documents/models.py:75
msgid "correspondents"
msgstr "corespondenti"
#: documents/models.py:81
msgid "color"
msgstr "culoare"
#: documents/models.py:87
msgid "is inbox tag"
msgstr "este eticheta inbox"
#: documents/models.py:89
msgid ""
"Marks this tag as an inbox tag: All newly consumed documents will be tagged "
"with inbox tags."
msgstr ""
"Marcheaza aceasta eticheta ca eticheta inbox: Toate documentele nou "
"consumate primesc aceasta eticheta."
#: documents/models.py:94
msgid "tag"
msgstr "eticheta"
#: documents/models.py:95 documents/models.py:151
msgid "tags"
msgstr "etichete"
#: documents/models.py:101 documents/models.py:133
msgid "document type"
msgstr "tip de document"
#: documents/models.py:102
msgid "document types"
msgstr "tipuri de document"
#: documents/models.py:110
msgid "Unencrypted"
msgstr "Necriptat"
#: documents/models.py:111
msgid "Encrypted with GNU Privacy Guard"
msgstr "Criptat cu GNU Privacy Guard"
#: documents/models.py:124
msgid "title"
msgstr "titlu"
#: documents/models.py:137
msgid "content"
msgstr "continut"
#: documents/models.py:139
msgid ""
"The raw, text-only data of the document. This field is primarily used for "
"searching."
msgstr ""
"Textul brut al documentului. Acest camp este folosit in principal pentru "
"cautare."
#: documents/models.py:144
msgid "mime type"
msgstr "tip mime"
#: documents/models.py:155
msgid "checksum"
msgstr "suma de control"
#: documents/models.py:159
msgid "The checksum of the original document."
msgstr "Suma de control a documentului original."
#: documents/models.py:163
msgid "archive checksum"
msgstr "suma de control a arhivei"
#: documents/models.py:168
msgid "The checksum of the archived document."
msgstr "Suma de control a documentului arhivat."
#: documents/models.py:172 documents/models.py:328
msgid "created"
msgstr "creat"
#: documents/models.py:176
msgid "modified"
msgstr "modificat"
#: documents/models.py:180
msgid "storage type"
msgstr "tip de stocare"
#: documents/models.py:188
msgid "added"
msgstr "adaugat"
#: documents/models.py:192
msgid "filename"
msgstr "nume fisier"
#: documents/models.py:198
msgid "Current filename in storage"
msgstr "Numele curent al fisierului stocat"
#: documents/models.py:202
msgid "archive filename"
msgstr "nume fisier arhiva"
#: documents/models.py:208
msgid "Current archive filename in storage"
msgstr "Numele curent al arhivei stocate"
#: documents/models.py:212
msgid "archive serial number"
msgstr "numar serial in arhiva"
#: documents/models.py:217
msgid "The position of this document in your physical document archive."
msgstr "Pozitia acestui document in arhiva fizica."
#: documents/models.py:223
msgid "document"
msgstr "document"
#: documents/models.py:224
msgid "documents"
msgstr "documente"
#: documents/models.py:311
msgid "debug"
msgstr "depanare"
#: documents/models.py:312
msgid "information"
msgstr "informatii"
#: documents/models.py:313
msgid "warning"
msgstr "avertizare"
#: documents/models.py:314
msgid "error"
msgstr "eroare"
#: documents/models.py:315
msgid "critical"
msgstr "critic"
#: documents/models.py:319
msgid "group"
msgstr "grup"
#: documents/models.py:322
msgid "message"
msgstr "mesaj"
#: documents/models.py:325
msgid "level"
msgstr "nivel"
#: documents/models.py:332
msgid "log"
msgstr "jurnal"
#: documents/models.py:333
msgid "logs"
msgstr "jurnale"
#: documents/models.py:344 documents/models.py:394
msgid "saved view"
msgstr "vizualizare"
#: documents/models.py:345
msgid "saved views"
msgstr "vizualizari"
#: documents/models.py:348
msgid "user"
msgstr "utilizator"
#: documents/models.py:354
msgid "show on dashboard"
msgstr "afiseaza pe tabloul de bord"
#: documents/models.py:357
msgid "show in sidebar"
msgstr "afiseaza in bara laterala"
#: documents/models.py:361
msgid "sort field"
msgstr "sorteaza camp"
#: documents/models.py:364
msgid "sort reverse"
msgstr "sorteaza invers"
#: documents/models.py:370
msgid "title contains"
msgstr "titlul contine"
#: documents/models.py:371
msgid "content contains"
msgstr "continutul contine"
#: documents/models.py:372
msgid "ASN is"
msgstr "ASN-ul este"
#: documents/models.py:373
msgid "correspondent is"
msgstr "corespondentul este"
#: documents/models.py:374
msgid "document type is"
msgstr "tipul documentului este"
#: documents/models.py:375
msgid "is in inbox"
msgstr "este in inbox"
#: documents/models.py:376
msgid "has tag"
msgstr "are eticheta"
#: documents/models.py:377
msgid "has any tag"
msgstr "are orice eticheta"
#: documents/models.py:378
msgid "created before"
msgstr "creat inainte de"
#: documents/models.py:379
msgid "created after"
msgstr "creat dupa"
#: documents/models.py:380
msgid "created year is"
msgstr "anul crearii este"
#: documents/models.py:381
msgid "created month is"
msgstr "luna crearii este"
#: documents/models.py:382
msgid "created day is"
msgstr "ziua crearii este"
#: documents/models.py:383
msgid "added before"
msgstr "adaugat inainte de"
#: documents/models.py:384
msgid "added after"
msgstr "adaugat dupa"
#: documents/models.py:385
msgid "modified before"
msgstr "modificat inainte de"
#: documents/models.py:386
msgid "modified after"
msgstr "modificat dupa"
#: documents/models.py:387
msgid "does not have tag"
msgstr "nu are eticheta"
#: documents/models.py:398
msgid "rule type"
msgstr "tip de regula"
#: documents/models.py:402
msgid "value"
msgstr "valoare"
#: documents/models.py:408
msgid "filter rule"
msgstr "regula de filtrare"
#: documents/models.py:409
msgid "filter rules"
msgstr "reguli de filtrare"
#: documents/serialisers.py:53
#, python-format
msgid "Invalid regular expresssion: %(error)s"
msgstr "Expresie regulata invalida: %(error)s"
#: documents/serialisers.py:177
msgid "Invalid color."
msgstr "Culoare invalida."
#: documents/serialisers.py:451
#, python-format
msgid "File type %(type)s not supported"
msgstr "Tip de fisier %(type)s nesuportat "
#: documents/templates/index.html:21
msgid "Paperless-ng is loading..."
msgstr "Paperless-ng se incarca..."
#: documents/templates/registration/logged_out.html:13
msgid "Paperless-ng signed out"
msgstr "Paperless-ng s-a deconectat"
#: documents/templates/registration/logged_out.html:41
msgid "You have been successfully logged out. Bye!"
msgstr "Ati fost deconectat cu succes. La revedere !"
#: documents/templates/registration/logged_out.html:42
msgid "Sign in again"
msgstr "Conectati-va din nou"
#: documents/templates/registration/login.html:13
msgid "Paperless-ng sign in"
msgstr "Conectare Paperless-ng"
#: documents/templates/registration/login.html:42
msgid "Please sign in."
msgstr "Va rugam conectati-va."
#: documents/templates/registration/login.html:45
msgid "Your username and password didn't match. Please try again."
msgstr "Numele si parola nu sunt corecte. Va rugam incercati din nou."
#: documents/templates/registration/login.html:48
msgid "Username"
msgstr "Nume"
#: documents/templates/registration/login.html:49
msgid "Password"
msgstr "Parola"
#: documents/templates/registration/login.html:54
msgid "Sign in"
msgstr "Conectare"
#: paperless/settings.py:297
msgid "English (US)"
msgstr "Engleza (SUA)"
#: paperless/settings.py:298
msgid "English (GB)"
msgstr "Engleza (UK)"
#: paperless/settings.py:299
msgid "German"
msgstr "Germana"
#: paperless/settings.py:300
msgid "Dutch"
msgstr "Olandeza"
#: paperless/settings.py:301
msgid "French"
msgstr "Franceza"
#: paperless/settings.py:302
msgid "Portuguese (Brazil)"
msgstr "Portugheza (Brazilia)"
#: paperless/settings.py:303
msgid "Italian"
msgstr "Italiana"
#: paperless/settings.py:304
msgid "Romanian"
msgstr "Romana"
#: paperless/urls.py:118
msgid "Paperless-ng administration"
msgstr "Administrare Paperless-ng"
#: paperless_mail/admin.py:25
msgid "Filter"
msgstr "Filtru"
#: paperless_mail/admin.py:27
msgid ""
"Paperless will only process mails that match ALL of the filters given below."
msgstr ""
"Paperless va procesa numai email-urile care se potrivesc cu TOATE filtrele "
"de mai jos."
#: paperless_mail/admin.py:37
msgid "Actions"
msgstr "Acțiuni"
#: paperless_mail/admin.py:39
msgid ""
"The action applied to the mail. This action is only performed when documents"
" were consumed from the mail. Mails without attachments will remain entirely"
" untouched."
msgstr ""
"Actiunea aplicata tuturol email-urilor. Aceasta este realizata doar cand "
"sunt consumate documente din email. Cele fara atasamente nu vor fi "
"procesate."
#: paperless_mail/admin.py:46
msgid "Metadata"
msgstr "Metadate"
#: paperless_mail/admin.py:48
msgid ""
"Assign metadata to documents consumed from this rule automatically. If you "
"do not assign tags, types or correspondents here, paperless will still "
"process all matching rules that you have defined."
msgstr ""
"Atribuie metadate documentelor consumate prin aceasta regula in mod automat."
" Chiar daca nu sunt atribuite etichete, tipuri sau corespondenti, Paperless "
"va procesa toate regulile definite care se potrivesc."
#: paperless_mail/apps.py:9
msgid "Paperless mail"
msgstr "Email Paperless"
#: paperless_mail/models.py:11
msgid "mail account"
msgstr "cont de email"
#: paperless_mail/models.py:12
msgid "mail accounts"
msgstr "conturi de email"
#: paperless_mail/models.py:19
msgid "No encryption"
msgstr "Fara criptare"
#: paperless_mail/models.py:20
msgid "Use SSL"
msgstr "Foloseste SSL"
#: paperless_mail/models.py:21
msgid "Use STARTTLS"
msgstr "Foloseste STARTTLS"
#: paperless_mail/models.py:29
msgid "IMAP server"
msgstr "server IMAP"
#: paperless_mail/models.py:33
msgid "IMAP port"
msgstr "port IMAP"
#: paperless_mail/models.py:36
msgid ""
"This is usually 143 for unencrypted and STARTTLS connections, and 993 for "
"SSL connections."
msgstr ""
"De obicei este 143 pentru conexiuni necriptate si STARTTLS, sau 993 pentru "
"conexiuni SSL."
#: paperless_mail/models.py:40
msgid "IMAP security"
msgstr "securitate IMAP"
#: paperless_mail/models.py:46
msgid "username"
msgstr "nume"
#: paperless_mail/models.py:50
msgid "password"
msgstr "parola"
#: paperless_mail/models.py:60
msgid "mail rule"
msgstr "regula email"
#: paperless_mail/models.py:61
msgid "mail rules"
msgstr "reguli email"
#: paperless_mail/models.py:67
msgid "Only process attachments."
msgstr "Proceseaza doar atasamentele."
#: paperless_mail/models.py:68
msgid "Process all files, including 'inline' attachments."
msgstr "Proceseaza toate fisierele, inclusiv atasamentele \"inline\"."
#: paperless_mail/models.py:78
msgid "Mark as read, don't process read mails"
msgstr "Marcheaza ca citit, nu procesa email-uri citite"
#: paperless_mail/models.py:79
msgid "Flag the mail, don't process flagged mails"
msgstr "Semnalizeaza, nu procesa email-uri semnalizate"
#: paperless_mail/models.py:80
msgid "Move to specified folder"
msgstr "Muta in directorul specificat"
#: paperless_mail/models.py:81
msgid "Delete"
msgstr "Sterge"
#: paperless_mail/models.py:88
msgid "Use subject as title"
msgstr "Foloseste subiectul ca titlu"
#: paperless_mail/models.py:89
msgid "Use attachment filename as title"
msgstr "Foloseste numele atasamentului ca titlu"
#: paperless_mail/models.py:99
msgid "Do not assign a correspondent"
msgstr "Nu atribui un corespondent"
#: paperless_mail/models.py:101
msgid "Use mail address"
msgstr "Foloseste adresa de email"
#: paperless_mail/models.py:103
msgid "Use name (or mail address if not available)"
msgstr "Foloseste numele (daca nu exista, foloseste adresa de email)"
#: paperless_mail/models.py:105
msgid "Use correspondent selected below"
msgstr "Foloseste corespondentul selectat mai jos"
#: paperless_mail/models.py:113
msgid "order"
msgstr "ordoneaza"
#: paperless_mail/models.py:120
msgid "account"
msgstr "cont"
#: paperless_mail/models.py:124
msgid "folder"
msgstr "director"
#: paperless_mail/models.py:128
msgid "filter from"
msgstr "filtreaza de la"
#: paperless_mail/models.py:131
msgid "filter subject"
msgstr "filtreaza subiect"
#: paperless_mail/models.py:134
msgid "filter body"
msgstr "filtreaza corpul email-ului"
#: paperless_mail/models.py:138
msgid "filter attachment filename"
msgstr "filtreaza numele atasamentului"
#: paperless_mail/models.py:140
msgid ""
"Only consume documents which entirely match this filename if specified. "
"Wildcards such as *.pdf or *invoice* are allowed. Case insensitive."
msgstr ""
"Consuma doar documentele care se potrivesc in intregime cu acest nume de "
"fisier, daca este specificat. Simbolul * tine locul oricarui sir de "
"caractere. Majusculele nu conteaza."
#: paperless_mail/models.py:146
msgid "maximum age"
msgstr "varsta maxima"
#: paperless_mail/models.py:148
msgid "Specified in days."
msgstr "Specificata in zile."
#: paperless_mail/models.py:151
msgid "attachment type"
msgstr "tipul atasamentului"
#: paperless_mail/models.py:154
msgid ""
"Inline attachments include embedded images, so it's best to combine this "
"option with a filename filter."
msgstr ""
"Atasamentele \"inline\" includ si imaginile incorporate, deci aceasta "
"optiune functioneaza cel mai bine combinata cu un filtru pentru numele "
"fisierului."
#: paperless_mail/models.py:159
msgid "action"
msgstr "actiune"
#: paperless_mail/models.py:165
msgid "action parameter"
msgstr "parametru al actiunii"
#: paperless_mail/models.py:167
msgid ""
"Additional parameter for the action selected above, i.e., the target folder "
"of the move to folder action."
msgstr ""
"Parametru aditional pentru actiunea definita mai sus (ex. directorul in care"
" sa se realizeze o mutare)"
#: paperless_mail/models.py:173
msgid "assign title from"
msgstr "atribuie titlu din"
#: paperless_mail/models.py:183
msgid "assign this tag"
msgstr "atribuie aceasta eticheta"
#: paperless_mail/models.py:191
msgid "assign this document type"
msgstr "atribuie acest tip"
#: paperless_mail/models.py:195
msgid "assign correspondent from"
msgstr "atribuie corespondent din"
#: paperless_mail/models.py:205
msgid "assign this correspondent"
msgstr "atribuie acest corespondent"

@ -33,5 +33,4 @@ class HttpRemoteUserMiddleware(RemoteUserMiddleware):
""" This class allows authentication via HTTP_REMOTE_USER which is set for
example by certain SSO applications.
"""
header = 'HTTP_REMOTE_USER'
header = settings.HTTP_REMOTE_USER_HEADER_NAME

@ -0,0 +1,20 @@
from django.conf import settings
from paperless import version
class ApiVersionMiddleware:
def __init__(self, get_response):
self.get_response = get_response
def __call__(self, request):
response = self.get_response(request)
if request.user.is_authenticated:
versions = settings.REST_FRAMEWORK['ALLOWED_VERSIONS']
response['X-Api-Version'] = versions[len(versions)-1]
response['X-Version'] = ".".join(
[str(_) for _ in version.__version__]
)
return response

@ -112,7 +112,12 @@ REST_FRAMEWORK = {
'rest_framework.authentication.BasicAuthentication',
'rest_framework.authentication.SessionAuthentication',
'rest_framework.authentication.TokenAuthentication'
]
],
'DEFAULT_VERSIONING_CLASS': 'rest_framework.versioning.AcceptHeaderVersioning',
'DEFAULT_VERSION': '1',
# Make sure these are ordered and that the most recent version appears
# last
'ALLOWED_VERSIONS': ['1', '2']
}
if DEBUG:
@ -128,6 +133,7 @@ MIDDLEWARE = [
'django.middleware.locale.LocaleMiddleware',
'django.middleware.common.CommonMiddleware',
'django.middleware.csrf.CsrfViewMiddleware',
'paperless.middleware.ApiVersionMiddleware',
'django.contrib.auth.middleware.AuthenticationMiddleware',
'django.contrib.messages.middleware.MessageMiddleware',
'django.middleware.clickjacking.XFrameOptionsMiddleware',
@ -142,7 +148,7 @@ ASGI_APPLICATION = "paperless.asgi.application"
STATIC_URL = os.getenv("PAPERLESS_STATIC_URL", "/static/")
# what is this used for?
# TODO: what is this used for?
TEMPLATES = [
{
'BACKEND': 'django.template.backends.django.DjangoTemplates',
@ -183,6 +189,7 @@ if AUTO_LOGIN_USERNAME:
MIDDLEWARE.insert(_index+1, 'paperless.auth.AutoLoginMiddleware')
ENABLE_HTTP_REMOTE_USER = __get_boolean("PAPERLESS_ENABLE_HTTP_REMOTE_USER")
HTTP_REMOTE_USER_HEADER_NAME = os.getenv("PAPERLESS_HTTP_REMOTE_USER_HEADER_NAME", "HTTP_REMOTE_USER")
if ENABLE_HTTP_REMOTE_USER:
MIDDLEWARE.append(
@ -293,7 +300,9 @@ LANGUAGES = [
("de", _("German")),
("nl-nl", _("Dutch")),
("fr", _("French")),
("pt-br", _("Portuguese (Brazil)"))
("pt-br", _("Portuguese (Brazil)")),
("it", _("Italian")),
("ro", _("Romanian"))
]
LOCALE_PATHS = [

@ -1 +1 @@
__version__ = (1, 2, 1)
__version__ = (1, 3, 0)

@ -278,9 +278,7 @@ class TestParser(DirectoriesMixin, TestCase):
with open(os.path.join(parser.tempdir, "sidecar.txt")) as f:
sidecar = f.read()
self.assertIn("[OCR skipped on page 4]", sidecar)
self.assertIn("[OCR skipped on page 5]", sidecar)
self.assertIn("[OCR skipped on page 6]", sidecar)
self.assertIn("[OCR skipped on page(s) 4-6]", sidecar)
@override_settings(OCR_MODE="skip_noarchive")
def test_multi_page_mixed_no_archive(self):

@ -1,21 +0,0 @@
# Tox (http://tox.testrun.org/) is a tool for running tests
# in multiple virtualenvs. This configuration file will run the
# test suite on all supported python versions. To use it, "pip install tox"
# and then run "tox" from this directory.
[tox]
skipsdist = True
envlist = py34, py35, py36, py37, pycodestyle, doc
[testenv]
commands = pytest
deps = -r{toxinidir}/../requirements.txt
[testenv:pycodestyle]
commands=pycodestyle
deps=pycodestyle
[testenv:doc]
deps =
-r {toxinidir}/../requirements.txt
commands=sphinx-build -b html ../docs ../docs/_build -W