mirror of
https://github.com/paperless-ngx/paperless-ngx.git
synced 2025-08-01 18:37:42 -05:00
Compare commits
82 Commits
Author | SHA1 | Date | |
---|---|---|---|
![]() |
8da85d3609 | ||
![]() |
127d30918d | ||
![]() |
3b553f6455 | ||
![]() |
6d934da5dd | ||
![]() |
aa3d91a338 | ||
![]() |
d64818b46c | ||
![]() |
99a18516b2 | ||
![]() |
30b0a30146 | ||
![]() |
cb10617979 | ||
![]() |
265432f2a5 | ||
![]() |
a13e9f23b1 | ||
![]() |
65b37f61ca | ||
![]() |
7751755399 | ||
![]() |
14e2ad7bc4 | ||
![]() |
dfc23a2b38 | ||
![]() |
d2fc840293 | ||
![]() |
37fe6fb9c3 | ||
![]() |
a21ec76997 | ||
![]() |
501d8d9683 | ||
![]() |
8562ca9a77 | ||
![]() |
29641e5d66 | ||
![]() |
ee7308be2d | ||
![]() |
ef4009e94f | ||
![]() |
27d2ae6976 | ||
![]() |
0f9675f9d6 | ||
![]() |
bac4a63cc8 | ||
![]() |
0453787d38 | ||
![]() |
afc3e41f13 | ||
![]() |
86d6316cc9 | ||
![]() |
7b2c1f82f5 | ||
![]() |
e2a932d744 | ||
![]() |
b978994525 | ||
![]() |
6da237dd9e | ||
![]() |
50c1978d36 | ||
![]() |
fdb310c497 | ||
![]() |
ce121a261d | ||
![]() |
ebdfd4241a | ||
![]() |
9cbb1c5726 | ||
![]() |
85dabccbe7 | ||
![]() |
a9a8189d4b | ||
![]() |
30579112d2 | ||
![]() |
ccfd009c1a | ||
![]() |
044a939623 | ||
![]() |
203bc162cd | ||
![]() |
31f03ef1d3 | ||
![]() |
4d3552dc64 | ||
![]() |
ea8a52404f | ||
![]() |
0ae9aecdef | ||
![]() |
4de4789605 | ||
![]() |
950bb46827 | ||
![]() |
44936dc5f0 | ||
![]() |
1140a878b4 | ||
![]() |
efb49af7ac | ||
![]() |
b5a8106a6a | ||
![]() |
0f80eee54e | ||
![]() |
0e237fa459 | ||
![]() |
702b985ceb | ||
![]() |
7d87bcbb98 | ||
![]() |
340521aa0d | ||
![]() |
7bc557a999 | ||
![]() |
dfa7cdf47e | ||
![]() |
0d78e58d77 | ||
![]() |
58df3d5767 | ||
![]() |
4e4d6e806c | ||
![]() |
6ff99945f3 | ||
![]() |
b7f1b9f8ad | ||
![]() |
08a44cf468 | ||
![]() |
a1162d6d5a | ||
![]() |
1c81d88013 | ||
![]() |
1e4ec7e29e | ||
![]() |
2c4e34dd0c | ||
![]() |
cb308fae7b | ||
![]() |
3f03d51b24 | ||
![]() |
831db6ab87 | ||
![]() |
43fdf634f2 | ||
![]() |
f07a6b4586 | ||
![]() |
2fcf484229 | ||
![]() |
8bf4241b16 | ||
![]() |
56bd966c02 | ||
![]() |
416101d557 | ||
![]() |
c330cca2c9 | ||
![]() |
7e88085377 |
13
.github/workflows/ci.yml
vendored
13
.github/workflows/ci.yml
vendored
@@ -35,8 +35,6 @@ jobs:
|
|||||||
-
|
-
|
||||||
name: Install dependencies
|
name: Install dependencies
|
||||||
run: |
|
run: |
|
||||||
sudo apt-get update -qq
|
|
||||||
sudo apt-get install -qq --no-install-recommends libpoppler-cpp-dev
|
|
||||||
pip install --upgrade pipenv
|
pip install --upgrade pipenv
|
||||||
pipenv install --system --dev --ignore-pipfile
|
pipenv install --system --dev --ignore-pipfile
|
||||||
-
|
-
|
||||||
@@ -81,7 +79,7 @@ jobs:
|
|||||||
name: Prepare tests
|
name: Prepare tests
|
||||||
run: |
|
run: |
|
||||||
sudo apt-get update -qq
|
sudo apt-get update -qq
|
||||||
sudo apt-get install -qq --no-install-recommends libpoppler-cpp-dev unpaper tesseract-ocr imagemagick ghostscript optipng
|
sudo apt-get install -qq --no-install-recommends unpaper tesseract-ocr imagemagick ghostscript optipng
|
||||||
pip install --upgrade pipenv
|
pip install --upgrade pipenv
|
||||||
pipenv install --system --dev --ignore-pipfile
|
pipenv install --system --dev --ignore-pipfile
|
||||||
-
|
-
|
||||||
@@ -114,6 +112,13 @@ jobs:
|
|||||||
uses: actions/setup-node@v2
|
uses: actions/setup-node@v2
|
||||||
with:
|
with:
|
||||||
node-version: '15'
|
node-version: '15'
|
||||||
|
-
|
||||||
|
name: Configure version on dev branches
|
||||||
|
if: startsWith(github.ref, 'refs/heads/feature-') || github.ref == 'refs/heads/dev'
|
||||||
|
run: |
|
||||||
|
git_hash=$(git rev-parse --short "$GITHUB_SHA")
|
||||||
|
git_branch=${GITHUB_REF#refs/heads/}
|
||||||
|
sed -i -E "s/version: \"(.*)\"/version: \"${git_branch} ${git_hash}\"/g" src-ui/src/environments/environment.prod.ts
|
||||||
-
|
-
|
||||||
name: Build frontend
|
name: Build frontend
|
||||||
run: ./compile-frontend.sh
|
run: ./compile-frontend.sh
|
||||||
@@ -140,7 +145,7 @@ jobs:
|
|||||||
name: Install dependencies
|
name: Install dependencies
|
||||||
run: |
|
run: |
|
||||||
sudo apt-get update -qq
|
sudo apt-get update -qq
|
||||||
sudo apt-get install -qq --no-install-recommends libpoppler-cpp-dev gettext liblept5
|
sudo apt-get install -qq --no-install-recommends gettext liblept5
|
||||||
pip3 install -r requirements.txt
|
pip3 install -r requirements.txt
|
||||||
-
|
-
|
||||||
name: Download frontend artifact
|
name: Download frontend artifact
|
||||||
|
@@ -67,7 +67,6 @@ COPY requirements.txt ../
|
|||||||
RUN apt-get update \
|
RUN apt-get update \
|
||||||
&& apt-get -y --no-install-recommends install \
|
&& apt-get -y --no-install-recommends install \
|
||||||
build-essential \
|
build-essential \
|
||||||
libpoppler-cpp-dev \
|
|
||||||
libpq-dev \
|
libpq-dev \
|
||||||
libqpdf-dev \
|
libqpdf-dev \
|
||||||
&& python3 -m pip install --upgrade --no-cache-dir supervisor \
|
&& python3 -m pip install --upgrade --no-cache-dir supervisor \
|
||||||
|
2
Pipfile
2
Pipfile
@@ -23,7 +23,6 @@ imap-tools = "*"
|
|||||||
langdetect = "*"
|
langdetect = "*"
|
||||||
# numpy 1.20.0 drops python 3.6 support
|
# numpy 1.20.0 drops python 3.6 support
|
||||||
numpy = "~=1.19.5"
|
numpy = "~=1.19.5"
|
||||||
pdftotext = "*"
|
|
||||||
pathvalidate = "*"
|
pathvalidate = "*"
|
||||||
# pinned to 8.1.0, since aarch64 wheels might not be available beyond that https://github.com/python-pillow/Pillow/issues/5202
|
# pinned to 8.1.0, since aarch64 wheels might not be available beyond that https://github.com/python-pillow/Pillow/issues/5202
|
||||||
pillow = "==8.1.0"
|
pillow = "==8.1.0"
|
||||||
@@ -55,6 +54,7 @@ concurrent-log-handler = "*"
|
|||||||
uvloop = "~=0.14.0"
|
uvloop = "~=0.14.0"
|
||||||
# TODO: keep an eye on piwheel builds and update this once available (https://www.piwheels.org/project/cryptography/)
|
# TODO: keep an eye on piwheel builds and update this once available (https://www.piwheels.org/project/cryptography/)
|
||||||
cryptography = "~=3.3.2"
|
cryptography = "~=3.3.2"
|
||||||
|
"pdfminer.six" = "*"
|
||||||
|
|
||||||
[dev-packages]
|
[dev-packages]
|
||||||
coveralls = "*"
|
coveralls = "*"
|
||||||
|
66
Pipfile.lock
generated
66
Pipfile.lock
generated
@@ -1,7 +1,7 @@
|
|||||||
{
|
{
|
||||||
"_meta": {
|
"_meta": {
|
||||||
"hash": {
|
"hash": {
|
||||||
"sha256": "bd8b69979d91f4d8c52cac127c891d750c52959807220a98dcf74fed126bfa26"
|
"sha256": "71959eb287fc97969263be5e3a1b1f4f369b7a5ace85bd1947a25b9b92e17e8a"
|
||||||
},
|
},
|
||||||
"pipfile-spec": 6,
|
"pipfile-spec": 6,
|
||||||
"requires": {},
|
"requires": {},
|
||||||
@@ -227,11 +227,11 @@
|
|||||||
},
|
},
|
||||||
"django": {
|
"django": {
|
||||||
"hashes": [
|
"hashes": [
|
||||||
"sha256:169e2e7b4839a7910b393eec127fd7cbae62e80fa55f89c6510426abf673fe5f",
|
"sha256:32ce792ee9b6a0cbbec340123e229ac9f765dff8c2a4ae9247a14b2ba3a365a7",
|
||||||
"sha256:c6c0462b8b361f8691171af1fb87eceb4442da28477e12200c40420176206ba7"
|
"sha256:baf099db36ad31f970775d0be5587cc58a6256a6771a44eb795b554d45f211b8"
|
||||||
],
|
],
|
||||||
"index": "pypi",
|
"index": "pypi",
|
||||||
"version": "==3.1.6"
|
"version": "==3.1.7"
|
||||||
},
|
},
|
||||||
"django-cors-headers": {
|
"django-cors-headers": {
|
||||||
"hashes": [
|
"hashes": [
|
||||||
@@ -591,11 +591,11 @@
|
|||||||
},
|
},
|
||||||
"ocrmypdf": {
|
"ocrmypdf": {
|
||||||
"hashes": [
|
"hashes": [
|
||||||
"sha256:a54634d017a2f44aa2115b0b6ae5aa41a7cec018f5c53d16ad3abec1e70b3db7",
|
"sha256:0f624456a50be0b0bc8c0b59704d159f637616c093a1cabe8bb383706561bcf7",
|
||||||
"sha256:d0e2da48d4abd90f48f0937b2cd4ba57503b56c603f5e3aa91e20e3b21a036cd"
|
"sha256:b829ad640a6160423162012e094ee2f7cd074ec99efadd7f7486954ec9182985"
|
||||||
],
|
],
|
||||||
"index": "pypi",
|
"index": "pypi",
|
||||||
"version": "==11.6.0"
|
"version": "==11.6.2"
|
||||||
},
|
},
|
||||||
"pathvalidate": {
|
"pathvalidate": {
|
||||||
"hashes": [
|
"hashes": [
|
||||||
@@ -610,15 +610,8 @@
|
|||||||
"sha256:b9aac0ebeafb21c08bf65f2039f4b2c5f78a3449d0a41df711d72445649e952a",
|
"sha256:b9aac0ebeafb21c08bf65f2039f4b2c5f78a3449d0a41df711d72445649e952a",
|
||||||
"sha256:d78877ba8d8bf957f3bb636c4f73f4f6f30f56c461993877ac22c39c20837509"
|
"sha256:d78877ba8d8bf957f3bb636c4f73f4f6f30f56c461993877ac22c39c20837509"
|
||||||
],
|
],
|
||||||
"markers": "python_version >= '3.4'",
|
|
||||||
"version": "==20201018"
|
|
||||||
},
|
|
||||||
"pdftotext": {
|
|
||||||
"hashes": [
|
|
||||||
"sha256:98aeb8b07a4127e1a30223bd933ef080bbd29aa88f801717ca6c5618380b8aa6"
|
|
||||||
],
|
|
||||||
"index": "pypi",
|
"index": "pypi",
|
||||||
"version": "==2.1.5"
|
"version": "==20201018"
|
||||||
},
|
},
|
||||||
"pikepdf": {
|
"pikepdf": {
|
||||||
"hashes": [
|
"hashes": [
|
||||||
@@ -841,11 +834,11 @@
|
|||||||
},
|
},
|
||||||
"python-magic": {
|
"python-magic": {
|
||||||
"hashes": [
|
"hashes": [
|
||||||
"sha256:356efa93c8899047d1eb7d3eb91e871ba2f5b1376edbaf4cc305e3c872207355",
|
"sha256:8551e804c09a3398790bd9e392acb26554ae2609f29c72abb0b9dee9a5571eae",
|
||||||
"sha256:b757db2a5289ea3f1ced9e60f072965243ea43a2221430048fd8cacab17be0ce"
|
"sha256:ca884349f2c92ce830e3f498c5b7c7051fe2942c3ee4332f65213b8ebff15a62"
|
||||||
],
|
],
|
||||||
"index": "pypi",
|
"index": "pypi",
|
||||||
"version": "==0.4.18"
|
"version": "==0.4.22"
|
||||||
},
|
},
|
||||||
"pytz": {
|
"pytz": {
|
||||||
"hashes": [
|
"hashes": [
|
||||||
@@ -1104,11 +1097,11 @@
|
|||||||
},
|
},
|
||||||
"tqdm": {
|
"tqdm": {
|
||||||
"hashes": [
|
"hashes": [
|
||||||
"sha256:11d544652edbdfc9cc41aa4c8a5c166513e279f3f2d9f1a9e1c89935b51de6ff",
|
"sha256:65185676e9fdf20d154cffd1c5de8e39ef9696ff7e59fe0156b1b08e468736af",
|
||||||
"sha256:a89be573bfddb81bb0b395a416d5e55e3ecc73ce95a368a4f6360bedea33195e"
|
"sha256:70657337ec104eb4f3fb229285358f23f045433f6aea26846cdd55f0fd68945c"
|
||||||
],
|
],
|
||||||
"index": "pypi",
|
"index": "pypi",
|
||||||
"version": "==4.56.2"
|
"version": "==4.57.0"
|
||||||
},
|
},
|
||||||
"twisted": {
|
"twisted": {
|
||||||
"extras": [
|
"extras": [
|
||||||
@@ -1146,11 +1139,11 @@
|
|||||||
},
|
},
|
||||||
"txaio": {
|
"txaio": {
|
||||||
"hashes": [
|
"hashes": [
|
||||||
"sha256:1488d31d564a116538cc1265ac3f7979fb6223bb5a9e9f1479436ee2c17d8549",
|
"sha256:7d6f89745680233f1c4db9ddb748df5e88d2a7a37962be174c0fd04c8dba1dc8",
|
||||||
"sha256:a8676d6c68aea1f0e2548c4afdb8e6253873af3bc2659bb5bcd9f39dff7ff90f"
|
"sha256:c16b55f9a67b2419cfdf8846576e2ec9ba94fe6978a83080c352a80db31c93fb"
|
||||||
],
|
],
|
||||||
"markers": "python_version >= '3.6'",
|
"markers": "python_version >= '3.6'",
|
||||||
"version": "==20.12.1"
|
"version": "==21.2.1"
|
||||||
},
|
},
|
||||||
"tzlocal": {
|
"tzlocal": {
|
||||||
"hashes": [
|
"hashes": [
|
||||||
@@ -1172,11 +1165,11 @@
|
|||||||
"standard"
|
"standard"
|
||||||
],
|
],
|
||||||
"hashes": [
|
"hashes": [
|
||||||
"sha256:1079c50a06f6338095b4f203e7861dbff318dde5f22f3a324fc6e94c7654164c",
|
"sha256:3292251b3c7978e8e4a7868f4baf7f7f7bb7e40c759ecc125c37e99cdea34202",
|
||||||
"sha256:ef1e0bb5f7941c6fe324e06443ddac0331e1632a776175f87891c7bd02694355"
|
"sha256:7587f7b08bd1efd2b9bad809a3d333e972f1d11af8a5e52a9371ee3a5de71524"
|
||||||
],
|
],
|
||||||
"index": "pypi",
|
"index": "pypi",
|
||||||
"version": "==0.13.3"
|
"version": "==0.13.4"
|
||||||
},
|
},
|
||||||
"uvloop": {
|
"uvloop": {
|
||||||
"hashes": [
|
"hashes": [
|
||||||
@@ -1220,11 +1213,10 @@
|
|||||||
},
|
},
|
||||||
"watchgod": {
|
"watchgod": {
|
||||||
"hashes": [
|
"hashes": [
|
||||||
"sha256:59700dab7445aa8e6067a5b94f37bae90fc367554549b1ed2e9d0f4f38a90d2a",
|
"sha256:48140d62b0ebe9dd9cf8381337f06351e1f2e70b2203fa9c6eff4e572ca84f29",
|
||||||
"sha256:5fb60afa9558b79736395db1cb60ad3ed59df5c2f507a3ff729220cf1251ffdc",
|
"sha256:d6c1ea21df37847ac0537ca0d6c2f4cdf513562e95f77bb93abbcf05573407b7"
|
||||||
"sha256:e9cca0ab9c63f17fc85df9fd8bd18156ff00aff04ebe5976cee473f4968c6858"
|
|
||||||
],
|
],
|
||||||
"version": "==0.6"
|
"version": "==0.7"
|
||||||
},
|
},
|
||||||
"wcwidth": {
|
"wcwidth": {
|
||||||
"hashes": [
|
"hashes": [
|
||||||
@@ -1498,11 +1490,11 @@
|
|||||||
},
|
},
|
||||||
"faker": {
|
"faker": {
|
||||||
"hashes": [
|
"hashes": [
|
||||||
"sha256:bf2a9b3f8d00a5dada61fc4a3f80fe0d6795c7f02a138a7d2ef2db5817c7d017",
|
"sha256:31a58ec5a8f4672f24da3b5ddea02c82a712de1de3179b432948e5c34d787aca",
|
||||||
"sha256:d4aecdb877519d06c2fdc01ffc5ecf70658981acf5e13cd07ded9892994ef5c6"
|
"sha256:aadfe0efe11ecbbbc5b3b0b0fab050c2acbd2d8e5201769546d43d236bfff663"
|
||||||
],
|
],
|
||||||
"markers": "python_version >= '3.6'",
|
"markers": "python_version >= '3.6'",
|
||||||
"version": "==6.1.1"
|
"version": "==6.4.1"
|
||||||
},
|
},
|
||||||
"filelock": {
|
"filelock": {
|
||||||
"hashes": [
|
"hashes": [
|
||||||
@@ -1837,11 +1829,11 @@
|
|||||||
},
|
},
|
||||||
"tox": {
|
"tox": {
|
||||||
"hashes": [
|
"hashes": [
|
||||||
"sha256:65d0e90ceb816638a50d64f4b47b11da767b284c0addda2294cb3cd69bd72425",
|
"sha256:89afa9c59c04beb55eda789c7a65feb1a70fde117f85f1bd1c27c66758456e60",
|
||||||
"sha256:cf7fef81a3a2434df4d7af2a6d1bf606d2970220addfbe7dea2615bd4bb2c252"
|
"sha256:ed1e650cf6368bcbc4a071eeeba363c480920e0ed8a9ad1793c7caaa5ad33d49"
|
||||||
],
|
],
|
||||||
"index": "pypi",
|
"index": "pypi",
|
||||||
"version": "==3.21.4"
|
"version": "==3.22.0"
|
||||||
},
|
},
|
||||||
"urllib3": {
|
"urllib3": {
|
||||||
"hashes": [
|
"hashes": [
|
||||||
|
26
README.md
26
README.md
@@ -7,9 +7,16 @@
|
|||||||
|
|
||||||
# Paperless-ng
|
# Paperless-ng
|
||||||
|
|
||||||
[Paperless](https://github.com/the-paperless-project/paperless) is an application by Daniel Quinn and contributors that indexes your scanned documents and allows you to easily search for documents and store metadata alongside your documents.
|
[Paperless (click me)](https://github.com/the-paperless-project/paperless) is an application by Daniel Quinn and contributors that indexes your scanned documents and allows you to easily search for documents and store metadata alongside your documents.
|
||||||
|
|
||||||
Paperless-ng is a fork of the original project, adding a new interface and many other changes under the hood. For a detailed list of changes, have a look at the [change log](https://paperless-ng.readthedocs.io/en/latest/changelog.html) in the documentation.
|
Paperless-ng is a fork of the original project, adding a new interface and many other changes under the hood. These key points should help you decide whether Paperless-ng is something you would prefer over Paperless:
|
||||||
|
|
||||||
|
* Interface: The new front end is the main interface for paperless-ng, the old interface still exists but most customizations (such as thumbnails for the document list) have been removed.
|
||||||
|
* Encryption: Paperless-ng does not support GnuPG anymore, since storing your data on encrypted file systems (that you optionally mount on demand) achieves about the same result.
|
||||||
|
* Resource usage: Paperless-ng does use a bit more resources than Paperless. Running the web server requires about 300MB of RAM or more, depending on the configuration. While adding documents, it requires about 300MB additional RAM, depending on the document. It still runs on Pi (many users do that), but it has been generally geared to better use the resources of more powerful systems.
|
||||||
|
* API changes: If you rely on the REST API of paperless, some of its functionality has been changed.
|
||||||
|
|
||||||
|
For a detailed list of changes, have a look at the [change log](https://paperless-ng.readthedocs.io/en/latest/changelog.html) in the documentation.
|
||||||
|
|
||||||
# How it Works
|
# How it Works
|
||||||
|
|
||||||
@@ -32,8 +39,8 @@ Here's what you get:
|
|||||||
* Performs OCR on your documents, adds selectable text to image only documents and adds tags, correspondents and document types to your documents.
|
* Performs OCR on your documents, adds selectable text to image only documents and adds tags, correspondents and document types to your documents.
|
||||||
* Supports PDF documents, images, plain text files, and Office documents (Word, Excel, Powerpoint, and LibreOffice equivalents).
|
* Supports PDF documents, images, plain text files, and Office documents (Word, Excel, Powerpoint, and LibreOffice equivalents).
|
||||||
* Office document support is optional and provided by Apache Tika (see [configuration](https://paperless-ng.readthedocs.io/en/latest/configuration.html#tika-settings))
|
* Office document support is optional and provided by Apache Tika (see [configuration](https://paperless-ng.readthedocs.io/en/latest/configuration.html#tika-settings))
|
||||||
* Paperless stores your documents plain on disk. Filenames and folders are managed by paperless and can be configured freely.
|
* Paperless stores your documents plain on disk. Filenames and folders are managed by paperless and their format can be configured freely.
|
||||||
* Single page application front end. Should be pretty snappy. Will be mobile friendly in the future.
|
* Single page application front end.
|
||||||
* Includes a dashboard that shows basic statistics and has document upload.
|
* Includes a dashboard that shows basic statistics and has document upload.
|
||||||
* Filtering by tags, correspondents, types, and more.
|
* Filtering by tags, correspondents, types, and more.
|
||||||
* Customizable views can be saved and displayed on the dashboard.
|
* Customizable views can be saved and displayed on the dashboard.
|
||||||
@@ -44,14 +51,13 @@ Here's what you get:
|
|||||||
* Searching for similar documents ("More like this")
|
* Searching for similar documents ("More like this")
|
||||||
* Email processing: Paperless adds documents from your email accounts.
|
* Email processing: Paperless adds documents from your email accounts.
|
||||||
* Configure multiple accounts and filters for each account.
|
* Configure multiple accounts and filters for each account.
|
||||||
* When adding documents from mails, paperless can move these mails to a new folder, mark them as read, flag them or delete them.
|
* When adding documents from mails, paperless can move these mails to a new folder, mark them as read, flag them as important or delete them.
|
||||||
* Machine learning powered document matching.
|
* Machine learning powered document matching.
|
||||||
* Paperless learns from your documents and will be able to automatically assign tags, correspondents and types to documents once you've stored a few documents in paperless.
|
* Paperless learns from your documents and will be able to automatically assign tags, correspondents and types to documents once you've stored a few documents in paperless.
|
||||||
* A task processor that processes documents in parallel and also tells you when something goes wrong. On modern multi core systems, consumption is blazing fast.
|
* Optimized for multi core systems: Paperless-ng consumes multiple documents in parallel.
|
||||||
|
* The integrated sanity checker makes sure that your document archive is in good health.
|
||||||
|
|
||||||
If you want to see some screenshots of paperless-ng in action, [some are available in the documentation](https://paperless-ng.readthedocs.io/en/latest/screenshots.html). However, some parts of the UI have changed since I took these.
|
If you want to see some screenshots of paperless-ng in action, [some are available in the documentation](https://paperless-ng.readthedocs.io/en/latest/screenshots.html).
|
||||||
|
|
||||||
For a complete list of changes from paperless, check out the [changelog](https://paperless-ng.readthedocs.io/en/latest/changelog.html)
|
|
||||||
|
|
||||||
# Getting started
|
# Getting started
|
||||||
|
|
||||||
@@ -103,4 +109,4 @@ These projects also exist, but their status and compatibility with paperless-ng
|
|||||||
|
|
||||||
# Important Note
|
# 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 by default (it needs to be searchable, so if someone has ideas on how to do that on encrypted data, I'm all ears). 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.
|
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.
|
||||||
|
@@ -15,7 +15,6 @@
|
|||||||
- imagemagick
|
- imagemagick
|
||||||
- optipng
|
- optipng
|
||||||
- gnupg
|
- gnupg
|
||||||
- libpoppler-cpp-dev
|
|
||||||
- libpq-dev
|
- libpq-dev
|
||||||
- libmagic-dev
|
- libmagic-dev
|
||||||
- mime-support
|
- mime-support
|
||||||
|
@@ -1,5 +1,5 @@
|
|||||||
files:
|
files:
|
||||||
- source: /src/locale/en-us/LC_MESSAGES/django.po
|
- source: /src/locale/en_US/LC_MESSAGES/django.po
|
||||||
translation: /src/locale/%two_letters_code%/LC_MESSAGES/django.po
|
translation: /src/locale/%locale_with_underscore%/LC_MESSAGES/django.po
|
||||||
- source: /src-ui/messages.xlf
|
- source: /src-ui/messages.xlf
|
||||||
translation: /src-ui/src/locale/messages.%two_letters_code%.xlf
|
translation: /src-ui/src/locale/messages.%locale_with_underscore%.xlf
|
||||||
|
@@ -5,6 +5,58 @@
|
|||||||
Changelog
|
Changelog
|
||||||
*********
|
*********
|
||||||
|
|
||||||
|
paperless-ng 1.2.0
|
||||||
|
##################
|
||||||
|
|
||||||
|
* Changes to the OCRmyPDF integration
|
||||||
|
|
||||||
|
* Added support for deskewing and automatic rotation of incorrectly rotated pages. This is enabled by default, see :ref:`configuration-ocr`.
|
||||||
|
* Better support for encrypted files.
|
||||||
|
* Better support for various other PDF files: Paperless will now attempt to force OCR with safe options when OCR fails with the configured options.
|
||||||
|
* Added an explicit option to skip cleaning with ``unpaper``.
|
||||||
|
|
||||||
|
* Download multiple selected documents as a zip archive.
|
||||||
|
|
||||||
|
* The document list now remembers the current page.
|
||||||
|
|
||||||
|
* Improved responsiveness when switching between saved views and the document list.
|
||||||
|
|
||||||
|
* Increased the default wait time when observing files in the consumption folder
|
||||||
|
with polling from 1 to 5 seconds. This will decrease the likelihood of paperless
|
||||||
|
consuming partially written files.
|
||||||
|
|
||||||
|
* Fixed a crash of the document archiver management command when trying to process documents with unknown mime types.
|
||||||
|
|
||||||
|
* Paperless no longer depends on ``libpoppler-cpp-dev``.
|
||||||
|
|
||||||
|
.. note::
|
||||||
|
|
||||||
|
Some packages that paperless depends on are slowly dropping Python 3.6
|
||||||
|
support one after another, including the web server. Supporting Python
|
||||||
|
3.6 means that I cannot update these packages anymore.
|
||||||
|
|
||||||
|
At some point, paperless will drop Python 3.6 support. If using a bare
|
||||||
|
metal installation and you're still on Python 3.6, upgrade to 3.7 or newer.
|
||||||
|
|
||||||
|
If using docker, this does not affect you.
|
||||||
|
|
||||||
|
paperless-ng 1.1.4
|
||||||
|
##################
|
||||||
|
|
||||||
|
* Added English (GB) locale.
|
||||||
|
|
||||||
|
* Added ISO-8601 date display option.
|
||||||
|
|
||||||
|
paperless-ng 1.1.3
|
||||||
|
##################
|
||||||
|
|
||||||
|
* Added a docker-specific configuration option to adjust the number of
|
||||||
|
worker processes of the web server. See :ref:`configuration-docker`.
|
||||||
|
|
||||||
|
* Some more memory usage optimizations.
|
||||||
|
|
||||||
|
* Don't show inbox statistics if no inbox tag is defined.
|
||||||
|
|
||||||
paperless-ng 1.1.2
|
paperless-ng 1.1.2
|
||||||
##################
|
##################
|
||||||
|
|
||||||
|
@@ -202,7 +202,6 @@ Paperless uses `OCRmyPDF <https://ocrmypdf.readthedocs.io/en/latest/>`_ for
|
|||||||
performing OCR on documents and images. Paperless uses sensible defaults for
|
performing OCR on documents and images. Paperless uses sensible defaults for
|
||||||
most settings, but all of them can be configured to your needs.
|
most settings, but all of them can be configured to your needs.
|
||||||
|
|
||||||
|
|
||||||
PAPERLESS_OCR_LANGUAGE=<lang>
|
PAPERLESS_OCR_LANGUAGE=<lang>
|
||||||
Customize the language that paperless will attempt to use when
|
Customize the language that paperless will attempt to use when
|
||||||
parsing documents.
|
parsing documents.
|
||||||
@@ -245,6 +244,54 @@ PAPERLESS_OCR_MODE=<mode>
|
|||||||
The default is ``skip``, which only performs OCR when necessary and always
|
The default is ``skip``, which only performs OCR when necessary and always
|
||||||
creates archived documents.
|
creates archived documents.
|
||||||
|
|
||||||
|
Read more about this in the `OCRmyPDF documentation <https://ocrmypdf.readthedocs.io/en/latest/advanced.html#when-ocr-is-skipped>`_.
|
||||||
|
|
||||||
|
PAPERLESS_OCR_CLEAN=<mode>
|
||||||
|
Tells paperless to use ``unpaper`` to clean any input document before
|
||||||
|
sending it to tesseract. This uses more resources, but generally results
|
||||||
|
in better OCR results. The following modes are available:
|
||||||
|
|
||||||
|
* ``clean``: Apply unpaper.
|
||||||
|
* ``clean-final``: Apply unpaper, and use the cleaned images to build the
|
||||||
|
output file instead of the original images.
|
||||||
|
* ``none``: Do not apply unpaper.
|
||||||
|
|
||||||
|
Defaults to ``clean``.
|
||||||
|
|
||||||
|
.. note::
|
||||||
|
|
||||||
|
``clean-final`` is incompatible with ocr mode ``redo``. When both
|
||||||
|
``clean-final`` and the ocr mode ``redo`` is configured, ``clean``
|
||||||
|
is used instead.
|
||||||
|
|
||||||
|
PAPERLESS_OCR_DESKEW=<bool>
|
||||||
|
Tells paperless to correct skewing (slight rotation of input images mainly
|
||||||
|
due to improper scanning)
|
||||||
|
|
||||||
|
Defaults to ``true``, which enables this feature.
|
||||||
|
|
||||||
|
.. note::
|
||||||
|
|
||||||
|
Deskewing is incompatible with ocr mode ``redo``. Deskewing will get
|
||||||
|
disabled automatically if ``redo`` is used as the ocr mode.
|
||||||
|
|
||||||
|
PAPERLESS_OCR_ROTATE_PAGES=<bool>
|
||||||
|
Tells paperless to correct page rotation (90°, 180° and 270° rotation).
|
||||||
|
|
||||||
|
If you notice that paperless is not rotating pages incorrectly rotated
|
||||||
|
pages (or vice versa), try adjusting the threshold up or down (see below).
|
||||||
|
|
||||||
|
Defaults to ``true``, which enables this feature.
|
||||||
|
|
||||||
|
|
||||||
|
PAPERLESS_OCR_ROTATE_PAGES_THRESHOLD=<num>
|
||||||
|
Adjust the threshold for automatic page rotation by ``PAPERLESS_OCR_ROTATE_PAGES``.
|
||||||
|
This is an arbitrary value reported by tesseract. "15" is a very conservative value,
|
||||||
|
whereas "2" is a very aggressive option and will often result correctly rotated pages
|
||||||
|
being rotated as well.
|
||||||
|
|
||||||
|
Defaults to "12".
|
||||||
|
|
||||||
PAPERLESS_OCR_OUTPUT_TYPE=<type>
|
PAPERLESS_OCR_OUTPUT_TYPE=<type>
|
||||||
Specify the the type of PDF documents that paperless should produce.
|
Specify the the type of PDF documents that paperless should produce.
|
||||||
|
|
||||||
@@ -271,7 +318,6 @@ PAPERLESS_OCR_PAGES=<num>
|
|||||||
|
|
||||||
Defaults to 0, which disables this feature and always uses all pages.
|
Defaults to 0, which disables this feature and always uses all pages.
|
||||||
|
|
||||||
|
|
||||||
PAPERLESS_OCR_IMAGE_DPI=<num>
|
PAPERLESS_OCR_IMAGE_DPI=<num>
|
||||||
Paperless will OCR any images you put into the system and convert them
|
Paperless will OCR any images you put into the system and convert them
|
||||||
into PDF documents. This is useful if your scanner produces images.
|
into PDF documents. This is useful if your scanner produces images.
|
||||||
@@ -282,8 +328,8 @@ PAPERLESS_OCR_IMAGE_DPI=<num>
|
|||||||
|
|
||||||
Set this to the DPI your scanner produces images at.
|
Set this to the DPI your scanner produces images at.
|
||||||
|
|
||||||
Default is none, which causes paperless to fail if no DPI information is
|
Default is none, which will automatically calculate image DPI so that
|
||||||
present in an image.
|
the produced PDF documents are A4 sized.
|
||||||
|
|
||||||
|
|
||||||
PAPERLESS_OCR_USER_ARGS=<json>
|
PAPERLESS_OCR_USER_ARGS=<json>
|
||||||
@@ -352,7 +398,7 @@ requires are as follows:
|
|||||||
PAPERLESS_TIKA_ENABLED: 1
|
PAPERLESS_TIKA_ENABLED: 1
|
||||||
PAPERLESS_TIKA_GOTENBERG_ENDPOINT: http://gotenberg:3000
|
PAPERLESS_TIKA_GOTENBERG_ENDPOINT: http://gotenberg:3000
|
||||||
PAPERLESS_TIKA_ENDPOINT: http://tika:9998
|
PAPERLESS_TIKA_ENDPOINT: http://tika:9998
|
||||||
|
|
||||||
# ...
|
# ...
|
||||||
|
|
||||||
gotenberg:
|
gotenberg:
|
||||||
@@ -555,3 +601,65 @@ PAPERLESS_GS_BINARY=<path>
|
|||||||
|
|
||||||
PAPERLESS_OPTIPNG_BINARY=<path>
|
PAPERLESS_OPTIPNG_BINARY=<path>
|
||||||
Defaults to "/usr/bin/optipng".
|
Defaults to "/usr/bin/optipng".
|
||||||
|
|
||||||
|
|
||||||
|
.. _configuration-docker:
|
||||||
|
|
||||||
|
Docker-specific options
|
||||||
|
#######################
|
||||||
|
|
||||||
|
These options don't have any effect in ``paperless.conf``. These options adjust
|
||||||
|
the behavior of the docker container. Configure these in `docker-compose.env`.
|
||||||
|
|
||||||
|
PAPERLESS_WEBSERVER_WORKERS=<num>
|
||||||
|
The number of worker processes the webserver should spawn. More worker processes
|
||||||
|
usually result in the front end to load data much quicker. However, each worker process
|
||||||
|
also loads the entire application into memory separately, so increasing this value
|
||||||
|
will increase RAM usage.
|
||||||
|
|
||||||
|
Consider configuring this to 1 on low power devices with limited amount of RAM.
|
||||||
|
|
||||||
|
Defaults to 2.
|
||||||
|
|
||||||
|
USERMAP_UID=<uid>
|
||||||
|
The ID of the paperless user in the container. Set this to your actual user ID on the
|
||||||
|
host system, which you can get by executing
|
||||||
|
|
||||||
|
.. code:: shell-session
|
||||||
|
|
||||||
|
$ id -u
|
||||||
|
|
||||||
|
Paperless will change ownership on its folders to this user, so you need to get this right
|
||||||
|
in order to be able to write to the consumption directory.
|
||||||
|
|
||||||
|
Defaults to 1000.
|
||||||
|
|
||||||
|
USERMAP_GID=<gid>
|
||||||
|
The ID of the paperless Group in the container. Set this to your actual group ID on the
|
||||||
|
host system, which you can get by executing
|
||||||
|
|
||||||
|
.. code:: shell-session
|
||||||
|
|
||||||
|
$ id -g
|
||||||
|
|
||||||
|
Paperless will change ownership on its folders to this group, so you need to get this right
|
||||||
|
in order to be able to write to the consumption directory.
|
||||||
|
|
||||||
|
Defaults to 1000.
|
||||||
|
|
||||||
|
PAPERLESS_OCR_LANGUAGES=<list>
|
||||||
|
Additional OCR languages to install. By default, paperless comes with
|
||||||
|
English, German, Italian, Spanish and French. If your language is not in this list, install
|
||||||
|
additional languages with this configuration option:
|
||||||
|
|
||||||
|
.. code:: bash
|
||||||
|
|
||||||
|
PAPERLESS_OCR_LANGUAGES=tur ces
|
||||||
|
|
||||||
|
To actually use these languages, also set the default OCR language of paperless:
|
||||||
|
|
||||||
|
.. code:: bash
|
||||||
|
|
||||||
|
PAPERLESS_OCR_LANGUAGE=tur
|
||||||
|
|
||||||
|
Defaults to none, which does not install any additional languages.
|
||||||
|
@@ -109,6 +109,30 @@ 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.
|
it as static content. This way, you can verify that authentication is working.
|
||||||
|
|
||||||
|
|
||||||
|
Building the documentation
|
||||||
|
==========================
|
||||||
|
|
||||||
|
The documentation is built using sphinx. I've configured ReadTheDocs to automatically build
|
||||||
|
the documentation when changes are pushed. If you want to build the documentation locally,
|
||||||
|
this is how you do it:
|
||||||
|
|
||||||
|
1. Install python dependencies.
|
||||||
|
|
||||||
|
.. code:: shell-session
|
||||||
|
|
||||||
|
$ cd /path/to/paperless
|
||||||
|
$ pipenv install --dev
|
||||||
|
|
||||||
|
2. Build the documentation
|
||||||
|
|
||||||
|
.. code:: shell-session
|
||||||
|
|
||||||
|
$ cd /path/to/paperless/docs
|
||||||
|
$ pipenv run make clean html
|
||||||
|
|
||||||
|
This will build the HTML documentation, and put the resulting files in the ``_build/html``
|
||||||
|
directory.
|
||||||
|
|
||||||
Extending Paperless
|
Extending Paperless
|
||||||
===================
|
===================
|
||||||
|
|
||||||
|
@@ -280,7 +280,6 @@ writing. Windows is not and will never be supported.
|
|||||||
* ``imagemagick`` >= 6 for PDF conversion
|
* ``imagemagick`` >= 6 for PDF conversion
|
||||||
* ``optipng`` for optimizing thumbnails
|
* ``optipng`` for optimizing thumbnails
|
||||||
* ``gnupg`` for handling encrypted documents
|
* ``gnupg`` for handling encrypted documents
|
||||||
* ``libpoppler-cpp-dev`` for PDF to text conversion
|
|
||||||
* ``libpq-dev`` for PostgreSQL
|
* ``libpq-dev`` for PostgreSQL
|
||||||
* ``libmagic-dev`` for mime type detection
|
* ``libmagic-dev`` for mime type detection
|
||||||
* ``mime-support`` for mime type detection
|
* ``mime-support`` for mime type detection
|
||||||
@@ -354,7 +353,7 @@ writing. Windows is not and will never be supported.
|
|||||||
.. code:: shell-session
|
.. code:: shell-session
|
||||||
|
|
||||||
sudo -Hu paperless pip3 install -r requirements.txt
|
sudo -Hu paperless pip3 install -r requirements.txt
|
||||||
|
|
||||||
This will install all python dependencies in the home directory of
|
This will install all python dependencies in the home directory of
|
||||||
the new paperless user.
|
the new paperless user.
|
||||||
|
|
||||||
@@ -763,7 +762,8 @@ configuring some options in paperless can help improve performance immensely:
|
|||||||
|
|
||||||
* Stick with SQLite to save some resources.
|
* Stick with SQLite to save some resources.
|
||||||
* Consider setting ``PAPERLESS_OCR_PAGES`` to 1, so that paperless will only OCR
|
* Consider setting ``PAPERLESS_OCR_PAGES`` to 1, so that paperless will only OCR
|
||||||
the first page of your documents.
|
the first page of your documents. In most cases, this page contains enough
|
||||||
|
information to be able to find it.
|
||||||
* ``PAPERLESS_TASK_WORKERS`` and ``PAPERLESS_THREADS_PER_WORKER`` are configured
|
* ``PAPERLESS_TASK_WORKERS`` and ``PAPERLESS_THREADS_PER_WORKER`` are configured
|
||||||
to use all cores. The Raspberry Pi models 3 and up have 4 cores, meaning that
|
to use all cores. The Raspberry Pi models 3 and up have 4 cores, meaning that
|
||||||
paperless will use 2 workers and 2 threads per worker. This may result in
|
paperless will use 2 workers and 2 threads per worker. This may result in
|
||||||
@@ -774,8 +774,13 @@ configuring some options in paperless can help improve performance immensely:
|
|||||||
your documents before feeding them into paperless. Some scanners are able to
|
your documents before feeding them into paperless. Some scanners are able to
|
||||||
do this! You might want to even specify ``skip_noarchive`` to skip archive
|
do this! You might want to even specify ``skip_noarchive`` to skip archive
|
||||||
file generation for already ocr'ed documents entirely.
|
file generation for already ocr'ed documents entirely.
|
||||||
|
* If you want to perform OCR on the the device, consider using ``PAPERLESS_OCR_CLEAN=none``.
|
||||||
|
This will speed up OCR times and use less memory at the expense of slightly worse
|
||||||
|
OCR results.
|
||||||
* Set ``PAPERLESS_OPTIMIZE_THUMBNAILS`` to 'false' if you want faster consumption
|
* Set ``PAPERLESS_OPTIMIZE_THUMBNAILS`` to 'false' if you want faster consumption
|
||||||
times. Thumbnails will be about 20% larger.
|
times. Thumbnails will be about 20% larger.
|
||||||
|
* If using docker, consider setting ``PAPERLESS_WEBSERVER_WORKERS`` to
|
||||||
|
1. This will save some memory.
|
||||||
|
|
||||||
For details, refer to :ref:`configuration`.
|
For details, refer to :ref:`configuration`.
|
||||||
|
|
||||||
@@ -800,7 +805,7 @@ Using nginx as a reverse proxy
|
|||||||
##############################
|
##############################
|
||||||
|
|
||||||
If you want to expose paperless to the internet, you should hide it behind a
|
If you want to expose paperless to the internet, you should hide it behind a
|
||||||
reverse proxy with SSL enabled.
|
reverse proxy with SSL enabled.
|
||||||
|
|
||||||
In addition to the usual configuration for SSL,
|
In addition to the usual configuration for SSL,
|
||||||
the following configuration is required for paperless to operate:
|
the following configuration is required for paperless to operate:
|
||||||
|
@@ -1,5 +1,7 @@
|
|||||||
|
import os
|
||||||
|
|
||||||
bind = '0.0.0.0:8000'
|
bind = '0.0.0.0:8000'
|
||||||
workers = 2
|
workers = int(os.getenv("PAPERLESS_WEBSERVER_WORKERS", 2))
|
||||||
worker_class = 'uvicorn.workers.UvicornWorker'
|
worker_class = 'uvicorn.workers.UvicornWorker'
|
||||||
timeout = 120
|
timeout = 120
|
||||||
|
|
||||||
|
@@ -41,6 +41,10 @@
|
|||||||
#PAPERLESS_OCR_OUTPUT_TYPE=pdfa
|
#PAPERLESS_OCR_OUTPUT_TYPE=pdfa
|
||||||
#PAPERLESS_OCR_PAGES=1
|
#PAPERLESS_OCR_PAGES=1
|
||||||
#PAPERLESS_OCR_IMAGE_DPI=300
|
#PAPERLESS_OCR_IMAGE_DPI=300
|
||||||
|
#PAPERLESS_OCR_CLEAN=clean
|
||||||
|
#PAPERLESS_OCR_DESKEW=true
|
||||||
|
#PAPERLESS_OCR_ROTATE_PAGES=true
|
||||||
|
#PAPERLESS_OCR_ROTATE_PAGES_THRESHOLD=12.0
|
||||||
#PAPERLESS_OCR_USER_ARGS={}
|
#PAPERLESS_OCR_USER_ARGS={}
|
||||||
#PAPERLESS_CONVERT_MEMORY_LIMIT=0
|
#PAPERLESS_CONVERT_MEMORY_LIMIT=0
|
||||||
#PAPERLESS_CONVERT_TMPDIR=/var/tmp/paperless
|
#PAPERLESS_CONVERT_TMPDIR=/var/tmp/paperless
|
||||||
|
@@ -32,7 +32,7 @@ django-extensions==3.1.1
|
|||||||
django-filter==2.4.0
|
django-filter==2.4.0
|
||||||
django-picklefield==3.0.1; python_version >= '3'
|
django-picklefield==3.0.1; python_version >= '3'
|
||||||
django-q==1.3.4
|
django-q==1.3.4
|
||||||
django==3.1.6
|
django==3.1.7
|
||||||
djangorestframework==3.12.2
|
djangorestframework==3.12.2
|
||||||
filelock==3.0.12
|
filelock==3.0.12
|
||||||
fuzzywuzzy[speedup]==0.18.0
|
fuzzywuzzy[speedup]==0.18.0
|
||||||
@@ -53,10 +53,9 @@ 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'
|
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
|
msgpack==1.0.2
|
||||||
numpy==1.19.5
|
numpy==1.19.5
|
||||||
ocrmypdf==11.6.0
|
ocrmypdf==11.6.2
|
||||||
pathvalidate==2.3.2
|
pathvalidate==2.3.2
|
||||||
pdfminer.six==20201018; python_version >= '3.4'
|
pdfminer.six==20201018
|
||||||
pdftotext==2.1.5
|
|
||||||
pikepdf==2.5.2
|
pikepdf==2.5.2
|
||||||
pillow==8.1.0
|
pillow==8.1.0
|
||||||
pluggy==0.13.1; python_version >= '2.7' and python_version not in '3.0, 3.1, 3.2, 3.3'
|
pluggy==0.13.1; python_version >= '2.7' and python_version not in '3.0, 3.1, 3.2, 3.3'
|
||||||
@@ -71,7 +70,7 @@ python-dateutil==2.8.1
|
|||||||
python-dotenv==0.15.0
|
python-dotenv==0.15.0
|
||||||
python-gnupg==0.4.6
|
python-gnupg==0.4.6
|
||||||
python-levenshtein==0.12.2
|
python-levenshtein==0.12.2
|
||||||
python-magic==0.4.18
|
python-magic==0.4.22
|
||||||
pytz==2021.1
|
pytz==2021.1
|
||||||
pyyaml==5.4.1
|
pyyaml==5.4.1
|
||||||
redis==3.5.3
|
redis==3.5.3
|
||||||
@@ -86,15 +85,15 @@ sortedcontainers==2.3.0
|
|||||||
sqlparse==0.4.1; python_version >= '3.5'
|
sqlparse==0.4.1; python_version >= '3.5'
|
||||||
threadpoolctl==2.1.0; python_version >= '3.5'
|
threadpoolctl==2.1.0; python_version >= '3.5'
|
||||||
tika==1.24
|
tika==1.24
|
||||||
tqdm==4.56.2
|
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'
|
twisted[tls]==20.3.0; python_version >= '2.7' and python_version not in '3.0, 3.1, 3.2, 3.3, 3.4'
|
||||||
txaio==20.12.1; python_version >= '3.6'
|
txaio==21.2.1; python_version >= '3.6'
|
||||||
tzlocal==2.1
|
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'
|
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'
|
||||||
uvicorn[standard]==0.13.3
|
uvicorn[standard]==0.13.4
|
||||||
uvloop==0.14.0
|
uvloop==0.14.0
|
||||||
watchdog==1.0.2
|
watchdog==1.0.2
|
||||||
watchgod==0.6
|
watchgod==0.7
|
||||||
wcwidth==0.2.5
|
wcwidth==0.2.5
|
||||||
websockets==8.1
|
websockets==8.1
|
||||||
whitenoise==5.2.0
|
whitenoise==5.2.0
|
||||||
|
16
resources/logo.txt
Normal file
16
resources/logo.txt
Normal file
@@ -0,0 +1,16 @@
|
|||||||
|
9w
|
||||||
|
{@@N
|
||||||
|
Q@@@@H
|
||||||
|
G@@@@@@@\
|
||||||
|
SilN@@@@@@@
|
||||||
|
*Q *@@@@@@@@S /= = = = = = = = = = = = = = = = = =\
|
||||||
|
*@ B@@@@@@@@N || ||
|
||||||
|
N R$ A@@@@@@@@@@ || PAPERLESS-NG ||
|
||||||
|
x@@ $U B@@@@@@@@@R || ||
|
||||||
|
N@@N^ @ N@@@@@@@@@* \= = = = = = = = = = = = = = = = = =/
|
||||||
|
|@@@u @ E@@@@@@@@l
|
||||||
|
Q@@@ \ Px@@@@@@P
|
||||||
|
1@@S` @@@o'
|
||||||
|
z$ ;
|
||||||
|
v
|
||||||
|
/
|
@@ -18,7 +18,8 @@
|
|||||||
"locales": {
|
"locales": {
|
||||||
"de": "src/locale/messages.de.xlf",
|
"de": "src/locale/messages.de.xlf",
|
||||||
"nl-NL": "src/locale/messages.nl_NL.xlf",
|
"nl-NL": "src/locale/messages.nl_NL.xlf",
|
||||||
"fr": "src/locale/messages.fr.xlf"
|
"fr": "src/locale/messages.fr.xlf",
|
||||||
|
"en-GB": "src/locale/messages.en_GB.xlf"
|
||||||
}
|
}
|
||||||
},
|
},
|
||||||
"architect": {
|
"architect": {
|
||||||
|
@@ -52,17 +52,17 @@
|
|||||||
</context-group>
|
</context-group>
|
||||||
</trans-unit>
|
</trans-unit>
|
||||||
<trans-unit id="2155249406916744630" datatype="html">
|
<trans-unit id="2155249406916744630" datatype="html">
|
||||||
<source>View "<x id="PH" equiv-text="this.list.savedView.name"/>" saved successfully.</source>
|
<source>View "<x id="PH" equiv-text="this.list.activeSavedViewTitle"/>" saved successfully.</source>
|
||||||
<context-group purpose="location">
|
<context-group purpose="location">
|
||||||
<context context-type="sourcefile">src/app/components/document-list/document-list.component.ts</context>
|
<context context-type="sourcefile">src/app/components/document-list/document-list.component.ts</context>
|
||||||
<context context-type="linenumber">109</context>
|
<context context-type="linenumber">115</context>
|
||||||
</context-group>
|
</context-group>
|
||||||
</trans-unit>
|
</trans-unit>
|
||||||
<trans-unit id="6837554170707123455" datatype="html">
|
<trans-unit id="6837554170707123455" datatype="html">
|
||||||
<source>View "<x id="PH" equiv-text="savedView.name"/>" created successfully.</source>
|
<source>View "<x id="PH" equiv-text="savedView.name"/>" created successfully.</source>
|
||||||
<context-group purpose="location">
|
<context-group purpose="location">
|
||||||
<context context-type="sourcefile">src/app/components/document-list/document-list.component.ts</context>
|
<context context-type="sourcefile">src/app/components/document-list/document-list.component.ts</context>
|
||||||
<context context-type="linenumber">130</context>
|
<context context-type="linenumber">136</context>
|
||||||
</context-group>
|
</context-group>
|
||||||
</trans-unit>
|
</trans-unit>
|
||||||
<trans-unit id="9ca82952a6bc860b5391d5975322d8af8ceddfa4" datatype="html">
|
<trans-unit id="9ca82952a6bc860b5391d5975322d8af8ceddfa4" datatype="html">
|
||||||
@@ -114,8 +114,8 @@
|
|||||||
<context context-type="linenumber">72</context>
|
<context context-type="linenumber">72</context>
|
||||||
</context-group>
|
</context-group>
|
||||||
</trans-unit>
|
</trans-unit>
|
||||||
<trans-unit id="72e7d343f9165602cce1ca7faffbc565fd31ef92" datatype="html">
|
<trans-unit id="5f5ce787c428d917c30c9bd70789a618e09743a7" datatype="html">
|
||||||
<source>Save "<x id="INTERPOLATION" equiv-text="{{list.savedViewTitle}}"/>"</source>
|
<source>Save "<x id="INTERPOLATION" equiv-text="{{list.activeSavedViewTitle}}"/>"</source>
|
||||||
<context-group purpose="location">
|
<context-group purpose="location">
|
||||||
<context context-type="sourcefile">src/app/components/document-list/document-list.component.html</context>
|
<context context-type="sourcefile">src/app/components/document-list/document-list.component.html</context>
|
||||||
<context context-type="linenumber">71</context>
|
<context context-type="linenumber">71</context>
|
||||||
@@ -513,13 +513,6 @@
|
|||||||
<context context-type="linenumber">1</context>
|
<context context-type="linenumber">1</context>
|
||||||
</context-group>
|
</context-group>
|
||||||
</trans-unit>
|
</trans-unit>
|
||||||
<trans-unit id="5ca707824ab93066c7d9b44e1b8bf216725c2c22" datatype="html">
|
|
||||||
<source>Filter</source>
|
|
||||||
<context-group purpose="location">
|
|
||||||
<context context-type="sourcefile">src/app/components/manage/logs/logs.component.html</context>
|
|
||||||
<context context-type="linenumber">7</context>
|
|
||||||
</context-group>
|
|
||||||
</trans-unit>
|
|
||||||
<trans-unit id="5610279464668232148" datatype="html">
|
<trans-unit id="5610279464668232148" datatype="html">
|
||||||
<source>Saved view "<x id="PH" equiv-text="savedView.name"/>" deleted.</source>
|
<source>Saved view "<x id="PH" equiv-text="savedView.name"/>" deleted.</source>
|
||||||
<context-group purpose="location">
|
<context-group purpose="location">
|
||||||
@@ -545,14 +538,21 @@
|
|||||||
<source>Use date format of display language</source>
|
<source>Use date format of display language</source>
|
||||||
<context-group purpose="location">
|
<context-group purpose="location">
|
||||||
<context context-type="sourcefile">src/app/components/manage/settings/settings.component.ts</context>
|
<context context-type="sourcefile">src/app/components/manage/settings/settings.component.ts</context>
|
||||||
<context context-type="linenumber">95</context>
|
<context context-type="linenumber">96</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/components/manage/settings/settings.component.ts</context>
|
||||||
|
<context context-type="linenumber">97</context>
|
||||||
</context-group>
|
</context-group>
|
||||||
</trans-unit>
|
</trans-unit>
|
||||||
<trans-unit id="8488620293789898901" datatype="html">
|
<trans-unit id="8488620293789898901" datatype="html">
|
||||||
<source>Error while storing settings on server: <x id="PH" equiv-text="JSON.stringify(error.error)"/></source>
|
<source>Error while storing settings on server: <x id="PH" equiv-text="JSON.stringify(error.error)"/></source>
|
||||||
<context-group purpose="location">
|
<context-group purpose="location">
|
||||||
<context context-type="sourcefile">src/app/components/manage/settings/settings.component.ts</context>
|
<context context-type="sourcefile">src/app/components/manage/settings/settings.component.ts</context>
|
||||||
<context context-type="linenumber">111</context>
|
<context context-type="linenumber">114</context>
|
||||||
</context-group>
|
</context-group>
|
||||||
</trans-unit>
|
</trans-unit>
|
||||||
<trans-unit id="121cc5391cd2a5115bc2b3160379ee5b36cd7716" datatype="html">
|
<trans-unit id="121cc5391cd2a5115bc2b3160379ee5b36cd7716" datatype="html">
|
||||||
@@ -1081,6 +1081,13 @@
|
|||||||
<context context-type="linenumber">46</context>
|
<context context-type="linenumber">46</context>
|
||||||
</context-group>
|
</context-group>
|
||||||
</trans-unit>
|
</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-group>
|
||||||
|
</trans-unit>
|
||||||
<trans-unit id="02d184c288f567825a1fcbf83bcd3099a10853d5" datatype="html">
|
<trans-unit id="02d184c288f567825a1fcbf83bcd3099a10853d5" datatype="html">
|
||||||
<source>Filter tags</source>
|
<source>Filter tags</source>
|
||||||
<context-group purpose="location">
|
<context-group purpose="location">
|
||||||
@@ -1219,21 +1226,21 @@
|
|||||||
<source>Error executing bulk operation: <x id="PH" equiv-text="JSON.stringify(error.error)"/></source>
|
<source>Error executing bulk operation: <x id="PH" equiv-text="JSON.stringify(error.error)"/></source>
|
||||||
<context-group purpose="location">
|
<context-group purpose="location">
|
||||||
<context context-type="sourcefile">src/app/components/document-list/bulk-editor/bulk-editor.component.ts</context>
|
<context context-type="sourcefile">src/app/components/document-list/bulk-editor/bulk-editor.component.ts</context>
|
||||||
<context context-type="linenumber">73</context>
|
<context context-type="linenumber">74</context>
|
||||||
</context-group>
|
</context-group>
|
||||||
</trans-unit>
|
</trans-unit>
|
||||||
<trans-unit id="7894972847287473517" datatype="html">
|
<trans-unit id="7894972847287473517" datatype="html">
|
||||||
<source>"<x id="PH" equiv-text="items[0].name"/>"</source>
|
<source>"<x id="PH" equiv-text="items[0].name"/>"</source>
|
||||||
<context-group purpose="location">
|
<context-group purpose="location">
|
||||||
<context context-type="sourcefile">src/app/components/document-list/bulk-editor/bulk-editor.component.ts</context>
|
<context context-type="sourcefile">src/app/components/document-list/bulk-editor/bulk-editor.component.ts</context>
|
||||||
<context context-type="linenumber">112</context>
|
<context context-type="linenumber">113</context>
|
||||||
</context-group>
|
</context-group>
|
||||||
</trans-unit>
|
</trans-unit>
|
||||||
<trans-unit id="8639884465898458690" datatype="html">
|
<trans-unit id="8639884465898458690" datatype="html">
|
||||||
<source>"<x id="PH" equiv-text="items[0].name"/>" and "<x id="PH_1" equiv-text="items[1].name"/>"</source>
|
<source>"<x id="PH" equiv-text="items[0].name"/>" and "<x id="PH_1" equiv-text="items[1].name"/>"</source>
|
||||||
<context-group purpose="location">
|
<context-group purpose="location">
|
||||||
<context context-type="sourcefile">src/app/components/document-list/bulk-editor/bulk-editor.component.ts</context>
|
<context context-type="sourcefile">src/app/components/document-list/bulk-editor/bulk-editor.component.ts</context>
|
||||||
<context context-type="linenumber">114</context>
|
<context context-type="linenumber">115</context>
|
||||||
</context-group>
|
</context-group>
|
||||||
<note priority="1" from="description">This is for messages like 'modify "tag1" and "tag2"'</note>
|
<note priority="1" from="description">This is for messages like 'modify "tag1" and "tag2"'</note>
|
||||||
</trans-unit>
|
</trans-unit>
|
||||||
@@ -1241,7 +1248,7 @@
|
|||||||
<source>, </source>
|
<source>, </source>
|
||||||
<context-group purpose="location">
|
<context-group purpose="location">
|
||||||
<context context-type="sourcefile">src/app/components/document-list/bulk-editor/bulk-editor.component.ts</context>
|
<context context-type="sourcefile">src/app/components/document-list/bulk-editor/bulk-editor.component.ts</context>
|
||||||
<context context-type="linenumber">116</context>
|
<context context-type="linenumber">117</context>
|
||||||
</context-group>
|
</context-group>
|
||||||
<note priority="1" from="description">this is used to separate enumerations and should probably be a comma and a whitespace in most languages</note>
|
<note priority="1" from="description">this is used to separate enumerations and should probably be a comma and a whitespace in most languages</note>
|
||||||
</trans-unit>
|
</trans-unit>
|
||||||
@@ -1249,7 +1256,7 @@
|
|||||||
<source><x id="PH" equiv-text="list"/> and "<x id="PH_1" equiv-text="items[items.length - 1].name"/>"</source>
|
<source><x id="PH" equiv-text="list"/> and "<x id="PH_1" equiv-text="items[items.length - 1].name"/>"</source>
|
||||||
<context-group purpose="location">
|
<context-group purpose="location">
|
||||||
<context context-type="sourcefile">src/app/components/document-list/bulk-editor/bulk-editor.component.ts</context>
|
<context context-type="sourcefile">src/app/components/document-list/bulk-editor/bulk-editor.component.ts</context>
|
||||||
<context context-type="linenumber">117</context>
|
<context context-type="linenumber">118</context>
|
||||||
</context-group>
|
</context-group>
|
||||||
<note priority="1" from="description">this is for messages like 'modify "tag1", "tag2" and "tag3"'</note>
|
<note priority="1" from="description">this is for messages like 'modify "tag1", "tag2" and "tag3"'</note>
|
||||||
</trans-unit>
|
</trans-unit>
|
||||||
@@ -1257,112 +1264,112 @@
|
|||||||
<source>Confirm tags assignment</source>
|
<source>Confirm tags assignment</source>
|
||||||
<context-group purpose="location">
|
<context-group purpose="location">
|
||||||
<context context-type="sourcefile">src/app/components/document-list/bulk-editor/bulk-editor.component.ts</context>
|
<context context-type="sourcefile">src/app/components/document-list/bulk-editor/bulk-editor.component.ts</context>
|
||||||
<context context-type="linenumber">126</context>
|
<context context-type="linenumber">127</context>
|
||||||
</context-group>
|
</context-group>
|
||||||
</trans-unit>
|
</trans-unit>
|
||||||
<trans-unit id="6619516195038467207" datatype="html">
|
<trans-unit id="6619516195038467207" datatype="html">
|
||||||
<source>This operation will add the tag "<x id="PH" equiv-text="tag.name"/>" to <x id="PH_1" equiv-text="this.list.selected.size"/> selected document(s).</source>
|
<source>This operation will add the tag "<x id="PH" equiv-text="tag.name"/>" to <x id="PH_1" equiv-text="this.list.selected.size"/> selected document(s).</source>
|
||||||
<context-group purpose="location">
|
<context-group purpose="location">
|
||||||
<context context-type="sourcefile">src/app/components/document-list/bulk-editor/bulk-editor.component.ts</context>
|
<context context-type="sourcefile">src/app/components/document-list/bulk-editor/bulk-editor.component.ts</context>
|
||||||
<context context-type="linenumber">129</context>
|
<context context-type="linenumber">130</context>
|
||||||
</context-group>
|
</context-group>
|
||||||
</trans-unit>
|
</trans-unit>
|
||||||
<trans-unit id="1894412783609570695" datatype="html">
|
<trans-unit id="1894412783609570695" datatype="html">
|
||||||
<source>This operation will add the tags <x id="PH" equiv-text="this._localizeList(changedTags.itemsToAdd)"/> to <x id="PH_1" equiv-text="this.list.selected.size"/> selected document(s).</source>
|
<source>This operation will add the tags <x id="PH" equiv-text="this._localizeList(changedTags.itemsToAdd)"/> to <x id="PH_1" equiv-text="this.list.selected.size"/> selected document(s).</source>
|
||||||
<context-group purpose="location">
|
<context-group purpose="location">
|
||||||
<context context-type="sourcefile">src/app/components/document-list/bulk-editor/bulk-editor.component.ts</context>
|
<context context-type="sourcefile">src/app/components/document-list/bulk-editor/bulk-editor.component.ts</context>
|
||||||
<context context-type="linenumber">131</context>
|
<context context-type="linenumber">132</context>
|
||||||
</context-group>
|
</context-group>
|
||||||
</trans-unit>
|
</trans-unit>
|
||||||
<trans-unit id="7181166515756808573" datatype="html">
|
<trans-unit id="7181166515756808573" datatype="html">
|
||||||
<source>This operation will remove the tag "<x id="PH" equiv-text="tag.name"/>" from <x id="PH_1" equiv-text="this.list.selected.size"/> selected document(s).</source>
|
<source>This operation will remove the tag "<x id="PH" equiv-text="tag.name"/>" from <x id="PH_1" equiv-text="this.list.selected.size"/> selected document(s).</source>
|
||||||
<context-group purpose="location">
|
<context-group purpose="location">
|
||||||
<context context-type="sourcefile">src/app/components/document-list/bulk-editor/bulk-editor.component.ts</context>
|
<context context-type="sourcefile">src/app/components/document-list/bulk-editor/bulk-editor.component.ts</context>
|
||||||
<context context-type="linenumber">134</context>
|
<context context-type="linenumber">135</context>
|
||||||
</context-group>
|
</context-group>
|
||||||
</trans-unit>
|
</trans-unit>
|
||||||
<trans-unit id="3819792277998068944" datatype="html">
|
<trans-unit id="3819792277998068944" datatype="html">
|
||||||
<source>This operation will remove the tags <x id="PH" equiv-text="this._localizeList(changedTags.itemsToRemove)"/> from <x id="PH_1" equiv-text="this.list.selected.size"/> selected document(s).</source>
|
<source>This operation will remove the tags <x id="PH" equiv-text="this._localizeList(changedTags.itemsToRemove)"/> from <x id="PH_1" equiv-text="this.list.selected.size"/> selected document(s).</source>
|
||||||
<context-group purpose="location">
|
<context-group purpose="location">
|
||||||
<context context-type="sourcefile">src/app/components/document-list/bulk-editor/bulk-editor.component.ts</context>
|
<context context-type="sourcefile">src/app/components/document-list/bulk-editor/bulk-editor.component.ts</context>
|
||||||
<context context-type="linenumber">136</context>
|
<context context-type="linenumber">137</context>
|
||||||
</context-group>
|
</context-group>
|
||||||
</trans-unit>
|
</trans-unit>
|
||||||
<trans-unit id="2739066218579571288" datatype="html">
|
<trans-unit id="2739066218579571288" datatype="html">
|
||||||
<source>This operation will add the tags <x id="PH" equiv-text="this._localizeList(changedTags.itemsToAdd)"/> and remove the tags <x id="PH_1" equiv-text="this._localizeList(changedTags.itemsToRemove)"/> on <x id="PH_2" equiv-text="this.list.selected.size"/> selected document(s).</source>
|
<source>This operation will add the tags <x id="PH" equiv-text="this._localizeList(changedTags.itemsToAdd)"/> and remove the tags <x id="PH_1" equiv-text="this._localizeList(changedTags.itemsToRemove)"/> on <x id="PH_2" equiv-text="this.list.selected.size"/> selected document(s).</source>
|
||||||
<context-group purpose="location">
|
<context-group purpose="location">
|
||||||
<context context-type="sourcefile">src/app/components/document-list/bulk-editor/bulk-editor.component.ts</context>
|
<context context-type="sourcefile">src/app/components/document-list/bulk-editor/bulk-editor.component.ts</context>
|
||||||
<context context-type="linenumber">138</context>
|
<context context-type="linenumber">139</context>
|
||||||
</context-group>
|
</context-group>
|
||||||
</trans-unit>
|
</trans-unit>
|
||||||
<trans-unit id="2996713129519325161" datatype="html">
|
<trans-unit id="2996713129519325161" datatype="html">
|
||||||
<source>Confirm correspondent assignment</source>
|
<source>Confirm correspondent assignment</source>
|
||||||
<context-group purpose="location">
|
<context-group purpose="location">
|
||||||
<context context-type="sourcefile">src/app/components/document-list/bulk-editor/bulk-editor.component.ts</context>
|
<context context-type="sourcefile">src/app/components/document-list/bulk-editor/bulk-editor.component.ts</context>
|
||||||
<context context-type="linenumber">158</context>
|
<context context-type="linenumber">159</context>
|
||||||
</context-group>
|
</context-group>
|
||||||
</trans-unit>
|
</trans-unit>
|
||||||
<trans-unit id="6900893559485781849" datatype="html">
|
<trans-unit id="6900893559485781849" datatype="html">
|
||||||
<source>This operation will assign the correspondent "<x id="PH" equiv-text="correspondent.name"/>" to <x id="PH_1" equiv-text="this.list.selected.size"/> selected document(s).</source>
|
<source>This operation will assign the correspondent "<x id="PH" equiv-text="correspondent.name"/>" to <x id="PH_1" equiv-text="this.list.selected.size"/> selected document(s).</source>
|
||||||
<context-group purpose="location">
|
<context-group purpose="location">
|
||||||
<context context-type="sourcefile">src/app/components/document-list/bulk-editor/bulk-editor.component.ts</context>
|
<context context-type="sourcefile">src/app/components/document-list/bulk-editor/bulk-editor.component.ts</context>
|
||||||
<context context-type="linenumber">160</context>
|
<context context-type="linenumber">161</context>
|
||||||
</context-group>
|
</context-group>
|
||||||
</trans-unit>
|
</trans-unit>
|
||||||
<trans-unit id="1257522660364398440" datatype="html">
|
<trans-unit id="1257522660364398440" datatype="html">
|
||||||
<source>This operation will remove the correspondent from <x id="PH" equiv-text="this.list.selected.size"/> selected document(s).</source>
|
<source>This operation will remove the correspondent from <x id="PH" equiv-text="this.list.selected.size"/> selected document(s).</source>
|
||||||
<context-group purpose="location">
|
<context-group purpose="location">
|
||||||
<context context-type="sourcefile">src/app/components/document-list/bulk-editor/bulk-editor.component.ts</context>
|
<context context-type="sourcefile">src/app/components/document-list/bulk-editor/bulk-editor.component.ts</context>
|
||||||
<context context-type="linenumber">162</context>
|
<context context-type="linenumber">163</context>
|
||||||
</context-group>
|
</context-group>
|
||||||
</trans-unit>
|
</trans-unit>
|
||||||
<trans-unit id="5393409374423140648" datatype="html">
|
<trans-unit id="5393409374423140648" datatype="html">
|
||||||
<source>Confirm document type assignment</source>
|
<source>Confirm document type assignment</source>
|
||||||
<context-group purpose="location">
|
<context-group purpose="location">
|
||||||
<context context-type="sourcefile">src/app/components/document-list/bulk-editor/bulk-editor.component.ts</context>
|
<context context-type="sourcefile">src/app/components/document-list/bulk-editor/bulk-editor.component.ts</context>
|
||||||
<context context-type="linenumber">181</context>
|
<context context-type="linenumber">182</context>
|
||||||
</context-group>
|
</context-group>
|
||||||
</trans-unit>
|
</trans-unit>
|
||||||
<trans-unit id="332180123895325027" datatype="html">
|
<trans-unit id="332180123895325027" datatype="html">
|
||||||
<source>This operation will assign the document type "<x id="PH" equiv-text="documentType.name"/>" to <x id="PH_1" equiv-text="this.list.selected.size"/> selected document(s).</source>
|
<source>This operation will assign the document type "<x id="PH" equiv-text="documentType.name"/>" to <x id="PH_1" equiv-text="this.list.selected.size"/> selected document(s).</source>
|
||||||
<context-group purpose="location">
|
<context-group purpose="location">
|
||||||
<context context-type="sourcefile">src/app/components/document-list/bulk-editor/bulk-editor.component.ts</context>
|
<context context-type="sourcefile">src/app/components/document-list/bulk-editor/bulk-editor.component.ts</context>
|
||||||
<context context-type="linenumber">183</context>
|
<context context-type="linenumber">184</context>
|
||||||
</context-group>
|
</context-group>
|
||||||
</trans-unit>
|
</trans-unit>
|
||||||
<trans-unit id="2236642492594872779" datatype="html">
|
<trans-unit id="2236642492594872779" datatype="html">
|
||||||
<source>This operation will remove the document type from <x id="PH" equiv-text="this.list.selected.size"/> selected document(s).</source>
|
<source>This operation will remove the document type from <x id="PH" equiv-text="this.list.selected.size"/> selected document(s).</source>
|
||||||
<context-group purpose="location">
|
<context-group purpose="location">
|
||||||
<context context-type="sourcefile">src/app/components/document-list/bulk-editor/bulk-editor.component.ts</context>
|
<context context-type="sourcefile">src/app/components/document-list/bulk-editor/bulk-editor.component.ts</context>
|
||||||
<context context-type="linenumber">185</context>
|
<context context-type="linenumber">186</context>
|
||||||
</context-group>
|
</context-group>
|
||||||
</trans-unit>
|
</trans-unit>
|
||||||
<trans-unit id="749430623564850405" datatype="html">
|
<trans-unit id="749430623564850405" datatype="html">
|
||||||
<source>Delete confirm</source>
|
<source>Delete confirm</source>
|
||||||
<context-group purpose="location">
|
<context-group purpose="location">
|
||||||
<context context-type="sourcefile">src/app/components/document-list/bulk-editor/bulk-editor.component.ts</context>
|
<context context-type="sourcefile">src/app/components/document-list/bulk-editor/bulk-editor.component.ts</context>
|
||||||
<context context-type="linenumber">200</context>
|
<context context-type="linenumber">201</context>
|
||||||
</context-group>
|
</context-group>
|
||||||
</trans-unit>
|
</trans-unit>
|
||||||
<trans-unit id="4303174930844518780" datatype="html">
|
<trans-unit id="4303174930844518780" datatype="html">
|
||||||
<source>This operation will permanently delete <x id="PH" equiv-text="this.list.selected.size"/> selected document(s).</source>
|
<source>This operation will permanently delete <x id="PH" equiv-text="this.list.selected.size"/> selected document(s).</source>
|
||||||
<context-group purpose="location">
|
<context-group purpose="location">
|
||||||
<context context-type="sourcefile">src/app/components/document-list/bulk-editor/bulk-editor.component.ts</context>
|
<context context-type="sourcefile">src/app/components/document-list/bulk-editor/bulk-editor.component.ts</context>
|
||||||
<context context-type="linenumber">201</context>
|
<context context-type="linenumber">202</context>
|
||||||
</context-group>
|
</context-group>
|
||||||
</trans-unit>
|
</trans-unit>
|
||||||
<trans-unit id="5641451190833696892" datatype="html">
|
<trans-unit id="5641451190833696892" datatype="html">
|
||||||
<source>This operation cannot be undone.</source>
|
<source>This operation cannot be undone.</source>
|
||||||
<context-group purpose="location">
|
<context-group purpose="location">
|
||||||
<context context-type="sourcefile">src/app/components/document-list/bulk-editor/bulk-editor.component.ts</context>
|
<context context-type="sourcefile">src/app/components/document-list/bulk-editor/bulk-editor.component.ts</context>
|
||||||
<context context-type="linenumber">202</context>
|
<context context-type="linenumber">203</context>
|
||||||
</context-group>
|
</context-group>
|
||||||
</trans-unit>
|
</trans-unit>
|
||||||
<trans-unit id="6734339521247847366" datatype="html">
|
<trans-unit id="6734339521247847366" datatype="html">
|
||||||
<source>Delete document(s)</source>
|
<source>Delete document(s)</source>
|
||||||
<context-group purpose="location">
|
<context-group purpose="location">
|
||||||
<context context-type="sourcefile">src/app/components/document-list/bulk-editor/bulk-editor.component.ts</context>
|
<context context-type="sourcefile">src/app/components/document-list/bulk-editor/bulk-editor.component.ts</context>
|
||||||
<context context-type="linenumber">204</context>
|
<context context-type="linenumber">205</context>
|
||||||
</context-group>
|
</context-group>
|
||||||
</trans-unit>
|
</trans-unit>
|
||||||
<trans-unit id="8b0609df23817024b3bed12beb9b64fc1009f588" datatype="html">
|
<trans-unit id="8b0609df23817024b3bed12beb9b64fc1009f588" datatype="html">
|
||||||
@@ -1386,6 +1393,13 @@
|
|||||||
<context context-type="linenumber">27</context>
|
<context context-type="linenumber">27</context>
|
||||||
</context-group>
|
</context-group>
|
||||||
</trans-unit>
|
</trans-unit>
|
||||||
|
<trans-unit id="fc2de37422d7c4af6686842283cc2afd781b6848" datatype="html">
|
||||||
|
<source>Download originals</source>
|
||||||
|
<context-group purpose="location">
|
||||||
|
<context context-type="sourcefile">src/app/components/document-list/bulk-editor/bulk-editor.component.html</context>
|
||||||
|
<context context-type="linenumber">68</context>
|
||||||
|
</context-group>
|
||||||
|
</trans-unit>
|
||||||
<trans-unit id="a1e6c11f20d4bf6e8e6b43e3c6d2561b2080645e" datatype="html">
|
<trans-unit id="a1e6c11f20d4bf6e8e6b43e3c6d2561b2080645e" datatype="html">
|
||||||
<source>Suggestions:</source>
|
<source>Suggestions:</source>
|
||||||
<context-group purpose="location">
|
<context-group purpose="location">
|
||||||
@@ -1414,20 +1428,20 @@
|
|||||||
<context context-type="linenumber">1</context>
|
<context context-type="linenumber">1</context>
|
||||||
</context-group>
|
</context-group>
|
||||||
</trans-unit>
|
</trans-unit>
|
||||||
<trans-unit id="46c8fe557cf52c9389783627d4f85453f4ddb459" datatype="html">
|
<trans-unit id="c0d907c2687c09612395aee6ef7c04ca8e5e5e0a" datatype="html">
|
||||||
<source>Documents in inbox: <x id="INTERPOLATION" equiv-text="{{statistics.documents_inbox}}"/></source>
|
<source>Total documents: <x id="INTERPOLATION" equiv-text="{{statistics?.documents_total}}"/></source>
|
||||||
<context-group purpose="location">
|
|
||||||
<context context-type="sourcefile">src/app/components/dashboard/widgets/statistics-widget/statistics-widget.component.html</context>
|
|
||||||
<context context-type="linenumber">3</context>
|
|
||||||
</context-group>
|
|
||||||
</trans-unit>
|
|
||||||
<trans-unit id="c327c0e67bcac7494dcbaa9afb3b42d5008c6438" datatype="html">
|
|
||||||
<source>Total documents: <x id="INTERPOLATION" equiv-text="{{statistics.documents_total}}"/></source>
|
|
||||||
<context-group purpose="location">
|
<context-group purpose="location">
|
||||||
<context context-type="sourcefile">src/app/components/dashboard/widgets/statistics-widget/statistics-widget.component.html</context>
|
<context context-type="sourcefile">src/app/components/dashboard/widgets/statistics-widget/statistics-widget.component.html</context>
|
||||||
<context context-type="linenumber">4</context>
|
<context context-type="linenumber">4</context>
|
||||||
</context-group>
|
</context-group>
|
||||||
</trans-unit>
|
</trans-unit>
|
||||||
|
<trans-unit id="13e8d49dbcad9f9d71e66a9a56d6f328cff430c9" datatype="html">
|
||||||
|
<source>Documents in inbox: <x id="INTERPOLATION" equiv-text="{{statistics?.documents_inbox}}"/></source>
|
||||||
|
<context-group purpose="location">
|
||||||
|
<context context-type="sourcefile">src/app/components/dashboard/widgets/statistics-widget/statistics-widget.component.html</context>
|
||||||
|
<context context-type="linenumber">3</context>
|
||||||
|
</context-group>
|
||||||
|
</trans-unit>
|
||||||
<trans-unit id="6443586946875325554" datatype="html">
|
<trans-unit id="6443586946875325554" datatype="html">
|
||||||
<source>Processing: <x id="PH" equiv-text="countUploadingAndProcessing"/></source>
|
<source>Processing: <x id="PH" equiv-text="countUploadingAndProcessing"/></source>
|
||||||
<context-group purpose="location">
|
<context-group purpose="location">
|
||||||
@@ -1619,25 +1633,32 @@
|
|||||||
<context context-type="linenumber">82</context>
|
<context context-type="linenumber">82</context>
|
||||||
</context-group>
|
</context-group>
|
||||||
</trans-unit>
|
</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">83</context>
|
||||||
|
</context-group>
|
||||||
|
</trans-unit>
|
||||||
<trans-unit id="1858110241312746425" datatype="html">
|
<trans-unit id="1858110241312746425" datatype="html">
|
||||||
<source>German</source>
|
<source>German</source>
|
||||||
<context-group purpose="location">
|
<context-group purpose="location">
|
||||||
<context context-type="sourcefile">src/app/services/settings.service.ts</context>
|
<context context-type="sourcefile">src/app/services/settings.service.ts</context>
|
||||||
<context context-type="linenumber">83</context>
|
<context context-type="linenumber">84</context>
|
||||||
</context-group>
|
</context-group>
|
||||||
</trans-unit>
|
</trans-unit>
|
||||||
<trans-unit id="3071065188816255493" datatype="html">
|
<trans-unit id="3071065188816255493" datatype="html">
|
||||||
<source>Dutch</source>
|
<source>Dutch</source>
|
||||||
<context-group purpose="location">
|
<context-group purpose="location">
|
||||||
<context context-type="sourcefile">src/app/services/settings.service.ts</context>
|
<context context-type="sourcefile">src/app/services/settings.service.ts</context>
|
||||||
<context context-type="linenumber">84</context>
|
<context context-type="linenumber">85</context>
|
||||||
</context-group>
|
</context-group>
|
||||||
</trans-unit>
|
</trans-unit>
|
||||||
<trans-unit id="7633754075223722162" datatype="html">
|
<trans-unit id="7633754075223722162" datatype="html">
|
||||||
<source>French</source>
|
<source>French</source>
|
||||||
<context-group purpose="location">
|
<context-group purpose="location">
|
||||||
<context context-type="sourcefile">src/app/services/settings.service.ts</context>
|
<context context-type="sourcefile">src/app/services/settings.service.ts</context>
|
||||||
<context context-type="linenumber">85</context>
|
<context context-type="linenumber">86</context>
|
||||||
</context-group>
|
</context-group>
|
||||||
</trans-unit>
|
</trans-unit>
|
||||||
<trans-unit id="2119857572761283468" datatype="html">
|
<trans-unit id="2119857572761283468" datatype="html">
|
||||||
|
5
src-ui/package-lock.json
generated
5
src-ui/package-lock.json
generated
@@ -5545,6 +5545,11 @@
|
|||||||
"schema-utils": "^2.6.5"
|
"schema-utils": "^2.6.5"
|
||||||
}
|
}
|
||||||
},
|
},
|
||||||
|
"file-saver": {
|
||||||
|
"version": "2.0.5",
|
||||||
|
"resolved": "https://registry.npmjs.org/file-saver/-/file-saver-2.0.5.tgz",
|
||||||
|
"integrity": "sha512-P9bmyZ3h/PRG+Nzga+rbdI4OEpNDzAVyy74uVO9ATgzLK6VtAsYybF/+TOCvrc0MO793d6+42lLyZTw7/ArVzA=="
|
||||||
|
},
|
||||||
"file-uri-to-path": {
|
"file-uri-to-path": {
|
||||||
"version": "1.0.0",
|
"version": "1.0.0",
|
||||||
"resolved": "https://registry.npmjs.org/file-uri-to-path/-/file-uri-to-path-1.0.0.tgz",
|
"resolved": "https://registry.npmjs.org/file-uri-to-path/-/file-uri-to-path-1.0.0.tgz",
|
||||||
|
@@ -23,6 +23,7 @@
|
|||||||
"@ng-bootstrap/ng-bootstrap": "^8.0.0",
|
"@ng-bootstrap/ng-bootstrap": "^8.0.0",
|
||||||
"@ng-select/ng-select": "^5.0.9",
|
"@ng-select/ng-select": "^5.0.9",
|
||||||
"bootstrap": "^4.5.0",
|
"bootstrap": "^4.5.0",
|
||||||
|
"file-saver": "^2.0.5",
|
||||||
"ng-bootstrap": "^1.6.3",
|
"ng-bootstrap": "^1.6.3",
|
||||||
"ng2-pdf-viewer": "^6.3.2",
|
"ng2-pdf-viewer": "^6.3.2",
|
||||||
"ngx-cookie-service": "^10.1.1",
|
"ngx-cookie-service": "^10.1.1",
|
||||||
|
@@ -64,10 +64,12 @@ import { CustomDatePipe } from './pipes/custom-date.pipe';
|
|||||||
import localeFr from '@angular/common/locales/fr';
|
import localeFr from '@angular/common/locales/fr';
|
||||||
import localeNl from '@angular/common/locales/nl';
|
import localeNl from '@angular/common/locales/nl';
|
||||||
import localeDe from '@angular/common/locales/de';
|
import localeDe from '@angular/common/locales/de';
|
||||||
|
import localeEnGb from '@angular/common/locales/en-GB';
|
||||||
|
|
||||||
registerLocaleData(localeFr)
|
registerLocaleData(localeFr)
|
||||||
registerLocaleData(localeNl)
|
registerLocaleData(localeNl)
|
||||||
registerLocaleData(localeDe)
|
registerLocaleData(localeDe)
|
||||||
|
registerLocaleData(localeEnGb)
|
||||||
|
|
||||||
@NgModule({
|
@NgModule({
|
||||||
declarations: [
|
declarations: [
|
||||||
|
@@ -48,7 +48,7 @@ export class SavedViewWidgetComponent implements OnInit, OnDestroy {
|
|||||||
if (this.savedView.show_in_sidebar) {
|
if (this.savedView.show_in_sidebar) {
|
||||||
this.router.navigate(['view', this.savedView.id])
|
this.router.navigate(['view', this.savedView.id])
|
||||||
} else {
|
} else {
|
||||||
this.list.load(this.savedView)
|
this.list.loadSavedView(this.savedView, true)
|
||||||
this.router.navigate(["documents"])
|
this.router.navigate(["documents"])
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
@@ -1,6 +1,6 @@
|
|||||||
<app-widget-frame title="Statistics" i18n-title>
|
<app-widget-frame title="Statistics" i18n-title>
|
||||||
<ng-container content>
|
<ng-container content>
|
||||||
<p class="card-text" i18n>Documents in inbox: {{statistics.documents_inbox}}</p>
|
<p class="card-text" i18n *ngIf="statistics?.documents_inbox != null">Documents in inbox: {{statistics?.documents_inbox}}</p>
|
||||||
<p class="card-text" i18n>Total documents: {{statistics.documents_total}}</p>
|
<p class="card-text" i18n>Total documents: {{statistics?.documents_total}}</p>
|
||||||
</ng-container>
|
</ng-container>
|
||||||
</app-widget-frame>
|
</app-widget-frame>
|
||||||
|
@@ -191,8 +191,8 @@ export class DocumentDetailComponent implements OnInit {
|
|||||||
|
|
||||||
close() {
|
close() {
|
||||||
this.openDocumentService.closeDocument(this.document)
|
this.openDocumentService.closeDocument(this.document)
|
||||||
if (this.documentListViewService.savedViewId) {
|
if (this.documentListViewService.activeSavedViewId) {
|
||||||
this.router.navigate(['view', this.documentListViewService.savedViewId])
|
this.router.navigate(['view', this.documentListViewService.activeSavedViewId])
|
||||||
} else {
|
} else {
|
||||||
this.router.navigate(['documents'])
|
this.router.navigate(['documents'])
|
||||||
}
|
}
|
||||||
|
@@ -56,6 +56,20 @@
|
|||||||
</div>
|
</div>
|
||||||
</div>
|
</div>
|
||||||
<div class="col-auto ml-auto mb-2 mb-xl-0 d-flex">
|
<div class="col-auto ml-auto mb-2 mb-xl-0 d-flex">
|
||||||
|
<div class="btn-group btn-group-sm mr-2">
|
||||||
|
<button type="button" class="btn btn-outline-primary btn-sm" (click)="downloadSelected()">
|
||||||
|
<svg width="1em" height="1em" viewBox="0 0 16 16" fill="currentColor">
|
||||||
|
<use xlink:href="assets/bootstrap-icons.svg#download" />
|
||||||
|
</svg> <ng-container i18n>Download</ng-container>
|
||||||
|
</button>
|
||||||
|
<div class="btn-group" ngbDropdown role="group" aria-label="Button group with nested dropdown">
|
||||||
|
<button class="btn btn-outline-primary btn-sm dropdown-toggle-split" ngbDropdownToggle></button>
|
||||||
|
<div class="dropdown-menu shadow" ngbDropdownMenu>
|
||||||
|
<button ngbDropdownItem i18n (click)="downloadSelected('originals')">Download originals</button>
|
||||||
|
</div>
|
||||||
|
</div>
|
||||||
|
</div>
|
||||||
|
|
||||||
<button type="button" class="btn btn-sm btn-outline-danger" (click)="applyDelete()">
|
<button type="button" class="btn btn-sm btn-outline-danger" (click)="applyDelete()">
|
||||||
<svg width="1em" height="1em" viewBox="0 0 16 16" fill="currentColor">
|
<svg width="1em" height="1em" viewBox="0 0 16 16" fill="currentColor">
|
||||||
<use xlink:href="assets/bootstrap-icons.svg#trash" />
|
<use xlink:href="assets/bootstrap-icons.svg#trash" />
|
||||||
|
@@ -15,6 +15,7 @@ import { ToggleableItemState } from '../../common/filterable-dropdown/toggleable
|
|||||||
import { MatchingModel } from 'src/app/data/matching-model';
|
import { MatchingModel } from 'src/app/data/matching-model';
|
||||||
import { SettingsService, SETTINGS_KEYS } from 'src/app/services/settings.service';
|
import { SettingsService, SETTINGS_KEYS } from 'src/app/services/settings.service';
|
||||||
import { ToastService } from 'src/app/services/toast.service';
|
import { ToastService } from 'src/app/services/toast.service';
|
||||||
|
import { saveAs } from 'file-saver';
|
||||||
|
|
||||||
@Component({
|
@Component({
|
||||||
selector: 'app-bulk-editor',
|
selector: 'app-bulk-editor',
|
||||||
@@ -137,7 +138,7 @@ export class BulkEditorComponent {
|
|||||||
} else {
|
} else {
|
||||||
modal.componentInstance.message = $localize`This operation will add the tags ${this._localizeList(changedTags.itemsToAdd)} and remove the tags ${this._localizeList(changedTags.itemsToRemove)} on ${this.list.selected.size} selected document(s).`
|
modal.componentInstance.message = $localize`This operation will add the tags ${this._localizeList(changedTags.itemsToAdd)} and remove the tags ${this._localizeList(changedTags.itemsToRemove)} on ${this.list.selected.size} selected document(s).`
|
||||||
}
|
}
|
||||||
|
|
||||||
modal.componentInstance.btnClass = "btn-warning"
|
modal.componentInstance.btnClass = "btn-warning"
|
||||||
modal.componentInstance.btnCaption = $localize`Confirm`
|
modal.componentInstance.btnCaption = $localize`Confirm`
|
||||||
modal.componentInstance.confirmClicked.subscribe(() => {
|
modal.componentInstance.confirmClicked.subscribe(() => {
|
||||||
@@ -207,4 +208,10 @@ export class BulkEditorComponent {
|
|||||||
this.executeBulkOperation(modal, "delete", {})
|
this.executeBulkOperation(modal, "delete", {})
|
||||||
})
|
})
|
||||||
}
|
}
|
||||||
|
|
||||||
|
downloadSelected(content = "archive") {
|
||||||
|
this.documentService.bulkDownload(Array.from(this.list.selected), content).subscribe((result: any) => {
|
||||||
|
saveAs(result, 'documents.zip');
|
||||||
|
})
|
||||||
|
}
|
||||||
}
|
}
|
||||||
|
@@ -63,12 +63,12 @@
|
|||||||
<div class="btn-group ml-2 flex-fill" ngbDropdown role="group">
|
<div class="btn-group ml-2 flex-fill" ngbDropdown role="group">
|
||||||
<button class="btn btn-sm btn-outline-primary dropdown-toggle flex-fill" ngbDropdownToggle i18n>Views</button>
|
<button class="btn btn-sm btn-outline-primary dropdown-toggle flex-fill" ngbDropdownToggle i18n>Views</button>
|
||||||
<div class="dropdown-menu shadow dropdown-menu-right" ngbDropdownMenu>
|
<div class="dropdown-menu shadow dropdown-menu-right" ngbDropdownMenu>
|
||||||
<ng-container *ngIf="!list.savedViewId">
|
<ng-container *ngIf="!list.activeSavedViewId">
|
||||||
<button ngbDropdownItem *ngFor="let view of savedViewService.allViews" (click)="loadViewConfig(view)">{{view.name}}</button>
|
<button ngbDropdownItem *ngFor="let view of savedViewService.allViews" (click)="loadViewConfig(view)">{{view.name}}</button>
|
||||||
<div class="dropdown-divider" *ngIf="savedViewService.allViews.length > 0"></div>
|
<div class="dropdown-divider" *ngIf="savedViewService.allViews.length > 0"></div>
|
||||||
</ng-container>
|
</ng-container>
|
||||||
|
|
||||||
<button ngbDropdownItem (click)="saveViewConfig()" *ngIf="list.savedViewId" i18n>Save "{{list.savedViewTitle}}"</button>
|
<button ngbDropdownItem (click)="saveViewConfig()" *ngIf="list.activeSavedViewId" i18n>Save "{{list.activeSavedViewTitle}}"</button>
|
||||||
<button ngbDropdownItem (click)="saveViewConfigAs()" i18n>Save as...</button>
|
<button ngbDropdownItem (click)="saveViewConfigAs()" i18n>Save as...</button>
|
||||||
</div>
|
</div>
|
||||||
</div>
|
</div>
|
||||||
@@ -86,7 +86,7 @@
|
|||||||
<span i18n *ngIf="list.selected.size == 0">{list.collectionSize, plural, =1 {One document} other {{{list.collectionSize || 0}} documents}}</span> <span i18n *ngIf="isFiltered">(filtered)</span>
|
<span i18n *ngIf="list.selected.size == 0">{list.collectionSize, plural, =1 {One document} other {{{list.collectionSize || 0}} documents}}</span> <span i18n *ngIf="isFiltered">(filtered)</span>
|
||||||
</p>
|
</p>
|
||||||
<ngb-pagination [pageSize]="list.currentPageSize" [collectionSize]="list.collectionSize" [(page)]="list.currentPage" [maxSize]="5"
|
<ngb-pagination [pageSize]="list.currentPageSize" [collectionSize]="list.collectionSize" [(page)]="list.currentPage" [maxSize]="5"
|
||||||
[rotate]="true" (pageChange)="list.reload()" aria-label="Default pagination"></ngb-pagination>
|
[rotate]="true" aria-label="Default pagination"></ngb-pagination>
|
||||||
</div>
|
</div>
|
||||||
|
|
||||||
<div *ngIf="displayMode == 'largeCards'">
|
<div *ngIf="displayMode == 'largeCards'">
|
||||||
|
@@ -1,4 +1,4 @@
|
|||||||
import { AfterViewInit, Component, OnDestroy, OnInit, QueryList, ViewChild, ViewChildren } from '@angular/core';
|
import { Component, OnDestroy, OnInit, QueryList, ViewChild, ViewChildren } from '@angular/core';
|
||||||
import { ActivatedRoute, Router } from '@angular/router';
|
import { ActivatedRoute, Router } from '@angular/router';
|
||||||
import { NgbModal } from '@ng-bootstrap/ng-bootstrap';
|
import { NgbModal } from '@ng-bootstrap/ng-bootstrap';
|
||||||
import { Subscription } from 'rxjs';
|
import { Subscription } from 'rxjs';
|
||||||
@@ -9,7 +9,7 @@ import { ConsumerStatusService } from 'src/app/services/consumer-status.service'
|
|||||||
import { DocumentListViewService } from 'src/app/services/document-list-view.service';
|
import { DocumentListViewService } from 'src/app/services/document-list-view.service';
|
||||||
import { DOCUMENT_SORT_FIELDS } from 'src/app/services/rest/document.service';
|
import { DOCUMENT_SORT_FIELDS } from 'src/app/services/rest/document.service';
|
||||||
import { SavedViewService } from 'src/app/services/rest/saved-view.service';
|
import { SavedViewService } from 'src/app/services/rest/saved-view.service';
|
||||||
import { Toast, ToastService } from 'src/app/services/toast.service';
|
import { ToastService } from 'src/app/services/toast.service';
|
||||||
import { FilterEditorComponent } from './filter-editor/filter-editor.component';
|
import { FilterEditorComponent } from './filter-editor/filter-editor.component';
|
||||||
import { SaveViewConfigDialogComponent } from './save-view-config-dialog/save-view-config-dialog.component';
|
import { SaveViewConfigDialogComponent } from './save-view-config-dialog/save-view-config-dialog.component';
|
||||||
|
|
||||||
@@ -46,7 +46,7 @@ export class DocumentListComponent implements OnInit, OnDestroy {
|
|||||||
}
|
}
|
||||||
|
|
||||||
getTitle() {
|
getTitle() {
|
||||||
return this.list.savedViewTitle || $localize`Documents`
|
return this.list.activeSavedViewTitle || $localize`Documents`
|
||||||
}
|
}
|
||||||
|
|
||||||
getSortFields() {
|
getSortFields() {
|
||||||
@@ -73,19 +73,18 @@ export class DocumentListComponent implements OnInit, OnDestroy {
|
|||||||
this.list.reload()
|
this.list.reload()
|
||||||
})
|
})
|
||||||
this.route.paramMap.subscribe(params => {
|
this.route.paramMap.subscribe(params => {
|
||||||
this.list.clear()
|
|
||||||
if (params.has('id')) {
|
if (params.has('id')) {
|
||||||
this.savedViewService.getCached(+params.get('id')).subscribe(view => {
|
this.savedViewService.getCached(+params.get('id')).subscribe(view => {
|
||||||
if (!view) {
|
if (!view) {
|
||||||
this.router.navigate(["404"])
|
this.router.navigate(["404"])
|
||||||
return
|
return
|
||||||
}
|
}
|
||||||
this.list.savedView = view
|
this.list.activateSavedView(view)
|
||||||
this.list.reload()
|
this.list.reload()
|
||||||
this.rulesChanged()
|
this.rulesChanged()
|
||||||
})
|
})
|
||||||
} else {
|
} else {
|
||||||
this.list.savedView = null
|
this.list.activateSavedView(null)
|
||||||
this.list.reload()
|
this.list.reload()
|
||||||
this.rulesChanged()
|
this.rulesChanged()
|
||||||
}
|
}
|
||||||
@@ -99,16 +98,23 @@ export class DocumentListComponent implements OnInit, OnDestroy {
|
|||||||
}
|
}
|
||||||
|
|
||||||
loadViewConfig(view: PaperlessSavedView) {
|
loadViewConfig(view: PaperlessSavedView) {
|
||||||
this.list.load(view)
|
this.list.loadSavedView(view)
|
||||||
this.list.reload()
|
this.list.reload()
|
||||||
this.rulesChanged()
|
this.rulesChanged()
|
||||||
}
|
}
|
||||||
|
|
||||||
saveViewConfig() {
|
saveViewConfig() {
|
||||||
this.savedViewService.update(this.list.savedView).subscribe(result => {
|
if (this.list.activeSavedViewId != null) {
|
||||||
this.toastService.showInfo($localize`View "${this.list.savedView.name}" saved successfully.`)
|
let savedView: PaperlessSavedView = {
|
||||||
})
|
id: this.list.activeSavedViewId,
|
||||||
|
filter_rules: this.list.filterRules,
|
||||||
|
sort_field: this.list.sortField,
|
||||||
|
sort_reverse: this.list.sortReverse
|
||||||
|
}
|
||||||
|
this.savedViewService.patch(savedView).subscribe(result => {
|
||||||
|
this.toastService.showInfo($localize`View "${this.list.activeSavedViewTitle}" saved successfully.`)
|
||||||
|
})
|
||||||
|
}
|
||||||
}
|
}
|
||||||
|
|
||||||
saveViewConfigAs() {
|
saveViewConfigAs() {
|
||||||
@@ -116,7 +122,7 @@ export class DocumentListComponent implements OnInit, OnDestroy {
|
|||||||
modal.componentInstance.defaultName = this.filterEditor.generateFilterName()
|
modal.componentInstance.defaultName = this.filterEditor.generateFilterName()
|
||||||
modal.componentInstance.saveClicked.subscribe(formValue => {
|
modal.componentInstance.saveClicked.subscribe(formValue => {
|
||||||
modal.componentInstance.buttonsEnabled = false
|
modal.componentInstance.buttonsEnabled = false
|
||||||
let savedView = {
|
let savedView: PaperlessSavedView = {
|
||||||
name: formValue.name,
|
name: formValue.name,
|
||||||
show_on_dashboard: formValue.showOnDashboard,
|
show_on_dashboard: formValue.showOnDashboard,
|
||||||
show_in_sidebar: formValue.showInSideBar,
|
show_in_sidebar: formValue.showInSideBar,
|
||||||
@@ -137,8 +143,8 @@ export class DocumentListComponent implements OnInit, OnDestroy {
|
|||||||
|
|
||||||
resetFilters(): void {
|
resetFilters(): void {
|
||||||
this.filterRulesModified = false
|
this.filterRulesModified = false
|
||||||
if (this.list.savedViewId) {
|
if (this.list.activeSavedViewId) {
|
||||||
this.savedViewService.getCached(this.list.savedViewId).subscribe(viewUntouched => {
|
this.savedViewService.getCached(this.list.activeSavedViewId).subscribe(viewUntouched => {
|
||||||
this.list.filterRules = viewUntouched.filter_rules
|
this.list.filterRules = viewUntouched.filter_rules
|
||||||
this.list.reload()
|
this.list.reload()
|
||||||
})
|
})
|
||||||
@@ -150,11 +156,11 @@ export class DocumentListComponent implements OnInit, OnDestroy {
|
|||||||
|
|
||||||
rulesChanged() {
|
rulesChanged() {
|
||||||
let modified = false
|
let modified = false
|
||||||
if (this.list.savedView == null) {
|
if (this.list.activeSavedViewId == null) {
|
||||||
modified = this.list.filterRules.length > 0 // documents list is modified if it has any filters
|
modified = this.list.filterRules.length > 0 // documents list is modified if it has any filters
|
||||||
} else {
|
} else {
|
||||||
// compare savedView current filters vs original
|
// compare savedView current filters vs original
|
||||||
this.savedViewService.getCached(this.list.savedViewId).subscribe(view => {
|
this.savedViewService.getCached(this.list.activeSavedViewId).subscribe(view => {
|
||||||
let filterRulesInitial = view.filter_rules
|
let filterRulesInitial = view.filter_rules
|
||||||
|
|
||||||
if (this.list.filterRules.length !== filterRulesInitial.length) modified = true
|
if (this.list.filterRules.length !== filterRulesInitial.length) modified = true
|
||||||
|
@@ -46,6 +46,8 @@ export class FilterEditorComponent implements OnInit, OnDestroy {
|
|||||||
return $localize`Without any tag`
|
return $localize`Without any tag`
|
||||||
}
|
}
|
||||||
|
|
||||||
|
case FILTER_TITLE:
|
||||||
|
return $localize`Title: ${rule.value}`
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
|
||||||
@@ -117,7 +119,7 @@ export class FilterEditorComponent implements OnInit, OnDestroy {
|
|||||||
})
|
})
|
||||||
}
|
}
|
||||||
|
|
||||||
get filterRules() {
|
get filterRules(): FilterRule[] {
|
||||||
let filterRules: FilterRule[] = []
|
let filterRules: FilterRule[] = []
|
||||||
if (this._titleFilter) {
|
if (this._titleFilter) {
|
||||||
filterRules.push({rule_type: FILTER_TITLE, value: this._titleFilter})
|
filterRules.push({rule_type: FILTER_TITLE, value: this._titleFilter})
|
||||||
|
@@ -34,7 +34,7 @@
|
|||||||
<div class="col">
|
<div class="col">
|
||||||
|
|
||||||
<select class="form-control" formControlName="dateLocale">
|
<select class="form-control" formControlName="dateLocale">
|
||||||
<option *ngFor="let lang of dateLocaleOptions" [ngValue]="lang.code">{{lang.name}}<span *ngIf="lang.code"> - {{today | date:'shortDate':null:lang.code}}</span></option>
|
<option *ngFor="let lang of dateLocaleOptions" [ngValue]="lang.code">{{lang.name}}<span *ngIf="lang.code"> - {{today | customDate:'shortDate':null:lang.code}}</span></option>
|
||||||
</select>
|
</select>
|
||||||
|
|
||||||
</div>
|
</div>
|
||||||
@@ -167,7 +167,7 @@
|
|||||||
</li>
|
</li>
|
||||||
</ul>
|
</ul>
|
||||||
|
|
||||||
<div [ngbNavOutlet]="nav" class="border-left border-right border-bottom p-3 mb-3 shadow"></div>
|
<div [ngbNavOutlet]="nav" class="border-left border-right border-bottom p-3 mb-3 shadow-sm"></div>
|
||||||
|
|
||||||
<button type="submit" class="btn btn-primary" i18n>Save</button>
|
<button type="submit" class="btn btn-primary" i18n>Save</button>
|
||||||
</form>
|
</form>
|
||||||
|
@@ -35,7 +35,7 @@ export class SettingsComponent implements OnInit {
|
|||||||
savedViews: PaperlessSavedView[]
|
savedViews: PaperlessSavedView[]
|
||||||
|
|
||||||
get computedDateLocale(): string {
|
get computedDateLocale(): string {
|
||||||
return this.settingsForm.value.dateLocale || this.settingsForm.value.displayLanguage
|
return this.settingsForm.value.dateLocale || this.settingsForm.value.displayLanguage || this.currentLocale
|
||||||
}
|
}
|
||||||
|
|
||||||
constructor(
|
constructor(
|
||||||
@@ -92,7 +92,10 @@ export class SettingsComponent implements OnInit {
|
|||||||
}
|
}
|
||||||
|
|
||||||
get dateLocaleOptions(): LanguageOption[] {
|
get dateLocaleOptions(): LanguageOption[] {
|
||||||
return [{code: "", name: $localize`Use date format of display language`}].concat(this.settings.getLanguageOptions())
|
return [
|
||||||
|
{code: "", name: $localize`Use date format of display language`},
|
||||||
|
{code: "iso-8601", name: $localize`ISO 8601`}
|
||||||
|
].concat(this.settings.getLanguageOptions())
|
||||||
}
|
}
|
||||||
|
|
||||||
get today() {
|
get today() {
|
||||||
|
@@ -2,18 +2,29 @@ import { DatePipe } from '@angular/common';
|
|||||||
import { Inject, LOCALE_ID, Pipe, PipeTransform } from '@angular/core';
|
import { Inject, LOCALE_ID, Pipe, PipeTransform } from '@angular/core';
|
||||||
import { SettingsService, SETTINGS_KEYS } from '../services/settings.service';
|
import { SettingsService, SETTINGS_KEYS } from '../services/settings.service';
|
||||||
|
|
||||||
|
const FORMAT_TO_ISO_FORMAT = {
|
||||||
|
"longDate": "y-MM-dd",
|
||||||
|
"mediumDate": "yy-MM-dd",
|
||||||
|
"shortDate": "yy-MM-dd"
|
||||||
|
}
|
||||||
|
|
||||||
@Pipe({
|
@Pipe({
|
||||||
name: 'customDate'
|
name: 'customDate'
|
||||||
})
|
})
|
||||||
export class CustomDatePipe extends DatePipe implements PipeTransform {
|
export class CustomDatePipe extends DatePipe implements PipeTransform {
|
||||||
|
|
||||||
constructor(@Inject(LOCALE_ID) locale: string, private settings: SettingsService) {
|
constructor(@Inject(LOCALE_ID) locale: string, private settings: SettingsService) {
|
||||||
super(settings.get(SETTINGS_KEYS.DATE_LOCALE) || locale)
|
super(locale)
|
||||||
|
|
||||||
}
|
}
|
||||||
|
|
||||||
transform(value: any, format?: string, timezone?: string, locale?: string): string | null {
|
transform(value: any, format?: string, timezone?: string, locale?: string): string | null {
|
||||||
return super.transform(value, format || this.settings.get(SETTINGS_KEYS.DATE_FORMAT), timezone, locale)
|
let l = locale || this.settings.get(SETTINGS_KEYS.DATE_LOCALE)
|
||||||
|
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)
|
||||||
|
}
|
||||||
}
|
}
|
||||||
|
|
||||||
}
|
}
|
||||||
|
@@ -169,7 +169,12 @@ export class ConsumerStatusService {
|
|||||||
}
|
}
|
||||||
|
|
||||||
dismiss(status: FileStatus) {
|
dismiss(status: FileStatus) {
|
||||||
let index = this.consumerStatus.findIndex(s => s.filename == status.filename)
|
let index
|
||||||
|
if (status.taskId != null) {
|
||||||
|
index = this.consumerStatus.findIndex(s => s.taskId == status.taskId)
|
||||||
|
} else {
|
||||||
|
index = this.consumerStatus.findIndex(s => s.filename == status.filename)
|
||||||
|
}
|
||||||
|
|
||||||
if (index > -1) {
|
if (index > -1) {
|
||||||
this.consumerStatus.splice(index, 1)
|
this.consumerStatus.splice(index, 1)
|
||||||
|
@@ -8,6 +8,23 @@ import { DOCUMENT_LIST_SERVICE } from '../data/storage-keys';
|
|||||||
import { DocumentService } from './rest/document.service';
|
import { DocumentService } from './rest/document.service';
|
||||||
import { SettingsService, SETTINGS_KEYS } from './settings.service';
|
import { SettingsService, SETTINGS_KEYS } from './settings.service';
|
||||||
|
|
||||||
|
interface ListViewState {
|
||||||
|
|
||||||
|
title?: string
|
||||||
|
|
||||||
|
documents?: PaperlessDocument[]
|
||||||
|
|
||||||
|
currentPage: number
|
||||||
|
collectionSize: number
|
||||||
|
|
||||||
|
sortField: string
|
||||||
|
sortReverse: boolean
|
||||||
|
|
||||||
|
filterRules: FilterRule[]
|
||||||
|
|
||||||
|
selected?: Set<number>
|
||||||
|
|
||||||
|
}
|
||||||
|
|
||||||
/**
|
/**
|
||||||
* This service manages the document list which is displayed using the document list view.
|
* This service manages the document list which is displayed using the document list view.
|
||||||
@@ -20,156 +37,174 @@ import { SettingsService, SETTINGS_KEYS } from './settings.service';
|
|||||||
})
|
})
|
||||||
export class DocumentListViewService {
|
export class DocumentListViewService {
|
||||||
|
|
||||||
static DEFAULT_SORT_FIELD = 'created'
|
|
||||||
|
|
||||||
isReloading: boolean = false
|
isReloading: boolean = false
|
||||||
documents: PaperlessDocument[] = []
|
|
||||||
currentPage = 1
|
|
||||||
currentPageSize: number = this.settings.get(SETTINGS_KEYS.DOCUMENT_LIST_SIZE)
|
|
||||||
collectionSize: number
|
|
||||||
rangeSelectionAnchorIndex: number
|
rangeSelectionAnchorIndex: number
|
||||||
lastRangeSelectionToIndex: number
|
lastRangeSelectionToIndex: number
|
||||||
|
|
||||||
/**
|
currentPageSize: number = this.settings.get(SETTINGS_KEYS.DOCUMENT_LIST_SIZE)
|
||||||
* This is the current config for the document list. The service will always remember the last settings used for the document list.
|
|
||||||
*/
|
|
||||||
private _documentListViewConfig: PaperlessSavedView
|
|
||||||
/**
|
|
||||||
* Optionally, this is the currently selected saved view, which might be null.
|
|
||||||
*/
|
|
||||||
private _savedViewConfig: PaperlessSavedView
|
|
||||||
|
|
||||||
get savedView(): PaperlessSavedView {
|
private listViewStates: Map<number, ListViewState> = new Map()
|
||||||
return this._savedViewConfig
|
|
||||||
|
private _activeSavedViewId: number = null
|
||||||
|
|
||||||
|
get activeSavedViewId() {
|
||||||
|
return this._activeSavedViewId
|
||||||
}
|
}
|
||||||
|
|
||||||
set savedView(value: PaperlessSavedView) {
|
get activeSavedViewTitle() {
|
||||||
if (value && !this._savedViewConfig || value && value.id != this._savedViewConfig.id) {
|
return this.activeListViewState.title
|
||||||
//saved view inactive and should be active now, or saved view active, but a different view is requested
|
}
|
||||||
//this is here so that we don't modify value, which might be the actual instance of the saved view.
|
|
||||||
this.selectNone()
|
private defaultListViewState(): ListViewState {
|
||||||
this._savedViewConfig = Object.assign({}, value)
|
return {
|
||||||
} else if (this._savedViewConfig && !value) {
|
title: null,
|
||||||
//saved view active, but document list requested
|
documents: [],
|
||||||
this.selectNone()
|
currentPage: 1,
|
||||||
this._savedViewConfig = null
|
collectionSize: null,
|
||||||
|
sortField: "created",
|
||||||
|
sortReverse: true,
|
||||||
|
filterRules: [],
|
||||||
|
selected: new Set<number>()
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
|
||||||
get savedViewId() {
|
private get activeListViewState() {
|
||||||
return this.savedView?.id
|
if (!this.listViewStates.has(this._activeSavedViewId)) {
|
||||||
|
this.listViewStates.set(this._activeSavedViewId, this.defaultListViewState())
|
||||||
|
}
|
||||||
|
return this.listViewStates.get(this._activeSavedViewId)
|
||||||
}
|
}
|
||||||
|
|
||||||
get savedViewTitle() {
|
activateSavedView(view: PaperlessSavedView) {
|
||||||
return this.savedView?.name
|
this.rangeSelectionAnchorIndex = this.lastRangeSelectionToIndex = null
|
||||||
}
|
if (view) {
|
||||||
|
this._activeSavedViewId = view.id
|
||||||
get documentListView() {
|
this.loadSavedView(view)
|
||||||
return this._documentListViewConfig
|
} else {
|
||||||
}
|
this._activeSavedViewId = null
|
||||||
|
|
||||||
set documentListView(value) {
|
|
||||||
if (value) {
|
|
||||||
this._documentListViewConfig = Object.assign({}, value)
|
|
||||||
this.saveDocumentListView()
|
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
|
||||||
/**
|
loadSavedView(view: PaperlessSavedView, closeCurrentView: boolean = false) {
|
||||||
* This is what switches between the saved views and the document list view. Everything on the document list uses
|
if (closeCurrentView) {
|
||||||
* this property to determine the settings for the currently displayed document list.
|
this._activeSavedViewId = null
|
||||||
*/
|
}
|
||||||
get view() {
|
this.activeListViewState.filterRules = cloneFilterRules(view.filter_rules)
|
||||||
return this.savedView || this.documentListView
|
this.activeListViewState.sortField = view.sort_field
|
||||||
}
|
this.activeListViewState.sortReverse = view.sort_reverse
|
||||||
|
if (this._activeSavedViewId) {
|
||||||
load(view: PaperlessSavedView) {
|
this.activeListViewState.title = view.name
|
||||||
this.documentListView.filter_rules = cloneFilterRules(view.filter_rules)
|
}
|
||||||
this.documentListView.sort_reverse = view.sort_reverse
|
this.reduceSelectionToFilter()
|
||||||
this.documentListView.sort_field = view.sort_field
|
|
||||||
this.saveDocumentListView()
|
|
||||||
}
|
|
||||||
|
|
||||||
clear() {
|
|
||||||
this.collectionSize = null
|
|
||||||
this.documents = []
|
|
||||||
this.currentPage = 1
|
|
||||||
}
|
}
|
||||||
|
|
||||||
reload(onFinish?) {
|
reload(onFinish?) {
|
||||||
this.isReloading = true
|
this.isReloading = true
|
||||||
|
let activeListViewState = this.activeListViewState
|
||||||
|
|
||||||
this.documentService.listFiltered(
|
this.documentService.listFiltered(
|
||||||
this.currentPage,
|
activeListViewState.currentPage,
|
||||||
this.currentPageSize,
|
this.currentPageSize,
|
||||||
this.view.sort_field,
|
activeListViewState.sortField,
|
||||||
this.view.sort_reverse,
|
activeListViewState.sortReverse,
|
||||||
this.view.filter_rules).subscribe(
|
activeListViewState.filterRules).subscribe(
|
||||||
result => {
|
result => {
|
||||||
this.collectionSize = result.count
|
this.isReloading = false
|
||||||
this.documents = result.results
|
activeListViewState.collectionSize = result.count
|
||||||
|
activeListViewState.documents = result.results
|
||||||
if (onFinish) {
|
if (onFinish) {
|
||||||
onFinish()
|
onFinish()
|
||||||
}
|
}
|
||||||
this.rangeSelectionAnchorIndex = this.lastRangeSelectionToIndex = null
|
this.rangeSelectionAnchorIndex = this.lastRangeSelectionToIndex = null
|
||||||
this.isReloading = false
|
|
||||||
},
|
},
|
||||||
error => {
|
error => {
|
||||||
if (this.currentPage != 1 && error.status == 404) {
|
this.isReloading = false
|
||||||
|
if (activeListViewState.currentPage != 1 && error.status == 404) {
|
||||||
// this happens when applying a filter: the current page might not be available anymore due to the reduced result set.
|
// this happens when applying a filter: the current page might not be available anymore due to the reduced result set.
|
||||||
this.currentPage = 1
|
activeListViewState.currentPage = 1
|
||||||
this.reload()
|
this.reload()
|
||||||
}
|
}
|
||||||
this.isReloading = false
|
|
||||||
})
|
})
|
||||||
}
|
}
|
||||||
|
|
||||||
set filterRules(filterRules: FilterRule[]) {
|
set filterRules(filterRules: FilterRule[]) {
|
||||||
//we're going to clone the filterRules object, since we don't
|
this.activeListViewState.filterRules = filterRules
|
||||||
//want changes in the filter editor to propagate into here right away.
|
|
||||||
this.view.filter_rules = filterRules
|
|
||||||
this.reload()
|
this.reload()
|
||||||
this.reduceSelectionToFilter()
|
this.reduceSelectionToFilter()
|
||||||
this.saveDocumentListView()
|
this.saveDocumentListView()
|
||||||
}
|
}
|
||||||
|
|
||||||
get filterRules(): FilterRule[] {
|
get filterRules(): FilterRule[] {
|
||||||
return this.view.filter_rules
|
return this.activeListViewState.filterRules
|
||||||
}
|
}
|
||||||
|
|
||||||
set sortField(field: string) {
|
set sortField(field: string) {
|
||||||
this.view.sort_field = field
|
this.activeListViewState.sortField = field
|
||||||
this.saveDocumentListView()
|
|
||||||
this.reload()
|
this.reload()
|
||||||
|
this.saveDocumentListView()
|
||||||
}
|
}
|
||||||
|
|
||||||
get sortField(): string {
|
get sortField(): string {
|
||||||
return this.view.sort_field
|
return this.activeListViewState.sortField
|
||||||
}
|
}
|
||||||
|
|
||||||
set sortReverse(reverse: boolean) {
|
set sortReverse(reverse: boolean) {
|
||||||
this.view.sort_reverse = reverse
|
this.activeListViewState.sortReverse = reverse
|
||||||
this.saveDocumentListView()
|
|
||||||
this.reload()
|
this.reload()
|
||||||
|
this.saveDocumentListView()
|
||||||
}
|
}
|
||||||
|
|
||||||
get sortReverse(): boolean {
|
get sortReverse(): boolean {
|
||||||
return this.view.sort_reverse
|
return this.activeListViewState.sortReverse
|
||||||
|
}
|
||||||
|
|
||||||
|
get collectionSize(): number {
|
||||||
|
return this.activeListViewState.collectionSize
|
||||||
|
}
|
||||||
|
|
||||||
|
get currentPage(): number {
|
||||||
|
return this.activeListViewState.currentPage
|
||||||
|
}
|
||||||
|
|
||||||
|
set currentPage(page: number) {
|
||||||
|
this.activeListViewState.currentPage = page
|
||||||
|
this.reload()
|
||||||
|
this.saveDocumentListView()
|
||||||
|
}
|
||||||
|
|
||||||
|
get documents(): PaperlessDocument[] {
|
||||||
|
return this.activeListViewState.documents
|
||||||
|
}
|
||||||
|
|
||||||
|
get selected(): Set<number> {
|
||||||
|
return this.activeListViewState.selected
|
||||||
}
|
}
|
||||||
|
|
||||||
setSort(field: string, reverse: boolean) {
|
setSort(field: string, reverse: boolean) {
|
||||||
this.view.sort_field = field
|
this.activeListViewState.sortField = field
|
||||||
this.view.sort_reverse = reverse
|
this.activeListViewState.sortReverse = reverse
|
||||||
this.saveDocumentListView()
|
|
||||||
this.reload()
|
this.reload()
|
||||||
|
this.saveDocumentListView()
|
||||||
}
|
}
|
||||||
|
|
||||||
private saveDocumentListView() {
|
private saveDocumentListView() {
|
||||||
sessionStorage.setItem(DOCUMENT_LIST_SERVICE.CURRENT_VIEW_CONFIG, JSON.stringify(this.documentListView))
|
if (this._activeSavedViewId == null) {
|
||||||
|
let savedState: ListViewState = {
|
||||||
|
collectionSize: this.activeListViewState.collectionSize,
|
||||||
|
currentPage: this.activeListViewState.currentPage,
|
||||||
|
filterRules: this.activeListViewState.filterRules,
|
||||||
|
sortField: this.activeListViewState.sortField,
|
||||||
|
sortReverse: this.activeListViewState.sortReverse
|
||||||
|
}
|
||||||
|
sessionStorage.setItem(DOCUMENT_LIST_SERVICE.CURRENT_VIEW_CONFIG, JSON.stringify(savedState))
|
||||||
|
}
|
||||||
}
|
}
|
||||||
|
|
||||||
quickFilter(filterRules: FilterRule[]) {
|
quickFilter(filterRules: FilterRule[]) {
|
||||||
this.savedView = null
|
this._activeSavedViewId = null
|
||||||
this.view.filter_rules = filterRules
|
this.activeListViewState.filterRules = filterRules
|
||||||
|
this.activeListViewState.currentPage = 1
|
||||||
this.reduceSelectionToFilter()
|
this.reduceSelectionToFilter()
|
||||||
this.saveDocumentListView()
|
this.saveDocumentListView()
|
||||||
this.router.navigate(["documents"])
|
this.router.navigate(["documents"])
|
||||||
@@ -217,8 +252,6 @@ export class DocumentListViewService {
|
|||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
|
||||||
selected = new Set<number>()
|
|
||||||
|
|
||||||
selectNone() {
|
selectNone() {
|
||||||
this.selected.clear()
|
this.selected.clear()
|
||||||
this.rangeSelectionAnchorIndex = this.lastRangeSelectionToIndex = null
|
this.rangeSelectionAnchorIndex = this.lastRangeSelectionToIndex = null
|
||||||
@@ -227,13 +260,11 @@ export class DocumentListViewService {
|
|||||||
reduceSelectionToFilter() {
|
reduceSelectionToFilter() {
|
||||||
if (this.selected.size > 0) {
|
if (this.selected.size > 0) {
|
||||||
this.documentService.listAllFilteredIds(this.filterRules).subscribe(ids => {
|
this.documentService.listAllFilteredIds(this.filterRules).subscribe(ids => {
|
||||||
let subset = new Set<number>()
|
for (let id of this.selected) {
|
||||||
for (let id of ids) {
|
if (!ids.includes(id)) {
|
||||||
if (this.selected.has(id)) {
|
this.selected.delete(id)
|
||||||
subset.add(id)
|
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
this.selected = subset
|
|
||||||
})
|
})
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
@@ -287,20 +318,21 @@ export class DocumentListViewService {
|
|||||||
}
|
}
|
||||||
|
|
||||||
constructor(private documentService: DocumentService, private settings: SettingsService, private router: Router) {
|
constructor(private documentService: DocumentService, private settings: SettingsService, private router: Router) {
|
||||||
let documentListViewConfigJson = sessionStorage.getItem(DOCUMENT_LIST_SERVICE.CURRENT_VIEW_CONFIG)
|
let documentListViewConfigJson = sessionStorage.getItem(DOCUMENT_LIST_SERVICE.CURRENT_VIEW_CONFIG)
|
||||||
if (documentListViewConfigJson) {
|
if (documentListViewConfigJson) {
|
||||||
try {
|
try {
|
||||||
this.documentListView = JSON.parse(documentListViewConfigJson)
|
let savedState: ListViewState = JSON.parse(documentListViewConfigJson)
|
||||||
|
// Remove null elements from the restored state
|
||||||
|
Object.keys(savedState).forEach(k => {
|
||||||
|
if (savedState[k] == null) {
|
||||||
|
delete savedState[k]
|
||||||
|
}
|
||||||
|
})
|
||||||
|
//only use restored state attributes instead of defaults if they are not null
|
||||||
|
let newState = Object.assign(this.defaultListViewState(), savedState)
|
||||||
|
this.listViewStates.set(null, newState)
|
||||||
} catch (e) {
|
} catch (e) {
|
||||||
sessionStorage.removeItem(DOCUMENT_LIST_SERVICE.CURRENT_VIEW_CONFIG)
|
sessionStorage.removeItem(DOCUMENT_LIST_SERVICE.CURRENT_VIEW_CONFIG)
|
||||||
this.documentListView = null
|
|
||||||
}
|
|
||||||
}
|
|
||||||
if (!this.documentListView || this.documentListView.filter_rules == null || this.documentListView.sort_reverse == null || this.documentListView.sort_field == null) {
|
|
||||||
this.documentListView = {
|
|
||||||
filter_rules: [],
|
|
||||||
sort_reverse: true,
|
|
||||||
sort_field: 'created'
|
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
@@ -134,4 +134,8 @@ export class DocumentService extends AbstractPaperlessService<PaperlessDocument>
|
|||||||
return this.http.get<PaperlessDocumentSuggestions>(this.getResourceUrl(id, 'suggestions'))
|
return this.http.get<PaperlessDocumentSuggestions>(this.getResourceUrl(id, 'suggestions'))
|
||||||
}
|
}
|
||||||
|
|
||||||
|
bulkDownload(ids: number[], content="both") {
|
||||||
|
return this.http.post(this.getResourceUrl(null, 'bulk_download'), {"documents": ids, "content": content}, { responseType: 'blob' })
|
||||||
|
}
|
||||||
|
|
||||||
}
|
}
|
||||||
|
@@ -79,7 +79,8 @@ export class SettingsService {
|
|||||||
|
|
||||||
getLanguageOptions(): LanguageOption[] {
|
getLanguageOptions(): LanguageOption[] {
|
||||||
return [
|
return [
|
||||||
{code: "en-US", name: $localize`English (US)`, englishName: "English (US)"},
|
{code: "en-us", name: $localize`English (US)`, englishName: "English (US)"},
|
||||||
|
{code: "en-gb", name: $localize`English (GB)`, englishName: "English (GB)"},
|
||||||
{code: "de", name: $localize`German`, englishName: "German"},
|
{code: "de", name: $localize`German`, englishName: "German"},
|
||||||
{code: "nl", name: $localize`Dutch`, englishName: "Dutch"},
|
{code: "nl", name: $localize`Dutch`, englishName: "Dutch"},
|
||||||
{code: "fr", name: $localize`French`, englishName: "French"}
|
{code: "fr", name: $localize`French`, englishName: "French"}
|
||||||
|
@@ -2,7 +2,7 @@ export const environment = {
|
|||||||
production: true,
|
production: true,
|
||||||
apiBaseUrl: "/api/",
|
apiBaseUrl: "/api/",
|
||||||
appTitle: "Paperless-ng",
|
appTitle: "Paperless-ng",
|
||||||
version: "1.1.2",
|
version: "1.2.0",
|
||||||
webSocketHost: window.location.host,
|
webSocketHost: window.location.host,
|
||||||
webSocketProtocol: (window.location.protocol == "https:" ? "wss:" : "ws:")
|
webSocketProtocol: (window.location.protocol == "https:" ? "wss:" : "ws:")
|
||||||
};
|
};
|
||||||
|
@@ -58,11 +58,11 @@
|
|||||||
</context-group>
|
</context-group>
|
||||||
</trans-unit>
|
</trans-unit>
|
||||||
<trans-unit datatype="html" id="2155249406916744630">
|
<trans-unit datatype="html" id="2155249406916744630">
|
||||||
<source>View "<x equiv-text="this.list.savedView.name" id="PH"/>" saved successfully.</source>
|
<source>View "<x equiv-text="this.list.activeSavedViewTitle" id="PH"/>" saved successfully.</source>
|
||||||
<target>Ansicht "<x equiv-text="this.list.savedView.name" id="PH"/>" erfolgreich gespeichert.</target>
|
<target>Ansicht "<x equiv-text="this.list.activeSavedViewTitle" id="PH"/>" erfolgreich gespeichert.</target>
|
||||||
<context-group purpose="location">
|
<context-group purpose="location">
|
||||||
<context context-type="sourcefile">src/app/components/document-list/document-list.component.ts</context>
|
<context context-type="sourcefile">src/app/components/document-list/document-list.component.ts</context>
|
||||||
<context context-type="linenumber">109</context>
|
<context context-type="linenumber">115</context>
|
||||||
</context-group>
|
</context-group>
|
||||||
</trans-unit>
|
</trans-unit>
|
||||||
<trans-unit datatype="html" id="6837554170707123455">
|
<trans-unit datatype="html" id="6837554170707123455">
|
||||||
@@ -70,7 +70,7 @@
|
|||||||
<target>Ansicht "<x equiv-text="savedView.name" id="PH"/>" erfolgreich erstellt.</target>
|
<target>Ansicht "<x equiv-text="savedView.name" id="PH"/>" erfolgreich erstellt.</target>
|
||||||
<context-group purpose="location">
|
<context-group purpose="location">
|
||||||
<context context-type="sourcefile">src/app/components/document-list/document-list.component.ts</context>
|
<context context-type="sourcefile">src/app/components/document-list/document-list.component.ts</context>
|
||||||
<context context-type="linenumber">130</context>
|
<context context-type="linenumber">136</context>
|
||||||
</context-group>
|
</context-group>
|
||||||
</trans-unit>
|
</trans-unit>
|
||||||
<trans-unit datatype="html" id="9ca82952a6bc860b5391d5975322d8af8ceddfa4">
|
<trans-unit datatype="html" id="9ca82952a6bc860b5391d5975322d8af8ceddfa4">
|
||||||
@@ -129,9 +129,9 @@
|
|||||||
<context context-type="linenumber">72</context>
|
<context context-type="linenumber">72</context>
|
||||||
</context-group>
|
</context-group>
|
||||||
</trans-unit>
|
</trans-unit>
|
||||||
<trans-unit datatype="html" id="72e7d343f9165602cce1ca7faffbc565fd31ef92">
|
<trans-unit datatype="html" id="5f5ce787c428d917c30c9bd70789a618e09743a7">
|
||||||
<source>Save "<x equiv-text="{{list.savedViewTitle}}" id="INTERPOLATION"/>"</source>
|
<source>Save "<x equiv-text="{{list.activeSavedViewTitle}}" id="INTERPOLATION"/>"</source>
|
||||||
<target>"<x equiv-text="{{list.savedViewTitle}}" id="INTERPOLATION"/>" speichern</target>
|
<target>"<x equiv-text="{{list.activeSavedViewTitle}}" id="INTERPOLATION"/>" speichern</target>
|
||||||
<context-group purpose="location">
|
<context-group purpose="location">
|
||||||
<context context-type="sourcefile">src/app/components/document-list/document-list.component.html</context>
|
<context context-type="sourcefile">src/app/components/document-list/document-list.component.html</context>
|
||||||
<context context-type="linenumber">71</context>
|
<context context-type="linenumber">71</context>
|
||||||
@@ -585,14 +585,6 @@
|
|||||||
<context context-type="linenumber">1</context>
|
<context context-type="linenumber">1</context>
|
||||||
</context-group>
|
</context-group>
|
||||||
</trans-unit>
|
</trans-unit>
|
||||||
<trans-unit datatype="html" id="5ca707824ab93066c7d9b44e1b8bf216725c2c22">
|
|
||||||
<source>Filter</source>
|
|
||||||
<target>Filtern</target>
|
|
||||||
<context-group purpose="location">
|
|
||||||
<context context-type="sourcefile">src/app/components/manage/logs/logs.component.html</context>
|
|
||||||
<context context-type="linenumber">7</context>
|
|
||||||
</context-group>
|
|
||||||
</trans-unit>
|
|
||||||
<trans-unit datatype="html" id="5610279464668232148">
|
<trans-unit datatype="html" id="5610279464668232148">
|
||||||
<source>Saved view "<x equiv-text="savedView.name" id="PH"/>" deleted.</source>
|
<source>Saved view "<x equiv-text="savedView.name" id="PH"/>" deleted.</source>
|
||||||
<target>Gespeicherte Ansicht "<x equiv-text="savedView.name" id="PH"/>" gelöscht.</target>
|
<target>Gespeicherte Ansicht "<x equiv-text="savedView.name" id="PH"/>" gelöscht.</target>
|
||||||
@@ -622,7 +614,15 @@
|
|||||||
<target>Benutze Datumsformat der Anzeigesprache</target>
|
<target>Benutze Datumsformat der Anzeigesprache</target>
|
||||||
<context-group purpose="location">
|
<context-group purpose="location">
|
||||||
<context context-type="sourcefile">src/app/components/manage/settings/settings.component.ts</context>
|
<context context-type="sourcefile">src/app/components/manage/settings/settings.component.ts</context>
|
||||||
<context context-type="linenumber">95</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-group>
|
</context-group>
|
||||||
</trans-unit>
|
</trans-unit>
|
||||||
<trans-unit datatype="html" id="8488620293789898901">
|
<trans-unit datatype="html" id="8488620293789898901">
|
||||||
@@ -630,7 +630,7 @@
|
|||||||
<target>Fehler beim Speichern der Einstellungen auf dem Server: <x equiv-text="JSON.stringify(error.error)" id="PH"/></target>
|
<target>Fehler beim Speichern der Einstellungen auf dem Server: <x equiv-text="JSON.stringify(error.error)" id="PH"/></target>
|
||||||
<context-group purpose="location">
|
<context-group purpose="location">
|
||||||
<context context-type="sourcefile">src/app/components/manage/settings/settings.component.ts</context>
|
<context context-type="sourcefile">src/app/components/manage/settings/settings.component.ts</context>
|
||||||
<context context-type="linenumber">111</context>
|
<context context-type="linenumber">114</context>
|
||||||
</context-group>
|
</context-group>
|
||||||
</trans-unit>
|
</trans-unit>
|
||||||
<trans-unit datatype="html" id="121cc5391cd2a5115bc2b3160379ee5b36cd7716">
|
<trans-unit datatype="html" id="121cc5391cd2a5115bc2b3160379ee5b36cd7716">
|
||||||
@@ -1234,6 +1234,14 @@
|
|||||||
<context context-type="linenumber">46</context>
|
<context context-type="linenumber">46</context>
|
||||||
</context-group>
|
</context-group>
|
||||||
</trans-unit>
|
</trans-unit>
|
||||||
|
<trans-unit datatype="html" id="6523384805359286307">
|
||||||
|
<source>Title: <x equiv-text="rule.value" id="PH"/></source>
|
||||||
|
<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-group>
|
||||||
|
</trans-unit>
|
||||||
<trans-unit datatype="html" id="02d184c288f567825a1fcbf83bcd3099a10853d5">
|
<trans-unit datatype="html" id="02d184c288f567825a1fcbf83bcd3099a10853d5">
|
||||||
<source>Filter tags</source>
|
<source>Filter tags</source>
|
||||||
<target>Tags filtern</target>
|
<target>Tags filtern</target>
|
||||||
@@ -1392,7 +1400,7 @@
|
|||||||
<target>Fehler beim Ausführung der Massenverarbeitung: <x equiv-text="JSON.stringify(error.error)" id="PH"/></target>
|
<target>Fehler beim Ausführung der Massenverarbeitung: <x equiv-text="JSON.stringify(error.error)" id="PH"/></target>
|
||||||
<context-group purpose="location">
|
<context-group purpose="location">
|
||||||
<context context-type="sourcefile">src/app/components/document-list/bulk-editor/bulk-editor.component.ts</context>
|
<context context-type="sourcefile">src/app/components/document-list/bulk-editor/bulk-editor.component.ts</context>
|
||||||
<context context-type="linenumber">73</context>
|
<context context-type="linenumber">74</context>
|
||||||
</context-group>
|
</context-group>
|
||||||
</trans-unit>
|
</trans-unit>
|
||||||
<trans-unit datatype="html" id="7894972847287473517">
|
<trans-unit datatype="html" id="7894972847287473517">
|
||||||
@@ -1400,7 +1408,7 @@
|
|||||||
<target>"<x equiv-text="items[0].name" id="PH"/>"</target>
|
<target>"<x equiv-text="items[0].name" id="PH"/>"</target>
|
||||||
<context-group purpose="location">
|
<context-group purpose="location">
|
||||||
<context context-type="sourcefile">src/app/components/document-list/bulk-editor/bulk-editor.component.ts</context>
|
<context context-type="sourcefile">src/app/components/document-list/bulk-editor/bulk-editor.component.ts</context>
|
||||||
<context context-type="linenumber">112</context>
|
<context context-type="linenumber">113</context>
|
||||||
</context-group>
|
</context-group>
|
||||||
</trans-unit>
|
</trans-unit>
|
||||||
<trans-unit datatype="html" id="8639884465898458690">
|
<trans-unit datatype="html" id="8639884465898458690">
|
||||||
@@ -1408,7 +1416,7 @@
|
|||||||
<target>"<x equiv-text="items[0].name" id="PH"/>" und "<x equiv-text="items[1].name" id="PH_1"/>"</target>
|
<target>"<x equiv-text="items[0].name" id="PH"/>" und "<x equiv-text="items[1].name" id="PH_1"/>"</target>
|
||||||
<context-group purpose="location">
|
<context-group purpose="location">
|
||||||
<context context-type="sourcefile">src/app/components/document-list/bulk-editor/bulk-editor.component.ts</context>
|
<context context-type="sourcefile">src/app/components/document-list/bulk-editor/bulk-editor.component.ts</context>
|
||||||
<context context-type="linenumber">114</context>
|
<context context-type="linenumber">115</context>
|
||||||
</context-group>
|
</context-group>
|
||||||
<note from="description" priority="1">This is for messages like 'modify "tag1" and "tag2"'</note>
|
<note from="description" priority="1">This is for messages like 'modify "tag1" and "tag2"'</note>
|
||||||
</trans-unit>
|
</trans-unit>
|
||||||
@@ -1417,7 +1425,7 @@
|
|||||||
<target>, </target>
|
<target>, </target>
|
||||||
<context-group purpose="location">
|
<context-group purpose="location">
|
||||||
<context context-type="sourcefile">src/app/components/document-list/bulk-editor/bulk-editor.component.ts</context>
|
<context context-type="sourcefile">src/app/components/document-list/bulk-editor/bulk-editor.component.ts</context>
|
||||||
<context context-type="linenumber">116</context>
|
<context context-type="linenumber">117</context>
|
||||||
</context-group>
|
</context-group>
|
||||||
<note from="description" priority="1">this is used to separate enumerations and should probably be a comma and a whitespace in most languages</note>
|
<note from="description" priority="1">this is used to separate enumerations and should probably be a comma and a whitespace in most languages</note>
|
||||||
</trans-unit>
|
</trans-unit>
|
||||||
@@ -1426,7 +1434,7 @@
|
|||||||
<target><x equiv-text="list" id="PH"/> und "<x equiv-text="items[items.length - 1].name" id="PH_1"/>"</target>
|
<target><x equiv-text="list" id="PH"/> und "<x equiv-text="items[items.length - 1].name" id="PH_1"/>"</target>
|
||||||
<context-group purpose="location">
|
<context-group purpose="location">
|
||||||
<context context-type="sourcefile">src/app/components/document-list/bulk-editor/bulk-editor.component.ts</context>
|
<context context-type="sourcefile">src/app/components/document-list/bulk-editor/bulk-editor.component.ts</context>
|
||||||
<context context-type="linenumber">117</context>
|
<context context-type="linenumber">118</context>
|
||||||
</context-group>
|
</context-group>
|
||||||
<note from="description" priority="1">this is for messages like 'modify "tag1", "tag2" and "tag3"'</note>
|
<note from="description" priority="1">this is for messages like 'modify "tag1", "tag2" and "tag3"'</note>
|
||||||
</trans-unit>
|
</trans-unit>
|
||||||
@@ -1435,7 +1443,7 @@
|
|||||||
<target>Tag-Zuweisung bestätigen</target>
|
<target>Tag-Zuweisung bestätigen</target>
|
||||||
<context-group purpose="location">
|
<context-group purpose="location">
|
||||||
<context context-type="sourcefile">src/app/components/document-list/bulk-editor/bulk-editor.component.ts</context>
|
<context context-type="sourcefile">src/app/components/document-list/bulk-editor/bulk-editor.component.ts</context>
|
||||||
<context context-type="linenumber">126</context>
|
<context context-type="linenumber">127</context>
|
||||||
</context-group>
|
</context-group>
|
||||||
</trans-unit>
|
</trans-unit>
|
||||||
<trans-unit datatype="html" id="6619516195038467207">
|
<trans-unit datatype="html" id="6619516195038467207">
|
||||||
@@ -1443,7 +1451,7 @@
|
|||||||
<target>Diese Aktion wird <x equiv-text="this.list.selected.size" id="PH_1"/> ausgewählten Dokumenten das Tag "<x equiv-text="tag.name" id="PH"/>" hinzufügen.</target>
|
<target>Diese Aktion wird <x equiv-text="this.list.selected.size" id="PH_1"/> ausgewählten Dokumenten das Tag "<x equiv-text="tag.name" id="PH"/>" hinzufügen.</target>
|
||||||
<context-group purpose="location">
|
<context-group purpose="location">
|
||||||
<context context-type="sourcefile">src/app/components/document-list/bulk-editor/bulk-editor.component.ts</context>
|
<context context-type="sourcefile">src/app/components/document-list/bulk-editor/bulk-editor.component.ts</context>
|
||||||
<context context-type="linenumber">129</context>
|
<context context-type="linenumber">130</context>
|
||||||
</context-group>
|
</context-group>
|
||||||
</trans-unit>
|
</trans-unit>
|
||||||
<trans-unit datatype="html" id="1894412783609570695">
|
<trans-unit datatype="html" id="1894412783609570695">
|
||||||
@@ -1451,7 +1459,7 @@
|
|||||||
<target>Diese Aktion wird <x equiv-text="this.list.selected.size" id="PH_1"/> ausgewählten Dokumenten die Tags <x equiv-text="this._localizeList(changedTags.itemsToAdd)" id="PH"/> hinzufügen.</target>
|
<target>Diese Aktion wird <x equiv-text="this.list.selected.size" id="PH_1"/> ausgewählten Dokumenten die Tags <x equiv-text="this._localizeList(changedTags.itemsToAdd)" id="PH"/> hinzufügen.</target>
|
||||||
<context-group purpose="location">
|
<context-group purpose="location">
|
||||||
<context context-type="sourcefile">src/app/components/document-list/bulk-editor/bulk-editor.component.ts</context>
|
<context context-type="sourcefile">src/app/components/document-list/bulk-editor/bulk-editor.component.ts</context>
|
||||||
<context context-type="linenumber">131</context>
|
<context context-type="linenumber">132</context>
|
||||||
</context-group>
|
</context-group>
|
||||||
</trans-unit>
|
</trans-unit>
|
||||||
<trans-unit datatype="html" id="7181166515756808573">
|
<trans-unit datatype="html" id="7181166515756808573">
|
||||||
@@ -1459,7 +1467,7 @@
|
|||||||
<target>Diese Aktion wird das Tag "<x equiv-text="tag.name" id="PH"/>" von <x equiv-text="this.list.selected.size" id="PH_1"/> ausgewählten Dokumenten entfernen.</target>
|
<target>Diese Aktion wird das Tag "<x equiv-text="tag.name" id="PH"/>" von <x equiv-text="this.list.selected.size" id="PH_1"/> ausgewählten Dokumenten entfernen.</target>
|
||||||
<context-group purpose="location">
|
<context-group purpose="location">
|
||||||
<context context-type="sourcefile">src/app/components/document-list/bulk-editor/bulk-editor.component.ts</context>
|
<context context-type="sourcefile">src/app/components/document-list/bulk-editor/bulk-editor.component.ts</context>
|
||||||
<context context-type="linenumber">134</context>
|
<context context-type="linenumber">135</context>
|
||||||
</context-group>
|
</context-group>
|
||||||
</trans-unit>
|
</trans-unit>
|
||||||
<trans-unit datatype="html" id="3819792277998068944">
|
<trans-unit datatype="html" id="3819792277998068944">
|
||||||
@@ -1467,7 +1475,7 @@
|
|||||||
<target>Diese Aktion wird die Tags <x equiv-text="this._localizeList(changedTags.itemsToRemove)" id="PH"/> von <x equiv-text="this.list.selected.size" id="PH_1"/> ausgewählten Dokumenten entfernen.</target>
|
<target>Diese Aktion wird die Tags <x equiv-text="this._localizeList(changedTags.itemsToRemove)" id="PH"/> von <x equiv-text="this.list.selected.size" id="PH_1"/> ausgewählten Dokumenten entfernen.</target>
|
||||||
<context-group purpose="location">
|
<context-group purpose="location">
|
||||||
<context context-type="sourcefile">src/app/components/document-list/bulk-editor/bulk-editor.component.ts</context>
|
<context context-type="sourcefile">src/app/components/document-list/bulk-editor/bulk-editor.component.ts</context>
|
||||||
<context context-type="linenumber">136</context>
|
<context context-type="linenumber">137</context>
|
||||||
</context-group>
|
</context-group>
|
||||||
</trans-unit>
|
</trans-unit>
|
||||||
<trans-unit datatype="html" id="2739066218579571288">
|
<trans-unit datatype="html" id="2739066218579571288">
|
||||||
@@ -1475,7 +1483,7 @@
|
|||||||
<target>Diese Aktion wird die Tags <x equiv-text="this._localizeList(changedTags.itemsToAdd)" id="PH"/> den <x equiv-text="this.list.selected.size" id="PH_2"/> ausgewählten Dokumenten hinzufügen und die Tags <x equiv-text="this._localizeList(changedTags.itemsToRemove)" id="PH_1"/> entfernen.</target>
|
<target>Diese Aktion wird die Tags <x equiv-text="this._localizeList(changedTags.itemsToAdd)" id="PH"/> den <x equiv-text="this.list.selected.size" id="PH_2"/> ausgewählten Dokumenten hinzufügen und die Tags <x equiv-text="this._localizeList(changedTags.itemsToRemove)" id="PH_1"/> entfernen.</target>
|
||||||
<context-group purpose="location">
|
<context-group purpose="location">
|
||||||
<context context-type="sourcefile">src/app/components/document-list/bulk-editor/bulk-editor.component.ts</context>
|
<context context-type="sourcefile">src/app/components/document-list/bulk-editor/bulk-editor.component.ts</context>
|
||||||
<context context-type="linenumber">138</context>
|
<context context-type="linenumber">139</context>
|
||||||
</context-group>
|
</context-group>
|
||||||
</trans-unit>
|
</trans-unit>
|
||||||
<trans-unit datatype="html" id="2996713129519325161">
|
<trans-unit datatype="html" id="2996713129519325161">
|
||||||
@@ -1483,7 +1491,7 @@
|
|||||||
<target>Korrespondent-Zuweisung bestätigen</target>
|
<target>Korrespondent-Zuweisung bestätigen</target>
|
||||||
<context-group purpose="location">
|
<context-group purpose="location">
|
||||||
<context context-type="sourcefile">src/app/components/document-list/bulk-editor/bulk-editor.component.ts</context>
|
<context context-type="sourcefile">src/app/components/document-list/bulk-editor/bulk-editor.component.ts</context>
|
||||||
<context context-type="linenumber">158</context>
|
<context context-type="linenumber">159</context>
|
||||||
</context-group>
|
</context-group>
|
||||||
</trans-unit>
|
</trans-unit>
|
||||||
<trans-unit datatype="html" id="6900893559485781849">
|
<trans-unit datatype="html" id="6900893559485781849">
|
||||||
@@ -1491,7 +1499,7 @@
|
|||||||
<target>Diese Aktion wird <x equiv-text="this.list.selected.size" id="PH_1"/> ausgewählten Dokumenten den Korrespondent "<x equiv-text="correspondent.name" id="PH"/>" zuweisen.</target>
|
<target>Diese Aktion wird <x equiv-text="this.list.selected.size" id="PH_1"/> ausgewählten Dokumenten den Korrespondent "<x equiv-text="correspondent.name" id="PH"/>" zuweisen.</target>
|
||||||
<context-group purpose="location">
|
<context-group purpose="location">
|
||||||
<context context-type="sourcefile">src/app/components/document-list/bulk-editor/bulk-editor.component.ts</context>
|
<context context-type="sourcefile">src/app/components/document-list/bulk-editor/bulk-editor.component.ts</context>
|
||||||
<context context-type="linenumber">160</context>
|
<context context-type="linenumber">161</context>
|
||||||
</context-group>
|
</context-group>
|
||||||
</trans-unit>
|
</trans-unit>
|
||||||
<trans-unit datatype="html" id="1257522660364398440">
|
<trans-unit datatype="html" id="1257522660364398440">
|
||||||
@@ -1499,7 +1507,7 @@
|
|||||||
<target>Diese Aktion wird bei <x equiv-text="this.list.selected.size" id="PH"/> ausgewählten Dokumenten den Korrespondent entfernen.</target>
|
<target>Diese Aktion wird bei <x equiv-text="this.list.selected.size" id="PH"/> ausgewählten Dokumenten den Korrespondent entfernen.</target>
|
||||||
<context-group purpose="location">
|
<context-group purpose="location">
|
||||||
<context context-type="sourcefile">src/app/components/document-list/bulk-editor/bulk-editor.component.ts</context>
|
<context context-type="sourcefile">src/app/components/document-list/bulk-editor/bulk-editor.component.ts</context>
|
||||||
<context context-type="linenumber">162</context>
|
<context context-type="linenumber">163</context>
|
||||||
</context-group>
|
</context-group>
|
||||||
</trans-unit>
|
</trans-unit>
|
||||||
<trans-unit datatype="html" id="5393409374423140648">
|
<trans-unit datatype="html" id="5393409374423140648">
|
||||||
@@ -1507,7 +1515,7 @@
|
|||||||
<target>Dokumenttyp-Zuweisung bestätigen</target>
|
<target>Dokumenttyp-Zuweisung bestätigen</target>
|
||||||
<context-group purpose="location">
|
<context-group purpose="location">
|
||||||
<context context-type="sourcefile">src/app/components/document-list/bulk-editor/bulk-editor.component.ts</context>
|
<context context-type="sourcefile">src/app/components/document-list/bulk-editor/bulk-editor.component.ts</context>
|
||||||
<context context-type="linenumber">181</context>
|
<context context-type="linenumber">182</context>
|
||||||
</context-group>
|
</context-group>
|
||||||
</trans-unit>
|
</trans-unit>
|
||||||
<trans-unit datatype="html" id="332180123895325027">
|
<trans-unit datatype="html" id="332180123895325027">
|
||||||
@@ -1515,7 +1523,7 @@
|
|||||||
<target>Diese Aktion wird <x equiv-text="this.list.selected.size" id="PH_1"/> ausgewählten Dokumenten den Dokumenttyp "<x equiv-text="correspondent.name" id="PH"/>" zuweisen.</target>
|
<target>Diese Aktion wird <x equiv-text="this.list.selected.size" id="PH_1"/> ausgewählten Dokumenten den Dokumenttyp "<x equiv-text="correspondent.name" id="PH"/>" zuweisen.</target>
|
||||||
<context-group purpose="location">
|
<context-group purpose="location">
|
||||||
<context context-type="sourcefile">src/app/components/document-list/bulk-editor/bulk-editor.component.ts</context>
|
<context context-type="sourcefile">src/app/components/document-list/bulk-editor/bulk-editor.component.ts</context>
|
||||||
<context context-type="linenumber">183</context>
|
<context context-type="linenumber">184</context>
|
||||||
</context-group>
|
</context-group>
|
||||||
</trans-unit>
|
</trans-unit>
|
||||||
<trans-unit datatype="html" id="2236642492594872779">
|
<trans-unit datatype="html" id="2236642492594872779">
|
||||||
@@ -1523,7 +1531,7 @@
|
|||||||
<target>Diese Aktion wird bei <x equiv-text="this.list.selected.size" id="PH"/> ausgewählten Dokumenten den Dokumenttyp entfernen.</target>
|
<target>Diese Aktion wird bei <x equiv-text="this.list.selected.size" id="PH"/> ausgewählten Dokumenten den Dokumenttyp entfernen.</target>
|
||||||
<context-group purpose="location">
|
<context-group purpose="location">
|
||||||
<context context-type="sourcefile">src/app/components/document-list/bulk-editor/bulk-editor.component.ts</context>
|
<context context-type="sourcefile">src/app/components/document-list/bulk-editor/bulk-editor.component.ts</context>
|
||||||
<context context-type="linenumber">185</context>
|
<context context-type="linenumber">186</context>
|
||||||
</context-group>
|
</context-group>
|
||||||
</trans-unit>
|
</trans-unit>
|
||||||
<trans-unit datatype="html" id="749430623564850405">
|
<trans-unit datatype="html" id="749430623564850405">
|
||||||
@@ -1531,7 +1539,7 @@
|
|||||||
<target>Löschen bestätigen</target>
|
<target>Löschen bestätigen</target>
|
||||||
<context-group purpose="location">
|
<context-group purpose="location">
|
||||||
<context context-type="sourcefile">src/app/components/document-list/bulk-editor/bulk-editor.component.ts</context>
|
<context context-type="sourcefile">src/app/components/document-list/bulk-editor/bulk-editor.component.ts</context>
|
||||||
<context context-type="linenumber">200</context>
|
<context context-type="linenumber">201</context>
|
||||||
</context-group>
|
</context-group>
|
||||||
</trans-unit>
|
</trans-unit>
|
||||||
<trans-unit datatype="html" id="4303174930844518780">
|
<trans-unit datatype="html" id="4303174930844518780">
|
||||||
@@ -1539,7 +1547,7 @@
|
|||||||
<target>Diese Aktion wird <x equiv-text="this.list.selected.size" id="PH"/> ausgewählte Dokumente unwiderruflich löschen.</target>
|
<target>Diese Aktion wird <x equiv-text="this.list.selected.size" id="PH"/> ausgewählte Dokumente unwiderruflich löschen.</target>
|
||||||
<context-group purpose="location">
|
<context-group purpose="location">
|
||||||
<context context-type="sourcefile">src/app/components/document-list/bulk-editor/bulk-editor.component.ts</context>
|
<context context-type="sourcefile">src/app/components/document-list/bulk-editor/bulk-editor.component.ts</context>
|
||||||
<context context-type="linenumber">201</context>
|
<context context-type="linenumber">202</context>
|
||||||
</context-group>
|
</context-group>
|
||||||
</trans-unit>
|
</trans-unit>
|
||||||
<trans-unit datatype="html" id="5641451190833696892">
|
<trans-unit datatype="html" id="5641451190833696892">
|
||||||
@@ -1547,7 +1555,7 @@
|
|||||||
<target>Diese Aktion kann nicht rückgängig gemacht werden.</target>
|
<target>Diese Aktion kann nicht rückgängig gemacht werden.</target>
|
||||||
<context-group purpose="location">
|
<context-group purpose="location">
|
||||||
<context context-type="sourcefile">src/app/components/document-list/bulk-editor/bulk-editor.component.ts</context>
|
<context context-type="sourcefile">src/app/components/document-list/bulk-editor/bulk-editor.component.ts</context>
|
||||||
<context context-type="linenumber">202</context>
|
<context context-type="linenumber">203</context>
|
||||||
</context-group>
|
</context-group>
|
||||||
</trans-unit>
|
</trans-unit>
|
||||||
<trans-unit datatype="html" id="6734339521247847366">
|
<trans-unit datatype="html" id="6734339521247847366">
|
||||||
@@ -1555,7 +1563,7 @@
|
|||||||
<target>Dokument(e) löschen</target>
|
<target>Dokument(e) löschen</target>
|
||||||
<context-group purpose="location">
|
<context-group purpose="location">
|
||||||
<context context-type="sourcefile">src/app/components/document-list/bulk-editor/bulk-editor.component.ts</context>
|
<context context-type="sourcefile">src/app/components/document-list/bulk-editor/bulk-editor.component.ts</context>
|
||||||
<context context-type="linenumber">204</context>
|
<context context-type="linenumber">205</context>
|
||||||
</context-group>
|
</context-group>
|
||||||
</trans-unit>
|
</trans-unit>
|
||||||
<trans-unit datatype="html" id="8b0609df23817024b3bed12beb9b64fc1009f588">
|
<trans-unit datatype="html" id="8b0609df23817024b3bed12beb9b64fc1009f588">
|
||||||
@@ -1582,6 +1590,14 @@
|
|||||||
<context context-type="linenumber">27</context>
|
<context context-type="linenumber">27</context>
|
||||||
</context-group>
|
</context-group>
|
||||||
</trans-unit>
|
</trans-unit>
|
||||||
|
<trans-unit datatype="html" id="fc2de37422d7c4af6686842283cc2afd781b6848">
|
||||||
|
<source>Download originals</source>
|
||||||
|
<target>Originale herunterladen</target>
|
||||||
|
<context-group purpose="location">
|
||||||
|
<context context-type="sourcefile">src/app/components/document-list/bulk-editor/bulk-editor.component.html</context>
|
||||||
|
<context context-type="linenumber">68</context>
|
||||||
|
</context-group>
|
||||||
|
</trans-unit>
|
||||||
<trans-unit datatype="html" id="a1e6c11f20d4bf6e8e6b43e3c6d2561b2080645e">
|
<trans-unit datatype="html" id="a1e6c11f20d4bf6e8e6b43e3c6d2561b2080645e">
|
||||||
<source>Suggestions:</source>
|
<source>Suggestions:</source>
|
||||||
<target>Vorschläge:</target>
|
<target>Vorschläge:</target>
|
||||||
@@ -1614,22 +1630,22 @@
|
|||||||
<context context-type="linenumber">1</context>
|
<context context-type="linenumber">1</context>
|
||||||
</context-group>
|
</context-group>
|
||||||
</trans-unit>
|
</trans-unit>
|
||||||
<trans-unit datatype="html" id="46c8fe557cf52c9389783627d4f85453f4ddb459">
|
<trans-unit datatype="html" id="c0d907c2687c09612395aee6ef7c04ca8e5e5e0a">
|
||||||
<source>Documents in inbox: <x equiv-text="{{statistics.documents_inbox}}" id="INTERPOLATION"/></source>
|
<source>Total documents: <x equiv-text="{{statistics?.documents_total}}" id="INTERPOLATION"/></source>
|
||||||
<target>Dokumente im Posteingang: <x equiv-text="{{statistics.documents_inbox}}" id="INTERPOLATION"/></target>
|
<target>Anzahl Dokumente gesamt: <x equiv-text="{{statistics?.documents_total}}" id="INTERPOLATION"/></target>
|
||||||
<context-group purpose="location">
|
|
||||||
<context context-type="sourcefile">src/app/components/dashboard/widgets/statistics-widget/statistics-widget.component.html</context>
|
|
||||||
<context context-type="linenumber">3</context>
|
|
||||||
</context-group>
|
|
||||||
</trans-unit>
|
|
||||||
<trans-unit datatype="html" id="c327c0e67bcac7494dcbaa9afb3b42d5008c6438">
|
|
||||||
<source>Total documents: <x equiv-text="{{statistics.documents_total}}" id="INTERPOLATION"/></source>
|
|
||||||
<target>Anzahl Dokumente gesamt: <x equiv-text="{{statistics.documents_total}}" id="INTERPOLATION"/></target>
|
|
||||||
<context-group purpose="location">
|
<context-group purpose="location">
|
||||||
<context context-type="sourcefile">src/app/components/dashboard/widgets/statistics-widget/statistics-widget.component.html</context>
|
<context context-type="sourcefile">src/app/components/dashboard/widgets/statistics-widget/statistics-widget.component.html</context>
|
||||||
<context context-type="linenumber">4</context>
|
<context context-type="linenumber">4</context>
|
||||||
</context-group>
|
</context-group>
|
||||||
</trans-unit>
|
</trans-unit>
|
||||||
|
<trans-unit datatype="html" id="13e8d49dbcad9f9d71e66a9a56d6f328cff430c9">
|
||||||
|
<source>Documents in inbox: <x equiv-text="{{statistics?.documents_inbox}}" id="INTERPOLATION"/></source>
|
||||||
|
<target>Dokumente im Posteingang: <x equiv-text="{{statistics?.documents_inbox}}" id="INTERPOLATION"/></target>
|
||||||
|
<context-group purpose="location">
|
||||||
|
<context context-type="sourcefile">src/app/components/dashboard/widgets/statistics-widget/statistics-widget.component.html</context>
|
||||||
|
<context context-type="linenumber">3</context>
|
||||||
|
</context-group>
|
||||||
|
</trans-unit>
|
||||||
<trans-unit datatype="html" id="6443586946875325554">
|
<trans-unit datatype="html" id="6443586946875325554">
|
||||||
<source>Processing: <x equiv-text="countUploadingAndProcessing" id="PH"/></source>
|
<source>Processing: <x equiv-text="countUploadingAndProcessing" id="PH"/></source>
|
||||||
<target>Verarbeite: <x equiv-text="countUploadingAndProcessing" id="PH"/></target>
|
<target>Verarbeite: <x equiv-text="countUploadingAndProcessing" id="PH"/></target>
|
||||||
@@ -1848,12 +1864,20 @@
|
|||||||
<context context-type="linenumber">82</context>
|
<context context-type="linenumber">82</context>
|
||||||
</context-group>
|
</context-group>
|
||||||
</trans-unit>
|
</trans-unit>
|
||||||
|
<trans-unit datatype="html" id="6987083569809053351">
|
||||||
|
<source>English (GB)</source>
|
||||||
|
<target>Englisch (UK)</target>
|
||||||
|
<context-group purpose="location">
|
||||||
|
<context context-type="sourcefile">src/app/services/settings.service.ts</context>
|
||||||
|
<context context-type="linenumber">83</context>
|
||||||
|
</context-group>
|
||||||
|
</trans-unit>
|
||||||
<trans-unit datatype="html" id="1858110241312746425">
|
<trans-unit datatype="html" id="1858110241312746425">
|
||||||
<source>German</source>
|
<source>German</source>
|
||||||
<target>Deutsch</target>
|
<target>Deutsch</target>
|
||||||
<context-group purpose="location">
|
<context-group purpose="location">
|
||||||
<context context-type="sourcefile">src/app/services/settings.service.ts</context>
|
<context context-type="sourcefile">src/app/services/settings.service.ts</context>
|
||||||
<context context-type="linenumber">83</context>
|
<context context-type="linenumber">84</context>
|
||||||
</context-group>
|
</context-group>
|
||||||
</trans-unit>
|
</trans-unit>
|
||||||
<trans-unit datatype="html" id="3071065188816255493">
|
<trans-unit datatype="html" id="3071065188816255493">
|
||||||
@@ -1861,7 +1885,7 @@
|
|||||||
<target>Niederländisch</target>
|
<target>Niederländisch</target>
|
||||||
<context-group purpose="location">
|
<context-group purpose="location">
|
||||||
<context context-type="sourcefile">src/app/services/settings.service.ts</context>
|
<context context-type="sourcefile">src/app/services/settings.service.ts</context>
|
||||||
<context context-type="linenumber">84</context>
|
<context context-type="linenumber">85</context>
|
||||||
</context-group>
|
</context-group>
|
||||||
</trans-unit>
|
</trans-unit>
|
||||||
<trans-unit datatype="html" id="7633754075223722162">
|
<trans-unit datatype="html" id="7633754075223722162">
|
||||||
@@ -1869,7 +1893,7 @@
|
|||||||
<target>Französisch</target>
|
<target>Französisch</target>
|
||||||
<context-group purpose="location">
|
<context-group purpose="location">
|
||||||
<context context-type="sourcefile">src/app/services/settings.service.ts</context>
|
<context context-type="sourcefile">src/app/services/settings.service.ts</context>
|
||||||
<context context-type="linenumber">85</context>
|
<context context-type="linenumber">86</context>
|
||||||
</context-group>
|
</context-group>
|
||||||
</trans-unit>
|
</trans-unit>
|
||||||
<trans-unit datatype="html" id="2119857572761283468">
|
<trans-unit datatype="html" id="2119857572761283468">
|
||||||
|
@@ -58,19 +58,19 @@
|
|||||||
</context-group>
|
</context-group>
|
||||||
</trans-unit>
|
</trans-unit>
|
||||||
<trans-unit datatype="html" id="2155249406916744630">
|
<trans-unit datatype="html" id="2155249406916744630">
|
||||||
<source>View "<x equiv-text="this.list.savedView.name" id="PH"/>" saved successfully.</source>
|
<source>View "<x equiv-text="this.list.activeSavedViewTitle" id="PH"/>" saved successfully.</source>
|
||||||
<target>View &quot;<x equiv-text="this.list.savedView.name" id="PH"/>&quot; saved successfully.</target>
|
<target>View "<x equiv-text="this.list.activeSavedViewTitle" id="PH"/>" saved successfully.</target>
|
||||||
<context-group purpose="location">
|
<context-group purpose="location">
|
||||||
<context context-type="sourcefile">src/app/components/document-list/document-list.component.ts</context>
|
<context context-type="sourcefile">src/app/components/document-list/document-list.component.ts</context>
|
||||||
<context context-type="linenumber">109</context>
|
<context context-type="linenumber">115</context>
|
||||||
</context-group>
|
</context-group>
|
||||||
</trans-unit>
|
</trans-unit>
|
||||||
<trans-unit datatype="html" id="6837554170707123455">
|
<trans-unit datatype="html" id="6837554170707123455">
|
||||||
<source>View "<x equiv-text="savedView.name" id="PH"/>" created successfully.</source>
|
<source>View "<x equiv-text="savedView.name" id="PH"/>" created successfully.</source>
|
||||||
<target>View &quot;<x equiv-text="savedView.name" id="PH"/>&quot; created successfully.</target>
|
<target>View "<x equiv-text="savedView.name" id="PH"/>" created successfully.</target>
|
||||||
<context-group purpose="location">
|
<context-group purpose="location">
|
||||||
<context context-type="sourcefile">src/app/components/document-list/document-list.component.ts</context>
|
<context context-type="sourcefile">src/app/components/document-list/document-list.component.ts</context>
|
||||||
<context context-type="linenumber">130</context>
|
<context context-type="linenumber">136</context>
|
||||||
</context-group>
|
</context-group>
|
||||||
</trans-unit>
|
</trans-unit>
|
||||||
<trans-unit datatype="html" id="9ca82952a6bc860b5391d5975322d8af8ceddfa4">
|
<trans-unit datatype="html" id="9ca82952a6bc860b5391d5975322d8af8ceddfa4">
|
||||||
@@ -129,9 +129,9 @@
|
|||||||
<context context-type="linenumber">72</context>
|
<context context-type="linenumber">72</context>
|
||||||
</context-group>
|
</context-group>
|
||||||
</trans-unit>
|
</trans-unit>
|
||||||
<trans-unit datatype="html" id="72e7d343f9165602cce1ca7faffbc565fd31ef92">
|
<trans-unit datatype="html" id="5f5ce787c428d917c30c9bd70789a618e09743a7">
|
||||||
<source>Save "<x equiv-text="{{list.savedViewTitle}}" id="INTERPOLATION"/>"</source>
|
<source>Save "<x equiv-text="{{list.activeSavedViewTitle}}" id="INTERPOLATION"/>"</source>
|
||||||
<target>Save &quot;<x equiv-text="{{list.savedViewTitle}}" id="INTERPOLATION"/>&quot;</target>
|
<target>Save "<x equiv-text="{{list.activeSavedViewTitle}}" id="INTERPOLATION"/>"</target>
|
||||||
<context-group purpose="location">
|
<context-group purpose="location">
|
||||||
<context context-type="sourcefile">src/app/components/document-list/document-list.component.html</context>
|
<context context-type="sourcefile">src/app/components/document-list/document-list.component.html</context>
|
||||||
<context context-type="linenumber">71</context>
|
<context context-type="linenumber">71</context>
|
||||||
@@ -219,7 +219,7 @@
|
|||||||
</trans-unit>
|
</trans-unit>
|
||||||
<trans-unit datatype="html" id="5382975254277698192">
|
<trans-unit datatype="html" id="5382975254277698192">
|
||||||
<source>Do you really want to delete document "<x equiv-text="this.document.title" id="PH"/>"?</source>
|
<source>Do you really want to delete document "<x equiv-text="this.document.title" id="PH"/>"?</source>
|
||||||
<target>Do you really want to delete document &quot;<x equiv-text="this.document.title" id="PH"/>&quot;?</target>
|
<target>Do you really want to delete document "<x equiv-text="this.document.title" id="PH"/>"?</target>
|
||||||
<context-group purpose="location">
|
<context-group purpose="location">
|
||||||
<context context-type="sourcefile">src/app/components/document-detail/document-detail.component.ts</context>
|
<context context-type="sourcefile">src/app/components/document-detail/document-detail.component.ts</context>
|
||||||
<context context-type="linenumber">204</context>
|
<context context-type="linenumber">204</context>
|
||||||
@@ -475,7 +475,7 @@
|
|||||||
</trans-unit>
|
</trans-unit>
|
||||||
<trans-unit datatype="html" id="93754014749412887">
|
<trans-unit datatype="html" id="93754014749412887">
|
||||||
<source>Do you really want to delete the tag "<x equiv-text="object.name" id="PH"/>"?</source>
|
<source>Do you really want to delete the tag "<x equiv-text="object.name" id="PH"/>"?</source>
|
||||||
<target>Do you really want to delete the tag &quot;<x equiv-text="object.name" id="PH"/>&quot;?</target>
|
<target>Do you really want to delete the tag "<x equiv-text="object.name" id="PH"/>"?</target>
|
||||||
<context-group purpose="location">
|
<context-group purpose="location">
|
||||||
<context context-type="sourcefile">src/app/components/manage/tag-list/tag-list.component.ts</context>
|
<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">30</context>
|
||||||
@@ -515,7 +515,7 @@
|
|||||||
</trans-unit>
|
</trans-unit>
|
||||||
<trans-unit datatype="html" id="8fa4d523f7b91df4390120b85ed0406138273e1a">
|
<trans-unit datatype="html" id="8fa4d523f7b91df4390120b85ed0406138273e1a">
|
||||||
<source>Color</source>
|
<source>Color</source>
|
||||||
<target>Color</target>
|
<target>Colour</target>
|
||||||
<context-group purpose="location">
|
<context-group purpose="location">
|
||||||
<context context-type="sourcefile">src/app/components/manage/tag-list/tag-list.component.html</context>
|
<context context-type="sourcefile">src/app/components/manage/tag-list/tag-list.component.html</context>
|
||||||
<context context-type="linenumber">20</context>
|
<context context-type="linenumber">20</context>
|
||||||
@@ -563,7 +563,7 @@
|
|||||||
</trans-unit>
|
</trans-unit>
|
||||||
<trans-unit datatype="html" id="4990731724078522539">
|
<trans-unit datatype="html" id="4990731724078522539">
|
||||||
<source>Do you really want to delete the document type "<x equiv-text="object.name" id="PH"/>"?</source>
|
<source>Do you really want to delete the document type "<x equiv-text="object.name" id="PH"/>"?</source>
|
||||||
<target>Do you really want to delete the document type &quot;<x equiv-text="object.name" id="PH"/>&quot;?</target>
|
<target>Do you really want to delete the document type "<x equiv-text="object.name" id="PH"/>"?</target>
|
||||||
<context-group purpose="location">
|
<context-group purpose="location">
|
||||||
<context context-type="sourcefile">src/app/components/manage/document-type-list/document-type-list.component.ts</context>
|
<context context-type="sourcefile">src/app/components/manage/document-type-list/document-type-list.component.ts</context>
|
||||||
<context context-type="linenumber">26</context>
|
<context context-type="linenumber">26</context>
|
||||||
@@ -585,17 +585,9 @@
|
|||||||
<context context-type="linenumber">1</context>
|
<context context-type="linenumber">1</context>
|
||||||
</context-group>
|
</context-group>
|
||||||
</trans-unit>
|
</trans-unit>
|
||||||
<trans-unit datatype="html" id="5ca707824ab93066c7d9b44e1b8bf216725c2c22">
|
|
||||||
<source>Filter</source>
|
|
||||||
<target>Filter</target>
|
|
||||||
<context-group purpose="location">
|
|
||||||
<context context-type="sourcefile">src/app/components/manage/logs/logs.component.html</context>
|
|
||||||
<context context-type="linenumber">7</context>
|
|
||||||
</context-group>
|
|
||||||
</trans-unit>
|
|
||||||
<trans-unit datatype="html" id="5610279464668232148">
|
<trans-unit datatype="html" id="5610279464668232148">
|
||||||
<source>Saved view "<x equiv-text="savedView.name" id="PH"/>" deleted.</source>
|
<source>Saved view "<x equiv-text="savedView.name" id="PH"/>" deleted.</source>
|
||||||
<target>Saved view &quot;<x equiv-text="savedView.name" id="PH"/>&quot; deleted.</target>
|
<target>Saved view "<x equiv-text="savedView.name" id="PH"/>" deleted.</target>
|
||||||
<context-group purpose="location">
|
<context-group purpose="location">
|
||||||
<context context-type="sourcefile">src/app/components/manage/settings/settings.component.ts</context>
|
<context context-type="sourcefile">src/app/components/manage/settings/settings.component.ts</context>
|
||||||
<context context-type="linenumber">67</context>
|
<context context-type="linenumber">67</context>
|
||||||
@@ -622,7 +614,15 @@
|
|||||||
<target>Use date format of display language</target>
|
<target>Use date format of display language</target>
|
||||||
<context-group purpose="location">
|
<context-group purpose="location">
|
||||||
<context context-type="sourcefile">src/app/components/manage/settings/settings.component.ts</context>
|
<context context-type="sourcefile">src/app/components/manage/settings/settings.component.ts</context>
|
||||||
<context context-type="linenumber">95</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-group>
|
</context-group>
|
||||||
</trans-unit>
|
</trans-unit>
|
||||||
<trans-unit datatype="html" id="8488620293789898901">
|
<trans-unit datatype="html" id="8488620293789898901">
|
||||||
@@ -630,7 +630,7 @@
|
|||||||
<target>Error while storing settings on server: <x equiv-text="JSON.stringify(error.error)" id="PH"/></target>
|
<target>Error while storing settings on server: <x equiv-text="JSON.stringify(error.error)" id="PH"/></target>
|
||||||
<context-group purpose="location">
|
<context-group purpose="location">
|
||||||
<context context-type="sourcefile">src/app/components/manage/settings/settings.component.ts</context>
|
<context context-type="sourcefile">src/app/components/manage/settings/settings.component.ts</context>
|
||||||
<context context-type="linenumber">111</context>
|
<context context-type="linenumber">114</context>
|
||||||
</context-group>
|
</context-group>
|
||||||
</trans-unit>
|
</trans-unit>
|
||||||
<trans-unit datatype="html" id="121cc5391cd2a5115bc2b3160379ee5b36cd7716">
|
<trans-unit datatype="html" id="121cc5391cd2a5115bc2b3160379ee5b36cd7716">
|
||||||
@@ -907,7 +907,7 @@
|
|||||||
</trans-unit>
|
</trans-unit>
|
||||||
<trans-unit datatype="html" id="7427874343955308724">
|
<trans-unit datatype="html" id="7427874343955308724">
|
||||||
<source>Do you really want to delete the correspondent "<x equiv-text="object.name" id="PH"/>"?</source>
|
<source>Do you really want to delete the correspondent "<x equiv-text="object.name" id="PH"/>"?</source>
|
||||||
<target>Do you really want to delete the correspondent &quot;<x equiv-text="object.name" id="PH"/>&quot;?</target>
|
<target>Do you really want to delete the correspondent "<x equiv-text="object.name" id="PH"/>"?</target>
|
||||||
<context-group purpose="location">
|
<context-group purpose="location">
|
||||||
<context context-type="sourcefile">src/app/components/manage/correspondent-list/correspondent-list.component.ts</context>
|
<context context-type="sourcefile">src/app/components/manage/correspondent-list/correspondent-list.component.ts</context>
|
||||||
<context context-type="linenumber">26</context>
|
<context context-type="linenumber">26</context>
|
||||||
@@ -1075,7 +1075,7 @@
|
|||||||
</trans-unit>
|
</trans-unit>
|
||||||
<trans-unit datatype="html" id="afa760e48c97d64d19c1455d18b7834a2256e23f">
|
<trans-unit datatype="html" id="afa760e48c97d64d19c1455d18b7834a2256e23f">
|
||||||
<source>Did you mean "<x equiv-text="<a [routerLink]="" (click)="searchCorrectedQuery()">{{correctedQuery}}" id="START_LINK"/><x equiv-text="{{correctedQuery}}</a>" id="INTERPOLATION"/><x equiv-text="</a>" id="CLOSE_LINK"/>"?</source>
|
<source>Did you mean "<x equiv-text="<a [routerLink]="" (click)="searchCorrectedQuery()">{{correctedQuery}}" id="START_LINK"/><x equiv-text="{{correctedQuery}}</a>" id="INTERPOLATION"/><x equiv-text="</a>" id="CLOSE_LINK"/>"?</source>
|
||||||
<target>Did you mean &quot;<x equiv-text="<a [routerLink]="" (click)="searchCorrectedQuery()">{{correctedQuery}}" id="START_LINK"/><x equiv-text="{{correctedQuery}}</a>" id="INTERPOLATION"/><x equiv-text="</a>" id="CLOSE_LINK"/>&quot;?</target>
|
<target>Did you mean "<x equiv-text="<a [routerLink]="" (click)="searchCorrectedQuery()">{{correctedQuery}}" id="START_LINK"/><x equiv-text="{{correctedQuery}}</a>" id="INTERPOLATION"/><x equiv-text="</a>" id="CLOSE_LINK"/>"?</target>
|
||||||
<context-group purpose="location">
|
<context-group purpose="location">
|
||||||
<context context-type="sourcefile">src/app/components/search/search.component.html</context>
|
<context context-type="sourcefile">src/app/components/search/search.component.html</context>
|
||||||
<context context-type="linenumber">13</context>
|
<context context-type="linenumber">13</context>
|
||||||
@@ -1234,6 +1234,14 @@
|
|||||||
<context context-type="linenumber">46</context>
|
<context context-type="linenumber">46</context>
|
||||||
</context-group>
|
</context-group>
|
||||||
</trans-unit>
|
</trans-unit>
|
||||||
|
<trans-unit datatype="html" id="6523384805359286307">
|
||||||
|
<source>Title: <x equiv-text="rule.value" id="PH"/></source>
|
||||||
|
<target>Title: <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-group>
|
||||||
|
</trans-unit>
|
||||||
<trans-unit datatype="html" id="02d184c288f567825a1fcbf83bcd3099a10853d5">
|
<trans-unit datatype="html" id="02d184c288f567825a1fcbf83bcd3099a10853d5">
|
||||||
<source>Filter tags</source>
|
<source>Filter tags</source>
|
||||||
<target>Filter tags</target>
|
<target>Filter tags</target>
|
||||||
@@ -1392,23 +1400,23 @@
|
|||||||
<target>Error executing bulk operation: <x equiv-text="JSON.stringify(error.error)" id="PH"/></target>
|
<target>Error executing bulk operation: <x equiv-text="JSON.stringify(error.error)" id="PH"/></target>
|
||||||
<context-group purpose="location">
|
<context-group purpose="location">
|
||||||
<context context-type="sourcefile">src/app/components/document-list/bulk-editor/bulk-editor.component.ts</context>
|
<context context-type="sourcefile">src/app/components/document-list/bulk-editor/bulk-editor.component.ts</context>
|
||||||
<context context-type="linenumber">73</context>
|
<context context-type="linenumber">74</context>
|
||||||
</context-group>
|
</context-group>
|
||||||
</trans-unit>
|
</trans-unit>
|
||||||
<trans-unit datatype="html" id="7894972847287473517">
|
<trans-unit datatype="html" id="7894972847287473517">
|
||||||
<source>"<x equiv-text="items[0].name" id="PH"/>"</source>
|
<source>"<x equiv-text="items[0].name" id="PH"/>"</source>
|
||||||
<target>&quot;<x equiv-text="items[0].name" id="PH"/>&quot;</target>
|
<target>"<x equiv-text="items[0].name" id="PH"/>"</target>
|
||||||
<context-group purpose="location">
|
<context-group purpose="location">
|
||||||
<context context-type="sourcefile">src/app/components/document-list/bulk-editor/bulk-editor.component.ts</context>
|
<context context-type="sourcefile">src/app/components/document-list/bulk-editor/bulk-editor.component.ts</context>
|
||||||
<context context-type="linenumber">112</context>
|
<context context-type="linenumber">113</context>
|
||||||
</context-group>
|
</context-group>
|
||||||
</trans-unit>
|
</trans-unit>
|
||||||
<trans-unit datatype="html" id="8639884465898458690">
|
<trans-unit datatype="html" id="8639884465898458690">
|
||||||
<source>"<x equiv-text="items[0].name" id="PH"/>" and "<x equiv-text="items[1].name" id="PH_1"/>"</source>
|
<source>"<x equiv-text="items[0].name" id="PH"/>" and "<x equiv-text="items[1].name" id="PH_1"/>"</source>
|
||||||
<target>&quot;<x equiv-text="items[0].name" id="PH"/>&quot; and &quot;<x equiv-text="items[1].name" id="PH_1"/>&quot;</target>
|
<target>"<x equiv-text="items[0].name" id="PH"/>" and "<x equiv-text="items[1].name" id="PH_1"/>"</target>
|
||||||
<context-group purpose="location">
|
<context-group purpose="location">
|
||||||
<context context-type="sourcefile">src/app/components/document-list/bulk-editor/bulk-editor.component.ts</context>
|
<context context-type="sourcefile">src/app/components/document-list/bulk-editor/bulk-editor.component.ts</context>
|
||||||
<context context-type="linenumber">114</context>
|
<context context-type="linenumber">115</context>
|
||||||
</context-group>
|
</context-group>
|
||||||
<note from="description" priority="1">This is for messages like 'modify "tag1" and "tag2"'</note>
|
<note from="description" priority="1">This is for messages like 'modify "tag1" and "tag2"'</note>
|
||||||
</trans-unit>
|
</trans-unit>
|
||||||
@@ -1417,16 +1425,16 @@
|
|||||||
<target>, </target>
|
<target>, </target>
|
||||||
<context-group purpose="location">
|
<context-group purpose="location">
|
||||||
<context context-type="sourcefile">src/app/components/document-list/bulk-editor/bulk-editor.component.ts</context>
|
<context context-type="sourcefile">src/app/components/document-list/bulk-editor/bulk-editor.component.ts</context>
|
||||||
<context context-type="linenumber">116</context>
|
<context context-type="linenumber">117</context>
|
||||||
</context-group>
|
</context-group>
|
||||||
<note from="description" priority="1">this is used to separate enumerations and should probably be a comma and a whitespace in most languages</note>
|
<note from="description" priority="1">this is used to separate enumerations and should probably be a comma and a whitespace in most languages</note>
|
||||||
</trans-unit>
|
</trans-unit>
|
||||||
<trans-unit datatype="html" id="1822679894391095557">
|
<trans-unit datatype="html" id="1822679894391095557">
|
||||||
<source><x equiv-text="list" id="PH"/> and "<x equiv-text="items[items.length - 1].name" id="PH_1"/>"</source>
|
<source><x equiv-text="list" id="PH"/> and "<x equiv-text="items[items.length - 1].name" id="PH_1"/>"</source>
|
||||||
<target><x equiv-text="list" id="PH"/> and &quot;<x equiv-text="items[items.length - 1].name" id="PH_1"/>&quot;</target>
|
<target><x equiv-text="list" id="PH"/> and "<x equiv-text="items[items.length - 1].name" id="PH_1"/>"</target>
|
||||||
<context-group purpose="location">
|
<context-group purpose="location">
|
||||||
<context context-type="sourcefile">src/app/components/document-list/bulk-editor/bulk-editor.component.ts</context>
|
<context context-type="sourcefile">src/app/components/document-list/bulk-editor/bulk-editor.component.ts</context>
|
||||||
<context context-type="linenumber">117</context>
|
<context context-type="linenumber">118</context>
|
||||||
</context-group>
|
</context-group>
|
||||||
<note from="description" priority="1">this is for messages like 'modify "tag1", "tag2" and "tag3"'</note>
|
<note from="description" priority="1">this is for messages like 'modify "tag1", "tag2" and "tag3"'</note>
|
||||||
</trans-unit>
|
</trans-unit>
|
||||||
@@ -1435,15 +1443,15 @@
|
|||||||
<target>Confirm tags assignment</target>
|
<target>Confirm tags assignment</target>
|
||||||
<context-group purpose="location">
|
<context-group purpose="location">
|
||||||
<context context-type="sourcefile">src/app/components/document-list/bulk-editor/bulk-editor.component.ts</context>
|
<context context-type="sourcefile">src/app/components/document-list/bulk-editor/bulk-editor.component.ts</context>
|
||||||
<context context-type="linenumber">126</context>
|
<context context-type="linenumber">127</context>
|
||||||
</context-group>
|
</context-group>
|
||||||
</trans-unit>
|
</trans-unit>
|
||||||
<trans-unit datatype="html" id="6619516195038467207">
|
<trans-unit datatype="html" id="6619516195038467207">
|
||||||
<source>This operation will add the tag "<x equiv-text="tag.name" id="PH"/>" to <x equiv-text="this.list.selected.size" id="PH_1"/> selected document(s).</source>
|
<source>This operation will add the tag "<x equiv-text="tag.name" id="PH"/>" to <x equiv-text="this.list.selected.size" id="PH_1"/> selected document(s).</source>
|
||||||
<target>This operation will add the tag &quot;<x equiv-text="tag.name" id="PH"/>&quot; to <x equiv-text="this.list.selected.size" id="PH_1"/> selected document(s).</target>
|
<target>This operation will add the tag "<x equiv-text="tag.name" id="PH"/>" to <x equiv-text="this.list.selected.size" id="PH_1"/> selected document(s).</target>
|
||||||
<context-group purpose="location">
|
<context-group purpose="location">
|
||||||
<context context-type="sourcefile">src/app/components/document-list/bulk-editor/bulk-editor.component.ts</context>
|
<context context-type="sourcefile">src/app/components/document-list/bulk-editor/bulk-editor.component.ts</context>
|
||||||
<context context-type="linenumber">129</context>
|
<context context-type="linenumber">130</context>
|
||||||
</context-group>
|
</context-group>
|
||||||
</trans-unit>
|
</trans-unit>
|
||||||
<trans-unit datatype="html" id="1894412783609570695">
|
<trans-unit datatype="html" id="1894412783609570695">
|
||||||
@@ -1451,15 +1459,15 @@
|
|||||||
<target>This operation will add the tags <x equiv-text="this._localizeList(changedTags.itemsToAdd)" id="PH"/> to <x equiv-text="this.list.selected.size" id="PH_1"/> selected document(s).</target>
|
<target>This operation will add the tags <x equiv-text="this._localizeList(changedTags.itemsToAdd)" id="PH"/> to <x equiv-text="this.list.selected.size" id="PH_1"/> selected document(s).</target>
|
||||||
<context-group purpose="location">
|
<context-group purpose="location">
|
||||||
<context context-type="sourcefile">src/app/components/document-list/bulk-editor/bulk-editor.component.ts</context>
|
<context context-type="sourcefile">src/app/components/document-list/bulk-editor/bulk-editor.component.ts</context>
|
||||||
<context context-type="linenumber">131</context>
|
<context context-type="linenumber">132</context>
|
||||||
</context-group>
|
</context-group>
|
||||||
</trans-unit>
|
</trans-unit>
|
||||||
<trans-unit datatype="html" id="7181166515756808573">
|
<trans-unit datatype="html" id="7181166515756808573">
|
||||||
<source>This operation will remove the tag "<x equiv-text="tag.name" id="PH"/>" from <x equiv-text="this.list.selected.size" id="PH_1"/> selected document(s).</source>
|
<source>This operation will remove the tag "<x equiv-text="tag.name" id="PH"/>" from <x equiv-text="this.list.selected.size" id="PH_1"/> selected document(s).</source>
|
||||||
<target>This operation will remove the tag &quot;<x equiv-text="tag.name" id="PH"/>&quot; from <x equiv-text="this.list.selected.size" id="PH_1"/> selected document(s).</target>
|
<target>This operation will remove the tag "<x equiv-text="tag.name" id="PH"/>" from <x equiv-text="this.list.selected.size" id="PH_1"/> selected document(s).</target>
|
||||||
<context-group purpose="location">
|
<context-group purpose="location">
|
||||||
<context context-type="sourcefile">src/app/components/document-list/bulk-editor/bulk-editor.component.ts</context>
|
<context context-type="sourcefile">src/app/components/document-list/bulk-editor/bulk-editor.component.ts</context>
|
||||||
<context context-type="linenumber">134</context>
|
<context context-type="linenumber">135</context>
|
||||||
</context-group>
|
</context-group>
|
||||||
</trans-unit>
|
</trans-unit>
|
||||||
<trans-unit datatype="html" id="3819792277998068944">
|
<trans-unit datatype="html" id="3819792277998068944">
|
||||||
@@ -1467,7 +1475,7 @@
|
|||||||
<target>This operation will remove the tags <x equiv-text="this._localizeList(changedTags.itemsToRemove)" id="PH"/> from <x equiv-text="this.list.selected.size" id="PH_1"/> selected document(s).</target>
|
<target>This operation will remove the tags <x equiv-text="this._localizeList(changedTags.itemsToRemove)" id="PH"/> from <x equiv-text="this.list.selected.size" id="PH_1"/> selected document(s).</target>
|
||||||
<context-group purpose="location">
|
<context-group purpose="location">
|
||||||
<context context-type="sourcefile">src/app/components/document-list/bulk-editor/bulk-editor.component.ts</context>
|
<context context-type="sourcefile">src/app/components/document-list/bulk-editor/bulk-editor.component.ts</context>
|
||||||
<context context-type="linenumber">136</context>
|
<context context-type="linenumber">137</context>
|
||||||
</context-group>
|
</context-group>
|
||||||
</trans-unit>
|
</trans-unit>
|
||||||
<trans-unit datatype="html" id="2739066218579571288">
|
<trans-unit datatype="html" id="2739066218579571288">
|
||||||
@@ -1475,7 +1483,7 @@
|
|||||||
<target>This operation will add the tags <x equiv-text="this._localizeList(changedTags.itemsToAdd)" id="PH"/> and remove the tags <x equiv-text="this._localizeList(changedTags.itemsToRemove)" id="PH_1"/> on <x equiv-text="this.list.selected.size" id="PH_2"/> selected document(s).</target>
|
<target>This operation will add the tags <x equiv-text="this._localizeList(changedTags.itemsToAdd)" id="PH"/> and remove the tags <x equiv-text="this._localizeList(changedTags.itemsToRemove)" id="PH_1"/> on <x equiv-text="this.list.selected.size" id="PH_2"/> selected document(s).</target>
|
||||||
<context-group purpose="location">
|
<context-group purpose="location">
|
||||||
<context context-type="sourcefile">src/app/components/document-list/bulk-editor/bulk-editor.component.ts</context>
|
<context context-type="sourcefile">src/app/components/document-list/bulk-editor/bulk-editor.component.ts</context>
|
||||||
<context context-type="linenumber">138</context>
|
<context context-type="linenumber">139</context>
|
||||||
</context-group>
|
</context-group>
|
||||||
</trans-unit>
|
</trans-unit>
|
||||||
<trans-unit datatype="html" id="2996713129519325161">
|
<trans-unit datatype="html" id="2996713129519325161">
|
||||||
@@ -1483,15 +1491,15 @@
|
|||||||
<target>Confirm correspondent assignment</target>
|
<target>Confirm correspondent assignment</target>
|
||||||
<context-group purpose="location">
|
<context-group purpose="location">
|
||||||
<context context-type="sourcefile">src/app/components/document-list/bulk-editor/bulk-editor.component.ts</context>
|
<context context-type="sourcefile">src/app/components/document-list/bulk-editor/bulk-editor.component.ts</context>
|
||||||
<context context-type="linenumber">158</context>
|
<context context-type="linenumber">159</context>
|
||||||
</context-group>
|
</context-group>
|
||||||
</trans-unit>
|
</trans-unit>
|
||||||
<trans-unit datatype="html" id="6900893559485781849">
|
<trans-unit datatype="html" id="6900893559485781849">
|
||||||
<source>This operation will assign the correspondent "<x equiv-text="correspondent.name" id="PH"/>" to <x equiv-text="this.list.selected.size" id="PH_1"/> selected document(s).</source>
|
<source>This operation will assign the correspondent "<x equiv-text="correspondent.name" id="PH"/>" to <x equiv-text="this.list.selected.size" id="PH_1"/> selected document(s).</source>
|
||||||
<target>This operation will assign the correspondent &quot;<x equiv-text="correspondent.name" id="PH"/>&quot; to <x equiv-text="this.list.selected.size" id="PH_1"/> selected document(s).</target>
|
<target>This operation will assign the correspondent "<x equiv-text="correspondent.name" id="PH"/>" to <x equiv-text="this.list.selected.size" id="PH_1"/> selected document(s).</target>
|
||||||
<context-group purpose="location">
|
<context-group purpose="location">
|
||||||
<context context-type="sourcefile">src/app/components/document-list/bulk-editor/bulk-editor.component.ts</context>
|
<context context-type="sourcefile">src/app/components/document-list/bulk-editor/bulk-editor.component.ts</context>
|
||||||
<context context-type="linenumber">160</context>
|
<context context-type="linenumber">161</context>
|
||||||
</context-group>
|
</context-group>
|
||||||
</trans-unit>
|
</trans-unit>
|
||||||
<trans-unit datatype="html" id="1257522660364398440">
|
<trans-unit datatype="html" id="1257522660364398440">
|
||||||
@@ -1499,7 +1507,7 @@
|
|||||||
<target>This operation will remove the correspondent from <x equiv-text="this.list.selected.size" id="PH"/> selected document(s).</target>
|
<target>This operation will remove the correspondent from <x equiv-text="this.list.selected.size" id="PH"/> selected document(s).</target>
|
||||||
<context-group purpose="location">
|
<context-group purpose="location">
|
||||||
<context context-type="sourcefile">src/app/components/document-list/bulk-editor/bulk-editor.component.ts</context>
|
<context context-type="sourcefile">src/app/components/document-list/bulk-editor/bulk-editor.component.ts</context>
|
||||||
<context context-type="linenumber">162</context>
|
<context context-type="linenumber">163</context>
|
||||||
</context-group>
|
</context-group>
|
||||||
</trans-unit>
|
</trans-unit>
|
||||||
<trans-unit datatype="html" id="5393409374423140648">
|
<trans-unit datatype="html" id="5393409374423140648">
|
||||||
@@ -1507,15 +1515,15 @@
|
|||||||
<target>Confirm document type assignment</target>
|
<target>Confirm document type assignment</target>
|
||||||
<context-group purpose="location">
|
<context-group purpose="location">
|
||||||
<context context-type="sourcefile">src/app/components/document-list/bulk-editor/bulk-editor.component.ts</context>
|
<context context-type="sourcefile">src/app/components/document-list/bulk-editor/bulk-editor.component.ts</context>
|
||||||
<context context-type="linenumber">181</context>
|
<context context-type="linenumber">182</context>
|
||||||
</context-group>
|
</context-group>
|
||||||
</trans-unit>
|
</trans-unit>
|
||||||
<trans-unit datatype="html" id="332180123895325027">
|
<trans-unit datatype="html" id="332180123895325027">
|
||||||
<source>This operation will assign the document type "<x equiv-text="documentType.name" id="PH"/>" to <x equiv-text="this.list.selected.size" id="PH_1"/> selected document(s).</source>
|
<source>This operation will assign the document type "<x equiv-text="documentType.name" id="PH"/>" to <x equiv-text="this.list.selected.size" id="PH_1"/> selected document(s).</source>
|
||||||
<target>This operation will assign the document type &quot;<x equiv-text="documentType.name" id="PH"/>&quot; to <x equiv-text="this.list.selected.size" id="PH_1"/> selected document(s).</target>
|
<target>This operation will assign the document type "<x equiv-text="documentType.name" id="PH"/>" to <x equiv-text="this.list.selected.size" id="PH_1"/> selected document(s).</target>
|
||||||
<context-group purpose="location">
|
<context-group purpose="location">
|
||||||
<context context-type="sourcefile">src/app/components/document-list/bulk-editor/bulk-editor.component.ts</context>
|
<context context-type="sourcefile">src/app/components/document-list/bulk-editor/bulk-editor.component.ts</context>
|
||||||
<context context-type="linenumber">183</context>
|
<context context-type="linenumber">184</context>
|
||||||
</context-group>
|
</context-group>
|
||||||
</trans-unit>
|
</trans-unit>
|
||||||
<trans-unit datatype="html" id="2236642492594872779">
|
<trans-unit datatype="html" id="2236642492594872779">
|
||||||
@@ -1523,7 +1531,7 @@
|
|||||||
<target>This operation will remove the document type from <x equiv-text="this.list.selected.size" id="PH"/> selected document(s).</target>
|
<target>This operation will remove the document type from <x equiv-text="this.list.selected.size" id="PH"/> selected document(s).</target>
|
||||||
<context-group purpose="location">
|
<context-group purpose="location">
|
||||||
<context context-type="sourcefile">src/app/components/document-list/bulk-editor/bulk-editor.component.ts</context>
|
<context context-type="sourcefile">src/app/components/document-list/bulk-editor/bulk-editor.component.ts</context>
|
||||||
<context context-type="linenumber">185</context>
|
<context context-type="linenumber">186</context>
|
||||||
</context-group>
|
</context-group>
|
||||||
</trans-unit>
|
</trans-unit>
|
||||||
<trans-unit datatype="html" id="749430623564850405">
|
<trans-unit datatype="html" id="749430623564850405">
|
||||||
@@ -1531,7 +1539,7 @@
|
|||||||
<target>Delete confirm</target>
|
<target>Delete confirm</target>
|
||||||
<context-group purpose="location">
|
<context-group purpose="location">
|
||||||
<context context-type="sourcefile">src/app/components/document-list/bulk-editor/bulk-editor.component.ts</context>
|
<context context-type="sourcefile">src/app/components/document-list/bulk-editor/bulk-editor.component.ts</context>
|
||||||
<context context-type="linenumber">200</context>
|
<context context-type="linenumber">201</context>
|
||||||
</context-group>
|
</context-group>
|
||||||
</trans-unit>
|
</trans-unit>
|
||||||
<trans-unit datatype="html" id="4303174930844518780">
|
<trans-unit datatype="html" id="4303174930844518780">
|
||||||
@@ -1539,7 +1547,7 @@
|
|||||||
<target>This operation will permanently delete <x equiv-text="this.list.selected.size" id="PH"/> selected document(s).</target>
|
<target>This operation will permanently delete <x equiv-text="this.list.selected.size" id="PH"/> selected document(s).</target>
|
||||||
<context-group purpose="location">
|
<context-group purpose="location">
|
||||||
<context context-type="sourcefile">src/app/components/document-list/bulk-editor/bulk-editor.component.ts</context>
|
<context context-type="sourcefile">src/app/components/document-list/bulk-editor/bulk-editor.component.ts</context>
|
||||||
<context context-type="linenumber">201</context>
|
<context context-type="linenumber">202</context>
|
||||||
</context-group>
|
</context-group>
|
||||||
</trans-unit>
|
</trans-unit>
|
||||||
<trans-unit datatype="html" id="5641451190833696892">
|
<trans-unit datatype="html" id="5641451190833696892">
|
||||||
@@ -1547,7 +1555,7 @@
|
|||||||
<target>This operation cannot be undone.</target>
|
<target>This operation cannot be undone.</target>
|
||||||
<context-group purpose="location">
|
<context-group purpose="location">
|
||||||
<context context-type="sourcefile">src/app/components/document-list/bulk-editor/bulk-editor.component.ts</context>
|
<context context-type="sourcefile">src/app/components/document-list/bulk-editor/bulk-editor.component.ts</context>
|
||||||
<context context-type="linenumber">202</context>
|
<context context-type="linenumber">203</context>
|
||||||
</context-group>
|
</context-group>
|
||||||
</trans-unit>
|
</trans-unit>
|
||||||
<trans-unit datatype="html" id="6734339521247847366">
|
<trans-unit datatype="html" id="6734339521247847366">
|
||||||
@@ -1555,7 +1563,7 @@
|
|||||||
<target>Delete document(s)</target>
|
<target>Delete document(s)</target>
|
||||||
<context-group purpose="location">
|
<context-group purpose="location">
|
||||||
<context context-type="sourcefile">src/app/components/document-list/bulk-editor/bulk-editor.component.ts</context>
|
<context context-type="sourcefile">src/app/components/document-list/bulk-editor/bulk-editor.component.ts</context>
|
||||||
<context context-type="linenumber">204</context>
|
<context context-type="linenumber">205</context>
|
||||||
</context-group>
|
</context-group>
|
||||||
</trans-unit>
|
</trans-unit>
|
||||||
<trans-unit datatype="html" id="8b0609df23817024b3bed12beb9b64fc1009f588">
|
<trans-unit datatype="html" id="8b0609df23817024b3bed12beb9b64fc1009f588">
|
||||||
@@ -1582,6 +1590,14 @@
|
|||||||
<context context-type="linenumber">27</context>
|
<context context-type="linenumber">27</context>
|
||||||
</context-group>
|
</context-group>
|
||||||
</trans-unit>
|
</trans-unit>
|
||||||
|
<trans-unit datatype="html" id="fc2de37422d7c4af6686842283cc2afd781b6848">
|
||||||
|
<source>Download originals</source>
|
||||||
|
<target>Download originals</target>
|
||||||
|
<context-group purpose="location">
|
||||||
|
<context context-type="sourcefile">src/app/components/document-list/bulk-editor/bulk-editor.component.html</context>
|
||||||
|
<context context-type="linenumber">68</context>
|
||||||
|
</context-group>
|
||||||
|
</trans-unit>
|
||||||
<trans-unit datatype="html" id="a1e6c11f20d4bf6e8e6b43e3c6d2561b2080645e">
|
<trans-unit datatype="html" id="a1e6c11f20d4bf6e8e6b43e3c6d2561b2080645e">
|
||||||
<source>Suggestions:</source>
|
<source>Suggestions:</source>
|
||||||
<target>Suggestions:</target>
|
<target>Suggestions:</target>
|
||||||
@@ -1614,22 +1630,22 @@
|
|||||||
<context context-type="linenumber">1</context>
|
<context context-type="linenumber">1</context>
|
||||||
</context-group>
|
</context-group>
|
||||||
</trans-unit>
|
</trans-unit>
|
||||||
<trans-unit datatype="html" id="46c8fe557cf52c9389783627d4f85453f4ddb459">
|
<trans-unit datatype="html" id="c0d907c2687c09612395aee6ef7c04ca8e5e5e0a">
|
||||||
<source>Documents in inbox: <x equiv-text="{{statistics.documents_inbox}}" id="INTERPOLATION"/></source>
|
<source>Total documents: <x equiv-text="{{statistics?.documents_total}}" id="INTERPOLATION"/></source>
|
||||||
<target>Documents in inbox: <x equiv-text="{{statistics.documents_inbox}}" id="INTERPOLATION"/></target>
|
<target>Total documents: <x equiv-text="{{statistics?.documents_total}}" id="INTERPOLATION"/></target>
|
||||||
<context-group purpose="location">
|
|
||||||
<context context-type="sourcefile">src/app/components/dashboard/widgets/statistics-widget/statistics-widget.component.html</context>
|
|
||||||
<context context-type="linenumber">3</context>
|
|
||||||
</context-group>
|
|
||||||
</trans-unit>
|
|
||||||
<trans-unit datatype="html" id="c327c0e67bcac7494dcbaa9afb3b42d5008c6438">
|
|
||||||
<source>Total documents: <x equiv-text="{{statistics.documents_total}}" id="INTERPOLATION"/></source>
|
|
||||||
<target>Total documents: <x equiv-text="{{statistics.documents_total}}" id="INTERPOLATION"/></target>
|
|
||||||
<context-group purpose="location">
|
<context-group purpose="location">
|
||||||
<context context-type="sourcefile">src/app/components/dashboard/widgets/statistics-widget/statistics-widget.component.html</context>
|
<context context-type="sourcefile">src/app/components/dashboard/widgets/statistics-widget/statistics-widget.component.html</context>
|
||||||
<context context-type="linenumber">4</context>
|
<context context-type="linenumber">4</context>
|
||||||
</context-group>
|
</context-group>
|
||||||
</trans-unit>
|
</trans-unit>
|
||||||
|
<trans-unit datatype="html" id="13e8d49dbcad9f9d71e66a9a56d6f328cff430c9">
|
||||||
|
<source>Documents in inbox: <x equiv-text="{{statistics?.documents_inbox}}" id="INTERPOLATION"/></source>
|
||||||
|
<target>Documents in inbox: <x equiv-text="{{statistics?.documents_inbox}}" id="INTERPOLATION"/></target>
|
||||||
|
<context-group purpose="location">
|
||||||
|
<context context-type="sourcefile">src/app/components/dashboard/widgets/statistics-widget/statistics-widget.component.html</context>
|
||||||
|
<context context-type="linenumber">3</context>
|
||||||
|
</context-group>
|
||||||
|
</trans-unit>
|
||||||
<trans-unit datatype="html" id="6443586946875325554">
|
<trans-unit datatype="html" id="6443586946875325554">
|
||||||
<source>Processing: <x equiv-text="countUploadingAndProcessing" id="PH"/></source>
|
<source>Processing: <x equiv-text="countUploadingAndProcessing" id="PH"/></source>
|
||||||
<target>Processing: <x equiv-text="countUploadingAndProcessing" id="PH"/></target>
|
<target>Processing: <x equiv-text="countUploadingAndProcessing" id="PH"/></target>
|
||||||
@@ -1848,12 +1864,20 @@
|
|||||||
<context context-type="linenumber">82</context>
|
<context context-type="linenumber">82</context>
|
||||||
</context-group>
|
</context-group>
|
||||||
</trans-unit>
|
</trans-unit>
|
||||||
|
<trans-unit datatype="html" id="6987083569809053351">
|
||||||
|
<source>English (GB)</source>
|
||||||
|
<target>English (GB)</target>
|
||||||
|
<context-group purpose="location">
|
||||||
|
<context context-type="sourcefile">src/app/services/settings.service.ts</context>
|
||||||
|
<context context-type="linenumber">83</context>
|
||||||
|
</context-group>
|
||||||
|
</trans-unit>
|
||||||
<trans-unit datatype="html" id="1858110241312746425">
|
<trans-unit datatype="html" id="1858110241312746425">
|
||||||
<source>German</source>
|
<source>German</source>
|
||||||
<target>German</target>
|
<target>German</target>
|
||||||
<context-group purpose="location">
|
<context-group purpose="location">
|
||||||
<context context-type="sourcefile">src/app/services/settings.service.ts</context>
|
<context context-type="sourcefile">src/app/services/settings.service.ts</context>
|
||||||
<context context-type="linenumber">83</context>
|
<context context-type="linenumber">84</context>
|
||||||
</context-group>
|
</context-group>
|
||||||
</trans-unit>
|
</trans-unit>
|
||||||
<trans-unit datatype="html" id="3071065188816255493">
|
<trans-unit datatype="html" id="3071065188816255493">
|
||||||
@@ -1861,7 +1885,7 @@
|
|||||||
<target>Dutch</target>
|
<target>Dutch</target>
|
||||||
<context-group purpose="location">
|
<context-group purpose="location">
|
||||||
<context context-type="sourcefile">src/app/services/settings.service.ts</context>
|
<context context-type="sourcefile">src/app/services/settings.service.ts</context>
|
||||||
<context context-type="linenumber">84</context>
|
<context context-type="linenumber">85</context>
|
||||||
</context-group>
|
</context-group>
|
||||||
</trans-unit>
|
</trans-unit>
|
||||||
<trans-unit datatype="html" id="7633754075223722162">
|
<trans-unit datatype="html" id="7633754075223722162">
|
||||||
@@ -1869,7 +1893,7 @@
|
|||||||
<target>French</target>
|
<target>French</target>
|
||||||
<context-group purpose="location">
|
<context-group purpose="location">
|
||||||
<context context-type="sourcefile">src/app/services/settings.service.ts</context>
|
<context context-type="sourcefile">src/app/services/settings.service.ts</context>
|
||||||
<context context-type="linenumber">85</context>
|
<context context-type="linenumber">86</context>
|
||||||
</context-group>
|
</context-group>
|
||||||
</trans-unit>
|
</trans-unit>
|
||||||
<trans-unit datatype="html" id="2119857572761283468">
|
<trans-unit datatype="html" id="2119857572761283468">
|
||||||
|
@@ -58,11 +58,11 @@
|
|||||||
</context-group>
|
</context-group>
|
||||||
</trans-unit>
|
</trans-unit>
|
||||||
<trans-unit datatype="html" id="2155249406916744630">
|
<trans-unit datatype="html" id="2155249406916744630">
|
||||||
<source>View "<x equiv-text="this.list.savedView.name" id="PH"/>" saved successfully.</source>
|
<source>View "<x equiv-text="this.list.activeSavedViewTitle" id="PH"/>" saved successfully.</source>
|
||||||
<target>Vue "<x equiv-text="this.list.savedView.name" id="PH"/>" enregistrée avec succès.</target>
|
<target>Vue "<x equiv-text="this.list.activeSavedViewTitle" id="PH"/>" enregistrée avec succès.</target>
|
||||||
<context-group purpose="location">
|
<context-group purpose="location">
|
||||||
<context context-type="sourcefile">src/app/components/document-list/document-list.component.ts</context>
|
<context context-type="sourcefile">src/app/components/document-list/document-list.component.ts</context>
|
||||||
<context context-type="linenumber">109</context>
|
<context context-type="linenumber">115</context>
|
||||||
</context-group>
|
</context-group>
|
||||||
</trans-unit>
|
</trans-unit>
|
||||||
<trans-unit datatype="html" id="6837554170707123455">
|
<trans-unit datatype="html" id="6837554170707123455">
|
||||||
@@ -70,7 +70,7 @@
|
|||||||
<target>Vue "<x equiv-text="savedView.name" id="PH"/>" créée avec succès.</target>
|
<target>Vue "<x equiv-text="savedView.name" id="PH"/>" créée avec succès.</target>
|
||||||
<context-group purpose="location">
|
<context-group purpose="location">
|
||||||
<context context-type="sourcefile">src/app/components/document-list/document-list.component.ts</context>
|
<context context-type="sourcefile">src/app/components/document-list/document-list.component.ts</context>
|
||||||
<context context-type="linenumber">130</context>
|
<context context-type="linenumber">136</context>
|
||||||
</context-group>
|
</context-group>
|
||||||
</trans-unit>
|
</trans-unit>
|
||||||
<trans-unit datatype="html" id="9ca82952a6bc860b5391d5975322d8af8ceddfa4">
|
<trans-unit datatype="html" id="9ca82952a6bc860b5391d5975322d8af8ceddfa4">
|
||||||
@@ -129,9 +129,9 @@
|
|||||||
<context context-type="linenumber">72</context>
|
<context context-type="linenumber">72</context>
|
||||||
</context-group>
|
</context-group>
|
||||||
</trans-unit>
|
</trans-unit>
|
||||||
<trans-unit datatype="html" id="72e7d343f9165602cce1ca7faffbc565fd31ef92">
|
<trans-unit datatype="html" id="5f5ce787c428d917c30c9bd70789a618e09743a7">
|
||||||
<source>Save "<x equiv-text="{{list.savedViewTitle}}" id="INTERPOLATION"/>"</source>
|
<source>Save "<x equiv-text="{{list.activeSavedViewTitle}}" id="INTERPOLATION"/>"</source>
|
||||||
<target>Enregistrer "<x equiv-text="{{list.savedViewTitle}}" id="INTERPOLATION"/>"</target>
|
<target>Enregistrer "<x equiv-text="{{list.activeSavedViewTitle}}" id="INTERPOLATION"/>"</target>
|
||||||
<context-group purpose="location">
|
<context-group purpose="location">
|
||||||
<context context-type="sourcefile">src/app/components/document-list/document-list.component.html</context>
|
<context context-type="sourcefile">src/app/components/document-list/document-list.component.html</context>
|
||||||
<context context-type="linenumber">71</context>
|
<context context-type="linenumber">71</context>
|
||||||
@@ -585,14 +585,6 @@
|
|||||||
<context context-type="linenumber">1</context>
|
<context context-type="linenumber">1</context>
|
||||||
</context-group>
|
</context-group>
|
||||||
</trans-unit>
|
</trans-unit>
|
||||||
<trans-unit datatype="html" id="5ca707824ab93066c7d9b44e1b8bf216725c2c22">
|
|
||||||
<source>Filter</source>
|
|
||||||
<target>Filtrer</target>
|
|
||||||
<context-group purpose="location">
|
|
||||||
<context context-type="sourcefile">src/app/components/manage/logs/logs.component.html</context>
|
|
||||||
<context context-type="linenumber">7</context>
|
|
||||||
</context-group>
|
|
||||||
</trans-unit>
|
|
||||||
<trans-unit datatype="html" id="5610279464668232148">
|
<trans-unit datatype="html" id="5610279464668232148">
|
||||||
<source>Saved view "<x equiv-text="savedView.name" id="PH"/>" deleted.</source>
|
<source>Saved view "<x equiv-text="savedView.name" id="PH"/>" deleted.</source>
|
||||||
<target>Vue "<x equiv-text="savedView.name" id="PH"/>" supprimée.</target>
|
<target>Vue "<x equiv-text="savedView.name" id="PH"/>" supprimée.</target>
|
||||||
@@ -622,7 +614,15 @@
|
|||||||
<target>Utiliser le format de date de la langue d'affichage</target>
|
<target>Utiliser le format de date de la langue d'affichage</target>
|
||||||
<context-group purpose="location">
|
<context-group purpose="location">
|
||||||
<context context-type="sourcefile">src/app/components/manage/settings/settings.component.ts</context>
|
<context context-type="sourcefile">src/app/components/manage/settings/settings.component.ts</context>
|
||||||
<context context-type="linenumber">95</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-group>
|
</context-group>
|
||||||
</trans-unit>
|
</trans-unit>
|
||||||
<trans-unit datatype="html" id="8488620293789898901">
|
<trans-unit datatype="html" id="8488620293789898901">
|
||||||
@@ -630,7 +630,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>
|
<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-group purpose="location">
|
||||||
<context context-type="sourcefile">src/app/components/manage/settings/settings.component.ts</context>
|
<context context-type="sourcefile">src/app/components/manage/settings/settings.component.ts</context>
|
||||||
<context context-type="linenumber">111</context>
|
<context context-type="linenumber">114</context>
|
||||||
</context-group>
|
</context-group>
|
||||||
</trans-unit>
|
</trans-unit>
|
||||||
<trans-unit datatype="html" id="121cc5391cd2a5115bc2b3160379ee5b36cd7716">
|
<trans-unit datatype="html" id="121cc5391cd2a5115bc2b3160379ee5b36cd7716">
|
||||||
@@ -1234,6 +1234,14 @@
|
|||||||
<context context-type="linenumber">46</context>
|
<context context-type="linenumber">46</context>
|
||||||
</context-group>
|
</context-group>
|
||||||
</trans-unit>
|
</trans-unit>
|
||||||
|
<trans-unit datatype="html" id="6523384805359286307">
|
||||||
|
<source>Title: <x equiv-text="rule.value" id="PH"/></source>
|
||||||
|
<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-group>
|
||||||
|
</trans-unit>
|
||||||
<trans-unit datatype="html" id="02d184c288f567825a1fcbf83bcd3099a10853d5">
|
<trans-unit datatype="html" id="02d184c288f567825a1fcbf83bcd3099a10853d5">
|
||||||
<source>Filter tags</source>
|
<source>Filter tags</source>
|
||||||
<target>Filtrer les étiquettes</target>
|
<target>Filtrer les étiquettes</target>
|
||||||
@@ -1392,7 +1400,7 @@
|
|||||||
<target>Une erreur s'est produite lors de l'exécution de l'opération de masse : <x equiv-text="JSON.stringify(error.error)" id="PH"/></target>
|
<target>Une erreur s'est produite lors de l'exécution de l'opération de masse : <x equiv-text="JSON.stringify(error.error)" id="PH"/></target>
|
||||||
<context-group purpose="location">
|
<context-group purpose="location">
|
||||||
<context context-type="sourcefile">src/app/components/document-list/bulk-editor/bulk-editor.component.ts</context>
|
<context context-type="sourcefile">src/app/components/document-list/bulk-editor/bulk-editor.component.ts</context>
|
||||||
<context context-type="linenumber">73</context>
|
<context context-type="linenumber">74</context>
|
||||||
</context-group>
|
</context-group>
|
||||||
</trans-unit>
|
</trans-unit>
|
||||||
<trans-unit datatype="html" id="7894972847287473517">
|
<trans-unit datatype="html" id="7894972847287473517">
|
||||||
@@ -1400,7 +1408,7 @@
|
|||||||
<target>"<x equiv-text="items[0].name" id="PH"/>"</target>
|
<target>"<x equiv-text="items[0].name" id="PH"/>"</target>
|
||||||
<context-group purpose="location">
|
<context-group purpose="location">
|
||||||
<context context-type="sourcefile">src/app/components/document-list/bulk-editor/bulk-editor.component.ts</context>
|
<context context-type="sourcefile">src/app/components/document-list/bulk-editor/bulk-editor.component.ts</context>
|
||||||
<context context-type="linenumber">112</context>
|
<context context-type="linenumber">113</context>
|
||||||
</context-group>
|
</context-group>
|
||||||
</trans-unit>
|
</trans-unit>
|
||||||
<trans-unit datatype="html" id="8639884465898458690">
|
<trans-unit datatype="html" id="8639884465898458690">
|
||||||
@@ -1408,7 +1416,7 @@
|
|||||||
<target>"<x equiv-text="items[0].name" id="PH"/>" et "<x equiv-text="items[1].name" id="PH_1"/>"</target>
|
<target>"<x equiv-text="items[0].name" id="PH"/>" et "<x equiv-text="items[1].name" id="PH_1"/>"</target>
|
||||||
<context-group purpose="location">
|
<context-group purpose="location">
|
||||||
<context context-type="sourcefile">src/app/components/document-list/bulk-editor/bulk-editor.component.ts</context>
|
<context context-type="sourcefile">src/app/components/document-list/bulk-editor/bulk-editor.component.ts</context>
|
||||||
<context context-type="linenumber">114</context>
|
<context context-type="linenumber">115</context>
|
||||||
</context-group>
|
</context-group>
|
||||||
<note from="description" priority="1">This is for messages like 'modify "tag1" and "tag2"'</note>
|
<note from="description" priority="1">This is for messages like 'modify "tag1" and "tag2"'</note>
|
||||||
</trans-unit>
|
</trans-unit>
|
||||||
@@ -1417,7 +1425,7 @@
|
|||||||
<target>, </target>
|
<target>, </target>
|
||||||
<context-group purpose="location">
|
<context-group purpose="location">
|
||||||
<context context-type="sourcefile">src/app/components/document-list/bulk-editor/bulk-editor.component.ts</context>
|
<context context-type="sourcefile">src/app/components/document-list/bulk-editor/bulk-editor.component.ts</context>
|
||||||
<context context-type="linenumber">116</context>
|
<context context-type="linenumber">117</context>
|
||||||
</context-group>
|
</context-group>
|
||||||
<note from="description" priority="1">this is used to separate enumerations and should probably be a comma and a whitespace in most languages</note>
|
<note from="description" priority="1">this is used to separate enumerations and should probably be a comma and a whitespace in most languages</note>
|
||||||
</trans-unit>
|
</trans-unit>
|
||||||
@@ -1426,7 +1434,7 @@
|
|||||||
<target><x equiv-text="list" id="PH"/> et "<x equiv-text="items[items.length - 1].name" id="PH_1"/>"</target>
|
<target><x equiv-text="list" id="PH"/> et "<x equiv-text="items[items.length - 1].name" id="PH_1"/>"</target>
|
||||||
<context-group purpose="location">
|
<context-group purpose="location">
|
||||||
<context context-type="sourcefile">src/app/components/document-list/bulk-editor/bulk-editor.component.ts</context>
|
<context context-type="sourcefile">src/app/components/document-list/bulk-editor/bulk-editor.component.ts</context>
|
||||||
<context context-type="linenumber">117</context>
|
<context context-type="linenumber">118</context>
|
||||||
</context-group>
|
</context-group>
|
||||||
<note from="description" priority="1">this is for messages like 'modify "tag1", "tag2" and "tag3"'</note>
|
<note from="description" priority="1">this is for messages like 'modify "tag1", "tag2" and "tag3"'</note>
|
||||||
</trans-unit>
|
</trans-unit>
|
||||||
@@ -1435,7 +1443,7 @@
|
|||||||
<target>Confirmer l'affectation des étiquettes</target>
|
<target>Confirmer l'affectation des étiquettes</target>
|
||||||
<context-group purpose="location">
|
<context-group purpose="location">
|
||||||
<context context-type="sourcefile">src/app/components/document-list/bulk-editor/bulk-editor.component.ts</context>
|
<context context-type="sourcefile">src/app/components/document-list/bulk-editor/bulk-editor.component.ts</context>
|
||||||
<context context-type="linenumber">126</context>
|
<context context-type="linenumber">127</context>
|
||||||
</context-group>
|
</context-group>
|
||||||
</trans-unit>
|
</trans-unit>
|
||||||
<trans-unit datatype="html" id="6619516195038467207">
|
<trans-unit datatype="html" id="6619516195038467207">
|
||||||
@@ -1443,7 +1451,7 @@
|
|||||||
<target>Cette action affectera l'étiquette "<x equiv-text="tag.name" id="PH"/>" au(x) <x equiv-text="this.list.selected.size" id="PH_1"/> document(s) sélectionné(s).</target>
|
<target>Cette action affectera l'étiquette "<x equiv-text="tag.name" id="PH"/>" au(x) <x equiv-text="this.list.selected.size" id="PH_1"/> document(s) sélectionné(s).</target>
|
||||||
<context-group purpose="location">
|
<context-group purpose="location">
|
||||||
<context context-type="sourcefile">src/app/components/document-list/bulk-editor/bulk-editor.component.ts</context>
|
<context context-type="sourcefile">src/app/components/document-list/bulk-editor/bulk-editor.component.ts</context>
|
||||||
<context context-type="linenumber">129</context>
|
<context context-type="linenumber">130</context>
|
||||||
</context-group>
|
</context-group>
|
||||||
</trans-unit>
|
</trans-unit>
|
||||||
<trans-unit datatype="html" id="1894412783609570695">
|
<trans-unit datatype="html" id="1894412783609570695">
|
||||||
@@ -1451,7 +1459,7 @@
|
|||||||
<target>Cette action affectera les étiquettes <x equiv-text="this._localizeList(changedTags.itemsToAdd)" id="PH"/> au(x) <x equiv-text="this.list.selected.size" id="PH_1"/> document(s) sélectionné(s).</target>
|
<target>Cette action affectera les étiquettes <x equiv-text="this._localizeList(changedTags.itemsToAdd)" id="PH"/> au(x) <x equiv-text="this.list.selected.size" id="PH_1"/> document(s) sélectionné(s).</target>
|
||||||
<context-group purpose="location">
|
<context-group purpose="location">
|
||||||
<context context-type="sourcefile">src/app/components/document-list/bulk-editor/bulk-editor.component.ts</context>
|
<context context-type="sourcefile">src/app/components/document-list/bulk-editor/bulk-editor.component.ts</context>
|
||||||
<context context-type="linenumber">131</context>
|
<context context-type="linenumber">132</context>
|
||||||
</context-group>
|
</context-group>
|
||||||
</trans-unit>
|
</trans-unit>
|
||||||
<trans-unit datatype="html" id="7181166515756808573">
|
<trans-unit datatype="html" id="7181166515756808573">
|
||||||
@@ -1459,7 +1467,7 @@
|
|||||||
<target>Cette action supprimera l'étiquette "<x equiv-text="tag.name" id="PH"/>" de(s) <x equiv-text="this.list.selected.size" id="PH_1"/> document(s) sélectionné(s).</target>
|
<target>Cette action supprimera l'étiquette "<x equiv-text="tag.name" id="PH"/>" de(s) <x equiv-text="this.list.selected.size" id="PH_1"/> document(s) sélectionné(s).</target>
|
||||||
<context-group purpose="location">
|
<context-group purpose="location">
|
||||||
<context context-type="sourcefile">src/app/components/document-list/bulk-editor/bulk-editor.component.ts</context>
|
<context context-type="sourcefile">src/app/components/document-list/bulk-editor/bulk-editor.component.ts</context>
|
||||||
<context context-type="linenumber">134</context>
|
<context context-type="linenumber">135</context>
|
||||||
</context-group>
|
</context-group>
|
||||||
</trans-unit>
|
</trans-unit>
|
||||||
<trans-unit datatype="html" id="3819792277998068944">
|
<trans-unit datatype="html" id="3819792277998068944">
|
||||||
@@ -1467,7 +1475,7 @@
|
|||||||
<target>Cette action supprimera les étiquettes <x equiv-text="this._localizeList(changedTags.itemsToRemove)" id="PH"/> de(s) <x equiv-text="this.list.selected.size" id="PH_1"/> document(s) sélectionné(s).</target>
|
<target>Cette action supprimera les étiquettes <x equiv-text="this._localizeList(changedTags.itemsToRemove)" id="PH"/> de(s) <x equiv-text="this.list.selected.size" id="PH_1"/> document(s) sélectionné(s).</target>
|
||||||
<context-group purpose="location">
|
<context-group purpose="location">
|
||||||
<context context-type="sourcefile">src/app/components/document-list/bulk-editor/bulk-editor.component.ts</context>
|
<context context-type="sourcefile">src/app/components/document-list/bulk-editor/bulk-editor.component.ts</context>
|
||||||
<context context-type="linenumber">136</context>
|
<context context-type="linenumber">137</context>
|
||||||
</context-group>
|
</context-group>
|
||||||
</trans-unit>
|
</trans-unit>
|
||||||
<trans-unit datatype="html" id="2739066218579571288">
|
<trans-unit datatype="html" id="2739066218579571288">
|
||||||
@@ -1475,7 +1483,7 @@
|
|||||||
<target>Cette action affectera les étiquettes <x equiv-text="this._localizeList(changedTags.itemsToAdd)" id="PH"/> et supprimera les étiquettes <x equiv-text="this._localizeList(changedTags.itemsToRemove)" id="PH_1"/> de(s) <x equiv-text="this.list.selected.size" id="PH_2"/> document(s) sélectionné(s).</target>
|
<target>Cette action affectera les étiquettes <x equiv-text="this._localizeList(changedTags.itemsToAdd)" id="PH"/> et supprimera les étiquettes <x equiv-text="this._localizeList(changedTags.itemsToRemove)" id="PH_1"/> de(s) <x equiv-text="this.list.selected.size" id="PH_2"/> document(s) sélectionné(s).</target>
|
||||||
<context-group purpose="location">
|
<context-group purpose="location">
|
||||||
<context context-type="sourcefile">src/app/components/document-list/bulk-editor/bulk-editor.component.ts</context>
|
<context context-type="sourcefile">src/app/components/document-list/bulk-editor/bulk-editor.component.ts</context>
|
||||||
<context context-type="linenumber">138</context>
|
<context context-type="linenumber">139</context>
|
||||||
</context-group>
|
</context-group>
|
||||||
</trans-unit>
|
</trans-unit>
|
||||||
<trans-unit datatype="html" id="2996713129519325161">
|
<trans-unit datatype="html" id="2996713129519325161">
|
||||||
@@ -1483,7 +1491,7 @@
|
|||||||
<target>Confirmer l'affectation du correspondant</target>
|
<target>Confirmer l'affectation du correspondant</target>
|
||||||
<context-group purpose="location">
|
<context-group purpose="location">
|
||||||
<context context-type="sourcefile">src/app/components/document-list/bulk-editor/bulk-editor.component.ts</context>
|
<context context-type="sourcefile">src/app/components/document-list/bulk-editor/bulk-editor.component.ts</context>
|
||||||
<context context-type="linenumber">158</context>
|
<context context-type="linenumber">159</context>
|
||||||
</context-group>
|
</context-group>
|
||||||
</trans-unit>
|
</trans-unit>
|
||||||
<trans-unit datatype="html" id="6900893559485781849">
|
<trans-unit datatype="html" id="6900893559485781849">
|
||||||
@@ -1491,7 +1499,7 @@
|
|||||||
<target>Cette action affectera le correspondant "<x equiv-text="correspondent.name" id="PH"/>" au(x) <x equiv-text="this.list.selected.size" id="PH_1"/>document(s) sélectionné(s).</target>
|
<target>Cette action affectera le correspondant "<x equiv-text="correspondent.name" id="PH"/>" au(x) <x equiv-text="this.list.selected.size" id="PH_1"/>document(s) sélectionné(s).</target>
|
||||||
<context-group purpose="location">
|
<context-group purpose="location">
|
||||||
<context context-type="sourcefile">src/app/components/document-list/bulk-editor/bulk-editor.component.ts</context>
|
<context context-type="sourcefile">src/app/components/document-list/bulk-editor/bulk-editor.component.ts</context>
|
||||||
<context context-type="linenumber">160</context>
|
<context context-type="linenumber">161</context>
|
||||||
</context-group>
|
</context-group>
|
||||||
</trans-unit>
|
</trans-unit>
|
||||||
<trans-unit datatype="html" id="1257522660364398440">
|
<trans-unit datatype="html" id="1257522660364398440">
|
||||||
@@ -1499,7 +1507,7 @@
|
|||||||
<target>Cette action supprimera le correspondant de(s) <x equiv-text="this.list.selected.size" id="PH"/> document(s) sélectionné(s).</target>
|
<target>Cette action supprimera le correspondant de(s) <x equiv-text="this.list.selected.size" id="PH"/> document(s) sélectionné(s).</target>
|
||||||
<context-group purpose="location">
|
<context-group purpose="location">
|
||||||
<context context-type="sourcefile">src/app/components/document-list/bulk-editor/bulk-editor.component.ts</context>
|
<context context-type="sourcefile">src/app/components/document-list/bulk-editor/bulk-editor.component.ts</context>
|
||||||
<context context-type="linenumber">162</context>
|
<context context-type="linenumber">163</context>
|
||||||
</context-group>
|
</context-group>
|
||||||
</trans-unit>
|
</trans-unit>
|
||||||
<trans-unit datatype="html" id="5393409374423140648">
|
<trans-unit datatype="html" id="5393409374423140648">
|
||||||
@@ -1507,7 +1515,7 @@
|
|||||||
<target>Confirmer l'affectation du type de document</target>
|
<target>Confirmer l'affectation du type de document</target>
|
||||||
<context-group purpose="location">
|
<context-group purpose="location">
|
||||||
<context context-type="sourcefile">src/app/components/document-list/bulk-editor/bulk-editor.component.ts</context>
|
<context context-type="sourcefile">src/app/components/document-list/bulk-editor/bulk-editor.component.ts</context>
|
||||||
<context context-type="linenumber">181</context>
|
<context context-type="linenumber">182</context>
|
||||||
</context-group>
|
</context-group>
|
||||||
</trans-unit>
|
</trans-unit>
|
||||||
<trans-unit datatype="html" id="332180123895325027">
|
<trans-unit datatype="html" id="332180123895325027">
|
||||||
@@ -1515,7 +1523,7 @@
|
|||||||
<target>Cette action affectera le type de document "<x equiv-text="documentType.name" id="PH"/>" au(x) <x equiv-text="this.list.selected.size" id="PH_1"/> document(s) sélectionné(s).</target>
|
<target>Cette action affectera le type de document "<x equiv-text="documentType.name" id="PH"/>" au(x) <x equiv-text="this.list.selected.size" id="PH_1"/> document(s) sélectionné(s).</target>
|
||||||
<context-group purpose="location">
|
<context-group purpose="location">
|
||||||
<context context-type="sourcefile">src/app/components/document-list/bulk-editor/bulk-editor.component.ts</context>
|
<context context-type="sourcefile">src/app/components/document-list/bulk-editor/bulk-editor.component.ts</context>
|
||||||
<context context-type="linenumber">183</context>
|
<context context-type="linenumber">184</context>
|
||||||
</context-group>
|
</context-group>
|
||||||
</trans-unit>
|
</trans-unit>
|
||||||
<trans-unit datatype="html" id="2236642492594872779">
|
<trans-unit datatype="html" id="2236642492594872779">
|
||||||
@@ -1523,7 +1531,7 @@
|
|||||||
<target>Cette action supprimera le type de document de(s) <x equiv-text="this.list.selected.size" id="PH"/> document(s) sélectionné(s).</target>
|
<target>Cette action supprimera le type de document de(s) <x equiv-text="this.list.selected.size" id="PH"/> document(s) sélectionné(s).</target>
|
||||||
<context-group purpose="location">
|
<context-group purpose="location">
|
||||||
<context context-type="sourcefile">src/app/components/document-list/bulk-editor/bulk-editor.component.ts</context>
|
<context context-type="sourcefile">src/app/components/document-list/bulk-editor/bulk-editor.component.ts</context>
|
||||||
<context context-type="linenumber">185</context>
|
<context context-type="linenumber">186</context>
|
||||||
</context-group>
|
</context-group>
|
||||||
</trans-unit>
|
</trans-unit>
|
||||||
<trans-unit datatype="html" id="749430623564850405">
|
<trans-unit datatype="html" id="749430623564850405">
|
||||||
@@ -1531,7 +1539,7 @@
|
|||||||
<target>Confirmer la suppression</target>
|
<target>Confirmer la suppression</target>
|
||||||
<context-group purpose="location">
|
<context-group purpose="location">
|
||||||
<context context-type="sourcefile">src/app/components/document-list/bulk-editor/bulk-editor.component.ts</context>
|
<context context-type="sourcefile">src/app/components/document-list/bulk-editor/bulk-editor.component.ts</context>
|
||||||
<context context-type="linenumber">200</context>
|
<context context-type="linenumber">201</context>
|
||||||
</context-group>
|
</context-group>
|
||||||
</trans-unit>
|
</trans-unit>
|
||||||
<trans-unit datatype="html" id="4303174930844518780">
|
<trans-unit datatype="html" id="4303174930844518780">
|
||||||
@@ -1539,7 +1547,7 @@
|
|||||||
<target>Cette action supprimera définitivement <x equiv-text="this.list.selected.size" id="PH"/> document(s) sélectionné(s).</target>
|
<target>Cette action supprimera définitivement <x equiv-text="this.list.selected.size" id="PH"/> document(s) sélectionné(s).</target>
|
||||||
<context-group purpose="location">
|
<context-group purpose="location">
|
||||||
<context context-type="sourcefile">src/app/components/document-list/bulk-editor/bulk-editor.component.ts</context>
|
<context context-type="sourcefile">src/app/components/document-list/bulk-editor/bulk-editor.component.ts</context>
|
||||||
<context context-type="linenumber">201</context>
|
<context context-type="linenumber">202</context>
|
||||||
</context-group>
|
</context-group>
|
||||||
</trans-unit>
|
</trans-unit>
|
||||||
<trans-unit datatype="html" id="5641451190833696892">
|
<trans-unit datatype="html" id="5641451190833696892">
|
||||||
@@ -1547,7 +1555,7 @@
|
|||||||
<target>Cette action est irréversible.</target>
|
<target>Cette action est irréversible.</target>
|
||||||
<context-group purpose="location">
|
<context-group purpose="location">
|
||||||
<context context-type="sourcefile">src/app/components/document-list/bulk-editor/bulk-editor.component.ts</context>
|
<context context-type="sourcefile">src/app/components/document-list/bulk-editor/bulk-editor.component.ts</context>
|
||||||
<context context-type="linenumber">202</context>
|
<context context-type="linenumber">203</context>
|
||||||
</context-group>
|
</context-group>
|
||||||
</trans-unit>
|
</trans-unit>
|
||||||
<trans-unit datatype="html" id="6734339521247847366">
|
<trans-unit datatype="html" id="6734339521247847366">
|
||||||
@@ -1555,7 +1563,7 @@
|
|||||||
<target>Supprimer le(s) document(s)</target>
|
<target>Supprimer le(s) document(s)</target>
|
||||||
<context-group purpose="location">
|
<context-group purpose="location">
|
||||||
<context context-type="sourcefile">src/app/components/document-list/bulk-editor/bulk-editor.component.ts</context>
|
<context context-type="sourcefile">src/app/components/document-list/bulk-editor/bulk-editor.component.ts</context>
|
||||||
<context context-type="linenumber">204</context>
|
<context context-type="linenumber">205</context>
|
||||||
</context-group>
|
</context-group>
|
||||||
</trans-unit>
|
</trans-unit>
|
||||||
<trans-unit datatype="html" id="8b0609df23817024b3bed12beb9b64fc1009f588">
|
<trans-unit datatype="html" id="8b0609df23817024b3bed12beb9b64fc1009f588">
|
||||||
@@ -1582,6 +1590,14 @@
|
|||||||
<context context-type="linenumber">27</context>
|
<context context-type="linenumber">27</context>
|
||||||
</context-group>
|
</context-group>
|
||||||
</trans-unit>
|
</trans-unit>
|
||||||
|
<trans-unit datatype="html" id="fc2de37422d7c4af6686842283cc2afd781b6848">
|
||||||
|
<source>Download originals</source>
|
||||||
|
<target>Télécharger les originaux</target>
|
||||||
|
<context-group purpose="location">
|
||||||
|
<context context-type="sourcefile">src/app/components/document-list/bulk-editor/bulk-editor.component.html</context>
|
||||||
|
<context context-type="linenumber">68</context>
|
||||||
|
</context-group>
|
||||||
|
</trans-unit>
|
||||||
<trans-unit datatype="html" id="a1e6c11f20d4bf6e8e6b43e3c6d2561b2080645e">
|
<trans-unit datatype="html" id="a1e6c11f20d4bf6e8e6b43e3c6d2561b2080645e">
|
||||||
<source>Suggestions:</source>
|
<source>Suggestions:</source>
|
||||||
<target>Suggestions : </target>
|
<target>Suggestions : </target>
|
||||||
@@ -1614,22 +1630,22 @@
|
|||||||
<context context-type="linenumber">1</context>
|
<context context-type="linenumber">1</context>
|
||||||
</context-group>
|
</context-group>
|
||||||
</trans-unit>
|
</trans-unit>
|
||||||
<trans-unit datatype="html" id="46c8fe557cf52c9389783627d4f85453f4ddb459">
|
<trans-unit datatype="html" id="c0d907c2687c09612395aee6ef7c04ca8e5e5e0a">
|
||||||
<source>Documents in inbox: <x equiv-text="{{statistics.documents_inbox}}" id="INTERPOLATION"/></source>
|
<source>Total documents: <x equiv-text="{{statistics?.documents_total}}" id="INTERPOLATION"/></source>
|
||||||
<target>Documents dans la boîte de réception : <x equiv-text="{{statistics.documents_inbox}}" id="INTERPOLATION"/></target>
|
<target>Nombre total de documents : <x equiv-text="{{statistics?.documents_total}}" id="INTERPOLATION"/></target>
|
||||||
<context-group purpose="location">
|
|
||||||
<context context-type="sourcefile">src/app/components/dashboard/widgets/statistics-widget/statistics-widget.component.html</context>
|
|
||||||
<context context-type="linenumber">3</context>
|
|
||||||
</context-group>
|
|
||||||
</trans-unit>
|
|
||||||
<trans-unit datatype="html" id="c327c0e67bcac7494dcbaa9afb3b42d5008c6438">
|
|
||||||
<source>Total documents: <x equiv-text="{{statistics.documents_total}}" id="INTERPOLATION"/></source>
|
|
||||||
<target>Nombre total de documents : <x equiv-text="{{statistics.documents_total}}" id="INTERPOLATION"/></target>
|
|
||||||
<context-group purpose="location">
|
<context-group purpose="location">
|
||||||
<context context-type="sourcefile">src/app/components/dashboard/widgets/statistics-widget/statistics-widget.component.html</context>
|
<context context-type="sourcefile">src/app/components/dashboard/widgets/statistics-widget/statistics-widget.component.html</context>
|
||||||
<context context-type="linenumber">4</context>
|
<context context-type="linenumber">4</context>
|
||||||
</context-group>
|
</context-group>
|
||||||
</trans-unit>
|
</trans-unit>
|
||||||
|
<trans-unit datatype="html" id="13e8d49dbcad9f9d71e66a9a56d6f328cff430c9">
|
||||||
|
<source>Documents in inbox: <x equiv-text="{{statistics?.documents_inbox}}" id="INTERPOLATION"/></source>
|
||||||
|
<target>Documents dans la boîte de réception : <x equiv-text="{{statistics?.documents_inbox}}" id="INTERPOLATION"/></target>
|
||||||
|
<context-group purpose="location">
|
||||||
|
<context context-type="sourcefile">src/app/components/dashboard/widgets/statistics-widget/statistics-widget.component.html</context>
|
||||||
|
<context context-type="linenumber">3</context>
|
||||||
|
</context-group>
|
||||||
|
</trans-unit>
|
||||||
<trans-unit datatype="html" id="6443586946875325554">
|
<trans-unit datatype="html" id="6443586946875325554">
|
||||||
<source>Processing: <x equiv-text="countUploadingAndProcessing" id="PH"/></source>
|
<source>Processing: <x equiv-text="countUploadingAndProcessing" id="PH"/></source>
|
||||||
<target>Traitement : <x equiv-text="countUploadingAndProcessing" id="PH"/></target>
|
<target>Traitement : <x equiv-text="countUploadingAndProcessing" id="PH"/></target>
|
||||||
@@ -1848,12 +1864,20 @@
|
|||||||
<context context-type="linenumber">82</context>
|
<context context-type="linenumber">82</context>
|
||||||
</context-group>
|
</context-group>
|
||||||
</trans-unit>
|
</trans-unit>
|
||||||
|
<trans-unit datatype="html" id="6987083569809053351">
|
||||||
|
<source>English (GB)</source>
|
||||||
|
<target>Anglais (GB)</target>
|
||||||
|
<context-group purpose="location">
|
||||||
|
<context context-type="sourcefile">src/app/services/settings.service.ts</context>
|
||||||
|
<context context-type="linenumber">83</context>
|
||||||
|
</context-group>
|
||||||
|
</trans-unit>
|
||||||
<trans-unit datatype="html" id="1858110241312746425">
|
<trans-unit datatype="html" id="1858110241312746425">
|
||||||
<source>German</source>
|
<source>German</source>
|
||||||
<target>Allemand</target>
|
<target>Allemand</target>
|
||||||
<context-group purpose="location">
|
<context-group purpose="location">
|
||||||
<context context-type="sourcefile">src/app/services/settings.service.ts</context>
|
<context context-type="sourcefile">src/app/services/settings.service.ts</context>
|
||||||
<context context-type="linenumber">83</context>
|
<context context-type="linenumber">84</context>
|
||||||
</context-group>
|
</context-group>
|
||||||
</trans-unit>
|
</trans-unit>
|
||||||
<trans-unit datatype="html" id="3071065188816255493">
|
<trans-unit datatype="html" id="3071065188816255493">
|
||||||
@@ -1861,7 +1885,7 @@
|
|||||||
<target>Néerlandais</target>
|
<target>Néerlandais</target>
|
||||||
<context-group purpose="location">
|
<context-group purpose="location">
|
||||||
<context context-type="sourcefile">src/app/services/settings.service.ts</context>
|
<context context-type="sourcefile">src/app/services/settings.service.ts</context>
|
||||||
<context context-type="linenumber">84</context>
|
<context context-type="linenumber">85</context>
|
||||||
</context-group>
|
</context-group>
|
||||||
</trans-unit>
|
</trans-unit>
|
||||||
<trans-unit datatype="html" id="7633754075223722162">
|
<trans-unit datatype="html" id="7633754075223722162">
|
||||||
@@ -1869,7 +1893,7 @@
|
|||||||
<target>Français</target>
|
<target>Français</target>
|
||||||
<context-group purpose="location">
|
<context-group purpose="location">
|
||||||
<context context-type="sourcefile">src/app/services/settings.service.ts</context>
|
<context context-type="sourcefile">src/app/services/settings.service.ts</context>
|
||||||
<context context-type="linenumber">85</context>
|
<context context-type="linenumber">86</context>
|
||||||
</context-group>
|
</context-group>
|
||||||
</trans-unit>
|
</trans-unit>
|
||||||
<trans-unit datatype="html" id="2119857572761283468">
|
<trans-unit datatype="html" id="2119857572761283468">
|
||||||
|
@@ -58,11 +58,11 @@
|
|||||||
</context-group>
|
</context-group>
|
||||||
</trans-unit>
|
</trans-unit>
|
||||||
<trans-unit datatype="html" id="2155249406916744630">
|
<trans-unit datatype="html" id="2155249406916744630">
|
||||||
<source>View "<x equiv-text="this.list.savedView.name" id="PH"/>" saved successfully.</source>
|
<source>View "<x equiv-text="this.list.activeSavedViewTitle" id="PH"/>" saved successfully.</source>
|
||||||
<target>View "<x equiv-text="this.list.savedView.name" id="PH"/>" met succes opgeslagen.</target>
|
<target>View "<x equiv-text="this.list.activeSavedViewTitle" id="PH"/>" met succes opgeslagen.</target>
|
||||||
<context-group purpose="location">
|
<context-group purpose="location">
|
||||||
<context context-type="sourcefile">src/app/components/document-list/document-list.component.ts</context>
|
<context context-type="sourcefile">src/app/components/document-list/document-list.component.ts</context>
|
||||||
<context context-type="linenumber">109</context>
|
<context context-type="linenumber">115</context>
|
||||||
</context-group>
|
</context-group>
|
||||||
</trans-unit>
|
</trans-unit>
|
||||||
<trans-unit datatype="html" id="6837554170707123455">
|
<trans-unit datatype="html" id="6837554170707123455">
|
||||||
@@ -70,7 +70,7 @@
|
|||||||
<target>View "<x equiv-text="savedView.name" id="PH"/>" met succes gemaakt.</target>
|
<target>View "<x equiv-text="savedView.name" id="PH"/>" met succes gemaakt.</target>
|
||||||
<context-group purpose="location">
|
<context-group purpose="location">
|
||||||
<context context-type="sourcefile">src/app/components/document-list/document-list.component.ts</context>
|
<context context-type="sourcefile">src/app/components/document-list/document-list.component.ts</context>
|
||||||
<context context-type="linenumber">130</context>
|
<context context-type="linenumber">136</context>
|
||||||
</context-group>
|
</context-group>
|
||||||
</trans-unit>
|
</trans-unit>
|
||||||
<trans-unit datatype="html" id="9ca82952a6bc860b5391d5975322d8af8ceddfa4">
|
<trans-unit datatype="html" id="9ca82952a6bc860b5391d5975322d8af8ceddfa4">
|
||||||
@@ -129,9 +129,9 @@
|
|||||||
<context context-type="linenumber">72</context>
|
<context context-type="linenumber">72</context>
|
||||||
</context-group>
|
</context-group>
|
||||||
</trans-unit>
|
</trans-unit>
|
||||||
<trans-unit datatype="html" id="72e7d343f9165602cce1ca7faffbc565fd31ef92">
|
<trans-unit datatype="html" id="5f5ce787c428d917c30c9bd70789a618e09743a7">
|
||||||
<source>Save "<x equiv-text="{{list.savedViewTitle}}" id="INTERPOLATION"/>"</source>
|
<source>Save "<x equiv-text="{{list.activeSavedViewTitle}}" id="INTERPOLATION"/>"</source>
|
||||||
<target>Opslaan "<x equiv-text="{{list.savedViewTitle}}" id="INTERPOLATION"/>"</target>
|
<target>Opslaan "<x equiv-text="{{list.activeSavedViewTitle}}" id="INTERPOLATION"/>"</target>
|
||||||
<context-group purpose="location">
|
<context-group purpose="location">
|
||||||
<context context-type="sourcefile">src/app/components/document-list/document-list.component.html</context>
|
<context context-type="sourcefile">src/app/components/document-list/document-list.component.html</context>
|
||||||
<context context-type="linenumber">71</context>
|
<context context-type="linenumber">71</context>
|
||||||
@@ -585,14 +585,6 @@
|
|||||||
<context context-type="linenumber">1</context>
|
<context context-type="linenumber">1</context>
|
||||||
</context-group>
|
</context-group>
|
||||||
</trans-unit>
|
</trans-unit>
|
||||||
<trans-unit datatype="html" id="5ca707824ab93066c7d9b44e1b8bf216725c2c22">
|
|
||||||
<source>Filter</source>
|
|
||||||
<target>Filter</target>
|
|
||||||
<context-group purpose="location">
|
|
||||||
<context context-type="sourcefile">src/app/components/manage/logs/logs.component.html</context>
|
|
||||||
<context context-type="linenumber">7</context>
|
|
||||||
</context-group>
|
|
||||||
</trans-unit>
|
|
||||||
<trans-unit datatype="html" id="5610279464668232148">
|
<trans-unit datatype="html" id="5610279464668232148">
|
||||||
<source>Saved view "<x equiv-text="savedView.name" id="PH"/>" deleted.</source>
|
<source>Saved view "<x equiv-text="savedView.name" id="PH"/>" deleted.</source>
|
||||||
<target>Opgeslagen view "<x equiv-text="savedView.name" id="PH"/>" verwijderd.</target>
|
<target>Opgeslagen view "<x equiv-text="savedView.name" id="PH"/>" verwijderd.</target>
|
||||||
@@ -622,7 +614,15 @@
|
|||||||
<target>Datumopmaak van weergavetaal gebruiken</target>
|
<target>Datumopmaak van weergavetaal gebruiken</target>
|
||||||
<context-group purpose="location">
|
<context-group purpose="location">
|
||||||
<context context-type="sourcefile">src/app/components/manage/settings/settings.component.ts</context>
|
<context context-type="sourcefile">src/app/components/manage/settings/settings.component.ts</context>
|
||||||
<context context-type="linenumber">95</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-group>
|
</context-group>
|
||||||
</trans-unit>
|
</trans-unit>
|
||||||
<trans-unit datatype="html" id="8488620293789898901">
|
<trans-unit datatype="html" id="8488620293789898901">
|
||||||
@@ -630,7 +630,7 @@
|
|||||||
<target>Fout bij het opslaan van de instellingen: <x equiv-text="JSON.stringify(error.error)" id="PH"/></target>
|
<target>Fout bij het opslaan van de instellingen: <x equiv-text="JSON.stringify(error.error)" id="PH"/></target>
|
||||||
<context-group purpose="location">
|
<context-group purpose="location">
|
||||||
<context context-type="sourcefile">src/app/components/manage/settings/settings.component.ts</context>
|
<context context-type="sourcefile">src/app/components/manage/settings/settings.component.ts</context>
|
||||||
<context context-type="linenumber">111</context>
|
<context context-type="linenumber">114</context>
|
||||||
</context-group>
|
</context-group>
|
||||||
</trans-unit>
|
</trans-unit>
|
||||||
<trans-unit datatype="html" id="121cc5391cd2a5115bc2b3160379ee5b36cd7716">
|
<trans-unit datatype="html" id="121cc5391cd2a5115bc2b3160379ee5b36cd7716">
|
||||||
@@ -1234,6 +1234,14 @@
|
|||||||
<context context-type="linenumber">46</context>
|
<context context-type="linenumber">46</context>
|
||||||
</context-group>
|
</context-group>
|
||||||
</trans-unit>
|
</trans-unit>
|
||||||
|
<trans-unit datatype="html" id="6523384805359286307">
|
||||||
|
<source>Title: <x equiv-text="rule.value" id="PH"/></source>
|
||||||
|
<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-group>
|
||||||
|
</trans-unit>
|
||||||
<trans-unit datatype="html" id="02d184c288f567825a1fcbf83bcd3099a10853d5">
|
<trans-unit datatype="html" id="02d184c288f567825a1fcbf83bcd3099a10853d5">
|
||||||
<source>Filter tags</source>
|
<source>Filter tags</source>
|
||||||
<target>Etiketten filteren</target>
|
<target>Etiketten filteren</target>
|
||||||
@@ -1392,7 +1400,7 @@
|
|||||||
<target>Fout bij het uitvoeren van een massabewerking: <x equiv-text="JSON.stringify(error.error)" id="PH"/></target>
|
<target>Fout bij het uitvoeren van een massabewerking: <x equiv-text="JSON.stringify(error.error)" id="PH"/></target>
|
||||||
<context-group purpose="location">
|
<context-group purpose="location">
|
||||||
<context context-type="sourcefile">src/app/components/document-list/bulk-editor/bulk-editor.component.ts</context>
|
<context context-type="sourcefile">src/app/components/document-list/bulk-editor/bulk-editor.component.ts</context>
|
||||||
<context context-type="linenumber">73</context>
|
<context context-type="linenumber">74</context>
|
||||||
</context-group>
|
</context-group>
|
||||||
</trans-unit>
|
</trans-unit>
|
||||||
<trans-unit datatype="html" id="7894972847287473517">
|
<trans-unit datatype="html" id="7894972847287473517">
|
||||||
@@ -1400,7 +1408,7 @@
|
|||||||
<target>"<x equiv-text="items[0].name" id="PH"/>"</target>
|
<target>"<x equiv-text="items[0].name" id="PH"/>"</target>
|
||||||
<context-group purpose="location">
|
<context-group purpose="location">
|
||||||
<context context-type="sourcefile">src/app/components/document-list/bulk-editor/bulk-editor.component.ts</context>
|
<context context-type="sourcefile">src/app/components/document-list/bulk-editor/bulk-editor.component.ts</context>
|
||||||
<context context-type="linenumber">112</context>
|
<context context-type="linenumber">113</context>
|
||||||
</context-group>
|
</context-group>
|
||||||
</trans-unit>
|
</trans-unit>
|
||||||
<trans-unit datatype="html" id="8639884465898458690">
|
<trans-unit datatype="html" id="8639884465898458690">
|
||||||
@@ -1408,7 +1416,7 @@
|
|||||||
<target>"<x equiv-text="items[0].name" id="PH"/>" en "<x equiv-text="items[1].name" id="PH_1"/>"</target>
|
<target>"<x equiv-text="items[0].name" id="PH"/>" en "<x equiv-text="items[1].name" id="PH_1"/>"</target>
|
||||||
<context-group purpose="location">
|
<context-group purpose="location">
|
||||||
<context context-type="sourcefile">src/app/components/document-list/bulk-editor/bulk-editor.component.ts</context>
|
<context context-type="sourcefile">src/app/components/document-list/bulk-editor/bulk-editor.component.ts</context>
|
||||||
<context context-type="linenumber">114</context>
|
<context context-type="linenumber">115</context>
|
||||||
</context-group>
|
</context-group>
|
||||||
<note from="description" priority="1">This is for messages like 'modify "tag1" and "tag2"'</note>
|
<note from="description" priority="1">This is for messages like 'modify "tag1" and "tag2"'</note>
|
||||||
</trans-unit>
|
</trans-unit>
|
||||||
@@ -1417,7 +1425,7 @@
|
|||||||
<target>, </target>
|
<target>, </target>
|
||||||
<context-group purpose="location">
|
<context-group purpose="location">
|
||||||
<context context-type="sourcefile">src/app/components/document-list/bulk-editor/bulk-editor.component.ts</context>
|
<context context-type="sourcefile">src/app/components/document-list/bulk-editor/bulk-editor.component.ts</context>
|
||||||
<context context-type="linenumber">116</context>
|
<context context-type="linenumber">117</context>
|
||||||
</context-group>
|
</context-group>
|
||||||
<note from="description" priority="1">this is used to separate enumerations and should probably be a comma and a whitespace in most languages</note>
|
<note from="description" priority="1">this is used to separate enumerations and should probably be a comma and a whitespace in most languages</note>
|
||||||
</trans-unit>
|
</trans-unit>
|
||||||
@@ -1426,7 +1434,7 @@
|
|||||||
<target><x equiv-text="list" id="PH"/> en "<x equiv-text="items[items.length - 1].name" id="PH_1"/>"</target>
|
<target><x equiv-text="list" id="PH"/> en "<x equiv-text="items[items.length - 1].name" id="PH_1"/>"</target>
|
||||||
<context-group purpose="location">
|
<context-group purpose="location">
|
||||||
<context context-type="sourcefile">src/app/components/document-list/bulk-editor/bulk-editor.component.ts</context>
|
<context context-type="sourcefile">src/app/components/document-list/bulk-editor/bulk-editor.component.ts</context>
|
||||||
<context context-type="linenumber">117</context>
|
<context context-type="linenumber">118</context>
|
||||||
</context-group>
|
</context-group>
|
||||||
<note from="description" priority="1">this is for messages like 'modify "tag1", "tag2" and "tag3"'</note>
|
<note from="description" priority="1">this is for messages like 'modify "tag1", "tag2" and "tag3"'</note>
|
||||||
</trans-unit>
|
</trans-unit>
|
||||||
@@ -1435,7 +1443,7 @@
|
|||||||
<target>Bevestig toewijzen van etiketten</target>
|
<target>Bevestig toewijzen van etiketten</target>
|
||||||
<context-group purpose="location">
|
<context-group purpose="location">
|
||||||
<context context-type="sourcefile">src/app/components/document-list/bulk-editor/bulk-editor.component.ts</context>
|
<context context-type="sourcefile">src/app/components/document-list/bulk-editor/bulk-editor.component.ts</context>
|
||||||
<context context-type="linenumber">126</context>
|
<context context-type="linenumber">127</context>
|
||||||
</context-group>
|
</context-group>
|
||||||
</trans-unit>
|
</trans-unit>
|
||||||
<trans-unit datatype="html" id="6619516195038467207">
|
<trans-unit datatype="html" id="6619516195038467207">
|
||||||
@@ -1443,7 +1451,7 @@
|
|||||||
<target>Het etiket "<x equiv-text="tag.name" id="PH"/>" zal aan <x equiv-text="this.list.selected.size" id="PH_1"/> geselecteerd(e) document(en) worden toegewezen.</target>
|
<target>Het etiket "<x equiv-text="tag.name" id="PH"/>" zal aan <x equiv-text="this.list.selected.size" id="PH_1"/> geselecteerd(e) document(en) worden toegewezen.</target>
|
||||||
<context-group purpose="location">
|
<context-group purpose="location">
|
||||||
<context context-type="sourcefile">src/app/components/document-list/bulk-editor/bulk-editor.component.ts</context>
|
<context context-type="sourcefile">src/app/components/document-list/bulk-editor/bulk-editor.component.ts</context>
|
||||||
<context context-type="linenumber">129</context>
|
<context context-type="linenumber">130</context>
|
||||||
</context-group>
|
</context-group>
|
||||||
</trans-unit>
|
</trans-unit>
|
||||||
<trans-unit datatype="html" id="1894412783609570695">
|
<trans-unit datatype="html" id="1894412783609570695">
|
||||||
@@ -1451,7 +1459,7 @@
|
|||||||
<target>De etiketten <x equiv-text="this._localizeList(changedTags.itemsToAdd)" id="PH"/> zullen aan <x equiv-text="this.list.selected.size" id="PH_1"/> geselecteerd(e) document(en) worden toegewezen.</target>
|
<target>De etiketten <x equiv-text="this._localizeList(changedTags.itemsToAdd)" id="PH"/> zullen aan <x equiv-text="this.list.selected.size" id="PH_1"/> geselecteerd(e) document(en) worden toegewezen.</target>
|
||||||
<context-group purpose="location">
|
<context-group purpose="location">
|
||||||
<context context-type="sourcefile">src/app/components/document-list/bulk-editor/bulk-editor.component.ts</context>
|
<context context-type="sourcefile">src/app/components/document-list/bulk-editor/bulk-editor.component.ts</context>
|
||||||
<context context-type="linenumber">131</context>
|
<context context-type="linenumber">132</context>
|
||||||
</context-group>
|
</context-group>
|
||||||
</trans-unit>
|
</trans-unit>
|
||||||
<trans-unit datatype="html" id="7181166515756808573">
|
<trans-unit datatype="html" id="7181166515756808573">
|
||||||
@@ -1459,7 +1467,7 @@
|
|||||||
<target>Het etiket "<x equiv-text="tag.name" id="PH"/>" zal verwijderd worden van <x equiv-text="this.list.selected.size" id="PH_1"/> geselecteerd(e) document(en).</target>
|
<target>Het etiket "<x equiv-text="tag.name" id="PH"/>" zal verwijderd worden van <x equiv-text="this.list.selected.size" id="PH_1"/> geselecteerd(e) document(en).</target>
|
||||||
<context-group purpose="location">
|
<context-group purpose="location">
|
||||||
<context context-type="sourcefile">src/app/components/document-list/bulk-editor/bulk-editor.component.ts</context>
|
<context context-type="sourcefile">src/app/components/document-list/bulk-editor/bulk-editor.component.ts</context>
|
||||||
<context context-type="linenumber">134</context>
|
<context context-type="linenumber">135</context>
|
||||||
</context-group>
|
</context-group>
|
||||||
</trans-unit>
|
</trans-unit>
|
||||||
<trans-unit datatype="html" id="3819792277998068944">
|
<trans-unit datatype="html" id="3819792277998068944">
|
||||||
@@ -1467,7 +1475,7 @@
|
|||||||
<target>De etiketten <x equiv-text="this._localizeList(changedTags.itemsToRemove)" id="PH"/> zullen verwijderd worden van <x equiv-text="this.list.selected.size" id="PH_1"/> geselecteerd(e) document(en).</target>
|
<target>De etiketten <x equiv-text="this._localizeList(changedTags.itemsToRemove)" id="PH"/> zullen verwijderd worden van <x equiv-text="this.list.selected.size" id="PH_1"/> geselecteerd(e) document(en).</target>
|
||||||
<context-group purpose="location">
|
<context-group purpose="location">
|
||||||
<context context-type="sourcefile">src/app/components/document-list/bulk-editor/bulk-editor.component.ts</context>
|
<context context-type="sourcefile">src/app/components/document-list/bulk-editor/bulk-editor.component.ts</context>
|
||||||
<context context-type="linenumber">136</context>
|
<context context-type="linenumber">137</context>
|
||||||
</context-group>
|
</context-group>
|
||||||
</trans-unit>
|
</trans-unit>
|
||||||
<trans-unit datatype="html" id="2739066218579571288">
|
<trans-unit datatype="html" id="2739066218579571288">
|
||||||
@@ -1475,7 +1483,7 @@
|
|||||||
<target>De etiketten <x equiv-text="this._localizeList(changedTags.itemsToAdd)" id="PH"/> zullen toegevoegd worden aan, en de etiketten <x equiv-text="this._localizeList(changedTags.itemsToRemove)" id="PH_1"/> zullen verwijderd worden van <x equiv-text="this.list.selected.size" id="PH_2"/> geselecteerd(e) document(en).</target>
|
<target>De etiketten <x equiv-text="this._localizeList(changedTags.itemsToAdd)" id="PH"/> zullen toegevoegd worden aan, en de etiketten <x equiv-text="this._localizeList(changedTags.itemsToRemove)" id="PH_1"/> zullen verwijderd worden van <x equiv-text="this.list.selected.size" id="PH_2"/> geselecteerd(e) document(en).</target>
|
||||||
<context-group purpose="location">
|
<context-group purpose="location">
|
||||||
<context context-type="sourcefile">src/app/components/document-list/bulk-editor/bulk-editor.component.ts</context>
|
<context context-type="sourcefile">src/app/components/document-list/bulk-editor/bulk-editor.component.ts</context>
|
||||||
<context context-type="linenumber">138</context>
|
<context context-type="linenumber">139</context>
|
||||||
</context-group>
|
</context-group>
|
||||||
</trans-unit>
|
</trans-unit>
|
||||||
<trans-unit datatype="html" id="2996713129519325161">
|
<trans-unit datatype="html" id="2996713129519325161">
|
||||||
@@ -1483,7 +1491,7 @@
|
|||||||
<target>Bevestig toewijzen van correspondent</target>
|
<target>Bevestig toewijzen van correspondent</target>
|
||||||
<context-group purpose="location">
|
<context-group purpose="location">
|
||||||
<context context-type="sourcefile">src/app/components/document-list/bulk-editor/bulk-editor.component.ts</context>
|
<context context-type="sourcefile">src/app/components/document-list/bulk-editor/bulk-editor.component.ts</context>
|
||||||
<context context-type="linenumber">158</context>
|
<context context-type="linenumber">159</context>
|
||||||
</context-group>
|
</context-group>
|
||||||
</trans-unit>
|
</trans-unit>
|
||||||
<trans-unit datatype="html" id="6900893559485781849">
|
<trans-unit datatype="html" id="6900893559485781849">
|
||||||
@@ -1491,7 +1499,7 @@
|
|||||||
<target>De correspondent "<x equiv-text="correspondent.name" id="PH"/>" zal aan <x equiv-text="this.list.selected.size" id="PH_1"/> geselecteerd(e) document(en) worden toegewezen.</target>
|
<target>De correspondent "<x equiv-text="correspondent.name" id="PH"/>" zal aan <x equiv-text="this.list.selected.size" id="PH_1"/> geselecteerd(e) document(en) worden toegewezen.</target>
|
||||||
<context-group purpose="location">
|
<context-group purpose="location">
|
||||||
<context context-type="sourcefile">src/app/components/document-list/bulk-editor/bulk-editor.component.ts</context>
|
<context context-type="sourcefile">src/app/components/document-list/bulk-editor/bulk-editor.component.ts</context>
|
||||||
<context context-type="linenumber">160</context>
|
<context context-type="linenumber">161</context>
|
||||||
</context-group>
|
</context-group>
|
||||||
</trans-unit>
|
</trans-unit>
|
||||||
<trans-unit datatype="html" id="1257522660364398440">
|
<trans-unit datatype="html" id="1257522660364398440">
|
||||||
@@ -1499,7 +1507,7 @@
|
|||||||
<target>De correspondent zal verwijderd worden van <x equiv-text="this.list.selected.size" id="PH"/> geselecteerd(e) document(en).</target>
|
<target>De correspondent zal verwijderd worden van <x equiv-text="this.list.selected.size" id="PH"/> geselecteerd(e) document(en).</target>
|
||||||
<context-group purpose="location">
|
<context-group purpose="location">
|
||||||
<context context-type="sourcefile">src/app/components/document-list/bulk-editor/bulk-editor.component.ts</context>
|
<context context-type="sourcefile">src/app/components/document-list/bulk-editor/bulk-editor.component.ts</context>
|
||||||
<context context-type="linenumber">162</context>
|
<context context-type="linenumber">163</context>
|
||||||
</context-group>
|
</context-group>
|
||||||
</trans-unit>
|
</trans-unit>
|
||||||
<trans-unit datatype="html" id="5393409374423140648">
|
<trans-unit datatype="html" id="5393409374423140648">
|
||||||
@@ -1507,7 +1515,7 @@
|
|||||||
<target>Bevestig toewijzen van documenttype</target>
|
<target>Bevestig toewijzen van documenttype</target>
|
||||||
<context-group purpose="location">
|
<context-group purpose="location">
|
||||||
<context context-type="sourcefile">src/app/components/document-list/bulk-editor/bulk-editor.component.ts</context>
|
<context context-type="sourcefile">src/app/components/document-list/bulk-editor/bulk-editor.component.ts</context>
|
||||||
<context context-type="linenumber">181</context>
|
<context context-type="linenumber">182</context>
|
||||||
</context-group>
|
</context-group>
|
||||||
</trans-unit>
|
</trans-unit>
|
||||||
<trans-unit datatype="html" id="332180123895325027">
|
<trans-unit datatype="html" id="332180123895325027">
|
||||||
@@ -1515,7 +1523,7 @@
|
|||||||
<target>Het documenttype "<x equiv-text="documentType.name" id="PH"/>" zal aan <x equiv-text="this.list.selected.size" id="PH_1"/> geselecteerd(e) document(en) worden toegewezen.</target>
|
<target>Het documenttype "<x equiv-text="documentType.name" id="PH"/>" zal aan <x equiv-text="this.list.selected.size" id="PH_1"/> geselecteerd(e) document(en) worden toegewezen.</target>
|
||||||
<context-group purpose="location">
|
<context-group purpose="location">
|
||||||
<context context-type="sourcefile">src/app/components/document-list/bulk-editor/bulk-editor.component.ts</context>
|
<context context-type="sourcefile">src/app/components/document-list/bulk-editor/bulk-editor.component.ts</context>
|
||||||
<context context-type="linenumber">183</context>
|
<context context-type="linenumber">184</context>
|
||||||
</context-group>
|
</context-group>
|
||||||
</trans-unit>
|
</trans-unit>
|
||||||
<trans-unit datatype="html" id="2236642492594872779">
|
<trans-unit datatype="html" id="2236642492594872779">
|
||||||
@@ -1523,7 +1531,7 @@
|
|||||||
<target>Het documenttype zal verwijderd worden van <x equiv-text="this.list.selected.size" id="PH"/> geselecteerd(e) document(en).</target>
|
<target>Het documenttype zal verwijderd worden van <x equiv-text="this.list.selected.size" id="PH"/> geselecteerd(e) document(en).</target>
|
||||||
<context-group purpose="location">
|
<context-group purpose="location">
|
||||||
<context context-type="sourcefile">src/app/components/document-list/bulk-editor/bulk-editor.component.ts</context>
|
<context context-type="sourcefile">src/app/components/document-list/bulk-editor/bulk-editor.component.ts</context>
|
||||||
<context context-type="linenumber">185</context>
|
<context context-type="linenumber">186</context>
|
||||||
</context-group>
|
</context-group>
|
||||||
</trans-unit>
|
</trans-unit>
|
||||||
<trans-unit datatype="html" id="749430623564850405">
|
<trans-unit datatype="html" id="749430623564850405">
|
||||||
@@ -1531,7 +1539,7 @@
|
|||||||
<target>Bevestig verwijderen</target>
|
<target>Bevestig verwijderen</target>
|
||||||
<context-group purpose="location">
|
<context-group purpose="location">
|
||||||
<context context-type="sourcefile">src/app/components/document-list/bulk-editor/bulk-editor.component.ts</context>
|
<context context-type="sourcefile">src/app/components/document-list/bulk-editor/bulk-editor.component.ts</context>
|
||||||
<context context-type="linenumber">200</context>
|
<context context-type="linenumber">201</context>
|
||||||
</context-group>
|
</context-group>
|
||||||
</trans-unit>
|
</trans-unit>
|
||||||
<trans-unit datatype="html" id="4303174930844518780">
|
<trans-unit datatype="html" id="4303174930844518780">
|
||||||
@@ -1539,7 +1547,7 @@
|
|||||||
<target><x equiv-text="this.list.selected.size" id="PH"/> geselecteerd(e) document(en) zullen permanent worden verwijderd.</target>
|
<target><x equiv-text="this.list.selected.size" id="PH"/> geselecteerd(e) document(en) zullen permanent worden verwijderd.</target>
|
||||||
<context-group purpose="location">
|
<context-group purpose="location">
|
||||||
<context context-type="sourcefile">src/app/components/document-list/bulk-editor/bulk-editor.component.ts</context>
|
<context context-type="sourcefile">src/app/components/document-list/bulk-editor/bulk-editor.component.ts</context>
|
||||||
<context context-type="linenumber">201</context>
|
<context context-type="linenumber">202</context>
|
||||||
</context-group>
|
</context-group>
|
||||||
</trans-unit>
|
</trans-unit>
|
||||||
<trans-unit datatype="html" id="5641451190833696892">
|
<trans-unit datatype="html" id="5641451190833696892">
|
||||||
@@ -1547,7 +1555,7 @@
|
|||||||
<target>Deze actie kan niet ongedaan worden gemaakt.</target>
|
<target>Deze actie kan niet ongedaan worden gemaakt.</target>
|
||||||
<context-group purpose="location">
|
<context-group purpose="location">
|
||||||
<context context-type="sourcefile">src/app/components/document-list/bulk-editor/bulk-editor.component.ts</context>
|
<context context-type="sourcefile">src/app/components/document-list/bulk-editor/bulk-editor.component.ts</context>
|
||||||
<context context-type="linenumber">202</context>
|
<context context-type="linenumber">203</context>
|
||||||
</context-group>
|
</context-group>
|
||||||
</trans-unit>
|
</trans-unit>
|
||||||
<trans-unit datatype="html" id="6734339521247847366">
|
<trans-unit datatype="html" id="6734339521247847366">
|
||||||
@@ -1555,7 +1563,7 @@
|
|||||||
<target>Verwijder document(en)</target>
|
<target>Verwijder document(en)</target>
|
||||||
<context-group purpose="location">
|
<context-group purpose="location">
|
||||||
<context context-type="sourcefile">src/app/components/document-list/bulk-editor/bulk-editor.component.ts</context>
|
<context context-type="sourcefile">src/app/components/document-list/bulk-editor/bulk-editor.component.ts</context>
|
||||||
<context context-type="linenumber">204</context>
|
<context context-type="linenumber">205</context>
|
||||||
</context-group>
|
</context-group>
|
||||||
</trans-unit>
|
</trans-unit>
|
||||||
<trans-unit datatype="html" id="8b0609df23817024b3bed12beb9b64fc1009f588">
|
<trans-unit datatype="html" id="8b0609df23817024b3bed12beb9b64fc1009f588">
|
||||||
@@ -1582,6 +1590,14 @@
|
|||||||
<context context-type="linenumber">27</context>
|
<context context-type="linenumber">27</context>
|
||||||
</context-group>
|
</context-group>
|
||||||
</trans-unit>
|
</trans-unit>
|
||||||
|
<trans-unit datatype="html" id="fc2de37422d7c4af6686842283cc2afd781b6848">
|
||||||
|
<source>Download originals</source>
|
||||||
|
<target>Originelen downloaden</target>
|
||||||
|
<context-group purpose="location">
|
||||||
|
<context context-type="sourcefile">src/app/components/document-list/bulk-editor/bulk-editor.component.html</context>
|
||||||
|
<context context-type="linenumber">68</context>
|
||||||
|
</context-group>
|
||||||
|
</trans-unit>
|
||||||
<trans-unit datatype="html" id="a1e6c11f20d4bf6e8e6b43e3c6d2561b2080645e">
|
<trans-unit datatype="html" id="a1e6c11f20d4bf6e8e6b43e3c6d2561b2080645e">
|
||||||
<source>Suggestions:</source>
|
<source>Suggestions:</source>
|
||||||
<target>Suggesties:</target>
|
<target>Suggesties:</target>
|
||||||
@@ -1614,22 +1630,22 @@
|
|||||||
<context context-type="linenumber">1</context>
|
<context context-type="linenumber">1</context>
|
||||||
</context-group>
|
</context-group>
|
||||||
</trans-unit>
|
</trans-unit>
|
||||||
<trans-unit datatype="html" id="46c8fe557cf52c9389783627d4f85453f4ddb459">
|
<trans-unit datatype="html" id="c0d907c2687c09612395aee6ef7c04ca8e5e5e0a">
|
||||||
<source>Documents in inbox: <x equiv-text="{{statistics.documents_inbox}}" id="INTERPOLATION"/></source>
|
<source>Total documents: <x equiv-text="{{statistics?.documents_total}}" id="INTERPOLATION"/></source>
|
||||||
<target>Documenten in "Postvak in": <x equiv-text="{{statistics.documents_inbox}}" id="INTERPOLATION"/></target>
|
<target>Totaal aantal documenten: <x equiv-text="{{statistics?.documents_total}}" id="INTERPOLATION"/></target>
|
||||||
<context-group purpose="location">
|
|
||||||
<context context-type="sourcefile">src/app/components/dashboard/widgets/statistics-widget/statistics-widget.component.html</context>
|
|
||||||
<context context-type="linenumber">3</context>
|
|
||||||
</context-group>
|
|
||||||
</trans-unit>
|
|
||||||
<trans-unit datatype="html" id="c327c0e67bcac7494dcbaa9afb3b42d5008c6438">
|
|
||||||
<source>Total documents: <x equiv-text="{{statistics.documents_total}}" id="INTERPOLATION"/></source>
|
|
||||||
<target>Totaal aantal documenten: <x equiv-text="{{statistics.documents_total}}" id="INTERPOLATION"/></target>
|
|
||||||
<context-group purpose="location">
|
<context-group purpose="location">
|
||||||
<context context-type="sourcefile">src/app/components/dashboard/widgets/statistics-widget/statistics-widget.component.html</context>
|
<context context-type="sourcefile">src/app/components/dashboard/widgets/statistics-widget/statistics-widget.component.html</context>
|
||||||
<context context-type="linenumber">4</context>
|
<context context-type="linenumber">4</context>
|
||||||
</context-group>
|
</context-group>
|
||||||
</trans-unit>
|
</trans-unit>
|
||||||
|
<trans-unit datatype="html" id="13e8d49dbcad9f9d71e66a9a56d6f328cff430c9">
|
||||||
|
<source>Documents in inbox: <x equiv-text="{{statistics?.documents_inbox}}" id="INTERPOLATION"/></source>
|
||||||
|
<target>Documenten in "Postvak in": <x equiv-text="{{statistics?.documents_inbox}}" id="INTERPOLATION"/></target>
|
||||||
|
<context-group purpose="location">
|
||||||
|
<context context-type="sourcefile">src/app/components/dashboard/widgets/statistics-widget/statistics-widget.component.html</context>
|
||||||
|
<context context-type="linenumber">3</context>
|
||||||
|
</context-group>
|
||||||
|
</trans-unit>
|
||||||
<trans-unit datatype="html" id="6443586946875325554">
|
<trans-unit datatype="html" id="6443586946875325554">
|
||||||
<source>Processing: <x equiv-text="countUploadingAndProcessing" id="PH"/></source>
|
<source>Processing: <x equiv-text="countUploadingAndProcessing" id="PH"/></source>
|
||||||
<target>Bezig met verwerken: <x equiv-text="countUploadingAndProcessing" id="PH"/></target>
|
<target>Bezig met verwerken: <x equiv-text="countUploadingAndProcessing" id="PH"/></target>
|
||||||
@@ -1848,12 +1864,20 @@
|
|||||||
<context context-type="linenumber">82</context>
|
<context context-type="linenumber">82</context>
|
||||||
</context-group>
|
</context-group>
|
||||||
</trans-unit>
|
</trans-unit>
|
||||||
|
<trans-unit datatype="html" id="6987083569809053351">
|
||||||
|
<source>English (GB)</source>
|
||||||
|
<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-group>
|
||||||
|
</trans-unit>
|
||||||
<trans-unit datatype="html" id="1858110241312746425">
|
<trans-unit datatype="html" id="1858110241312746425">
|
||||||
<source>German</source>
|
<source>German</source>
|
||||||
<target>Duits</target>
|
<target>Duits</target>
|
||||||
<context-group purpose="location">
|
<context-group purpose="location">
|
||||||
<context context-type="sourcefile">src/app/services/settings.service.ts</context>
|
<context context-type="sourcefile">src/app/services/settings.service.ts</context>
|
||||||
<context context-type="linenumber">83</context>
|
<context context-type="linenumber">84</context>
|
||||||
</context-group>
|
</context-group>
|
||||||
</trans-unit>
|
</trans-unit>
|
||||||
<trans-unit datatype="html" id="3071065188816255493">
|
<trans-unit datatype="html" id="3071065188816255493">
|
||||||
@@ -1861,7 +1885,7 @@
|
|||||||
<target>Nederlands</target>
|
<target>Nederlands</target>
|
||||||
<context-group purpose="location">
|
<context-group purpose="location">
|
||||||
<context context-type="sourcefile">src/app/services/settings.service.ts</context>
|
<context context-type="sourcefile">src/app/services/settings.service.ts</context>
|
||||||
<context context-type="linenumber">84</context>
|
<context context-type="linenumber">85</context>
|
||||||
</context-group>
|
</context-group>
|
||||||
</trans-unit>
|
</trans-unit>
|
||||||
<trans-unit datatype="html" id="7633754075223722162">
|
<trans-unit datatype="html" id="7633754075223722162">
|
||||||
@@ -1869,7 +1893,7 @@
|
|||||||
<target>Frans</target>
|
<target>Frans</target>
|
||||||
<context-group purpose="location">
|
<context-group purpose="location">
|
||||||
<context context-type="sourcefile">src/app/services/settings.service.ts</context>
|
<context context-type="sourcefile">src/app/services/settings.service.ts</context>
|
||||||
<context context-type="linenumber">85</context>
|
<context context-type="linenumber">86</context>
|
||||||
</context-group>
|
</context-group>
|
||||||
</trans-unit>
|
</trans-unit>
|
||||||
<trans-unit datatype="html" id="2119857572761283468">
|
<trans-unit datatype="html" id="2119857572761283468">
|
||||||
|
@@ -1,10 +1,6 @@
|
|||||||
from django.contrib import admin
|
from django.contrib import admin
|
||||||
from django.utils.html import format_html, format_html_join
|
|
||||||
from django.utils.safestring import mark_safe
|
|
||||||
from whoosh.writing import AsyncWriter
|
|
||||||
|
|
||||||
from . import index
|
from .models import Correspondent, Document, DocumentType, Tag, \
|
||||||
from .models import Correspondent, Document, DocumentType, Log, Tag, \
|
|
||||||
SavedView, SavedViewFilterRule
|
SavedView, SavedViewFilterRule
|
||||||
|
|
||||||
|
|
||||||
@@ -86,17 +82,21 @@ class DocumentAdmin(admin.ModelAdmin):
|
|||||||
created_.short_description = "Created"
|
created_.short_description = "Created"
|
||||||
|
|
||||||
def delete_queryset(self, request, queryset):
|
def delete_queryset(self, request, queryset):
|
||||||
ix = index.open_index()
|
from documents import index
|
||||||
with AsyncWriter(ix) as writer:
|
|
||||||
|
with index.open_index_writer() as writer:
|
||||||
for o in queryset:
|
for o in queryset:
|
||||||
index.remove_document(writer, o)
|
index.remove_document(writer, o)
|
||||||
|
|
||||||
super(DocumentAdmin, self).delete_queryset(request, queryset)
|
super(DocumentAdmin, self).delete_queryset(request, queryset)
|
||||||
|
|
||||||
def delete_model(self, request, obj):
|
def delete_model(self, request, obj):
|
||||||
|
from documents import index
|
||||||
index.remove_document_from_index(obj)
|
index.remove_document_from_index(obj)
|
||||||
super(DocumentAdmin, self).delete_model(request, obj)
|
super(DocumentAdmin, self).delete_model(request, obj)
|
||||||
|
|
||||||
def save_model(self, request, obj, form, change):
|
def save_model(self, request, obj, form, change):
|
||||||
|
from documents import index
|
||||||
index.add_or_update_document(obj)
|
index.add_or_update_document(obj)
|
||||||
super(DocumentAdmin, self).save_model(request, obj, form, change)
|
super(DocumentAdmin, self).save_model(request, obj, form, change)
|
||||||
|
|
||||||
|
60
src/documents/bulk_download.py
Normal file
60
src/documents/bulk_download.py
Normal file
@@ -0,0 +1,60 @@
|
|||||||
|
from zipfile import ZipFile
|
||||||
|
|
||||||
|
from documents.models import Document
|
||||||
|
|
||||||
|
|
||||||
|
class BulkArchiveStrategy:
|
||||||
|
|
||||||
|
def __init__(self, zipf: ZipFile):
|
||||||
|
self.zipf = zipf
|
||||||
|
|
||||||
|
def make_unique_filename(self,
|
||||||
|
doc: Document,
|
||||||
|
archive: bool = False,
|
||||||
|
folder: str = ""):
|
||||||
|
counter = 0
|
||||||
|
while True:
|
||||||
|
filename = folder + doc.get_public_filename(archive, counter)
|
||||||
|
if filename in self.zipf.namelist():
|
||||||
|
counter += 1
|
||||||
|
else:
|
||||||
|
return filename
|
||||||
|
|
||||||
|
def add_document(self, doc: Document):
|
||||||
|
raise NotImplementedError() # pragma: no cover
|
||||||
|
|
||||||
|
|
||||||
|
class OriginalsOnlyStrategy(BulkArchiveStrategy):
|
||||||
|
|
||||||
|
def add_document(self, doc: Document):
|
||||||
|
self.zipf.write(doc.source_path, self.make_unique_filename(doc))
|
||||||
|
|
||||||
|
|
||||||
|
class ArchiveOnlyStrategy(BulkArchiveStrategy):
|
||||||
|
|
||||||
|
def __init__(self, zipf):
|
||||||
|
super(ArchiveOnlyStrategy, self).__init__(zipf)
|
||||||
|
|
||||||
|
def add_document(self, doc: Document):
|
||||||
|
if doc.has_archive_version:
|
||||||
|
self.zipf.write(doc.archive_path,
|
||||||
|
self.make_unique_filename(doc, archive=True))
|
||||||
|
else:
|
||||||
|
self.zipf.write(doc.source_path,
|
||||||
|
self.make_unique_filename(doc))
|
||||||
|
|
||||||
|
|
||||||
|
class OriginalAndArchiveStrategy(BulkArchiveStrategy):
|
||||||
|
|
||||||
|
def add_document(self, doc: Document):
|
||||||
|
if doc.has_archive_version:
|
||||||
|
self.zipf.write(
|
||||||
|
doc.archive_path, self.make_unique_filename(
|
||||||
|
doc, archive=True, folder="archive/"
|
||||||
|
)
|
||||||
|
)
|
||||||
|
|
||||||
|
self.zipf.write(
|
||||||
|
doc.source_path,
|
||||||
|
self.make_unique_filename(doc, folder="originals/")
|
||||||
|
)
|
@@ -2,9 +2,7 @@ import itertools
|
|||||||
|
|
||||||
from django.db.models import Q
|
from django.db.models import Q
|
||||||
from django_q.tasks import async_task
|
from django_q.tasks import async_task
|
||||||
from whoosh.writing import AsyncWriter
|
|
||||||
|
|
||||||
from documents import index
|
|
||||||
from documents.models import Document, Correspondent, DocumentType
|
from documents.models import Document, Correspondent, DocumentType
|
||||||
|
|
||||||
|
|
||||||
@@ -99,8 +97,9 @@ def modify_tags(doc_ids, add_tags, remove_tags):
|
|||||||
def delete(doc_ids):
|
def delete(doc_ids):
|
||||||
Document.objects.filter(id__in=doc_ids).delete()
|
Document.objects.filter(id__in=doc_ids).delete()
|
||||||
|
|
||||||
ix = index.open_index()
|
from documents import index
|
||||||
with AsyncWriter(ix) as writer:
|
|
||||||
|
with index.open_index_writer() as writer:
|
||||||
for id in doc_ids:
|
for id in doc_ids:
|
||||||
index.remove_document_by_id(writer, id)
|
index.remove_document_by_id(writer, id)
|
||||||
|
|
||||||
|
@@ -95,9 +95,6 @@ class DocumentClassifier(object):
|
|||||||
pickle.dump(self.document_type_classifier, f)
|
pickle.dump(self.document_type_classifier, f)
|
||||||
|
|
||||||
def train(self):
|
def train(self):
|
||||||
from sklearn.feature_extraction.text import CountVectorizer
|
|
||||||
from sklearn.neural_network import MLPClassifier
|
|
||||||
from sklearn.preprocessing import MultiLabelBinarizer, LabelBinarizer
|
|
||||||
|
|
||||||
data = list()
|
data = list()
|
||||||
labels_tags = list()
|
labels_tags = list()
|
||||||
@@ -162,6 +159,10 @@ class DocumentClassifier(object):
|
|||||||
)
|
)
|
||||||
)
|
)
|
||||||
|
|
||||||
|
from sklearn.feature_extraction.text import CountVectorizer
|
||||||
|
from sklearn.neural_network import MLPClassifier
|
||||||
|
from sklearn.preprocessing import MultiLabelBinarizer, LabelBinarizer
|
||||||
|
|
||||||
# Step 2: vectorize data
|
# Step 2: vectorize data
|
||||||
logger.debug("Vectorizing data...")
|
logger.debug("Vectorizing data...")
|
||||||
self.data_vectorizer = CountVectorizer(
|
self.data_vectorizer = CountVectorizer(
|
||||||
|
@@ -86,6 +86,22 @@ def open_index(recreate=False):
|
|||||||
return create_in(settings.INDEX_DIR, get_schema())
|
return create_in(settings.INDEX_DIR, get_schema())
|
||||||
|
|
||||||
|
|
||||||
|
@contextmanager
|
||||||
|
def open_index_writer(ix=None, optimize=False):
|
||||||
|
if ix:
|
||||||
|
writer = AsyncWriter(ix)
|
||||||
|
else:
|
||||||
|
writer = AsyncWriter(open_index())
|
||||||
|
|
||||||
|
try:
|
||||||
|
yield writer
|
||||||
|
except Exception as e:
|
||||||
|
logger.exception(str(e))
|
||||||
|
writer.cancel()
|
||||||
|
finally:
|
||||||
|
writer.commit(optimize=optimize)
|
||||||
|
|
||||||
|
|
||||||
def update_document(writer, doc):
|
def update_document(writer, doc):
|
||||||
tags = ",".join([t.name for t in doc.tags.all()])
|
tags = ",".join([t.name for t in doc.tags.all()])
|
||||||
writer.update_document(
|
writer.update_document(
|
||||||
@@ -110,14 +126,12 @@ def remove_document_by_id(writer, doc_id):
|
|||||||
|
|
||||||
|
|
||||||
def add_or_update_document(document):
|
def add_or_update_document(document):
|
||||||
ix = open_index()
|
with open_index_writer() as writer:
|
||||||
with AsyncWriter(ix) as writer:
|
|
||||||
update_document(writer, document)
|
update_document(writer, document)
|
||||||
|
|
||||||
|
|
||||||
def remove_document_from_index(document):
|
def remove_document_from_index(document):
|
||||||
ix = open_index()
|
with open_index_writer() as writer:
|
||||||
with AsyncWriter(ix) as writer:
|
|
||||||
remove_document(writer, document)
|
remove_document(writer, document)
|
||||||
|
|
||||||
|
|
||||||
|
@@ -31,10 +31,24 @@ def handle_document(document_id):
|
|||||||
|
|
||||||
parser_class = get_parser_class_for_mime_type(mime_type)
|
parser_class = get_parser_class_for_mime_type(mime_type)
|
||||||
|
|
||||||
|
if not parser_class:
|
||||||
|
logger.error(f"No parser found for mime type {mime_type}, cannot "
|
||||||
|
f"archive document {document} (ID: {document_id})")
|
||||||
|
return
|
||||||
|
|
||||||
parser = parser_class(logging_group=uuid.uuid4())
|
parser = parser_class(logging_group=uuid.uuid4())
|
||||||
|
|
||||||
try:
|
try:
|
||||||
parser.parse(document.source_path, mime_type)
|
parser.parse(
|
||||||
|
document.source_path,
|
||||||
|
mime_type,
|
||||||
|
document.get_public_filename())
|
||||||
|
|
||||||
|
thumbnail = parser.get_optimised_thumbnail(
|
||||||
|
document.source_path,
|
||||||
|
mime_type,
|
||||||
|
document.get_public_filename()
|
||||||
|
)
|
||||||
|
|
||||||
if parser.get_archive_path():
|
if parser.get_archive_path():
|
||||||
with transaction.atomic():
|
with transaction.atomic():
|
||||||
@@ -55,12 +69,14 @@ def handle_document(document_id):
|
|||||||
create_source_path_directory(document.archive_path)
|
create_source_path_directory(document.archive_path)
|
||||||
shutil.move(parser.get_archive_path(),
|
shutil.move(parser.get_archive_path(),
|
||||||
document.archive_path)
|
document.archive_path)
|
||||||
|
shutil.move(thumbnail, document.thumbnail_path)
|
||||||
|
|
||||||
with AsyncWriter(index.open_index()) as writer:
|
with index.open_index_writer() as writer:
|
||||||
index.update_document(writer, document)
|
index.update_document(writer, document)
|
||||||
|
|
||||||
except Exception as e:
|
except Exception as e:
|
||||||
logger.exception(f"Error while parsing document {document}")
|
logger.exception(f"Error while parsing document {document} "
|
||||||
|
f"(ID: {document_id})")
|
||||||
finally:
|
finally:
|
||||||
parser.cleanup()
|
parser.cleanup()
|
||||||
|
|
||||||
|
@@ -1,6 +1,7 @@
|
|||||||
import logging
|
import logging
|
||||||
import os
|
import os
|
||||||
from pathlib import Path
|
from pathlib import Path
|
||||||
|
from threading import Thread
|
||||||
from time import sleep
|
from time import sleep
|
||||||
|
|
||||||
from django.conf import settings
|
from django.conf import settings
|
||||||
@@ -57,6 +58,7 @@ def _consume(filepath):
|
|||||||
logger.exception("Error creating tags from path")
|
logger.exception("Error creating tags from path")
|
||||||
|
|
||||||
try:
|
try:
|
||||||
|
logger.info(f"Adding {filepath} to the task queue.")
|
||||||
async_task("documents.tasks.consume_file",
|
async_task("documents.tasks.consume_file",
|
||||||
filepath,
|
filepath,
|
||||||
override_tag_ids=tag_ids if tag_ids else None,
|
override_tag_ids=tag_ids if tag_ids else None,
|
||||||
@@ -68,10 +70,11 @@ def _consume(filepath):
|
|||||||
logger.exception("Error while consuming document")
|
logger.exception("Error while consuming document")
|
||||||
|
|
||||||
|
|
||||||
def _consume_wait_unmodified(file, num_tries=20, wait_time=1):
|
def _consume_wait_unmodified(file):
|
||||||
|
logger.debug(f"Waiting for file {file} to remain unmodified")
|
||||||
mtime = -1
|
mtime = -1
|
||||||
current_try = 0
|
current_try = 0
|
||||||
while current_try < num_tries:
|
while current_try < settings.CONSUMER_POLLING_RETRY_COUNT:
|
||||||
try:
|
try:
|
||||||
new_mtime = os.stat(file).st_mtime
|
new_mtime = os.stat(file).st_mtime
|
||||||
except FileNotFoundError:
|
except FileNotFoundError:
|
||||||
@@ -82,7 +85,7 @@ def _consume_wait_unmodified(file, num_tries=20, wait_time=1):
|
|||||||
_consume(file)
|
_consume(file)
|
||||||
return
|
return
|
||||||
mtime = new_mtime
|
mtime = new_mtime
|
||||||
sleep(wait_time)
|
sleep(settings.CONSUMER_POLLING_DELAY)
|
||||||
current_try += 1
|
current_try += 1
|
||||||
|
|
||||||
logger.error(f"Timeout while waiting on file {file} to remain unmodified.")
|
logger.error(f"Timeout while waiting on file {file} to remain unmodified.")
|
||||||
@@ -91,10 +94,14 @@ def _consume_wait_unmodified(file, num_tries=20, wait_time=1):
|
|||||||
class Handler(FileSystemEventHandler):
|
class Handler(FileSystemEventHandler):
|
||||||
|
|
||||||
def on_created(self, event):
|
def on_created(self, event):
|
||||||
_consume_wait_unmodified(event.src_path)
|
Thread(
|
||||||
|
target=_consume_wait_unmodified, args=(event.src_path,)
|
||||||
|
).start()
|
||||||
|
|
||||||
def on_moved(self, event):
|
def on_moved(self, event):
|
||||||
_consume_wait_unmodified(event.dest_path)
|
Thread(
|
||||||
|
target=_consume_wait_unmodified, args=(event.dest_path,)
|
||||||
|
).start()
|
||||||
|
|
||||||
|
|
||||||
class Command(BaseCommand):
|
class Command(BaseCommand):
|
||||||
|
@@ -6,7 +6,6 @@ import shutil
|
|||||||
import subprocess
|
import subprocess
|
||||||
import tempfile
|
import tempfile
|
||||||
|
|
||||||
import dateparser
|
|
||||||
import magic
|
import magic
|
||||||
from django.conf import settings
|
from django.conf import settings
|
||||||
from django.utils import timezone
|
from django.utils import timezone
|
||||||
@@ -200,6 +199,8 @@ def parse_date(filename, text):
|
|||||||
"""
|
"""
|
||||||
Call dateparser.parse with a particular date ordering
|
Call dateparser.parse with a particular date ordering
|
||||||
"""
|
"""
|
||||||
|
import dateparser
|
||||||
|
|
||||||
return dateparser.parse(
|
return dateparser.parse(
|
||||||
ds,
|
ds,
|
||||||
settings={
|
settings={
|
||||||
|
@@ -192,14 +192,34 @@ class SavedViewSerializer(serializers.ModelSerializer):
|
|||||||
return saved_view
|
return saved_view
|
||||||
|
|
||||||
|
|
||||||
class BulkEditSerializer(serializers.Serializer):
|
class DocumentListSerializer(serializers.Serializer):
|
||||||
|
|
||||||
documents = serializers.ListField(
|
documents = serializers.ListField(
|
||||||
child=serializers.IntegerField(),
|
required=True,
|
||||||
label="Documents",
|
label="Documents",
|
||||||
write_only=True
|
write_only=True,
|
||||||
|
child=serializers.IntegerField()
|
||||||
)
|
)
|
||||||
|
|
||||||
|
def _validate_document_id_list(self, documents, name="documents"):
|
||||||
|
if not type(documents) == list:
|
||||||
|
raise serializers.ValidationError(f"{name} must be a list")
|
||||||
|
if not all([type(i) == int for i in documents]):
|
||||||
|
raise serializers.ValidationError(
|
||||||
|
f"{name} must be a list of integers")
|
||||||
|
count = Document.objects.filter(id__in=documents).count()
|
||||||
|
if not count == len(documents):
|
||||||
|
raise serializers.ValidationError(
|
||||||
|
f"Some documents in {name} don't exist or were "
|
||||||
|
f"specified twice.")
|
||||||
|
|
||||||
|
def validate_documents(self, documents):
|
||||||
|
self._validate_document_id_list(documents)
|
||||||
|
return documents
|
||||||
|
|
||||||
|
|
||||||
|
class BulkEditSerializer(DocumentListSerializer):
|
||||||
|
|
||||||
method = serializers.ChoiceField(
|
method = serializers.ChoiceField(
|
||||||
choices=[
|
choices=[
|
||||||
"set_correspondent",
|
"set_correspondent",
|
||||||
@@ -215,18 +235,6 @@ class BulkEditSerializer(serializers.Serializer):
|
|||||||
|
|
||||||
parameters = serializers.DictField(allow_empty=True)
|
parameters = serializers.DictField(allow_empty=True)
|
||||||
|
|
||||||
def _validate_document_id_list(self, documents, name="documents"):
|
|
||||||
if not type(documents) == list:
|
|
||||||
raise serializers.ValidationError(f"{name} must be a list")
|
|
||||||
if not all([type(i) == int for i in documents]):
|
|
||||||
raise serializers.ValidationError(
|
|
||||||
f"{name} must be a list of integers")
|
|
||||||
count = Document.objects.filter(id__in=documents).count()
|
|
||||||
if not count == len(documents):
|
|
||||||
raise serializers.ValidationError(
|
|
||||||
f"Some documents in {name} don't exist or were "
|
|
||||||
f"specified twice.")
|
|
||||||
|
|
||||||
def _validate_tag_id_list(self, tags, name="tags"):
|
def _validate_tag_id_list(self, tags, name="tags"):
|
||||||
if not type(tags) == list:
|
if not type(tags) == list:
|
||||||
raise serializers.ValidationError(f"{name} must be a list")
|
raise serializers.ValidationError(f"{name} must be a list")
|
||||||
@@ -238,10 +246,6 @@ class BulkEditSerializer(serializers.Serializer):
|
|||||||
raise serializers.ValidationError(
|
raise serializers.ValidationError(
|
||||||
f"Some tags in {name} don't exist or were specified twice.")
|
f"Some tags in {name} don't exist or were specified twice.")
|
||||||
|
|
||||||
def validate_documents(self, documents):
|
|
||||||
self._validate_document_id_list(documents)
|
|
||||||
return documents
|
|
||||||
|
|
||||||
def validate_method(self, method):
|
def validate_method(self, method):
|
||||||
if method == "set_correspondent":
|
if method == "set_correspondent":
|
||||||
return bulk_edit.set_correspondent
|
return bulk_edit.set_correspondent
|
||||||
@@ -392,9 +396,24 @@ class PostDocumentSerializer(serializers.Serializer):
|
|||||||
return None
|
return None
|
||||||
|
|
||||||
|
|
||||||
class SelectionDataSerializer(serializers.Serializer):
|
class BulkDownloadSerializer(DocumentListSerializer):
|
||||||
|
|
||||||
documents = serializers.ListField(
|
content = serializers.ChoiceField(
|
||||||
required=True,
|
choices=["archive", "originals", "both"],
|
||||||
child=serializers.IntegerField()
|
default="archive"
|
||||||
)
|
)
|
||||||
|
|
||||||
|
compression = serializers.ChoiceField(
|
||||||
|
choices=["none", "deflated", "bzip2", "lzma"],
|
||||||
|
default="none"
|
||||||
|
)
|
||||||
|
|
||||||
|
def validate_compression(self, compression):
|
||||||
|
import zipfile
|
||||||
|
|
||||||
|
return {
|
||||||
|
"none": zipfile.ZIP_STORED,
|
||||||
|
"deflated": zipfile.ZIP_DEFLATED,
|
||||||
|
"bzip2": zipfile.ZIP_BZIP2,
|
||||||
|
"lzma": zipfile.ZIP_LZMA
|
||||||
|
}[compression]
|
||||||
|
@@ -11,7 +11,7 @@ from django.dispatch import receiver
|
|||||||
from django.utils import timezone
|
from django.utils import timezone
|
||||||
from filelock import FileLock
|
from filelock import FileLock
|
||||||
|
|
||||||
from .. import index, matching
|
from .. import matching
|
||||||
from ..file_handling import delete_empty_directories, \
|
from ..file_handling import delete_empty_directories, \
|
||||||
create_source_path_directory, \
|
create_source_path_directory, \
|
||||||
generate_unique_filename
|
generate_unique_filename
|
||||||
@@ -305,4 +305,6 @@ def set_log_entry(sender, document=None, logging_group=None, **kwargs):
|
|||||||
|
|
||||||
|
|
||||||
def add_to_index(sender, document, **kwargs):
|
def add_to_index(sender, document, **kwargs):
|
||||||
|
from documents import index
|
||||||
|
|
||||||
index.add_or_update_document(document)
|
index.add_or_update_document(document)
|
||||||
|
@@ -4,6 +4,7 @@ from django.contrib.admin.sites import AdminSite
|
|||||||
from django.test import TestCase
|
from django.test import TestCase
|
||||||
from django.utils import timezone
|
from django.utils import timezone
|
||||||
|
|
||||||
|
from documents import index
|
||||||
from documents.admin import DocumentAdmin
|
from documents.admin import DocumentAdmin
|
||||||
from documents.models import Document
|
from documents.models import Document
|
||||||
from documents.tests.utils import DirectoriesMixin
|
from documents.tests.utils import DirectoriesMixin
|
||||||
@@ -11,37 +12,52 @@ from documents.tests.utils import DirectoriesMixin
|
|||||||
|
|
||||||
class TestDocumentAdmin(DirectoriesMixin, TestCase):
|
class TestDocumentAdmin(DirectoriesMixin, TestCase):
|
||||||
|
|
||||||
|
def get_document_from_index(self, doc):
|
||||||
|
ix = index.open_index()
|
||||||
|
with ix.searcher() as searcher:
|
||||||
|
return searcher.document(id=doc.id)
|
||||||
|
|
||||||
def setUp(self) -> None:
|
def setUp(self) -> None:
|
||||||
super(TestDocumentAdmin, self).setUp()
|
super(TestDocumentAdmin, self).setUp()
|
||||||
self.doc_admin = DocumentAdmin(model=Document, admin_site=AdminSite())
|
self.doc_admin = DocumentAdmin(model=Document, admin_site=AdminSite())
|
||||||
|
|
||||||
@mock.patch("documents.admin.index.add_or_update_document")
|
def test_save_model(self):
|
||||||
def test_save_model(self, m):
|
|
||||||
doc = Document.objects.create(title="test")
|
doc = Document.objects.create(title="test")
|
||||||
|
|
||||||
doc.title = "new title"
|
doc.title = "new title"
|
||||||
self.doc_admin.save_model(None, doc, None, None)
|
self.doc_admin.save_model(None, doc, None, None)
|
||||||
self.assertEqual(Document.objects.get(id=doc.id).title, "new title")
|
self.assertEqual(Document.objects.get(id=doc.id).title, "new title")
|
||||||
m.assert_called_once()
|
self.assertEqual(self.get_document_from_index(doc)['title'], "new title")
|
||||||
|
|
||||||
@mock.patch("documents.admin.index.remove_document")
|
def test_delete_model(self):
|
||||||
def test_delete_model(self, m):
|
|
||||||
doc = Document.objects.create(title="test")
|
doc = Document.objects.create(title="test")
|
||||||
self.doc_admin.delete_model(None, doc)
|
index.add_or_update_document(doc)
|
||||||
self.assertRaises(Document.DoesNotExist, Document.objects.get, id=doc.id)
|
self.assertIsNotNone(self.get_document_from_index(doc))
|
||||||
m.assert_called_once()
|
|
||||||
|
|
||||||
@mock.patch("documents.admin.index.remove_document")
|
self.doc_admin.delete_model(None, doc)
|
||||||
def test_delete_queryset(self, m):
|
|
||||||
|
self.assertRaises(Document.DoesNotExist, Document.objects.get, id=doc.id)
|
||||||
|
self.assertIsNone(self.get_document_from_index(doc))
|
||||||
|
|
||||||
|
def test_delete_queryset(self):
|
||||||
|
docs = []
|
||||||
for i in range(42):
|
for i in range(42):
|
||||||
Document.objects.create(title="Many documents with the same title", checksum=f"{i:02}")
|
doc = Document.objects.create(title="Many documents with the same title", checksum=f"{i:02}")
|
||||||
|
docs.append(doc)
|
||||||
|
index.add_or_update_document(doc)
|
||||||
|
|
||||||
self.assertEqual(Document.objects.count(), 42)
|
self.assertEqual(Document.objects.count(), 42)
|
||||||
|
|
||||||
|
for doc in docs:
|
||||||
|
self.assertIsNotNone(self.get_document_from_index(doc))
|
||||||
|
|
||||||
self.doc_admin.delete_queryset(None, Document.objects.all())
|
self.doc_admin.delete_queryset(None, Document.objects.all())
|
||||||
|
|
||||||
self.assertEqual(m.call_count, 42)
|
|
||||||
self.assertEqual(Document.objects.count(), 0)
|
self.assertEqual(Document.objects.count(), 0)
|
||||||
|
|
||||||
|
for doc in docs:
|
||||||
|
self.assertIsNone(self.get_document_from_index(doc))
|
||||||
|
|
||||||
def test_created(self):
|
def test_created(self):
|
||||||
doc = Document.objects.create(title="test", created=timezone.datetime(2020, 4, 12))
|
doc = Document.objects.create(title="test", created=timezone.datetime(2020, 4, 12))
|
||||||
self.assertEqual(self.doc_admin.created_(doc), "2020-04-12")
|
self.assertEqual(self.doc_admin.created_(doc), "2020-04-12")
|
||||||
|
@@ -1,7 +1,10 @@
|
|||||||
|
import datetime
|
||||||
|
import io
|
||||||
import json
|
import json
|
||||||
import os
|
import os
|
||||||
import shutil
|
import shutil
|
||||||
import tempfile
|
import tempfile
|
||||||
|
import zipfile
|
||||||
from unittest import mock
|
from unittest import mock
|
||||||
|
|
||||||
from django.conf import settings
|
from django.conf import settings
|
||||||
@@ -442,6 +445,13 @@ class TestDocumentApi(DirectoriesMixin, APITestCase):
|
|||||||
self.assertEqual(response.data['documents_total'], 3)
|
self.assertEqual(response.data['documents_total'], 3)
|
||||||
self.assertEqual(response.data['documents_inbox'], 1)
|
self.assertEqual(response.data['documents_inbox'], 1)
|
||||||
|
|
||||||
|
def test_statistics_no_inbox_tag(self):
|
||||||
|
Document.objects.create(title="none1", checksum="A")
|
||||||
|
|
||||||
|
response = self.client.get("/api/statistics/")
|
||||||
|
self.assertEqual(response.status_code, 200)
|
||||||
|
self.assertEqual(response.data['documents_inbox'], None)
|
||||||
|
|
||||||
@mock.patch("documents.views.async_task")
|
@mock.patch("documents.views.async_task")
|
||||||
def test_upload(self, m):
|
def test_upload(self, m):
|
||||||
|
|
||||||
@@ -1116,6 +1126,113 @@ class TestBulkEdit(DirectoriesMixin, APITestCase):
|
|||||||
self.assertCountEqual(response.data['selected_document_types'], [{"id": self.c1.id, "document_count": 1}, {"id": self.c2.id, "document_count": 0}])
|
self.assertCountEqual(response.data['selected_document_types'], [{"id": self.c1.id, "document_count": 1}, {"id": self.c2.id, "document_count": 0}])
|
||||||
|
|
||||||
|
|
||||||
|
class TestBulkDownload(DirectoriesMixin, APITestCase):
|
||||||
|
|
||||||
|
def setUp(self):
|
||||||
|
super(TestBulkDownload, self).setUp()
|
||||||
|
|
||||||
|
user = User.objects.create_superuser(username="temp_admin")
|
||||||
|
self.client.force_login(user=user)
|
||||||
|
|
||||||
|
self.doc1 = Document.objects.create(title="unrelated", checksum="A")
|
||||||
|
self.doc2 = Document.objects.create(title="document A", filename="docA.pdf", mime_type="application/pdf", checksum="B", created=datetime.datetime(2021, 1, 1))
|
||||||
|
self.doc2b = Document.objects.create(title="document A", filename="docA2.pdf", mime_type="application/pdf", checksum="D", created=datetime.datetime(2021, 1, 1))
|
||||||
|
self.doc3 = Document.objects.create(title="document B", filename="docB.jpg", mime_type="image/jpeg", checksum="C", created=datetime.datetime(2020, 3, 21), archive_filename="docB.pdf", archive_checksum="D")
|
||||||
|
|
||||||
|
shutil.copy(os.path.join(os.path.dirname(__file__), "samples", "simple.pdf"), self.doc2.source_path)
|
||||||
|
shutil.copy(os.path.join(os.path.dirname(__file__), "samples", "simple.png"), self.doc2b.source_path)
|
||||||
|
shutil.copy(os.path.join(os.path.dirname(__file__), "samples", "simple.jpg"), self.doc3.source_path)
|
||||||
|
shutil.copy(os.path.join(os.path.dirname(__file__), "samples", "test_with_bom.pdf"), self.doc3.archive_path)
|
||||||
|
|
||||||
|
def test_download_originals(self):
|
||||||
|
response = self.client.post("/api/documents/bulk_download/", json.dumps({
|
||||||
|
"documents": [self.doc2.id, self.doc3.id],
|
||||||
|
"content": "originals"
|
||||||
|
}), content_type='application/json')
|
||||||
|
|
||||||
|
self.assertEqual(response.status_code, 200)
|
||||||
|
self.assertEqual(response['Content-Type'], 'application/zip')
|
||||||
|
|
||||||
|
with zipfile.ZipFile(io.BytesIO(response.content)) as zipf:
|
||||||
|
self.assertEqual(len(zipf.filelist), 2)
|
||||||
|
self.assertIn("2021-01-01 document A.pdf", zipf.namelist())
|
||||||
|
self.assertIn("2020-03-21 document B.jpg", zipf.namelist())
|
||||||
|
|
||||||
|
with self.doc2.source_file as f:
|
||||||
|
self.assertEqual(f.read(), zipf.read("2021-01-01 document A.pdf"))
|
||||||
|
|
||||||
|
with self.doc3.source_file as f:
|
||||||
|
self.assertEqual(f.read(), zipf.read("2020-03-21 document B.jpg"))
|
||||||
|
|
||||||
|
def test_download_default(self):
|
||||||
|
response = self.client.post("/api/documents/bulk_download/", json.dumps({
|
||||||
|
"documents": [self.doc2.id, self.doc3.id]
|
||||||
|
}), content_type='application/json')
|
||||||
|
|
||||||
|
self.assertEqual(response.status_code, 200)
|
||||||
|
self.assertEqual(response['Content-Type'], 'application/zip')
|
||||||
|
|
||||||
|
with zipfile.ZipFile(io.BytesIO(response.content)) as zipf:
|
||||||
|
self.assertEqual(len(zipf.filelist), 2)
|
||||||
|
self.assertIn("2021-01-01 document A.pdf", zipf.namelist())
|
||||||
|
self.assertIn("2020-03-21 document B.pdf", zipf.namelist())
|
||||||
|
|
||||||
|
with self.doc2.source_file as f:
|
||||||
|
self.assertEqual(f.read(), zipf.read("2021-01-01 document A.pdf"))
|
||||||
|
|
||||||
|
with self.doc3.archive_file as f:
|
||||||
|
self.assertEqual(f.read(), zipf.read("2020-03-21 document B.pdf"))
|
||||||
|
|
||||||
|
def test_download_both(self):
|
||||||
|
response = self.client.post("/api/documents/bulk_download/", json.dumps({
|
||||||
|
"documents": [self.doc2.id, self.doc3.id],
|
||||||
|
"content": "both"
|
||||||
|
}), content_type='application/json')
|
||||||
|
|
||||||
|
self.assertEqual(response.status_code, 200)
|
||||||
|
self.assertEqual(response['Content-Type'], 'application/zip')
|
||||||
|
|
||||||
|
with zipfile.ZipFile(io.BytesIO(response.content)) as zipf:
|
||||||
|
self.assertEqual(len(zipf.filelist), 3)
|
||||||
|
self.assertIn("originals/2021-01-01 document A.pdf", zipf.namelist())
|
||||||
|
self.assertIn("archive/2020-03-21 document B.pdf", zipf.namelist())
|
||||||
|
self.assertIn("originals/2020-03-21 document B.jpg", zipf.namelist())
|
||||||
|
|
||||||
|
with self.doc2.source_file as f:
|
||||||
|
self.assertEqual(f.read(), zipf.read("originals/2021-01-01 document A.pdf"))
|
||||||
|
|
||||||
|
with self.doc3.archive_file as f:
|
||||||
|
self.assertEqual(f.read(), zipf.read("archive/2020-03-21 document B.pdf"))
|
||||||
|
|
||||||
|
with self.doc3.source_file as f:
|
||||||
|
self.assertEqual(f.read(), zipf.read("originals/2020-03-21 document B.jpg"))
|
||||||
|
|
||||||
|
def test_filename_clashes(self):
|
||||||
|
response = self.client.post("/api/documents/bulk_download/", json.dumps({
|
||||||
|
"documents": [self.doc2.id, self.doc2b.id]
|
||||||
|
}), content_type='application/json')
|
||||||
|
|
||||||
|
self.assertEqual(response.status_code, 200)
|
||||||
|
self.assertEqual(response['Content-Type'], 'application/zip')
|
||||||
|
|
||||||
|
with zipfile.ZipFile(io.BytesIO(response.content)) as zipf:
|
||||||
|
self.assertEqual(len(zipf.filelist), 2)
|
||||||
|
|
||||||
|
self.assertIn("2021-01-01 document A.pdf", zipf.namelist())
|
||||||
|
self.assertIn("2021-01-01 document A_01.pdf", zipf.namelist())
|
||||||
|
|
||||||
|
with self.doc2.source_file as f:
|
||||||
|
self.assertEqual(f.read(), zipf.read("2021-01-01 document A.pdf"))
|
||||||
|
|
||||||
|
with self.doc2b.source_file as f:
|
||||||
|
self.assertEqual(f.read(), zipf.read("2021-01-01 document A_01.pdf"))
|
||||||
|
|
||||||
|
def test_compression(self):
|
||||||
|
response = self.client.post("/api/documents/bulk_download/", json.dumps({
|
||||||
|
"documents": [self.doc2.id, self.doc2b.id],
|
||||||
|
"compression": "lzma"
|
||||||
|
}), content_type='application/json')
|
||||||
|
|
||||||
class TestApiAuth(APITestCase):
|
class TestApiAuth(APITestCase):
|
||||||
|
|
||||||
def test_auth_required(self):
|
def test_auth_required(self):
|
||||||
@@ -1139,4 +1256,5 @@ class TestApiAuth(APITestCase):
|
|||||||
self.assertEqual(self.client.get("/api/search/").status_code, 401)
|
self.assertEqual(self.client.get("/api/search/").status_code, 401)
|
||||||
self.assertEqual(self.client.get("/api/search/auto_complete/").status_code, 401)
|
self.assertEqual(self.client.get("/api/search/auto_complete/").status_code, 401)
|
||||||
self.assertEqual(self.client.get("/api/documents/bulk_edit/").status_code, 401)
|
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)
|
self.assertEqual(self.client.get("/api/documents/selection_data/").status_code, 401)
|
||||||
|
@@ -49,6 +49,21 @@ class TestArchiver(DirectoriesMixin, TestCase):
|
|||||||
self.assertTrue(filecmp.cmp(sample_file, doc.source_path))
|
self.assertTrue(filecmp.cmp(sample_file, doc.source_path))
|
||||||
self.assertEqual(doc.archive_filename, "none/A.pdf")
|
self.assertEqual(doc.archive_filename, "none/A.pdf")
|
||||||
|
|
||||||
|
def test_unknown_mime_type(self):
|
||||||
|
doc = self.make_models()
|
||||||
|
doc.mime_type = "sdgfh"
|
||||||
|
doc.save()
|
||||||
|
shutil.copy(sample_file, doc.source_path)
|
||||||
|
|
||||||
|
handle_document(doc.pk)
|
||||||
|
|
||||||
|
doc = Document.objects.get(id=doc.id)
|
||||||
|
|
||||||
|
self.assertIsNotNone(doc.checksum)
|
||||||
|
self.assertIsNone(doc.archive_checksum)
|
||||||
|
self.assertIsNone(doc.archive_filename)
|
||||||
|
self.assertTrue(os.path.isfile(doc.source_path))
|
||||||
|
|
||||||
@override_settings(PAPERLESS_FILENAME_FORMAT="{title}")
|
@override_settings(PAPERLESS_FILENAME_FORMAT="{title}")
|
||||||
def test_naming_priorities(self):
|
def test_naming_priorities(self):
|
||||||
doc1 = Document.objects.create(checksum="A", title="document", content="first document", mime_type="application/pdf", filename="document.pdf")
|
doc1 = Document.objects.create(checksum="A", title="document", content="first document", mime_type="application/pdf", filename="document.pdf")
|
||||||
|
@@ -203,7 +203,7 @@ class TestConsumer(DirectoriesMixin, ConsumerMixin, TransactionTestCase):
|
|||||||
self.assertRaises(CommandError, call_command, 'document_consumer', '--oneshot')
|
self.assertRaises(CommandError, call_command, 'document_consumer', '--oneshot')
|
||||||
|
|
||||||
|
|
||||||
@override_settings(CONSUMER_POLLING=1)
|
@override_settings(CONSUMER_POLLING=1, CONSUMER_POLLING_DELAY=1, CONSUMER_POLLING_RETRY_COUNT=20)
|
||||||
class TestConsumerPolling(TestConsumer):
|
class TestConsumerPolling(TestConsumer):
|
||||||
# just do all the tests with polling
|
# just do all the tests with polling
|
||||||
pass
|
pass
|
||||||
@@ -215,8 +215,7 @@ class TestConsumerRecursive(TestConsumer):
|
|||||||
pass
|
pass
|
||||||
|
|
||||||
|
|
||||||
@override_settings(CONSUMER_RECURSIVE=True)
|
@override_settings(CONSUMER_RECURSIVE=True, CONSUMER_POLLING=1, CONSUMER_POLLING_DELAY=1, CONSUMER_POLLING_RETRY_COUNT=20)
|
||||||
@override_settings(CONSUMER_POLLING=1)
|
|
||||||
class TestConsumerRecursivePolling(TestConsumer):
|
class TestConsumerRecursivePolling(TestConsumer):
|
||||||
# just do all the tests with polling and recursive
|
# just do all the tests with polling and recursive
|
||||||
pass
|
pass
|
||||||
@@ -257,6 +256,6 @@ class TestConsumerTags(DirectoriesMixin, ConsumerMixin, TransactionTestCase):
|
|||||||
# their order.
|
# their order.
|
||||||
self.assertCountEqual(kwargs["override_tag_ids"], tag_ids)
|
self.assertCountEqual(kwargs["override_tag_ids"], tag_ids)
|
||||||
|
|
||||||
@override_settings(CONSUMER_POLLING=1)
|
@override_settings(CONSUMER_POLLING=1, CONSUMER_POLLING_DELAY=1, CONSUMER_POLLING_RETRY_COUNT=20)
|
||||||
def test_consume_file_with_path_tags_polling(self):
|
def test_consume_file_with_path_tags_polling(self):
|
||||||
self.test_consume_file_with_path_tags()
|
self.test_consume_file_with_path_tags()
|
||||||
|
@@ -2,6 +2,7 @@ import logging
|
|||||||
import os
|
import os
|
||||||
import tempfile
|
import tempfile
|
||||||
import uuid
|
import uuid
|
||||||
|
import zipfile
|
||||||
from datetime import datetime
|
from datetime import datetime
|
||||||
from time import mktime
|
from time import mktime
|
||||||
|
|
||||||
@@ -32,9 +33,10 @@ from rest_framework.viewsets import (
|
|||||||
ViewSet
|
ViewSet
|
||||||
)
|
)
|
||||||
|
|
||||||
import documents.index as index
|
|
||||||
from paperless.db import GnuPG
|
from paperless.db import GnuPG
|
||||||
from paperless.views import StandardPagination
|
from paperless.views import StandardPagination
|
||||||
|
from .bulk_download import OriginalAndArchiveStrategy, OriginalsOnlyStrategy, \
|
||||||
|
ArchiveOnlyStrategy
|
||||||
from .classifier import load_classifier
|
from .classifier import load_classifier
|
||||||
from .filters import (
|
from .filters import (
|
||||||
CorrespondentFilterSet,
|
CorrespondentFilterSet,
|
||||||
@@ -52,7 +54,9 @@ from .serialisers import (
|
|||||||
DocumentTypeSerializer,
|
DocumentTypeSerializer,
|
||||||
PostDocumentSerializer,
|
PostDocumentSerializer,
|
||||||
SavedViewSerializer,
|
SavedViewSerializer,
|
||||||
BulkEditSerializer, SelectionDataSerializer
|
BulkEditSerializer,
|
||||||
|
DocumentListSerializer,
|
||||||
|
BulkDownloadSerializer
|
||||||
)
|
)
|
||||||
|
|
||||||
|
|
||||||
@@ -176,10 +180,12 @@ class DocumentViewSet(RetrieveModelMixin,
|
|||||||
def update(self, request, *args, **kwargs):
|
def update(self, request, *args, **kwargs):
|
||||||
response = super(DocumentViewSet, self).update(
|
response = super(DocumentViewSet, self).update(
|
||||||
request, *args, **kwargs)
|
request, *args, **kwargs)
|
||||||
|
from documents import index
|
||||||
index.add_or_update_document(self.get_object())
|
index.add_or_update_document(self.get_object())
|
||||||
return response
|
return response
|
||||||
|
|
||||||
def destroy(self, request, *args, **kwargs):
|
def destroy(self, request, *args, **kwargs):
|
||||||
|
from documents import index
|
||||||
index.remove_document_from_index(self.get_object())
|
index.remove_document_from_index(self.get_object())
|
||||||
return super(DocumentViewSet, self).destroy(request, *args, **kwargs)
|
return super(DocumentViewSet, self).destroy(request, *args, **kwargs)
|
||||||
|
|
||||||
@@ -443,7 +449,7 @@ class PostDocumentView(APIView):
|
|||||||
class SelectionDataView(APIView):
|
class SelectionDataView(APIView):
|
||||||
|
|
||||||
permission_classes = (IsAuthenticated,)
|
permission_classes = (IsAuthenticated,)
|
||||||
serializer_class = SelectionDataSerializer
|
serializer_class = DocumentListSerializer
|
||||||
parser_classes = (parsers.MultiPartParser, parsers.JSONParser)
|
parser_classes = (parsers.MultiPartParser, parsers.JSONParser)
|
||||||
|
|
||||||
def get_serializer_context(self):
|
def get_serializer_context(self):
|
||||||
@@ -501,10 +507,6 @@ class SearchView(APIView):
|
|||||||
|
|
||||||
permission_classes = (IsAuthenticated,)
|
permission_classes = (IsAuthenticated,)
|
||||||
|
|
||||||
def __init__(self, *args, **kwargs):
|
|
||||||
super(SearchView, self).__init__(*args, **kwargs)
|
|
||||||
self.ix = index.open_index()
|
|
||||||
|
|
||||||
def add_infos_to_hit(self, r):
|
def add_infos_to_hit(self, r):
|
||||||
try:
|
try:
|
||||||
doc = Document.objects.get(id=r['id'])
|
doc = Document.objects.get(id=r['id'])
|
||||||
@@ -525,6 +527,7 @@ class SearchView(APIView):
|
|||||||
}
|
}
|
||||||
|
|
||||||
def get(self, request, format=None):
|
def get(self, request, format=None):
|
||||||
|
from documents import index
|
||||||
|
|
||||||
if 'query' in request.query_params:
|
if 'query' in request.query_params:
|
||||||
query = request.query_params['query']
|
query = request.query_params['query']
|
||||||
@@ -554,8 +557,10 @@ class SearchView(APIView):
|
|||||||
if page < 1:
|
if page < 1:
|
||||||
page = 1
|
page = 1
|
||||||
|
|
||||||
|
ix = index.open_index()
|
||||||
|
|
||||||
try:
|
try:
|
||||||
with index.query_page(self.ix, page, query, more_like_id, more_like_content) as (result_page, corrected_query): # NOQA: E501
|
with index.query_page(ix, page, query, more_like_id, more_like_content) as (result_page, corrected_query): # NOQA: E501
|
||||||
return Response(
|
return Response(
|
||||||
{'count': len(result_page),
|
{'count': len(result_page),
|
||||||
'page': result_page.pagenum,
|
'page': result_page.pagenum,
|
||||||
@@ -570,10 +575,6 @@ class SearchAutoCompleteView(APIView):
|
|||||||
|
|
||||||
permission_classes = (IsAuthenticated,)
|
permission_classes = (IsAuthenticated,)
|
||||||
|
|
||||||
def __init__(self, *args, **kwargs):
|
|
||||||
super(SearchAutoCompleteView, self).__init__(*args, **kwargs)
|
|
||||||
self.ix = index.open_index()
|
|
||||||
|
|
||||||
def get(self, request, format=None):
|
def get(self, request, format=None):
|
||||||
if 'term' in request.query_params:
|
if 'term' in request.query_params:
|
||||||
term = request.query_params['term']
|
term = request.query_params['term']
|
||||||
@@ -587,7 +588,11 @@ class SearchAutoCompleteView(APIView):
|
|||||||
else:
|
else:
|
||||||
limit = 10
|
limit = 10
|
||||||
|
|
||||||
return Response(index.autocomplete(self.ix, term, limit))
|
from documents import index
|
||||||
|
|
||||||
|
ix = index.open_index()
|
||||||
|
|
||||||
|
return Response(index.autocomplete(ix, term, limit))
|
||||||
|
|
||||||
|
|
||||||
class StatisticsView(APIView):
|
class StatisticsView(APIView):
|
||||||
@@ -595,8 +600,66 @@ class StatisticsView(APIView):
|
|||||||
permission_classes = (IsAuthenticated,)
|
permission_classes = (IsAuthenticated,)
|
||||||
|
|
||||||
def get(self, request, format=None):
|
def get(self, request, format=None):
|
||||||
return Response({
|
documents_total = Document.objects.all().count()
|
||||||
'documents_total': Document.objects.all().count(),
|
if Tag.objects.filter(is_inbox_tag=True).exists():
|
||||||
'documents_inbox': Document.objects.filter(
|
documents_inbox = Document.objects.filter(
|
||||||
tags__is_inbox_tag=True).distinct().count()
|
tags__is_inbox_tag=True).distinct().count()
|
||||||
|
else:
|
||||||
|
documents_inbox = None
|
||||||
|
|
||||||
|
return Response({
|
||||||
|
'documents_total': documents_total,
|
||||||
|
'documents_inbox': documents_inbox,
|
||||||
})
|
})
|
||||||
|
|
||||||
|
|
||||||
|
class BulkDownloadView(APIView):
|
||||||
|
|
||||||
|
permission_classes = (IsAuthenticated,)
|
||||||
|
serializer_class = BulkDownloadSerializer
|
||||||
|
parser_classes = (parsers.JSONParser,)
|
||||||
|
|
||||||
|
def get_serializer_context(self):
|
||||||
|
return {
|
||||||
|
'request': self.request,
|
||||||
|
'format': self.format_kwarg,
|
||||||
|
'view': self
|
||||||
|
}
|
||||||
|
|
||||||
|
def get_serializer(self, *args, **kwargs):
|
||||||
|
kwargs['context'] = self.get_serializer_context()
|
||||||
|
return self.serializer_class(*args, **kwargs)
|
||||||
|
|
||||||
|
def post(self, request, format=None):
|
||||||
|
serializer = self.get_serializer(data=request.data)
|
||||||
|
serializer.is_valid(raise_exception=True)
|
||||||
|
|
||||||
|
ids = serializer.validated_data.get('documents')
|
||||||
|
compression = serializer.validated_data.get('compression')
|
||||||
|
content = serializer.validated_data.get('content')
|
||||||
|
|
||||||
|
os.makedirs(settings.SCRATCH_DIR, exist_ok=True)
|
||||||
|
temp = tempfile.NamedTemporaryFile(
|
||||||
|
dir=settings.SCRATCH_DIR,
|
||||||
|
suffix="-compressed-archive",
|
||||||
|
delete=False)
|
||||||
|
|
||||||
|
if content == 'both':
|
||||||
|
strategy_class = OriginalAndArchiveStrategy
|
||||||
|
elif content == 'originals':
|
||||||
|
strategy_class = OriginalsOnlyStrategy
|
||||||
|
else:
|
||||||
|
strategy_class = ArchiveOnlyStrategy
|
||||||
|
|
||||||
|
with zipfile.ZipFile(temp.name, "w", compression) as zipf:
|
||||||
|
strategy = strategy_class(zipf)
|
||||||
|
for id in ids:
|
||||||
|
doc = Document.objects.get(id=id)
|
||||||
|
strategy.add_document(doc)
|
||||||
|
|
||||||
|
with open(temp.name, "rb") as f:
|
||||||
|
response = HttpResponse(f, content_type="application/zip")
|
||||||
|
response["Content-Disposition"] = '{}; filename="{}"'.format(
|
||||||
|
"attachment", "documents.zip")
|
||||||
|
|
||||||
|
return response
|
||||||
|
@@ -11,8 +11,8 @@ msgid ""
|
|||||||
msgstr ""
|
msgstr ""
|
||||||
"Project-Id-Version: PACKAGE VERSION\n"
|
"Project-Id-Version: PACKAGE VERSION\n"
|
||||||
"Report-Msgid-Bugs-To: \n"
|
"Report-Msgid-Bugs-To: \n"
|
||||||
"POT-Creation-Date: 2021-01-28 22:02+0100\n"
|
"POT-Creation-Date: 2021-02-16 14:52+0100\n"
|
||||||
"PO-Revision-Date: 2020-12-30 19:27+0000\n"
|
"PO-Revision-Date: 2021-02-16 18:37+0000\n"
|
||||||
"Last-Translator: Jonas Winkler, 2021\n"
|
"Last-Translator: Jonas Winkler, 2021\n"
|
||||||
"Language-Team: German (https://www.transifex.com/paperless/teams/115905/de/)\n"
|
"Language-Team: German (https://www.transifex.com/paperless/teams/115905/de/)\n"
|
||||||
"MIME-Version: 1.0\n"
|
"MIME-Version: 1.0\n"
|
||||||
@@ -25,64 +25,64 @@ msgstr ""
|
|||||||
msgid "Documents"
|
msgid "Documents"
|
||||||
msgstr "Dokumente"
|
msgstr "Dokumente"
|
||||||
|
|
||||||
#: documents/models.py:33
|
#: documents/models.py:32
|
||||||
msgid "Any word"
|
msgid "Any word"
|
||||||
msgstr "Irgendein Wort"
|
msgstr "Irgendein Wort"
|
||||||
|
|
||||||
#: documents/models.py:34
|
#: documents/models.py:33
|
||||||
msgid "All words"
|
msgid "All words"
|
||||||
msgstr "Alle Wörter"
|
msgstr "Alle Wörter"
|
||||||
|
|
||||||
#: documents/models.py:35
|
#: documents/models.py:34
|
||||||
msgid "Exact match"
|
msgid "Exact match"
|
||||||
msgstr "Exakte Übereinstimmung"
|
msgstr "Exakte Übereinstimmung"
|
||||||
|
|
||||||
#: documents/models.py:36
|
#: documents/models.py:35
|
||||||
msgid "Regular expression"
|
msgid "Regular expression"
|
||||||
msgstr "Regulärer Ausdruck"
|
msgstr "Regulärer Ausdruck"
|
||||||
|
|
||||||
#: documents/models.py:37
|
#: documents/models.py:36
|
||||||
msgid "Fuzzy word"
|
msgid "Fuzzy word"
|
||||||
msgstr "Ungenaues Wort"
|
msgstr "Ungenaues Wort"
|
||||||
|
|
||||||
#: documents/models.py:38
|
#: documents/models.py:37
|
||||||
msgid "Automatic"
|
msgid "Automatic"
|
||||||
msgstr "Automatisch"
|
msgstr "Automatisch"
|
||||||
|
|
||||||
#: documents/models.py:42 documents/models.py:352 paperless_mail/models.py:25
|
#: documents/models.py:41 documents/models.py:364 paperless_mail/models.py:25
|
||||||
#: paperless_mail/models.py:109
|
#: paperless_mail/models.py:109
|
||||||
msgid "name"
|
msgid "name"
|
||||||
msgstr "Name"
|
msgstr "Name"
|
||||||
|
|
||||||
#: documents/models.py:46
|
#: documents/models.py:45
|
||||||
msgid "match"
|
msgid "match"
|
||||||
msgstr "Zuweisungsmuster"
|
msgstr "Zuweisungsmuster"
|
||||||
|
|
||||||
#: documents/models.py:50
|
#: documents/models.py:49
|
||||||
msgid "matching algorithm"
|
msgid "matching algorithm"
|
||||||
msgstr "Zuweisungsalgorithmus"
|
msgstr "Zuweisungsalgorithmus"
|
||||||
|
|
||||||
#: documents/models.py:56
|
#: documents/models.py:55
|
||||||
msgid "is insensitive"
|
msgid "is insensitive"
|
||||||
msgstr "Groß-/Kleinschreibung irrelevant"
|
msgstr "Groß-/Kleinschreibung irrelevant"
|
||||||
|
|
||||||
#: documents/models.py:75 documents/models.py:135
|
#: documents/models.py:74 documents/models.py:134
|
||||||
msgid "correspondent"
|
msgid "correspondent"
|
||||||
msgstr "Korrespondent"
|
msgstr "Korrespondent"
|
||||||
|
|
||||||
#: documents/models.py:76
|
#: documents/models.py:75
|
||||||
msgid "correspondents"
|
msgid "correspondents"
|
||||||
msgstr "Korrespondenten"
|
msgstr "Korrespondenten"
|
||||||
|
|
||||||
#: documents/models.py:98
|
#: documents/models.py:97
|
||||||
msgid "color"
|
msgid "color"
|
||||||
msgstr "Farbe"
|
msgstr "Farbe"
|
||||||
|
|
||||||
#: documents/models.py:102
|
#: documents/models.py:101
|
||||||
msgid "is inbox tag"
|
msgid "is inbox tag"
|
||||||
msgstr "Posteingangs-Tag"
|
msgstr "Posteingangs-Tag"
|
||||||
|
|
||||||
#: documents/models.py:104
|
#: documents/models.py:103
|
||||||
msgid ""
|
msgid ""
|
||||||
"Marks this tag as an inbox tag: All newly consumed documents will be tagged "
|
"Marks this tag as an inbox tag: All newly consumed documents will be tagged "
|
||||||
"with inbox tags."
|
"with inbox tags."
|
||||||
@@ -90,39 +90,39 @@ msgstr ""
|
|||||||
"Markiert das Tag als Posteingangs-Tag. Neue Dokumente werden immer mit "
|
"Markiert das Tag als Posteingangs-Tag. Neue Dokumente werden immer mit "
|
||||||
"diesem Tag versehen."
|
"diesem Tag versehen."
|
||||||
|
|
||||||
#: documents/models.py:109
|
#: documents/models.py:108
|
||||||
msgid "tag"
|
msgid "tag"
|
||||||
msgstr "Tag"
|
msgstr "Tag"
|
||||||
|
|
||||||
#: documents/models.py:110 documents/models.py:166
|
#: documents/models.py:109 documents/models.py:165
|
||||||
msgid "tags"
|
msgid "tags"
|
||||||
msgstr "Tags"
|
msgstr "Tags"
|
||||||
|
|
||||||
#: documents/models.py:116 documents/models.py:148
|
#: documents/models.py:115 documents/models.py:147
|
||||||
msgid "document type"
|
msgid "document type"
|
||||||
msgstr "Dokumenttyp"
|
msgstr "Dokumenttyp"
|
||||||
|
|
||||||
#: documents/models.py:117
|
#: documents/models.py:116
|
||||||
msgid "document types"
|
msgid "document types"
|
||||||
msgstr "Dokumenttypen"
|
msgstr "Dokumenttypen"
|
||||||
|
|
||||||
#: documents/models.py:125
|
#: documents/models.py:124
|
||||||
msgid "Unencrypted"
|
msgid "Unencrypted"
|
||||||
msgstr "Nicht verschlüsselt"
|
msgstr "Nicht verschlüsselt"
|
||||||
|
|
||||||
#: documents/models.py:126
|
#: documents/models.py:125
|
||||||
msgid "Encrypted with GNU Privacy Guard"
|
msgid "Encrypted with GNU Privacy Guard"
|
||||||
msgstr "Verschlüsselt mit GNU Privacy Guard"
|
msgstr "Verschlüsselt mit GNU Privacy Guard"
|
||||||
|
|
||||||
#: documents/models.py:139
|
#: documents/models.py:138
|
||||||
msgid "title"
|
msgid "title"
|
||||||
msgstr "Titel"
|
msgstr "Titel"
|
||||||
|
|
||||||
#: documents/models.py:152
|
#: documents/models.py:151
|
||||||
msgid "content"
|
msgid "content"
|
||||||
msgstr "Inhalt"
|
msgstr "Inhalt"
|
||||||
|
|
||||||
#: documents/models.py:154
|
#: documents/models.py:153
|
||||||
msgid ""
|
msgid ""
|
||||||
"The raw, text-only data of the document. This field is primarily used for "
|
"The raw, text-only data of the document. This field is primarily used for "
|
||||||
"searching."
|
"searching."
|
||||||
@@ -130,43 +130,43 @@ msgstr ""
|
|||||||
"Der Inhalt des Dokuments in Textform. Dieses Feld wird primär für die Suche "
|
"Der Inhalt des Dokuments in Textform. Dieses Feld wird primär für die Suche "
|
||||||
"verwendet."
|
"verwendet."
|
||||||
|
|
||||||
#: documents/models.py:159
|
#: documents/models.py:158
|
||||||
msgid "mime type"
|
msgid "mime type"
|
||||||
msgstr "MIME-Typ"
|
msgstr "MIME-Typ"
|
||||||
|
|
||||||
#: documents/models.py:170
|
#: documents/models.py:169
|
||||||
msgid "checksum"
|
msgid "checksum"
|
||||||
msgstr "Prüfsumme"
|
msgstr "Prüfsumme"
|
||||||
|
|
||||||
#: documents/models.py:174
|
#: documents/models.py:173
|
||||||
msgid "The checksum of the original document."
|
msgid "The checksum of the original document."
|
||||||
msgstr "Die Prüfsumme des originalen Dokuments."
|
msgstr "Die Prüfsumme des originalen Dokuments."
|
||||||
|
|
||||||
#: documents/models.py:178
|
#: documents/models.py:177
|
||||||
msgid "archive checksum"
|
msgid "archive checksum"
|
||||||
msgstr "Archiv-Prüfsumme"
|
msgstr "Archiv-Prüfsumme"
|
||||||
|
|
||||||
#: documents/models.py:183
|
#: documents/models.py:182
|
||||||
msgid "The checksum of the archived document."
|
msgid "The checksum of the archived document."
|
||||||
msgstr "Die Prüfsumme des archivierten Dokuments."
|
msgstr "Die Prüfsumme des archivierten Dokuments."
|
||||||
|
|
||||||
#: documents/models.py:187 documents/models.py:330
|
#: documents/models.py:186 documents/models.py:342
|
||||||
msgid "created"
|
msgid "created"
|
||||||
msgstr "Ausgestellt"
|
msgstr "Ausgestellt"
|
||||||
|
|
||||||
#: documents/models.py:191
|
#: documents/models.py:190
|
||||||
msgid "modified"
|
msgid "modified"
|
||||||
msgstr "Geändert"
|
msgstr "Geändert"
|
||||||
|
|
||||||
#: documents/models.py:195
|
#: documents/models.py:194
|
||||||
msgid "storage type"
|
msgid "storage type"
|
||||||
msgstr "Speichertyp"
|
msgstr "Speichertyp"
|
||||||
|
|
||||||
#: documents/models.py:203
|
#: documents/models.py:202
|
||||||
msgid "added"
|
msgid "added"
|
||||||
msgstr "Hinzugefügt"
|
msgstr "Hinzugefügt"
|
||||||
|
|
||||||
#: documents/models.py:207
|
#: documents/models.py:206
|
||||||
msgid "filename"
|
msgid "filename"
|
||||||
msgstr "Dateiname"
|
msgstr "Dateiname"
|
||||||
|
|
||||||
@@ -175,178 +175,186 @@ msgid "Current filename in storage"
|
|||||||
msgstr "Aktueller Dateiname im Datenspeicher"
|
msgstr "Aktueller Dateiname im Datenspeicher"
|
||||||
|
|
||||||
#: documents/models.py:216
|
#: documents/models.py:216
|
||||||
|
msgid "archive filename"
|
||||||
|
msgstr "Archiv-Dateiname"
|
||||||
|
|
||||||
|
#: documents/models.py:222
|
||||||
|
msgid "Current archive filename in storage"
|
||||||
|
msgstr "Aktueller Dateiname im Archiv"
|
||||||
|
|
||||||
|
#: documents/models.py:226
|
||||||
msgid "archive serial number"
|
msgid "archive serial number"
|
||||||
msgstr "Archiv-Seriennummer"
|
msgstr "Archiv-Seriennummer"
|
||||||
|
|
||||||
#: documents/models.py:221
|
#: documents/models.py:231
|
||||||
msgid "The position of this document in your physical document archive."
|
msgid "The position of this document in your physical document archive."
|
||||||
msgstr "Die Position dieses Dokuments in Ihrem physischen Dokumentenarchiv."
|
msgstr "Die Position dieses Dokuments in Ihrem physischen Dokumentenarchiv."
|
||||||
|
|
||||||
#: documents/models.py:227
|
#: documents/models.py:237
|
||||||
msgid "document"
|
msgid "document"
|
||||||
msgstr "Dokument"
|
msgstr "Dokument"
|
||||||
|
|
||||||
#: documents/models.py:228
|
#: documents/models.py:238
|
||||||
msgid "documents"
|
msgid "documents"
|
||||||
msgstr "Dokumente"
|
msgstr "Dokumente"
|
||||||
|
|
||||||
#: documents/models.py:313
|
#: documents/models.py:325
|
||||||
msgid "debug"
|
msgid "debug"
|
||||||
msgstr "Debug"
|
msgstr "Debug"
|
||||||
|
|
||||||
#: documents/models.py:314
|
#: documents/models.py:326
|
||||||
msgid "information"
|
msgid "information"
|
||||||
msgstr "Information"
|
msgstr "Information"
|
||||||
|
|
||||||
#: documents/models.py:315
|
#: documents/models.py:327
|
||||||
msgid "warning"
|
msgid "warning"
|
||||||
msgstr "Warnung"
|
msgstr "Warnung"
|
||||||
|
|
||||||
#: documents/models.py:316
|
#: documents/models.py:328
|
||||||
msgid "error"
|
msgid "error"
|
||||||
msgstr "Fehler"
|
msgstr "Fehler"
|
||||||
|
|
||||||
#: documents/models.py:317
|
#: documents/models.py:329
|
||||||
msgid "critical"
|
msgid "critical"
|
||||||
msgstr "Kritisch"
|
msgstr "Kritisch"
|
||||||
|
|
||||||
#: documents/models.py:321
|
#: documents/models.py:333
|
||||||
msgid "group"
|
msgid "group"
|
||||||
msgstr "Gruppe"
|
msgstr "Gruppe"
|
||||||
|
|
||||||
#: documents/models.py:324
|
#: documents/models.py:336
|
||||||
msgid "message"
|
msgid "message"
|
||||||
msgstr "Nachricht"
|
msgstr "Nachricht"
|
||||||
|
|
||||||
#: documents/models.py:327
|
#: documents/models.py:339
|
||||||
msgid "level"
|
msgid "level"
|
||||||
msgstr "Level"
|
msgstr "Level"
|
||||||
|
|
||||||
#: documents/models.py:334
|
#: documents/models.py:346
|
||||||
msgid "log"
|
msgid "log"
|
||||||
msgstr "Protokoll"
|
msgstr "Protokoll"
|
||||||
|
|
||||||
#: documents/models.py:335
|
#: documents/models.py:347
|
||||||
msgid "logs"
|
msgid "logs"
|
||||||
msgstr "Protokoll"
|
msgstr "Protokoll"
|
||||||
|
|
||||||
#: documents/models.py:346 documents/models.py:396
|
#: documents/models.py:358 documents/models.py:408
|
||||||
msgid "saved view"
|
msgid "saved view"
|
||||||
msgstr "Gespeicherte Ansicht"
|
msgstr "Gespeicherte Ansicht"
|
||||||
|
|
||||||
#: documents/models.py:347
|
#: documents/models.py:359
|
||||||
msgid "saved views"
|
msgid "saved views"
|
||||||
msgstr "Gespeicherte Ansichten"
|
msgstr "Gespeicherte Ansichten"
|
||||||
|
|
||||||
#: documents/models.py:350
|
#: documents/models.py:362
|
||||||
msgid "user"
|
msgid "user"
|
||||||
msgstr "Benutzer"
|
msgstr "Benutzer"
|
||||||
|
|
||||||
#: documents/models.py:356
|
#: documents/models.py:368
|
||||||
msgid "show on dashboard"
|
msgid "show on dashboard"
|
||||||
msgstr "Auf Startseite zeigen"
|
msgstr "Auf Startseite zeigen"
|
||||||
|
|
||||||
#: documents/models.py:359
|
#: documents/models.py:371
|
||||||
msgid "show in sidebar"
|
msgid "show in sidebar"
|
||||||
msgstr "In Seitenleiste zeigen"
|
msgstr "In Seitenleiste zeigen"
|
||||||
|
|
||||||
#: documents/models.py:363
|
#: documents/models.py:375
|
||||||
msgid "sort field"
|
msgid "sort field"
|
||||||
msgstr "Sortierfeld"
|
msgstr "Sortierfeld"
|
||||||
|
|
||||||
#: documents/models.py:366
|
#: documents/models.py:378
|
||||||
msgid "sort reverse"
|
msgid "sort reverse"
|
||||||
msgstr "Umgekehrte Sortierung"
|
msgstr "Umgekehrte Sortierung"
|
||||||
|
|
||||||
#: documents/models.py:372
|
#: documents/models.py:384
|
||||||
msgid "title contains"
|
msgid "title contains"
|
||||||
msgstr "Titel enthält"
|
msgstr "Titel enthält"
|
||||||
|
|
||||||
#: documents/models.py:373
|
#: documents/models.py:385
|
||||||
msgid "content contains"
|
msgid "content contains"
|
||||||
msgstr "Inhalt enthält"
|
msgstr "Inhalt enthält"
|
||||||
|
|
||||||
#: documents/models.py:374
|
#: documents/models.py:386
|
||||||
msgid "ASN is"
|
msgid "ASN is"
|
||||||
msgstr "ASN ist"
|
msgstr "ASN ist"
|
||||||
|
|
||||||
#: documents/models.py:375
|
#: documents/models.py:387
|
||||||
msgid "correspondent is"
|
msgid "correspondent is"
|
||||||
msgstr "Korrespondent ist"
|
msgstr "Korrespondent ist"
|
||||||
|
|
||||||
#: documents/models.py:376
|
#: documents/models.py:388
|
||||||
msgid "document type is"
|
msgid "document type is"
|
||||||
msgstr "Dokumenttyp ist"
|
msgstr "Dokumenttyp ist"
|
||||||
|
|
||||||
#: documents/models.py:377
|
#: documents/models.py:389
|
||||||
msgid "is in inbox"
|
msgid "is in inbox"
|
||||||
msgstr "Ist im Posteingang"
|
msgstr "Ist im Posteingang"
|
||||||
|
|
||||||
#: documents/models.py:378
|
#: documents/models.py:390
|
||||||
msgid "has tag"
|
msgid "has tag"
|
||||||
msgstr "Hat Tag"
|
msgstr "Hat Tag"
|
||||||
|
|
||||||
#: documents/models.py:379
|
#: documents/models.py:391
|
||||||
msgid "has any tag"
|
msgid "has any tag"
|
||||||
msgstr "Hat irgendein Tag"
|
msgstr "Hat irgendein Tag"
|
||||||
|
|
||||||
#: documents/models.py:380
|
#: documents/models.py:392
|
||||||
msgid "created before"
|
msgid "created before"
|
||||||
msgstr "Ausgestellt vor"
|
msgstr "Ausgestellt vor"
|
||||||
|
|
||||||
#: documents/models.py:381
|
#: documents/models.py:393
|
||||||
msgid "created after"
|
msgid "created after"
|
||||||
msgstr "Ausgestellt nach"
|
msgstr "Ausgestellt nach"
|
||||||
|
|
||||||
#: documents/models.py:382
|
#: documents/models.py:394
|
||||||
msgid "created year is"
|
msgid "created year is"
|
||||||
msgstr "Ausgestellt im Jahr"
|
msgstr "Ausgestellt im Jahr"
|
||||||
|
|
||||||
#: documents/models.py:383
|
#: documents/models.py:395
|
||||||
msgid "created month is"
|
msgid "created month is"
|
||||||
msgstr "Ausgestellt im Monat"
|
msgstr "Ausgestellt im Monat"
|
||||||
|
|
||||||
#: documents/models.py:384
|
#: documents/models.py:396
|
||||||
msgid "created day is"
|
msgid "created day is"
|
||||||
msgstr "Ausgestellt am Tag"
|
msgstr "Ausgestellt am Tag"
|
||||||
|
|
||||||
#: documents/models.py:385
|
#: documents/models.py:397
|
||||||
msgid "added before"
|
msgid "added before"
|
||||||
msgstr "Hinzugefügt vor"
|
msgstr "Hinzugefügt vor"
|
||||||
|
|
||||||
#: documents/models.py:386
|
#: documents/models.py:398
|
||||||
msgid "added after"
|
msgid "added after"
|
||||||
msgstr "Hinzugefügt nach"
|
msgstr "Hinzugefügt nach"
|
||||||
|
|
||||||
#: documents/models.py:387
|
#: documents/models.py:399
|
||||||
msgid "modified before"
|
msgid "modified before"
|
||||||
msgstr "Geändert vor"
|
msgstr "Geändert vor"
|
||||||
|
|
||||||
#: documents/models.py:388
|
#: documents/models.py:400
|
||||||
msgid "modified after"
|
msgid "modified after"
|
||||||
msgstr "Geändert nach"
|
msgstr "Geändert nach"
|
||||||
|
|
||||||
#: documents/models.py:389
|
#: documents/models.py:401
|
||||||
msgid "does not have tag"
|
msgid "does not have tag"
|
||||||
msgstr "Hat nicht folgendes Tag"
|
msgstr "Hat nicht folgendes Tag"
|
||||||
|
|
||||||
#: documents/models.py:400
|
#: documents/models.py:412
|
||||||
msgid "rule type"
|
msgid "rule type"
|
||||||
msgstr "Regeltyp"
|
msgstr "Regeltyp"
|
||||||
|
|
||||||
#: documents/models.py:404
|
#: documents/models.py:416
|
||||||
msgid "value"
|
msgid "value"
|
||||||
msgstr "Wert"
|
msgstr "Wert"
|
||||||
|
|
||||||
#: documents/models.py:410
|
#: documents/models.py:422
|
||||||
msgid "filter rule"
|
msgid "filter rule"
|
||||||
msgstr "Filterregel"
|
msgstr "Filterregel"
|
||||||
|
|
||||||
#: documents/models.py:411
|
#: documents/models.py:423
|
||||||
msgid "filter rules"
|
msgid "filter rules"
|
||||||
msgstr "Filterregeln"
|
msgstr "Filterregeln"
|
||||||
|
|
||||||
#: documents/serialisers.py:383
|
#: documents/serialisers.py:370
|
||||||
#, python-format
|
#, python-format
|
||||||
msgid "File type %(type)s not supported"
|
msgid "File type %(type)s not supported"
|
||||||
msgstr "Dateityp %(type)s nicht unterstützt"
|
msgstr "Dateityp %(type)s nicht unterstützt"
|
||||||
@@ -393,19 +401,23 @@ msgstr "Passwort"
|
|||||||
msgid "Sign in"
|
msgid "Sign in"
|
||||||
msgstr "Anmelden"
|
msgstr "Anmelden"
|
||||||
|
|
||||||
#: paperless/settings.py:286
|
#: paperless/settings.py:291
|
||||||
msgid "English"
|
msgid "English (US)"
|
||||||
msgstr "Englisch"
|
msgstr "Englisch (US)"
|
||||||
|
|
||||||
#: paperless/settings.py:287
|
#: paperless/settings.py:292
|
||||||
|
msgid "English (GB)"
|
||||||
|
msgstr "Englisch (UK)"
|
||||||
|
|
||||||
|
#: paperless/settings.py:293
|
||||||
msgid "German"
|
msgid "German"
|
||||||
msgstr "Deutsch"
|
msgstr "Deutsch"
|
||||||
|
|
||||||
#: paperless/settings.py:288
|
#: paperless/settings.py:294
|
||||||
msgid "Dutch"
|
msgid "Dutch"
|
||||||
msgstr "Niederländisch"
|
msgstr "Niederländisch"
|
||||||
|
|
||||||
#: paperless/settings.py:289
|
#: paperless/settings.py:295
|
||||||
msgid "French"
|
msgid "French"
|
||||||
msgstr "Französisch"
|
msgstr "Französisch"
|
||||||
|
|
||||||
|
@@ -4,16 +4,17 @@
|
|||||||
# FIRST AUTHOR <EMAIL@ADDRESS>, YEAR.
|
# FIRST AUTHOR <EMAIL@ADDRESS>, YEAR.
|
||||||
#
|
#
|
||||||
# Translators:
|
# Translators:
|
||||||
# Ali Bates <xadium@gmail.com>, 2021
|
# Ali Bates, 2021
|
||||||
|
# Jonas Winkler, 2021
|
||||||
#
|
#
|
||||||
#, fuzzy
|
#, fuzzy
|
||||||
msgid ""
|
msgid ""
|
||||||
msgstr ""
|
msgstr ""
|
||||||
"Project-Id-Version: PACKAGE VERSION\n"
|
"Project-Id-Version: PACKAGE VERSION\n"
|
||||||
"Report-Msgid-Bugs-To: \n"
|
"Report-Msgid-Bugs-To: \n"
|
||||||
"POT-Creation-Date: 2021-01-28 22:02+0100\n"
|
"POT-Creation-Date: 2021-02-16 14:52+0100\n"
|
||||||
"PO-Revision-Date: 2020-12-30 19:27+0000\n"
|
"PO-Revision-Date: 2021-02-16 18:37+0000\n"
|
||||||
"Last-Translator: Ali Bates <xadium@gmail.com>, 2021\n"
|
"Last-Translator: Jonas Winkler, 2021\n"
|
||||||
"Language-Team: English (United Kingdom) (https://www.transifex.com/paperless/teams/115905/en_GB/)\n"
|
"Language-Team: English (United Kingdom) (https://www.transifex.com/paperless/teams/115905/en_GB/)\n"
|
||||||
"MIME-Version: 1.0\n"
|
"MIME-Version: 1.0\n"
|
||||||
"Content-Type: text/plain; charset=UTF-8\n"
|
"Content-Type: text/plain; charset=UTF-8\n"
|
||||||
@@ -25,64 +26,64 @@ msgstr ""
|
|||||||
msgid "Documents"
|
msgid "Documents"
|
||||||
msgstr "Documents"
|
msgstr "Documents"
|
||||||
|
|
||||||
#: documents/models.py:33
|
#: documents/models.py:32
|
||||||
msgid "Any word"
|
msgid "Any word"
|
||||||
msgstr "Any word"
|
msgstr "Any word"
|
||||||
|
|
||||||
#: documents/models.py:34
|
#: documents/models.py:33
|
||||||
msgid "All words"
|
msgid "All words"
|
||||||
msgstr "All words"
|
msgstr "All words"
|
||||||
|
|
||||||
#: documents/models.py:35
|
#: documents/models.py:34
|
||||||
msgid "Exact match"
|
msgid "Exact match"
|
||||||
msgstr "Exact match"
|
msgstr "Exact match"
|
||||||
|
|
||||||
#: documents/models.py:36
|
#: documents/models.py:35
|
||||||
msgid "Regular expression"
|
msgid "Regular expression"
|
||||||
msgstr "Regular expression"
|
msgstr "Regular expression"
|
||||||
|
|
||||||
#: documents/models.py:37
|
#: documents/models.py:36
|
||||||
msgid "Fuzzy word"
|
msgid "Fuzzy word"
|
||||||
msgstr "Fuzzy word"
|
msgstr "Fuzzy word"
|
||||||
|
|
||||||
#: documents/models.py:38
|
#: documents/models.py:37
|
||||||
msgid "Automatic"
|
msgid "Automatic"
|
||||||
msgstr "Automatic"
|
msgstr "Automatic"
|
||||||
|
|
||||||
#: documents/models.py:42 documents/models.py:352 paperless_mail/models.py:25
|
#: documents/models.py:41 documents/models.py:364 paperless_mail/models.py:25
|
||||||
#: paperless_mail/models.py:109
|
#: paperless_mail/models.py:109
|
||||||
msgid "name"
|
msgid "name"
|
||||||
msgstr "name"
|
msgstr "name"
|
||||||
|
|
||||||
#: documents/models.py:46
|
#: documents/models.py:45
|
||||||
msgid "match"
|
msgid "match"
|
||||||
msgstr "match"
|
msgstr "match"
|
||||||
|
|
||||||
#: documents/models.py:50
|
#: documents/models.py:49
|
||||||
msgid "matching algorithm"
|
msgid "matching algorithm"
|
||||||
msgstr "matching algorithm"
|
msgstr "matching algorithm"
|
||||||
|
|
||||||
#: documents/models.py:56
|
#: documents/models.py:55
|
||||||
msgid "is insensitive"
|
msgid "is insensitive"
|
||||||
msgstr "is insensitive"
|
msgstr "is insensitive"
|
||||||
|
|
||||||
#: documents/models.py:75 documents/models.py:135
|
#: documents/models.py:74 documents/models.py:134
|
||||||
msgid "correspondent"
|
msgid "correspondent"
|
||||||
msgstr "correspondent"
|
msgstr "correspondent"
|
||||||
|
|
||||||
#: documents/models.py:76
|
#: documents/models.py:75
|
||||||
msgid "correspondents"
|
msgid "correspondents"
|
||||||
msgstr "correspondents"
|
msgstr "correspondents"
|
||||||
|
|
||||||
#: documents/models.py:98
|
#: documents/models.py:97
|
||||||
msgid "color"
|
msgid "color"
|
||||||
msgstr "color"
|
msgstr "colour"
|
||||||
|
|
||||||
#: documents/models.py:102
|
#: documents/models.py:101
|
||||||
msgid "is inbox tag"
|
msgid "is inbox tag"
|
||||||
msgstr "is inbox tag"
|
msgstr "is inbox tag"
|
||||||
|
|
||||||
#: documents/models.py:104
|
#: documents/models.py:103
|
||||||
msgid ""
|
msgid ""
|
||||||
"Marks this tag as an inbox tag: All newly consumed documents will be tagged "
|
"Marks this tag as an inbox tag: All newly consumed documents will be tagged "
|
||||||
"with inbox tags."
|
"with inbox tags."
|
||||||
@@ -90,39 +91,39 @@ msgstr ""
|
|||||||
"Marks this tag as an inbox tag: All newly consumed documents will be tagged "
|
"Marks this tag as an inbox tag: All newly consumed documents will be tagged "
|
||||||
"with inbox tags."
|
"with inbox tags."
|
||||||
|
|
||||||
#: documents/models.py:109
|
#: documents/models.py:108
|
||||||
msgid "tag"
|
msgid "tag"
|
||||||
msgstr "tag"
|
msgstr "tag"
|
||||||
|
|
||||||
#: documents/models.py:110 documents/models.py:166
|
#: documents/models.py:109 documents/models.py:165
|
||||||
msgid "tags"
|
msgid "tags"
|
||||||
msgstr "tags"
|
msgstr "tags"
|
||||||
|
|
||||||
#: documents/models.py:116 documents/models.py:148
|
#: documents/models.py:115 documents/models.py:147
|
||||||
msgid "document type"
|
msgid "document type"
|
||||||
msgstr "document type"
|
msgstr "document type"
|
||||||
|
|
||||||
#: documents/models.py:117
|
#: documents/models.py:116
|
||||||
msgid "document types"
|
msgid "document types"
|
||||||
msgstr "document types"
|
msgstr "document types"
|
||||||
|
|
||||||
#: documents/models.py:125
|
#: documents/models.py:124
|
||||||
msgid "Unencrypted"
|
msgid "Unencrypted"
|
||||||
msgstr "Unencrypted"
|
msgstr "Unencrypted"
|
||||||
|
|
||||||
#: documents/models.py:126
|
#: documents/models.py:125
|
||||||
msgid "Encrypted with GNU Privacy Guard"
|
msgid "Encrypted with GNU Privacy Guard"
|
||||||
msgstr "Encrypted with GNU Privacy Guard"
|
msgstr "Encrypted with GNU Privacy Guard"
|
||||||
|
|
||||||
#: documents/models.py:139
|
#: documents/models.py:138
|
||||||
msgid "title"
|
msgid "title"
|
||||||
msgstr "title"
|
msgstr "title"
|
||||||
|
|
||||||
#: documents/models.py:152
|
#: documents/models.py:151
|
||||||
msgid "content"
|
msgid "content"
|
||||||
msgstr "content"
|
msgstr "content"
|
||||||
|
|
||||||
#: documents/models.py:154
|
#: documents/models.py:153
|
||||||
msgid ""
|
msgid ""
|
||||||
"The raw, text-only data of the document. This field is primarily used for "
|
"The raw, text-only data of the document. This field is primarily used for "
|
||||||
"searching."
|
"searching."
|
||||||
@@ -130,43 +131,43 @@ msgstr ""
|
|||||||
"The raw, text-only data of the document. This field is primarily used for "
|
"The raw, text-only data of the document. This field is primarily used for "
|
||||||
"searching."
|
"searching."
|
||||||
|
|
||||||
#: documents/models.py:159
|
#: documents/models.py:158
|
||||||
msgid "mime type"
|
msgid "mime type"
|
||||||
msgstr "mime type"
|
msgstr "mime type"
|
||||||
|
|
||||||
#: documents/models.py:170
|
#: documents/models.py:169
|
||||||
msgid "checksum"
|
msgid "checksum"
|
||||||
msgstr "checksum"
|
msgstr "checksum"
|
||||||
|
|
||||||
#: documents/models.py:174
|
#: documents/models.py:173
|
||||||
msgid "The checksum of the original document."
|
msgid "The checksum of the original document."
|
||||||
msgstr "The checksum of the original document."
|
msgstr "The checksum of the original document."
|
||||||
|
|
||||||
#: documents/models.py:178
|
#: documents/models.py:177
|
||||||
msgid "archive checksum"
|
msgid "archive checksum"
|
||||||
msgstr "archive checksum"
|
msgstr "archive checksum"
|
||||||
|
|
||||||
#: documents/models.py:183
|
#: documents/models.py:182
|
||||||
msgid "The checksum of the archived document."
|
msgid "The checksum of the archived document."
|
||||||
msgstr "The checksum of the archived document."
|
msgstr "The checksum of the archived document."
|
||||||
|
|
||||||
#: documents/models.py:187 documents/models.py:330
|
#: documents/models.py:186 documents/models.py:342
|
||||||
msgid "created"
|
msgid "created"
|
||||||
msgstr "created"
|
msgstr "created"
|
||||||
|
|
||||||
#: documents/models.py:191
|
#: documents/models.py:190
|
||||||
msgid "modified"
|
msgid "modified"
|
||||||
msgstr "modified"
|
msgstr "modified"
|
||||||
|
|
||||||
#: documents/models.py:195
|
#: documents/models.py:194
|
||||||
msgid "storage type"
|
msgid "storage type"
|
||||||
msgstr "storage type"
|
msgstr "storage type"
|
||||||
|
|
||||||
#: documents/models.py:203
|
#: documents/models.py:202
|
||||||
msgid "added"
|
msgid "added"
|
||||||
msgstr "added"
|
msgstr "added"
|
||||||
|
|
||||||
#: documents/models.py:207
|
#: documents/models.py:206
|
||||||
msgid "filename"
|
msgid "filename"
|
||||||
msgstr "filename"
|
msgstr "filename"
|
||||||
|
|
||||||
@@ -175,178 +176,186 @@ msgid "Current filename in storage"
|
|||||||
msgstr "Current filename in storage"
|
msgstr "Current filename in storage"
|
||||||
|
|
||||||
#: documents/models.py:216
|
#: documents/models.py:216
|
||||||
|
msgid "archive filename"
|
||||||
|
msgstr "archive filename"
|
||||||
|
|
||||||
|
#: documents/models.py:222
|
||||||
|
msgid "Current archive filename in storage"
|
||||||
|
msgstr "Current archive filename in storage"
|
||||||
|
|
||||||
|
#: documents/models.py:226
|
||||||
msgid "archive serial number"
|
msgid "archive serial number"
|
||||||
msgstr "archive serial number"
|
msgstr "archive serial number"
|
||||||
|
|
||||||
#: documents/models.py:221
|
#: documents/models.py:231
|
||||||
msgid "The position of this document in your physical document archive."
|
msgid "The position of this document in your physical document archive."
|
||||||
msgstr "The position of this document in your physical document archive."
|
msgstr "The position of this document in your physical document archive."
|
||||||
|
|
||||||
#: documents/models.py:227
|
#: documents/models.py:237
|
||||||
msgid "document"
|
msgid "document"
|
||||||
msgstr "document"
|
msgstr "document"
|
||||||
|
|
||||||
#: documents/models.py:228
|
#: documents/models.py:238
|
||||||
msgid "documents"
|
msgid "documents"
|
||||||
msgstr "documents"
|
msgstr "documents"
|
||||||
|
|
||||||
#: documents/models.py:313
|
#: documents/models.py:325
|
||||||
msgid "debug"
|
msgid "debug"
|
||||||
msgstr "debug"
|
msgstr "debug"
|
||||||
|
|
||||||
#: documents/models.py:314
|
#: documents/models.py:326
|
||||||
msgid "information"
|
msgid "information"
|
||||||
msgstr "information"
|
msgstr "information"
|
||||||
|
|
||||||
#: documents/models.py:315
|
#: documents/models.py:327
|
||||||
msgid "warning"
|
msgid "warning"
|
||||||
msgstr "warning"
|
msgstr "warning"
|
||||||
|
|
||||||
#: documents/models.py:316
|
#: documents/models.py:328
|
||||||
msgid "error"
|
msgid "error"
|
||||||
msgstr "error"
|
msgstr "error"
|
||||||
|
|
||||||
#: documents/models.py:317
|
#: documents/models.py:329
|
||||||
msgid "critical"
|
msgid "critical"
|
||||||
msgstr "critical"
|
msgstr "critical"
|
||||||
|
|
||||||
#: documents/models.py:321
|
#: documents/models.py:333
|
||||||
msgid "group"
|
msgid "group"
|
||||||
msgstr "group"
|
msgstr "group"
|
||||||
|
|
||||||
#: documents/models.py:324
|
#: documents/models.py:336
|
||||||
msgid "message"
|
msgid "message"
|
||||||
msgstr "message"
|
msgstr "message"
|
||||||
|
|
||||||
#: documents/models.py:327
|
#: documents/models.py:339
|
||||||
msgid "level"
|
msgid "level"
|
||||||
msgstr "level"
|
msgstr "level"
|
||||||
|
|
||||||
#: documents/models.py:334
|
#: documents/models.py:346
|
||||||
msgid "log"
|
msgid "log"
|
||||||
msgstr "log"
|
msgstr "log"
|
||||||
|
|
||||||
#: documents/models.py:335
|
#: documents/models.py:347
|
||||||
msgid "logs"
|
msgid "logs"
|
||||||
msgstr "logs"
|
msgstr "logs"
|
||||||
|
|
||||||
#: documents/models.py:346 documents/models.py:396
|
#: documents/models.py:358 documents/models.py:408
|
||||||
msgid "saved view"
|
msgid "saved view"
|
||||||
msgstr "saved view"
|
msgstr "saved view"
|
||||||
|
|
||||||
#: documents/models.py:347
|
#: documents/models.py:359
|
||||||
msgid "saved views"
|
msgid "saved views"
|
||||||
msgstr "saved views"
|
msgstr "saved views"
|
||||||
|
|
||||||
#: documents/models.py:350
|
#: documents/models.py:362
|
||||||
msgid "user"
|
msgid "user"
|
||||||
msgstr "user"
|
msgstr "user"
|
||||||
|
|
||||||
#: documents/models.py:356
|
#: documents/models.py:368
|
||||||
msgid "show on dashboard"
|
msgid "show on dashboard"
|
||||||
msgstr "show on dashboard"
|
msgstr "show on dashboard"
|
||||||
|
|
||||||
#: documents/models.py:359
|
#: documents/models.py:371
|
||||||
msgid "show in sidebar"
|
msgid "show in sidebar"
|
||||||
msgstr "show in sidebar"
|
msgstr "show in sidebar"
|
||||||
|
|
||||||
#: documents/models.py:363
|
#: documents/models.py:375
|
||||||
msgid "sort field"
|
msgid "sort field"
|
||||||
msgstr "sort field"
|
msgstr "sort field"
|
||||||
|
|
||||||
#: documents/models.py:366
|
#: documents/models.py:378
|
||||||
msgid "sort reverse"
|
msgid "sort reverse"
|
||||||
msgstr "sort reverse"
|
msgstr "sort reverse"
|
||||||
|
|
||||||
#: documents/models.py:372
|
#: documents/models.py:384
|
||||||
msgid "title contains"
|
msgid "title contains"
|
||||||
msgstr "title contains"
|
msgstr "title contains"
|
||||||
|
|
||||||
#: documents/models.py:373
|
#: documents/models.py:385
|
||||||
msgid "content contains"
|
msgid "content contains"
|
||||||
msgstr "content contains"
|
msgstr "content contains"
|
||||||
|
|
||||||
#: documents/models.py:374
|
#: documents/models.py:386
|
||||||
msgid "ASN is"
|
msgid "ASN is"
|
||||||
msgstr "ASN is"
|
msgstr "ASN is"
|
||||||
|
|
||||||
#: documents/models.py:375
|
#: documents/models.py:387
|
||||||
msgid "correspondent is"
|
msgid "correspondent is"
|
||||||
msgstr "correspondent is"
|
msgstr "correspondent is"
|
||||||
|
|
||||||
#: documents/models.py:376
|
#: documents/models.py:388
|
||||||
msgid "document type is"
|
msgid "document type is"
|
||||||
msgstr "document type is"
|
msgstr "document type is"
|
||||||
|
|
||||||
#: documents/models.py:377
|
#: documents/models.py:389
|
||||||
msgid "is in inbox"
|
msgid "is in inbox"
|
||||||
msgstr "is in inbox"
|
msgstr "is in inbox"
|
||||||
|
|
||||||
#: documents/models.py:378
|
#: documents/models.py:390
|
||||||
msgid "has tag"
|
msgid "has tag"
|
||||||
msgstr "has tag"
|
msgstr "has tag"
|
||||||
|
|
||||||
#: documents/models.py:379
|
#: documents/models.py:391
|
||||||
msgid "has any tag"
|
msgid "has any tag"
|
||||||
msgstr "has any tag"
|
msgstr "has any tag"
|
||||||
|
|
||||||
#: documents/models.py:380
|
#: documents/models.py:392
|
||||||
msgid "created before"
|
msgid "created before"
|
||||||
msgstr "created before"
|
msgstr "created before"
|
||||||
|
|
||||||
#: documents/models.py:381
|
#: documents/models.py:393
|
||||||
msgid "created after"
|
msgid "created after"
|
||||||
msgstr "created after"
|
msgstr "created after"
|
||||||
|
|
||||||
#: documents/models.py:382
|
#: documents/models.py:394
|
||||||
msgid "created year is"
|
msgid "created year is"
|
||||||
msgstr "created year is"
|
msgstr "created year is"
|
||||||
|
|
||||||
#: documents/models.py:383
|
#: documents/models.py:395
|
||||||
msgid "created month is"
|
msgid "created month is"
|
||||||
msgstr "created month is"
|
msgstr "created month is"
|
||||||
|
|
||||||
#: documents/models.py:384
|
#: documents/models.py:396
|
||||||
msgid "created day is"
|
msgid "created day is"
|
||||||
msgstr "created day is"
|
msgstr "created day is"
|
||||||
|
|
||||||
#: documents/models.py:385
|
#: documents/models.py:397
|
||||||
msgid "added before"
|
msgid "added before"
|
||||||
msgstr "added before"
|
msgstr "added before"
|
||||||
|
|
||||||
#: documents/models.py:386
|
#: documents/models.py:398
|
||||||
msgid "added after"
|
msgid "added after"
|
||||||
msgstr "added after"
|
msgstr "added after"
|
||||||
|
|
||||||
#: documents/models.py:387
|
#: documents/models.py:399
|
||||||
msgid "modified before"
|
msgid "modified before"
|
||||||
msgstr "modified before"
|
msgstr "modified before"
|
||||||
|
|
||||||
#: documents/models.py:388
|
#: documents/models.py:400
|
||||||
msgid "modified after"
|
msgid "modified after"
|
||||||
msgstr "modified after"
|
msgstr "modified after"
|
||||||
|
|
||||||
#: documents/models.py:389
|
#: documents/models.py:401
|
||||||
msgid "does not have tag"
|
msgid "does not have tag"
|
||||||
msgstr "does not have tag"
|
msgstr "does not have tag"
|
||||||
|
|
||||||
#: documents/models.py:400
|
#: documents/models.py:412
|
||||||
msgid "rule type"
|
msgid "rule type"
|
||||||
msgstr "rule type"
|
msgstr "rule type"
|
||||||
|
|
||||||
#: documents/models.py:404
|
#: documents/models.py:416
|
||||||
msgid "value"
|
msgid "value"
|
||||||
msgstr "value"
|
msgstr "value"
|
||||||
|
|
||||||
#: documents/models.py:410
|
#: documents/models.py:422
|
||||||
msgid "filter rule"
|
msgid "filter rule"
|
||||||
msgstr "filter rule"
|
msgstr "filter rule"
|
||||||
|
|
||||||
#: documents/models.py:411
|
#: documents/models.py:423
|
||||||
msgid "filter rules"
|
msgid "filter rules"
|
||||||
msgstr "filter rules"
|
msgstr "filter rules"
|
||||||
|
|
||||||
#: documents/serialisers.py:383
|
#: documents/serialisers.py:370
|
||||||
#, python-format
|
#, python-format
|
||||||
msgid "File type %(type)s not supported"
|
msgid "File type %(type)s not supported"
|
||||||
msgstr "File type %(type)s not supported"
|
msgstr "File type %(type)s not supported"
|
||||||
@@ -391,19 +400,23 @@ msgstr "Password"
|
|||||||
msgid "Sign in"
|
msgid "Sign in"
|
||||||
msgstr "Sign in"
|
msgstr "Sign in"
|
||||||
|
|
||||||
#: paperless/settings.py:286
|
#: paperless/settings.py:291
|
||||||
msgid "English"
|
msgid "English (US)"
|
||||||
msgstr "English"
|
msgstr "English (US)"
|
||||||
|
|
||||||
#: paperless/settings.py:287
|
#: paperless/settings.py:292
|
||||||
|
msgid "English (GB)"
|
||||||
|
msgstr "English (GB)"
|
||||||
|
|
||||||
|
#: paperless/settings.py:293
|
||||||
msgid "German"
|
msgid "German"
|
||||||
msgstr "German"
|
msgstr "German"
|
||||||
|
|
||||||
#: paperless/settings.py:288
|
#: paperless/settings.py:294
|
||||||
msgid "Dutch"
|
msgid "Dutch"
|
||||||
msgstr "Dutch"
|
msgstr "Dutch"
|
||||||
|
|
||||||
#: paperless/settings.py:289
|
#: paperless/settings.py:295
|
||||||
msgid "French"
|
msgid "French"
|
||||||
msgstr "French"
|
msgstr "French"
|
||||||
|
|
||||||
|
@@ -8,7 +8,7 @@ msgid ""
|
|||||||
msgstr ""
|
msgstr ""
|
||||||
"Project-Id-Version: PACKAGE VERSION\n"
|
"Project-Id-Version: PACKAGE VERSION\n"
|
||||||
"Report-Msgid-Bugs-To: \n"
|
"Report-Msgid-Bugs-To: \n"
|
||||||
"POT-Creation-Date: 2021-01-28 22:02+0100\n"
|
"POT-Creation-Date: 2021-02-16 14:52+0100\n"
|
||||||
"PO-Revision-Date: YEAR-MO-DA HO:MI+ZONE\n"
|
"PO-Revision-Date: YEAR-MO-DA HO:MI+ZONE\n"
|
||||||
"Last-Translator: FULL NAME <EMAIL@ADDRESS>\n"
|
"Last-Translator: FULL NAME <EMAIL@ADDRESS>\n"
|
||||||
"Language-Team: LANGUAGE <LL@li.org>\n"
|
"Language-Team: LANGUAGE <LL@li.org>\n"
|
||||||
@@ -21,144 +21,144 @@ msgstr ""
|
|||||||
msgid "Documents"
|
msgid "Documents"
|
||||||
msgstr ""
|
msgstr ""
|
||||||
|
|
||||||
#: documents/models.py:33
|
#: documents/models.py:32
|
||||||
msgid "Any word"
|
msgid "Any word"
|
||||||
msgstr ""
|
msgstr ""
|
||||||
|
|
||||||
#: documents/models.py:34
|
#: documents/models.py:33
|
||||||
msgid "All words"
|
msgid "All words"
|
||||||
msgstr ""
|
msgstr ""
|
||||||
|
|
||||||
#: documents/models.py:35
|
#: documents/models.py:34
|
||||||
msgid "Exact match"
|
msgid "Exact match"
|
||||||
msgstr ""
|
msgstr ""
|
||||||
|
|
||||||
#: documents/models.py:36
|
#: documents/models.py:35
|
||||||
msgid "Regular expression"
|
msgid "Regular expression"
|
||||||
msgstr ""
|
msgstr ""
|
||||||
|
|
||||||
#: documents/models.py:37
|
#: documents/models.py:36
|
||||||
msgid "Fuzzy word"
|
msgid "Fuzzy word"
|
||||||
msgstr ""
|
msgstr ""
|
||||||
|
|
||||||
#: documents/models.py:38
|
#: documents/models.py:37
|
||||||
msgid "Automatic"
|
msgid "Automatic"
|
||||||
msgstr ""
|
msgstr ""
|
||||||
|
|
||||||
#: documents/models.py:42 documents/models.py:352 paperless_mail/models.py:25
|
#: documents/models.py:41 documents/models.py:364 paperless_mail/models.py:25
|
||||||
#: paperless_mail/models.py:109
|
#: paperless_mail/models.py:109
|
||||||
msgid "name"
|
msgid "name"
|
||||||
msgstr ""
|
msgstr ""
|
||||||
|
|
||||||
#: documents/models.py:46
|
#: documents/models.py:45
|
||||||
msgid "match"
|
msgid "match"
|
||||||
msgstr ""
|
msgstr ""
|
||||||
|
|
||||||
#: documents/models.py:50
|
#: documents/models.py:49
|
||||||
msgid "matching algorithm"
|
msgid "matching algorithm"
|
||||||
msgstr ""
|
msgstr ""
|
||||||
|
|
||||||
#: documents/models.py:56
|
#: documents/models.py:55
|
||||||
msgid "is insensitive"
|
msgid "is insensitive"
|
||||||
msgstr ""
|
msgstr ""
|
||||||
|
|
||||||
#: documents/models.py:75 documents/models.py:135
|
#: documents/models.py:74 documents/models.py:134
|
||||||
msgid "correspondent"
|
msgid "correspondent"
|
||||||
msgstr ""
|
msgstr ""
|
||||||
|
|
||||||
#: documents/models.py:76
|
#: documents/models.py:75
|
||||||
msgid "correspondents"
|
msgid "correspondents"
|
||||||
msgstr ""
|
msgstr ""
|
||||||
|
|
||||||
#: documents/models.py:98
|
#: documents/models.py:97
|
||||||
msgid "color"
|
msgid "color"
|
||||||
msgstr ""
|
msgstr ""
|
||||||
|
|
||||||
#: documents/models.py:102
|
#: documents/models.py:101
|
||||||
msgid "is inbox tag"
|
msgid "is inbox tag"
|
||||||
msgstr ""
|
msgstr ""
|
||||||
|
|
||||||
#: documents/models.py:104
|
#: documents/models.py:103
|
||||||
msgid ""
|
msgid ""
|
||||||
"Marks this tag as an inbox tag: All newly consumed documents will be tagged "
|
"Marks this tag as an inbox tag: All newly consumed documents will be tagged "
|
||||||
"with inbox tags."
|
"with inbox tags."
|
||||||
msgstr ""
|
msgstr ""
|
||||||
|
|
||||||
#: documents/models.py:109
|
#: documents/models.py:108
|
||||||
msgid "tag"
|
msgid "tag"
|
||||||
msgstr ""
|
msgstr ""
|
||||||
|
|
||||||
#: documents/models.py:110 documents/models.py:166
|
#: documents/models.py:109 documents/models.py:165
|
||||||
msgid "tags"
|
msgid "tags"
|
||||||
msgstr ""
|
msgstr ""
|
||||||
|
|
||||||
#: documents/models.py:116 documents/models.py:148
|
#: documents/models.py:115 documents/models.py:147
|
||||||
msgid "document type"
|
msgid "document type"
|
||||||
msgstr ""
|
msgstr ""
|
||||||
|
|
||||||
#: documents/models.py:117
|
#: documents/models.py:116
|
||||||
msgid "document types"
|
msgid "document types"
|
||||||
msgstr ""
|
msgstr ""
|
||||||
|
|
||||||
#: documents/models.py:125
|
#: documents/models.py:124
|
||||||
msgid "Unencrypted"
|
msgid "Unencrypted"
|
||||||
msgstr ""
|
msgstr ""
|
||||||
|
|
||||||
#: documents/models.py:126
|
#: documents/models.py:125
|
||||||
msgid "Encrypted with GNU Privacy Guard"
|
msgid "Encrypted with GNU Privacy Guard"
|
||||||
msgstr ""
|
msgstr ""
|
||||||
|
|
||||||
#: documents/models.py:139
|
#: documents/models.py:138
|
||||||
msgid "title"
|
msgid "title"
|
||||||
msgstr ""
|
msgstr ""
|
||||||
|
|
||||||
#: documents/models.py:152
|
#: documents/models.py:151
|
||||||
msgid "content"
|
msgid "content"
|
||||||
msgstr ""
|
msgstr ""
|
||||||
|
|
||||||
#: documents/models.py:154
|
#: documents/models.py:153
|
||||||
msgid ""
|
msgid ""
|
||||||
"The raw, text-only data of the document. This field is primarily used for "
|
"The raw, text-only data of the document. This field is primarily used for "
|
||||||
"searching."
|
"searching."
|
||||||
msgstr ""
|
msgstr ""
|
||||||
|
|
||||||
#: documents/models.py:159
|
#: documents/models.py:158
|
||||||
msgid "mime type"
|
msgid "mime type"
|
||||||
msgstr ""
|
msgstr ""
|
||||||
|
|
||||||
#: documents/models.py:170
|
#: documents/models.py:169
|
||||||
msgid "checksum"
|
msgid "checksum"
|
||||||
msgstr ""
|
msgstr ""
|
||||||
|
|
||||||
#: documents/models.py:174
|
#: documents/models.py:173
|
||||||
msgid "The checksum of the original document."
|
msgid "The checksum of the original document."
|
||||||
msgstr ""
|
msgstr ""
|
||||||
|
|
||||||
#: documents/models.py:178
|
#: documents/models.py:177
|
||||||
msgid "archive checksum"
|
msgid "archive checksum"
|
||||||
msgstr ""
|
msgstr ""
|
||||||
|
|
||||||
#: documents/models.py:183
|
#: documents/models.py:182
|
||||||
msgid "The checksum of the archived document."
|
msgid "The checksum of the archived document."
|
||||||
msgstr ""
|
msgstr ""
|
||||||
|
|
||||||
#: documents/models.py:187 documents/models.py:330
|
#: documents/models.py:186 documents/models.py:342
|
||||||
msgid "created"
|
msgid "created"
|
||||||
msgstr ""
|
msgstr ""
|
||||||
|
|
||||||
#: documents/models.py:191
|
#: documents/models.py:190
|
||||||
msgid "modified"
|
msgid "modified"
|
||||||
msgstr ""
|
msgstr ""
|
||||||
|
|
||||||
#: documents/models.py:195
|
#: documents/models.py:194
|
||||||
msgid "storage type"
|
msgid "storage type"
|
||||||
msgstr ""
|
msgstr ""
|
||||||
|
|
||||||
#: documents/models.py:203
|
#: documents/models.py:202
|
||||||
msgid "added"
|
msgid "added"
|
||||||
msgstr ""
|
msgstr ""
|
||||||
|
|
||||||
#: documents/models.py:207
|
#: documents/models.py:206
|
||||||
msgid "filename"
|
msgid "filename"
|
||||||
msgstr ""
|
msgstr ""
|
||||||
|
|
||||||
@@ -167,178 +167,186 @@ msgid "Current filename in storage"
|
|||||||
msgstr ""
|
msgstr ""
|
||||||
|
|
||||||
#: documents/models.py:216
|
#: documents/models.py:216
|
||||||
|
msgid "archive filename"
|
||||||
|
msgstr ""
|
||||||
|
|
||||||
|
#: documents/models.py:222
|
||||||
|
msgid "Current archive filename in storage"
|
||||||
|
msgstr ""
|
||||||
|
|
||||||
|
#: documents/models.py:226
|
||||||
msgid "archive serial number"
|
msgid "archive serial number"
|
||||||
msgstr ""
|
msgstr ""
|
||||||
|
|
||||||
#: documents/models.py:221
|
#: documents/models.py:231
|
||||||
msgid "The position of this document in your physical document archive."
|
msgid "The position of this document in your physical document archive."
|
||||||
msgstr ""
|
msgstr ""
|
||||||
|
|
||||||
#: documents/models.py:227
|
#: documents/models.py:237
|
||||||
msgid "document"
|
msgid "document"
|
||||||
msgstr ""
|
msgstr ""
|
||||||
|
|
||||||
#: documents/models.py:228
|
#: documents/models.py:238
|
||||||
msgid "documents"
|
msgid "documents"
|
||||||
msgstr ""
|
msgstr ""
|
||||||
|
|
||||||
#: documents/models.py:313
|
#: documents/models.py:325
|
||||||
msgid "debug"
|
msgid "debug"
|
||||||
msgstr ""
|
msgstr ""
|
||||||
|
|
||||||
#: documents/models.py:314
|
#: documents/models.py:326
|
||||||
msgid "information"
|
msgid "information"
|
||||||
msgstr ""
|
msgstr ""
|
||||||
|
|
||||||
#: documents/models.py:315
|
#: documents/models.py:327
|
||||||
msgid "warning"
|
msgid "warning"
|
||||||
msgstr ""
|
msgstr ""
|
||||||
|
|
||||||
#: documents/models.py:316
|
#: documents/models.py:328
|
||||||
msgid "error"
|
msgid "error"
|
||||||
msgstr ""
|
msgstr ""
|
||||||
|
|
||||||
#: documents/models.py:317
|
#: documents/models.py:329
|
||||||
msgid "critical"
|
msgid "critical"
|
||||||
msgstr ""
|
msgstr ""
|
||||||
|
|
||||||
#: documents/models.py:321
|
#: documents/models.py:333
|
||||||
msgid "group"
|
msgid "group"
|
||||||
msgstr ""
|
msgstr ""
|
||||||
|
|
||||||
#: documents/models.py:324
|
#: documents/models.py:336
|
||||||
msgid "message"
|
msgid "message"
|
||||||
msgstr ""
|
msgstr ""
|
||||||
|
|
||||||
#: documents/models.py:327
|
#: documents/models.py:339
|
||||||
msgid "level"
|
msgid "level"
|
||||||
msgstr ""
|
msgstr ""
|
||||||
|
|
||||||
#: documents/models.py:334
|
#: documents/models.py:346
|
||||||
msgid "log"
|
msgid "log"
|
||||||
msgstr ""
|
msgstr ""
|
||||||
|
|
||||||
#: documents/models.py:335
|
#: documents/models.py:347
|
||||||
msgid "logs"
|
msgid "logs"
|
||||||
msgstr ""
|
msgstr ""
|
||||||
|
|
||||||
#: documents/models.py:346 documents/models.py:396
|
#: documents/models.py:358 documents/models.py:408
|
||||||
msgid "saved view"
|
msgid "saved view"
|
||||||
msgstr ""
|
msgstr ""
|
||||||
|
|
||||||
#: documents/models.py:347
|
#: documents/models.py:359
|
||||||
msgid "saved views"
|
msgid "saved views"
|
||||||
msgstr ""
|
msgstr ""
|
||||||
|
|
||||||
#: documents/models.py:350
|
#: documents/models.py:362
|
||||||
msgid "user"
|
msgid "user"
|
||||||
msgstr ""
|
msgstr ""
|
||||||
|
|
||||||
#: documents/models.py:356
|
#: documents/models.py:368
|
||||||
msgid "show on dashboard"
|
msgid "show on dashboard"
|
||||||
msgstr ""
|
msgstr ""
|
||||||
|
|
||||||
#: documents/models.py:359
|
#: documents/models.py:371
|
||||||
msgid "show in sidebar"
|
msgid "show in sidebar"
|
||||||
msgstr ""
|
msgstr ""
|
||||||
|
|
||||||
#: documents/models.py:363
|
#: documents/models.py:375
|
||||||
msgid "sort field"
|
msgid "sort field"
|
||||||
msgstr ""
|
msgstr ""
|
||||||
|
|
||||||
#: documents/models.py:366
|
#: documents/models.py:378
|
||||||
msgid "sort reverse"
|
msgid "sort reverse"
|
||||||
msgstr ""
|
msgstr ""
|
||||||
|
|
||||||
#: documents/models.py:372
|
#: documents/models.py:384
|
||||||
msgid "title contains"
|
msgid "title contains"
|
||||||
msgstr ""
|
msgstr ""
|
||||||
|
|
||||||
#: documents/models.py:373
|
#: documents/models.py:385
|
||||||
msgid "content contains"
|
msgid "content contains"
|
||||||
msgstr ""
|
msgstr ""
|
||||||
|
|
||||||
#: documents/models.py:374
|
#: documents/models.py:386
|
||||||
msgid "ASN is"
|
msgid "ASN is"
|
||||||
msgstr ""
|
msgstr ""
|
||||||
|
|
||||||
#: documents/models.py:375
|
#: documents/models.py:387
|
||||||
msgid "correspondent is"
|
msgid "correspondent is"
|
||||||
msgstr ""
|
msgstr ""
|
||||||
|
|
||||||
#: documents/models.py:376
|
#: documents/models.py:388
|
||||||
msgid "document type is"
|
msgid "document type is"
|
||||||
msgstr ""
|
msgstr ""
|
||||||
|
|
||||||
#: documents/models.py:377
|
#: documents/models.py:389
|
||||||
msgid "is in inbox"
|
msgid "is in inbox"
|
||||||
msgstr ""
|
msgstr ""
|
||||||
|
|
||||||
#: documents/models.py:378
|
#: documents/models.py:390
|
||||||
msgid "has tag"
|
msgid "has tag"
|
||||||
msgstr ""
|
msgstr ""
|
||||||
|
|
||||||
#: documents/models.py:379
|
#: documents/models.py:391
|
||||||
msgid "has any tag"
|
msgid "has any tag"
|
||||||
msgstr ""
|
msgstr ""
|
||||||
|
|
||||||
#: documents/models.py:380
|
#: documents/models.py:392
|
||||||
msgid "created before"
|
msgid "created before"
|
||||||
msgstr ""
|
msgstr ""
|
||||||
|
|
||||||
#: documents/models.py:381
|
#: documents/models.py:393
|
||||||
msgid "created after"
|
msgid "created after"
|
||||||
msgstr ""
|
msgstr ""
|
||||||
|
|
||||||
#: documents/models.py:382
|
#: documents/models.py:394
|
||||||
msgid "created year is"
|
msgid "created year is"
|
||||||
msgstr ""
|
msgstr ""
|
||||||
|
|
||||||
#: documents/models.py:383
|
#: documents/models.py:395
|
||||||
msgid "created month is"
|
msgid "created month is"
|
||||||
msgstr ""
|
msgstr ""
|
||||||
|
|
||||||
#: documents/models.py:384
|
#: documents/models.py:396
|
||||||
msgid "created day is"
|
msgid "created day is"
|
||||||
msgstr ""
|
msgstr ""
|
||||||
|
|
||||||
#: documents/models.py:385
|
#: documents/models.py:397
|
||||||
msgid "added before"
|
msgid "added before"
|
||||||
msgstr ""
|
msgstr ""
|
||||||
|
|
||||||
#: documents/models.py:386
|
#: documents/models.py:398
|
||||||
msgid "added after"
|
msgid "added after"
|
||||||
msgstr ""
|
msgstr ""
|
||||||
|
|
||||||
#: documents/models.py:387
|
#: documents/models.py:399
|
||||||
msgid "modified before"
|
msgid "modified before"
|
||||||
msgstr ""
|
msgstr ""
|
||||||
|
|
||||||
#: documents/models.py:388
|
#: documents/models.py:400
|
||||||
msgid "modified after"
|
msgid "modified after"
|
||||||
msgstr ""
|
msgstr ""
|
||||||
|
|
||||||
#: documents/models.py:389
|
#: documents/models.py:401
|
||||||
msgid "does not have tag"
|
msgid "does not have tag"
|
||||||
msgstr ""
|
msgstr ""
|
||||||
|
|
||||||
#: documents/models.py:400
|
#: documents/models.py:412
|
||||||
msgid "rule type"
|
msgid "rule type"
|
||||||
msgstr ""
|
msgstr ""
|
||||||
|
|
||||||
#: documents/models.py:404
|
#: documents/models.py:416
|
||||||
msgid "value"
|
msgid "value"
|
||||||
msgstr ""
|
msgstr ""
|
||||||
|
|
||||||
#: documents/models.py:410
|
#: documents/models.py:422
|
||||||
msgid "filter rule"
|
msgid "filter rule"
|
||||||
msgstr ""
|
msgstr ""
|
||||||
|
|
||||||
#: documents/models.py:411
|
#: documents/models.py:423
|
||||||
msgid "filter rules"
|
msgid "filter rules"
|
||||||
msgstr ""
|
msgstr ""
|
||||||
|
|
||||||
#: documents/serialisers.py:383
|
#: documents/serialisers.py:370
|
||||||
#, python-format
|
#, python-format
|
||||||
msgid "File type %(type)s not supported"
|
msgid "File type %(type)s not supported"
|
||||||
msgstr ""
|
msgstr ""
|
||||||
@@ -383,19 +391,23 @@ msgstr ""
|
|||||||
msgid "Sign in"
|
msgid "Sign in"
|
||||||
msgstr ""
|
msgstr ""
|
||||||
|
|
||||||
#: paperless/settings.py:286
|
#: paperless/settings.py:291
|
||||||
msgid "English"
|
msgid "English (US)"
|
||||||
msgstr ""
|
msgstr ""
|
||||||
|
|
||||||
#: paperless/settings.py:287
|
#: paperless/settings.py:292
|
||||||
|
msgid "English (GB)"
|
||||||
|
msgstr ""
|
||||||
|
|
||||||
|
#: paperless/settings.py:293
|
||||||
msgid "German"
|
msgid "German"
|
||||||
msgstr ""
|
msgstr ""
|
||||||
|
|
||||||
#: paperless/settings.py:288
|
#: paperless/settings.py:294
|
||||||
msgid "Dutch"
|
msgid "Dutch"
|
||||||
msgstr ""
|
msgstr ""
|
||||||
|
|
||||||
#: paperless/settings.py:289
|
#: paperless/settings.py:295
|
||||||
msgid "French"
|
msgid "French"
|
||||||
msgstr ""
|
msgstr ""
|
||||||
|
|
@@ -4,7 +4,7 @@
|
|||||||
# FIRST AUTHOR <EMAIL@ADDRESS>, YEAR.
|
# FIRST AUTHOR <EMAIL@ADDRESS>, YEAR.
|
||||||
#
|
#
|
||||||
# Translators:
|
# Translators:
|
||||||
# Jonas Winkler, 2020
|
# Jonas Winkler, 2021
|
||||||
# Philmo67, 2021
|
# Philmo67, 2021
|
||||||
#
|
#
|
||||||
#, fuzzy
|
#, fuzzy
|
||||||
@@ -12,8 +12,8 @@ msgid ""
|
|||||||
msgstr ""
|
msgstr ""
|
||||||
"Project-Id-Version: PACKAGE VERSION\n"
|
"Project-Id-Version: PACKAGE VERSION\n"
|
||||||
"Report-Msgid-Bugs-To: \n"
|
"Report-Msgid-Bugs-To: \n"
|
||||||
"POT-Creation-Date: 2021-01-28 22:02+0100\n"
|
"POT-Creation-Date: 2021-02-16 14:52+0100\n"
|
||||||
"PO-Revision-Date: 2020-12-30 19:27+0000\n"
|
"PO-Revision-Date: 2021-02-16 18:37+0000\n"
|
||||||
"Last-Translator: Philmo67, 2021\n"
|
"Last-Translator: Philmo67, 2021\n"
|
||||||
"Language-Team: French (https://www.transifex.com/paperless/teams/115905/fr/)\n"
|
"Language-Team: French (https://www.transifex.com/paperless/teams/115905/fr/)\n"
|
||||||
"MIME-Version: 1.0\n"
|
"MIME-Version: 1.0\n"
|
||||||
@@ -26,64 +26,64 @@ msgstr ""
|
|||||||
msgid "Documents"
|
msgid "Documents"
|
||||||
msgstr "Documents"
|
msgstr "Documents"
|
||||||
|
|
||||||
#: documents/models.py:33
|
#: documents/models.py:32
|
||||||
msgid "Any word"
|
msgid "Any word"
|
||||||
msgstr "Un des mots"
|
msgstr "Un des mots"
|
||||||
|
|
||||||
#: documents/models.py:34
|
#: documents/models.py:33
|
||||||
msgid "All words"
|
msgid "All words"
|
||||||
msgstr "Tous les mots"
|
msgstr "Tous les mots"
|
||||||
|
|
||||||
#: documents/models.py:35
|
#: documents/models.py:34
|
||||||
msgid "Exact match"
|
msgid "Exact match"
|
||||||
msgstr "Concordance exacte"
|
msgstr "Concordance exacte"
|
||||||
|
|
||||||
#: documents/models.py:36
|
#: documents/models.py:35
|
||||||
msgid "Regular expression"
|
msgid "Regular expression"
|
||||||
msgstr "Expression régulière"
|
msgstr "Expression régulière"
|
||||||
|
|
||||||
#: documents/models.py:37
|
#: documents/models.py:36
|
||||||
msgid "Fuzzy word"
|
msgid "Fuzzy word"
|
||||||
msgstr "Mot approximatif"
|
msgstr "Mot approximatif"
|
||||||
|
|
||||||
#: documents/models.py:38
|
#: documents/models.py:37
|
||||||
msgid "Automatic"
|
msgid "Automatic"
|
||||||
msgstr "Automatique"
|
msgstr "Automatique"
|
||||||
|
|
||||||
#: documents/models.py:42 documents/models.py:352 paperless_mail/models.py:25
|
#: documents/models.py:41 documents/models.py:364 paperless_mail/models.py:25
|
||||||
#: paperless_mail/models.py:109
|
#: paperless_mail/models.py:109
|
||||||
msgid "name"
|
msgid "name"
|
||||||
msgstr "nom"
|
msgstr "nom"
|
||||||
|
|
||||||
#: documents/models.py:46
|
#: documents/models.py:45
|
||||||
msgid "match"
|
msgid "match"
|
||||||
msgstr "rapprochement"
|
msgstr "rapprochement"
|
||||||
|
|
||||||
#: documents/models.py:50
|
#: documents/models.py:49
|
||||||
msgid "matching algorithm"
|
msgid "matching algorithm"
|
||||||
msgstr "algorithme de rapprochement"
|
msgstr "algorithme de rapprochement"
|
||||||
|
|
||||||
#: documents/models.py:56
|
#: documents/models.py:55
|
||||||
msgid "is insensitive"
|
msgid "is insensitive"
|
||||||
msgstr "est insensible à la casse"
|
msgstr "est insensible à la casse"
|
||||||
|
|
||||||
#: documents/models.py:75 documents/models.py:135
|
#: documents/models.py:74 documents/models.py:134
|
||||||
msgid "correspondent"
|
msgid "correspondent"
|
||||||
msgstr "correspondant"
|
msgstr "correspondant"
|
||||||
|
|
||||||
#: documents/models.py:76
|
#: documents/models.py:75
|
||||||
msgid "correspondents"
|
msgid "correspondents"
|
||||||
msgstr "correspondants"
|
msgstr "correspondants"
|
||||||
|
|
||||||
#: documents/models.py:98
|
#: documents/models.py:97
|
||||||
msgid "color"
|
msgid "color"
|
||||||
msgstr "couleur"
|
msgstr "couleur"
|
||||||
|
|
||||||
#: documents/models.py:102
|
#: documents/models.py:101
|
||||||
msgid "is inbox tag"
|
msgid "is inbox tag"
|
||||||
msgstr "est une étiquette de boîte de réception"
|
msgstr "est une étiquette de boîte de réception"
|
||||||
|
|
||||||
#: documents/models.py:104
|
#: documents/models.py:103
|
||||||
msgid ""
|
msgid ""
|
||||||
"Marks this tag as an inbox tag: All newly consumed documents will be tagged "
|
"Marks this tag as an inbox tag: All newly consumed documents will be tagged "
|
||||||
"with inbox tags."
|
"with inbox tags."
|
||||||
@@ -91,39 +91,39 @@ msgstr ""
|
|||||||
"Marque cette étiquette comme étiquette de boîte de réception : ces "
|
"Marque cette étiquette comme étiquette de boîte de réception : ces "
|
||||||
"étiquettes sont affectées à tous les documents nouvellement traités."
|
"étiquettes sont affectées à tous les documents nouvellement traités."
|
||||||
|
|
||||||
#: documents/models.py:109
|
#: documents/models.py:108
|
||||||
msgid "tag"
|
msgid "tag"
|
||||||
msgstr "étiquette"
|
msgstr "étiquette"
|
||||||
|
|
||||||
#: documents/models.py:110 documents/models.py:166
|
#: documents/models.py:109 documents/models.py:165
|
||||||
msgid "tags"
|
msgid "tags"
|
||||||
msgstr "étiquettes"
|
msgstr "étiquettes"
|
||||||
|
|
||||||
#: documents/models.py:116 documents/models.py:148
|
#: documents/models.py:115 documents/models.py:147
|
||||||
msgid "document type"
|
msgid "document type"
|
||||||
msgstr "type de document"
|
msgstr "type de document"
|
||||||
|
|
||||||
#: documents/models.py:117
|
#: documents/models.py:116
|
||||||
msgid "document types"
|
msgid "document types"
|
||||||
msgstr "types de document"
|
msgstr "types de document"
|
||||||
|
|
||||||
#: documents/models.py:125
|
#: documents/models.py:124
|
||||||
msgid "Unencrypted"
|
msgid "Unencrypted"
|
||||||
msgstr "Non chiffré"
|
msgstr "Non chiffré"
|
||||||
|
|
||||||
#: documents/models.py:126
|
#: documents/models.py:125
|
||||||
msgid "Encrypted with GNU Privacy Guard"
|
msgid "Encrypted with GNU Privacy Guard"
|
||||||
msgstr "Chiffré avec GNU Privacy Guard"
|
msgstr "Chiffré avec GNU Privacy Guard"
|
||||||
|
|
||||||
#: documents/models.py:139
|
#: documents/models.py:138
|
||||||
msgid "title"
|
msgid "title"
|
||||||
msgstr "titre"
|
msgstr "titre"
|
||||||
|
|
||||||
#: documents/models.py:152
|
#: documents/models.py:151
|
||||||
msgid "content"
|
msgid "content"
|
||||||
msgstr "contenu"
|
msgstr "contenu"
|
||||||
|
|
||||||
#: documents/models.py:154
|
#: documents/models.py:153
|
||||||
msgid ""
|
msgid ""
|
||||||
"The raw, text-only data of the document. This field is primarily used for "
|
"The raw, text-only data of the document. This field is primarily used for "
|
||||||
"searching."
|
"searching."
|
||||||
@@ -131,43 +131,43 @@ msgstr ""
|
|||||||
"Les données brutes du document, en format texte uniquement. Ce champ est "
|
"Les données brutes du document, en format texte uniquement. Ce champ est "
|
||||||
"principalement utilisé pour la recherche."
|
"principalement utilisé pour la recherche."
|
||||||
|
|
||||||
#: documents/models.py:159
|
#: documents/models.py:158
|
||||||
msgid "mime type"
|
msgid "mime type"
|
||||||
msgstr "type mime"
|
msgstr "type mime"
|
||||||
|
|
||||||
#: documents/models.py:170
|
#: documents/models.py:169
|
||||||
msgid "checksum"
|
msgid "checksum"
|
||||||
msgstr "somme de contrôle"
|
msgstr "somme de contrôle"
|
||||||
|
|
||||||
#: documents/models.py:174
|
#: documents/models.py:173
|
||||||
msgid "The checksum of the original document."
|
msgid "The checksum of the original document."
|
||||||
msgstr "La somme de contrôle du document original."
|
msgstr "La somme de contrôle du document original."
|
||||||
|
|
||||||
#: documents/models.py:178
|
#: documents/models.py:177
|
||||||
msgid "archive checksum"
|
msgid "archive checksum"
|
||||||
msgstr "somme de contrôle de l'archive"
|
msgstr "somme de contrôle de l'archive"
|
||||||
|
|
||||||
#: documents/models.py:183
|
#: documents/models.py:182
|
||||||
msgid "The checksum of the archived document."
|
msgid "The checksum of the archived document."
|
||||||
msgstr "La somme de contrôle du document archivé."
|
msgstr "La somme de contrôle du document archivé."
|
||||||
|
|
||||||
#: documents/models.py:187 documents/models.py:330
|
#: documents/models.py:186 documents/models.py:342
|
||||||
msgid "created"
|
msgid "created"
|
||||||
msgstr "créé le"
|
msgstr "créé le"
|
||||||
|
|
||||||
#: documents/models.py:191
|
#: documents/models.py:190
|
||||||
msgid "modified"
|
msgid "modified"
|
||||||
msgstr "modifié"
|
msgstr "modifié"
|
||||||
|
|
||||||
#: documents/models.py:195
|
#: documents/models.py:194
|
||||||
msgid "storage type"
|
msgid "storage type"
|
||||||
msgstr "forme d'enregistrement :"
|
msgstr "forme d'enregistrement :"
|
||||||
|
|
||||||
#: documents/models.py:203
|
#: documents/models.py:202
|
||||||
msgid "added"
|
msgid "added"
|
||||||
msgstr "date d'ajout"
|
msgstr "date d'ajout"
|
||||||
|
|
||||||
#: documents/models.py:207
|
#: documents/models.py:206
|
||||||
msgid "filename"
|
msgid "filename"
|
||||||
msgstr "nom du fichier"
|
msgstr "nom du fichier"
|
||||||
|
|
||||||
@@ -176,179 +176,187 @@ msgid "Current filename in storage"
|
|||||||
msgstr "Nom du fichier courant en base de données"
|
msgstr "Nom du fichier courant en base de données"
|
||||||
|
|
||||||
#: documents/models.py:216
|
#: documents/models.py:216
|
||||||
|
msgid "archive filename"
|
||||||
|
msgstr "nom de fichier de l'archive"
|
||||||
|
|
||||||
|
#: documents/models.py:222
|
||||||
|
msgid "Current archive filename in storage"
|
||||||
|
msgstr "Nom du fichier d'archive courant en base de données"
|
||||||
|
|
||||||
|
#: documents/models.py:226
|
||||||
msgid "archive serial number"
|
msgid "archive serial number"
|
||||||
msgstr "numéro de série de l'archive"
|
msgstr "numéro de série de l'archive"
|
||||||
|
|
||||||
#: documents/models.py:221
|
#: documents/models.py:231
|
||||||
msgid "The position of this document in your physical document archive."
|
msgid "The position of this document in your physical document archive."
|
||||||
msgstr ""
|
msgstr ""
|
||||||
"Le classement de ce document dans votre archive de documents physiques."
|
"Le classement de ce document dans votre archive de documents physiques."
|
||||||
|
|
||||||
#: documents/models.py:227
|
#: documents/models.py:237
|
||||||
msgid "document"
|
msgid "document"
|
||||||
msgstr "document"
|
msgstr "document"
|
||||||
|
|
||||||
#: documents/models.py:228
|
#: documents/models.py:238
|
||||||
msgid "documents"
|
msgid "documents"
|
||||||
msgstr "documents"
|
msgstr "documents"
|
||||||
|
|
||||||
#: documents/models.py:313
|
#: documents/models.py:325
|
||||||
msgid "debug"
|
msgid "debug"
|
||||||
msgstr "débogage"
|
msgstr "débogage"
|
||||||
|
|
||||||
#: documents/models.py:314
|
#: documents/models.py:326
|
||||||
msgid "information"
|
msgid "information"
|
||||||
msgstr "information"
|
msgstr "information"
|
||||||
|
|
||||||
#: documents/models.py:315
|
#: documents/models.py:327
|
||||||
msgid "warning"
|
msgid "warning"
|
||||||
msgstr "avertissement"
|
msgstr "avertissement"
|
||||||
|
|
||||||
#: documents/models.py:316
|
#: documents/models.py:328
|
||||||
msgid "error"
|
msgid "error"
|
||||||
msgstr "erreur"
|
msgstr "erreur"
|
||||||
|
|
||||||
#: documents/models.py:317
|
#: documents/models.py:329
|
||||||
msgid "critical"
|
msgid "critical"
|
||||||
msgstr "critique"
|
msgstr "critique"
|
||||||
|
|
||||||
#: documents/models.py:321
|
#: documents/models.py:333
|
||||||
msgid "group"
|
msgid "group"
|
||||||
msgstr "groupe"
|
msgstr "groupe"
|
||||||
|
|
||||||
#: documents/models.py:324
|
#: documents/models.py:336
|
||||||
msgid "message"
|
msgid "message"
|
||||||
msgstr "message"
|
msgstr "message"
|
||||||
|
|
||||||
#: documents/models.py:327
|
#: documents/models.py:339
|
||||||
msgid "level"
|
msgid "level"
|
||||||
msgstr "niveau"
|
msgstr "niveau"
|
||||||
|
|
||||||
#: documents/models.py:334
|
#: documents/models.py:346
|
||||||
msgid "log"
|
msgid "log"
|
||||||
msgstr "rapport"
|
msgstr "rapport"
|
||||||
|
|
||||||
#: documents/models.py:335
|
#: documents/models.py:347
|
||||||
msgid "logs"
|
msgid "logs"
|
||||||
msgstr "rapports"
|
msgstr "rapports"
|
||||||
|
|
||||||
#: documents/models.py:346 documents/models.py:396
|
#: documents/models.py:358 documents/models.py:408
|
||||||
msgid "saved view"
|
msgid "saved view"
|
||||||
msgstr "vue enregistrée"
|
msgstr "vue enregistrée"
|
||||||
|
|
||||||
#: documents/models.py:347
|
#: documents/models.py:359
|
||||||
msgid "saved views"
|
msgid "saved views"
|
||||||
msgstr "vues enregistrées"
|
msgstr "vues enregistrées"
|
||||||
|
|
||||||
#: documents/models.py:350
|
#: documents/models.py:362
|
||||||
msgid "user"
|
msgid "user"
|
||||||
msgstr "utilisateur"
|
msgstr "utilisateur"
|
||||||
|
|
||||||
#: documents/models.py:356
|
#: documents/models.py:368
|
||||||
msgid "show on dashboard"
|
msgid "show on dashboard"
|
||||||
msgstr "montrer sur le tableau de bord"
|
msgstr "montrer sur le tableau de bord"
|
||||||
|
|
||||||
#: documents/models.py:359
|
#: documents/models.py:371
|
||||||
msgid "show in sidebar"
|
msgid "show in sidebar"
|
||||||
msgstr "montrer dans la barre latérale"
|
msgstr "montrer dans la barre latérale"
|
||||||
|
|
||||||
#: documents/models.py:363
|
#: documents/models.py:375
|
||||||
msgid "sort field"
|
msgid "sort field"
|
||||||
msgstr "champ de tri"
|
msgstr "champ de tri"
|
||||||
|
|
||||||
#: documents/models.py:366
|
#: documents/models.py:378
|
||||||
msgid "sort reverse"
|
msgid "sort reverse"
|
||||||
msgstr "tri inverse"
|
msgstr "tri inverse"
|
||||||
|
|
||||||
#: documents/models.py:372
|
#: documents/models.py:384
|
||||||
msgid "title contains"
|
msgid "title contains"
|
||||||
msgstr "le titre contient"
|
msgstr "le titre contient"
|
||||||
|
|
||||||
#: documents/models.py:373
|
#: documents/models.py:385
|
||||||
msgid "content contains"
|
msgid "content contains"
|
||||||
msgstr "le contenu contient"
|
msgstr "le contenu contient"
|
||||||
|
|
||||||
#: documents/models.py:374
|
#: documents/models.py:386
|
||||||
msgid "ASN is"
|
msgid "ASN is"
|
||||||
msgstr "le NSA est"
|
msgstr "le NSA est"
|
||||||
|
|
||||||
#: documents/models.py:375
|
#: documents/models.py:387
|
||||||
msgid "correspondent is"
|
msgid "correspondent is"
|
||||||
msgstr "le correspondant est"
|
msgstr "le correspondant est"
|
||||||
|
|
||||||
#: documents/models.py:376
|
#: documents/models.py:388
|
||||||
msgid "document type is"
|
msgid "document type is"
|
||||||
msgstr "le type de document est"
|
msgstr "le type de document est"
|
||||||
|
|
||||||
#: documents/models.py:377
|
#: documents/models.py:389
|
||||||
msgid "is in inbox"
|
msgid "is in inbox"
|
||||||
msgstr "est dans la boîte de réception"
|
msgstr "est dans la boîte de réception"
|
||||||
|
|
||||||
#: documents/models.py:378
|
#: documents/models.py:390
|
||||||
msgid "has tag"
|
msgid "has tag"
|
||||||
msgstr "porte l'étiquette"
|
msgstr "porte l'étiquette"
|
||||||
|
|
||||||
#: documents/models.py:379
|
#: documents/models.py:391
|
||||||
msgid "has any tag"
|
msgid "has any tag"
|
||||||
msgstr "porte l'une des étiquettes"
|
msgstr "porte l'une des étiquettes"
|
||||||
|
|
||||||
#: documents/models.py:380
|
#: documents/models.py:392
|
||||||
msgid "created before"
|
msgid "created before"
|
||||||
msgstr "créé avant"
|
msgstr "créé avant"
|
||||||
|
|
||||||
#: documents/models.py:381
|
#: documents/models.py:393
|
||||||
msgid "created after"
|
msgid "created after"
|
||||||
msgstr "créé après"
|
msgstr "créé après"
|
||||||
|
|
||||||
#: documents/models.py:382
|
#: documents/models.py:394
|
||||||
msgid "created year is"
|
msgid "created year is"
|
||||||
msgstr "l'année de création est"
|
msgstr "l'année de création est"
|
||||||
|
|
||||||
#: documents/models.py:383
|
#: documents/models.py:395
|
||||||
msgid "created month is"
|
msgid "created month is"
|
||||||
msgstr "le mois de création est"
|
msgstr "le mois de création est"
|
||||||
|
|
||||||
#: documents/models.py:384
|
#: documents/models.py:396
|
||||||
msgid "created day is"
|
msgid "created day is"
|
||||||
msgstr "le jour de création est"
|
msgstr "le jour de création est"
|
||||||
|
|
||||||
#: documents/models.py:385
|
#: documents/models.py:397
|
||||||
msgid "added before"
|
msgid "added before"
|
||||||
msgstr "ajouté avant"
|
msgstr "ajouté avant"
|
||||||
|
|
||||||
#: documents/models.py:386
|
#: documents/models.py:398
|
||||||
msgid "added after"
|
msgid "added after"
|
||||||
msgstr "ajouté après"
|
msgstr "ajouté après"
|
||||||
|
|
||||||
#: documents/models.py:387
|
#: documents/models.py:399
|
||||||
msgid "modified before"
|
msgid "modified before"
|
||||||
msgstr "modifié avant"
|
msgstr "modifié avant"
|
||||||
|
|
||||||
#: documents/models.py:388
|
#: documents/models.py:400
|
||||||
msgid "modified after"
|
msgid "modified after"
|
||||||
msgstr "modifié après"
|
msgstr "modifié après"
|
||||||
|
|
||||||
#: documents/models.py:389
|
#: documents/models.py:401
|
||||||
msgid "does not have tag"
|
msgid "does not have tag"
|
||||||
msgstr "ne porte pas d'étiquette"
|
msgstr "ne porte pas d'étiquette"
|
||||||
|
|
||||||
#: documents/models.py:400
|
#: documents/models.py:412
|
||||||
msgid "rule type"
|
msgid "rule type"
|
||||||
msgstr "type de règle"
|
msgstr "type de règle"
|
||||||
|
|
||||||
#: documents/models.py:404
|
#: documents/models.py:416
|
||||||
msgid "value"
|
msgid "value"
|
||||||
msgstr "valeur"
|
msgstr "valeur"
|
||||||
|
|
||||||
#: documents/models.py:410
|
#: documents/models.py:422
|
||||||
msgid "filter rule"
|
msgid "filter rule"
|
||||||
msgstr "règle de filtrage"
|
msgstr "règle de filtrage"
|
||||||
|
|
||||||
#: documents/models.py:411
|
#: documents/models.py:423
|
||||||
msgid "filter rules"
|
msgid "filter rules"
|
||||||
msgstr "règles de filtrage"
|
msgstr "règles de filtrage"
|
||||||
|
|
||||||
#: documents/serialisers.py:383
|
#: documents/serialisers.py:370
|
||||||
#, python-format
|
#, python-format
|
||||||
msgid "File type %(type)s not supported"
|
msgid "File type %(type)s not supported"
|
||||||
msgstr "Type de fichier %(type)s non pris en charge"
|
msgstr "Type de fichier %(type)s non pris en charge"
|
||||||
@@ -395,19 +403,23 @@ msgstr "Mot de passe"
|
|||||||
msgid "Sign in"
|
msgid "Sign in"
|
||||||
msgstr "S'identifier"
|
msgstr "S'identifier"
|
||||||
|
|
||||||
#: paperless/settings.py:286
|
#: paperless/settings.py:291
|
||||||
msgid "English"
|
msgid "English (US)"
|
||||||
msgstr "Anglais"
|
msgstr "Anglais (US)"
|
||||||
|
|
||||||
#: paperless/settings.py:287
|
#: paperless/settings.py:292
|
||||||
|
msgid "English (GB)"
|
||||||
|
msgstr "Anglais (GB)"
|
||||||
|
|
||||||
|
#: paperless/settings.py:293
|
||||||
msgid "German"
|
msgid "German"
|
||||||
msgstr "Allemand"
|
msgstr "Allemand"
|
||||||
|
|
||||||
#: paperless/settings.py:288
|
#: paperless/settings.py:294
|
||||||
msgid "Dutch"
|
msgid "Dutch"
|
||||||
msgstr "Néerlandais"
|
msgstr "Néerlandais"
|
||||||
|
|
||||||
#: paperless/settings.py:289
|
#: paperless/settings.py:295
|
||||||
msgid "French"
|
msgid "French"
|
||||||
msgstr "Français"
|
msgstr "Français"
|
||||||
|
|
||||||
|
@@ -4,17 +4,17 @@
|
|||||||
# FIRST AUTHOR <EMAIL@ADDRESS>, YEAR.
|
# FIRST AUTHOR <EMAIL@ADDRESS>, YEAR.
|
||||||
#
|
#
|
||||||
# Translators:
|
# Translators:
|
||||||
|
# Jonas Winkler, 2021
|
||||||
# Jo Vandeginste <jo.vandeginste@gmail.com>, 2021
|
# Jo Vandeginste <jo.vandeginste@gmail.com>, 2021
|
||||||
# Ben <bzweekhorst@gmail.com>, 2021
|
|
||||||
#
|
#
|
||||||
#, fuzzy
|
#, fuzzy
|
||||||
msgid ""
|
msgid ""
|
||||||
msgstr ""
|
msgstr ""
|
||||||
"Project-Id-Version: PACKAGE VERSION\n"
|
"Project-Id-Version: PACKAGE VERSION\n"
|
||||||
"Report-Msgid-Bugs-To: \n"
|
"Report-Msgid-Bugs-To: \n"
|
||||||
"POT-Creation-Date: 2021-01-28 22:02+0100\n"
|
"POT-Creation-Date: 2021-02-16 14:52+0100\n"
|
||||||
"PO-Revision-Date: 2020-12-30 19:27+0000\n"
|
"PO-Revision-Date: 2021-02-16 18:37+0000\n"
|
||||||
"Last-Translator: Ben <bzweekhorst@gmail.com>, 2021\n"
|
"Last-Translator: Jo Vandeginste <jo.vandeginste@gmail.com>, 2021\n"
|
||||||
"Language-Team: Dutch (Netherlands) (https://www.transifex.com/paperless/teams/115905/nl_NL/)\n"
|
"Language-Team: Dutch (Netherlands) (https://www.transifex.com/paperless/teams/115905/nl_NL/)\n"
|
||||||
"MIME-Version: 1.0\n"
|
"MIME-Version: 1.0\n"
|
||||||
"Content-Type: text/plain; charset=UTF-8\n"
|
"Content-Type: text/plain; charset=UTF-8\n"
|
||||||
@@ -26,64 +26,64 @@ msgstr ""
|
|||||||
msgid "Documents"
|
msgid "Documents"
|
||||||
msgstr "Documenten"
|
msgstr "Documenten"
|
||||||
|
|
||||||
#: documents/models.py:33
|
#: documents/models.py:32
|
||||||
msgid "Any word"
|
msgid "Any word"
|
||||||
msgstr "Eender welk woord"
|
msgstr "Eender welk woord"
|
||||||
|
|
||||||
#: documents/models.py:34
|
#: documents/models.py:33
|
||||||
msgid "All words"
|
msgid "All words"
|
||||||
msgstr "Alle woorden"
|
msgstr "Alle woorden"
|
||||||
|
|
||||||
#: documents/models.py:35
|
#: documents/models.py:34
|
||||||
msgid "Exact match"
|
msgid "Exact match"
|
||||||
msgstr "Exacte overeenkomst"
|
msgstr "Exacte overeenkomst"
|
||||||
|
|
||||||
#: documents/models.py:36
|
#: documents/models.py:35
|
||||||
msgid "Regular expression"
|
msgid "Regular expression"
|
||||||
msgstr "Reguliere expressie"
|
msgstr "Reguliere expressie"
|
||||||
|
|
||||||
#: documents/models.py:37
|
#: documents/models.py:36
|
||||||
msgid "Fuzzy word"
|
msgid "Fuzzy word"
|
||||||
msgstr "Gelijkaardig woord"
|
msgstr "Gelijkaardig woord"
|
||||||
|
|
||||||
#: documents/models.py:38
|
#: documents/models.py:37
|
||||||
msgid "Automatic"
|
msgid "Automatic"
|
||||||
msgstr "Automatisch"
|
msgstr "Automatisch"
|
||||||
|
|
||||||
#: documents/models.py:42 documents/models.py:352 paperless_mail/models.py:25
|
#: documents/models.py:41 documents/models.py:364 paperless_mail/models.py:25
|
||||||
#: paperless_mail/models.py:109
|
#: paperless_mail/models.py:109
|
||||||
msgid "name"
|
msgid "name"
|
||||||
msgstr "naam"
|
msgstr "naam"
|
||||||
|
|
||||||
#: documents/models.py:46
|
#: documents/models.py:45
|
||||||
msgid "match"
|
msgid "match"
|
||||||
msgstr "Overeenkomst"
|
msgstr "Overeenkomst"
|
||||||
|
|
||||||
#: documents/models.py:50
|
#: documents/models.py:49
|
||||||
msgid "matching algorithm"
|
msgid "matching algorithm"
|
||||||
msgstr "Algoritme voor het bepalen van de overeenkomst"
|
msgstr "Algoritme voor het bepalen van de overeenkomst"
|
||||||
|
|
||||||
#: documents/models.py:56
|
#: documents/models.py:55
|
||||||
msgid "is insensitive"
|
msgid "is insensitive"
|
||||||
msgstr "is niet hoofdlettergevoelig"
|
msgstr "is niet hoofdlettergevoelig"
|
||||||
|
|
||||||
#: documents/models.py:75 documents/models.py:135
|
#: documents/models.py:74 documents/models.py:134
|
||||||
msgid "correspondent"
|
msgid "correspondent"
|
||||||
msgstr "correspondent"
|
msgstr "correspondent"
|
||||||
|
|
||||||
#: documents/models.py:76
|
#: documents/models.py:75
|
||||||
msgid "correspondents"
|
msgid "correspondents"
|
||||||
msgstr "correspondenten"
|
msgstr "correspondenten"
|
||||||
|
|
||||||
#: documents/models.py:98
|
#: documents/models.py:97
|
||||||
msgid "color"
|
msgid "color"
|
||||||
msgstr "Kleur"
|
msgstr "Kleur"
|
||||||
|
|
||||||
#: documents/models.py:102
|
#: documents/models.py:101
|
||||||
msgid "is inbox tag"
|
msgid "is inbox tag"
|
||||||
msgstr "is \"Postvak in\"-etiket"
|
msgstr "is \"Postvak in\"-etiket"
|
||||||
|
|
||||||
#: documents/models.py:104
|
#: documents/models.py:103
|
||||||
msgid ""
|
msgid ""
|
||||||
"Marks this tag as an inbox tag: All newly consumed documents will be tagged "
|
"Marks this tag as an inbox tag: All newly consumed documents will be tagged "
|
||||||
"with inbox tags."
|
"with inbox tags."
|
||||||
@@ -91,39 +91,39 @@ msgstr ""
|
|||||||
"Markeer dit etiket als een \"Postvak in\"-etiket: alle nieuw verwerkte "
|
"Markeer dit etiket als een \"Postvak in\"-etiket: alle nieuw verwerkte "
|
||||||
"documenten krijgen de \"Postvak in\"-etiketten."
|
"documenten krijgen de \"Postvak in\"-etiketten."
|
||||||
|
|
||||||
#: documents/models.py:109
|
#: documents/models.py:108
|
||||||
msgid "tag"
|
msgid "tag"
|
||||||
msgstr "etiket"
|
msgstr "etiket"
|
||||||
|
|
||||||
#: documents/models.py:110 documents/models.py:166
|
#: documents/models.py:109 documents/models.py:165
|
||||||
msgid "tags"
|
msgid "tags"
|
||||||
msgstr "etiketten"
|
msgstr "etiketten"
|
||||||
|
|
||||||
#: documents/models.py:116 documents/models.py:148
|
#: documents/models.py:115 documents/models.py:147
|
||||||
msgid "document type"
|
msgid "document type"
|
||||||
msgstr "documenttype"
|
msgstr "documenttype"
|
||||||
|
|
||||||
#: documents/models.py:117
|
#: documents/models.py:116
|
||||||
msgid "document types"
|
msgid "document types"
|
||||||
msgstr "documenttypen"
|
msgstr "documenttypen"
|
||||||
|
|
||||||
#: documents/models.py:125
|
#: documents/models.py:124
|
||||||
msgid "Unencrypted"
|
msgid "Unencrypted"
|
||||||
msgstr "Niet versleuteld"
|
msgstr "Niet versleuteld"
|
||||||
|
|
||||||
#: documents/models.py:126
|
#: documents/models.py:125
|
||||||
msgid "Encrypted with GNU Privacy Guard"
|
msgid "Encrypted with GNU Privacy Guard"
|
||||||
msgstr "Versleuteld met GNU Privacy Guard"
|
msgstr "Versleuteld met GNU Privacy Guard"
|
||||||
|
|
||||||
#: documents/models.py:139
|
#: documents/models.py:138
|
||||||
msgid "title"
|
msgid "title"
|
||||||
msgstr "titel"
|
msgstr "titel"
|
||||||
|
|
||||||
#: documents/models.py:152
|
#: documents/models.py:151
|
||||||
msgid "content"
|
msgid "content"
|
||||||
msgstr "inhoud"
|
msgstr "inhoud"
|
||||||
|
|
||||||
#: documents/models.py:154
|
#: documents/models.py:153
|
||||||
msgid ""
|
msgid ""
|
||||||
"The raw, text-only data of the document. This field is primarily used for "
|
"The raw, text-only data of the document. This field is primarily used for "
|
||||||
"searching."
|
"searching."
|
||||||
@@ -131,43 +131,43 @@ msgstr ""
|
|||||||
"De onbewerkte gegevens van het document. Dit veld wordt voornamelijk "
|
"De onbewerkte gegevens van het document. Dit veld wordt voornamelijk "
|
||||||
"gebruikt om te zoeken."
|
"gebruikt om te zoeken."
|
||||||
|
|
||||||
#: documents/models.py:159
|
#: documents/models.py:158
|
||||||
msgid "mime type"
|
msgid "mime type"
|
||||||
msgstr "mimetype"
|
msgstr "mimetype"
|
||||||
|
|
||||||
#: documents/models.py:170
|
#: documents/models.py:169
|
||||||
msgid "checksum"
|
msgid "checksum"
|
||||||
msgstr "checksum"
|
msgstr "checksum"
|
||||||
|
|
||||||
#: documents/models.py:174
|
#: documents/models.py:173
|
||||||
msgid "The checksum of the original document."
|
msgid "The checksum of the original document."
|
||||||
msgstr "Het controlecijfer van het originele document."
|
msgstr "Het controlecijfer van het originele document."
|
||||||
|
|
||||||
#: documents/models.py:178
|
#: documents/models.py:177
|
||||||
msgid "archive checksum"
|
msgid "archive checksum"
|
||||||
msgstr "archief checksum"
|
msgstr "archief checksum"
|
||||||
|
|
||||||
#: documents/models.py:183
|
#: documents/models.py:182
|
||||||
msgid "The checksum of the archived document."
|
msgid "The checksum of the archived document."
|
||||||
msgstr "De checksum van het gearchiveerde document."
|
msgstr "De checksum van het gearchiveerde document."
|
||||||
|
|
||||||
#: documents/models.py:187 documents/models.py:330
|
#: documents/models.py:186 documents/models.py:342
|
||||||
msgid "created"
|
msgid "created"
|
||||||
msgstr "aangemaakt"
|
msgstr "aangemaakt"
|
||||||
|
|
||||||
#: documents/models.py:191
|
#: documents/models.py:190
|
||||||
msgid "modified"
|
msgid "modified"
|
||||||
msgstr "gewijzigd"
|
msgstr "gewijzigd"
|
||||||
|
|
||||||
#: documents/models.py:195
|
#: documents/models.py:194
|
||||||
msgid "storage type"
|
msgid "storage type"
|
||||||
msgstr "type opslag"
|
msgstr "type opslag"
|
||||||
|
|
||||||
#: documents/models.py:203
|
#: documents/models.py:202
|
||||||
msgid "added"
|
msgid "added"
|
||||||
msgstr "toegevoegd"
|
msgstr "toegevoegd"
|
||||||
|
|
||||||
#: documents/models.py:207
|
#: documents/models.py:206
|
||||||
msgid "filename"
|
msgid "filename"
|
||||||
msgstr "bestandsnaam"
|
msgstr "bestandsnaam"
|
||||||
|
|
||||||
@@ -176,178 +176,186 @@ msgid "Current filename in storage"
|
|||||||
msgstr "Huidige bestandsnaam in opslag"
|
msgstr "Huidige bestandsnaam in opslag"
|
||||||
|
|
||||||
#: documents/models.py:216
|
#: documents/models.py:216
|
||||||
|
msgid "archive filename"
|
||||||
|
msgstr "Bestandsnaam in archief"
|
||||||
|
|
||||||
|
#: documents/models.py:222
|
||||||
|
msgid "Current archive filename in storage"
|
||||||
|
msgstr "Huidige bestandsnaam in archief"
|
||||||
|
|
||||||
|
#: documents/models.py:226
|
||||||
msgid "archive serial number"
|
msgid "archive serial number"
|
||||||
msgstr "serienummer in archief"
|
msgstr "serienummer in archief"
|
||||||
|
|
||||||
#: documents/models.py:221
|
#: documents/models.py:231
|
||||||
msgid "The position of this document in your physical document archive."
|
msgid "The position of this document in your physical document archive."
|
||||||
msgstr "De positie van dit document in je fysieke documentenarchief."
|
msgstr "De positie van dit document in je fysieke documentenarchief."
|
||||||
|
|
||||||
#: documents/models.py:227
|
#: documents/models.py:237
|
||||||
msgid "document"
|
msgid "document"
|
||||||
msgstr "document"
|
msgstr "document"
|
||||||
|
|
||||||
#: documents/models.py:228
|
#: documents/models.py:238
|
||||||
msgid "documents"
|
msgid "documents"
|
||||||
msgstr "documenten"
|
msgstr "documenten"
|
||||||
|
|
||||||
#: documents/models.py:313
|
#: documents/models.py:325
|
||||||
msgid "debug"
|
msgid "debug"
|
||||||
msgstr "debug"
|
msgstr "debug"
|
||||||
|
|
||||||
#: documents/models.py:314
|
#: documents/models.py:326
|
||||||
msgid "information"
|
msgid "information"
|
||||||
msgstr "informatie"
|
msgstr "informatie"
|
||||||
|
|
||||||
#: documents/models.py:315
|
#: documents/models.py:327
|
||||||
msgid "warning"
|
msgid "warning"
|
||||||
msgstr "waarschuwing"
|
msgstr "waarschuwing"
|
||||||
|
|
||||||
#: documents/models.py:316
|
#: documents/models.py:328
|
||||||
msgid "error"
|
msgid "error"
|
||||||
msgstr "fout"
|
msgstr "fout"
|
||||||
|
|
||||||
#: documents/models.py:317
|
#: documents/models.py:329
|
||||||
msgid "critical"
|
msgid "critical"
|
||||||
msgstr "kritisch"
|
msgstr "kritisch"
|
||||||
|
|
||||||
#: documents/models.py:321
|
#: documents/models.py:333
|
||||||
msgid "group"
|
msgid "group"
|
||||||
msgstr "groep"
|
msgstr "groep"
|
||||||
|
|
||||||
#: documents/models.py:324
|
#: documents/models.py:336
|
||||||
msgid "message"
|
msgid "message"
|
||||||
msgstr "bericht"
|
msgstr "bericht"
|
||||||
|
|
||||||
#: documents/models.py:327
|
#: documents/models.py:339
|
||||||
msgid "level"
|
msgid "level"
|
||||||
msgstr "niveau"
|
msgstr "niveau"
|
||||||
|
|
||||||
#: documents/models.py:334
|
#: documents/models.py:346
|
||||||
msgid "log"
|
msgid "log"
|
||||||
msgstr "bericht"
|
msgstr "bericht"
|
||||||
|
|
||||||
#: documents/models.py:335
|
#: documents/models.py:347
|
||||||
msgid "logs"
|
msgid "logs"
|
||||||
msgstr "berichten"
|
msgstr "berichten"
|
||||||
|
|
||||||
#: documents/models.py:346 documents/models.py:396
|
#: documents/models.py:358 documents/models.py:408
|
||||||
msgid "saved view"
|
msgid "saved view"
|
||||||
msgstr "opgeslagen view"
|
msgstr "opgeslagen view"
|
||||||
|
|
||||||
#: documents/models.py:347
|
#: documents/models.py:359
|
||||||
msgid "saved views"
|
msgid "saved views"
|
||||||
msgstr "opgeslagen views"
|
msgstr "opgeslagen views"
|
||||||
|
|
||||||
#: documents/models.py:350
|
#: documents/models.py:362
|
||||||
msgid "user"
|
msgid "user"
|
||||||
msgstr "gebruiker"
|
msgstr "gebruiker"
|
||||||
|
|
||||||
#: documents/models.py:356
|
#: documents/models.py:368
|
||||||
msgid "show on dashboard"
|
msgid "show on dashboard"
|
||||||
msgstr "weergeven op dashboard"
|
msgstr "weergeven op dashboard"
|
||||||
|
|
||||||
#: documents/models.py:359
|
#: documents/models.py:371
|
||||||
msgid "show in sidebar"
|
msgid "show in sidebar"
|
||||||
msgstr "weergeven in zijbalk"
|
msgstr "weergeven in zijbalk"
|
||||||
|
|
||||||
#: documents/models.py:363
|
#: documents/models.py:375
|
||||||
msgid "sort field"
|
msgid "sort field"
|
||||||
msgstr "sorteerveld"
|
msgstr "sorteerveld"
|
||||||
|
|
||||||
#: documents/models.py:366
|
#: documents/models.py:378
|
||||||
msgid "sort reverse"
|
msgid "sort reverse"
|
||||||
msgstr "omgekeerd sorteren"
|
msgstr "omgekeerd sorteren"
|
||||||
|
|
||||||
#: documents/models.py:372
|
#: documents/models.py:384
|
||||||
msgid "title contains"
|
msgid "title contains"
|
||||||
msgstr "titel bevat"
|
msgstr "titel bevat"
|
||||||
|
|
||||||
#: documents/models.py:373
|
#: documents/models.py:385
|
||||||
msgid "content contains"
|
msgid "content contains"
|
||||||
msgstr "inhoud bevat"
|
msgstr "inhoud bevat"
|
||||||
|
|
||||||
#: documents/models.py:374
|
#: documents/models.py:386
|
||||||
msgid "ASN is"
|
msgid "ASN is"
|
||||||
msgstr "ASN is"
|
msgstr "ASN is"
|
||||||
|
|
||||||
#: documents/models.py:375
|
#: documents/models.py:387
|
||||||
msgid "correspondent is"
|
msgid "correspondent is"
|
||||||
msgstr "correspondent is"
|
msgstr "correspondent is"
|
||||||
|
|
||||||
#: documents/models.py:376
|
#: documents/models.py:388
|
||||||
msgid "document type is"
|
msgid "document type is"
|
||||||
msgstr "documenttype is"
|
msgstr "documenttype is"
|
||||||
|
|
||||||
#: documents/models.py:377
|
#: documents/models.py:389
|
||||||
msgid "is in inbox"
|
msgid "is in inbox"
|
||||||
msgstr "zit in \"Postvak in\""
|
msgstr "zit in \"Postvak in\""
|
||||||
|
|
||||||
#: documents/models.py:378
|
#: documents/models.py:390
|
||||||
msgid "has tag"
|
msgid "has tag"
|
||||||
msgstr "heeft etiket"
|
msgstr "heeft etiket"
|
||||||
|
|
||||||
#: documents/models.py:379
|
#: documents/models.py:391
|
||||||
msgid "has any tag"
|
msgid "has any tag"
|
||||||
msgstr "heeft één van de etiketten"
|
msgstr "heeft één van de etiketten"
|
||||||
|
|
||||||
#: documents/models.py:380
|
#: documents/models.py:392
|
||||||
msgid "created before"
|
msgid "created before"
|
||||||
msgstr "aangemaakt voor"
|
msgstr "aangemaakt voor"
|
||||||
|
|
||||||
#: documents/models.py:381
|
#: documents/models.py:393
|
||||||
msgid "created after"
|
msgid "created after"
|
||||||
msgstr "aangemaakt na"
|
msgstr "aangemaakt na"
|
||||||
|
|
||||||
#: documents/models.py:382
|
#: documents/models.py:394
|
||||||
msgid "created year is"
|
msgid "created year is"
|
||||||
msgstr "aangemaakt jaar is"
|
msgstr "aangemaakt jaar is"
|
||||||
|
|
||||||
#: documents/models.py:383
|
#: documents/models.py:395
|
||||||
msgid "created month is"
|
msgid "created month is"
|
||||||
msgstr "aangemaakte maand is"
|
msgstr "aangemaakte maand is"
|
||||||
|
|
||||||
#: documents/models.py:384
|
#: documents/models.py:396
|
||||||
msgid "created day is"
|
msgid "created day is"
|
||||||
msgstr "aangemaakte dag is"
|
msgstr "aangemaakte dag is"
|
||||||
|
|
||||||
#: documents/models.py:385
|
#: documents/models.py:397
|
||||||
msgid "added before"
|
msgid "added before"
|
||||||
msgstr "toegevoegd voor"
|
msgstr "toegevoegd voor"
|
||||||
|
|
||||||
#: documents/models.py:386
|
#: documents/models.py:398
|
||||||
msgid "added after"
|
msgid "added after"
|
||||||
msgstr "toegevoegd na"
|
msgstr "toegevoegd na"
|
||||||
|
|
||||||
#: documents/models.py:387
|
#: documents/models.py:399
|
||||||
msgid "modified before"
|
msgid "modified before"
|
||||||
msgstr "gewijzigd voor"
|
msgstr "gewijzigd voor"
|
||||||
|
|
||||||
#: documents/models.py:388
|
#: documents/models.py:400
|
||||||
msgid "modified after"
|
msgid "modified after"
|
||||||
msgstr "gewijzigd na"
|
msgstr "gewijzigd na"
|
||||||
|
|
||||||
#: documents/models.py:389
|
#: documents/models.py:401
|
||||||
msgid "does not have tag"
|
msgid "does not have tag"
|
||||||
msgstr "heeft geen etiket"
|
msgstr "heeft geen etiket"
|
||||||
|
|
||||||
#: documents/models.py:400
|
#: documents/models.py:412
|
||||||
msgid "rule type"
|
msgid "rule type"
|
||||||
msgstr "type regel"
|
msgstr "type regel"
|
||||||
|
|
||||||
#: documents/models.py:404
|
#: documents/models.py:416
|
||||||
msgid "value"
|
msgid "value"
|
||||||
msgstr "waarde"
|
msgstr "waarde"
|
||||||
|
|
||||||
#: documents/models.py:410
|
#: documents/models.py:422
|
||||||
msgid "filter rule"
|
msgid "filter rule"
|
||||||
msgstr "filterregel"
|
msgstr "filterregel"
|
||||||
|
|
||||||
#: documents/models.py:411
|
#: documents/models.py:423
|
||||||
msgid "filter rules"
|
msgid "filter rules"
|
||||||
msgstr "filterregels"
|
msgstr "filterregels"
|
||||||
|
|
||||||
#: documents/serialisers.py:383
|
#: documents/serialisers.py:370
|
||||||
#, python-format
|
#, python-format
|
||||||
msgid "File type %(type)s not supported"
|
msgid "File type %(type)s not supported"
|
||||||
msgstr "Bestandstype %(type)s niet ondersteund"
|
msgstr "Bestandstype %(type)s niet ondersteund"
|
||||||
@@ -392,19 +400,23 @@ msgstr "Wachtwoord"
|
|||||||
msgid "Sign in"
|
msgid "Sign in"
|
||||||
msgstr "Aanmelden"
|
msgstr "Aanmelden"
|
||||||
|
|
||||||
#: paperless/settings.py:286
|
#: paperless/settings.py:291
|
||||||
msgid "English"
|
msgid "English (US)"
|
||||||
msgstr "Engels"
|
msgstr "Engels (US)"
|
||||||
|
|
||||||
#: paperless/settings.py:287
|
#: paperless/settings.py:292
|
||||||
|
msgid "English (GB)"
|
||||||
|
msgstr "Engels (Brits)"
|
||||||
|
|
||||||
|
#: paperless/settings.py:293
|
||||||
msgid "German"
|
msgid "German"
|
||||||
msgstr "Duits"
|
msgstr "Duits"
|
||||||
|
|
||||||
#: paperless/settings.py:288
|
#: paperless/settings.py:294
|
||||||
msgid "Dutch"
|
msgid "Dutch"
|
||||||
msgstr "Nederlands"
|
msgstr "Nederlands"
|
||||||
|
|
||||||
#: paperless/settings.py:289
|
#: paperless/settings.py:295
|
||||||
msgid "French"
|
msgid "French"
|
||||||
msgstr "Frans"
|
msgstr "Frans"
|
||||||
|
|
||||||
|
@@ -288,7 +288,8 @@ if os.getenv("PAPERLESS_DBHOST"):
|
|||||||
LANGUAGE_CODE = 'en-us'
|
LANGUAGE_CODE = 'en-us'
|
||||||
|
|
||||||
LANGUAGES = [
|
LANGUAGES = [
|
||||||
("en-us", _("English")),
|
("en-us", _("English (US)")),
|
||||||
|
("en-gb", _("English (GB)")),
|
||||||
("de", _("German")),
|
("de", _("German")),
|
||||||
("nl-nl", _("Dutch")),
|
("nl-nl", _("Dutch")),
|
||||||
("fr", _("French"))
|
("fr", _("French"))
|
||||||
@@ -424,6 +425,12 @@ THREADS_PER_WORKER = os.getenv("PAPERLESS_THREADS_PER_WORKER", default_threads_p
|
|||||||
|
|
||||||
CONSUMER_POLLING = int(os.getenv("PAPERLESS_CONSUMER_POLLING", 0))
|
CONSUMER_POLLING = int(os.getenv("PAPERLESS_CONSUMER_POLLING", 0))
|
||||||
|
|
||||||
|
CONSUMER_POLLING_DELAY = int(os.getenv("PAPERLESS_CONSUMER_POLLING_DELAY", 5))
|
||||||
|
|
||||||
|
CONSUMER_POLLING_RETRY_COUNT = int(
|
||||||
|
os.getenv("PAPERLESS_CONSUMER_POLLING_RETRY_COUNT", 5)
|
||||||
|
)
|
||||||
|
|
||||||
CONSUMER_DELETE_DUPLICATES = __get_boolean("PAPERLESS_CONSUMER_DELETE_DUPLICATES")
|
CONSUMER_DELETE_DUPLICATES = __get_boolean("PAPERLESS_CONSUMER_DELETE_DUPLICATES")
|
||||||
|
|
||||||
CONSUMER_RECURSIVE = __get_boolean("PAPERLESS_CONSUMER_RECURSIVE")
|
CONSUMER_RECURSIVE = __get_boolean("PAPERLESS_CONSUMER_RECURSIVE")
|
||||||
@@ -448,6 +455,14 @@ OCR_MODE = os.getenv("PAPERLESS_OCR_MODE", "skip")
|
|||||||
|
|
||||||
OCR_IMAGE_DPI = os.getenv("PAPERLESS_OCR_IMAGE_DPI")
|
OCR_IMAGE_DPI = os.getenv("PAPERLESS_OCR_IMAGE_DPI")
|
||||||
|
|
||||||
|
OCR_CLEAN = os.getenv("PAPERLESS_OCR_CLEAN", "clean")
|
||||||
|
|
||||||
|
OCR_DESKEW = __get_boolean("PAPERLESS_OCR_DESKEW", "true")
|
||||||
|
|
||||||
|
OCR_ROTATE_PAGES = __get_boolean("PAPERLESS_OCR_ROTATE_PAGES", "true")
|
||||||
|
|
||||||
|
OCR_ROTATE_PAGES_THRESHOLD = float(os.getenv("PAPERLESS_OCR_ROTATE_PAGES_THRESHOLD", 12.0))
|
||||||
|
|
||||||
OCR_USER_ARGS = os.getenv("PAPERLESS_OCR_USER_ARGS", "{}")
|
OCR_USER_ARGS = os.getenv("PAPERLESS_OCR_USER_ARGS", "{}")
|
||||||
|
|
||||||
# GNUPG needs a home directory for some reason
|
# GNUPG needs a home directory for some reason
|
||||||
|
@@ -23,7 +23,8 @@ from documents.views import (
|
|||||||
PostDocumentView,
|
PostDocumentView,
|
||||||
SavedViewViewSet,
|
SavedViewViewSet,
|
||||||
BulkEditView,
|
BulkEditView,
|
||||||
SelectionDataView
|
SelectionDataView,
|
||||||
|
BulkDownloadView
|
||||||
)
|
)
|
||||||
from paperless.views import FaviconView
|
from paperless.views import FaviconView
|
||||||
|
|
||||||
@@ -63,6 +64,9 @@ urlpatterns = [
|
|||||||
re_path(r"^documents/selection_data/", SelectionDataView.as_view(),
|
re_path(r"^documents/selection_data/", SelectionDataView.as_view(),
|
||||||
name="selection_data"),
|
name="selection_data"),
|
||||||
|
|
||||||
|
re_path(r"^documents/bulk_download/", BulkDownloadView.as_view(),
|
||||||
|
name="bulk_download"),
|
||||||
|
|
||||||
path('token/', views.obtain_auth_token)
|
path('token/', views.obtain_auth_token)
|
||||||
|
|
||||||
] + api_router.urls)),
|
] + api_router.urls)),
|
||||||
|
@@ -1 +1 @@
|
|||||||
__version__ = (1, 1, 2)
|
__version__ = (1, 2, 0)
|
||||||
|
@@ -2,17 +2,17 @@ import json
|
|||||||
import os
|
import os
|
||||||
import re
|
import re
|
||||||
|
|
||||||
import ocrmypdf
|
|
||||||
import pdftotext
|
|
||||||
import pikepdf
|
|
||||||
from PIL import Image
|
from PIL import Image
|
||||||
from django.conf import settings
|
from django.conf import settings
|
||||||
from ocrmypdf import InputFileError, EncryptedPdfError
|
|
||||||
|
|
||||||
from documents.parsers import DocumentParser, ParseError, \
|
from documents.parsers import DocumentParser, ParseError, \
|
||||||
make_thumbnail_from_pdf
|
make_thumbnail_from_pdf
|
||||||
|
|
||||||
|
|
||||||
|
class NoTextFoundException(Exception):
|
||||||
|
pass
|
||||||
|
|
||||||
|
|
||||||
class RasterisedDocumentParser(DocumentParser):
|
class RasterisedDocumentParser(DocumentParser):
|
||||||
"""
|
"""
|
||||||
This parser uses Tesseract to try and get some text out of a rasterised
|
This parser uses Tesseract to try and get some text out of a rasterised
|
||||||
@@ -22,10 +22,13 @@ class RasterisedDocumentParser(DocumentParser):
|
|||||||
logging_name = "paperless.parsing.tesseract"
|
logging_name = "paperless.parsing.tesseract"
|
||||||
|
|
||||||
def extract_metadata(self, document_path, mime_type):
|
def extract_metadata(self, document_path, mime_type):
|
||||||
namespace_pattern = re.compile(r"\{(.*)\}(.*)")
|
|
||||||
|
|
||||||
result = []
|
result = []
|
||||||
if mime_type == 'application/pdf':
|
if mime_type == 'application/pdf':
|
||||||
|
import pikepdf
|
||||||
|
|
||||||
|
namespace_pattern = re.compile(r"\{(.*)\}(.*)")
|
||||||
|
|
||||||
pdf = pikepdf.open(document_path)
|
pdf = pikepdf.open(document_path)
|
||||||
meta = pdf.open_metadata()
|
meta = pdf.open_metadata()
|
||||||
for key, value in meta.items():
|
for key, value in meta.items():
|
||||||
@@ -50,7 +53,9 @@ class RasterisedDocumentParser(DocumentParser):
|
|||||||
|
|
||||||
def get_thumbnail(self, document_path, mime_type, file_name=None):
|
def get_thumbnail(self, document_path, mime_type, file_name=None):
|
||||||
return make_thumbnail_from_pdf(
|
return make_thumbnail_from_pdf(
|
||||||
document_path, self.tempdir, self.logging_group)
|
self.archive_path or document_path,
|
||||||
|
self.tempdir,
|
||||||
|
self.logging_group)
|
||||||
|
|
||||||
def is_image(self, mime_type):
|
def is_image(self, mime_type):
|
||||||
return mime_type in [
|
return mime_type in [
|
||||||
@@ -90,122 +95,202 @@ class RasterisedDocumentParser(DocumentParser):
|
|||||||
f"Error while calculating DPI for image {image}: {e}")
|
f"Error while calculating DPI for image {image}: {e}")
|
||||||
return None
|
return None
|
||||||
|
|
||||||
|
def extract_text(self, sidecar_file, pdf_file):
|
||||||
|
if sidecar_file and os.path.isfile(sidecar_file):
|
||||||
|
with open(sidecar_file, "r") as f:
|
||||||
|
text = f.read()
|
||||||
|
|
||||||
|
if "[OCR skipped on page" not in text:
|
||||||
|
# This happens when there's already text in the input file.
|
||||||
|
# The sidecar file will only contain text for OCR'ed pages.
|
||||||
|
self.log("debug", "Using text from sidecar file")
|
||||||
|
return text
|
||||||
|
else:
|
||||||
|
self.log("debug", "Incomplete sidecar file: discarding.")
|
||||||
|
|
||||||
|
# no success with the sidecar file, try PDF
|
||||||
|
|
||||||
|
if not os.path.isfile(pdf_file):
|
||||||
|
return None
|
||||||
|
|
||||||
|
from pdfminer.high_level import extract_text
|
||||||
|
from pdfminer.pdftypes import PDFException
|
||||||
|
|
||||||
|
try:
|
||||||
|
text = extract_text(pdf_file)
|
||||||
|
stripped = strip_excess_whitespace(text)
|
||||||
|
self.log("debug", f"Extracted text from PDF file {pdf_file}")
|
||||||
|
return stripped
|
||||||
|
except PDFException:
|
||||||
|
# probably not a PDF file.
|
||||||
|
return None
|
||||||
|
|
||||||
|
def construct_ocrmypdf_parameters(self,
|
||||||
|
input_file,
|
||||||
|
mime_type,
|
||||||
|
output_file,
|
||||||
|
sidecar_file,
|
||||||
|
safe_fallback=False):
|
||||||
|
ocrmypdf_args = {
|
||||||
|
'input_file': input_file,
|
||||||
|
'output_file': output_file,
|
||||||
|
# need to use threads, since this will be run in daemonized
|
||||||
|
# processes by django-q.
|
||||||
|
'use_threads': True,
|
||||||
|
'jobs': settings.THREADS_PER_WORKER,
|
||||||
|
'language': settings.OCR_LANGUAGE,
|
||||||
|
'output_type': settings.OCR_OUTPUT_TYPE,
|
||||||
|
'progress_bar': False
|
||||||
|
}
|
||||||
|
|
||||||
|
if settings.OCR_MODE == 'force' or safe_fallback:
|
||||||
|
ocrmypdf_args['force_ocr'] = True
|
||||||
|
elif settings.OCR_MODE in ['skip', 'skip_noarchive']:
|
||||||
|
ocrmypdf_args['skip_text'] = True
|
||||||
|
elif settings.OCR_MODE == 'redo':
|
||||||
|
ocrmypdf_args['redo_ocr'] = True
|
||||||
|
else:
|
||||||
|
raise ParseError(
|
||||||
|
f"Invalid ocr mode: {settings.OCR_MODE}")
|
||||||
|
|
||||||
|
if settings.OCR_CLEAN == 'clean':
|
||||||
|
ocrmypdf_args['clean'] = True
|
||||||
|
elif settings.OCR_CLEAN == 'clean-final':
|
||||||
|
if settings.OCR_MODE == 'redo':
|
||||||
|
ocrmypdf_args['clean'] = True
|
||||||
|
else:
|
||||||
|
ocrmypdf_args['clean_final'] = True
|
||||||
|
|
||||||
|
if settings.OCR_DESKEW and not settings.OCR_MODE == 'redo':
|
||||||
|
ocrmypdf_args['deskew'] = True
|
||||||
|
|
||||||
|
if settings.OCR_ROTATE_PAGES:
|
||||||
|
ocrmypdf_args['rotate_pages'] = True
|
||||||
|
ocrmypdf_args['rotate_pages_threshold'] = settings.OCR_ROTATE_PAGES_THRESHOLD # NOQA: E501
|
||||||
|
|
||||||
|
if settings.OCR_PAGES > 0:
|
||||||
|
ocrmypdf_args['pages'] = f"1-{settings.OCR_PAGES}"
|
||||||
|
else:
|
||||||
|
# sidecar is incompatible with pages
|
||||||
|
ocrmypdf_args['sidecar'] = sidecar_file
|
||||||
|
|
||||||
|
if self.is_image(mime_type):
|
||||||
|
dpi = self.get_dpi(input_file)
|
||||||
|
a4_dpi = self.calculate_a4_dpi(input_file)
|
||||||
|
if dpi:
|
||||||
|
self.log(
|
||||||
|
"debug",
|
||||||
|
f"Detected DPI for image {input_file}: {dpi}"
|
||||||
|
)
|
||||||
|
ocrmypdf_args['image_dpi'] = dpi
|
||||||
|
elif settings.OCR_IMAGE_DPI:
|
||||||
|
ocrmypdf_args['image_dpi'] = settings.OCR_IMAGE_DPI
|
||||||
|
elif a4_dpi:
|
||||||
|
ocrmypdf_args['image_dpi'] = a4_dpi
|
||||||
|
else:
|
||||||
|
raise ParseError(
|
||||||
|
f"Cannot produce archive PDF for image {input_file}, "
|
||||||
|
f"no DPI information is present in this image and "
|
||||||
|
f"OCR_IMAGE_DPI is not set.")
|
||||||
|
|
||||||
|
if settings.OCR_USER_ARGS and not safe_fallback:
|
||||||
|
try:
|
||||||
|
user_args = json.loads(settings.OCR_USER_ARGS)
|
||||||
|
ocrmypdf_args = {**ocrmypdf_args, **user_args}
|
||||||
|
except Exception as e:
|
||||||
|
self.log(
|
||||||
|
"warning",
|
||||||
|
f"There is an issue with PAPERLESS_OCR_USER_ARGS, so "
|
||||||
|
f"they will not be used. Error: {e}")
|
||||||
|
|
||||||
|
return ocrmypdf_args
|
||||||
|
|
||||||
def parse(self, document_path, mime_type, file_name=None):
|
def parse(self, document_path, mime_type, file_name=None):
|
||||||
mode = settings.OCR_MODE
|
# This forces tesseract to use one core per page.
|
||||||
|
os.environ['OMP_THREAD_LIMIT'] = "1"
|
||||||
|
|
||||||
text_original = get_text_from_pdf(document_path)
|
text_original = self.extract_text(None, document_path)
|
||||||
has_text = text_original and len(text_original) > 50
|
original_has_text = text_original and len(text_original) > 50
|
||||||
|
|
||||||
if mode == "skip_noarchive" and has_text:
|
if settings.OCR_MODE == "skip_noarchive" and original_has_text:
|
||||||
self.log("debug",
|
self.log("debug",
|
||||||
"Document has text, skipping OCRmyPDF entirely.")
|
"Document has text, skipping OCRmyPDF entirely.")
|
||||||
self.text = text_original
|
self.text = text_original
|
||||||
return
|
return
|
||||||
|
|
||||||
if mode in ['skip', 'skip_noarchive'] and not has_text:
|
import ocrmypdf
|
||||||
# upgrade to redo, since there appears to be no text in the
|
from ocrmypdf import InputFileError, EncryptedPdfError
|
||||||
# document. This happens to some weird encrypted documents or
|
|
||||||
# documents with failed OCR attempts for which OCRmyPDF will
|
|
||||||
# still report that there actually is text in them.
|
|
||||||
self.log("debug",
|
|
||||||
"No text was found in the document and skip is "
|
|
||||||
"specified. Upgrading OCR mode to redo.")
|
|
||||||
mode = "redo"
|
|
||||||
|
|
||||||
archive_path = os.path.join(self.tempdir, "archive.pdf")
|
archive_path = os.path.join(self.tempdir, "archive.pdf")
|
||||||
|
sidecar_file = os.path.join(self.tempdir, "sidecar.txt")
|
||||||
|
|
||||||
ocr_args = {
|
args = self.construct_ocrmypdf_parameters(
|
||||||
'input_file': document_path,
|
document_path, mime_type, archive_path, sidecar_file)
|
||||||
'output_file': archive_path,
|
|
||||||
'use_threads': True,
|
|
||||||
'jobs': settings.THREADS_PER_WORKER,
|
|
||||||
'language': settings.OCR_LANGUAGE,
|
|
||||||
'output_type': settings.OCR_OUTPUT_TYPE,
|
|
||||||
'progress_bar': False,
|
|
||||||
'clean': True
|
|
||||||
}
|
|
||||||
|
|
||||||
if settings.OCR_PAGES > 0:
|
|
||||||
ocr_args['pages'] = f"1-{settings.OCR_PAGES}"
|
|
||||||
|
|
||||||
# Mode selection.
|
|
||||||
|
|
||||||
if mode in ['skip', 'skip_noarchive']:
|
|
||||||
ocr_args['skip_text'] = True
|
|
||||||
elif mode == 'redo':
|
|
||||||
ocr_args['redo_ocr'] = True
|
|
||||||
elif mode == 'force':
|
|
||||||
ocr_args['force_ocr'] = True
|
|
||||||
else:
|
|
||||||
raise ParseError(
|
|
||||||
f"Invalid ocr mode: {mode}")
|
|
||||||
|
|
||||||
if self.is_image(mime_type):
|
|
||||||
dpi = self.get_dpi(document_path)
|
|
||||||
a4_dpi = self.calculate_a4_dpi(document_path)
|
|
||||||
if dpi:
|
|
||||||
self.log(
|
|
||||||
"debug",
|
|
||||||
f"Detected DPI for image {document_path}: {dpi}"
|
|
||||||
)
|
|
||||||
ocr_args['image_dpi'] = dpi
|
|
||||||
elif settings.OCR_IMAGE_DPI:
|
|
||||||
ocr_args['image_dpi'] = settings.OCR_IMAGE_DPI
|
|
||||||
elif a4_dpi:
|
|
||||||
ocr_args['image_dpi'] = a4_dpi
|
|
||||||
else:
|
|
||||||
raise ParseError(
|
|
||||||
f"Cannot produce archive PDF for image {document_path}, "
|
|
||||||
f"no DPI information is present in this image and "
|
|
||||||
f"OCR_IMAGE_DPI is not set.")
|
|
||||||
|
|
||||||
if settings.OCR_USER_ARGS:
|
|
||||||
try:
|
|
||||||
user_args = json.loads(settings.OCR_USER_ARGS)
|
|
||||||
ocr_args = {**ocr_args, **user_args}
|
|
||||||
except Exception as e:
|
|
||||||
self.log(
|
|
||||||
"warning",
|
|
||||||
f"There is an issue with PAPERLESS_OCR_USER_ARGS, so "
|
|
||||||
f"they will not be used: {e}")
|
|
||||||
|
|
||||||
# This forces tesseract to use one core per page.
|
|
||||||
os.environ['OMP_THREAD_LIMIT'] = "1"
|
|
||||||
|
|
||||||
try:
|
try:
|
||||||
self.log("debug",
|
self.log("debug", f"Calling OCRmyPDF with args: {args}")
|
||||||
f"Calling OCRmyPDF with {str(ocr_args)}")
|
ocrmypdf.ocr(**args)
|
||||||
ocrmypdf.ocr(**ocr_args)
|
|
||||||
# success! announce results
|
|
||||||
self.archive_path = archive_path
|
self.archive_path = archive_path
|
||||||
self.text = get_text_from_pdf(archive_path)
|
self.text = self.extract_text(sidecar_file, archive_path)
|
||||||
|
|
||||||
except (InputFileError, EncryptedPdfError) as e:
|
|
||||||
|
|
||||||
self.log("debug",
|
|
||||||
f"Encountered an error: {e}. Trying to use text from "
|
|
||||||
f"original.")
|
|
||||||
# This happens with some PDFs when used with the redo_ocr option.
|
|
||||||
# This is not the end of the world, we'll just use what we already
|
|
||||||
# have in the document.
|
|
||||||
self.text = text_original
|
|
||||||
# Also, no archived file.
|
|
||||||
if not self.text:
|
if not self.text:
|
||||||
# However, if we don't have anything, fail:
|
raise NoTextFoundException(
|
||||||
|
"No text was found in the original document")
|
||||||
|
except EncryptedPdfError:
|
||||||
|
self.log("warning",
|
||||||
|
"This file is encrypted, OCR is impossible. Using "
|
||||||
|
"any text present in the original file.")
|
||||||
|
if original_has_text:
|
||||||
|
self.text = text_original
|
||||||
|
except (NoTextFoundException, InputFileError) as e:
|
||||||
|
self.log("exception",
|
||||||
|
f"Encountered the following error while running OCR, "
|
||||||
|
f"attempting force OCR to get the text.")
|
||||||
|
|
||||||
|
archive_path_fallback = os.path.join(
|
||||||
|
self.tempdir, "archive-fallback.pdf")
|
||||||
|
sidecar_file_fallback = os.path.join(
|
||||||
|
self.tempdir, "sidecar-fallback.txt")
|
||||||
|
|
||||||
|
# Attempt to run OCR with safe settings.
|
||||||
|
|
||||||
|
args = self.construct_ocrmypdf_parameters(
|
||||||
|
document_path, mime_type,
|
||||||
|
archive_path_fallback, sidecar_file_fallback,
|
||||||
|
safe_fallback=True
|
||||||
|
)
|
||||||
|
|
||||||
|
try:
|
||||||
|
self.log("debug",
|
||||||
|
f"Fallback: Calling OCRmyPDF with args: {args}")
|
||||||
|
ocrmypdf.ocr(**args)
|
||||||
|
|
||||||
|
# Don't return the archived file here, since this file
|
||||||
|
# is bigger and blurry due to --force-ocr.
|
||||||
|
|
||||||
|
self.text = self.extract_text(
|
||||||
|
sidecar_file_fallback, archive_path_fallback)
|
||||||
|
|
||||||
|
except Exception as e:
|
||||||
|
# If this fails, we have a serious issue at hand.
|
||||||
raise ParseError(f"{e.__class__.__name__}: {str(e)}")
|
raise ParseError(f"{e.__class__.__name__}: {str(e)}")
|
||||||
|
|
||||||
except Exception as e:
|
except Exception as e:
|
||||||
# Anything else is probably serious.
|
# Anything else is probably serious.
|
||||||
raise ParseError(f"{e.__class__.__name__}: {str(e)}")
|
raise ParseError(f"{e.__class__.__name__}: {str(e)}")
|
||||||
|
|
||||||
|
# As a last resort, if we still don't have any text for any reason,
|
||||||
|
# try to extract the text from the original document.
|
||||||
if not self.text:
|
if not self.text:
|
||||||
# This may happen for files that don't have any text.
|
if original_has_text:
|
||||||
self.log(
|
self.text = text_original
|
||||||
'warning',
|
else:
|
||||||
f"Document {document_path} does not have any text. "
|
self.log(
|
||||||
f"This is probably an error or you tried to add an image "
|
"warning",
|
||||||
f"without text, or something is wrong with this document.")
|
f"No text was found in {document_path}, the content will "
|
||||||
self.text = ""
|
f"be empty."
|
||||||
|
)
|
||||||
|
|
||||||
|
|
||||||
def strip_excess_whitespace(text):
|
def strip_excess_whitespace(text):
|
||||||
@@ -220,20 +305,3 @@ def strip_excess_whitespace(text):
|
|||||||
|
|
||||||
# TODO: this needs a rework
|
# TODO: this needs a rework
|
||||||
return no_trailing_whitespace.strip()
|
return no_trailing_whitespace.strip()
|
||||||
|
|
||||||
|
|
||||||
def get_text_from_pdf(pdf_file):
|
|
||||||
|
|
||||||
if not os.path.isfile(pdf_file):
|
|
||||||
return None
|
|
||||||
|
|
||||||
with open(pdf_file, "rb") as f:
|
|
||||||
try:
|
|
||||||
pdf = pdftotext.PDF(f)
|
|
||||||
except pdftotext.Error:
|
|
||||||
# might not be a PDF file
|
|
||||||
return None
|
|
||||||
|
|
||||||
text = "\n".join(pdf)
|
|
||||||
|
|
||||||
return strip_excess_whitespace(text)
|
|
||||||
|
BIN
src/paperless_tesseract/tests/samples/encrypted.pdf
Normal file
BIN
src/paperless_tesseract/tests/samples/encrypted.pdf
Normal file
Binary file not shown.
BIN
src/paperless_tesseract/tests/samples/multi-page-mixed.pdf
Normal file
BIN
src/paperless_tesseract/tests/samples/multi-page-mixed.pdf
Normal file
Binary file not shown.
BIN
src/paperless_tesseract/tests/samples/rotated.pdf
Normal file
BIN
src/paperless_tesseract/tests/samples/rotated.pdf
Normal file
Binary file not shown.
@@ -7,7 +7,7 @@ from django.test import TestCase, override_settings
|
|||||||
|
|
||||||
from documents.parsers import ParseError, run_convert
|
from documents.parsers import ParseError, run_convert
|
||||||
from documents.tests.utils import DirectoriesMixin
|
from documents.tests.utils import DirectoriesMixin
|
||||||
from paperless_tesseract.parsers import RasterisedDocumentParser, get_text_from_pdf, strip_excess_whitespace
|
from paperless_tesseract.parsers import RasterisedDocumentParser, strip_excess_whitespace
|
||||||
|
|
||||||
image_to_string_calls = []
|
image_to_string_calls = []
|
||||||
|
|
||||||
@@ -38,7 +38,12 @@ class TestParser(DirectoriesMixin, TestCase):
|
|||||||
|
|
||||||
def assertContainsStrings(self, content, strings):
|
def assertContainsStrings(self, content, strings):
|
||||||
# Asserts that all strings appear in content, in the given order.
|
# Asserts that all strings appear in content, in the given order.
|
||||||
indices = [content.index(s) for s in strings]
|
indices = []
|
||||||
|
for s in strings:
|
||||||
|
if s in content:
|
||||||
|
indices.append(content.index(s))
|
||||||
|
else:
|
||||||
|
self.fail(f"'{s}' is not in '{content}'")
|
||||||
self.assertListEqual(indices, sorted(indices))
|
self.assertListEqual(indices, sorted(indices))
|
||||||
|
|
||||||
text_cases = [
|
text_cases = [
|
||||||
@@ -69,7 +74,8 @@ class TestParser(DirectoriesMixin, TestCase):
|
|||||||
SAMPLE_FILES = os.path.join(os.path.dirname(__file__), "samples")
|
SAMPLE_FILES = os.path.join(os.path.dirname(__file__), "samples")
|
||||||
|
|
||||||
def test_get_text_from_pdf(self):
|
def test_get_text_from_pdf(self):
|
||||||
text = get_text_from_pdf(os.path.join(self.SAMPLE_FILES, 'simple-digital.pdf'))
|
parser = RasterisedDocumentParser(uuid.uuid4())
|
||||||
|
text = parser.extract_text(None, os.path.join(self.SAMPLE_FILES, 'simple-digital.pdf'))
|
||||||
|
|
||||||
self.assertContainsStrings(text.strip(), ["This is a test document."])
|
self.assertContainsStrings(text.strip(), ["This is a test document."])
|
||||||
|
|
||||||
@@ -129,15 +135,21 @@ class TestParser(DirectoriesMixin, TestCase):
|
|||||||
self.assertIsNone(parser.archive_path)
|
self.assertIsNone(parser.archive_path)
|
||||||
self.assertContainsStrings(parser.get_text(), ["Please enter your name in here:", "This is a PDF document with a form."])
|
self.assertContainsStrings(parser.get_text(), ["Please enter your name in here:", "This is a PDF document with a form."])
|
||||||
|
|
||||||
@override_settings(OCR_MODE="redo")
|
@override_settings(OCR_MODE="skip")
|
||||||
@mock.patch("paperless_tesseract.parsers.get_text_from_pdf", lambda _: None)
|
def test_encrypted(self):
|
||||||
def test_with_form_error_notext(self):
|
|
||||||
parser = RasterisedDocumentParser(None)
|
parser = RasterisedDocumentParser(None)
|
||||||
|
|
||||||
def f():
|
parser.parse(os.path.join(self.SAMPLE_FILES, "encrypted.pdf"), "application/pdf")
|
||||||
parser.parse(os.path.join(self.SAMPLE_FILES, "with-form.pdf"), "application/pdf")
|
|
||||||
|
|
||||||
self.assertRaises(ParseError, f)
|
self.assertIsNone(parser.archive_path)
|
||||||
|
self.assertContainsStrings(parser.get_text(), ["This is a digitally signed PDF, created with Acrobat Pro for the Paperless project to enable", "automated testing of signed/encrypted PDFs"])
|
||||||
|
|
||||||
|
@override_settings(OCR_MODE="redo")
|
||||||
|
def test_with_form_error_notext(self):
|
||||||
|
parser = RasterisedDocumentParser(None)
|
||||||
|
parser.parse(os.path.join(self.SAMPLE_FILES, "with-form.pdf"), "application/pdf")
|
||||||
|
|
||||||
|
self.assertContainsStrings(parser.get_text(), ["Please enter your name in here:", "This is a PDF document with a form."])
|
||||||
|
|
||||||
@override_settings(OCR_MODE="force")
|
@override_settings(OCR_MODE="force")
|
||||||
def test_with_form_force(self):
|
def test_with_form_force(self):
|
||||||
@@ -164,17 +176,12 @@ class TestParser(DirectoriesMixin, TestCase):
|
|||||||
|
|
||||||
self.assertRaises(ParseError, f)
|
self.assertRaises(ParseError, f)
|
||||||
|
|
||||||
@mock.patch("paperless_tesseract.parsers.ocrmypdf.ocr")
|
def test_image_calc_a4_dpi(self):
|
||||||
def test_image_calc_a4_dpi(self, m):
|
|
||||||
parser = RasterisedDocumentParser(None)
|
parser = RasterisedDocumentParser(None)
|
||||||
|
|
||||||
parser.parse(os.path.join(self.SAMPLE_FILES, "simple-no-dpi.png"), "image/png")
|
dpi = parser.calculate_a4_dpi(os.path.join(self.SAMPLE_FILES, "simple-no-dpi.png"))
|
||||||
|
|
||||||
m.assert_called_once()
|
self.assertEqual(dpi, 62)
|
||||||
|
|
||||||
args, kwargs = m.call_args
|
|
||||||
|
|
||||||
self.assertEqual(kwargs['image_dpi'], 62)
|
|
||||||
|
|
||||||
@mock.patch("paperless_tesseract.parsers.RasterisedDocumentParser.calculate_a4_dpi")
|
@mock.patch("paperless_tesseract.parsers.RasterisedDocumentParser.calculate_a4_dpi")
|
||||||
def test_image_dpi_fail(self, m):
|
def test_image_dpi_fail(self, m):
|
||||||
@@ -258,9 +265,82 @@ class TestParser(DirectoriesMixin, TestCase):
|
|||||||
def test_skip_noarchive_notext(self):
|
def test_skip_noarchive_notext(self):
|
||||||
parser = RasterisedDocumentParser(None)
|
parser = RasterisedDocumentParser(None)
|
||||||
parser.parse(os.path.join(self.SAMPLE_FILES, "multi-page-images.pdf"), "application/pdf")
|
parser.parse(os.path.join(self.SAMPLE_FILES, "multi-page-images.pdf"), "application/pdf")
|
||||||
self.assertTrue(os.path.join(parser.archive_path))
|
self.assertTrue(os.path.isfile(parser.archive_path))
|
||||||
self.assertContainsStrings(parser.get_text().lower(), ["page 1", "page 2", "page 3"])
|
self.assertContainsStrings(parser.get_text().lower(), ["page 1", "page 2", "page 3"])
|
||||||
|
|
||||||
|
@override_settings(OCR_MODE="skip")
|
||||||
|
def test_multi_page_mixed(self):
|
||||||
|
parser = RasterisedDocumentParser(None)
|
||||||
|
parser.parse(os.path.join(self.SAMPLE_FILES, "multi-page-mixed.pdf"), "application/pdf")
|
||||||
|
self.assertTrue(os.path.isfile(parser.archive_path))
|
||||||
|
self.assertContainsStrings(parser.get_text().lower(), ["page 1", "page 2", "page 3", "page 4", "page 5", "page 6"])
|
||||||
|
|
||||||
|
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)
|
||||||
|
|
||||||
|
@override_settings(OCR_MODE="skip_noarchive")
|
||||||
|
def test_multi_page_mixed_no_archive(self):
|
||||||
|
parser = RasterisedDocumentParser(None)
|
||||||
|
parser.parse(os.path.join(self.SAMPLE_FILES, "multi-page-mixed.pdf"), "application/pdf")
|
||||||
|
self.assertIsNone(parser.archive_path)
|
||||||
|
self.assertContainsStrings(parser.get_text().lower(), ["page 4", "page 5", "page 6"])
|
||||||
|
|
||||||
|
@override_settings(OCR_MODE="skip", OCR_ROTATE_PAGES=True)
|
||||||
|
def test_rotate(self):
|
||||||
|
parser = RasterisedDocumentParser(None)
|
||||||
|
parser.parse(os.path.join(self.SAMPLE_FILES, "rotated.pdf"), "application/pdf")
|
||||||
|
self.assertContainsStrings(parser.get_text(), [
|
||||||
|
"This is the text that appears on the first page. It’s a lot of text.",
|
||||||
|
"Even if the pages are rotated, OCRmyPDF still gets the job done.",
|
||||||
|
"This is a really weird file with lots of nonsense text.",
|
||||||
|
"If you read this, it’s your own fault. Also check your screen orientation."
|
||||||
|
])
|
||||||
|
|
||||||
|
def test_ocrmypdf_parameters(self):
|
||||||
|
parser = RasterisedDocumentParser(None)
|
||||||
|
params = parser.construct_ocrmypdf_parameters(input_file="input.pdf", output_file="output.pdf",
|
||||||
|
sidecar_file="sidecar.txt", mime_type="application/pdf",
|
||||||
|
safe_fallback=False)
|
||||||
|
|
||||||
|
self.assertEqual(params['input_file'], "input.pdf")
|
||||||
|
self.assertEqual(params['output_file'], "output.pdf")
|
||||||
|
self.assertEqual(params['sidecar'], "sidecar.txt")
|
||||||
|
|
||||||
|
with override_settings(OCR_CLEAN="none"):
|
||||||
|
params = parser.construct_ocrmypdf_parameters("", "", "", "")
|
||||||
|
self.assertNotIn("clean", params)
|
||||||
|
self.assertNotIn("clean_final", params)
|
||||||
|
|
||||||
|
with override_settings(OCR_CLEAN="clean"):
|
||||||
|
params = parser.construct_ocrmypdf_parameters("", "", "", "")
|
||||||
|
self.assertTrue(params['clean'])
|
||||||
|
self.assertNotIn("clean_final", params)
|
||||||
|
|
||||||
|
with override_settings(OCR_CLEAN="clean-final", OCR_MODE="skip"):
|
||||||
|
params = parser.construct_ocrmypdf_parameters("", "", "", "")
|
||||||
|
self.assertTrue(params['clean_final'])
|
||||||
|
self.assertNotIn("clean", params)
|
||||||
|
|
||||||
|
with override_settings(OCR_CLEAN="clean-final", OCR_MODE="redo"):
|
||||||
|
params = parser.construct_ocrmypdf_parameters("", "", "", "")
|
||||||
|
self.assertTrue(params['clean'])
|
||||||
|
self.assertNotIn("clean_final", params)
|
||||||
|
|
||||||
|
with override_settings(OCR_DESKEW=True, OCR_MODE="skip"):
|
||||||
|
params = parser.construct_ocrmypdf_parameters("", "", "", "")
|
||||||
|
self.assertTrue(params['deskew'])
|
||||||
|
|
||||||
|
with override_settings(OCR_DESKEW=True, OCR_MODE="redo"):
|
||||||
|
params = parser.construct_ocrmypdf_parameters("", "", "", "")
|
||||||
|
self.assertNotIn('deskew', params)
|
||||||
|
|
||||||
|
with override_settings(OCR_DESKEW=False, OCR_MODE="skip"):
|
||||||
|
params = parser.construct_ocrmypdf_parameters("", "", "", "")
|
||||||
|
self.assertNotIn('deskew', params)
|
||||||
|
|
||||||
class TestParserFileTypes(DirectoriesMixin, TestCase):
|
class TestParserFileTypes(DirectoriesMixin, TestCase):
|
||||||
|
|
||||||
|
Reference in New Issue
Block a user