mirror of
https://github.com/Donkie/Spoolman.git
synced 2026-10-20 00:59:47 -05:00
Compare commits
| Author | SHA1 | Date | |
|---|---|---|---|
|
|
073bf15108 | ||
|
|
15f0124a4c | ||
|
|
1c87bb9c0e | ||
|
|
715cd47b9f | ||
|
|
fa92ab465d | ||
|
|
a9e1802c2a | ||
|
|
72031f0ea5 | ||
|
|
a3977509eb | ||
|
|
3a8ac87b13 | ||
|
|
3e9c3b68bd | ||
|
|
58a01e3389 | ||
|
|
bb0bcc1b5f | ||
|
|
6b6c13e4f1 | ||
|
|
b0faab5cfd | ||
|
|
62963935eb | ||
|
|
3f8cb8f1d1 | ||
|
|
89fba3f4a8 | ||
|
|
e72b2d1821 | ||
|
|
4658f42798 | ||
|
|
abe5bd909f | ||
|
|
645ef72937 | ||
|
|
12199575de | ||
|
|
975e0cc702 | ||
|
|
15381fcf01 | ||
|
|
ca007aa561 | ||
|
|
43101b2a2d | ||
|
|
a31beee46b | ||
|
|
6447198fe3 | ||
|
|
c35983ee52 | ||
|
|
1e800ec5f8 | ||
|
|
016ca6791e | ||
|
|
e5944c94e0 | ||
|
|
a35331e50a | ||
|
|
bcc1ba1ace | ||
|
|
629b8228d8 | ||
|
|
7fbe604cc2 | ||
|
|
bff2a485e6 | ||
|
|
7e83451226 | ||
|
|
30928407a7 | ||
|
|
02f5c07c13 | ||
|
|
022285d64d | ||
|
|
6b1e01ecd8 | ||
|
|
7c4dcc7da7 | ||
|
|
dcb4618399 | ||
|
|
7a1114f8fc | ||
|
|
423cf234be | ||
|
|
2c15af00b8 | ||
|
|
ac9a32fa23 | ||
|
|
787d912dec | ||
|
|
8badd51707 | ||
|
|
53f09eb2bc | ||
|
|
b3d35d751d | ||
|
|
9f29826588 | ||
|
|
f7c53187c1 | ||
|
|
1e9d74cd6e | ||
|
|
1a04139c1d | ||
|
|
aae2b4df56 | ||
|
|
e1ad9feb30 | ||
|
|
5b93b3b37e | ||
|
|
bd4b9351aa | ||
|
|
958d5bd9ee | ||
|
|
c9b1215cb6 | ||
|
|
586299aaa6 | ||
|
|
7e98987b87 | ||
|
|
ba62681856 | ||
|
|
05e4da7a10 | ||
|
|
0543b9145b | ||
|
|
25d25e3701 | ||
|
|
a353983f85 | ||
|
|
bed3f14ee7 | ||
|
|
27ea256e2d | ||
|
|
7b82f2afb2 | ||
|
|
45cc8246d3 | ||
|
|
0c4caa527e | ||
|
|
2ab68cdff9 | ||
|
|
fc6aa55d27 | ||
|
|
92e093b16d | ||
|
|
55d11d0dc4 | ||
|
|
6c5d03d4ec | ||
|
|
058490a3c6 | ||
|
|
9131454aa2 | ||
|
|
c73bce4301 | ||
|
|
1c0f668c16 | ||
|
|
de81990a29 | ||
|
|
e4a78bb352 | ||
|
|
196ebd66d0 | ||
|
|
d1f3401b37 | ||
|
|
d848ddef97 | ||
|
|
5c65cb5495 | ||
|
|
72d2cbe986 | ||
|
|
3ecdf5dfc6 | ||
|
|
d5a49e3340 | ||
|
|
83897b9744 | ||
|
|
c386ac34e2 | ||
|
|
205d8fb813 | ||
|
|
c74f77b478 | ||
|
|
a40b20df8c | ||
|
|
dc56305a97 | ||
|
|
ae2319a215 | ||
|
|
9f90c2238d | ||
|
|
c157946eca | ||
|
|
0966ecada9 | ||
|
|
9ae9827f4c | ||
|
|
e9e76a088f | ||
|
|
a4c749ad14 | ||
|
|
994e5d422b | ||
|
|
1db2ed3851 | ||
|
|
b9b5784108 | ||
|
|
c01342d182 | ||
|
|
0388fb60bf | ||
|
|
feb67ab500 | ||
|
|
ed946223d9 | ||
|
|
c405739b1d | ||
|
|
e744049343 | ||
|
|
179fc0a117 | ||
|
|
6520ce6d1b | ||
|
|
83b0238bb4 | ||
|
|
f55188e346 | ||
|
|
4fee8db323 | ||
|
|
81636f253e | ||
|
|
0f705e80c0 | ||
|
|
3c7f68e2bd | ||
|
|
64b29a561b | ||
|
|
8f9c214dac | ||
|
|
1305857efb | ||
|
|
dd5a0a89dc | ||
|
|
1eeb2948b2 | ||
|
|
348499f469 | ||
|
|
d34fb88b31 | ||
|
|
a63af285f5 | ||
|
|
798d8b1ded | ||
|
|
f8ffaa0837 | ||
|
|
09fea9f668 | ||
|
|
789b7fd88f | ||
|
|
5424a638b1 | ||
|
|
c281114c6f | ||
|
|
9566f7848d | ||
|
|
4f9cc1b75d | ||
|
|
42721c7ebc | ||
|
|
d1dc40b3cc | ||
|
|
92be2975b8 | ||
|
|
a62e4ce6c1 | ||
|
|
0a3404cefe | ||
|
|
c2002e43f7 | ||
|
|
85e3ac7163 | ||
|
|
33aa3de515 | ||
|
|
e238592e4d | ||
|
|
107a134da8 | ||
|
|
3cf7a9fa61 | ||
|
|
1e5b28ab7d | ||
|
|
035922b49f | ||
|
|
eced7f22db | ||
|
|
4c2febbba6 | ||
|
|
e37045dcd4 | ||
|
|
f83b9d9ea4 | ||
|
|
0b3d7ba140 | ||
|
|
b6217c4b30 | ||
|
|
09953643dc | ||
|
|
a6512da598 | ||
|
|
6da0902c8e | ||
|
|
6bcda3d307 | ||
|
|
9dd0f73be1 | ||
|
|
5171330c44 | ||
|
|
009f9e3bae | ||
|
|
a039095360 | ||
|
|
205de5f0ce | ||
|
|
05a1b12e33 | ||
|
|
f458995104 | ||
|
|
9f048a34c8 | ||
|
|
ba891d5830 | ||
|
|
f841da6561 | ||
|
|
931e3c9b3b | ||
|
|
9775c2c42e | ||
|
|
a9e50559bb | ||
|
|
91d5dc8f42 | ||
|
|
8528847957 | ||
|
|
5799fac1a6 | ||
|
|
ce1c781ae7 | ||
|
|
dc72f3d5eb | ||
|
|
aa5821f005 | ||
|
|
13f7667bf4 | ||
|
|
ed732170d1 | ||
|
|
8465481ab3 | ||
|
|
9935d74886 | ||
|
|
35d10f899d | ||
|
|
785984e685 | ||
|
|
8b71fb9345 | ||
|
|
9bb8973af2 | ||
|
|
332b3e0fe4 | ||
|
|
8d9eb7395d | ||
|
|
413254b79a | ||
|
|
21c7b98844 | ||
|
|
97758f2c4c | ||
|
|
9aea271ee5 | ||
|
|
6ab045cde8 | ||
|
|
90492ff75d | ||
|
|
1f2670cf81 | ||
|
|
565abec742 | ||
|
|
afb3094c1b | ||
|
|
96065fbd9f | ||
|
|
8d65e53e7c | ||
|
|
48221c270a | ||
|
|
f9c2c3838a | ||
|
|
bd877c1ec7 | ||
|
|
328c508c39 | ||
|
|
052d3e9eb9 | ||
|
|
9a98e8ba5d | ||
|
|
6dce8717a0 | ||
|
|
5b480f7db7 | ||
|
|
1b4beb9593 | ||
|
|
33ad8d7173 | ||
|
|
713cb51f09 | ||
|
|
fa39c6d08e | ||
|
|
61e2c0c27c | ||
|
|
83ea5001fd | ||
|
|
6fd64f9ed4 | ||
|
|
2edd96dbb0 | ||
|
|
61e1b62a38 | ||
|
|
7e2e98b30a | ||
|
|
6d97cd34b3 | ||
|
|
5624a0a605 | ||
|
|
6e289d76ca | ||
|
|
5b39b2848f | ||
|
|
99932ceda8 | ||
|
|
fbaa83eead | ||
|
|
d2db504cc5 | ||
|
|
74a86683b3 | ||
|
|
2434b424db | ||
|
|
678213f67e | ||
|
|
21e0b71efe | ||
|
|
6a786bac88 | ||
|
|
38b77a9b14 | ||
|
|
fb1567a9b0 | ||
|
|
01c7ff65be | ||
|
|
d43552bd26 | ||
|
|
ff2e3ec31a | ||
|
|
5144b64a8a | ||
|
|
9d77b08114 | ||
|
|
b4292398f5 | ||
|
|
9ec5181d4c | ||
|
|
91dec46936 | ||
|
|
d67a2afbe4 | ||
|
|
64e70076f1 | ||
|
|
ac7865ecbc | ||
|
|
419a4763d5 | ||
|
|
3f1d3b4c7b | ||
|
|
1507f9b3b8 | ||
|
|
7f42bd6f02 | ||
|
|
fd9b06d33c | ||
|
|
de533bc74d | ||
|
|
8979f80e74 | ||
|
|
f261dee61b | ||
|
|
422657d18f | ||
|
|
01be8ddd5b | ||
|
|
bf265c12c3 | ||
|
|
c90cc3acab | ||
|
|
9423acbc9e | ||
|
|
05628eb593 | ||
|
|
aac4a26cde | ||
|
|
2d08061c45 | ||
|
|
aec9b276b2 | ||
|
|
0931b03a80 | ||
|
|
740b1ad808 | ||
|
|
379354159a | ||
|
|
e9b06d91c7 | ||
|
|
fb723f0af8 | ||
|
|
93d5e234b6 | ||
|
|
7a31afaa39 | ||
|
|
b2c46e22c7 | ||
|
|
84caec0f81 | ||
|
|
250aa7c308 | ||
|
|
34a990efcf | ||
|
|
7eaf37fa35 | ||
|
|
f462245622 | ||
|
|
a46caaabf5 | ||
|
|
5deb6f8ca6 | ||
|
|
948c95866d | ||
|
|
0cc77dccb3 | ||
|
|
16feb404ba | ||
|
|
3843785690 | ||
|
|
a17e351e25 | ||
|
|
9bcaece766 | ||
|
|
f02ebbc93e | ||
|
|
292f8ee305 | ||
|
|
423c06abc8 | ||
|
|
7dc17f12da | ||
|
|
bfabb54c3c | ||
|
|
dd16672a4a | ||
|
|
587521eff6 | ||
|
|
2c84acfd24 | ||
|
|
43bf140675 | ||
|
|
b6d220a3ef | ||
|
|
421ad925a7 | ||
|
|
01f13357b4 | ||
|
|
e5daed84e6 | ||
|
|
bd244e8387 | ||
|
|
d81e43aa56 | ||
|
|
18e31bf4b1 | ||
|
|
dd8e7868be | ||
|
|
179ea3b4d0 | ||
|
|
64d41c78b3 | ||
|
|
352d36cb86 | ||
|
|
56c181f634 | ||
|
|
8b00fc0d43 | ||
|
|
2225db0b5f | ||
|
|
30fa35d38b | ||
|
|
8680805416 | ||
|
|
aa83c0c1e9 | ||
|
|
7f19ff0952 | ||
|
|
e09d63b443 | ||
|
|
41e6c65199 | ||
|
|
d7c2e52a67 | ||
|
|
4ad904d270 | ||
|
|
9b652b5d77 | ||
|
|
dd13f6ea34 | ||
|
|
4e3e0e849d | ||
|
|
c321346571 | ||
|
|
93f49449a0 | ||
|
|
538c78e7b3 | ||
|
|
bef99d5891 | ||
|
|
2f1a2a2b2d | ||
|
|
633e1fa2b0 | ||
|
|
4c1c905a83 | ||
|
|
71c607122f | ||
|
|
16e34da538 | ||
|
|
3e0a143966 | ||
|
|
b315b63ddc | ||
|
|
590b510f20 | ||
|
|
216eba5d26 | ||
|
|
f38720314b | ||
|
|
910f0b079b | ||
|
|
29113812f3 | ||
|
|
a03229be6f | ||
|
|
007a0e0ff5 | ||
|
|
2d6945f5f6 | ||
|
|
e3800433e7 | ||
|
|
3583c5d011 | ||
|
|
e4813ce86c | ||
|
|
c1a0882ee9 | ||
|
|
52deaf7c8c | ||
|
|
b0c9f572f7 | ||
|
|
5cfdde4cc6 | ||
|
|
dd39a11c7e | ||
|
|
3e1c4ffcd7 | ||
|
|
5208b47007 | ||
|
|
0d73e0d34e | ||
|
|
5e2c4b0c0c | ||
|
|
63eee038d7 | ||
|
|
f38743b179 | ||
|
|
9bf4022776 | ||
|
|
de8c6de460 | ||
|
|
0d75364b07 | ||
|
|
7d07905091 | ||
|
|
08bbd6480b | ||
|
|
86204ffddb | ||
|
|
4be91b365a | ||
|
|
5af5ca17d1 | ||
|
|
8013dd1ce2 | ||
|
|
ee9cf0d830 | ||
|
|
3e8eaf6aaf | ||
|
|
2af3b95d4f | ||
|
|
7707dad1a4 | ||
|
|
8382a9037d | ||
|
|
fc4cf78451 | ||
|
|
13b1ab7f94 | ||
|
|
7262563e4d | ||
|
|
7cf8f6f0eb | ||
|
|
01462d3df3 | ||
|
|
faa4659b6d | ||
|
|
aaa8714f66 | ||
|
|
da5eeef1a0 | ||
|
|
e73f603f39 | ||
|
|
a7be90ef4a | ||
|
|
5b889c2e7a | ||
|
|
796ef5941e | ||
|
|
58f4b13cd2 | ||
|
|
e50c2ec72f | ||
|
|
fcf0e8b145 | ||
|
|
a4c113ba8e | ||
|
|
b12e129e5b | ||
|
|
b2f5088081 | ||
|
|
7aa864e457 | ||
|
|
032b3f05c2 | ||
|
|
7db40b4036 | ||
|
|
4ed1fbfc67 | ||
|
|
155e8f3737 | ||
|
|
b885108a3d | ||
|
|
1d5b8c1d3d | ||
|
|
f2b060f6ca | ||
|
|
9d53a3f292 | ||
|
|
708af05ab2 | ||
|
|
ae12072cdd | ||
|
|
2a03f9f64c | ||
|
|
cefd2caa42 | ||
|
|
3beb2b4483 | ||
|
|
0c3ce54da9 | ||
|
|
ac3ec7d1a2 | ||
|
|
7e4d2ee419 | ||
|
|
46beda2264 | ||
|
|
18f114419f | ||
|
|
3c1d8bfa6d | ||
|
|
20462e86e2 | ||
|
|
a2cfe33cd3 | ||
|
|
f8db2a0f09 | ||
|
|
95230eaa73 | ||
|
|
2cdfcc1bae | ||
|
|
e175708b3e | ||
|
|
a5e4bc0bf3 | ||
|
|
cbc6458c5d | ||
|
|
13b7a9b62f | ||
|
|
7c29d5f54a | ||
|
|
6663a42ab5 | ||
|
|
b34b872140 | ||
|
|
dadc2ba760 | ||
|
|
35cc1c7d43 | ||
|
|
e08c930ef8 | ||
|
|
8318a5f970 | ||
|
|
c7b59fe322 | ||
|
|
c9c59b3d9e | ||
|
|
09c29703f0 | ||
|
|
a8da5e312b | ||
|
|
c8be881e03 | ||
|
|
57f2b30a4c | ||
|
|
7405ce77fd | ||
|
|
673ca1d2fb | ||
|
|
4e1e3c50c9 | ||
|
|
f369253c67 | ||
|
|
dd6b334a79 | ||
|
|
a8b3641a90 | ||
|
|
72daa29cd2 | ||
|
|
7e9533965a | ||
|
|
97524b1107 | ||
|
|
e3dbd3e609 | ||
|
|
388e87ec96 | ||
|
|
ff7170f0f7 | ||
|
|
3c414503d6 | ||
|
|
b00c1b875d | ||
|
|
0c03f8b404 | ||
|
|
67022e7c6d | ||
|
|
4ab99768ae | ||
|
|
c1d5c6b46e | ||
|
|
aad337234e | ||
|
|
9bdf4d1a5e | ||
|
|
24e6f7fd34 | ||
|
|
f4eba480d6 | ||
|
|
59672ecb30 | ||
|
|
c781869d09 | ||
|
|
a76c8ed3d9 | ||
|
|
7e353595c0 | ||
|
|
6ca753bca0 | ||
|
|
c9ae367dc0 | ||
|
|
b38468ffe2 | ||
|
|
d2cabd5d29 | ||
|
|
87a07a5560 | ||
|
|
ae3208a9c3 | ||
|
|
04d6ee72bd | ||
|
|
680f2a063b | ||
|
|
bf15e64fe5 | ||
|
|
814ddfcd92 | ||
|
|
aa47cd015a | ||
|
|
372554adbd | ||
|
|
c4be425dcc | ||
|
|
aa447dd05b | ||
|
|
21651216af | ||
|
|
bf3480cfba | ||
|
|
39f6ededfd | ||
|
+2 |
4219230aa1 | ||
|
|
17f8b9fee1 | ||
|
|
6af053b682 | ||
|
|
2befcfc389 | ||
|
|
8f7794e487 | ||
|
|
7ab45ca1ab | ||
|
|
e8b363c10b | ||
|
|
64e94bd97f | ||
|
|
89ffd3e4b1 | ||
|
|
2e396d6cda | ||
|
|
f08e27c6fd | ||
|
|
733dcf9209 | ||
|
|
1262eb664a | ||
|
|
9a93892a91 | ||
|
|
2924850317 | ||
|
|
b369cf049e | ||
|
|
d1ab338b91 | ||
|
|
a2e9e66153 | ||
|
|
5d812e269e | ||
|
|
7d683eb246 | ||
|
|
1b1dbbb78f | ||
|
|
404b03173b | ||
|
|
c33f65243c | ||
|
|
7d4728ae9b | ||
|
|
06ae678586 | ||
|
|
bf3896b1f2 | ||
|
|
1d5164b629 | ||
|
|
cd5ef6f8d6 | ||
|
|
f6827c0a69 | ||
|
|
18214ee0f8 | ||
|
|
386ec36d1f | ||
|
|
8a5cf7ec73 | ||
|
|
b7772ca743 | ||
|
|
2f9259227d | ||
|
|
e6e3be2773 | ||
|
|
eced411a51 | ||
|
|
7e309e36b9 | ||
|
|
054c59948e | ||
|
|
5222df98a3 | ||
|
|
5eb660f420 | ||
|
|
52b0580df9 | ||
|
|
01be7b7572 | ||
|
|
f69d098473 | ||
|
|
df2cd09bcc | ||
|
|
6e1065009c | ||
|
|
c2c6a8dd8f | ||
|
|
0076058280 | ||
|
|
54b67f53ef | ||
|
|
129650237a | ||
|
|
5c5e8b44e1 | ||
|
|
a0987e063e | ||
|
|
fc606ec8fc | ||
|
|
f7da164599 | ||
|
|
3d6888ec2c | ||
|
|
ca8dba9e54 | ||
|
|
3a2fc68e1e | ||
|
|
acb367262b | ||
|
|
9b79135c1c | ||
|
|
ecd43bd51a | ||
|
|
64d5f84bc3 | ||
|
|
6ade40517f | ||
|
|
990f16a8e9 | ||
|
|
9582962e37 | ||
|
|
a34d52a597 | ||
|
|
5b5e07e2c1 | ||
|
|
38397424ee | ||
|
|
128a0a4a34 | ||
|
|
4118ca5f2c | ||
|
|
2f25e76f5e | ||
|
|
a733366be9 | ||
|
|
505faf3b35 | ||
|
|
e2a08c0cfd | ||
|
|
d580924d13 | ||
|
|
4e4313204e | ||
|
|
c90cf9eb43 | ||
|
|
5bd4fa594d | ||
|
|
06eff55ccb | ||
|
|
43034dce50 | ||
|
|
5bfaf9c5b2 | ||
|
|
c72036f650 | ||
|
|
593b653841 | ||
|
|
3f3f872310 | ||
|
|
0e5573bc1f | ||
|
|
d194cf3483 | ||
|
|
57869fab88 | ||
|
|
29f0f362d4 | ||
|
|
638466bc70 | ||
|
|
913e9116fa | ||
|
|
6d2ba20023 | ||
|
|
5811353670 | ||
|
|
ed758a1171 | ||
|
|
f7103ec9e2 | ||
|
|
0c673f0403 | ||
|
|
8ae45c03c5 | ||
|
|
18b0a818bf | ||
|
|
28d840fc87 | ||
|
|
9b16121ed2 | ||
|
|
d7486d5d51 | ||
|
|
9f893fb289 | ||
|
|
7c188c113a | ||
|
|
f23f5611b2 | ||
|
|
c0142c9bcf | ||
|
|
2b592abd5f | ||
|
|
8ab2060b96 | ||
|
|
351a09ca63 | ||
|
|
871fbdb444 | ||
|
|
ab38eb73ad | ||
|
|
287d3010ac | ||
|
|
a1685f7428 | ||
|
|
bb2a21cb99 | ||
|
|
c30bbfea9d | ||
|
|
ebadc045aa | ||
|
|
a9d93520eb | ||
|
|
63c2ad5d7e | ||
|
|
35f35b8bd3 | ||
|
|
7642eaae27 | ||
|
|
cae436ee87 | ||
|
|
c9cf7a6a12 | ||
|
|
532ffc8ccd | ||
|
|
d2435871de | ||
|
|
d9c0a2a049 | ||
|
|
48650cff96 | ||
|
|
bcdcf6f476 | ||
|
|
30e2daf784 | ||
|
|
d65b50d5a2 | ||
|
|
9dcd6d56db | ||
|
|
7ea89dc347 | ||
|
|
4bdebbdded | ||
|
|
cf82d5b68f | ||
|
|
0f7cdc6faf | ||
|
|
99928b5469 | ||
|
|
46b69808a6 | ||
|
|
c82e3911e1 | ||
|
|
470d8f3bcc | ||
|
|
103e029434 | ||
|
|
92da7fd110 | ||
|
+1 |
991feb36bb | ||
|
|
e2ab72b5d0 | ||
|
|
8c262a640d | ||
|
|
4854e322dc | ||
|
|
ad79373dd0 | ||
|
|
5c8364fcea | ||
|
|
2c638da22a | ||
|
|
295265f60d | ||
|
|
4f6763716c | ||
|
|
48ad01b09b | ||
|
|
d9fd44eab9 | ||
|
|
da54ead06f | ||
|
|
9b6af119c6 | ||
|
|
3a3273d9a9 | ||
|
|
c81920d23c | ||
|
|
e3c5f3fc1d | ||
|
|
4e3c228b28 | ||
|
|
059ff94f4b | ||
|
|
9f30c16e4b | ||
|
|
14a30bc3c5 | ||
|
|
025f18f914 | ||
|
|
388082f27a | ||
|
|
7fae319b82 | ||
|
|
137558639a | ||
|
|
eafbc64937 | ||
|
|
1be0884729 | ||
|
|
e77bea1bc2 | ||
|
|
5dc26946cb | ||
|
|
34c09d3f55 | ||
|
|
7f14cbdaa9 | ||
|
|
115e29bdaf | ||
|
|
6d817d8c2b | ||
|
|
c033a3ffe6 | ||
|
|
1974d4b8d2 | ||
|
|
c3ef318cb0 | ||
|
|
bc442f5063 | ||
|
|
dd0476ced3 | ||
|
|
6f9dfd1be7 | ||
|
|
29aa9f8d54 | ||
|
|
251f7e2ede | ||
|
|
f137535c1e | ||
|
|
fb83220739 | ||
|
|
fdf317fc13 | ||
|
|
205a5c52fa | ||
|
|
f585c51b18 | ||
|
|
b393f822e8 | ||
|
|
7cc3bef46f | ||
|
|
c179a38f03 | ||
|
|
6e9f6e5af4 | ||
|
|
21f46427e5 | ||
|
|
967b9d5b31 |
No files matched your search
@@ -1,4 +1,5 @@
|
||||
client/node_modules
|
||||
client_v2/node_modules
|
||||
|
||||
*.egg-info
|
||||
*.egg/
|
||||
|
||||
+38
-7
@@ -53,6 +53,10 @@ SPOOLMAN_PORT=7912
|
||||
# Default: FALSE
|
||||
#SPOOLMAN_METRICS_ENABLED=TRUE
|
||||
|
||||
# Periodically check GitHub for a newer Spoolman release, shown in the UI footer and server log
|
||||
# Default: TRUE
|
||||
#SPOOLMAN_UPDATE_CHECK=FALSE
|
||||
|
||||
# Collect items (filaments, materials, etc.) from an external database
|
||||
# Set this to a URL of an external database. Set to an empty string to disable
|
||||
# Default: https://donkie.github.io/SpoolmanDB/
|
||||
@@ -60,6 +64,17 @@ SPOOLMAN_PORT=7912
|
||||
# Sync interval in seconds, set to 0 to disable automatic sync. It will only sync on start-up then.
|
||||
# Default: 3600
|
||||
#EXTERNAL_DB_SYNC_INTERVAL=3600
|
||||
# Display name for the external database, shown in the UI.
|
||||
# Set this to match your own catalog if you changed EXTERNAL_DB_URL above.
|
||||
# Default: SpoolmanDB
|
||||
#EXTERNAL_DB_NAME=SpoolmanDB
|
||||
|
||||
# Serve the previous (React) web client instead of the current one
|
||||
# Both clients ship in the image and talk to the same API, so this is a safe
|
||||
# rollback if the current client misbehaves on your setup. Your data is untouched
|
||||
# either way. Please report the problem so it can be fixed.
|
||||
# Default: FALSE
|
||||
#SPOOLMAN_LEGACY_CLIENT=TRUE
|
||||
|
||||
# Enable debug mode
|
||||
# If enabled, the client will accept requests from any host
|
||||
@@ -73,10 +88,26 @@ SPOOLMAN_PORT=7912
|
||||
#PUID=1000
|
||||
#PGID=1000
|
||||
|
||||
# Allows CORS ORIGIN.
|
||||
# Use the https://developer.mozilla.org/en-US/docs/Web/HTTP/Reference/Headers/Access-Control-Allow-Origin semantics
|
||||
# separated by commas
|
||||
# for example to allow request from source1.domain.com on port p1 and source2.domain.com on port p2
|
||||
# SPOOLMAN_CORS_ORIGIN=source1.domain.com:p1, source2.domain.com:p2
|
||||
# to allow from any
|
||||
# SPOOLMAN_CORS_ORIGIN=*
|
||||
# Extra browser origins allowed to talk to Spoolman, separated by commas.
|
||||
# Only needed for a web UI served from a different address than Spoolman, such as a Fluidd or
|
||||
# Mainsail instance on another host. Spoolman's own web UI does not need it, and neither does
|
||||
# Moonraker, OctoPrint, Home Assistant or anything else that is not a browser.
|
||||
# Each entry must include the scheme -- a bare "host:port" is not an origin and will never match.
|
||||
# See https://developer.mozilla.org/en-US/docs/Web/HTTP/Reference/Headers/Access-Control-Allow-Origin
|
||||
#SPOOLMAN_CORS_ORIGIN=https://fluidd.local,http://mainsail.local:8080
|
||||
# To allow every origin. WARNING: this turns the origin checks off entirely, so any website you
|
||||
# visit can read and modify your Spoolman data in the background. Only on a trusted network.
|
||||
#SPOOLMAN_CORS_ORIGIN=*
|
||||
|
||||
# Hostnames this Spoolman answers to, separated by commas. Off unless set.
|
||||
# Protects against DNS rebinding, where a domain an attacker owns is pointed at your Spoolman's
|
||||
# local address so that their web page can talk to it. Hostnames, not origins: no scheme, no port.
|
||||
# "*.mydomain.com" covers the domain and its subdomains.
|
||||
# IP addresses, single-word names, .local/.lan/.home/.home.arpa/.internal names and any hostname
|
||||
# already in SPOOLMAN_CORS_ORIGIN keep working without being listed.
|
||||
# If you reach Spoolman through a reverse proxy on a real domain, that domain must be listed here
|
||||
# once this is set, or every request is refused with a 400.
|
||||
#SPOOLMAN_ALLOWED_HOSTS=spoolman.mydomain.com
|
||||
|
||||
# See the Security page in the wiki for how these two fit together:
|
||||
# https://github.com/Donkie/Spoolman/wiki/Security
|
||||
+2
-2
@@ -1,9 +1,9 @@
|
||||
# These are supported funding model platforms
|
||||
|
||||
github: # Replace with up to 4 GitHub Sponsors-enabled usernames e.g., [user1, user2]
|
||||
github: Donkie # Replace with up to 4 GitHub Sponsors-enabled usernames e.g., [user1, user2]
|
||||
patreon: # Replace with a single Patreon username
|
||||
open_collective: # Replace with a single Open Collective username
|
||||
ko_fi: donkie
|
||||
ko_fi:
|
||||
tidelift: # Replace with a single Tidelift platform-name/package-name e.g., npm/babel
|
||||
community_bridge: # Replace with a single Community Bridge project-name e.g., cloud-foundry
|
||||
liberapay: # Replace with a single Liberapay username
|
||||
|
||||
Binary file not shown.
|
After Width: | Height: | Size: 312 KiB |
Binary file not shown.
|
After Width: | Height: | Size: 136 KiB |
Binary file not shown.
|
After Width: | Height: | Size: 162 KiB |
Binary file not shown.
|
After Width: | Height: | Size: 49 KiB |
@@ -0,0 +1,67 @@
|
||||
<svg xmlns="http://www.w3.org/2000/svg" xmlns:xlink="http://www.w3.org/1999/xlink" viewBox="0 0 800 570" width="800" height="570">
|
||||
<!-- Generated by https://github.com/antfu-collective/sponsorkit -->
|
||||
<style>
|
||||
text {
|
||||
font-weight: 300;
|
||||
font-size: 14px;
|
||||
fill: #777777;
|
||||
font-family: -apple-system, BlinkMacSystemFont, 'Segoe UI', Roboto, Oxygen, Ubuntu, Cantarell, 'Open Sans', 'Helvetica Neue', sans-serif;
|
||||
}
|
||||
.sponsorkit-link {
|
||||
cursor: pointer;
|
||||
}
|
||||
.sponsorkit-tier-title {
|
||||
font-weight: 500;
|
||||
font-size: 20px;
|
||||
}
|
||||
</style>
|
||||
<text x="400" y="40" text-anchor="middle" class="sponsorkit-tier-title">Gold Sponsors</text><a href="https://joshix.com" class="sponsorkit-link" target="_blank" id="joshix">
|
||||
<text x="400" y="203" text-anchor="middle" class="sponsorkit-name" fill="currentColor">Josh Wood</text>
|
||||
|
||||
<clipPath id="c0">
|
||||
<rect x="340" y="65" width="120" height="120" rx="60" ry="60" />
|
||||
</clipPath>
|
||||
<image x="340" y="65" width="120" height="120" href="data:image/webp;base64,UklGRsgGAABXRUJQVlA4ILwGAACwJACdASp4AHgAPm0skkYkIqGhL5ENkIANiUfPo+yShwQpAbER6gG8GTCe9OgMo/Ux8Mb6gcyqPI8xGY/5PrE+/PpB5ypAjRkDFzrivwF62s/DK34rzvVhAPgCBtQjb6uCuPF1IciZ/eOsAm2YcRY0JTDqwAeM+a8G/bPnitwjyrcNv4JeKAdm+2kIGNTUplFYHTh5H/6cvX/J2boEqumFpsZ4H+BTtbcCJ1umGOvIdIZ7mJJ4wKAIqBezjekx2kJcEuJv1TQjTzvFltO1PQyGeQS85A0kZIQo/eL9EMzL7yHbRNB95Za7xMB23tgYLYRGioR+cObcTdJh1itU3qSDjOx5GX2qxaVkPqMDgaM/dJltCbRr48Uj9txgtIhRKvgNxLd0fZ2iU1+9n5MIMAD+/PQBSjyc0vbGv1rJpHHondsozJ5is5nynZ+bxtrKmbuULzqkfkHTd2EZMZR4pKqYe4vgUljlur1epNBEkArOAPbtmGjmkwqXRkZtDettTONSDKtn7bi5F52h+cnz5FvLoE7c+pK+ZkBlpZy9Y7Wzx9bvKE/Org0ItinAq7f9TmihQ1eizXWPtgBKFd+Qu7BF+wqFv/68qGwtXD/9iMyD9G0NFBxF/YHjCzsUt0rvHlkPkG3u0s43UFSi+tFMWXfJVDMX9bqV1Y7dvCwhQ7NY+SZCNaoq487tNhvEhIlUb1mqdXv3rxhJ8QLM0iZ5muNzgAZH8rnxR/JlNXsfZhe4ZvsIgsa8/f3eUhXSZ/acnJ1dh8SayPmOJysvTMy4SmXCvIWvFZrAdbXjfUKSV2SDj8CFjFa3S/U+VcTXqTm5RTpQy2R6citHAtZ/FAo0R2l+ubQvHAZbG1naXrdCmvx9IQxQE9DrQrFccqLpAroykRLrIPEyTcvzXPoy6DcrqpzWpVsskaKDksL8HIeM6LvYhAMaz7kmdYfHfQhxnTzQEV3bii5mXAh7RLbsvuml5HPVj3hHYPeWcyqXuwdbKs1ei9Is2LWps/OYoY1/S8HkS7yWsH3lJGIp3YRtJrl0CBj80B5Kc7FCt1kLT7l02XMn2sp4G/Tmc2PTOSToCkOEzWm60rUaX7gU/NBUAHcFJzcveQBzWbtm/QvAzmyYRv27bSozA8jcjTB11XwBz7aRW6bOdhZevq1oNodI75fAQ9SjxsqijU6icL/C17hatpRfNDRK5339AsbtAKnhUpcmbBrYXmYrjfmcXLsTjT9m4yYPLzmAr38FhZbZYTXEwcQ611OLliezqUGH63rwrrD/Y1D7DP5TeGiQ6fSqUs5MbV+bW1zQlCU4ZZ6GFhrOnXhlH6oN2N9aO/Eu35SHfnCxZk2cch4YgaPmOGn8R7/6u2il6/EgXYMDeK7HcSEmss7n1CREawmfINYUCUxLB4s3z4pQQkVOTAy0PM3uylOfQt6LDpQ7ZjnhwGGNbVqPRwsClzPpxRnIAPXaDHJW0tFtNHZSNOmo3m9VzNkVN0wUOHb+/i1tW3RUHhuE+6p8D8C4px/D5MTU4l9INiryqSPO8KR9Pauk1PT7p4Iuf1GbZ9pYXVqIQcpIkYNKRyyJObLYCEVJYyUQ9s1sHx3kWGY8BVNVsZ45IfByrst+0iJywhlRMZLvY719IU2ssAyx9bQyJ+FOZOH11nib/g5i86gKhw1inytSYr7KSrOZ3vEZK0d131xF8D4Tqq5fmEuoaR7R9e/DvkPRxiSPwp6caZYHNjW0vw28jfBIeuc2Hu86STZP0dSWeaIOiTXK74vJEmLdMAUbYCX3jw2eTZJxYSuEI9YivnsnsJSPF9gk8RFk5dx+BVE3a+ypXgbjVO8Bg1tuNmJDEAH22PMgOxKSCbOhQ/ox19PW73FJ4ybJojgF3dPjPKzue/4Hf429x0Jsn2/tlNCrJf0T7XyE1cIgKvt5DbNFfh5Ss0cZe+I/9HUA7JwZCQ5LF2GqEB21XI1qJZor9y46SIjj2HxWJnJPdqHCEe6Tb7D+NLFsjfl+ZJGZu/HX6vjuORb0RIkmbq0aEVzHGjIawLzSZRKs+q7uRCXS2erdaj3ZPTqTV4YfqwFYAW3uYbwD+3Ktu9mIXLpFMsw8IiQNZopAHBbVQo+/Qk+1LBLeHztLhFDya0zWaexlFWshmq4c3J6RepzwNd/yweyeESecwL9eXf8fanxvJ2hOMKKU7Rh1g1ZBdGFJYXrZzN9PgAoBk/w77D0swqmrjebS9hmnON+C9owqx15EgS8f/BGWnupWZs+frjmVzRfc881ei87vK+ccntgAq2JzNWMLH1DB2R+Y8pkBzwAAAA==" clip-path="url(#c0)"/>
|
||||
</a><text x="400" y="255" text-anchor="middle" class="sponsorkit-tier-title">Supporters</text><a href="https://github.com/swtaylor" class="sponsorkit-link" target="_blank" id="swtaylor">
|
||||
<text x="360" y="348" text-anchor="middle" class="sponsorkit-name" fill="currentColor">Scott</text>
|
||||
|
||||
<clipPath id="c1">
|
||||
<rect x="335" y="280" width="50" height="50" rx="25" ry="25" />
|
||||
</clipPath>
|
||||
<image x="335" y="280" width="50" height="50" href="data:image/webp;base64,UklGRpoEAABXRUJQVlA4II4EAABQFgCdASpQAFAAPmkqkUWkIqGXrAdgQAaEsYBhWgnHTNnEshj28rNZ+GmOXmp93KFPcld/L/07TSyJCfZvbGHb5moRzw0e45eO2MkuhDHxKdpqpve1uYdG0BsLtaR1qQkiaMCv1f1r0sWQvsyKv+yTj4NBtLITGsATKV0IENN3Bl8f6aAHqFPbX/IIwHqJ5dhsp8hpZiO3hdsJnuJjXBSNoo/ohDiJMtm1nZDTgJRCWMgANxShzJ+lEFPAAP79QB9OMqjqK/Wb/XKJUhuVyjCLtjHwBkqY5p46HUIIHw/VhGYrttpwJLsPtJ3UJc+EdV/S8DwYN/yByU6U0rMLIGZSGqa2ErEr7V4GGC9IxFbTvXtQDpVVaddvvt0O1HhsxCFwCfsVJwpY1+j6FX0BkGY97/sXD6e4FiqF4u1+mgpFo5AvXaoOAnyAXGYvs9mrbX7kY2vf2rzqVsTsXUDRBIdM9zf8QYGvyqij+qJIWtiJDJtziH6+PIJPNyYaF3dIun0bWAOTdHDJDIxzmdua4QIZ3+SGIdZ6zj9igFRf/D/OkJzQCGsrZMNHiAul/RsCjH5bv2NQCrlcm8Tek/Bol07kSj6qBCsK/tnGmvsT5mrYoWbQsc4tflV2jYurFzbXEjfmMJTron7S5k+b88/hOxLGsnpY7GN+cajmuqSNIAdZ5Es22QFpRJOcqh4DbtElMbp4JmiIP45o+v5aoyEyIsS6tJ/LWKnofIE+2BdiITSXHMzWWzLZ4yBVsG5jcvHbzsqFp9QFsEMe6GYubnNwvK+3uPptk8jnZN/0geWJiLFMxprrPEhv3N3VEKZ1n4yf3EoOYfywMYJ8syuqMKLLH7PB7tDql0Qxsl77fR4fURVBPGgoHbDUjrhRmEeoMSuuWD6FfZ2sx4D8aLlWKdTcRjMO7i2yNb+apfklcWh9CkNjigw1K6OlcaslrUAguez3uDHP3/e0RlxlD9oXf2i7bPFmeW32p6/krBex+5LE4YroYFb6azBBWEixY90qpd5zwSzarPhNoxV4gRRgKTbMmmIQBTtNa7l3sPIIf0znFnxX+RXwIzLmfRPY66VGkoxV5zEcJwTYngDDe8zfqp4uBhCEIq76aOUn/Kf6ydnnBwkv9EvRuTQ5wEh7jIfn74wudig9529et3sKwVIC/3DyAKgOvwkmC2wiuE/MdSRyVEgJfYBkOWSn8IJEl+ZBUelXSxrKGBeAn3CJUN7vn0hBYCKhrVCuYqCQxB4RtM9ewors7V6olzJUbu6E8WazDVYTU69/pqNi1eOfeYqbv3/il9BdKqx1InGxSUo06kUmrmTyn6cmrDkyIUYrAOttFM6Sy9SKCxPlXgDG3YV1NWmkW8vZQli8jp71xHO/80aXNIOPq4kWo3h4dKuH3JF6yDQVpAN3PJb6rD5ZE8m6JN4hbYWXPjH5YnM0xk8X7xJCgZyaSgFgvc5CeJSohiXsOdwanYvLqgpgjznJYJw+YLcVlbPsLGeg0I1HVpaxWt8Sds1iBtQ+I5ZF2VWTAbdhn9vK+oC8c498LHPQiREbCHMgAA==" clip-path="url(#c1)"/>
|
||||
</a>
|
||||
<a href="https://github.com/tlangkabel" class="sponsorkit-link" target="_blank" id="tlangkabel">
|
||||
<text x="440" y="348" text-anchor="middle" class="sponsorkit-name" fill="currentColor">tlangkabel</text>
|
||||
|
||||
<clipPath id="c2">
|
||||
<rect x="415" y="280" width="50" height="50" rx="25" ry="25" />
|
||||
</clipPath>
|
||||
<image x="415" y="280" width="50" height="50" href="data:image/webp;base64,UklGRlADAABXRUJQVlA4IEQDAACQEQCdASpQAFAAPm0wlEikIqGhJnM6aIANiWVfalewGPbCULeZf9lVKyeAFRcq/sb9iNrYjtrl20Tl9Brpxl6pzt/hrSsHFFGzOJtddJg/shyIiZ1LzVI7175shK6DAWErqJbPidMLUWg3ubKTpxfjBC+/K7Eh9dbQf4YG/eS9ejJPeMpsfu0N2Ta9ObSG201Sy7FkAAD+/lcRS9KSg1a5BZKoJe3h3qj9X3MvB+vnUNlwpci/lOuX9adPeFnDrws/r9sfemPaCgBt/l/Us8nItNrXxn5gmJbR+d1kXCM15yJi87WEtT4HCgIDAlIcW7CNJpCpFzXlmUiZuTpXY9h0L3P1/9DlXWJ6UxR6Eka9lGj1h3gbBdw5XJNayBK6l5knJ75c3VxeMfA41IqIUfRBLqAJxTUAFirrc8GjSidiV2PrpxHD/vIDyqxi0CwSZHZneIXXKdQgElMsiWY7lv2ZYJRbz852fWqChfw8V7O8CmRHJeflh1n6bsJZJW15B0GdmNkd9rEcEEN9c02fOga7TRSa5J9qqm5mQK6ttlG3o20FKndVI0RGhhZ0QoJZiWB2E6EVN8GReTD++Q4tmgx+anuuTQYLlqIbPj0fiNMWruZYNaWBR7lQfGtCltKKoXpGrdsEsb78iI+dXE+PByx8SYCDE7YMosWquKmh38fWmtCWRExHFt6J+fOK7878sckHHUxk7dOZiMG6VJPl1M6s7RVupY4pG4KbEsXrIVmKJ2PMgZqR81XYynE68U6nfMgqjmpQKS+5rFiSdo9GtJr0g9EWmfCGX21fjpknlYAQ4LQMZxVpxCGUkeedmYL/GqnCnxtjZJ4m7M8/y8rkFZZ1HEy8m7h9/qg9sTYZEd+SuGny1fVkAXSsJO6xrQFyB4W5X+QY+dKANG78hoe1ZJqb7LqT4nlWM/49WvYLYLjxLvUEcDmySZFru6bT8XZangg+KyZQR73z0+f7IiRj/PuASJHhqcqirbnHPTDWfKrQu6dWrKHR5kcRlz5Dpnb0gBEPKIQrv5DXBVJRILmF23xJK0rUzUkwQ/L6pkq0Ty8GGXnfzba9DbTT4HHDUwuMOzyNOyuL3/r/ySX1m8qwdpWmnnoAAA==" clip-path="url(#c2)"/>
|
||||
</a><text x="400" y="400" text-anchor="middle" class="sponsorkit-tier-title">Backers</text><a href="https://polymorphic.dk" class="sponsorkit-link" target="_blank" id="polymorphicdk">
|
||||
|
||||
<clipPath id="c3">
|
||||
<rect x="372.5" y="425" width="25" height="25" rx="12.5" ry="12.5" />
|
||||
</clipPath>
|
||||
<image x="372.5" y="425" width="25" height="25" href="data:image/webp;base64,UklGRjYCAABXRUJQVlA4ICoCAADwCwCdASoyADIAPmUqkEWkIquZ/Z4AuAZEsYBfefuIopNZ6c4YXlAnC2/DzVHzOazQULy+IzbYtxgfWvdvZMf3fvpN64RGUtlBqaalSwhyxpsxwa2VBwP9czxhfRUkgHDC3n7wM35VAAD++cjP0J212mopM4/Rh0hOscBf9Z3H09zvnh+baFS5+i/jyZ8i0WlzZRzLr9W56mlBTdHVe7poj6YN27piHQHv4HFq8LNPFIaEo2UCdds7haNciUEC46JgnRrnv7x+SK2UmmeRCGWLE0tMvr9Lj7Msgwnee0YpKdP2gtm7UAQ6hAMR+/hIP28TYk/3Jc3oOFFIcOOAwbvtVofjEaORNOQj5vpSLYgA1YmU3MvsWKJiHK3wAxZSAEODjaEXSgWuFQDo/u4k0dv0NcRqX5vjk4COQg+LoZEOWWOnfY3J0rqmkONX0GtvUXQ1vhgSv0fst67tyvesub67hOcUmsPZCS2W/NVUshMelGBQ6+shQOlHXxNysIkuO9ciE/I5vxamqTWlG92zlO5w2IZIbq2x10b5KfSCjkFr/Lspe+4EXhtwhfaZOKBx8eESeBLmBmMMDoK+v1nSYACGfyvQ7ii2bxvOkchviukeoj4B7Q3i8cHNE2d+he9657d5nwMMJ1cubwm7umN5MGKk5B731r3aX3uCbazwf6lY5MQLnw7xU4XxGtQNkQEHQqsG5ajWgOeLm5upXvEKFTLc8trHi1L8A4pAAA==" clip-path="url(#c3)"/>
|
||||
</a>
|
||||
<a href="https://github.com/Kreism" class="sponsorkit-link" target="_blank" id="Kreism">
|
||||
|
||||
<clipPath id="c4">
|
||||
<rect x="402.5" y="425" width="25" height="25" rx="12.5" ry="12.5" />
|
||||
</clipPath>
|
||||
<image x="402.5" y="425" width="25" height="25" href="data:image/webp;base64,UklGRlAEAABXRUJQVlA4IEQEAAAQEwCdASoyADIAPm0wkkakIyGhKhzK6IANiUATpygqc9AuwDC76jadzy/+jFdrvoARipqP9l4STP6Jkfek45SHQI9T+wT+s2+cmrUBCJ9Mic9iBdMAlBmtbr3k3fO+bnxwdUPe9YN0drh6w7q4kO+jqNk0uEzUpkgTMYiFhrnVc9qKcB0G35IUcNmQFww80vxGnlkoIEV/s7YNLN7cVA0xQAD++ScfQpSJONSUqCMK+Ol5ZCh0b26aEtYQ7wo7d/iK4GFJ/Oln8/RBtU+uqnwhlmNv/XvVpC/PS5bd8Mbw8mdK7EK/bTtH2GXbGoqm+fSThwv9egzABKWJmjoyNIybs62ApVKMR1syEfaHs9rrVJa4Ku+3KznIaFb3nP3rKOJTl0JxjplCTw0qEoyER2/l8s9Fx7Wj27E7je+BerqTiLU2WKIiK6oWo6qxLj7DM4pmLTmy2HRcdZW4HbJKEvw2qtft+aVqnIpmkpHQ7gIUZB8YqXVLOuf479mRmJSRWUM8XDM+/ZHsiRjQLB8/63zHaV36axymJybL7DPubsyezxXHl3gW1oAHTPcn4dG6tghnVGt61bBjLL4xKpu+jhr9KGulx5hg9zz03dwj6wQGMzLoAS0KS1ootiTv7tSxN8h8BQKdViSfbkmzM/WQZgxko9b7T0mJ3RPfTsolRpzwAOjDjSkxnIA6VC2hoKAHSGYvW/ug0PznrxyLQlqs0eNgZM46ou98sNg2+VDv3Lc+ke9E7g3i9yt7ws/XeGzfyvfyZZlBCDKPStuncmbbhTf808x5SIglbQFAZGxHtRnUaqkoa8E4PlA6mlfzqRey1HGPP/oBPQe25l86Y71vr3eeZn2GcLFzKwjIaDNA9OMteOhej30/TXc+yBzpdTsWtQPyLo3IqXfdT5c8eyWgB4lmNJaOIgcTBCsZW/E/js1Iww91n/KKNlN9puBaomIKqdBj9FbL1nVpR97y+x9x7Vuw2LRI8xu8jNj73/Guv+NyuTRu6t7+QlUXob0HmqrdNuLf8HmZoRE6bv4f6MTQWWfGBSeT6vkpw9I2Qpz3NyC7sC4HMdPjh5JvW4J93BcKqA1N6Nw+bVRvl2ew47w+Kc2vN3IAj5IngbnUvDKEqQZgN+zQ/7BqM5d4YIk6vkyUxeXcAZ0pwBuwstcAJh0sx2PbQrT71ohYigAPz7xq1HAZ/mYsBogBIa5gO2HGgEFavUP9k+jD/GJZvLziNZzsbcX7YdjCdKTH0xwuEqiuufKzOaECClx4DsZuvipljXph50HXFc5XAfZgS+sQOZbpmb6Kf3mMjtfCCDW7efAAxeoPhCCHRcVOV3vJgGILkvW4p2k4VUrVyfDLJ3k9+AriK2tAZroSkIBkalglP1yJ4tYR22YS5slOQ3/CLnU0an8lFGOhWHQVw1CN0JCygQkClgJR4q5+ghh23OXWA/3HEAKNDvo3oAA=" clip-path="url(#c4)"/>
|
||||
</a><text x="400" y="485" text-anchor="middle" class="sponsorkit-tier-title">Past Sponsors</text><a href="https://github.com/marko-p" class="sponsorkit-link" target="_blank" id="marko-p">
|
||||
|
||||
<clipPath id="c5">
|
||||
<rect x="372.5" y="510" width="25" height="25" rx="12.5" ry="12.5" />
|
||||
</clipPath>
|
||||
<image x="372.5" y="510" width="25" height="25" href="data:image/webp;base64,UklGRl4BAABXRUJQVlA4IFIBAAAwCQCdASoyADIAPm00lEakIyIhLhkoAIANiUAYoZG41zSo4e3a0MDqVd5hvyUF1IEn9JgXObpn2Mt9prYfftYf4GRNRZ7hZ/fWD/6kU0akoeFYAP7mh/5A2Gfo2763tH9O1yC1D3TebcFfF/bO2z76334lot7jYxzsHcClMluiJtad5Z2A9ZtsHn0CgO1qVt/DcFFWwoCom7DWqiX/JeWTPmV7+u5ecLmedHJQ6jheSaRadpREwA9UiSGzpAggcCbnuZdKF5py6aWBIPoYdwJPwQTuDBoyC3glR90OjgWIADT7RZMYVBOeJZ0jA7g8++YxIx+GNqekY+gLy77edX+cDhTWBlwoSyzAKTVFGooGOFJwHGufQopr/cr1nMvbodaPTkzq9FZtdY+eVmTADFYRaCF0QDCX+qURMnt+yeGaWDzHEhEsTMeIJbGyRhUdMgAAAA==" clip-path="url(#c5)"/>
|
||||
</a>
|
||||
<a href="https://github.com/mrgirosky" class="sponsorkit-link" target="_blank" id="mrgirosky">
|
||||
|
||||
<clipPath id="c6">
|
||||
<rect x="402.5" y="510" width="25" height="25" rx="12.5" ry="12.5" />
|
||||
</clipPath>
|
||||
<image x="402.5" y="510" width="25" height="25" href="data:image/webp;base64,UklGRqoBAABXRUJQVlA4IJ4BAADwCwCdASoyADIAPm0wlUYkIyIhMBYJAIANiWYAy5x8BkkfdwjET0C9gJwHmAfqB0gPMB0EPOg6lXn2PaFvyUJKOZTATBzOiskTHqIVkrjKyrKQ96FyqvM1Gv1jQBXFMKi+U5hNm1EI8AD+8QHHdvGR1JUV2sahGaCbtFiJaByUNdMrLaM575u+kR44ggAKv3SXhizdVAvYYtYu0xpoP1QuZzHV05ERx1UDN3JJOZQA2eCKoCPnSiD3aW7Cp+XxYc07Q+Xfur3IkZX89Dy0NN7ogFFINEj83SaUWhjo7BEkmq5OUe8vjhUSout2T6n2+fwYwcD6/3bekvfYqCCWM1HLHyjGroEjvI40NzvNVty9uCAfSiHRL48OpEWqqoi85QWoAQLMK4WoSLcWsXpVCQCI88AiLHFkRtMAV4H+PUfk2ZsEzGSka1EFOtnn3npbU1/aitYgLuS4rcly4D0v9dMawDumQfY5uMacYPo6dkjOTJAdPQDXloB9LbiSBWrbcdnYyZZ/WOaAySoDhCCl3eQFOdBCSqnKG0gHZXAAAAA=" clip-path="url(#c6)"/>
|
||||
</a>
|
||||
</svg>
|
||||
|
After Width: | Height: | Size: 11 KiB |
@@ -0,0 +1,3 @@
|
||||
node_modules
|
||||
.env
|
||||
.cache.json
|
||||
Generated
+852
@@ -0,0 +1,852 @@
|
||||
{
|
||||
"name": "spoolman-sponsorkit",
|
||||
"lockfileVersion": 3,
|
||||
"requires": true,
|
||||
"packages": {
|
||||
"": {
|
||||
"name": "spoolman-sponsorkit",
|
||||
"devDependencies": {
|
||||
"sponsorkit": "18.0.0"
|
||||
}
|
||||
},
|
||||
"node_modules/@emnapi/runtime": {
|
||||
"version": "1.11.3",
|
||||
"resolved": "https://registry.npmjs.org/@emnapi/runtime/-/runtime-1.11.3.tgz",
|
||||
"integrity": "sha512-Xz4Tpyki7XyrpbUK1jR1AhdAdaXyhhY4lZ3neLodmhpuWfy2PAQN5B46sAiU4liOXGLkHypn/qU+jvfWSCYYLA==",
|
||||
"dev": true,
|
||||
"license": "MIT",
|
||||
"optional": true,
|
||||
"dependencies": {
|
||||
"tslib": "^2.4.0"
|
||||
}
|
||||
},
|
||||
"node_modules/@img/colour": {
|
||||
"version": "1.1.0",
|
||||
"resolved": "https://registry.npmjs.org/@img/colour/-/colour-1.1.0.tgz",
|
||||
"integrity": "sha512-Td76q7j57o/tLVdgS746cYARfSyxk8iEfRxewL9h4OMzYhbW4TAcppl0mT4eyqXddh6L/jwoM75mo7ixa/pCeQ==",
|
||||
"dev": true,
|
||||
"license": "MIT",
|
||||
"engines": {
|
||||
"node": ">=18"
|
||||
}
|
||||
},
|
||||
"node_modules/@img/sharp-darwin-arm64": {
|
||||
"version": "0.35.3",
|
||||
"resolved": "https://registry.npmjs.org/@img/sharp-darwin-arm64/-/sharp-darwin-arm64-0.35.3.tgz",
|
||||
"integrity": "sha512-RMnFX7YQsMoh7lWfcM4NEHHymBX/rLuKNPVM84XE9ONPcaSCDgE7CHIHpSgPcO2xcRthgBy1HfNO319mwhIAkg==",
|
||||
"cpu": [
|
||||
"arm64"
|
||||
],
|
||||
"dev": true,
|
||||
"license": "Apache-2.0",
|
||||
"optional": true,
|
||||
"os": [
|
||||
"darwin"
|
||||
],
|
||||
"engines": {
|
||||
"node": ">=20.9.0"
|
||||
},
|
||||
"funding": {
|
||||
"url": "https://opencollective.com/libvips"
|
||||
},
|
||||
"optionalDependencies": {
|
||||
"@img/sharp-libvips-darwin-arm64": "1.3.2"
|
||||
}
|
||||
},
|
||||
"node_modules/@img/sharp-darwin-x64": {
|
||||
"version": "0.35.3",
|
||||
"resolved": "https://registry.npmjs.org/@img/sharp-darwin-x64/-/sharp-darwin-x64-0.35.3.tgz",
|
||||
"integrity": "sha512-Xo+5uFBtLN0BKqieTxiFzFPQAUlBbbH5iBKyRX/z1JrbnYsHTfKJnUfL8+p2TPXr1pXqao4eeL4Rl144uDpK9w==",
|
||||
"cpu": [
|
||||
"x64"
|
||||
],
|
||||
"dev": true,
|
||||
"license": "Apache-2.0",
|
||||
"optional": true,
|
||||
"os": [
|
||||
"darwin"
|
||||
],
|
||||
"engines": {
|
||||
"node": ">=20.9.0"
|
||||
},
|
||||
"funding": {
|
||||
"url": "https://opencollective.com/libvips"
|
||||
},
|
||||
"optionalDependencies": {
|
||||
"@img/sharp-libvips-darwin-x64": "1.3.2"
|
||||
}
|
||||
},
|
||||
"node_modules/@img/sharp-freebsd-wasm32": {
|
||||
"version": "0.35.3",
|
||||
"resolved": "https://registry.npmjs.org/@img/sharp-freebsd-wasm32/-/sharp-freebsd-wasm32-0.35.3.tgz",
|
||||
"integrity": "sha512-lUxcqWIj2wMQ9BrwNjngcr1gWUr5xgaGThBRqPPalIC2n67Cqj1uPh8NnA/ZhAg8hUbKl+kVHKwgUIwe6ZYPrg==",
|
||||
"dev": true,
|
||||
"license": "Apache-2.0",
|
||||
"optional": true,
|
||||
"os": [
|
||||
"freebsd"
|
||||
],
|
||||
"dependencies": {
|
||||
"@img/sharp-wasm32": "0.35.3"
|
||||
},
|
||||
"engines": {
|
||||
"node": ">=20.9.0"
|
||||
},
|
||||
"funding": {
|
||||
"url": "https://opencollective.com/libvips"
|
||||
}
|
||||
},
|
||||
"node_modules/@img/sharp-libvips-darwin-arm64": {
|
||||
"version": "1.3.2",
|
||||
"resolved": "https://registry.npmjs.org/@img/sharp-libvips-darwin-arm64/-/sharp-libvips-darwin-arm64-1.3.2.tgz",
|
||||
"integrity": "sha512-9J6ypZFpQBj4YnePGoq/S38w6nz+vqg5WZLrLGY4YuSemdMq47GMLBPO42MzwdGwpg/agZ7xzZcFHa48xlywfg==",
|
||||
"cpu": [
|
||||
"arm64"
|
||||
],
|
||||
"dev": true,
|
||||
"license": "LGPL-3.0-or-later",
|
||||
"optional": true,
|
||||
"os": [
|
||||
"darwin"
|
||||
],
|
||||
"funding": {
|
||||
"url": "https://opencollective.com/libvips"
|
||||
}
|
||||
},
|
||||
"node_modules/@img/sharp-libvips-darwin-x64": {
|
||||
"version": "1.3.2",
|
||||
"resolved": "https://registry.npmjs.org/@img/sharp-libvips-darwin-x64/-/sharp-libvips-darwin-x64-1.3.2.tgz",
|
||||
"integrity": "sha512-m2pW1n6cns9VaubNwsZ+c3CRYjxNQWgJ5gPlnL1nbBcpkBvFm6SCFN5o0psFHI8w9n11NKhFkeEDns98tiqbEw==",
|
||||
"cpu": [
|
||||
"x64"
|
||||
],
|
||||
"dev": true,
|
||||
"license": "LGPL-3.0-or-later",
|
||||
"optional": true,
|
||||
"os": [
|
||||
"darwin"
|
||||
],
|
||||
"funding": {
|
||||
"url": "https://opencollective.com/libvips"
|
||||
}
|
||||
},
|
||||
"node_modules/@img/sharp-libvips-linux-arm": {
|
||||
"version": "1.3.2",
|
||||
"resolved": "https://registry.npmjs.org/@img/sharp-libvips-linux-arm/-/sharp-libvips-linux-arm-1.3.2.tgz",
|
||||
"integrity": "sha512-1eMLzy92I4J6rmi4mAT8yC3HxOtniyGELlzGbNMLLeqe052ahFQ0h6LFq+lh5DsDIdYViIDst08abvSbcEdLXQ==",
|
||||
"cpu": [
|
||||
"arm"
|
||||
],
|
||||
"dev": true,
|
||||
"license": "LGPL-3.0-or-later",
|
||||
"optional": true,
|
||||
"os": [
|
||||
"linux"
|
||||
],
|
||||
"funding": {
|
||||
"url": "https://opencollective.com/libvips"
|
||||
}
|
||||
},
|
||||
"node_modules/@img/sharp-libvips-linux-arm64": {
|
||||
"version": "1.3.2",
|
||||
"resolved": "https://registry.npmjs.org/@img/sharp-libvips-linux-arm64/-/sharp-libvips-linux-arm64-1.3.2.tgz",
|
||||
"integrity": "sha512-dqVSFynCox4C/J8kT16V7SIFAns0IjgLwkvYT7p8LQVmJ5OS5b6tI9IGflxTeuBS//zXeFIUbwt5dwxyZ17cnA==",
|
||||
"cpu": [
|
||||
"arm64"
|
||||
],
|
||||
"dev": true,
|
||||
"license": "LGPL-3.0-or-later",
|
||||
"optional": true,
|
||||
"os": [
|
||||
"linux"
|
||||
],
|
||||
"funding": {
|
||||
"url": "https://opencollective.com/libvips"
|
||||
}
|
||||
},
|
||||
"node_modules/@img/sharp-libvips-linux-ppc64": {
|
||||
"version": "1.3.2",
|
||||
"resolved": "https://registry.npmjs.org/@img/sharp-libvips-linux-ppc64/-/sharp-libvips-linux-ppc64-1.3.2.tgz",
|
||||
"integrity": "sha512-3z0NHDxD6n5I9gc05U1eW1AyRm+Gznzq3naMrthPNqE6oYykcogW0l/jfpJdjYnuNl8R7yI9pNbE1XiUeyq0Aw==",
|
||||
"cpu": [
|
||||
"ppc64"
|
||||
],
|
||||
"dev": true,
|
||||
"license": "LGPL-3.0-or-later",
|
||||
"optional": true,
|
||||
"os": [
|
||||
"linux"
|
||||
],
|
||||
"funding": {
|
||||
"url": "https://opencollective.com/libvips"
|
||||
}
|
||||
},
|
||||
"node_modules/@img/sharp-libvips-linux-riscv64": {
|
||||
"version": "1.3.2",
|
||||
"resolved": "https://registry.npmjs.org/@img/sharp-libvips-linux-riscv64/-/sharp-libvips-linux-riscv64-1.3.2.tgz",
|
||||
"integrity": "sha512-bsb4rI+NldGOsXuej2r8OdSS8+zXDVaCWxyWrcv6kneTOlgAHtZABRzBBCwdsPiD90J4myNJuHpg6kA20ImW/w==",
|
||||
"cpu": [
|
||||
"riscv64"
|
||||
],
|
||||
"dev": true,
|
||||
"license": "LGPL-3.0-or-later",
|
||||
"optional": true,
|
||||
"os": [
|
||||
"linux"
|
||||
],
|
||||
"funding": {
|
||||
"url": "https://opencollective.com/libvips"
|
||||
}
|
||||
},
|
||||
"node_modules/@img/sharp-libvips-linux-s390x": {
|
||||
"version": "1.3.2",
|
||||
"resolved": "https://registry.npmjs.org/@img/sharp-libvips-linux-s390x/-/sharp-libvips-linux-s390x-1.3.2.tgz",
|
||||
"integrity": "sha512-/ABshyj8gCpyIrNXnHn4LorDJ0HHm1VhXPBlxZ8zAtfVPAaSafXPGn+sUSIRiwaSBy0mmFjSjiXI5mkcwdChKQ==",
|
||||
"cpu": [
|
||||
"s390x"
|
||||
],
|
||||
"dev": true,
|
||||
"license": "LGPL-3.0-or-later",
|
||||
"optional": true,
|
||||
"os": [
|
||||
"linux"
|
||||
],
|
||||
"funding": {
|
||||
"url": "https://opencollective.com/libvips"
|
||||
}
|
||||
},
|
||||
"node_modules/@img/sharp-libvips-linux-x64": {
|
||||
"version": "1.3.2",
|
||||
"resolved": "https://registry.npmjs.org/@img/sharp-libvips-linux-x64/-/sharp-libvips-linux-x64-1.3.2.tgz",
|
||||
"integrity": "sha512-ITPEtgffGJ0S6G9dRyw/366tJQqFRcHWPHhC+Stpg3Z8AEMrDrTr2lhdz4f/Y/HMbRh//7Z5mBzEpVdi62Oc3w==",
|
||||
"cpu": [
|
||||
"x64"
|
||||
],
|
||||
"dev": true,
|
||||
"license": "LGPL-3.0-or-later",
|
||||
"optional": true,
|
||||
"os": [
|
||||
"linux"
|
||||
],
|
||||
"funding": {
|
||||
"url": "https://opencollective.com/libvips"
|
||||
}
|
||||
},
|
||||
"node_modules/@img/sharp-libvips-linuxmusl-arm64": {
|
||||
"version": "1.3.2",
|
||||
"resolved": "https://registry.npmjs.org/@img/sharp-libvips-linuxmusl-arm64/-/sharp-libvips-linuxmusl-arm64-1.3.2.tgz",
|
||||
"integrity": "sha512-zE9EdiUzUmg5mDT5a1rk5fYJ6GWPloTwWBYDS14naqHsL+EaMpDj1AWnpLgh3u0YCORv2Tt50wrcrpYqkP97Kw==",
|
||||
"cpu": [
|
||||
"arm64"
|
||||
],
|
||||
"dev": true,
|
||||
"license": "LGPL-3.0-or-later",
|
||||
"optional": true,
|
||||
"os": [
|
||||
"linux"
|
||||
],
|
||||
"funding": {
|
||||
"url": "https://opencollective.com/libvips"
|
||||
}
|
||||
},
|
||||
"node_modules/@img/sharp-libvips-linuxmusl-x64": {
|
||||
"version": "1.3.2",
|
||||
"resolved": "https://registry.npmjs.org/@img/sharp-libvips-linuxmusl-x64/-/sharp-libvips-linuxmusl-x64-1.3.2.tgz",
|
||||
"integrity": "sha512-m0lrLiUt+lBYnCFr8qV/65yMR4E/c7/wf78I5eKTdkEakFAlZ9QlzEM3QIhhAwVeUhLAHLcCq7a7Vszq/oFNZQ==",
|
||||
"cpu": [
|
||||
"x64"
|
||||
],
|
||||
"dev": true,
|
||||
"license": "LGPL-3.0-or-later",
|
||||
"optional": true,
|
||||
"os": [
|
||||
"linux"
|
||||
],
|
||||
"funding": {
|
||||
"url": "https://opencollective.com/libvips"
|
||||
}
|
||||
},
|
||||
"node_modules/@img/sharp-linux-arm": {
|
||||
"version": "0.35.3",
|
||||
"resolved": "https://registry.npmjs.org/@img/sharp-linux-arm/-/sharp-linux-arm-0.35.3.tgz",
|
||||
"integrity": "sha512-affVWCTLooy8TSxbDx2qkzuDeaWLNVBA+P//FNBirHsXpP2fuBhk5AuboYUnrDnzoXes8GFjpTx0SBFOCRg+FA==",
|
||||
"cpu": [
|
||||
"arm"
|
||||
],
|
||||
"dev": true,
|
||||
"license": "Apache-2.0",
|
||||
"optional": true,
|
||||
"os": [
|
||||
"linux"
|
||||
],
|
||||
"engines": {
|
||||
"node": ">=20.9.0"
|
||||
},
|
||||
"funding": {
|
||||
"url": "https://opencollective.com/libvips"
|
||||
},
|
||||
"optionalDependencies": {
|
||||
"@img/sharp-libvips-linux-arm": "1.3.2"
|
||||
}
|
||||
},
|
||||
"node_modules/@img/sharp-linux-arm64": {
|
||||
"version": "0.35.3",
|
||||
"resolved": "https://registry.npmjs.org/@img/sharp-linux-arm64/-/sharp-linux-arm64-0.35.3.tgz",
|
||||
"integrity": "sha512-QgKDspHPnrU+GQ55XPhGwyhC8acLVOOSyAvo1oVfFmrIXLkDNmGWzAfDZ4xK8oSA1qBQrALcHX0G5UZni/SuFQ==",
|
||||
"cpu": [
|
||||
"arm64"
|
||||
],
|
||||
"dev": true,
|
||||
"license": "Apache-2.0",
|
||||
"optional": true,
|
||||
"os": [
|
||||
"linux"
|
||||
],
|
||||
"engines": {
|
||||
"node": ">=20.9.0"
|
||||
},
|
||||
"funding": {
|
||||
"url": "https://opencollective.com/libvips"
|
||||
},
|
||||
"optionalDependencies": {
|
||||
"@img/sharp-libvips-linux-arm64": "1.3.2"
|
||||
}
|
||||
},
|
||||
"node_modules/@img/sharp-linux-ppc64": {
|
||||
"version": "0.35.3",
|
||||
"resolved": "https://registry.npmjs.org/@img/sharp-linux-ppc64/-/sharp-linux-ppc64-0.35.3.tgz",
|
||||
"integrity": "sha512-sMd8rDxmpLOwv/7N44klFjOD5DUO7FLdjiXDI0hoxYaf7Ar262dQIEkosE98bps+5HPLtp/EvNqeqQtOycP/IA==",
|
||||
"cpu": [
|
||||
"ppc64"
|
||||
],
|
||||
"dev": true,
|
||||
"license": "Apache-2.0",
|
||||
"optional": true,
|
||||
"os": [
|
||||
"linux"
|
||||
],
|
||||
"engines": {
|
||||
"node": ">=20.9.0"
|
||||
},
|
||||
"funding": {
|
||||
"url": "https://opencollective.com/libvips"
|
||||
},
|
||||
"optionalDependencies": {
|
||||
"@img/sharp-libvips-linux-ppc64": "1.3.2"
|
||||
}
|
||||
},
|
||||
"node_modules/@img/sharp-linux-riscv64": {
|
||||
"version": "0.35.3",
|
||||
"resolved": "https://registry.npmjs.org/@img/sharp-linux-riscv64/-/sharp-linux-riscv64-0.35.3.tgz",
|
||||
"integrity": "sha512-0Eob78yjlYPfL5vMNWAW55l3R9Y6BQS/gOfe0ZcP9mEz9ohhKSt4im1hayiknXgf8AWrFqMvJcKIdmLmEe7yeQ==",
|
||||
"cpu": [
|
||||
"riscv64"
|
||||
],
|
||||
"dev": true,
|
||||
"license": "Apache-2.0",
|
||||
"optional": true,
|
||||
"os": [
|
||||
"linux"
|
||||
],
|
||||
"engines": {
|
||||
"node": ">=20.9.0"
|
||||
},
|
||||
"funding": {
|
||||
"url": "https://opencollective.com/libvips"
|
||||
},
|
||||
"optionalDependencies": {
|
||||
"@img/sharp-libvips-linux-riscv64": "1.3.2"
|
||||
}
|
||||
},
|
||||
"node_modules/@img/sharp-linux-s390x": {
|
||||
"version": "0.35.3",
|
||||
"resolved": "https://registry.npmjs.org/@img/sharp-linux-s390x/-/sharp-linux-s390x-0.35.3.tgz",
|
||||
"integrity": "sha512-KgAxQ0DxpNOq1rG2t5cgTgShJFGSuU7XO45cqC+1NVOuZnP6tlgZRuSYOfNupGkHID0o3cJOsw4DVeJpMovcGw==",
|
||||
"cpu": [
|
||||
"s390x"
|
||||
],
|
||||
"dev": true,
|
||||
"license": "Apache-2.0",
|
||||
"optional": true,
|
||||
"os": [
|
||||
"linux"
|
||||
],
|
||||
"engines": {
|
||||
"node": ">=20.9.0"
|
||||
},
|
||||
"funding": {
|
||||
"url": "https://opencollective.com/libvips"
|
||||
},
|
||||
"optionalDependencies": {
|
||||
"@img/sharp-libvips-linux-s390x": "1.3.2"
|
||||
}
|
||||
},
|
||||
"node_modules/@img/sharp-linux-x64": {
|
||||
"version": "0.35.3",
|
||||
"resolved": "https://registry.npmjs.org/@img/sharp-linux-x64/-/sharp-linux-x64-0.35.3.tgz",
|
||||
"integrity": "sha512-8pqvxubL2PGdhlPy6GLqzDYMUjyRmKAwKHYKixpdJYBUK7PJ0C029XdsnpFIdgRZG68fZiGdHVWcKPvtiPB4cA==",
|
||||
"cpu": [
|
||||
"x64"
|
||||
],
|
||||
"dev": true,
|
||||
"license": "Apache-2.0",
|
||||
"optional": true,
|
||||
"os": [
|
||||
"linux"
|
||||
],
|
||||
"engines": {
|
||||
"node": ">=20.9.0"
|
||||
},
|
||||
"funding": {
|
||||
"url": "https://opencollective.com/libvips"
|
||||
},
|
||||
"optionalDependencies": {
|
||||
"@img/sharp-libvips-linux-x64": "1.3.2"
|
||||
}
|
||||
},
|
||||
"node_modules/@img/sharp-linuxmusl-arm64": {
|
||||
"version": "0.35.3",
|
||||
"resolved": "https://registry.npmjs.org/@img/sharp-linuxmusl-arm64/-/sharp-linuxmusl-arm64-0.35.3.tgz",
|
||||
"integrity": "sha512-Vz0iQjzzcSX3HCbfwFfCSG/9SCIqyO0mH2sXyiHaAYfBk0cRsCWXRyQYX0ovCK/PAQBbTzQ0dsPQHh5MAFL59w==",
|
||||
"cpu": [
|
||||
"arm64"
|
||||
],
|
||||
"dev": true,
|
||||
"license": "Apache-2.0",
|
||||
"optional": true,
|
||||
"os": [
|
||||
"linux"
|
||||
],
|
||||
"engines": {
|
||||
"node": ">=20.9.0"
|
||||
},
|
||||
"funding": {
|
||||
"url": "https://opencollective.com/libvips"
|
||||
},
|
||||
"optionalDependencies": {
|
||||
"@img/sharp-libvips-linuxmusl-arm64": "1.3.2"
|
||||
}
|
||||
},
|
||||
"node_modules/@img/sharp-linuxmusl-x64": {
|
||||
"version": "0.35.3",
|
||||
"resolved": "https://registry.npmjs.org/@img/sharp-linuxmusl-x64/-/sharp-linuxmusl-x64-0.35.3.tgz",
|
||||
"integrity": "sha512-6O1NPKcDVj9QEdg7Hx549EX8U0rp6yXQERqru6yRN7fGBn32UvIRJUlWnk+8xDCiG76hXVBbX82NZ/ZKr0euIg==",
|
||||
"cpu": [
|
||||
"x64"
|
||||
],
|
||||
"dev": true,
|
||||
"license": "Apache-2.0",
|
||||
"optional": true,
|
||||
"os": [
|
||||
"linux"
|
||||
],
|
||||
"engines": {
|
||||
"node": ">=20.9.0"
|
||||
},
|
||||
"funding": {
|
||||
"url": "https://opencollective.com/libvips"
|
||||
},
|
||||
"optionalDependencies": {
|
||||
"@img/sharp-libvips-linuxmusl-x64": "1.3.2"
|
||||
}
|
||||
},
|
||||
"node_modules/@img/sharp-wasm32": {
|
||||
"version": "0.35.3",
|
||||
"resolved": "https://registry.npmjs.org/@img/sharp-wasm32/-/sharp-wasm32-0.35.3.tgz",
|
||||
"integrity": "sha512-cZ0XkcYGpHZkqW6iCkqTcmUC0CD9DhD5d/qeZlZkfRBn6GnHniZXLUo5+9xw8Iv76YE6LQFN9YNBlKREcCG76w==",
|
||||
"dev": true,
|
||||
"license": "Apache-2.0 AND LGPL-3.0-or-later AND MIT",
|
||||
"optional": true,
|
||||
"dependencies": {
|
||||
"@emnapi/runtime": "^1.11.1"
|
||||
},
|
||||
"engines": {
|
||||
"node": ">=20.9.0"
|
||||
},
|
||||
"funding": {
|
||||
"url": "https://opencollective.com/libvips"
|
||||
}
|
||||
},
|
||||
"node_modules/@img/sharp-webcontainers-wasm32": {
|
||||
"version": "0.35.3",
|
||||
"resolved": "https://registry.npmjs.org/@img/sharp-webcontainers-wasm32/-/sharp-webcontainers-wasm32-0.35.3.tgz",
|
||||
"integrity": "sha512-2rnq7bX3NzeR2T4YWgz8qiG4h3TSdMe+vN1iQXpJleSJ3SM5zQ8Fy2SyyXAWlbxpEZ2Y+Z4u1BePgJEYbSy80Q==",
|
||||
"cpu": [
|
||||
"wasm32"
|
||||
],
|
||||
"dev": true,
|
||||
"license": "Apache-2.0",
|
||||
"optional": true,
|
||||
"dependencies": {
|
||||
"@img/sharp-wasm32": "0.35.3"
|
||||
},
|
||||
"engines": {
|
||||
"node": ">=20.9.0"
|
||||
},
|
||||
"funding": {
|
||||
"url": "https://opencollective.com/libvips"
|
||||
}
|
||||
},
|
||||
"node_modules/@img/sharp-win32-arm64": {
|
||||
"version": "0.35.3",
|
||||
"resolved": "https://registry.npmjs.org/@img/sharp-win32-arm64/-/sharp-win32-arm64-0.35.3.tgz",
|
||||
"integrity": "sha512-4bPwFdMbeC4JQ8L8LOyWp6nsHcboP5fxkp6iPOXz2Vg49R42TuMs2whkJ5OAP4/Ul035qOzy0AecOF9VOscn4w==",
|
||||
"cpu": [
|
||||
"arm64"
|
||||
],
|
||||
"dev": true,
|
||||
"license": "Apache-2.0 AND LGPL-3.0-or-later",
|
||||
"optional": true,
|
||||
"os": [
|
||||
"win32"
|
||||
],
|
||||
"engines": {
|
||||
"node": ">=20.9.0"
|
||||
},
|
||||
"funding": {
|
||||
"url": "https://opencollective.com/libvips"
|
||||
}
|
||||
},
|
||||
"node_modules/@img/sharp-win32-ia32": {
|
||||
"version": "0.35.3",
|
||||
"resolved": "https://registry.npmjs.org/@img/sharp-win32-ia32/-/sharp-win32-ia32-0.35.3.tgz",
|
||||
"integrity": "sha512-r53mXsBN6lFUDiST764SvgwUdHAqM4rPAiDzAmf4fLoB6X/rkfyTrLCg6+g17wJJiCmB3JYgHuUldCWUIRFSXw==",
|
||||
"cpu": [
|
||||
"ia32"
|
||||
],
|
||||
"dev": true,
|
||||
"license": "Apache-2.0 AND LGPL-3.0-or-later",
|
||||
"optional": true,
|
||||
"os": [
|
||||
"win32"
|
||||
],
|
||||
"engines": {
|
||||
"node": "^20.9.0"
|
||||
},
|
||||
"funding": {
|
||||
"url": "https://opencollective.com/libvips"
|
||||
}
|
||||
},
|
||||
"node_modules/@img/sharp-win32-x64": {
|
||||
"version": "0.35.3",
|
||||
"resolved": "https://registry.npmjs.org/@img/sharp-win32-x64/-/sharp-win32-x64-0.35.3.tgz",
|
||||
"integrity": "sha512-D4y1vNeZrIIJCN+uHaWVtH86B+aCrdMYYjicy9pXHvbGZeGYLLSd3wdVuC37FxVXlU1ARsk84eKWfWMXGYEqvA==",
|
||||
"cpu": [
|
||||
"x64"
|
||||
],
|
||||
"dev": true,
|
||||
"license": "Apache-2.0 AND LGPL-3.0-or-later",
|
||||
"optional": true,
|
||||
"os": [
|
||||
"win32"
|
||||
],
|
||||
"engines": {
|
||||
"node": ">=20.9.0"
|
||||
},
|
||||
"funding": {
|
||||
"url": "https://opencollective.com/libvips"
|
||||
}
|
||||
},
|
||||
"node_modules/@quansync/fs": {
|
||||
"version": "1.0.0",
|
||||
"resolved": "https://registry.npmjs.org/@quansync/fs/-/fs-1.0.0.tgz",
|
||||
"integrity": "sha512-4TJ3DFtlf1L5LDMaM6CanJ/0lckGNtJcMjQ1NAV6zDmA0tEHKZtxNKin8EgPaVX1YzljbxckyT2tJrpQKAtngQ==",
|
||||
"dev": true,
|
||||
"license": "MIT",
|
||||
"dependencies": {
|
||||
"quansync": "^1.0.0"
|
||||
},
|
||||
"funding": {
|
||||
"url": "https://github.com/sponsors/sxzz"
|
||||
}
|
||||
},
|
||||
"node_modules/ansis": {
|
||||
"version": "4.3.1",
|
||||
"resolved": "https://registry.npmjs.org/ansis/-/ansis-4.3.1.tgz",
|
||||
"integrity": "sha512-BJ8/l4R5LRE7hW9WdSuGYrLSHi2ynxeFpDFbH0K/CgNeY/tyhk+vO6TYxXC5r5CpUhNVX310xzPsN/H9lCdfOA==",
|
||||
"dev": true,
|
||||
"license": "ISC",
|
||||
"engines": {
|
||||
"node": ">=14"
|
||||
}
|
||||
},
|
||||
"node_modules/cac": {
|
||||
"version": "7.0.0",
|
||||
"resolved": "https://registry.npmjs.org/cac/-/cac-7.0.0.tgz",
|
||||
"integrity": "sha512-tixWYgm5ZoOD+3g6UTea91eow5z6AAHaho3g0V9CNSNb45gM8SmflpAc+GRd1InC4AqN/07Unrgp56Y94N9hJQ==",
|
||||
"dev": true,
|
||||
"license": "MIT",
|
||||
"engines": {
|
||||
"node": ">=20.19.0"
|
||||
}
|
||||
},
|
||||
"node_modules/consola": {
|
||||
"version": "3.4.2",
|
||||
"resolved": "https://registry.npmjs.org/consola/-/consola-3.4.2.tgz",
|
||||
"integrity": "sha512-5IKcdX0nnYavi6G7TtOhwkYzyjfJlatbjMjuLSfE2kYT5pMDOilZ4OvMhi637CcDICTmz3wARPoyhqyX1Y+XvA==",
|
||||
"dev": true,
|
||||
"license": "MIT",
|
||||
"engines": {
|
||||
"node": "^14.18.0 || >=16.10.0"
|
||||
}
|
||||
},
|
||||
"node_modules/d3-hierarchy": {
|
||||
"version": "3.1.2",
|
||||
"resolved": "https://registry.npmjs.org/d3-hierarchy/-/d3-hierarchy-3.1.2.tgz",
|
||||
"integrity": "sha512-FX/9frcub54beBdugHjDCdikxThEqjnR93Qt7PvQTOHxyiNCAlvMrHhclk3cD5VeAaq9fxmfRp+CnWw9rEMBuA==",
|
||||
"dev": true,
|
||||
"license": "ISC",
|
||||
"engines": {
|
||||
"node": ">=12"
|
||||
}
|
||||
},
|
||||
"node_modules/defu": {
|
||||
"version": "6.1.7",
|
||||
"resolved": "https://registry.npmjs.org/defu/-/defu-6.1.7.tgz",
|
||||
"integrity": "sha512-7z22QmUWiQ/2d0KkdYmANbRUVABpZ9SNYyH5vx6PZ+nE5bcC0l7uFvEfHlyld/HcGBFTL536ClDt3DEcSlEJAQ==",
|
||||
"dev": true,
|
||||
"license": "MIT"
|
||||
},
|
||||
"node_modules/destr": {
|
||||
"version": "2.0.5",
|
||||
"resolved": "https://registry.npmjs.org/destr/-/destr-2.0.5.tgz",
|
||||
"integrity": "sha512-ugFTXCtDZunbzasqBxrK93Ik/DRYsO6S/fedkWEMKqt04xZ4csmnmwGDBAb07QWNaGMAmnTIemsYZCksjATwsA==",
|
||||
"dev": true,
|
||||
"license": "MIT"
|
||||
},
|
||||
"node_modules/detect-libc": {
|
||||
"version": "2.1.2",
|
||||
"resolved": "https://registry.npmjs.org/detect-libc/-/detect-libc-2.1.2.tgz",
|
||||
"integrity": "sha512-Btj2BOOO83o3WyH59e8MgXsxEQVcarkUOpEYrubB0urwnN10yQ364rsiByU11nZlqWYZm05i/of7io4mzihBtQ==",
|
||||
"dev": true,
|
||||
"license": "Apache-2.0",
|
||||
"engines": {
|
||||
"node": ">=8"
|
||||
}
|
||||
},
|
||||
"node_modules/jiti": {
|
||||
"version": "2.7.0",
|
||||
"resolved": "https://registry.npmjs.org/jiti/-/jiti-2.7.0.tgz",
|
||||
"integrity": "sha512-AC/7JofJvZGrrneWNaEnJeOLUx+JlGt7tNa0wZiRPT4MY1wmfKjt2+6O2p2uz2+skll8OZZmJMNqeke7kKbNgQ==",
|
||||
"dev": true,
|
||||
"license": "MIT",
|
||||
"bin": {
|
||||
"jiti": "lib/jiti-cli.mjs"
|
||||
}
|
||||
},
|
||||
"node_modules/node-fetch-native": {
|
||||
"version": "1.6.7",
|
||||
"resolved": "https://registry.npmjs.org/node-fetch-native/-/node-fetch-native-1.6.7.tgz",
|
||||
"integrity": "sha512-g9yhqoedzIUm0nTnTqAQvueMPVOuIY16bqgAJJC8XOOubYFNwz6IER9qs0Gq2Xd0+CecCKFjtdDTMA4u4xG06Q==",
|
||||
"dev": true,
|
||||
"license": "MIT"
|
||||
},
|
||||
"node_modules/normalize-url": {
|
||||
"version": "9.0.1",
|
||||
"resolved": "https://registry.npmjs.org/normalize-url/-/normalize-url-9.0.1.tgz",
|
||||
"integrity": "sha512-ARftfC5HdUNu9jJeL8pHj8debUIHA2b91FizCoMzY4lG6dDX13jdvTK0TBe24IBDRf2HvJSzzwEPvmbkQWHRSg==",
|
||||
"dev": true,
|
||||
"license": "MIT",
|
||||
"engines": {
|
||||
"node": ">=20"
|
||||
},
|
||||
"funding": {
|
||||
"url": "https://github.com/sponsors/sindresorhus"
|
||||
}
|
||||
},
|
||||
"node_modules/ofetch": {
|
||||
"version": "1.5.1",
|
||||
"resolved": "https://registry.npmjs.org/ofetch/-/ofetch-1.5.1.tgz",
|
||||
"integrity": "sha512-2W4oUZlVaqAPAil6FUg/difl6YhqhUR7x2eZY4bQCko22UXg3hptq9KLQdqFClV+Wu85UX7hNtdGTngi/1BxcA==",
|
||||
"dev": true,
|
||||
"license": "MIT",
|
||||
"dependencies": {
|
||||
"destr": "^2.0.5",
|
||||
"node-fetch-native": "^1.6.7",
|
||||
"ufo": "^1.6.1"
|
||||
}
|
||||
},
|
||||
"node_modules/p-limit": {
|
||||
"version": "7.3.1",
|
||||
"resolved": "https://registry.npmjs.org/p-limit/-/p-limit-7.3.1.tgz",
|
||||
"integrity": "sha512-0trZaiG7Y7kN/Egy9a8j47t9osC0Tch4PaIWd9yGF6bvmlk7muExRvGNYb8sXBwEKMoNKsbNN9P8EefuQekE4Q==",
|
||||
"dev": true,
|
||||
"license": "MIT",
|
||||
"dependencies": {
|
||||
"yocto-queue": "^1.2.1"
|
||||
},
|
||||
"engines": {
|
||||
"node": ">=20"
|
||||
},
|
||||
"funding": {
|
||||
"url": "https://github.com/sponsors/sindresorhus"
|
||||
}
|
||||
},
|
||||
"node_modules/quansync": {
|
||||
"version": "1.0.0",
|
||||
"resolved": "https://registry.npmjs.org/quansync/-/quansync-1.0.0.tgz",
|
||||
"integrity": "sha512-5xZacEEufv3HSTPQuchrvV6soaiACMFnq1H8wkVioctoH3TRha9Sz66lOxRwPK/qZj7HPiSveih9yAyh98gvqA==",
|
||||
"dev": true,
|
||||
"funding": [
|
||||
{
|
||||
"type": "individual",
|
||||
"url": "https://github.com/sponsors/antfu"
|
||||
},
|
||||
{
|
||||
"type": "individual",
|
||||
"url": "https://github.com/sponsors/sxzz"
|
||||
}
|
||||
],
|
||||
"license": "MIT"
|
||||
},
|
||||
"node_modules/semver": {
|
||||
"version": "7.8.5",
|
||||
"resolved": "https://registry.npmjs.org/semver/-/semver-7.8.5.tgz",
|
||||
"integrity": "sha512-Y7/KDsb8LjooZpwaqGyulO6DQlksgCncchHGk+sZIY4SBvUocMBEFH5Ur1fI4dV+Jvl0w6cjvucaIi40puRioA==",
|
||||
"dev": true,
|
||||
"license": "ISC",
|
||||
"bin": {
|
||||
"semver": "bin/semver.js"
|
||||
},
|
||||
"engines": {
|
||||
"node": ">=10"
|
||||
}
|
||||
},
|
||||
"node_modules/sharp": {
|
||||
"version": "0.35.3",
|
||||
"resolved": "https://registry.npmjs.org/sharp/-/sharp-0.35.3.tgz",
|
||||
"integrity": "sha512-ej0zVHuZGHCiABXcNxeYhpRnPNPAcvbG8RMdBAhDAxLKkCRVSpK3Iyu7qbqw3JMzoj0REeM6f3tJLtVwl0023Q==",
|
||||
"dev": true,
|
||||
"license": "Apache-2.0",
|
||||
"dependencies": {
|
||||
"@img/colour": "^1.1.0",
|
||||
"detect-libc": "^2.1.2",
|
||||
"semver": "^7.8.5"
|
||||
},
|
||||
"engines": {
|
||||
"node": ">=20.9.0"
|
||||
},
|
||||
"funding": {
|
||||
"url": "https://opencollective.com/libvips"
|
||||
},
|
||||
"optionalDependencies": {
|
||||
"@img/sharp-darwin-arm64": "0.35.3",
|
||||
"@img/sharp-darwin-x64": "0.35.3",
|
||||
"@img/sharp-freebsd-wasm32": "0.35.3",
|
||||
"@img/sharp-libvips-darwin-arm64": "1.3.2",
|
||||
"@img/sharp-libvips-darwin-x64": "1.3.2",
|
||||
"@img/sharp-libvips-linux-arm": "1.3.2",
|
||||
"@img/sharp-libvips-linux-arm64": "1.3.2",
|
||||
"@img/sharp-libvips-linux-ppc64": "1.3.2",
|
||||
"@img/sharp-libvips-linux-riscv64": "1.3.2",
|
||||
"@img/sharp-libvips-linux-s390x": "1.3.2",
|
||||
"@img/sharp-libvips-linux-x64": "1.3.2",
|
||||
"@img/sharp-libvips-linuxmusl-arm64": "1.3.2",
|
||||
"@img/sharp-libvips-linuxmusl-x64": "1.3.2",
|
||||
"@img/sharp-linux-arm": "0.35.3",
|
||||
"@img/sharp-linux-arm64": "0.35.3",
|
||||
"@img/sharp-linux-ppc64": "0.35.3",
|
||||
"@img/sharp-linux-riscv64": "0.35.3",
|
||||
"@img/sharp-linux-s390x": "0.35.3",
|
||||
"@img/sharp-linux-x64": "0.35.3",
|
||||
"@img/sharp-linuxmusl-arm64": "0.35.3",
|
||||
"@img/sharp-linuxmusl-x64": "0.35.3",
|
||||
"@img/sharp-webcontainers-wasm32": "0.35.3",
|
||||
"@img/sharp-win32-arm64": "0.35.3",
|
||||
"@img/sharp-win32-ia32": "0.35.3",
|
||||
"@img/sharp-win32-x64": "0.35.3"
|
||||
},
|
||||
"peerDependenciesMeta": {
|
||||
"@types/node": {
|
||||
"optional": true
|
||||
}
|
||||
}
|
||||
},
|
||||
"node_modules/sponsorkit": {
|
||||
"version": "18.0.0",
|
||||
"resolved": "https://registry.npmjs.org/sponsorkit/-/sponsorkit-18.0.0.tgz",
|
||||
"integrity": "sha512-9Jr+n4SjU8Qtldq8i0UlwwqBEAVy5JFbIQNXRUIs1N+LPTCnX2/of5oyHYftCLi3KxAODVMmyEdWqkJMTagR6w==",
|
||||
"dev": true,
|
||||
"license": "MIT",
|
||||
"dependencies": {
|
||||
"ansis": "^4.3.1",
|
||||
"cac": "^7.0.0",
|
||||
"consola": "^3.4.2",
|
||||
"d3-hierarchy": "^3.1.2",
|
||||
"normalize-url": "^9.0.1",
|
||||
"ofetch": "^1.5.1",
|
||||
"p-limit": "^7.3.1",
|
||||
"sharp": "^0.35.3",
|
||||
"unconfig": "^7.5.0"
|
||||
},
|
||||
"bin": {
|
||||
"sponsorkit": "dist/cli.mjs"
|
||||
},
|
||||
"engines": {
|
||||
"node": "^22.18.0 || ^24.11.0 || >=26.0.0"
|
||||
},
|
||||
"funding": {
|
||||
"url": "https://github.com/sponsors/antfu"
|
||||
}
|
||||
},
|
||||
"node_modules/tslib": {
|
||||
"version": "2.8.1",
|
||||
"resolved": "https://registry.npmjs.org/tslib/-/tslib-2.8.1.tgz",
|
||||
"integrity": "sha512-oJFu94HQb+KVduSUQL7wnpmqnfmLsOA/nAh6b6EH0wCEoK0/mPeXU6c3wKDV83MkOuHPRHtSXKKU99IBazS/2w==",
|
||||
"dev": true,
|
||||
"license": "0BSD",
|
||||
"optional": true
|
||||
},
|
||||
"node_modules/ufo": {
|
||||
"version": "1.6.4",
|
||||
"resolved": "https://registry.npmjs.org/ufo/-/ufo-1.6.4.tgz",
|
||||
"integrity": "sha512-JFNbkD1Svwe0KvGi8GOeLcP4kAWQ609twvCdcHxq1oSL8svv39ZuSvajcD8B+5D0eL4+s1Is2D/O6KN3qcTeRA==",
|
||||
"dev": true,
|
||||
"license": "MIT"
|
||||
},
|
||||
"node_modules/unconfig": {
|
||||
"version": "7.5.0",
|
||||
"resolved": "https://registry.npmjs.org/unconfig/-/unconfig-7.5.0.tgz",
|
||||
"integrity": "sha512-oi8Qy2JV4D3UQ0PsopR28CzdQ3S/5A1zwsUwp/rosSbfhJ5z7b90bIyTwi/F7hCLD4SGcZVjDzd4XoUQcEanvA==",
|
||||
"dev": true,
|
||||
"license": "MIT",
|
||||
"dependencies": {
|
||||
"@quansync/fs": "^1.0.0",
|
||||
"defu": "^6.1.4",
|
||||
"jiti": "^2.6.1",
|
||||
"quansync": "^1.0.0",
|
||||
"unconfig-core": "7.5.0"
|
||||
},
|
||||
"funding": {
|
||||
"url": "https://github.com/sponsors/antfu"
|
||||
}
|
||||
},
|
||||
"node_modules/unconfig-core": {
|
||||
"version": "7.5.0",
|
||||
"resolved": "https://registry.npmjs.org/unconfig-core/-/unconfig-core-7.5.0.tgz",
|
||||
"integrity": "sha512-Su3FauozOGP44ZmKdHy2oE6LPjk51M/TRRjHv2HNCWiDvfvCoxC2lno6jevMA91MYAdCdwP05QnWdWpSbncX/w==",
|
||||
"dev": true,
|
||||
"license": "MIT",
|
||||
"dependencies": {
|
||||
"@quansync/fs": "^1.0.0",
|
||||
"quansync": "^1.0.0"
|
||||
},
|
||||
"funding": {
|
||||
"url": "https://github.com/sponsors/antfu"
|
||||
}
|
||||
},
|
||||
"node_modules/yocto-queue": {
|
||||
"version": "1.2.2",
|
||||
"resolved": "https://registry.npmjs.org/yocto-queue/-/yocto-queue-1.2.2.tgz",
|
||||
"integrity": "sha512-4LCcse/U2MHZ63HAJVE+v71o7yOdIe4cZ70Wpf8D/IyjDKYQLV5GD46B+hSTjJsvV5PztjvHoU580EftxjDZFQ==",
|
||||
"dev": true,
|
||||
"license": "MIT",
|
||||
"engines": {
|
||||
"node": ">=12.20"
|
||||
},
|
||||
"funding": {
|
||||
"url": "https://github.com/sponsors/sindresorhus"
|
||||
}
|
||||
}
|
||||
}
|
||||
}
|
||||
@@ -0,0 +1,9 @@
|
||||
{
|
||||
"name": "spoolman-sponsorkit",
|
||||
"private": true,
|
||||
"description": "Generates the sponsors image rendered in the README. Run by .github/workflows/sponsors.yml.",
|
||||
"type": "module",
|
||||
"devDependencies": {
|
||||
"sponsorkit": "18.0.0"
|
||||
}
|
||||
}
|
||||
@@ -0,0 +1,112 @@
|
||||
import { defineConfig, tierPresets } from 'sponsorkit'
|
||||
import type { Provider, Sponsorship } from 'sponsorkit'
|
||||
|
||||
/**
|
||||
* People who tipped on Ko-fi and asked to be credited on the sponsors board.
|
||||
* Ko-fi has no API we can query, so these are transcribed by hand from the
|
||||
* Ko-fi dashboard. A tip counts toward a tier for KOFI_TIP_EFFECTIVITY_DAYS,
|
||||
* after which the entry drops to "Past Sponsors" on its own - the same way a
|
||||
* one-time GitHub sponsorship ages out, so nothing here needs pruning.
|
||||
*/
|
||||
const kofiTips: KofiTip[] = [
|
||||
{ login: 'marko-p', dollars: 10, date: '2026-09-01' },
|
||||
]
|
||||
|
||||
/** Days a one-time tip keeps counting. Matches sponsorkit's own Ko-fi provider. */
|
||||
const KOFI_TIP_EFFECTIVITY_DAYS = 30
|
||||
|
||||
interface KofiTip {
|
||||
/** GitHub login. Drives the avatar and the link on the board. */
|
||||
login: string
|
||||
/** Display name, defaults to the login. */
|
||||
name?: string
|
||||
/** Tip amount in USD. Decides the tier, see the `tiers` list below. */
|
||||
dollars: number
|
||||
/** Date of the tip, YYYY-MM-DD. */
|
||||
date: string
|
||||
}
|
||||
|
||||
function kofiTipToSponsorship(tip: KofiTip): Sponsorship {
|
||||
const expireAt = new Date(Date.parse(tip.date) + KOFI_TIP_EFFECTIVITY_DAYS * 24 * 60 * 60 * 1000)
|
||||
return {
|
||||
sponsor: {
|
||||
type: 'User',
|
||||
login: tip.login,
|
||||
name: tip.name ?? tip.login,
|
||||
avatarUrl: `https://github.com/${tip.login}.png`,
|
||||
linkUrl: `https://github.com/${tip.login}`,
|
||||
},
|
||||
// -1 is sponsorkit's marker for a sponsorship that has run out.
|
||||
monthlyDollars: expireAt > new Date() ? tip.dollars : -1,
|
||||
isOneTime: true,
|
||||
privacyLevel: 'PUBLIC',
|
||||
tierName: 'Ko-fi',
|
||||
createdAt: new Date(tip.date).toISOString(),
|
||||
expireAt: expireAt.toISOString(),
|
||||
}
|
||||
}
|
||||
|
||||
const KofiManualProvider: Provider = {
|
||||
name: 'kofi-manual',
|
||||
async fetchSponsors() {
|
||||
return kofiTips.map(kofiTipToSponsorship)
|
||||
},
|
||||
}
|
||||
|
||||
export default defineConfig({
|
||||
github: {
|
||||
login: 'Donkie',
|
||||
type: 'user',
|
||||
},
|
||||
|
||||
// Listing providers explicitly disables auto-detection, so GitHub has to be
|
||||
// named here alongside the hand-maintained Ko-fi list.
|
||||
providers: ['github', KofiManualProvider],
|
||||
|
||||
width: 800,
|
||||
renderer: 'tiers',
|
||||
formats: ['svg', 'png'],
|
||||
// Relative to this directory. Lands next to the other README images.
|
||||
outputDir: '../media',
|
||||
name: 'sponsors',
|
||||
// Resolved against outputDir; keep the fetch cache out of the media folder.
|
||||
cacheFile: '../sponsorkit/.cache.json',
|
||||
|
||||
tiers: [
|
||||
{
|
||||
title: 'Backers',
|
||||
preset: tierPresets.xs,
|
||||
},
|
||||
{
|
||||
title: 'Supporters',
|
||||
monthlyDollars: 10,
|
||||
preset: tierPresets.medium,
|
||||
},
|
||||
{
|
||||
title: 'Sponsors',
|
||||
monthlyDollars: 25,
|
||||
preset: tierPresets.large,
|
||||
},
|
||||
{
|
||||
title: 'Silver Sponsors',
|
||||
monthlyDollars: 50,
|
||||
preset: tierPresets.xl,
|
||||
},
|
||||
{
|
||||
title: 'Gold Sponsors',
|
||||
monthlyDollars: 100,
|
||||
preset: {
|
||||
...tierPresets.xl,
|
||||
avatar: { size: 120 },
|
||||
boxWidth: 150,
|
||||
boxHeight: 160,
|
||||
name: { maxLength: 25 },
|
||||
},
|
||||
},
|
||||
{
|
||||
title: 'Past Sponsors',
|
||||
monthlyDollars: -1,
|
||||
preset: tierPresets.xs,
|
||||
},
|
||||
],
|
||||
})
|
||||
+380
-13
@@ -3,7 +3,13 @@ name: CI
|
||||
on:
|
||||
push:
|
||||
branches:
|
||||
- master
|
||||
# Every branch builds, so a fix can be handed to a bug reporter as a Docker
|
||||
# image before it merges (see publish-images). Weblate pushes locale-only
|
||||
# commits constantly and dependabot's branches arrive as PRs anyway, so
|
||||
# bot branches skip push runs and are built by the pull_request run instead.
|
||||
- "**"
|
||||
- "!weblate*"
|
||||
- "!dependabot/**"
|
||||
tags:
|
||||
- "v*"
|
||||
pull_request:
|
||||
@@ -14,6 +20,13 @@ permissions:
|
||||
contents: read
|
||||
packages: read
|
||||
|
||||
# A new push makes the previous run's result irrelevant, so cancel it and let the
|
||||
# new one have the runners. Master and tags are exempt: both publish images, and a
|
||||
# cancelled run there is a half-published release.
|
||||
concurrency:
|
||||
group: ${{ github.workflow }}-${{ github.ref }}
|
||||
cancel-in-progress: ${{ github.ref != 'refs/heads/master' && !startsWith(github.ref, 'refs/tags/') }}
|
||||
|
||||
env:
|
||||
GHCR_IMAGE: donkie/spoolman
|
||||
|
||||
@@ -22,6 +35,11 @@ jobs:
|
||||
# Linting
|
||||
#
|
||||
style:
|
||||
# Same-repo branches already got a full run from the push trigger, so skip the
|
||||
# duplicate pull_request run. Bot branches excluded above still need it, as do
|
||||
# forks, whose pushes fire no event here. Skipping the three jobs with no `needs`
|
||||
# cascades to every other job, since a skipped dependency skips its dependents.
|
||||
if: ${{ github.event_name != 'pull_request' || github.event.pull_request.head.repo.full_name != github.repository || startsWith(github.head_ref, 'dependabot/') || startsWith(github.head_ref, 'weblate') }}
|
||||
runs-on: ubuntu-latest
|
||||
steps:
|
||||
- name: Checkout
|
||||
@@ -30,7 +48,7 @@ jobs:
|
||||
- name: Install node
|
||||
uses: actions/setup-node@v4.0.3
|
||||
with:
|
||||
node-version: '20'
|
||||
node-version: '24'
|
||||
|
||||
- name: Install uv
|
||||
uses: astral-sh/setup-uv@v7
|
||||
@@ -50,6 +68,13 @@ jobs:
|
||||
cd client
|
||||
npm ci
|
||||
|
||||
# lefthook's `ci` hook lints/formats/type-checks client_v2 too, via
|
||||
# hardcoded ./node_modules/.bin/* paths, so its deps must be present.
|
||||
- name: Install client_v2 dependencies
|
||||
run: |
|
||||
cd client_v2
|
||||
npm ci
|
||||
|
||||
- name: Run pre-commit
|
||||
run: uv run lefthook run ci
|
||||
#
|
||||
@@ -57,6 +82,11 @@ jobs:
|
||||
# This is done on native hardware to speed things up, vite is very slow on emulated hardware
|
||||
#
|
||||
build-client:
|
||||
# Same-repo branches already got a full run from the push trigger, so skip the
|
||||
# duplicate pull_request run. Bot branches excluded above still need it, as do
|
||||
# forks, whose pushes fire no event here. Skipping the three jobs with no `needs`
|
||||
# cascades to every other job, since a skipped dependency skips its dependents.
|
||||
if: ${{ github.event_name != 'pull_request' || github.event.pull_request.head.repo.full_name != github.repository || startsWith(github.head_ref, 'dependabot/') || startsWith(github.head_ref, 'weblate') }}
|
||||
runs-on: ubuntu-latest
|
||||
steps:
|
||||
- name: Checkout
|
||||
@@ -65,7 +95,7 @@ jobs:
|
||||
- name: Install node
|
||||
uses: actions/setup-node@v4.0.3
|
||||
with:
|
||||
node-version: '20'
|
||||
node-version: '24'
|
||||
|
||||
- name: Install uv
|
||||
uses: astral-sh/setup-uv@v7
|
||||
@@ -88,31 +118,53 @@ jobs:
|
||||
rm -f .env && echo "VITE_APIURL=/api/v1" > .env.production
|
||||
npm run build
|
||||
|
||||
# Build the new Svelte client (client_v2), served by default at runtime.
|
||||
# No VITE_APIURL is set: the client resolves the API relative to its base path.
|
||||
- name: Install client_v2 dependencies
|
||||
run: |
|
||||
cd client_v2
|
||||
npm ci
|
||||
|
||||
- name: Build client_v2
|
||||
run: |
|
||||
cd client_v2
|
||||
npm run build
|
||||
|
||||
- name: Write build info
|
||||
run: |
|
||||
echo "GIT_COMMIT=$(git rev-parse --short HEAD)" > build.txt
|
||||
echo "BUILD_DATE=$(date -u +"%Y-%m-%dT%H:%M:%SZ")" >> build.txt
|
||||
|
||||
# Remove client source and keep only the built dist
|
||||
|
||||
# Remove client sources and keep only the built output for each client
|
||||
- name: Clean
|
||||
run: |
|
||||
mv client/dist dist
|
||||
rm -rf client
|
||||
mkdir client
|
||||
mv dist client/dist
|
||||
mv client_v2/build build_v2
|
||||
rm -rf client_v2
|
||||
mkdir client_v2
|
||||
mv build_v2 client_v2/build
|
||||
rm -rf .git
|
||||
rm -rf .venv
|
||||
|
||||
- name: Fix permissions
|
||||
run: |
|
||||
chmod +x scripts/*.sh
|
||||
|
||||
|
||||
- name: Upload client Spoolman artifact
|
||||
uses: actions/upload-artifact@v4.4.0
|
||||
with:
|
||||
name: client
|
||||
path: client/dist
|
||||
|
||||
- name: Upload client_v2 Spoolman artifact
|
||||
uses: actions/upload-artifact@v4.4.0
|
||||
with:
|
||||
name: client_v2
|
||||
path: client_v2/build
|
||||
|
||||
- name: Upload full Spoolman artifact
|
||||
uses: actions/upload-artifact@v4.4.0
|
||||
with:
|
||||
@@ -137,6 +189,12 @@ jobs:
|
||||
name: client
|
||||
path: client/dist
|
||||
|
||||
- name: Download client_v2
|
||||
uses: actions/download-artifact@v4.1.7
|
||||
with:
|
||||
name: client_v2
|
||||
path: client_v2/build
|
||||
|
||||
- name: Set up Docker Buildx
|
||||
uses: docker/setup-buildx-action@v3.6.1
|
||||
|
||||
@@ -176,6 +234,11 @@ jobs:
|
||||
# Build tester image for integration tests
|
||||
#
|
||||
build-tester:
|
||||
# Same-repo branches already got a full run from the push trigger, so skip the
|
||||
# duplicate pull_request run. Bot branches excluded above still need it, as do
|
||||
# forks, whose pushes fire no event here. Skipping the three jobs with no `needs`
|
||||
# cascades to every other job, since a skipped dependency skips its dependents.
|
||||
if: ${{ github.event_name != 'pull_request' || github.event.pull_request.head.repo.full_name != github.repository || startsWith(github.head_ref, 'dependabot/') || startsWith(github.head_ref, 'weblate') }}
|
||||
runs-on: ubuntu-latest
|
||||
permissions:
|
||||
packages: write
|
||||
@@ -249,12 +312,132 @@ jobs:
|
||||
up-flags: "--abort-on-container-exit"
|
||||
down-flags: "--volumes"
|
||||
#
|
||||
# Perform frontend (browser) integration tests against the real image
|
||||
#
|
||||
test-frontend:
|
||||
needs: [build-amd64]
|
||||
runs-on: ubuntu-latest
|
||||
steps:
|
||||
- name: Checkout
|
||||
uses: actions/checkout@v6
|
||||
|
||||
- name: Download built image
|
||||
uses: actions/download-artifact@v4.1.7
|
||||
with:
|
||||
name: spoolman-image
|
||||
path: /tmp/spoolman-image
|
||||
|
||||
- name: Load built image
|
||||
run: docker load --input /tmp/spoolman-image/spoolman.tar
|
||||
|
||||
- name: Install node
|
||||
uses: actions/setup-node@v4.0.3
|
||||
with:
|
||||
node-version: '24'
|
||||
|
||||
- name: Install Playwright
|
||||
run: |
|
||||
cd tests_frontend
|
||||
npm ci
|
||||
npx playwright install --with-deps chromium
|
||||
|
||||
- name: Start Spoolman
|
||||
run: docker compose -f tests_frontend/docker-compose.yml up -d --wait
|
||||
|
||||
- name: Run frontend integration tests
|
||||
run: |
|
||||
cd tests_frontend
|
||||
npx playwright test
|
||||
|
||||
- name: Dump Spoolman logs on failure
|
||||
if: failure()
|
||||
run: docker compose -f tests_frontend/docker-compose.yml logs spoolman
|
||||
|
||||
- name: Upload Playwright report
|
||||
if: ${{ !cancelled() }}
|
||||
uses: actions/upload-artifact@v4.4.0
|
||||
with:
|
||||
name: playwright-report
|
||||
path: tests_frontend/playwright-report
|
||||
retention-days: 7
|
||||
|
||||
- name: Stop Spoolman
|
||||
if: always()
|
||||
run: docker compose -f tests_frontend/docker-compose.yml down -v
|
||||
#
|
||||
# Perform frontend (browser) integration tests for client_v2 against the real image
|
||||
#
|
||||
test-frontend-v2:
|
||||
needs: [build-amd64]
|
||||
runs-on: ubuntu-latest
|
||||
permissions:
|
||||
contents: read
|
||||
# Argos authenticates via OIDC; fork PRs get no id-token and fall back to tokenless upload.
|
||||
id-token: write
|
||||
steps:
|
||||
- name: Checkout
|
||||
uses: actions/checkout@v6
|
||||
|
||||
- name: Download built image
|
||||
uses: actions/download-artifact@v4.1.7
|
||||
with:
|
||||
name: spoolman-image
|
||||
path: /tmp/spoolman-image
|
||||
|
||||
- name: Load built image
|
||||
run: docker load --input /tmp/spoolman-image/spoolman.tar
|
||||
|
||||
- name: Install node
|
||||
uses: actions/setup-node@v4.0.3
|
||||
with:
|
||||
node-version: '24'
|
||||
|
||||
- name: Install Playwright
|
||||
run: |
|
||||
cd tests_frontend_v2
|
||||
npm ci
|
||||
npx playwright install --with-deps chromium
|
||||
|
||||
- name: Start Spoolman
|
||||
run: docker compose -f tests_frontend_v2/docker-compose.yml up -d --wait
|
||||
|
||||
# Screenshots first: they seed a fixed dataset and need the database empty.
|
||||
# The Argos reporter uploads them and posts the visual diff on the PR.
|
||||
- name: Take client_v2 screenshots
|
||||
env:
|
||||
ARGOS_UPLOAD: "1"
|
||||
GITHUB_TOKEN: ${{ secrets.GITHUB_TOKEN }}
|
||||
run: |
|
||||
cd tests_frontend_v2
|
||||
npx playwright test --project screenshots
|
||||
|
||||
- name: Run client_v2 frontend integration tests
|
||||
run: |
|
||||
cd tests_frontend_v2
|
||||
npx playwright test --project chromium
|
||||
|
||||
- name: Dump Spoolman logs on failure
|
||||
if: failure()
|
||||
run: docker compose -f tests_frontend_v2/docker-compose.yml logs spoolman
|
||||
|
||||
- name: Upload Playwright report
|
||||
if: ${{ !cancelled() }}
|
||||
uses: actions/upload-artifact@v4.4.0
|
||||
with:
|
||||
name: playwright-report-v2
|
||||
path: tests_frontend_v2/playwright-report
|
||||
retention-days: 7
|
||||
|
||||
- name: Stop Spoolman
|
||||
if: always()
|
||||
run: docker compose -f tests_frontend_v2/docker-compose.yml down -v
|
||||
#
|
||||
# Build arm64 image
|
||||
# Don't run this for pull requests
|
||||
# Only push to buildcache and let release job push to registry
|
||||
# Also exported to a tar so test-multiarch-smoke can boot it under QEMU.
|
||||
# On pull requests we can't push to buildcache (forks don't have registry
|
||||
# write access), so cache-to is skipped and we only read from it.
|
||||
#
|
||||
build-arm64:
|
||||
if: ${{ github.event_name != 'pull_request' }}
|
||||
needs: [build-client]
|
||||
runs-on: ubuntu-latest
|
||||
permissions:
|
||||
@@ -269,6 +452,12 @@ jobs:
|
||||
name: client
|
||||
path: client/dist
|
||||
|
||||
- name: Download client_v2
|
||||
uses: actions/download-artifact@v4.1.7
|
||||
with:
|
||||
name: client_v2
|
||||
path: client_v2/build
|
||||
|
||||
- name: Set up QEMU
|
||||
uses: docker/setup-qemu-action@v3.2.0
|
||||
|
||||
@@ -283,19 +472,39 @@ jobs:
|
||||
password: ${{ secrets.GITHUB_TOKEN }}
|
||||
|
||||
- name: Build and cache Docker image
|
||||
if: ${{ github.event_name != 'pull_request' }}
|
||||
uses: docker/build-push-action@v6.7.0
|
||||
with:
|
||||
context: .
|
||||
platforms: linux/arm64
|
||||
tags: ${{ env.GHCR_IMAGE }}:test-arm64
|
||||
outputs: type=docker,dest=/tmp/spoolman-arm64.tar
|
||||
cache-from: type=registry,ref=ghcr.io/${{ env.GHCR_IMAGE }}:buildcache-arm64
|
||||
cache-to: type=registry,ref=ghcr.io/${{ env.GHCR_IMAGE }}:buildcache-arm64,mode=max
|
||||
|
||||
# Separate build for pull requests since PRs dont have access to store cache
|
||||
- name: Build and cache Docker image (PR)
|
||||
if: ${{ github.event_name == 'pull_request' }}
|
||||
uses: docker/build-push-action@v6.7.0
|
||||
with:
|
||||
context: .
|
||||
platforms: linux/arm64
|
||||
tags: ${{ env.GHCR_IMAGE }}:test-arm64
|
||||
outputs: type=docker,dest=/tmp/spoolman-arm64.tar
|
||||
cache-from: type=registry,ref=ghcr.io/${{ env.GHCR_IMAGE }}:buildcache-arm64
|
||||
|
||||
- name: Upload arm64 image artifact
|
||||
uses: actions/upload-artifact@v4.4.0
|
||||
with:
|
||||
name: spoolman-image-arm64
|
||||
path: /tmp/spoolman-arm64.tar
|
||||
#
|
||||
# Build arm/v7 image
|
||||
# Don't run this for pull requests
|
||||
# Only push to buildcache and let release job push to registry
|
||||
# Also exported to a tar so test-multiarch-smoke can boot it under QEMU.
|
||||
# On pull requests we can't push to buildcache (forks don't have registry
|
||||
# write access), so cache-to is skipped and we only read from it.
|
||||
#
|
||||
build-armv7:
|
||||
if: ${{ github.event_name != 'pull_request' }}
|
||||
needs: [build-client]
|
||||
runs-on: ubuntu-latest
|
||||
permissions:
|
||||
@@ -310,12 +519,38 @@ jobs:
|
||||
name: client
|
||||
path: client/dist
|
||||
|
||||
- name: Download client_v2
|
||||
uses: actions/download-artifact@v4.1.7
|
||||
with:
|
||||
name: client_v2
|
||||
path: client_v2/build
|
||||
|
||||
- name: Set up QEMU
|
||||
uses: docker/setup-qemu-action@v3.2.0
|
||||
|
||||
- name: Set up Docker Buildx
|
||||
id: buildx
|
||||
uses: docker/setup-buildx-action@v3.6.1
|
||||
|
||||
# Keep uv's cache of wheels built from source (asyncpg, greenlet, ...) across
|
||||
# runs. They have no armv7 wheels, and compiling them under QEMU is ~9 of the
|
||||
# ~11 minutes of a build that misses the layer cache (lockfile or base image
|
||||
# changed). The Dockerfile prunes the cache down to just those wheels, so it's
|
||||
# small enough to save on every run and always restore the newest one.
|
||||
- name: Cache uv wheels
|
||||
uses: actions/cache@v4
|
||||
with:
|
||||
path: uv-cache
|
||||
key: uv-cache-armv7-${{ github.run_id }}
|
||||
restore-keys: uv-cache-armv7-
|
||||
|
||||
- name: Inject uv cache into BuildKit
|
||||
uses: reproducible-containers/buildkit-cache-dance@v3.4.0
|
||||
with:
|
||||
builder: ${{ steps.buildx.outputs.name }}
|
||||
cache-map: |
|
||||
{ "uv-cache": "/root/.cache/uv" }
|
||||
|
||||
- name: Log in to the Github Container registry
|
||||
uses: docker/login-action@v3.3.0
|
||||
with:
|
||||
@@ -324,22 +559,117 @@ jobs:
|
||||
password: ${{ secrets.GITHUB_TOKEN }}
|
||||
|
||||
- name: Build and cache Docker image
|
||||
if: ${{ github.event_name != 'pull_request' }}
|
||||
uses: docker/build-push-action@v6.7.0
|
||||
with:
|
||||
context: .
|
||||
platforms: linux/arm/v7
|
||||
tags: ${{ env.GHCR_IMAGE }}:test-armv7
|
||||
outputs: type=docker,dest=/tmp/spoolman-armv7.tar
|
||||
cache-from: type=registry,ref=ghcr.io/${{ env.GHCR_IMAGE }}:buildcache-armv7
|
||||
cache-to: type=registry,ref=ghcr.io/${{ env.GHCR_IMAGE }}:buildcache-armv7,mode=max
|
||||
|
||||
# Separate build for pull requests since PRs dont have access to store cache
|
||||
- name: Build and cache Docker image (PR)
|
||||
if: ${{ github.event_name == 'pull_request' }}
|
||||
uses: docker/build-push-action@v6.7.0
|
||||
with:
|
||||
context: .
|
||||
platforms: linux/arm/v7
|
||||
tags: ${{ env.GHCR_IMAGE }}:test-armv7
|
||||
outputs: type=docker,dest=/tmp/spoolman-armv7.tar
|
||||
cache-from: type=registry,ref=ghcr.io/${{ env.GHCR_IMAGE }}:buildcache-armv7
|
||||
|
||||
- name: Upload armv7 image artifact
|
||||
uses: actions/upload-artifact@v4.4.0
|
||||
with:
|
||||
name: spoolman-image-armv7
|
||||
path: /tmp/spoolman-armv7.tar
|
||||
#
|
||||
# Smoke test the arm64 and armv7 images under QEMU emulation: boot the
|
||||
# container with no config (defaults to SQLite, no external DB needed) and
|
||||
# confirm /api/v1/health comes up. Emulated boot (interpreter start +
|
||||
# alembic migrations) is slow, hence the generous retry budget.
|
||||
#
|
||||
test-multiarch-smoke:
|
||||
needs: [build-arm64, build-armv7]
|
||||
strategy:
|
||||
fail-fast: false
|
||||
matrix:
|
||||
include:
|
||||
- arch: arm64
|
||||
platform: linux/arm64
|
||||
artifact: spoolman-image-arm64
|
||||
tarball: spoolman-arm64.tar
|
||||
- arch: armv7
|
||||
platform: linux/arm/v7
|
||||
artifact: spoolman-image-armv7
|
||||
tarball: spoolman-armv7.tar
|
||||
runs-on: ubuntu-latest
|
||||
timeout-minutes: 15
|
||||
steps:
|
||||
- name: Set up QEMU
|
||||
uses: docker/setup-qemu-action@v3.2.0
|
||||
|
||||
- name: Download built image
|
||||
uses: actions/download-artifact@v4.1.7
|
||||
with:
|
||||
name: ${{ matrix.artifact }}
|
||||
path: /tmp/spoolman-image
|
||||
|
||||
- name: Load built image
|
||||
run: docker load --input /tmp/spoolman-image/${{ matrix.tarball }}
|
||||
|
||||
- name: Start Spoolman (${{ matrix.arch }}, emulated via QEMU)
|
||||
run: |
|
||||
docker run -d --name spoolman-smoke \
|
||||
--platform ${{ matrix.platform }} \
|
||||
-p 8000:8000 \
|
||||
${{ env.GHCR_IMAGE }}:test-${{ matrix.arch }}
|
||||
|
||||
- name: Wait for /health endpoint
|
||||
run: |
|
||||
for i in $(seq 1 90); do
|
||||
if curl -fsS http://localhost:8000/api/v1/health; then
|
||||
echo
|
||||
echo "Spoolman (${{ matrix.arch }}) is healthy"
|
||||
exit 0
|
||||
fi
|
||||
sleep 5
|
||||
done
|
||||
echo "Spoolman (${{ matrix.arch }}) did not become healthy in time" >&2
|
||||
exit 1
|
||||
|
||||
- name: Dump Spoolman logs on failure
|
||||
if: failure()
|
||||
run: docker logs spoolman-smoke
|
||||
|
||||
- name: Stop Spoolman
|
||||
if: always()
|
||||
run: docker rm -f spoolman-smoke
|
||||
#
|
||||
# Release images GHCR and Docker Hub if tests pass
|
||||
# Don't run this for pull requests
|
||||
#
|
||||
publish-images:
|
||||
if: ${{ github.event_name != 'pull_request' }}
|
||||
needs: [test, build-amd64, build-arm64, build-armv7, style, build-client]
|
||||
needs:
|
||||
[
|
||||
test,
|
||||
test-frontend,
|
||||
test-frontend-v2,
|
||||
test-multiarch-smoke,
|
||||
build-amd64,
|
||||
build-arm64,
|
||||
build-armv7,
|
||||
style,
|
||||
build-client,
|
||||
]
|
||||
runs-on: ubuntu-latest
|
||||
permissions:
|
||||
packages: write
|
||||
# Lets cosign fetch an OIDC token from Github and sign without a private key.
|
||||
id-token: write
|
||||
steps:
|
||||
- name: Checkout
|
||||
uses: actions/checkout@v6
|
||||
@@ -350,6 +680,12 @@ jobs:
|
||||
name: client
|
||||
path: client/dist
|
||||
|
||||
- name: Download client_v2
|
||||
uses: actions/download-artifact@v4.1.7
|
||||
with:
|
||||
name: client_v2
|
||||
path: client_v2/build
|
||||
|
||||
- name: Set up QEMU
|
||||
uses: docker/setup-qemu-action@v3.2.0
|
||||
|
||||
@@ -363,6 +699,10 @@ jobs:
|
||||
username: ${{ github.actor }}
|
||||
password: ${{ secrets.GITHUB_TOKEN }}
|
||||
|
||||
# The trailing type=ref,event=branch is what gives an unmerged branch a
|
||||
# pullable image (ghcr.io/donkie/spoolman:my-branch) for a bug reporter to
|
||||
# test. It is GHCR-only and skips master (already published as :edge), so
|
||||
# Docker Hub keeps carrying nothing but :edge and tagged releases.
|
||||
- name: Extract metadata (tags, labels) for GHCR
|
||||
id: meta-ghcr
|
||||
uses: docker/metadata-action@v5.5.1
|
||||
@@ -374,6 +714,7 @@ jobs:
|
||||
type=semver,pattern={{version}}
|
||||
type=semver,pattern={{major}}.{{minor}}
|
||||
type=semver,pattern={{major}}
|
||||
type=ref,event=branch,enable=${{ github.ref_name != 'master' }}
|
||||
|
||||
- name: Extract metadata (tags, labels) for Docker Hub
|
||||
id: meta-dh
|
||||
@@ -399,7 +740,15 @@ jobs:
|
||||
echo "GIT_COMMIT=$(git rev-parse --short HEAD)" >> "$GITHUB_ENV"
|
||||
echo "BUILD_DATE=$(date -u +"%Y-%m-%dT%H:%M:%SZ")" >> "$GITHUB_ENV"
|
||||
|
||||
- name: Install cosign
|
||||
uses: sigstore/cosign-installer@v4.1.2
|
||||
with:
|
||||
# Installer v4+ verifies cosign v3 downloads via the Sigstore bundle
|
||||
# format; pin an explicit, current cosign release for reproducibility.
|
||||
cosign-release: v3.1.1
|
||||
|
||||
- name: Build and push Docker images
|
||||
id: build
|
||||
uses: docker/build-push-action@v6.7.0
|
||||
with:
|
||||
context: .
|
||||
@@ -416,6 +765,24 @@ jobs:
|
||||
type=registry,ref=ghcr.io/${{ env.GHCR_IMAGE }}:buildcache-amd64
|
||||
type=registry,ref=ghcr.io/${{ env.GHCR_IMAGE }}:buildcache-arm64
|
||||
type=registry,ref=ghcr.io/${{ env.GHCR_IMAGE }}:buildcache-armv7
|
||||
|
||||
# Sign the manifest by digest rather than by tag: all the tags above point
|
||||
# at the same digest, and the same digest is valid in both registries, so
|
||||
# signing every tag would just repeat the same signature.
|
||||
- name: Sign the published images
|
||||
env:
|
||||
DIGEST: ${{ steps.build.outputs.digest }}
|
||||
TAGS: |
|
||||
${{ steps.meta-ghcr.outputs.tags }}
|
||||
${{ steps.meta-dh.outputs.tags }}
|
||||
run: |
|
||||
echo "${TAGS}" | while read -r tag; do
|
||||
[ -n "${tag}" ] || continue
|
||||
echo "${tag%:*}"
|
||||
done | sort --unique | while read -r repository; do
|
||||
echo "Signing ${repository}@${DIGEST}"
|
||||
cosign sign --yes "${repository}@${DIGEST}"
|
||||
done
|
||||
#
|
||||
# Create Github Release if CI was triggered by a tag
|
||||
#
|
||||
|
||||
@@ -0,0 +1,149 @@
|
||||
name: Guard Translations
|
||||
|
||||
# Translations are managed exclusively through Weblate (https://hosted.weblate.org/projects/spoolman/).
|
||||
# Only the "en" source locale is edited by hand in this repo; every other language is written back
|
||||
# by the Weblate bot. This workflow fails any PR (except Weblate's own) that hand-edits a non-English
|
||||
# translation file, so manual edits don't get overwritten and lost on the next Weblate sync.
|
||||
#
|
||||
# Two clients, two different rules:
|
||||
#
|
||||
# client_v2/locales/ — the ACTIVE translation target. Weblate translates this one.
|
||||
# MODIFY/DELETE of an existing non-English file is blocked; ADDING a
|
||||
# brand-new language file is allowed, because bootstrapping a language
|
||||
# also needs two hand-written code entries (see NEW_LANGUAGE_HOWTO
|
||||
# below) that only a human PR can add.
|
||||
#
|
||||
# client/public/locales/ — the LEGACY React client, CLOSED to translation work. Its Weblate
|
||||
# component is locked, so nothing new arrives from translators and
|
||||
# the files here are frozen at whatever shipped. Any change to a
|
||||
# non-English file is blocked, including adding a new language:
|
||||
# effort spent there is effort not spent on the client users get.
|
||||
|
||||
on:
|
||||
pull_request:
|
||||
types:
|
||||
- opened
|
||||
- synchronize
|
||||
- reopened
|
||||
|
||||
# NOTE: no `paths:` filter on purpose. If this check is marked "Required" in branch
|
||||
# protection, a paths filter would leave PRs that don't touch locales stuck "pending"
|
||||
# forever (the check would never post a status). Instead we always run and pass fast
|
||||
# when nothing offending changed.
|
||||
|
||||
permissions:
|
||||
contents: read
|
||||
|
||||
jobs:
|
||||
guard-translations:
|
||||
runs-on: ubuntu-latest
|
||||
# Skip the guard for Weblate's own translation-sync PRs.
|
||||
if: github.event.pull_request.user.login != 'weblate'
|
||||
steps:
|
||||
- name: Checkout
|
||||
uses: actions/checkout@v4
|
||||
with:
|
||||
fetch-depth: 0
|
||||
|
||||
- name: Check for manual non-English translation changes
|
||||
env:
|
||||
BASE_SHA: ${{ github.event.pull_request.base.sha }}
|
||||
HEAD_SHA: ${{ github.event.pull_request.head.sha }}
|
||||
run: |
|
||||
set -euo pipefail
|
||||
|
||||
# --no-renames turns any rename into a delete + add pair, so a "renamed" (i.e. rewritten)
|
||||
# existing file still trips the delete rule and can't be smuggled through as a fresh add.
|
||||
#
|
||||
# --diff-filter=MD keeps only Modified and Deleted paths: edits to files that ALREADY exist
|
||||
# on the base branch. Added (A) files are handled separately per client below.
|
||||
# Three dots, not two. `git diff A B` compares the two trees as they stand, so every
|
||||
# commit that landed on the base branch after this PR forked shows up as if the PR had
|
||||
# changed it -- a Weblate sync merging to master made unrelated PRs fail with
|
||||
# "client_v2/locales/sv/common.json" in the offending list. `git diff A...B` diffs from
|
||||
# the MERGE BASE instead, which is exactly "what this PR changed" and stays correct no
|
||||
# matter how far master has moved on.
|
||||
edited="$(git diff --no-renames --diff-filter=MD --name-only "$BASE_SHA...$HEAD_SHA" || true)"
|
||||
added="$(git diff --no-renames --diff-filter=A --name-only "$BASE_SHA...$HEAD_SHA" || true)"
|
||||
|
||||
# Active client: edits to existing non-English files are blocked, new languages are fine.
|
||||
offending_v2="$(printf '%s\n' "$edited" \
|
||||
| grep -E '^client_v2/locales/[^/]+/' \
|
||||
| grep -vE '^client_v2/locales/en/' \
|
||||
|| true)"
|
||||
|
||||
# Legacy client: every non-English change is blocked, adds included.
|
||||
offending_legacy="$(printf '%s\n' "$edited" "$added" \
|
||||
| grep -E '^client/public/locales/[^/]+/' \
|
||||
| grep -vE '^client/public/locales/en/' \
|
||||
|| true)"
|
||||
|
||||
if [ -z "$offending_v2" ] && [ -z "$offending_legacy" ]; then
|
||||
echo "No manual edits to non-English translation files detected. ✅"
|
||||
exit 0
|
||||
fi
|
||||
|
||||
echo "::error title=Manual translation edits are not allowed::This PR hand-edits non-English translation files. See the job summary for details."
|
||||
|
||||
{
|
||||
echo "## ❌ Manual translation edits detected"
|
||||
echo ""
|
||||
|
||||
if [ -n "$offending_v2" ]; then
|
||||
echo "### Existing translations edited by hand"
|
||||
echo ""
|
||||
echo "This PR modifies or deletes existing non-English translation files:"
|
||||
echo ""
|
||||
echo '```'
|
||||
echo "$offending_v2"
|
||||
echo '```'
|
||||
echo ""
|
||||
echo "Every language except the English source (\`client_v2/locales/en/common.json\`) is"
|
||||
echo "managed **exclusively through Weblate**. A manual edit here will be **silently"
|
||||
echo "overwritten and lost** the next time Weblate syncs — so we don't accept them."
|
||||
echo ""
|
||||
echo "**What to do instead:**"
|
||||
echo ""
|
||||
echo "- **To fix or improve a translation:** contribute it through Weblate at"
|
||||
echo " <https://hosted.weblate.org/projects/spoolman/>. It's free, requires no coding,"
|
||||
echo " and your change flows back into the repo automatically."
|
||||
echo "- **To add or change a user-facing string:** edit **only**"
|
||||
echo " \`client_v2/locales/en/common.json\`. Weblate picks up the new keys and exposes"
|
||||
echo " them to translators. Revert your changes to every other language and push again."
|
||||
echo "- **To add a brand-new language:** that IS allowed here — new files aren't blocked,"
|
||||
echo " only edits to existing ones. A new language needs two code entries as well:"
|
||||
echo " the locale code in \`client_v2/project.inlang/settings.json\` (so paraglide compiles"
|
||||
echo " it) and an endonym in \`client_v2/src/lib/i18n/languages.ts\` (so it appears in the"
|
||||
echo " language picker). Without both, the translation file is built but unreachable."
|
||||
echo ""
|
||||
fi
|
||||
|
||||
if [ -n "$offending_legacy" ]; then
|
||||
echo "### Legacy client translations are closed"
|
||||
echo ""
|
||||
echo "This PR changes non-English translation files of the **legacy React client**:"
|
||||
echo ""
|
||||
echo '```'
|
||||
echo "$offending_legacy"
|
||||
echo '```'
|
||||
echo ""
|
||||
echo "\`client/public/locales/\` belongs to the old client, which is only kept around for"
|
||||
echo "the \`SPOOLMAN_LEGACY_CLIENT\` fallback. Its Weblate component is **locked** and its"
|
||||
echo "translations are frozen — nothing here reaches the UI that users get by default."
|
||||
echo ""
|
||||
echo "**Translate \`client_v2\` instead:** the same strings, in the client everyone actually"
|
||||
echo "sees, at <https://hosted.weblate.org/projects/spoolman/>."
|
||||
echo ""
|
||||
fi
|
||||
|
||||
echo "> If you believe a file genuinely needs a manual change (e.g. a structural fix),"
|
||||
echo "> please explain it in a PR comment so a maintainer can review."
|
||||
} >> "$GITHUB_STEP_SUMMARY"
|
||||
|
||||
echo ""
|
||||
echo "Offending files:"
|
||||
# Plain `if` rather than `[ -n … ] && echo …`: under `set -e` a false test makes the
|
||||
# whole && list return non-zero and abort the step, which would skip the second echo.
|
||||
if [ -n "$offending_v2" ]; then echo "$offending_v2"; fi
|
||||
if [ -n "$offending_legacy" ]; then echo "$offending_legacy"; fi
|
||||
exit 1
|
||||
@@ -22,7 +22,7 @@ jobs:
|
||||
issue-manager:
|
||||
runs-on: ubuntu-latest
|
||||
steps:
|
||||
- uses: tiangolo/issue-manager@0.5.1
|
||||
- uses: tiangolo/issue-manager@0.8.1
|
||||
with:
|
||||
token: ${{ secrets.GITHUB_TOKEN }}
|
||||
config: >
|
||||
@@ -32,7 +32,7 @@ jobs:
|
||||
"message": "It seems the issue was answered, closing this now."
|
||||
},
|
||||
"waiting": {
|
||||
"delay": 60400,
|
||||
"delay": 604800,
|
||||
"message": "Closing after 7 days of waiting for the additional info requested."
|
||||
}
|
||||
}
|
||||
@@ -0,0 +1,77 @@
|
||||
name: Label sponsor issues
|
||||
|
||||
on:
|
||||
issues:
|
||||
types: [opened]
|
||||
|
||||
permissions:
|
||||
issues: write
|
||||
|
||||
concurrency:
|
||||
group: sponsor-label-${{ github.event.issue.number }}
|
||||
cancel-in-progress: false
|
||||
|
||||
jobs:
|
||||
label:
|
||||
runs-on: ubuntu-latest
|
||||
steps:
|
||||
- name: Label the issue if its author is a sponsor
|
||||
uses: actions/github-script@v9
|
||||
with:
|
||||
# The sponsorship lookup is viewer-relative: it answers "is this person
|
||||
# sponsoring *me*" for whoever owns the token. GITHUB_TOKEN's viewer is
|
||||
# the Actions bot, which nobody sponsors, so it always comes back empty.
|
||||
# It has to be the PAT, and reading privacyLevel needs its read:user scope.
|
||||
github-token: ${{ secrets.PAT }}
|
||||
script: |
|
||||
// The Supporter tier and up. Below this, no tag was promised.
|
||||
const MIN_MONTHLY_DOLLARS = 10
|
||||
const LABEL = 'sponsor'
|
||||
|
||||
const issue = context.payload.issue
|
||||
const author = issue.user.login
|
||||
if (author.endsWith('[bot]')) return
|
||||
|
||||
const query = `query($login: String!) {
|
||||
user(login: $login) {
|
||||
sponsorshipForViewerAsSponsorable(activeOnly: true) {
|
||||
privacyLevel
|
||||
tier { monthlyPriceInDollars }
|
||||
}
|
||||
}
|
||||
}`
|
||||
|
||||
let sponsorship
|
||||
try {
|
||||
const data = await github.graphql(query, { login: author })
|
||||
sponsorship = data.user?.sponsorshipForViewerAsSponsorable
|
||||
} catch (error) {
|
||||
// Deleted accounts and app logins never resolve to a user.
|
||||
core.info(`Could not look up ${author}: ${error.message}`)
|
||||
return
|
||||
}
|
||||
|
||||
if (!sponsorship) {
|
||||
core.info(`${author} is not an active sponsor`)
|
||||
return
|
||||
}
|
||||
|
||||
const dollars = sponsorship.tier.monthlyPriceInDollars
|
||||
if (dollars < MIN_MONTHLY_DOLLARS) {
|
||||
core.info(`${author} sponsors at $${dollars}, below the $${MIN_MONTHLY_DOLLARS} tier`)
|
||||
return
|
||||
}
|
||||
|
||||
// A private sponsor chose not to be listed publicly. This label is
|
||||
// public, so applying it would out them; skip rather than disclose.
|
||||
if (sponsorship.privacyLevel === 'PRIVATE') {
|
||||
core.info(`${author} sponsors privately, leaving the issue unlabelled`)
|
||||
return
|
||||
}
|
||||
|
||||
await github.rest.issues.addLabels({
|
||||
...context.repo,
|
||||
issue_number: issue.number,
|
||||
labels: [LABEL],
|
||||
})
|
||||
core.info(`Labelled #${issue.number}, opened by $${dollars}/month sponsor ${author}`)
|
||||
@@ -0,0 +1,51 @@
|
||||
name: Generate sponsors image
|
||||
|
||||
on:
|
||||
schedule:
|
||||
- cron: '0 3 * * *' # daily
|
||||
workflow_dispatch:
|
||||
|
||||
permissions:
|
||||
contents: write
|
||||
|
||||
concurrency:
|
||||
group: sponsors
|
||||
cancel-in-progress: false
|
||||
|
||||
jobs:
|
||||
sponsorkit:
|
||||
runs-on: ubuntu-latest
|
||||
steps:
|
||||
# Checks out with the PAT rather than the default GITHUB_TOKEN: the commit
|
||||
# step below pushes straight to master, and the ruleset there only lets a
|
||||
# bypass-capable actor through.
|
||||
- name: Checkout
|
||||
uses: actions/checkout@v7
|
||||
with:
|
||||
persist-credentials: true
|
||||
token: ${{ secrets.PAT }}
|
||||
|
||||
- name: Setup Node
|
||||
uses: actions/setup-node@v7
|
||||
with:
|
||||
node-version: '24'
|
||||
cache: npm
|
||||
cache-dependency-path: .github/sponsorkit/package-lock.json
|
||||
|
||||
- name: Install sponsorkit
|
||||
working-directory: .github/sponsorkit
|
||||
run: npm ci
|
||||
|
||||
- name: Generate sponsors image
|
||||
working-directory: .github/sponsorkit
|
||||
run: npx sponsorkit
|
||||
env:
|
||||
SPONSORKIT_GITHUB_TOKEN: ${{ secrets.PAT }}
|
||||
|
||||
# Only commits when the rendered image actually differs from what is checked in.
|
||||
- name: Commit sponsors image
|
||||
uses: stefanzweifel/git-auto-commit-action@v7
|
||||
with:
|
||||
commit_message: 'chore: update sponsors image'
|
||||
file_pattern: '.github/media/sponsors.svg .github/media/sponsors.png'
|
||||
skip_dirty_check: false
|
||||
@@ -38,13 +38,13 @@ jobs:
|
||||
- name: Install node
|
||||
uses: actions/setup-node@v4.0.3
|
||||
with:
|
||||
node-version: '20'
|
||||
node-version: '24'
|
||||
|
||||
- name: Bump version
|
||||
run: |
|
||||
git config --global user.name "${GITHUB_ACTOR}"
|
||||
git config --global user.email "${GITHUB_ACTOR_ID}+${GITHUB_ACTOR}@users.noreply.github.com"
|
||||
uv run bump2version ${{ github.event.inputs.bump }}
|
||||
uv run poe bump ${{ github.event.inputs.bump }}
|
||||
|
||||
- name: Push
|
||||
run: |
|
||||
|
||||
@@ -0,0 +1,136 @@
|
||||
name: Auto-merge Weblate PRs
|
||||
|
||||
# Translations are managed exclusively through Weblate (https://hosted.weblate.org/projects/spoolman/),
|
||||
# which opens a pull request for every sync back to this repo (see guard-translations.yml). Those PRs
|
||||
# are machine-generated, always scoped to a locale tree (client_v2/locales/ today), and gated by the
|
||||
# full CI suite just like any other PR. Rather than hand-merging each one, this workflow turns on GitHub's native
|
||||
# auto-merge once a week for Weblate-authored PRs so they merge themselves once all required status checks pass.
|
||||
#
|
||||
# Why auto-merge instead of giving Weblate direct push access to master:
|
||||
# - Every sync still runs through style/tests/build before it can land; nothing merges unvalidated.
|
||||
# - No actor gains unrestricted, un-CI'd direct write to master. A compromised Weblate token can only
|
||||
# open a PR; auto-merge fires solely on green CI for Weblate-authored PRs.
|
||||
# - GitHub write/bypass can't be scoped to locale files, so direct write would grant all-file access.
|
||||
|
||||
on:
|
||||
schedule:
|
||||
- cron: "0 6 * * 1"
|
||||
workflow_dispatch:
|
||||
|
||||
# contents+pull-requests write let the built-in GITHUB_TOKEN enable auto-merge and perform the merge.
|
||||
# The token is not a ruleset bypass actor and doesn't need to be: with 0 required approvals it
|
||||
# satisfies the branch requirements once the required checks go green, exactly like a manual merge.
|
||||
permissions:
|
||||
contents: write
|
||||
pull-requests: write
|
||||
|
||||
jobs:
|
||||
auto-merge:
|
||||
runs-on: ubuntu-latest
|
||||
# Only ever act on Weblate's own translation-sync PRs. Human PRs are never touched.
|
||||
# Scheduled runs use the default-branch workflow. This job never checks out or executes
|
||||
# PR code; it only calls the GitHub API to inspect PRs and enable auto-merge or merge them.
|
||||
steps:
|
||||
# Defence in depth: don't trust the author alone, trust the diff. Even a compromised Weblate
|
||||
# token can only ever get auto-merged if the PR is confined to locale JSON files. Anything
|
||||
# else (a code file, a workflow, a non-.json file, a file outside the two locale trees)
|
||||
# fails the check, auto-merge is never enabled, and the PR waits for a human. The file list is
|
||||
# read from the API; this step never checks out or runs PR code.
|
||||
#
|
||||
# Both locale trees are allowed. client_v2/locales/ is where translations go now; the legacy
|
||||
# client/public/locales/ tree stays on the list only so that a sync opened before its Weblate
|
||||
# component was locked isn't stranded half-merged. Locking the component, not this allowlist,
|
||||
# is what stops new legacy translations (see guard-translations.yml).
|
||||
- name: Verify and merge open Weblate PRs
|
||||
env:
|
||||
GH_TOKEN: ${{ secrets.GITHUB_TOKEN }}
|
||||
REPO: ${{ github.repository }}
|
||||
# Merge commit, NOT squash. This is load-bearing for Weblate, not a style preference.
|
||||
#
|
||||
# Weblate keeps its own clone of this repo and rebases it onto master to pick up our changes.
|
||||
# A squash merge replaces the Weblate commits with one brand-new commit that has a different
|
||||
# hash AND, when the PR held more than one commit, a different patch-id than any of them. The
|
||||
# rebase therefore can't tell that the work already landed, replays each original commit on top
|
||||
# of a master that already contains those very strings, and dies on a content conflict:
|
||||
#
|
||||
# Rebasing (1/3)
|
||||
# CONFLICT (content): Merge conflict in client_v2/locales/ru/common.json
|
||||
#
|
||||
# From then on Weblate can't merge upstream and stops syncing until someone resets it by hand
|
||||
# (this happened with PR #1004, which squashed two Russian commits into one). Weblate's own
|
||||
# docs are explicit: "Do not squash merge it. Squash merging creates a new commit instead of
|
||||
# preserving the Weblate commits, so Weblate might not recognize that its local commits are
|
||||
# already included upstream and might need a repository reset to recover."
|
||||
#
|
||||
# A merge commit keeps every Weblate commit reachable with its original hash, so the rebase
|
||||
# sees them as already upstream and drops them silently. Nothing else forces squash here:
|
||||
# the repo has allow_merge_commit enabled and the master ruleset carries no linear-history
|
||||
# rule, and human PRs are merge-committed too.
|
||||
run: |
|
||||
set -euo pipefail
|
||||
|
||||
prs="$(gh pr list --repo "$REPO" --author weblate --state open --limit 10000 --json number,url)"
|
||||
rows="$(printf '%s\n' "$prs" | jq -r '.[] | [.number, .url] | @tsv')"
|
||||
failed=0
|
||||
while IFS=$'\t' read -r PR_NUMBER PR_URL; do
|
||||
[ -n "$PR_NUMBER" ] || continue
|
||||
if ! files="$(gh api --paginate "repos/${REPO}/pulls/${PR_NUMBER}/files" --jq '.[].filename')"; then
|
||||
echo "::error::Could not read changed files for $PR_URL; refusing to auto-merge."
|
||||
echo "## ❌ Auto-merge blocked: could not read files for $PR_URL" >> "$GITHUB_STEP_SUMMARY"
|
||||
failed=1
|
||||
continue
|
||||
fi
|
||||
|
||||
if [ -z "$files" ]; then
|
||||
echo "::error title=Empty diff::Weblate PR $PR_URL reports no changed files; refusing to auto-merge."
|
||||
echo "## ❌ Auto-merge blocked: empty diff for $PR_URL" >> "$GITHUB_STEP_SUMMARY"
|
||||
failed=1
|
||||
continue
|
||||
fi
|
||||
|
||||
# Every changed path must be a .json file under client_v2/locales/<lang>/ (active) or
|
||||
# client/public/locales/<lang>/ (legacy, being wound down).
|
||||
offending="$(printf '%s\n' "$files" \
|
||||
| grep -vE '^(client_v2/locales|client/public/locales)/[^/]+/.+\.json$' || true)"
|
||||
|
||||
if [ -n "$offending" ]; then
|
||||
echo "::error title=Out-of-scope Weblate PR::$PR_URL touches files outside the locale trees; not auto-merging."
|
||||
{
|
||||
echo "## ❌ Auto-merge blocked: out-of-scope changes"
|
||||
echo ""
|
||||
echo "Weblate PR: $PR_URL"
|
||||
echo ""
|
||||
echo "This Weblate PR changes files that are **not** locale JSON under"
|
||||
echo "\`client_v2/locales/\` or \`client/public/locales/\`:"
|
||||
echo ""
|
||||
echo '```'
|
||||
echo "$offending"
|
||||
echo '```'
|
||||
echo ""
|
||||
echo "Weblate sync PRs are only auto-merged when every changed file is a translation JSON"
|
||||
echo "file. This PR isn't, so it has been left for a maintainer to review and merge by hand."
|
||||
} >> "$GITHUB_STEP_SUMMARY"
|
||||
failed=1
|
||||
continue
|
||||
fi
|
||||
|
||||
echo "$PR_URL: all $(printf '%s\n' "$files" | wc -l) changed file(s) are locale JSON. Safe to auto-merge."
|
||||
if merge_output="$(gh pr merge --repo "$REPO" --auto --merge "$PR_URL" 2>&1)"; then
|
||||
echo "$merge_output"
|
||||
continue
|
||||
fi
|
||||
|
||||
echo "$merge_output"
|
||||
# GitHub can refuse auto-merge when the PR is already ready to merge.
|
||||
if [[ "$merge_output" == *"clean status"* || "$merge_output" == *"already mergeable"* ]]; then
|
||||
if gh pr merge --repo "$REPO" --merge "$PR_URL"; then
|
||||
continue
|
||||
fi
|
||||
fi
|
||||
|
||||
echo "::error::Could not merge $PR_URL."
|
||||
echo "## ❌ Auto-merge blocked: merge failed for $PR_URL" >> "$GITHUB_STEP_SUMMARY"
|
||||
failed=1
|
||||
done <<< "$rows"
|
||||
|
||||
exit "$failed"
|
||||
+8
-5
@@ -15,7 +15,6 @@ dist/
|
||||
downloads/
|
||||
eggs/
|
||||
.eggs/
|
||||
lib/
|
||||
lib64/
|
||||
parts/
|
||||
sdist/
|
||||
@@ -26,7 +25,8 @@ share/python-wheels/
|
||||
.installed.cfg
|
||||
*.egg
|
||||
MANIFEST
|
||||
requirements.txt
|
||||
# requirements.txt is committed (generated from uv on release) for bare-metal /
|
||||
# Moonraker update_manager consumers. See spoolman/bump.py.
|
||||
|
||||
# PyInstaller
|
||||
# Usually these files are written by a python script from a template
|
||||
@@ -201,7 +201,10 @@ $RECYCLE.BIN/
|
||||
|
||||
### VisualStudioCode ###
|
||||
.vscode/
|
||||
|
||||
data/
|
||||
devdata
|
||||
.pdm-python
|
||||
.history
|
||||
.history
|
||||
.claude
|
||||
|
||||
# playwright-cli debug artifacts
|
||||
.playwright-cli/
|
||||
+34
-20
@@ -1,39 +1,53 @@
|
||||
FROM ghcr.io/astral-sh/uv:python3.14-bookworm-slim AS python-builder
|
||||
FROM python:3.14-slim-bookworm AS python-builder
|
||||
|
||||
ENV UV_COMPILE_BYTECODE=1
|
||||
ENV UV_LINK_MODE=copy
|
||||
ENV UV_NO_DEV=1
|
||||
ENV UV_PYTHON_DOWNLOADS=0
|
||||
|
||||
# Install dependencies
|
||||
RUN apt-get update && apt-get install -y \
|
||||
# Install system dependencies
|
||||
# No python3-dev: the base image already ships the 3.14 headers, and python3-dev
|
||||
# would pull in Debian's whole python3.11 stack. patchelf is for armv7, see below.
|
||||
RUN apt-get update && apt-get install -y --no-install-recommends \
|
||||
g++ \
|
||||
python3-dev \
|
||||
libpq-dev \
|
||||
libffi-dev \
|
||||
patchelf \
|
||||
&& apt-get clean \
|
||||
&& rm -rf /var/lib/apt/lists/*
|
||||
|
||||
# Add local user so we don't run as root
|
||||
# RUN groupmod -g 1000 users \
|
||||
# && useradd -u 911 -U app \
|
||||
# && usermod -G users app
|
||||
|
||||
# ENV PATH="/home/app/.local/bin:${PATH}"
|
||||
# Install UV
|
||||
RUN pip install --no-cache-dir uv
|
||||
|
||||
# Install dependencies
|
||||
WORKDIR /home/app/spoolman
|
||||
RUN --mount=type=cache,target=/root/.cache/uv \
|
||||
--mount=type=bind,source=uv.lock,target=uv.lock \
|
||||
--mount=type=bind,source=pyproject.toml,target=pyproject.toml \
|
||||
uv sync --locked --no-install-project
|
||||
uv sync --locked --no-install-project \
|
||||
&& uv cache prune --ci
|
||||
|
||||
# Copy and install app
|
||||
COPY --chown=app:app migrations /home/app/spoolman/migrations
|
||||
COPY --chown=app:app spoolman /home/app/spoolman/spoolman
|
||||
COPY --chown=app:app alembic.ini README.md uv.lock pyproject.toml /home/app/spoolman/
|
||||
# greenlet ships no 32-bit ARM wheel, so on armv7 it is compiled from source.
|
||||
# setuptools links the C++ extension with gcc, which leaves libstdc++ out of the
|
||||
# .so's NEEDED list, and it then crashes at import with an undefined libstdc++
|
||||
# typeinfo symbol, taking startup down during the DB migration. Add libstdc++ to
|
||||
# the NEEDED list so the loader pulls it in. Only armv7 is affected; amd64 and
|
||||
# arm64 use a correctly linked prebuilt wheel. Done before the app is copied in so
|
||||
# the layer stays cached across source-only changes.
|
||||
RUN if [ "$(uname -m)" = "armv7l" ]; then \
|
||||
patchelf --add-needed libstdc++.so.6 \
|
||||
"$(find /home/app/spoolman/.venv -name '_greenlet*.so')"; \
|
||||
fi
|
||||
|
||||
# Copy and install app. No --chown here: the "app" user only exists in the
|
||||
# runner stage, and Podman (unlike Docker/BuildKit) refuses to resolve it. Final
|
||||
# ownership is set when these files are copied into the runner stage below.
|
||||
COPY migrations /home/app/spoolman/migrations
|
||||
COPY spoolman /home/app/spoolman/spoolman
|
||||
COPY alembic.ini README.md uv.lock pyproject.toml /home/app/spoolman/
|
||||
RUN --mount=type=cache,target=/root/.cache/uv \
|
||||
uv sync --locked
|
||||
uv sync --locked \
|
||||
&& uv cache prune --ci
|
||||
|
||||
FROM python:3.14-slim-bookworm AS python-runner
|
||||
|
||||
@@ -48,14 +62,14 @@ RUN apt-get update && apt-get install -y \
|
||||
&& rm -rf /var/lib/apt/lists/*
|
||||
|
||||
# Add local user so we don't run as root
|
||||
RUN groupmod -g 1000 users \
|
||||
&& useradd -u 1000 -U app \
|
||||
&& usermod -G users app \
|
||||
RUN useradd -u 1000 -U app \
|
||||
&& mkdir -p /home/app/.local/share/spoolman \
|
||||
&& chown -R app:app /home/app/.local/share/spoolman
|
||||
|
||||
# Copy built client
|
||||
# Copy built clients. The new Svelte client (client_v2) is served by default; the
|
||||
# legacy React client (client/dist) is kept for the SPOOLMAN_LEGACY_CLIENT fallback.
|
||||
COPY --chown=app:app ./client/dist /home/app/spoolman/client/dist
|
||||
COPY --chown=app:app ./client_v2/build /home/app/spoolman/client_v2/build
|
||||
|
||||
# Copy built app
|
||||
COPY --chown=app:app --from=python-builder /home/app/spoolman /home/app/spoolman
|
||||
|
||||
@@ -12,6 +12,7 @@ Spoolman is a self-hosted web service designed to help you efficiently manage yo
|
||||
|
||||
[](https://github.com/Donkie/Spoolman/wiki)
|
||||
[](https://github.com/Donkie/Spoolman/releases)
|
||||
[](https://github.com/sponsors/Donkie)
|
||||
|
||||
### Features
|
||||
* **Filament Management**: Keep comprehensive records of filament types, manufacturers, and individual spools.
|
||||
@@ -20,8 +21,9 @@ Spoolman is a self-hosted web service designed to help you efficiently manage yo
|
||||
* **Central Filament Database**: A community-supported database of manufacturers and filaments simplify adding new spools to your inventory. Contribute by heading to [SpoolmanDB](https://github.com/Donkie/SpoolmanDB).
|
||||
* **Web-Based Client**: Spoolman includes a built-in web client that lets you manage data effortlessly:
|
||||
* View, create, edit, and delete filament data.
|
||||
* Search, group and filter your inventory by manufacturer, material, location and more.
|
||||
* Add custom fields to tailor information to your specific needs.
|
||||
* Print labels with QR codes for easy spool identification and tracking.
|
||||
* Design and print labels with QR codes for easy spool identification and tracking.
|
||||
* Contribute to its translation into 18 languages via [Weblate](https://hosted.weblate.org/projects/spoolman/).
|
||||
* **Database Support**: SQLite, PostgreSQL, MySQL, and CockroachDB.
|
||||
* **Multi-Printer Management**: Handles spool updates from several printers simultaneously.
|
||||
@@ -32,9 +34,33 @@ Spoolman is a self-hosted web service designed to help you efficiently manage yo
|
||||
* [OctoPrint](https://github.com/mdziekon/octoprint-spoolman)
|
||||
* [OctoEverywhere](https://octoeverywhere.com/spoolman?source=github_spoolman)
|
||||
* [Home Assistant](https://github.com/Disane87/spoolman-homeassistant)
|
||||
* [MCP Server](https://github.com/Disane87/spoolman-mcp) - Manage your filament inventory through AI assistants like Claude using the Model Context Protocol
|
||||
|
||||
**Web client preview:**
|
||||

|
||||

|
||||
|
||||
<table>
|
||||
<tr>
|
||||
<td width="50%"><img alt="The Spoolman dashboard, showing spools as draggable cards grouped by storage location" src=".github/media/dashboard-screenshot.png"></td>
|
||||
<td width="50%"><img alt="The Spoolman label designer, showing a 50 by 25 mm spool label with a QR code, filament name and colour swatch" src=".github/media/label-designer-screenshot.png"></td>
|
||||
</tr>
|
||||
<tr>
|
||||
<td align="center"><sub>Dashboard — spools as cards, grouped by location or any other field. Drag one to move it.</sub></td>
|
||||
<td align="center"><sub>Label designer — QR labels built from any spool, filament or vendor field.</sub></td>
|
||||
</tr>
|
||||
</table>
|
||||
|
||||
## Installation
|
||||
Please see the [Installation page on the Wiki](https://github.com/Donkie/Spoolman/wiki/Installation) for details how to install Spoolman.
|
||||
|
||||
If the new client misbehaves on your setup, set `SPOOLMAN_LEGACY_CLIENT=TRUE` to go back to
|
||||
the previous one. Both ship in every release and talk to the same API, so your data is
|
||||
untouched either way — but please [report the problem](https://github.com/Donkie/Spoolman/issues)
|
||||
so it can be fixed.
|
||||
|
||||
## Sponsors
|
||||
Spoolman is developed and maintained in my spare time. If it is useful to you, consider [sponsoring the project](https://github.com/sponsors/Donkie).
|
||||
|
||||
<a href="https://github.com/sponsors/Donkie">
|
||||
<img alt="The people currently sponsoring Spoolman" src=".github/media/sponsors.svg">
|
||||
</a>
|
||||
@@ -18,6 +18,8 @@
|
||||
.env.development.local
|
||||
.env.test.local
|
||||
.env.production.local
|
||||
# Generated at build time (CI and tests_frontend/run.py) — never committed
|
||||
.env.production
|
||||
|
||||
npm-debug.log*
|
||||
yarn-debug.log*
|
||||
|
||||
@@ -1,5 +1,6 @@
|
||||
{
|
||||
"printWidth": 120,
|
||||
"endOfLine": "auto",
|
||||
"overrides": [
|
||||
{
|
||||
"files": ["public/locales/**/*.json"],
|
||||
|
||||
Generated
+2419
-1884
File diff suppressed because it is too large.
Load diff
+9
-4
@@ -1,8 +1,8 @@
|
||||
{
|
||||
"name": "spoolman-ui",
|
||||
"version": "0.22.1",
|
||||
"version": "0.27.0",
|
||||
"engines": {
|
||||
"node": "20.x"
|
||||
"node": "^20.19 || ^22.12 || >=24"
|
||||
},
|
||||
"private": true,
|
||||
"type": "module",
|
||||
@@ -28,12 +28,17 @@
|
||||
"react-dnd-html5-backend": "^16.0.1",
|
||||
"react-dom": "^19.2.3",
|
||||
"react-i18next": "^16.5.1",
|
||||
"react-router": "^7.11.0",
|
||||
"react-router": "^7.18.3",
|
||||
"react-to-print": "^3.2.0",
|
||||
"uuid": "^13.0.0",
|
||||
"uuid": "^14.0.0",
|
||||
"vite-plugin-svgr": "^4.5.0",
|
||||
"zustand": "^5.0.9"
|
||||
},
|
||||
"overrides": {
|
||||
"@ant-design/pro-layout": {
|
||||
"path-to-regexp": "^8.4.0"
|
||||
}
|
||||
},
|
||||
"devDependencies": {
|
||||
"@eslint/js": "^9.39.2",
|
||||
"@refinedev/cli": "^2.16.50",
|
||||
|
||||
Binary file not shown.
|
Before Width: | Height: | Size: 2.9 KiB |
@@ -60,8 +60,8 @@
|
||||
"printing": {
|
||||
"generic": {
|
||||
"title": "Probíhá tisk",
|
||||
"description": "Níže uvedeným nastavením dosáhnete požadovaného rozložení tisku. Mějte na paměti, že tiskárny a váš operační systém mohou použít vlastní okraje a měřítka, takže možná budete muset provést několik pokusů a omylů, než bude vše správně nastaveno. Před tiskem na skutečné štítky si to vyzkoušejte na kousku běžného papíru.",
|
||||
"helpMargin": "Okraje by měly být nastaveny tak, aby odpovídaly papíru na štítky a tiskárně, jejich změna ovlivní velikost celé mřížky.",
|
||||
"description": "Níže uvedeným nastavením dosáhnete požadovaného rozložení tisku. Mějte na paměti, že tiskárny a váš operační systém mohou použít vlastní okraje a měřítka, takže možná budete muset provést několik pokusů a omylů, než bude vše správně nastaveno. Před tiskem na skutečné etikety si to vyzkoušejte na listu běžného papíru.",
|
||||
"helpMargin": "Okraje by měly být nastaveny tak, aby odpovídaly listu etiket a tiskárně, jejich změna ovlivní velikost celé mřížky.",
|
||||
"helpPrinterMargin": "Bezpečná zóna by měla být nastavena tak, jak blízko okraje papíru může tiskárna tisknout, jejich změna neovlivní celou mřížku.",
|
||||
"print": "Tisk",
|
||||
"columns": "Sloupce",
|
||||
@@ -102,16 +102,16 @@
|
||||
"saveAsImage": "Uložit jako obrázek"
|
||||
},
|
||||
"qrcode": {
|
||||
"button": "Tisk štítků",
|
||||
"title": "Tisk štítku",
|
||||
"button": "Tisk etiket",
|
||||
"title": "Tisk etikety",
|
||||
"spoolWeight": "Hmotnost cívky: {{weight}}",
|
||||
"lotNr": "Číslo šarže: {{lot}}",
|
||||
"bedTemp": "BT: {{temp}}",
|
||||
"extruderTemp": "ET: {{temp}}",
|
||||
"textSize": "Velikost textu štítku",
|
||||
"textSize": "Velikost textu etikety",
|
||||
"showSpoolmanIcon": "Zobrazit ikonu Spoolman",
|
||||
"showVendor": "Výrobce",
|
||||
"showContent": "Tisk štítku",
|
||||
"showContent": "Tisk etikety",
|
||||
"showLotNr": "Číslo šarže",
|
||||
"showSpoolWeight": "Hmotnost cívky",
|
||||
"showTemperatures": "Teploty",
|
||||
@@ -127,7 +127,7 @@
|
||||
},
|
||||
"preview": "Náhled:"
|
||||
},
|
||||
"template": "Šablona štítku",
|
||||
"template": "Šablona etikety",
|
||||
"templateHelp": "Pomocí {} vložíte hodnoty objektu cívky jako text. Například, {id} bude nahrazeno ID cívky nebo {filament.material} bude nahrazeno materiálem cívky. Pokud hodnota chybí, bude nahrazena znakem „?“. K odstranění této hodnoty lze použít druhou sadu {}. Kromě toho bude odstraněn jakýkoli text mezi sadami {}, pokud hodnota chybí. Například {Lot Nr: {lot_nr}} zobrazí popisek pouze v případě, že cívka má číslo šarže. Text uzavřete dvojitou hvězdičkou **, aby byl tučný. Kliknutím na tlačítko zobrazíte seznam všech dostupných značek.",
|
||||
"showQRCode": "Tisk QR kódu",
|
||||
"showQRCodeMode": {
|
||||
@@ -138,7 +138,7 @@
|
||||
},
|
||||
"spoolSelect": {
|
||||
"title": "Vybrat cívky",
|
||||
"description": "Vyberte cívky, pro které chcete tisknout štítky.",
|
||||
"description": "Vyberte cívky, pro které chcete tisknout etikety.",
|
||||
"showArchived": "Zobrazit archivované",
|
||||
"noSpoolsSelected": "Nevybrali jste žádné cívky.",
|
||||
"selectAll": "Vybrat/odebrat vše",
|
||||
@@ -351,7 +351,7 @@
|
||||
"kofi": "Příspěvek autorovi na Ko-fi",
|
||||
"home": {
|
||||
"home": "Domů",
|
||||
"description": "Vypadá to, že jste ještě nepřidali žádné cívky. Úvodní nápovědu najdete na stránce <helpPageLink>Help page</helpPageLink> .",
|
||||
"description": "Vypadá to, že jste ještě nepřidali žádné cívky. Úvodní nápovědu najdete na stránce <helpPageLink>Nápověda</helpPageLink> .",
|
||||
"welcome": "Vítejte ve vaší instanci Spoolman!"
|
||||
},
|
||||
"settings": {
|
||||
@@ -383,8 +383,9 @@
|
||||
"non_unique_key_error": "Tento klíč musí být jedinečný.",
|
||||
"key_not_changed": "Změňte prosím klíč na jiný.",
|
||||
"delete_confirm": "Smazat pole {{name}}?",
|
||||
"description": "<p>Zde můžete přidat další vlastní pole k subjektům.</p><p>Jakmile je pole přidáno, nemůžete změnit jeho klíč ani typ a u polí typu výběr nemůžete odebrat volby ani změnit stav více voleb. Pokud pole odstraníte, budou odstraněna přidružená data pro všechny subjekty.</p><p>Klíčové je, jako co ostatní programy čtou/zapisují data, takže pokud má být vaše vlastní pole integrováno s programem třetí strany, ujistěte se, že je správně nastaveno. Výchozí hodnota se použije pouze pro nové položky.</p><p>Výstupní pole nelze v zobrazeních tabulky řadit ani filtrovat.</p>",
|
||||
"delete_confirm_description": "Tím se odstraní pole a všechna související data pro všechny subjekty."
|
||||
"description": "<p>Zde můžete přidat další vlastní pole k subjektům.</p><p>Jakmile je pole přidáno, nelze změnit jeho klíč ani typ; u polí typu „výběr“ nelze odstranit možnosti ani změnit nastavení pro více výběrů. Pokud pole odstraníte, budou smazána související data u všech subjektů.</p><p>Klíč určuje, pod jakým názvem budou data čtena a zapisována jinými programy, takže pokud má být vaše vlastní pole integrováno s programem třetí strany ujistěte se, že je správně nastaveno. Výchozí hodnota se použije pouze u nových položek.</p><p>Vlastní pole lze zobrazit a seřadit v tabulkových zobrazeních. Pole s výběrem a logická pole zde také nabízejí možnosti filtrování a všechny typy vlastních polí podporují filtrování podle prázdných hodnot.</p>",
|
||||
"delete_confirm_description": "Tím se odstraní pole a všechna související data pro všechny subjekty.",
|
||||
"choices_reorder_hint": "Přetažením nebo pomocí šipek můžete změnit pořadí této volby."
|
||||
},
|
||||
"header": "Nastavení",
|
||||
"general": {
|
||||
@@ -408,5 +409,11 @@
|
||||
"no_locations_help": "Na této stránce můžete uspořádat své cívky podle umístění, přidejte několik cívek a začněte!",
|
||||
"new_location": "Nové umístění",
|
||||
"no_location": "Žádné umístění"
|
||||
},
|
||||
"theme": {
|
||||
"label": "Téma",
|
||||
"system": "Systém",
|
||||
"light": "Světlé",
|
||||
"dark": "Tmavé"
|
||||
}
|
||||
}
|
||||
@@ -3,22 +3,37 @@
|
||||
"qrcode": {
|
||||
"extruderTemp": "ET: {{temp}}",
|
||||
"showSpoolWeight": "Spole vægt",
|
||||
"showContent": "Print label",
|
||||
"showContent": "Print etiket",
|
||||
"showVendorComment": "Sælger kommentarer",
|
||||
"spoolWeight": "Spole vægt: {{weight}}",
|
||||
"showTemperatures": "Temperaturer",
|
||||
"showVendor": "Sælger",
|
||||
"showSpoolComment": "Spole kommentarer",
|
||||
"textSize": "Indholdstekst størrelse",
|
||||
"title": "QR kode printer",
|
||||
"textSize": "Etikette tekststørrelse",
|
||||
"title": "Etiketprint",
|
||||
"showSpoolmanIcon": "Vis Spoolman logo",
|
||||
"showLotNr": "Gruppe nr",
|
||||
"bedTemp": "BT: {{temp}}",
|
||||
"lotNr": "Gruppe nr: {{lot}}",
|
||||
"showFilamentComment": "Filament kommentarer",
|
||||
"button": "Print QR koder",
|
||||
"template": "Skabelon",
|
||||
"templateHelp": "Brug {} til at indsætte værdier for spolen som tekst. For eksempen vil {id} blive erstattet med spolens id, eller {filament.material} vil blive erstattet med materialet på spolen. Omgiv teksten med dobbelte asterisk ** for at gøre teksten fed. Klik på knappen for at vise en liste med mulige tags."
|
||||
"button": "Print etiketter",
|
||||
"template": "Etiketskabelon",
|
||||
"templateHelp": "Brug {} til at indsætte værdier for spolen som tekst. For eksempel vil {id} blive erstattet med spolens id, eller {filament.material} vil blive erstattet med materialet på spolen. Hvis en værdi mangler, vil den blive erstattet med \"?\". Et andet set af {} kan bruges for at fjerne dette. Derudover vil al tekst mellem sættene af {} blive fjernet, hvis værdien mangler. For eksemel, {Lot Nr: {lot_nr}} vil kun vise etiketten, hvis spolen har et partinummer (Lot Nr). Omgiv teksten med dobbelte asterisk ** for at gøre teksten fed. Klik på knappen for at vise en liste med mulige tags.",
|
||||
"useHTTPUrl": {
|
||||
"options": {
|
||||
"default": "Standard",
|
||||
"url": "Webadresse"
|
||||
},
|
||||
"preview": "Forhåndsvisning:",
|
||||
"tooltip": "Vil bruge proprietært link, der kun vil virke, hvis skannet med Spoolmans skanningsfunktion (standard). Webadressen bruger enten den basis-webadresse, specificeret i indstillinger, eller den nuværende sides webadresse, hvis ikke indstillet.",
|
||||
"label": "QR-kode link"
|
||||
},
|
||||
"showQRCodeMode": {
|
||||
"withIcon": "Med ikon",
|
||||
"no": "Nej",
|
||||
"simple": "Simpel"
|
||||
},
|
||||
"showQRCode": "Print QR-kode"
|
||||
},
|
||||
"generic": {
|
||||
"printerMarginBottom": "Safe-Zone bund",
|
||||
@@ -36,14 +51,14 @@
|
||||
"marginRight": "Højre margen",
|
||||
"printerMarginRight": "Safe-Zone højre",
|
||||
"helpPrinterMargin": "\"Safe-Zone\" bør indstilles til hvor tæt på kanten af papiret din printer kan printe. Ændringer her vil IKKE have indflydelse på hele layoutet.",
|
||||
"previewScale": "Visnings størrelse",
|
||||
"helpMargin": "Margener bør indstilles til at matche din printer og dit papir. Ændringer her vil have indflydelse på hele layoutet.",
|
||||
"previewScale": "Visningsstørrelse",
|
||||
"helpMargin": "Margener bør indstilles til at matche din printer og papir. Ændringer her vil have indflydelse på hele layoutet.",
|
||||
"marginTop": "Top margen",
|
||||
"skipItems": "Spring over",
|
||||
"layoutSettings": "Layout indstillinger",
|
||||
"paperSize": "Papir størrelse",
|
||||
"layoutSettings": "Layoutindstillinger",
|
||||
"paperSize": "Papirstørrelse",
|
||||
"columns": "Kolonner",
|
||||
"description": "Redigér nedenstående indstillinger for at opnå det ønskede layout. Husk på at printere og OS kan tilføje dets egne margener og skalering, så det kan kræve et par forsøg før alt er korrekt. Test på et stykke almindeligt papir før du udskriver på labels.",
|
||||
"description": "Redigér nedenstående indstillinger for at opnå det ønskede layout. Husk på at printere og dit operativsystem kan tilføje deres egne margener og skalering, så det kan kræve et par forsøg, før alt er korrekt. Test på et stykke almindeligt papir, før du udskriver på etiketter.",
|
||||
"marginBottom": "Bund margen",
|
||||
"horizontalSpacing": "Horisontal afstand",
|
||||
"marginLeft": "Venstre margen",
|
||||
@@ -51,23 +66,26 @@
|
||||
"printerMarginLeft": "Safe-Zone venstre",
|
||||
"dimensions": "Dimensioner",
|
||||
"print": "Udskriv",
|
||||
"settings": "Indstillinger",
|
||||
"settings": "Forudindstillinger",
|
||||
"defaultSettings": "Standard",
|
||||
"addSettings": "Tilføj ny indstilling",
|
||||
"addSettings": "Tilføj ny forudindstilling",
|
||||
"newSetting": "Ny",
|
||||
"deleteSettings": "Slet nuværende indstilling",
|
||||
"deleteSettingsConfirm": "Er du sikker på du vil slette denne indstilling?",
|
||||
"settingsName": "Indstillingsnavn",
|
||||
"itemCopies": "Kopier"
|
||||
"deleteSettings": "Slet nuværende forudindstilling",
|
||||
"deleteSettingsConfirm": "Er du sikker på, at du vil slette denne forudindstilling?",
|
||||
"settingsName": "Forudindstillingsnavn",
|
||||
"itemCopies": "Kopier",
|
||||
"duplicateSettings": "Duplikér",
|
||||
"saveSetting": "Gem forudindstillinger",
|
||||
"saveAsImage": "Gem som Billede"
|
||||
},
|
||||
"spoolSelect": {
|
||||
"selectedTotal_one": "{{count}} spole valgt",
|
||||
"selectedTotal_other": "{{count}} spoler valgt",
|
||||
"description": "Vælg spoler der skal printes QR koder til.",
|
||||
"description": "Vælg spoler, der skal printes etiketter til.",
|
||||
"showArchived": "Vis arkiverede",
|
||||
"title": "Vælg spoler",
|
||||
"selectAll": "Vælg alle/ingen",
|
||||
"noSpoolsSelected": "Du har ikke valgt nogle spoler."
|
||||
"noSpoolsSelected": "Du har ikke valgt nogen spoler."
|
||||
}
|
||||
},
|
||||
"documentTitle": {
|
||||
@@ -99,15 +117,18 @@
|
||||
},
|
||||
"help": {
|
||||
"list": "Hjælp | Spoolman"
|
||||
},
|
||||
"locations": {
|
||||
"list": "Lokationer | Spoolman"
|
||||
}
|
||||
},
|
||||
"spool": {
|
||||
"fields": {
|
||||
"measured_weight": "Målt vægt",
|
||||
"last_used": "Sidst brugt",
|
||||
"last_used": "Sidst anvendt",
|
||||
"material": "Materiale",
|
||||
"weight_to_use": "Vægt",
|
||||
"lot_nr": "Gruppe nr",
|
||||
"lot_nr": "Partinummer",
|
||||
"filament_name": "Filament",
|
||||
"comment": "Kommentar",
|
||||
"filament": "Filament",
|
||||
@@ -116,7 +137,7 @@
|
||||
"archived": "Arkiveret",
|
||||
"remaining_length": "Resterende længde",
|
||||
"registered": "Registreret",
|
||||
"first_used": "Først brugt",
|
||||
"first_used": "Først anvendt",
|
||||
"used_weight": "Brugt vægt",
|
||||
"id": "ID",
|
||||
"remaining_weight": "Resterende vægt",
|
||||
@@ -133,34 +154,45 @@
|
||||
"create": "Opret spole",
|
||||
"clone": "Klon spole",
|
||||
"show_title": "[Spole #{{id}}] {{name}}",
|
||||
"list": "Spoler"
|
||||
"list": "Spoler",
|
||||
"adjust": "Tilpas spolefilament"
|
||||
},
|
||||
"form": {
|
||||
"spool_updated": "Denne spole er blevet redigeret af nogen/noget andet siden du åbnede denne side. Hvis du gemmer overskrives disse ændringer!",
|
||||
"new_location_prompt": "Indtast ny placering"
|
||||
"new_location_prompt": "Indtast ny placering",
|
||||
"measurement_type_label": "Måletype",
|
||||
"adjust_filament_value": "Fjern mængde",
|
||||
"measurement_type": {
|
||||
"weight": "Vægt",
|
||||
"length": "Længde"
|
||||
},
|
||||
"adjust_filament_help": "Her kan du direkte tilføje eller fjerne filament fra spolen. En positiv værdi vil fjerne filament, en negativ værdi vil tilføje det."
|
||||
},
|
||||
"fields_help": {
|
||||
"used_weight": "Hvor meget filament er der brugt fra spolen. En ny spole bør have 0g brugt.",
|
||||
"weight_to_use": "Vælg hvilken vægt der skal angives. Målt vægt er kun tilgængelig hvis der er indstillet en spole vægt for det valgte filament.",
|
||||
"measured_weight": "Hvor meget filament OG spole vejer.",
|
||||
"lot_nr": "Producentens \"batchnummer\". Kan bruges til at sikre ensartede farver ved brug af flere ruller.",
|
||||
"remaining_weight": "Hvor meget filament er der tilbage på spolen. For en ny spole bør dette matches spolens vægt.",
|
||||
"location": "Placering af spolen. Hvis du har flere lokationer.",
|
||||
"price": "Pris for en fuld spole. Hvis ikke indstillet, vil prisen bliver estimeret.",
|
||||
"external_filament": "Du har valgt et Filament fra den eksterne database, Et Filament (og muligvis en Producent) vil blive oprettet automatisk når du gemmer denne spole. Dette kan oprette duplikerede objekter, hvis du allerede har dette filament oprettet.",
|
||||
"initial_weight": "Startvægten af filament på spolen (nettovægt). Bruger filamentets standardvægt hvis ikke angivet.",
|
||||
"spool_weight": "Vægten af spolen når den er tom. Et tomt felt vil bruge værdien fra Filament eller Producent."
|
||||
"weight_to_use": "Vælg hvilken vægt der skal angives. Målt vægt er kun tilgængelig, hvis der er indstillet en spolevægt for det valgte filament.",
|
||||
"measured_weight": "Hvor meget filament og spole vejer.",
|
||||
"lot_nr": "Producentens \"batch/partinummer\". Kan bruges til at sikre ensartede farver ved brug af flere ruller.",
|
||||
"remaining_weight": "Hvor meget filament er der tilbage på spolen. For en ny spole bør dette matche spolens vægt.",
|
||||
"location": "Placering af spolen, hvis du opbevarer spoler flere steder.",
|
||||
"price": "Pris for en fuld spole. Hvis ikke indstillet, vil prisen i stedet blive antaget.",
|
||||
"external_filament": "Du har valgt et filament fra den eksterne database. Et filament (og muligvis en producent) vil blive oprettet automatisk, når du gemmer denne spole. Dette kan skabe duplikerede objekter, hvis du allerede har oprettet dette filament.",
|
||||
"initial_weight": "Startvægten af filament på spolen (nettovægt). Bruger filamentets standardvægt, hvis ikke angivet.",
|
||||
"spool_weight": "Vægten af spolen når den er tom. Et tomt felt vil bruge værdien fra filament eller producent."
|
||||
},
|
||||
"spool": "Spoler",
|
||||
"messages": {
|
||||
"archive": "Er du sikker på du vil arkivere denne spole?"
|
||||
},
|
||||
"formats": {
|
||||
"last_used": "Sidst anvendt {{date}}"
|
||||
}
|
||||
},
|
||||
"buttons": {
|
||||
"create": "Opret",
|
||||
"save": "Gem",
|
||||
"show": "Vis",
|
||||
"filter": "Filter",
|
||||
"filter": "Filtrér",
|
||||
"cancel": "Annuller",
|
||||
"edit": "Redigér",
|
||||
"showArchived": "Vis arkiverede",
|
||||
@@ -175,48 +207,49 @@
|
||||
"notAccessTitle": "Du har ikke tilladelse til at tilgå",
|
||||
"hideArchived": "Skjul arkiverede",
|
||||
"clearFilters": "Ryd filtre",
|
||||
"unArchive": "Fjern fra arkiv",
|
||||
"unArchive": "Gendan arkiv",
|
||||
"clone": "Klon",
|
||||
"clear": "Ryd",
|
||||
"saveAndAdd": "Gem og Tilføj"
|
||||
"saveAndAdd": "Gem og Tilføj",
|
||||
"continue": "Fortsæt"
|
||||
},
|
||||
"filament": {
|
||||
"fields_help": {
|
||||
"name": "Filament navn, for at adskille dette filament fra andre fra samme producent. Kan for eksempel indeholde farven.",
|
||||
"article_number": "f.eks. EAN, UPC osv.",
|
||||
"name": "Filamentnavn, for at adskille dette filament fra andre fra samme producent. Kan for eksempel indeholde farven.",
|
||||
"article_number": "F.eks. EAN, UPC, e.l.",
|
||||
"spool_weight": "Vægten af en tom spole. Bruges til at angive den målte vægt af en spole.",
|
||||
"price": "Pris for en ny spole.",
|
||||
"weight": "Filamentets vægt på en ny spole (Netto vægt). Dette bør ikke inkludere vægten af selve spolen, kun filamentet. Det er som regel den angivne vægt på pakken.",
|
||||
"material": "f.eks. PLA, ABS, PETG osv.",
|
||||
"multi_color_direction": "Filamenter kan have flere farver på to måder: Enten koaksialt, som 2- & 3-farvede filamenter med vedvarende flerfarvethed, eller gennem længdeværts ændringer, som regnbuefilamenter, hvor farven skifter undervejs på spolen."
|
||||
"weight": "Filamentets vægt på en ny spole (nettovægt). Dette bør ikke inkludere vægten af selve spolen, kun filamentet. Det er som regel den angivne vægt på pakken.",
|
||||
"material": "F.eks. PLA, ABS, PETG, m.m.",
|
||||
"multi_color_direction": "Filamenter kan have flere farver på to måder: Enten koaksialt, som 2- & 3-farvede filamenter med vedvarende flerfarvethed, eller gennem langsgående ændringer, som regnbuefilamenter, hvor farven skifter undervejs på spolen."
|
||||
},
|
||||
"fields": {
|
||||
"material": "Materiale",
|
||||
"vendor_name": "Producent",
|
||||
"settings_extruder_temp": "Extruder temperatur",
|
||||
"settings_extruder_temp": "Ekstrudertemperatur",
|
||||
"comment": "Kommentar",
|
||||
"diameter": "Diameter",
|
||||
"weight": "Vægt",
|
||||
"spool_weight": "Spole vægt",
|
||||
"spool_weight": "Spolevægt",
|
||||
"registered": "Registreret",
|
||||
"name": "Navn",
|
||||
"price": "Pris",
|
||||
"settings_bed_temp": "Bed temperatur",
|
||||
"settings_bed_temp": "Printpladetemperatur",
|
||||
"vendor": "Producent",
|
||||
"density": "Massefylde",
|
||||
"id": "ID",
|
||||
"color_hex": "Farve",
|
||||
"article_number": "Produkt nummer",
|
||||
"article_number": "Produktnummer",
|
||||
"spools": "Vis spoler",
|
||||
"external_id": "Eksternt ID",
|
||||
"longitudinal": "Længdeværts",
|
||||
"longitudinal": "Langsgående",
|
||||
"multi_color": "Flerfarvet",
|
||||
"coaxial": "Koaksialt",
|
||||
"single_color": "Enkeltfarvet"
|
||||
},
|
||||
"titles": {
|
||||
"clone": "Klon filament",
|
||||
"show_title": "[Filament # {{id}}] {{name}}",
|
||||
"show_title": "[Filament #{{id}}] {{name}}",
|
||||
"show": "Vis filament",
|
||||
"create": "Opret filament",
|
||||
"edit": "Redigér filament",
|
||||
@@ -224,8 +257,8 @@
|
||||
},
|
||||
"form": {
|
||||
"filament_updated": "Dette filament er blevet redigeret af nogen/noget andet siden du åbnede denne side. Hvis du gemmer overskrives disse ændringer!",
|
||||
"import_external": "Importér fra Eksternt",
|
||||
"import_external_description": "Vælg et filament på listen for automatisk at udfylde formularen. Dette vil overskrive alle data du allerede har indtastet i formularen. <br><br> En Producent vil blive oprettet automatisk hvis nødvendigt, når du klikker OK."
|
||||
"import_external": "Importér fra ekstern kilde",
|
||||
"import_external_description": "Vælg et filament på listen, for automatisk at udfylde detaljerne i formularen. Dette vil overskrive al data, du allerede har indtastet i formularen. <br><br> En producent vil blive oprettet automatisk, hvis nødvendigt, når du klikker OK."
|
||||
},
|
||||
"filament": "Filamenter",
|
||||
"buttons": {
|
||||
@@ -265,28 +298,28 @@
|
||||
}
|
||||
},
|
||||
"scanner": {
|
||||
"title": "QR kode skanner",
|
||||
"title": "QR-kode skanner",
|
||||
"error": {
|
||||
"insecureContext": "Denne side er ikke sikret med HTTPS.",
|
||||
"notReadable": "Kameraet kan ikke indlæses.",
|
||||
"notAllowed": "Du har ikke tilladt adgang til kameraet.",
|
||||
"notAllowed": "Du har ikke givet adgang til kameraet.",
|
||||
"unknown": "En ukendt fejl opstod. {{error}}",
|
||||
"notFound": "Intet kamera fundet.",
|
||||
"streamApiNotSupported": "Denne browser understøtter ikke MediaStream API'et."
|
||||
},
|
||||
"description": "Skan en Spoolman QR kode for at se detaljer om spolen."
|
||||
"description": "Skan en Spoolman QR-kode for at se detaljer om spolen."
|
||||
},
|
||||
"notifications": {
|
||||
"deleteSuccess": "Sletning af {{resource}} lykkedes",
|
||||
"error": "Fejl (status kode: {{statusCode}})",
|
||||
"editError": "Fejl ved redigering af {{resource}} (status kode:{{statusCode}}",
|
||||
"deleteSuccess": "Sletning af {{resource}} var succesfuld(t)",
|
||||
"error": "Fejl (statuskode: {{statusCode}})",
|
||||
"editError": "Fejl ved redigering af {{resource}} (statuskode:{{statusCode}}",
|
||||
"undoable": "Du har {{seconds}} sekunder til at fortryde.",
|
||||
"importProgress": "Importerer: {{processed}}/{{total}}",
|
||||
"createError": "Der var en fejl under oprettelse af {{resource}} (status kode: {{statusCode}})",
|
||||
"createError": "Der var en fejl under oprettelsen af {{resource}} (statuskode: {{statusCode}})",
|
||||
"success": "Succes",
|
||||
"editSuccess": "Redigering af {{resource}} lykkedes",
|
||||
"deleteError": "Fejl ved sletning af {{resource}} (status kode: {{statusCode}})",
|
||||
"createSuccess": "Oprettelse af {{resource}} lykkedes",
|
||||
"editSuccess": "Redigering af {{resource}} var succesfuld(t)",
|
||||
"deleteError": "Fejl ved sletning af {{resource}} (statuskode: {{statusCode}})",
|
||||
"createSuccess": "Oprettelse af {{resource}} var succesfuld(t)",
|
||||
"saveSuccessful": "Gemt!",
|
||||
"validationError": "Kunne ikke gennemføres: {{error}}"
|
||||
},
|
||||
@@ -297,7 +330,7 @@
|
||||
"table": {
|
||||
"actions": "Handlinger"
|
||||
},
|
||||
"warnWhenUnsavedChanges": "Er du sikker på du ønsker at forlade? Du har ændringer der ikke er gemt.",
|
||||
"warnWhenUnsavedChanges": "Er du sikker på du ønsker at gå? Du har ændringer der ikke er gemt.",
|
||||
"loading": "Indlæser",
|
||||
"dashboard": {
|
||||
"title": "Kontrolpanel"
|
||||
@@ -307,16 +340,18 @@
|
||||
},
|
||||
"help": {
|
||||
"resources": {
|
||||
"vendor": "Firmaerne der laver filamentet.",
|
||||
"filament": "Filament mærker. De har værdier såsom Navn, Materiale, Farve, Diameter m.fl.",
|
||||
"vendor": "Firmaerne, der laver filamentet.",
|
||||
"filament": "Filamentmærker. De har værdier, såsom Navn, Materiale, Farve, Diameter, m.m.",
|
||||
"spool": "Individuelle fysiske spoler af et specifikt filament."
|
||||
},
|
||||
"description": "<title>Hjælp</title><p>Her er nogle tips til at komme i gang.</p><p>Spoolman indeholder 3 forskellige typer data:</p><itemsHelp/><p>For at tilføje en ny spole til databasen, skal du starte med at oprette et <filamentCreateLink>Filament</filamentCreateLink> objekt. Når dette er gjort, fortsættes der ved at oprette et <spoolCreateLink>Spole</spoolCreateLink> objekt for den specifikke spole. Hvis du har flere spoler af samme filament, opretter du blot et nyt spole objekt og genbruger samme filament. </p><p> Du har også mulighed for at oprette et <vendorCreateLink>Producent</vendorCreateLink> objekt for firmaet der producerer filamentet, hvis du ønsker.</p><p>Du har mulighed for at linke andre 3D printer services til Spoolman, Som f.eks. Moonraker. Dette giver mulighed for automatisk at opdatere og overvåge forbruget af filament for hvert print. Læs <readmeLink>Spoolman README</readmeLink> for information om opsætning af dette.</p>",
|
||||
"description": "<title>Hjælp</title><p>Her er nogle tips til at komme i gang.</p><p>Spoolman indeholder 3 forskellige typer data:</p><itemsHelp/><p>For at tilføje en ny spole til databasen, skal du starte med at oprette et <filamentCreateLink>Filamentobjekt</filamentCreateLink>. Når dette er gjort, fortsættes der ved at oprette et <spoolCreateLink>Spoleobjekt</spoolCreateLink> for den specifikke spole. Hvis du har flere spoler af samme filament, opretter du blot et nyt spole objekt og genbruger samme filament. </p><p> Du har også mulighed for at oprette et <vendorCreateLink>Producentobjekt</vendorCreateLink> for firmaet, der producerer filamentet, hvis du ønsker at holde styr på den information.</p><p>Du har mulighed for at linke andre 3D-printertjenester til Spoolman, Som f.eks. Moonraker. Dette giver mulighed for automatisk at opdatere og overvåge forbruget af filament for hvert print. Læs <readmeLink>Spoolman README</readmeLink> for information om opsætning af dette.</p>",
|
||||
"help": "Hjælp"
|
||||
},
|
||||
"kofi": "Donér på Ko-fi",
|
||||
"home": {
|
||||
"home": "Hjem"
|
||||
"home": "Hjem",
|
||||
"welcome": "Velkommen til din nye Spoolman instans!",
|
||||
"description": "Det ser ud til, at du ikke har tilføjet nogen spoler endnu. Tjek <helpPageLink>her</helpPageLink> for hjælp med at komme i gang."
|
||||
},
|
||||
"settings": {
|
||||
"header": "Indstillinger",
|
||||
@@ -324,6 +359,14 @@
|
||||
"tab": "Generelt",
|
||||
"currency": {
|
||||
"label": "Valuta"
|
||||
},
|
||||
"base_url": {
|
||||
"tooltip": "Basis-webadressen til at benytte ved generering af funktioner, såsom QR-koder.",
|
||||
"label": "Basis-webadresse"
|
||||
},
|
||||
"round_prices": {
|
||||
"label": "Afrund priser",
|
||||
"tooltip": "Afrund priser til nærmeste heltal."
|
||||
}
|
||||
},
|
||||
"extra_fields": {
|
||||
@@ -333,23 +376,23 @@
|
||||
"field_type": "Type",
|
||||
"unit": "Enhed",
|
||||
"order": "Sortering",
|
||||
"default_value": "Standard-værdi",
|
||||
"default_value": "Standardværdi",
|
||||
"multi_choice": "Multi-valg",
|
||||
"choices": "Valgmuligheder"
|
||||
},
|
||||
"field_type": {
|
||||
"integer_range": "Heltals spænd",
|
||||
"integer_range": "Heltalspænd",
|
||||
"float": "Decimaltal",
|
||||
"float_range": "Decimaltal spænd",
|
||||
"float_range": "Decimaltalspænd",
|
||||
"datetime": "Dato-tid",
|
||||
"boolean": "Boolean (Ja/Nej)",
|
||||
"choice": "Valg",
|
||||
"text": "Tekst",
|
||||
"integer": "Heltal"
|
||||
},
|
||||
"choices_missing_error": "Du kan ikke fjerne valg. De følgende valg mangler: {{choices}}",
|
||||
"choices_missing_error": "Du kan ikke fjerne valgmuligheder. De følgende valgmuligheder mangler: {{choices}}",
|
||||
"tab": "Ekstra felter",
|
||||
"description": "<p>Her kan du tilføje ekstra felter til dine poster.</p><p>Når et felt er tilføjet kan du ikke redigere Nøgle og Type, og for visse felttyper kan du ikke fjerne valg, eller ændre multi-valgs status. Hvis du fjerner et felt, vil associerede data i alle poster blive slettet.</p><p>Nøglen er hvad andre programmer læser/skriver data som, så hvis dit felt skal integreres med en tredje parts program, skal du sørge for at indstille det korrekt. Standard-værdi bliver kun tilføjet til nye felter.</p><p>Ekstra felter kan ikke bruges til sortering eller filtrering i oversigterne.</p>",
|
||||
"description": "<p>Her kan du tilføje ekstra felter til dine poster.</p><p>Når et felt er tilføjet kan du ikke redigere dens Nøgle eller Type, og for visse felttyper kan du ikke fjerne valg, eller ændre multi-valgstatus. Hvis du fjerner et felt, vil associeret data i alle poster blive slettet.</p><p>Nøglen er hvad andre programmer læser/skriver data som, så hvis dit felt skal integreres med et tredjepartsprogram, skal du sørge for at indstille det korrekt. Standardværdi bliver kun tilføjet til nye felter.</p><p>Ekstra felter kan ikke sorteres eller filtreres i oversigterne.</p>",
|
||||
"boolean_true": "Ja",
|
||||
"boolean_false": "Nej",
|
||||
"non_unique_key_error": "Nøglen skal være Unik.",
|
||||
@@ -358,5 +401,11 @@
|
||||
"delete_confirm_description": "Dette vil slette feltet samt alle associerede data for alle poster."
|
||||
},
|
||||
"settings": "Indstillinger"
|
||||
},
|
||||
"locations": {
|
||||
"new_location": "Ny lokation",
|
||||
"no_location": "Ingen lokation",
|
||||
"locations": "Lokationer",
|
||||
"no_locations_help": "Denne side lader dig organisere dine spoler i lokationer, tilføj nogle spoler for at komme i gang!"
|
||||
}
|
||||
}
|
||||
@@ -407,5 +407,6 @@
|
||||
"no_locations_help": "Diese Seite lässt Sie Ihre Spulen zu Orten zuweisen, fügen Sie ein paar Spulen hinzu um loszulegen!",
|
||||
"locations": "Orte",
|
||||
"new_location": "Neuer Ort"
|
||||
}
|
||||
},
|
||||
"sponsor": "Unterstütze mich auf GitHub"
|
||||
}
|
||||
@@ -16,7 +16,24 @@
|
||||
"bedTemp": "Θερμοκρασία κρεβατιού: {{temp}}",
|
||||
"lotNr": "Αριθμός παρτίδας: {{lot}}",
|
||||
"showFilamentComment": "Σχόλια Νήματος",
|
||||
"button": "Tύπωση Κωδικών QR"
|
||||
"button": "Tύπωση Κωδικών QR",
|
||||
"useHTTPUrl": {
|
||||
"options": {
|
||||
"default": "",
|
||||
"url": ""
|
||||
},
|
||||
"preview": "",
|
||||
"tooltip": "",
|
||||
"label": ""
|
||||
},
|
||||
"showQRCodeMode": {
|
||||
"withIcon": "",
|
||||
"no": "",
|
||||
"simple": ""
|
||||
},
|
||||
"templateHelp": "",
|
||||
"showQRCode": "",
|
||||
"template": ""
|
||||
},
|
||||
"generic": {
|
||||
"printerMarginBottom": "Ασφαλές Περιθώριο Κάτω",
|
||||
@@ -48,7 +65,18 @@
|
||||
"showBorder": "Εμφάνιση Περιθωρίου",
|
||||
"printerMarginLeft": "Ασφαλές Περιθώριο Αριστερά",
|
||||
"dimensions": "Διαστάσεις",
|
||||
"print": "Τύπωσε"
|
||||
"print": "Τύπωσε",
|
||||
"deleteSettingsConfirm": "",
|
||||
"deleteSettings": "",
|
||||
"itemCopies": "",
|
||||
"settingsName": "",
|
||||
"newSetting": "",
|
||||
"addSettings": "",
|
||||
"duplicateSettings": "",
|
||||
"settings": "",
|
||||
"saveSetting": "",
|
||||
"saveAsImage": "",
|
||||
"defaultSettings": ""
|
||||
},
|
||||
"spoolSelect": {
|
||||
"selectedTotal_one": "{{count}} καρούλι έχει επιλεγεί",
|
||||
@@ -89,6 +117,9 @@
|
||||
},
|
||||
"help": {
|
||||
"list": "Βοήθεια | Spoolman"
|
||||
},
|
||||
"locations": {
|
||||
"list": ""
|
||||
}
|
||||
},
|
||||
"spool": {
|
||||
@@ -112,7 +143,9 @@
|
||||
"remaining_weight": "Υπολειπόμενο Βάρος",
|
||||
"price": "Τιμή",
|
||||
"spool_weight": "Βάρος Κενού Καρουλιού",
|
||||
"initial_weight": "Αρχικό Βάρος"
|
||||
"initial_weight": "Αρχικό Βάρος",
|
||||
"filament_internal": "",
|
||||
"filament_external": ""
|
||||
},
|
||||
"titles": {
|
||||
"archive": "Αρχειοθέτηση Καρουλιού",
|
||||
@@ -121,11 +154,19 @@
|
||||
"create": "Δημιουργία Καρουλιού",
|
||||
"clone": "Αντιγραφή Καρουλιού",
|
||||
"show_title": "[Καρούλι #{{id}}] {{name}}",
|
||||
"list": "Καρούλια"
|
||||
"list": "Καρούλια",
|
||||
"adjust": ""
|
||||
},
|
||||
"form": {
|
||||
"spool_updated": "Αυτό το καρούλι έχει ενημερωθεί από κάποιον/κάτι άλλο από τότε που ανοίξατε αυτήν τη σελίδα. Η αποθήκευση θα αντικαταστήσει αυτές τις αλλαγές!",
|
||||
"new_location_prompt": "Προσθήκη νέας τοποθεσίας αποθήκευσης"
|
||||
"new_location_prompt": "Προσθήκη νέας τοποθεσίας αποθήκευσης",
|
||||
"measurement_type_label": "",
|
||||
"adjust_filament_value": "",
|
||||
"measurement_type": {
|
||||
"weight": "",
|
||||
"length": ""
|
||||
},
|
||||
"adjust_filament_help": ""
|
||||
},
|
||||
"fields_help": {
|
||||
"used_weight": "Πόσο νήμα έχει χρησιμοποιηθεί από το καρούλι. Σε ένα καινούργιο καρούλι θα πρέπει να έχουν χρησιμοποιηθεί 0g.",
|
||||
@@ -134,11 +175,17 @@
|
||||
"lot_nr": "Αριθμός παρτίδας κατασκευαστή. Μπορεί να χρησιμοποιηθεί για να διασφαλιστεί ότι μια εκτύπωση έχει σταθερό χρώμα εάν χρησιμοποιούνται πολλαπλά καρούλια.",
|
||||
"remaining_weight": "Πόσο νήμα έχει απομείνει στο καρούλι. Για ένα καινούργιο καρούλι αυτό πρέπει να συμπίπτει με το βάρος του καρουλιού.",
|
||||
"location": "Που βρίσκεται το καρούλι, εάν υπάρχουν πολλαπλά σημεία αποθήκευσης για τα καρούλια.",
|
||||
"price": "Τιμή πλήρους καρουλιού. Εάν δεν οριστεί, η τιμή του νήματος θα θεωρηθεί αντ' αυτού."
|
||||
"price": "Τιμή πλήρους καρουλιού. Εάν δεν οριστεί, η τιμή του νήματος θα θεωρηθεί αντ' αυτού.",
|
||||
"external_filament": "",
|
||||
"spool_weight": "",
|
||||
"initial_weight": ""
|
||||
},
|
||||
"spool": "Καρούλια",
|
||||
"messages": {
|
||||
"archive": "Είστε σίγουρος ότι θέλετε να αρχειοθετήσετε αυτό το καρούλι;"
|
||||
},
|
||||
"formats": {
|
||||
"last_used": ""
|
||||
}
|
||||
},
|
||||
"buttons": {
|
||||
@@ -163,7 +210,8 @@
|
||||
"unArchive": "Επαναφορά Αρχειοθετημένου",
|
||||
"clone": "Αντιγραφή",
|
||||
"clear": "Εκκαθάριση",
|
||||
"saveAndAdd": "Αποθήκευση και Προσθήκη"
|
||||
"saveAndAdd": "Αποθήκευση και Προσθήκη",
|
||||
"continue": ""
|
||||
},
|
||||
"filament": {
|
||||
"fields_help": {
|
||||
@@ -172,7 +220,8 @@
|
||||
"spool_weight": "Το βάρος ενός άδειου καρουλιού. Χρησιμοποιείται για τον προσδιορισμό του μετρημένου βάρους ενός καρουλιού.",
|
||||
"price": "Τιμή ενός πλήρους καρουλιού.",
|
||||
"weight": "Το βάρος του νήματος ενός πλήρους καρουλιού (καθαρό βάρος). Αυτό δεν πρέπει να περιλαμβάνει το βάρος του ίδιου του καρουλιού, μόνο το βάρος του νήματος. Είναι αυτό που συνήθως αναγράφεται στη συσκευασία.",
|
||||
"material": "Π.χ. PLA, ABS, PETG, κλπ."
|
||||
"material": "Π.χ. PLA, ABS, PETG, κλπ.",
|
||||
"multi_color_direction": ""
|
||||
},
|
||||
"fields": {
|
||||
"material": "Υλικό",
|
||||
@@ -191,7 +240,12 @@
|
||||
"id": "Α/Α",
|
||||
"color_hex": "Χρώμα",
|
||||
"article_number": "Κωδικός Προϊόντος",
|
||||
"spools": "Προβολή Καρουλιών"
|
||||
"spools": "Προβολή Καρουλιών",
|
||||
"multi_color": "",
|
||||
"external_id": "",
|
||||
"single_color": "",
|
||||
"longitudinal": "",
|
||||
"coaxial": ""
|
||||
},
|
||||
"titles": {
|
||||
"clone": "Αντιγραφή Νήματος",
|
||||
@@ -202,7 +256,9 @@
|
||||
"list": "Νήματα"
|
||||
},
|
||||
"form": {
|
||||
"filament_updated": "Αυτό το νήμα έχει ενημερωθεί από κάποιον/κάτι άλλο από τότε που ανοίξατε αυτήν τη σελίδα. Η αποθήκευση θα αντικαταστήσει αυτές τις αλλαγές!"
|
||||
"filament_updated": "Αυτό το νήμα έχει ενημερωθεί από κάποιον/κάτι άλλο από τότε που ανοίξατε αυτήν τη σελίδα. Η αποθήκευση θα αντικαταστήσει αυτές τις αλλαγές!",
|
||||
"import_external": "",
|
||||
"import_external_description": ""
|
||||
},
|
||||
"filament": "Νήματα",
|
||||
"buttons": {
|
||||
@@ -232,9 +288,14 @@
|
||||
"registered": "Ημερομηνία Εγγραφής",
|
||||
"comment": "Σχόλια",
|
||||
"name": "Όνομα",
|
||||
"id": "Α/Α"
|
||||
"id": "Α/Α",
|
||||
"external_id": "",
|
||||
"empty_spool_weight": ""
|
||||
},
|
||||
"vendor": "Προμηθευτές"
|
||||
"vendor": "Προμηθευτές",
|
||||
"fields_help": {
|
||||
"empty_spool_weight": ""
|
||||
}
|
||||
},
|
||||
"scanner": {
|
||||
"title": "Αναγνώστης κωδικού QR",
|
||||
@@ -288,7 +349,9 @@
|
||||
},
|
||||
"kofi": "Φιλοδώρημα στο Ko-fi",
|
||||
"home": {
|
||||
"home": "Αρχική"
|
||||
"home": "Αρχική",
|
||||
"welcome": "",
|
||||
"description": ""
|
||||
},
|
||||
"settings": {
|
||||
"extra_fields": {
|
||||
@@ -326,9 +389,23 @@
|
||||
"tab": "Γενικές",
|
||||
"currency": {
|
||||
"label": "Ετικέτα για τη ρύθμιση του νομίσματος"
|
||||
},
|
||||
"base_url": {
|
||||
"tooltip": "",
|
||||
"label": ""
|
||||
},
|
||||
"round_prices": {
|
||||
"label": "",
|
||||
"tooltip": ""
|
||||
}
|
||||
},
|
||||
"header": "Ρυθμίσεις",
|
||||
"settings": "Ρυθμίσεις"
|
||||
},
|
||||
"locations": {
|
||||
"new_location": "",
|
||||
"no_location": "",
|
||||
"locations": "",
|
||||
"no_locations_help": ""
|
||||
}
|
||||
}
|
||||
@@ -46,12 +46,18 @@
|
||||
"saveSuccessful": "Save successful!",
|
||||
"validationError": "Validation error: {{error}}"
|
||||
},
|
||||
"kofi": "Tip me on Ko-fi",
|
||||
"sponsor": "Sponsor me on GitHub",
|
||||
"loading": "Loading",
|
||||
"version": "Version",
|
||||
"unknown": "Unknown",
|
||||
"yes": "Yes",
|
||||
"no": "No",
|
||||
"theme": {
|
||||
"label": "Theme",
|
||||
"system": "System",
|
||||
"light": "Light",
|
||||
"dark": "Dark"
|
||||
},
|
||||
"tags": {
|
||||
"clone": "Clone"
|
||||
},
|
||||
@@ -326,7 +332,7 @@
|
||||
},
|
||||
"extra_fields": {
|
||||
"tab": "Extra Fields",
|
||||
"description": "<p>Here you can add extra custom fields to your entities.</p><p>Once a field is added, you can not change its key or type, and for choice type fields you can not remove choices or change the multi choice state. If you remove a field, the associated data for all entities will be deleted.</p><p>The key is what other programs read/write the data as, so if your custom field is supposed to integrate with a third-party program, make sure to set it correctly. Default value is only applied to new items.</p><p>Extra fields can not be sorted or filtered in the table views.</p>",
|
||||
"description": "<p>Here you can add extra custom fields to your entities.</p><p>Once a field is added, you can not change its key or type, and for choice type fields you can not remove choices or change the multi choice state. If you remove a field, the associated data for all entities will be deleted.</p><p>The key is what other programs read/write the data as, so if your custom field is supposed to integrate with a third-party program, make sure to set it correctly. Default value is only applied to new items.</p><p>Extra fields can be shown and sorted in the table views. Choice and boolean fields expose filter options there as well, and all extra field types support filtering for empty values.</p>",
|
||||
"params": {
|
||||
"key": "Key",
|
||||
"name": "Name",
|
||||
@@ -350,6 +356,7 @@
|
||||
"boolean_true": "Yes",
|
||||
"boolean_false": "No",
|
||||
"choices_missing_error": "You cannot remove choices. The following choices are missing: {{choices}}",
|
||||
"choices_reorder_hint": "Drag, or use the arrow keys, to reorder this choice.",
|
||||
"non_unique_key_error": "The key must be unique.",
|
||||
"key_not_changed": "Please change the key to something else.",
|
||||
"delete_confirm": "Delete field {{name}}?",
|
||||
|
||||
@@ -60,7 +60,340 @@
|
||||
},
|
||||
"printing": {
|
||||
"generic": {
|
||||
"title": "Trükkib"
|
||||
"title": "Trükkib",
|
||||
"printerMarginBottom": "",
|
||||
"verticalSpacing": "",
|
||||
"rows": "",
|
||||
"borders": {
|
||||
"none": "",
|
||||
"grid": "",
|
||||
"border": ""
|
||||
},
|
||||
"printerMarginTop": "",
|
||||
"deleteSettingsConfirm": "",
|
||||
"deleteSettings": "",
|
||||
"customSize": "",
|
||||
"contentSettings": "",
|
||||
"marginRight": "",
|
||||
"printerMarginRight": "",
|
||||
"itemCopies": "",
|
||||
"helpPrinterMargin": "",
|
||||
"settingsName": "",
|
||||
"previewScale": "",
|
||||
"helpMargin": "",
|
||||
"marginTop": "",
|
||||
"skipItems": "",
|
||||
"newSetting": "",
|
||||
"addSettings": "",
|
||||
"layoutSettings": "",
|
||||
"paperSize": "",
|
||||
"columns": "",
|
||||
"description": "",
|
||||
"marginBottom": "",
|
||||
"horizontalSpacing": "",
|
||||
"duplicateSettings": "",
|
||||
"settings": "",
|
||||
"saveSetting": "",
|
||||
"marginLeft": "",
|
||||
"showBorder": "",
|
||||
"saveAsImage": "",
|
||||
"printerMarginLeft": "",
|
||||
"dimensions": "",
|
||||
"defaultSettings": "",
|
||||
"print": ""
|
||||
},
|
||||
"qrcode": {
|
||||
"useHTTPUrl": {
|
||||
"options": {
|
||||
"default": "",
|
||||
"url": ""
|
||||
},
|
||||
"preview": "",
|
||||
"tooltip": "",
|
||||
"label": ""
|
||||
},
|
||||
"showContent": "",
|
||||
"showQRCodeMode": {
|
||||
"withIcon": "",
|
||||
"no": "",
|
||||
"simple": ""
|
||||
},
|
||||
"templateHelp": "",
|
||||
"textSize": "",
|
||||
"showQRCode": "",
|
||||
"template": "",
|
||||
"title": "",
|
||||
"button": ""
|
||||
},
|
||||
"spoolSelect": {
|
||||
"selectedTotal_one": "",
|
||||
"selectedTotal_other": "",
|
||||
"description": "",
|
||||
"showArchived": "",
|
||||
"title": "",
|
||||
"selectAll": "",
|
||||
"noSpoolsSelected": ""
|
||||
}
|
||||
},
|
||||
"vendor": {
|
||||
"fields": {
|
||||
"external_id": "",
|
||||
"registered": "",
|
||||
"comment": "",
|
||||
"name": "",
|
||||
"empty_spool_weight": "",
|
||||
"id": ""
|
||||
},
|
||||
"fields_help": {
|
||||
"empty_spool_weight": ""
|
||||
},
|
||||
"titles": {
|
||||
"show_title": "",
|
||||
"show": "",
|
||||
"edit": "",
|
||||
"clone": "",
|
||||
"create": "",
|
||||
"list": ""
|
||||
},
|
||||
"form": {
|
||||
"vendor_updated": ""
|
||||
},
|
||||
"vendor": ""
|
||||
},
|
||||
"documentTitle": {
|
||||
"vendor": {
|
||||
"create": "",
|
||||
"clone": "",
|
||||
"edit": "",
|
||||
"list": "",
|
||||
"show": ""
|
||||
},
|
||||
"default": "",
|
||||
"home": {
|
||||
"list": ""
|
||||
},
|
||||
"spool": {
|
||||
"edit": "",
|
||||
"list": "",
|
||||
"create": "",
|
||||
"show": "",
|
||||
"clone": ""
|
||||
},
|
||||
"filament": {
|
||||
"list": "",
|
||||
"show": "",
|
||||
"clone": "",
|
||||
"create": "",
|
||||
"edit": ""
|
||||
},
|
||||
"suffix": "",
|
||||
"locations": {
|
||||
"list": ""
|
||||
},
|
||||
"help": {
|
||||
"list": ""
|
||||
}
|
||||
},
|
||||
"spool": {
|
||||
"fields": {
|
||||
"measured_weight": "",
|
||||
"last_used": "",
|
||||
"filament_internal": "",
|
||||
"material": "",
|
||||
"spool_weight": "",
|
||||
"weight_to_use": "",
|
||||
"lot_nr": "",
|
||||
"filament_name": "",
|
||||
"price": "",
|
||||
"comment": "",
|
||||
"filament": "",
|
||||
"location": "",
|
||||
"used_length": "",
|
||||
"archived": "",
|
||||
"remaining_length": "",
|
||||
"registered": "",
|
||||
"first_used": "",
|
||||
"used_weight": "",
|
||||
"id": "",
|
||||
"remaining_weight": "",
|
||||
"initial_weight": "",
|
||||
"filament_external": ""
|
||||
},
|
||||
"titles": {
|
||||
"archive": "",
|
||||
"adjust": "",
|
||||
"show": "",
|
||||
"edit": "",
|
||||
"create": "",
|
||||
"clone": "",
|
||||
"show_title": "",
|
||||
"list": ""
|
||||
},
|
||||
"fields_help": {
|
||||
"external_filament": "",
|
||||
"used_weight": "",
|
||||
"weight_to_use": "",
|
||||
"measured_weight": "",
|
||||
"price": "",
|
||||
"spool_weight": "",
|
||||
"lot_nr": "",
|
||||
"remaining_weight": "",
|
||||
"location": "",
|
||||
"initial_weight": ""
|
||||
},
|
||||
"form": {
|
||||
"spool_updated": "",
|
||||
"measurement_type_label": "",
|
||||
"adjust_filament_value": "",
|
||||
"new_location_prompt": "",
|
||||
"measurement_type": {
|
||||
"weight": "",
|
||||
"length": ""
|
||||
},
|
||||
"adjust_filament_help": ""
|
||||
},
|
||||
"spool": "",
|
||||
"formats": {
|
||||
"last_used": ""
|
||||
},
|
||||
"messages": {
|
||||
"archive": ""
|
||||
}
|
||||
},
|
||||
"filament": {
|
||||
"form": {
|
||||
"import_external": "",
|
||||
"filament_updated": "",
|
||||
"import_external_description": ""
|
||||
},
|
||||
"fields_help": {
|
||||
"name": "",
|
||||
"article_number": "",
|
||||
"spool_weight": "",
|
||||
"price": "",
|
||||
"weight": "",
|
||||
"multi_color_direction": "",
|
||||
"material": ""
|
||||
},
|
||||
"fields": {
|
||||
"material": "",
|
||||
"vendor_name": "",
|
||||
"settings_extruder_temp": "",
|
||||
"comment": "",
|
||||
"multi_color": "",
|
||||
"diameter": "",
|
||||
"weight": "",
|
||||
"spool_weight": "",
|
||||
"external_id": "",
|
||||
"single_color": "",
|
||||
"registered": "",
|
||||
"spools": "",
|
||||
"name": "",
|
||||
"price": "",
|
||||
"settings_bed_temp": "",
|
||||
"vendor": "",
|
||||
"density": "",
|
||||
"longitudinal": "",
|
||||
"id": "",
|
||||
"color_hex": "",
|
||||
"article_number": "",
|
||||
"coaxial": ""
|
||||
},
|
||||
"titles": {
|
||||
"clone": "",
|
||||
"show_title": "",
|
||||
"show": "",
|
||||
"create": "",
|
||||
"edit": "",
|
||||
"list": ""
|
||||
},
|
||||
"buttons": {
|
||||
"add_spool": ""
|
||||
},
|
||||
"filament": ""
|
||||
},
|
||||
"settings": {
|
||||
"extra_fields": {
|
||||
"non_unique_key_error": "",
|
||||
"params": {
|
||||
"unit": "",
|
||||
"choices": "",
|
||||
"default_value": "",
|
||||
"field_type": "",
|
||||
"multi_choice": "",
|
||||
"order": "",
|
||||
"name": "",
|
||||
"key": ""
|
||||
},
|
||||
"boolean_true": "",
|
||||
"choices_missing_error": "",
|
||||
"boolean_false": "",
|
||||
"delete_confirm_description": "",
|
||||
"field_type": {
|
||||
"boolean": "",
|
||||
"float": "",
|
||||
"choice": "",
|
||||
"float_range": "",
|
||||
"datetime": "",
|
||||
"integer": "",
|
||||
"integer_range": "",
|
||||
"text": ""
|
||||
},
|
||||
"tab": "",
|
||||
"description": "",
|
||||
"delete_confirm": "",
|
||||
"key_not_changed": ""
|
||||
},
|
||||
"general": {
|
||||
"tab": "",
|
||||
"base_url": {
|
||||
"tooltip": "",
|
||||
"label": ""
|
||||
},
|
||||
"round_prices": {
|
||||
"label": "",
|
||||
"tooltip": ""
|
||||
},
|
||||
"currency": {
|
||||
"label": ""
|
||||
}
|
||||
},
|
||||
"header": "",
|
||||
"settings": ""
|
||||
},
|
||||
"home": {
|
||||
"welcome": "",
|
||||
"home": "",
|
||||
"description": ""
|
||||
},
|
||||
"scanner": {
|
||||
"title": "",
|
||||
"error": {
|
||||
"insecureContext": "",
|
||||
"notReadable": "",
|
||||
"notAllowed": "",
|
||||
"unknown": "",
|
||||
"notFound": "",
|
||||
"streamApiNotSupported": ""
|
||||
},
|
||||
"description": ""
|
||||
},
|
||||
"help": {
|
||||
"resources": {
|
||||
"vendor": "",
|
||||
"filament": "",
|
||||
"spool": ""
|
||||
},
|
||||
"description": "",
|
||||
"help": ""
|
||||
},
|
||||
"locations": {
|
||||
"new_location": "",
|
||||
"no_location": "",
|
||||
"locations": "",
|
||||
"no_locations_help": ""
|
||||
},
|
||||
"table": {
|
||||
"actions": ""
|
||||
}
|
||||
}
|
||||
@@ -208,6 +208,9 @@
|
||||
},
|
||||
"messages": {
|
||||
"archive": "آیا مطمئن هستید که میخواهید این قرقره را بایگانی کنید؟"
|
||||
},
|
||||
"formats": {
|
||||
"last_used": ""
|
||||
}
|
||||
},
|
||||
"filament": {
|
||||
@@ -288,7 +291,9 @@
|
||||
}
|
||||
},
|
||||
"home": {
|
||||
"home": "صفحه اصلی"
|
||||
"home": "صفحه اصلی",
|
||||
"welcome": "",
|
||||
"description": ""
|
||||
},
|
||||
"help": {
|
||||
"help": "راهنما",
|
||||
@@ -313,6 +318,10 @@
|
||||
"base_url": {
|
||||
"tooltip": "آدرس پایگاه داده Spoolman که باید هنگام ایجاد ویژگیهایی مانند کدهای QR استفاده شود.",
|
||||
"label": "لینک Spoolman"
|
||||
},
|
||||
"round_prices": {
|
||||
"label": "",
|
||||
"tooltip": ""
|
||||
}
|
||||
},
|
||||
"extra_fields": {
|
||||
@@ -376,6 +385,15 @@
|
||||
"show": "نمایش تولید کننده فیلامنت شماره {{id}} | اسپول من",
|
||||
"create": "تعریف کردن تولید کننده فیلامنت جدید | اسپول من",
|
||||
"clone": "تکثیر تولید کننده فیلامنت شماره {{id}} | اسپول من"
|
||||
},
|
||||
"locations": {
|
||||
"list": ""
|
||||
}
|
||||
},
|
||||
"locations": {
|
||||
"new_location": "",
|
||||
"no_location": "",
|
||||
"locations": "",
|
||||
"no_locations_help": ""
|
||||
}
|
||||
}
|
||||
@@ -140,7 +140,7 @@
|
||||
"registered": "Enregistré",
|
||||
"first_used": "Première utilisation",
|
||||
"used_weight": "Poids utilisé",
|
||||
"id": "ID",
|
||||
"id": "Identifiant",
|
||||
"remaining_weight": "Poids restant",
|
||||
"price": "Prix",
|
||||
"initial_weight": "Poids initial",
|
||||
@@ -238,7 +238,7 @@
|
||||
"settings_bed_temp": "Température du lit",
|
||||
"vendor": "Fabricant",
|
||||
"density": "Densité",
|
||||
"id": "ID",
|
||||
"id": "Identifiant",
|
||||
"color_hex": "Couleur",
|
||||
"article_number": "Numéro d'article",
|
||||
"spools": "Afficher les bobines",
|
||||
@@ -260,7 +260,7 @@
|
||||
"form": {
|
||||
"filament_updated": "Ce filament a été mis à jour par quelqu'un/quelque chose depuis que vous avez ouvert cette page. Enregistrer écrasera ces changements !",
|
||||
"import_external": "Importer depuis externe",
|
||||
"import_external_description": "Sélectionnez un filament dans la liste pour renseigner automatiquement ses détails dans le formulaire de création de filament. Cela écrasera toutes les données que vous avez saisies dans le formulaire.<br><br>Un objet fabricant sera créé automatiquement lorsque vous cliquerez sur OK, si nécessaire."
|
||||
"import_external_description": "Sélectionnez un filament dans la liste pour renseigner automatiquement ses détails dans le formulaire de création de filament. Cela écrasera toutes les données que vous avez saisies dans le formulaire.<br><br>Un objet fabricant sera créé automatiquement lorsque vous cliquerez sur Ok, si nécessaire."
|
||||
},
|
||||
"buttons": {
|
||||
"add_spool": "Ajouter une bobine"
|
||||
@@ -314,7 +314,7 @@
|
||||
"registered": "Enregistré",
|
||||
"comment": "Commentaire",
|
||||
"name": "Nom",
|
||||
"id": "ID",
|
||||
"id": "Identifiant",
|
||||
"empty_spool_weight": "Poids de la bobine vide",
|
||||
"external_id": "ID externe"
|
||||
},
|
||||
@@ -351,7 +351,8 @@
|
||||
"kofi": "Me donner un pourboire sur Ko-fi",
|
||||
"home": {
|
||||
"home": "Accueil",
|
||||
"welcome": "Bienvenue sur votre instance Spoolman !"
|
||||
"welcome": "Bienvenue sur votre instance Spoolman !",
|
||||
"description": "Il semble que vous n'ayez pas encore ajouté de bobines. Consultez la <helpPageLink>page d'aide</helpPageLink> pour bien démarrer."
|
||||
},
|
||||
"settings": {
|
||||
"settings": "Paramètres",
|
||||
@@ -384,7 +385,8 @@
|
||||
"choices_missing_error": "Vous ne pouvez pas retirer les choix. Les choix suivants sont manquants : {{choices}}",
|
||||
"key_not_changed": "Changer la clé pour quelque chose d'autre.",
|
||||
"delete_confirm": "Supprimer le champ {{name}} ?",
|
||||
"description": "<p>Ici vous pouvez ajouter des champs personnalisés supplémentaires à vos entités.</p><p>Une fois qu'un champ est ajouté, vous ne pouvez plus changer sa clé ou son type, et pour les champs de types \"Choix\", vous ne pouvez plus retirer un choix ou changer l'état des choix multiples. Si vous supprimez un champ, les données associées aux entités seront supprimées.</p><p>La clé correspond à ce que les autres programmes lisent/écrivent, donc si votre champs doit s'intégrer avec un programme tiers, assurez-vous de le configurer correctement. La valeur par défaut n'est appliquées qu'aux nouveaux éléments.</p><p>Les champs supplementaires ne peuvent pas être triés ou filtrés dans les vues de table.</p>"
|
||||
"description": "<p>Ici vous pouvez ajouter des champs personnalisés supplémentaires à vos entités.</p><p>Une fois qu'un champ est ajouté, vous ne pouvez plus changer sa clé ou son type, et pour les champs de types \"Choix\", vous ne pouvez plus retirer un choix ou changer l'état des choix multiples. Si vous supprimez un champ, les données associées aux entités seront supprimées.</p><p>La clé correspond à ce que les autres programmes lisent/écrivent, donc si votre champs doit s'intégrer avec un programme tiers, assurez-vous de le configurer correctement. La valeur par défaut n'est appliquées qu'aux nouveaux éléments.</p><p>Les champs supplémentaires peuvent être affichés, triés ou filtrés dans les vues de table. Les champs de type \"Choix\" et booléen offrent également des options de filtrage, et tous les types de champs supplémentaires prennent en charge le filtrage des valeurs vides. </p>",
|
||||
"choices_reorder_hint": "Glissez, ou utilisez les touches fléchées, pour réorganiser ce choix."
|
||||
},
|
||||
"header": "Paramètres",
|
||||
"general": {
|
||||
@@ -395,6 +397,10 @@
|
||||
"base_url": {
|
||||
"label": "Base de l'URL",
|
||||
"tooltip": "La base de l'URL à utiliser lors de la génération de QR codes."
|
||||
},
|
||||
"round_prices": {
|
||||
"label": "Arrondir les prix",
|
||||
"tooltip": "Arrondir les prix au nombre entier le plus proche."
|
||||
}
|
||||
}
|
||||
},
|
||||
@@ -403,5 +409,12 @@
|
||||
"new_location": "Créer un emplacement",
|
||||
"no_location": "Pas de localisation",
|
||||
"no_locations_help": "Cette page vous permet d'organiser vos bobines par lieu, ajoutez une bobine pour commencer !"
|
||||
}
|
||||
},
|
||||
"theme": {
|
||||
"label": "Thème",
|
||||
"system": "Système",
|
||||
"light": "Clair",
|
||||
"dark": "Sombre"
|
||||
},
|
||||
"sponsor": "Soutenez-moi sur GitHub"
|
||||
}
|
||||
@@ -12,6 +12,388 @@
|
||||
"edit": "Sampadan Karen",
|
||||
"confirm": "Kya aapko pakka hai?",
|
||||
"continue": "Aage badhen",
|
||||
"show": "Dikhayen"
|
||||
"show": "Dikhayen",
|
||||
"filter": "",
|
||||
"cancel": "",
|
||||
"showArchived": "",
|
||||
"archive": "",
|
||||
"hideColumns": "",
|
||||
"delete": "",
|
||||
"undo": "",
|
||||
"import": "",
|
||||
"logout": "",
|
||||
"refresh": "",
|
||||
"notAccessTitle": "",
|
||||
"saveAndAdd": "",
|
||||
"hideArchived": "",
|
||||
"clearFilters": "",
|
||||
"unArchive": "",
|
||||
"clone": "",
|
||||
"clear": ""
|
||||
},
|
||||
"vendor": {
|
||||
"fields": {
|
||||
"external_id": "",
|
||||
"registered": "",
|
||||
"comment": "",
|
||||
"name": "",
|
||||
"empty_spool_weight": "",
|
||||
"id": ""
|
||||
},
|
||||
"fields_help": {
|
||||
"empty_spool_weight": ""
|
||||
},
|
||||
"titles": {
|
||||
"show_title": "",
|
||||
"show": "",
|
||||
"edit": "",
|
||||
"clone": "",
|
||||
"create": "",
|
||||
"list": ""
|
||||
},
|
||||
"form": {
|
||||
"vendor_updated": ""
|
||||
},
|
||||
"vendor": ""
|
||||
},
|
||||
"documentTitle": {
|
||||
"vendor": {
|
||||
"create": "",
|
||||
"clone": "",
|
||||
"edit": "",
|
||||
"list": "",
|
||||
"show": ""
|
||||
},
|
||||
"default": "",
|
||||
"home": {
|
||||
"list": ""
|
||||
},
|
||||
"spool": {
|
||||
"edit": "",
|
||||
"list": "",
|
||||
"create": "",
|
||||
"show": "",
|
||||
"clone": ""
|
||||
},
|
||||
"filament": {
|
||||
"list": "",
|
||||
"show": "",
|
||||
"clone": "",
|
||||
"create": "",
|
||||
"edit": ""
|
||||
},
|
||||
"suffix": "",
|
||||
"locations": {
|
||||
"list": ""
|
||||
},
|
||||
"help": {
|
||||
"list": ""
|
||||
}
|
||||
},
|
||||
"spool": {
|
||||
"fields": {
|
||||
"measured_weight": "",
|
||||
"last_used": "",
|
||||
"filament_internal": "",
|
||||
"material": "",
|
||||
"spool_weight": "",
|
||||
"weight_to_use": "",
|
||||
"lot_nr": "",
|
||||
"filament_name": "",
|
||||
"price": "",
|
||||
"comment": "",
|
||||
"filament": "",
|
||||
"location": "",
|
||||
"used_length": "",
|
||||
"archived": "",
|
||||
"remaining_length": "",
|
||||
"registered": "",
|
||||
"first_used": "",
|
||||
"used_weight": "",
|
||||
"id": "",
|
||||
"remaining_weight": "",
|
||||
"initial_weight": "",
|
||||
"filament_external": ""
|
||||
},
|
||||
"titles": {
|
||||
"archive": "",
|
||||
"adjust": "",
|
||||
"show": "",
|
||||
"edit": "",
|
||||
"create": "",
|
||||
"clone": "",
|
||||
"show_title": "",
|
||||
"list": ""
|
||||
},
|
||||
"fields_help": {
|
||||
"external_filament": "",
|
||||
"used_weight": "",
|
||||
"weight_to_use": "",
|
||||
"measured_weight": "",
|
||||
"price": "",
|
||||
"spool_weight": "",
|
||||
"lot_nr": "",
|
||||
"remaining_weight": "",
|
||||
"location": "",
|
||||
"initial_weight": ""
|
||||
},
|
||||
"form": {
|
||||
"spool_updated": "",
|
||||
"measurement_type_label": "",
|
||||
"adjust_filament_value": "",
|
||||
"new_location_prompt": "",
|
||||
"measurement_type": {
|
||||
"weight": "",
|
||||
"length": ""
|
||||
},
|
||||
"adjust_filament_help": ""
|
||||
},
|
||||
"spool": "",
|
||||
"formats": {
|
||||
"last_used": ""
|
||||
},
|
||||
"messages": {
|
||||
"archive": ""
|
||||
}
|
||||
},
|
||||
"filament": {
|
||||
"form": {
|
||||
"import_external": "",
|
||||
"filament_updated": "",
|
||||
"import_external_description": ""
|
||||
},
|
||||
"fields_help": {
|
||||
"name": "",
|
||||
"article_number": "",
|
||||
"spool_weight": "",
|
||||
"price": "",
|
||||
"weight": "",
|
||||
"multi_color_direction": "",
|
||||
"material": ""
|
||||
},
|
||||
"fields": {
|
||||
"material": "",
|
||||
"vendor_name": "",
|
||||
"settings_extruder_temp": "",
|
||||
"comment": "",
|
||||
"multi_color": "",
|
||||
"diameter": "",
|
||||
"weight": "",
|
||||
"spool_weight": "",
|
||||
"external_id": "",
|
||||
"single_color": "",
|
||||
"registered": "",
|
||||
"spools": "",
|
||||
"name": "",
|
||||
"price": "",
|
||||
"settings_bed_temp": "",
|
||||
"vendor": "",
|
||||
"density": "",
|
||||
"longitudinal": "",
|
||||
"id": "",
|
||||
"color_hex": "",
|
||||
"article_number": "",
|
||||
"coaxial": ""
|
||||
},
|
||||
"titles": {
|
||||
"clone": "",
|
||||
"show_title": "",
|
||||
"show": "",
|
||||
"create": "",
|
||||
"edit": "",
|
||||
"list": ""
|
||||
},
|
||||
"buttons": {
|
||||
"add_spool": ""
|
||||
},
|
||||
"filament": ""
|
||||
},
|
||||
"printing": {
|
||||
"generic": {
|
||||
"printerMarginBottom": "",
|
||||
"verticalSpacing": "",
|
||||
"rows": "",
|
||||
"borders": {
|
||||
"none": "",
|
||||
"grid": "",
|
||||
"border": ""
|
||||
},
|
||||
"printerMarginTop": "",
|
||||
"deleteSettingsConfirm": "",
|
||||
"deleteSettings": "",
|
||||
"customSize": "",
|
||||
"title": "",
|
||||
"contentSettings": "",
|
||||
"marginRight": "",
|
||||
"printerMarginRight": "",
|
||||
"itemCopies": "",
|
||||
"helpPrinterMargin": "",
|
||||
"settingsName": "",
|
||||
"previewScale": "",
|
||||
"helpMargin": "",
|
||||
"marginTop": "",
|
||||
"skipItems": "",
|
||||
"newSetting": "",
|
||||
"addSettings": "",
|
||||
"layoutSettings": "",
|
||||
"paperSize": "",
|
||||
"columns": "",
|
||||
"description": "",
|
||||
"marginBottom": "",
|
||||
"horizontalSpacing": "",
|
||||
"duplicateSettings": "",
|
||||
"settings": "",
|
||||
"saveSetting": "",
|
||||
"marginLeft": "",
|
||||
"showBorder": "",
|
||||
"saveAsImage": "",
|
||||
"printerMarginLeft": "",
|
||||
"dimensions": "",
|
||||
"defaultSettings": "",
|
||||
"print": ""
|
||||
},
|
||||
"qrcode": {
|
||||
"useHTTPUrl": {
|
||||
"options": {
|
||||
"default": "",
|
||||
"url": ""
|
||||
},
|
||||
"preview": "",
|
||||
"tooltip": "",
|
||||
"label": ""
|
||||
},
|
||||
"showContent": "",
|
||||
"showQRCodeMode": {
|
||||
"withIcon": "",
|
||||
"no": "",
|
||||
"simple": ""
|
||||
},
|
||||
"templateHelp": "",
|
||||
"textSize": "",
|
||||
"showQRCode": "",
|
||||
"template": "",
|
||||
"title": "",
|
||||
"button": ""
|
||||
},
|
||||
"spoolSelect": {
|
||||
"selectedTotal_one": "",
|
||||
"selectedTotal_other": "",
|
||||
"description": "",
|
||||
"showArchived": "",
|
||||
"title": "",
|
||||
"selectAll": "",
|
||||
"noSpoolsSelected": ""
|
||||
}
|
||||
},
|
||||
"settings": {
|
||||
"extra_fields": {
|
||||
"non_unique_key_error": "",
|
||||
"params": {
|
||||
"unit": "",
|
||||
"choices": "",
|
||||
"default_value": "",
|
||||
"field_type": "",
|
||||
"multi_choice": "",
|
||||
"order": "",
|
||||
"name": "",
|
||||
"key": ""
|
||||
},
|
||||
"boolean_true": "",
|
||||
"choices_missing_error": "",
|
||||
"boolean_false": "",
|
||||
"delete_confirm_description": "",
|
||||
"field_type": {
|
||||
"boolean": "",
|
||||
"float": "",
|
||||
"choice": "",
|
||||
"float_range": "",
|
||||
"datetime": "",
|
||||
"integer": "",
|
||||
"integer_range": "",
|
||||
"text": ""
|
||||
},
|
||||
"tab": "",
|
||||
"description": "",
|
||||
"delete_confirm": "",
|
||||
"key_not_changed": ""
|
||||
},
|
||||
"general": {
|
||||
"tab": "",
|
||||
"base_url": {
|
||||
"tooltip": "",
|
||||
"label": ""
|
||||
},
|
||||
"round_prices": {
|
||||
"label": "",
|
||||
"tooltip": ""
|
||||
},
|
||||
"currency": {
|
||||
"label": ""
|
||||
}
|
||||
},
|
||||
"header": "",
|
||||
"settings": ""
|
||||
},
|
||||
"home": {
|
||||
"welcome": "",
|
||||
"home": "",
|
||||
"description": ""
|
||||
},
|
||||
"scanner": {
|
||||
"title": "",
|
||||
"error": {
|
||||
"insecureContext": "",
|
||||
"notReadable": "",
|
||||
"notAllowed": "",
|
||||
"unknown": "",
|
||||
"notFound": "",
|
||||
"streamApiNotSupported": ""
|
||||
},
|
||||
"description": ""
|
||||
},
|
||||
"help": {
|
||||
"resources": {
|
||||
"vendor": "",
|
||||
"filament": "",
|
||||
"spool": ""
|
||||
},
|
||||
"description": "",
|
||||
"help": ""
|
||||
},
|
||||
"notifications": {
|
||||
"deleteSuccess": "",
|
||||
"error": "",
|
||||
"editError": "",
|
||||
"saveSuccessful": "",
|
||||
"undoable": "",
|
||||
"importProgress": "",
|
||||
"createError": "",
|
||||
"validationError": "",
|
||||
"success": "",
|
||||
"editSuccess": "",
|
||||
"deleteError": "",
|
||||
"createSuccess": ""
|
||||
},
|
||||
"no": "",
|
||||
"unknown": "",
|
||||
"yes": "",
|
||||
"locations": {
|
||||
"new_location": "",
|
||||
"no_location": "",
|
||||
"locations": "",
|
||||
"no_locations_help": ""
|
||||
},
|
||||
"version": "",
|
||||
"kofi": "",
|
||||
"table": {
|
||||
"actions": ""
|
||||
},
|
||||
"warnWhenUnsavedChanges": "",
|
||||
"loading": "",
|
||||
"dashboard": {
|
||||
"title": ""
|
||||
},
|
||||
"tags": {
|
||||
"clone": ""
|
||||
}
|
||||
}
|
||||
@@ -9,14 +9,31 @@
|
||||
"showTemperatures": "Hőmérséklet",
|
||||
"showVendor": "Gyártó",
|
||||
"showSpoolComment": "Orsó Megjegyzés",
|
||||
"textSize": "Tartalom szöveg mérete",
|
||||
"title": "QR kód nyomtatása",
|
||||
"textSize": "Cimke Szövegméret",
|
||||
"title": "Cimkenyomtatás",
|
||||
"showSpoolmanIcon": "Spoolman ikon megjelenítése",
|
||||
"showLotNr": "Tételszám",
|
||||
"bedTemp": "BT: {{temp}}",
|
||||
"lotNr": "Tételszám: {{lot}}",
|
||||
"showFilamentComment": "Filament Komment",
|
||||
"button": "QR kódok nyomtatása"
|
||||
"button": "Cimkék Nyomtatása",
|
||||
"useHTTPUrl": {
|
||||
"options": {
|
||||
"default": "Alapbeállítás",
|
||||
"url": "URL"
|
||||
},
|
||||
"preview": "Előnézet:",
|
||||
"tooltip": "",
|
||||
"label": "QR kód link"
|
||||
},
|
||||
"showQRCodeMode": {
|
||||
"withIcon": "Iconnal",
|
||||
"no": "Nem",
|
||||
"simple": "Egyszerű"
|
||||
},
|
||||
"templateHelp": "",
|
||||
"showQRCode": "QR kód nyomtatása",
|
||||
"template": "Cimke Sablon"
|
||||
},
|
||||
"generic": {
|
||||
"printerMarginBottom": "Biztonságos zóna alja",
|
||||
@@ -48,15 +65,26 @@
|
||||
"showBorder": "Szélek megjelenítése",
|
||||
"printerMarginLeft": "Biztonságos zóna balra",
|
||||
"dimensions": "Dimenziók",
|
||||
"print": "Nyomtat"
|
||||
"print": "Nyomtat",
|
||||
"deleteSettingsConfirm": "Biztos vagy benne, hogy törölni szeretnéd ezt a beállítást?",
|
||||
"deleteSettings": "Jelenlegi Beállítás Törlése",
|
||||
"itemCopies": "Termék másolatok",
|
||||
"settingsName": "Preset neve",
|
||||
"newSetting": "Új",
|
||||
"addSettings": "Új beállítás hozzáadása",
|
||||
"duplicateSettings": "Duplikáció",
|
||||
"settings": "Beállítások",
|
||||
"saveSetting": "Beállítás Mentése",
|
||||
"saveAsImage": "Mentés Képként",
|
||||
"defaultSettings": "Alapbeállítás"
|
||||
},
|
||||
"spoolSelect": {
|
||||
"selectedTotal_one": "{{count}} tekercs kiválasztva",
|
||||
"selectedTotal_other": "{{count}} db tekercs kiválasztva",
|
||||
"description": "Válassza ki a QR-kódok nyomtatásához szükséges tekercseket.",
|
||||
"description": "Válassza ki a tekercseket a cimkék nyomtatásához.",
|
||||
"showArchived": "Archivált megjelenítése",
|
||||
"title": "Tekercs kiválasztása",
|
||||
"selectAll": "Összes kijelölése/kijelölésének törlése",
|
||||
"selectAll": "Összes kijelölése/kijelölés törlése",
|
||||
"noSpoolsSelected": "Nem választotál ki egyetlen tekercset sem."
|
||||
}
|
||||
},
|
||||
@@ -89,12 +117,15 @@
|
||||
},
|
||||
"help": {
|
||||
"list": "Segítség | Spoolman"
|
||||
},
|
||||
"locations": {
|
||||
"list": "Tároló helyek | Spoolman"
|
||||
}
|
||||
},
|
||||
"spool": {
|
||||
"fields": {
|
||||
"measured_weight": "Mért súly",
|
||||
"last_used": "Utolsó használat",
|
||||
"last_used": "Utoljára használt",
|
||||
"material": "Anyag",
|
||||
"weight_to_use": "Súly",
|
||||
"lot_nr": "Tételszám",
|
||||
@@ -106,11 +137,15 @@
|
||||
"archived": "Arhivált",
|
||||
"remaining_length": "Fennmaradó hossz",
|
||||
"registered": "Nyilvántartott",
|
||||
"first_used": "Első használat",
|
||||
"first_used": "Először használt",
|
||||
"used_weight": "Felhasznált súly",
|
||||
"id": "ID",
|
||||
"remaining_weight": "Hátralévő súly",
|
||||
"price": "Ár"
|
||||
"remaining_weight": "Maradék súly",
|
||||
"price": "Ár",
|
||||
"filament_internal": "Belső",
|
||||
"spool_weight": "Üres súly",
|
||||
"initial_weight": "Kezdeti súly",
|
||||
"filament_external": "Külső"
|
||||
},
|
||||
"titles": {
|
||||
"archive": "Arhivált tekercs",
|
||||
@@ -119,7 +154,8 @@
|
||||
"create": "Tekercs létrehozása",
|
||||
"clone": "Tekercs másolása",
|
||||
"show_title": "[Tekercs #{{id}}] {{name}}",
|
||||
"list": "Tekercs"
|
||||
"list": "Tekercs",
|
||||
"adjust": "Tekercs Szál Módosítása"
|
||||
},
|
||||
"fields_help": {
|
||||
"used_weight": "Mennyi filament használódott el a tekercsről. Egy új tekercsnek 0 gramm használt mennyiséggel kell rendelkeznie.",
|
||||
@@ -128,15 +164,28 @@
|
||||
"lot_nr": "Gyártói tételszám. A szín egységesség ellenőrzésére használható, ha több tekercset használsz egy nyomtatáshoz.",
|
||||
"remaining_weight": "Mennyi filament van még a tekercsen. Egy új tekercsnél ez a tekercs súlyával kell megegyeznie.",
|
||||
"location": "Hol található a tekercs, ha több helyen tárolod a tekercseidet.",
|
||||
"price": "Egy teljes tekercs ára. Ha nincs beállítva, a rendszer az filament árát veszi fel helyette."
|
||||
"price": "Egy teljes tekercs ára. Ha nincs beállítva, a rendszer az filament árát veszi fel helyette.",
|
||||
"external_filament": "A kiválasztott tekercs egy külső adatbázisból származik. A szál elem(és valószínűleg a gyártó elem) automatikusan létrehozásra kerül amikor ezt a tekercset létrehozza. Ez okozhat szál duplikációt, ha ez a szál korábban már létre lett hozva.",
|
||||
"spool_weight": "Az üres tekercs súlya. Hagyja üresen a szál vagy a gyártó értékének a használatához.",
|
||||
"initial_weight": "A tekercsen lévő filament kezdeti súlya. Ha nincs beállítva, a filament rekord súlya lesz használva."
|
||||
},
|
||||
"form": {
|
||||
"new_location_prompt": "Add meg az új helyet",
|
||||
"spool_updated": "Ez a tekercs azóta frissült valaki/valami más által, mióta megnyitottad ezt az oldalt. A mentés felül fogja írni ezeket a változásokat!"
|
||||
"spool_updated": "Ezt a spoolot valaki / valami más frissítette, mivel megnyitotta ezt az oldalt. A megtakarítás felülírja ezeket a változásokat!",
|
||||
"measurement_type_label": "Mérési típus",
|
||||
"adjust_filament_value": "",
|
||||
"measurement_type": {
|
||||
"weight": "Súly",
|
||||
"length": "Hossz"
|
||||
},
|
||||
"adjust_filament_help": ""
|
||||
},
|
||||
"spool": "Tekercs",
|
||||
"spool": "Tekercsek",
|
||||
"messages": {
|
||||
"archive": "Biztosan archiválni szeretné ezt a tekercset?"
|
||||
},
|
||||
"formats": {
|
||||
"last_used": "Utolsó használat {{date}}"
|
||||
}
|
||||
},
|
||||
"buttons": {
|
||||
@@ -161,7 +210,8 @@
|
||||
"unArchive": "Arhiválás visszavonása",
|
||||
"clone": "Másolás",
|
||||
"clear": "Törlés",
|
||||
"saveAndAdd": "Mentés és hozzáadás"
|
||||
"saveAndAdd": "Mentés és hozzáadás",
|
||||
"continue": "Folytatás"
|
||||
},
|
||||
"filament": {
|
||||
"fields_help": {
|
||||
@@ -170,7 +220,8 @@
|
||||
"spool_weight": "Az üres tekercs súlya. Ezt használják a tekercs mért súlyának meghatározásához.",
|
||||
"price": "A teljes tekercs ára.",
|
||||
"weight": "A teljes tekercs súlya (nettó súly), amely nem tartalmazza a tekercs saját súlyát, csak a filament súlyát. Általában ez szerepel a csomagoláson.",
|
||||
"material": "Például. PLA, ABS, PETG stb."
|
||||
"material": "Például. PLA, ABS, PETG stb.",
|
||||
"multi_color_direction": ""
|
||||
},
|
||||
"fields": {
|
||||
"material": "Anyag",
|
||||
@@ -189,7 +240,12 @@
|
||||
"id": "ID",
|
||||
"color_hex": "Szín",
|
||||
"article_number": "Cikkszám",
|
||||
"spools": "Tekercsek megjelenítése"
|
||||
"spools": "Tekercsek megjelenítése",
|
||||
"multi_color": "",
|
||||
"external_id": "Külső ID",
|
||||
"single_color": "",
|
||||
"longitudinal": "",
|
||||
"coaxial": ""
|
||||
},
|
||||
"titles": {
|
||||
"clone": "Filament másolása",
|
||||
@@ -199,9 +255,11 @@
|
||||
"edit": "Filament szerkesztése",
|
||||
"list": "Filamentek"
|
||||
},
|
||||
"filament": "Filamentek",
|
||||
"filament": "Szálak",
|
||||
"form": {
|
||||
"filament_updated": "Ez a szál anyag azóta frissült valaki/valami más által, mióta megnyitottad ezt az oldalt. A mentés felül fogja írni ezeket a változásokat!"
|
||||
"filament_updated": "Ez a szál anyag azóta frissült valaki/valami más által, mióta megnyitottad ezt az oldalt. A mentés felül fogja írni ezeket a változásokat!",
|
||||
"import_external": "Importálás külső forrásból",
|
||||
"import_external_description": ""
|
||||
},
|
||||
"buttons": {
|
||||
"add_spool": "Tekercs hozzáadása"
|
||||
@@ -227,11 +285,16 @@
|
||||
"registered": "Nyilvántartott",
|
||||
"comment": "Megjegyzés",
|
||||
"name": "Név",
|
||||
"id": "ID"
|
||||
"id": "ID",
|
||||
"external_id": "Külső ID",
|
||||
"empty_spool_weight": "Üres tekercs súlya"
|
||||
},
|
||||
"vendor": "Gyártók",
|
||||
"form": {
|
||||
"vendor_updated": "Ez a szállító azóta frissült valaki/valami más által, mióta megnyitottad ezt az oldalt. A mentés felül fogja írni ezeket a változásokat!"
|
||||
"vendor_updated": "Ez a gyártó azóta frissült valaki/valami más által, mióta megnyitottad ezt az oldalt. A mentés felül fogja írni ezeket a változásokat!"
|
||||
},
|
||||
"fields_help": {
|
||||
"empty_spool_weight": "Ettől a gyártótól származó üres tekercs súlya."
|
||||
}
|
||||
},
|
||||
"scanner": {
|
||||
@@ -239,7 +302,7 @@
|
||||
"error": {
|
||||
"insecureContext": "Az oldal kiszolgálása nem HTTPS-en keresztül történik.",
|
||||
"notReadable": "A kamera nem használható.",
|
||||
"notAllowed": "Nincs jováhagyva a számodra a kamera használata.",
|
||||
"notAllowed": "Nem engedélyezte a kamerához való hozzáférést.",
|
||||
"unknown": "Ismeretlen hiba történt. ({{error}})",
|
||||
"notFound": "Nem található kamera.",
|
||||
"streamApiNotSupported": "A böngésző nem támogatja a MediaStream API-t."
|
||||
@@ -277,7 +340,9 @@
|
||||
},
|
||||
"kofi": "Tipp a Ko-fi-ra",
|
||||
"home": {
|
||||
"home": "Kezdő lap"
|
||||
"home": "Kezdő lap",
|
||||
"welcome": "Üdv a Spoolmanodban!",
|
||||
"description": "Úgy tűnik, még nem hoztál létre tekercset. Lásd a <helpPageLink>Help page </helpPageLink> a kezdeti lépésekhez."
|
||||
},
|
||||
"help": {
|
||||
"resources": {
|
||||
@@ -326,7 +391,21 @@
|
||||
"currency": {
|
||||
"label": "Pénznem"
|
||||
},
|
||||
"tab": "Általános"
|
||||
"tab": "Általános",
|
||||
"base_url": {
|
||||
"tooltip": "",
|
||||
"label": "Alap URL"
|
||||
},
|
||||
"round_prices": {
|
||||
"label": "Árak kerekítése",
|
||||
"tooltip": "Az árak legközelebbi egész számra való kerekítése."
|
||||
}
|
||||
}
|
||||
},
|
||||
"locations": {
|
||||
"new_location": "Új hely",
|
||||
"no_location": "Nincs hely megadva",
|
||||
"locations": "Helyek",
|
||||
"no_locations_help": "Ez az oldal lehetővé teszi, hogy rendszerezd a tekercseket helyek szerint, adj hozzá néhány tekercset a kezdéshez!"
|
||||
}
|
||||
}
|
||||
@@ -391,6 +391,8 @@
|
||||
"no_locations_help": "このページでは、スプールを場所ごとに整理することができます!"
|
||||
},
|
||||
"home": {
|
||||
"home": "ホーム"
|
||||
"home": "ホーム",
|
||||
"welcome": "",
|
||||
"description": ""
|
||||
}
|
||||
}
|
||||
@@ -0,0 +1,405 @@
|
||||
{
|
||||
"actions": {
|
||||
"list": "목록",
|
||||
"create": "생성",
|
||||
"edit": "수정",
|
||||
"show": "보기",
|
||||
"clone": "복제"
|
||||
},
|
||||
"buttons": {
|
||||
"create": "생성",
|
||||
"save": "저장",
|
||||
"saveAndAdd": "저장 및 추가",
|
||||
"logout": "로그아웃",
|
||||
"delete": "삭제",
|
||||
"edit": "수정",
|
||||
"cancel": "취소",
|
||||
"confirm": "정말 하시겠습니까?",
|
||||
"continue": "계속",
|
||||
"filter": "필터",
|
||||
"refresh": "새로고침",
|
||||
"show": "보기",
|
||||
"undo": "되돌리기",
|
||||
"import": "가져오기",
|
||||
"clone": "복제",
|
||||
"archive": "보관",
|
||||
"unArchive": "보관 해제",
|
||||
"hideArchived": "보관 숨기기",
|
||||
"showArchived": "보관된 항목 표시",
|
||||
"notAccessTitle": "접근 권한이 없습니다",
|
||||
"hideColumns": "열 숨김",
|
||||
"clearFilters": "필터 초기화",
|
||||
"clear": "지우기"
|
||||
},
|
||||
"warnWhenUnsavedChanges": "정말 나가시겠습니까? 저장하지 않은 변경 사항이 있습니다.",
|
||||
"notifications": {
|
||||
"success": "성공",
|
||||
"error": "오류 (상태 코드: {{statusCode}})",
|
||||
"saveSuccessful": "저장 완료!",
|
||||
"validationError": "검증 오류: {{error}}",
|
||||
"undoable": "{{seconds}}초 이내에 되돌릴 수 있습니다.",
|
||||
"createSuccess": "{{resource}} 생성 완료",
|
||||
"createError": "{{resource}} 생성 중 오류가 발생했습니다 (상태 코드: {{statusCode}})",
|
||||
"deleteSuccess": "{{resource}} 삭제 완료",
|
||||
"deleteError": "{{resource}} 삭제 중 오류 발생 (상태 코드: {{statusCode}})",
|
||||
"editSuccess": "수정 완료 {{resource}}",
|
||||
"editError": "{{resource}} 편집 중 오류 발생 (상태 코드: {{statusCode}})",
|
||||
"importProgress": "가져오기: {{processed}}/{{total}}"
|
||||
},
|
||||
"kofi": "Ko-fi로 개발 지원",
|
||||
"loading": "로딩",
|
||||
"version": "버전",
|
||||
"unknown": "알 수 없음",
|
||||
"yes": "네",
|
||||
"no": "아니오",
|
||||
"tags": {
|
||||
"clone": "복제"
|
||||
},
|
||||
"dashboard": {
|
||||
"title": "대시보드"
|
||||
},
|
||||
"printing": {
|
||||
"generic": {
|
||||
"title": "인쇄",
|
||||
"print": "인쇄",
|
||||
"columns": "열",
|
||||
"rows": "행",
|
||||
"paperSize": "종이 크기",
|
||||
"customSize": "커스텀",
|
||||
"dimensions": "치수",
|
||||
"showBorder": "테두리 보이기",
|
||||
"contentSettings": "내용 설정",
|
||||
"layoutSettings": "레이아웃 설정",
|
||||
"horizontalSpacing": "수평 간격",
|
||||
"verticalSpacing": "수직 간격",
|
||||
"marginLeft": "왼쪽 여백",
|
||||
"marginRight": "오른쪽 여백",
|
||||
"marginTop": "위쪽 여백",
|
||||
"marginBottom": "아래쪽 여백",
|
||||
"borders": {
|
||||
"border": "테두리",
|
||||
"grid": "격자",
|
||||
"none": "없음"
|
||||
},
|
||||
"settings": "프리셋",
|
||||
"defaultSettings": "기본값",
|
||||
"addSettings": "프리셋 추가",
|
||||
"newSetting": "신규",
|
||||
"duplicateSettings": "복제",
|
||||
"deleteSettings": "프리셋 삭제",
|
||||
"deleteSettingsConfirm": "이 프리셋을 삭제하시겠습니까?",
|
||||
"settingsName": "프리셋 이름",
|
||||
"saveSetting": "프리셋 저장",
|
||||
"saveAsImage": "그림으로 저장",
|
||||
"skipItems": "항목 건너뛰기",
|
||||
"itemCopies": "항목 복사본 수",
|
||||
"description": "아래 설정을 조정하여 원하는 인쇄 레이아웃을 얻으십시오. 프린터와 운영체제(OS)가 자체 여백 및 크기 조정을 적용할 수 있으므로, 완벽하게 맞출 때까지 몇 번의 시행착오가 필요할 수 있습니다. 실제 라벨에 인쇄하기 전에 일반 용지에 테스트 인쇄를 해보십시오.",
|
||||
"helpMargin": "여백은 라벨 용지와 프린터에 맞게 설정해야 하며, 이를 변경하면 전체 그리드 크기에 영향을 미칩니다.",
|
||||
"previewScale": "미리보기 배율",
|
||||
"helpPrinterMargin": "안전구역은 프린터가 용지 가장자리에서 얼마나 가까운 위치까지 인쇄할 수 있는지를 설정하는 것이며, 이 값을 변경해도 전체 격자에는 영향을 미치지 않습니다.",
|
||||
"printerMarginLeft": "안전구역 왼쪽",
|
||||
"printerMarginRight": "안전구역 오른쪽",
|
||||
"printerMarginTop": "안전구역 위쪽",
|
||||
"printerMarginBottom": "안전구역 아래쪽"
|
||||
},
|
||||
"qrcode": {
|
||||
"button": "라벨 인쇄",
|
||||
"title": "라벨 인쇄",
|
||||
"template": "라벨 템플릿",
|
||||
"templateHelp": "{}를 사용하여 스풀 객체의 값을 텍스트로 삽입합니다. 예를 들어, {id}는 스풀 id로 대체되고, {filament.material}은 스풀의 재료로 대체됩니다. 값이 누락된 경우 \"?\"로 대체됩니다. 두 번째 {} 세트를 사용하여 이를 제거할 수 있습니다. 또한, {} 쌍 사이에 있는 텍스트는 값이 누락된 경우 제거됩니다. 예를 들어, {Lot Nr: {lot_nr}}은 스풀에 로트 번호가 있을 때만 라벨을 표시합니다. 텍스트를 두 개의 별표 **로 감싸면 굵게 표시됩니다. 사용 가능한 모든 태그 목록을 보려면 버튼을 클릭하세요.",
|
||||
"textSize": "라벨 글씨 크기",
|
||||
"showQRCode": "QR 코드 인쇄",
|
||||
"showContent": "라벨 인쇄",
|
||||
"useHTTPUrl": {
|
||||
"label": "QR 코드 링크",
|
||||
"tooltip": "Spoolman의 스캔 기능으로 스캔한 경우에만 작동하는 전용 링크를 사용합니다(기본값). URL은 설정에 지정된 기본 URL을 사용하며, 설정되지 않은 경우 현재 페이지 URL을 사용합니다.",
|
||||
"options": {
|
||||
"default": "기본값",
|
||||
"url": "URL"
|
||||
},
|
||||
"preview": "미리보기:"
|
||||
},
|
||||
"showQRCodeMode": {
|
||||
"no": "아니오",
|
||||
"simple": "단순",
|
||||
"withIcon": "아이콘 표시"
|
||||
}
|
||||
},
|
||||
"spoolSelect": {
|
||||
"title": "스풀 선택",
|
||||
"description": "라벨을 인쇄할 스풀을 선택합니다.",
|
||||
"showArchived": "보관 보이기",
|
||||
"noSpoolsSelected": "스풀을 선택하지 않았습니다.",
|
||||
"selectAll": "모두 선택/해제",
|
||||
"selectedTotal_other": "스풀 {{count}}개 선택됨"
|
||||
}
|
||||
},
|
||||
"scanner": {
|
||||
"title": "QR 코드 스캐너",
|
||||
"description": "Spoolman QR 코드를 스캔하여 스풀에 대한 세부 정보를 확인하세요.",
|
||||
"error": {
|
||||
"notAllowed": "카메라 접근 권한을 허용하지 않았습니다.",
|
||||
"insecureContext": "해당 페이지는 HTTPS를 통해 제공되지 않습니다.",
|
||||
"streamApiNotSupported": "브라우저가 MediaStream API를 지원하지 않습니다.",
|
||||
"notReadable": "카메라를 읽을 수 없습니다.",
|
||||
"notFound": "카메라를 찾을 수 없습니다.",
|
||||
"unknown": "알 수 없는 오류가 발생했습니다. ({{error}})"
|
||||
}
|
||||
},
|
||||
"spool": {
|
||||
"spool": "스풀",
|
||||
"fields": {
|
||||
"id": "ID",
|
||||
"filament_name": "필라멘트",
|
||||
"filament": "필라멘트",
|
||||
"filament_internal": "내부",
|
||||
"filament_external": "외부",
|
||||
"price": "가격",
|
||||
"material": "재료",
|
||||
"weight_to_use": "중량",
|
||||
"used_weight": "사용 중량",
|
||||
"remaining_weight": "남은 무게",
|
||||
"measured_weight": "측정 중량",
|
||||
"used_length": "사용 길이",
|
||||
"remaining_length": "잔여 길이",
|
||||
"initial_weight": "초기 중량",
|
||||
"spool_weight": "빈 스풀 중량",
|
||||
"location": "위치",
|
||||
"lot_nr": "로트 번호",
|
||||
"first_used": "첫 사용",
|
||||
"last_used": "최종 사용",
|
||||
"registered": "등록됨",
|
||||
"archived": "보관됨",
|
||||
"comment": "주석"
|
||||
},
|
||||
"fields_help": {
|
||||
"price": "전체 스풀 가격. 설정되지 않은 경우 필라멘트 가격이 대신 적용됩니다.",
|
||||
"weight_to_use": "입력할 중량 값을 선택합니다. 측정 중량은 선택한 필라멘트에 스풀 중량이 설정된 경우에만 사용할 수 있습니다.",
|
||||
"used_weight": "스풀에서 사용된 필라멘트 양입니다. 새 스풀은 사용량이 0g이어야 합니다.",
|
||||
"remaining_weight": "스풀에 남은 필라멘트 양입니다. 새 스풀이라면 스풀 무게와 일치해야 합니다.",
|
||||
"measured_weight": "필라멘트와 스풀을 합한 무게입니다.",
|
||||
"initial_weight": "스풀에 감긴 필라멘트의 초기 중량(순중량). 설정되지 않은 경우 필라멘트 객체의 중량을 사용합니다.",
|
||||
"spool_weight": "스풀이 비어 있을 때의 무게. 필라멘트 또는 제조사의 값을 사용하려면 비워 두십시오.",
|
||||
"location": "여러 위치에 스풀을 보관하는 경우 스풀이 위치한 곳.",
|
||||
"lot_nr": "제조사의 로트 번호입니다. 여러 개의 스풀을 사용할 경우 인쇄물의 색상을 일관되게 유지하는 데 사용할 수 있습니다.",
|
||||
"external_filament": "외부 데이터베이스에서 필라멘트를 선택하였습니다. 이 스풀을 생성할 때 필라멘트 객체(및 경우에 따라 제조사 객체)가 자동으로 생성됩니다. 해당 필라멘트에 대해 이미 필라멘트 객체가 생성된 경우 중복 객체가 생성될 수 있습니다."
|
||||
},
|
||||
"titles": {
|
||||
"create": "스풀 생성",
|
||||
"clone": "스풀 복제",
|
||||
"edit": "스풀 수정",
|
||||
"list": "스풀",
|
||||
"show": "스풀 보기",
|
||||
"show_title": "[스풀 #{{id}}] {{name}}",
|
||||
"archive": "스풀 보관",
|
||||
"adjust": "스풀 필라멘트 조정"
|
||||
},
|
||||
"form": {
|
||||
"measurement_type": {
|
||||
"length": "길이",
|
||||
"weight": "중량"
|
||||
},
|
||||
"measurement_type_label": "측정 유형",
|
||||
"adjust_filament_help": "여기서 스풀의 필라멘트를 직접 더하거나 뺄 수 있습니다. 양수 값은 필라멘트를 소모하고, 음수 값은 필라멘트를 추가합니다.",
|
||||
"adjust_filament_value": "소모량",
|
||||
"new_location_prompt": "새 위치 입력",
|
||||
"spool_updated": "이 페이지를 연 이후 다른 사용자나 프로그램이 이 스풀을 업데이트했습니다. 저장하면 해당 변경 사항을 덮어쓰게 됩니다!"
|
||||
},
|
||||
"messages": {
|
||||
"archive": "이 스풀을 보관하시겠습니까?"
|
||||
},
|
||||
"formats": {
|
||||
"last_used": "최종 사용 {{date}}"
|
||||
}
|
||||
},
|
||||
"filament": {
|
||||
"filament": "필라멘트",
|
||||
"fields": {
|
||||
"id": "ID",
|
||||
"vendor_name": "제조사",
|
||||
"vendor": "제조사",
|
||||
"name": "이름",
|
||||
"material": "재료",
|
||||
"price": "가격",
|
||||
"density": "밀도",
|
||||
"diameter": "직경",
|
||||
"weight": "중량",
|
||||
"spool_weight": "스풀 중량",
|
||||
"article_number": "제품 번호",
|
||||
"registered": "등록됨",
|
||||
"comment": "주석",
|
||||
"settings_extruder_temp": "압출기 온도",
|
||||
"settings_bed_temp": "베드 온도",
|
||||
"color_hex": "색상",
|
||||
"single_color": "단일",
|
||||
"multi_color": "다중",
|
||||
"coaxial": "공압출",
|
||||
"external_id": "외부 ID",
|
||||
"spools": "스풀 보기",
|
||||
"longitudinal": "종방향"
|
||||
},
|
||||
"fields_help": {
|
||||
"name": "필라멘트 이름, 동일한 제조사의 다른 필라멘트 유형과 구별하기 위한 명칭. 예를 들어 색상을 포함해야 합니다.",
|
||||
"material": "예: PLA, ABS, PETG 등.",
|
||||
"price": "전체 스풀 가격.",
|
||||
"weight": "전체 스풀의 필라멘트 중량(순중량). 여기에는 스풀 자체의 무게는 포함되지 않으며 필라멘트만 포함됩니다. 일반적으로 포장지에 표기되는 내용입니다.",
|
||||
"spool_weight": "빈 스풀의 무게. 스풀의 측정 무게를 결정하는 데 사용됩니다.",
|
||||
"article_number": "예: EAN, UPC 등",
|
||||
"multi_color_direction": "필라멘트가 여러 색상을 갖는 방식은 두 가지입니다. 하나는 색상이 일정하게 유지되는 이중 색상 필라멘트처럼 공압출을 이용하는 방식이고, 다른 하나는 스풀을 따라 색상이 바뀌는 그라데이션 필라멘트처럼 종방향으로 색상이 변하는 방식입니다."
|
||||
},
|
||||
"titles": {
|
||||
"create": "필라멘트 생성",
|
||||
"clone": "필라멘트 복제",
|
||||
"edit": "필라멘트 편집",
|
||||
"list": "필라멘트",
|
||||
"show": "필라멘트 보기",
|
||||
"show_title": "[필라멘트 #{{id}}] {{name}}"
|
||||
},
|
||||
"form": {
|
||||
"filament_updated": "이 필라멘트는 이 페이지를 연 이후 다른 사람 또는 다른 프로그램에 의해 업데이트되었습니다. 저장하면 해당 변경 사항을 덮어쓰게 됩니다!",
|
||||
"import_external": "외부에서 가져오기",
|
||||
"import_external_description": "목록에서 필라멘트를 선택하면 필라멘트 생성 양식에 해당 세부 정보가 자동으로 채워집니다. 이 경우 양식에 입력한 기존 데이터는 모두 덮어쓰게 됩니다.<br><br>필요한 경우 확인을 클릭하면 제조사 객체가 자동으로 생성됩니다."
|
||||
},
|
||||
"buttons": {
|
||||
"add_spool": "스풀 추가"
|
||||
}
|
||||
},
|
||||
"vendor": {
|
||||
"vendor": "제조사",
|
||||
"fields": {
|
||||
"id": "ID",
|
||||
"name": "이름",
|
||||
"empty_spool_weight": "빈 스풀 중량",
|
||||
"external_id": "외부 ID",
|
||||
"registered": "등록됨",
|
||||
"comment": "주석"
|
||||
},
|
||||
"fields_help": {
|
||||
"empty_spool_weight": "이 제조사의 빈 스풀 중량."
|
||||
},
|
||||
"titles": {
|
||||
"create": "제조사 생성",
|
||||
"clone": "제조사 복제",
|
||||
"edit": "제조사 편집",
|
||||
"list": "제조사",
|
||||
"show": "제조사 보기",
|
||||
"show_title": "[제조사 #{{id}}] {{name}}"
|
||||
},
|
||||
"form": {
|
||||
"vendor_updated": "이 제조사 정보는 이 페이지를 연 이후 다른 사람 또는 다른 프로그램에 의해 업데이트되었습니다. 저장하면 해당 변경 사항을 덮어쓰게 됩니다!"
|
||||
}
|
||||
},
|
||||
"home": {
|
||||
"home": "홈",
|
||||
"welcome": "Spoolman 인스턴스에 오신 것을 환영합니다!",
|
||||
"description": "아직 스풀을 추가하지 않은 것 같습니다. 시작하는 방법에 대한 도움말은 <helpPageLink>도움말 페이지</helpPageLink>를 참조하세요."
|
||||
},
|
||||
"help": {
|
||||
"help": "도움말",
|
||||
"resources": {
|
||||
"filament": "필라멘트 브랜드. 이름, 재료, 색상, 직경 등의 속성을 가집니다.",
|
||||
"spool": "특정 필라멘트의 개별 물리적 스풀.",
|
||||
"vendor": "필라멘트를 제조하는 기업들."
|
||||
},
|
||||
"description": "<title>도움말</title><p>시작하는 데 도움이 될 몇 가지 팁을 소개합니다.</p><p>Spoolman은 3가지 유형의 데이터를 보유합니다:</p><itemsHelp/><p>데이터베이스에 새 스풀을 추가하려면 먼저 <filamentCreateLink>필라멘트</filamentCreateLink> 객체를 생성하세요. 그런 다음 해당 스풀에 대한 <spoolCreateLink>스풀</spoolCreateLink> 객체를 생성합니다. 나중에 동일한 필라멘트의 추가 스풀을 구입한 경우, 동일한 필라멘트 객체를 재사용하고 추가 스풀 객체만 생성하면 됩니다.</p><p>필요에 따라 필라멘트 제조사를 추적하려면 해당 회사에 대한 <vendorCreateLink>제조사</vendorCreateLink> 객체를 생성할 수도 있습니다. </p><p>필라멘트 사용량을 자동으로 모니터링하고 스풀 객체를 업데이트해주는 Moonraker 같은 다른 3D 프린터 서비스를 Spoolman에 연결할 수도 있습니다. 설정 방법은 <readmeLink>Spoolman README</readmeLink>를 참고하세요.</p>"
|
||||
},
|
||||
"table": {
|
||||
"actions": "작업"
|
||||
},
|
||||
"settings": {
|
||||
"settings": "설정",
|
||||
"header": "설정",
|
||||
"general": {
|
||||
"tab": "일반",
|
||||
"currency": {
|
||||
"label": "통화"
|
||||
},
|
||||
"base_url": {
|
||||
"label": "기본 URL",
|
||||
"tooltip": "QR 코드와 같은 기능을 생성할 때 사용할 기본 URL입니다."
|
||||
},
|
||||
"round_prices": {
|
||||
"label": "가격 반올림",
|
||||
"tooltip": "가격을 가장 가까운 정수로 반올림합니다."
|
||||
}
|
||||
},
|
||||
"extra_fields": {
|
||||
"tab": "추가 필드",
|
||||
"description": "<p>여기에서 엔티티에 추가 사용자 정의 필드를 추가할 수 있습니다.</p><p>필드를 추가한 후에는 키나 유형을 변경할 수 없으며, 선택형 필드의 경우 선택 항목을 제거하거나 다중 선택 상태를 변경할 수 없습니다. 필드를 삭제하면 모든 엔티티의 관련 데이터가 삭제됩니다.</p><p>키 값은 다른 프로그램이 데이터를 읽고 쓰는 방식이므로, 사용자 정의 필드가 타사 프로그램과 연동될 예정이라면 반드시 올바르게 설정해야 합니다. 기본값은 새 항목에만 적용됩니다.</p><p>추가 필드는 테이블 보기에 표시하고 정렬할 수 있습니다. 선택형과 불리언 필드는 필터 옵션도 함께 제공하며, 모든 추가 필드 유형은 빈 값 필터링을 지원합니다.</p>",
|
||||
"params": {
|
||||
"key": "키",
|
||||
"name": "이름",
|
||||
"field_type": "유형",
|
||||
"unit": "단위",
|
||||
"order": "순번",
|
||||
"default_value": "기본값",
|
||||
"choices": "선택 항목",
|
||||
"multi_choice": "다중 선택"
|
||||
},
|
||||
"field_type": {
|
||||
"text": "텍스트",
|
||||
"integer": "정수",
|
||||
"integer_range": "정수 범위",
|
||||
"float": "실수",
|
||||
"float_range": "실수 범위",
|
||||
"datetime": "날짜 및 시간",
|
||||
"boolean": "논리형",
|
||||
"choice": "선택"
|
||||
},
|
||||
"boolean_true": "네",
|
||||
"boolean_false": "아니오",
|
||||
"choices_missing_error": "선택 항목을 제거할 수 없습니다. 다음 선택 항목이 누락되었습니다: {{choices}}",
|
||||
"non_unique_key_error": "키는 고유해야 합니다.",
|
||||
"key_not_changed": "키 값을 다른 것으로 바꿔 주세요.",
|
||||
"delete_confirm": "{{name}} 필드 삭제?",
|
||||
"delete_confirm_description": "이 작업은 모든 엔티티에 대해 해당 필드와 관련된 모든 데이터를 삭제합니다.",
|
||||
"choices_reorder_hint": "드래그하거나 방향키를 사용해 이 선택 항목의 순서를 변경하세요."
|
||||
}
|
||||
},
|
||||
"documentTitle": {
|
||||
"default": "Spoolman",
|
||||
"suffix": " | Spoolman",
|
||||
"home": {
|
||||
"list": "홈 | Spoolman"
|
||||
},
|
||||
"help": {
|
||||
"list": "도움말 | Spoolman"
|
||||
},
|
||||
"locations": {
|
||||
"list": "위치 | Spoolman"
|
||||
},
|
||||
"filament": {
|
||||
"list": "필라멘트 | Spoolman",
|
||||
"show": "#{{id}} 필라멘트 보기 | Spoolman",
|
||||
"edit": "#{{id}} 필라멘트 편집 | Spoolman",
|
||||
"create": "필라멘트 생성 | Spoolman",
|
||||
"clone": "#{{id}} 필라멘트 복제 | Spoolman"
|
||||
},
|
||||
"spool": {
|
||||
"list": "스풀 | Spoolman",
|
||||
"show": "#{{id}} 스풀 보기 | Spoolman",
|
||||
"edit": "#{{id}} 스풀 편집 | Spoolman",
|
||||
"create": "스풀 생성 | Spoolman",
|
||||
"clone": "#{{id}} 스풀 복제 | Spoolman"
|
||||
},
|
||||
"vendor": {
|
||||
"list": "제조사 | Spoolman",
|
||||
"show": "#{{id}} 제조사 보기 | Spoolman",
|
||||
"edit": "#{{id}} 제조사 편집 | Spoolman",
|
||||
"create": "제조사 생성 | Spoolman",
|
||||
"clone": "#{{id}} 제조사 복제 | Spoolman"
|
||||
}
|
||||
},
|
||||
"locations": {
|
||||
"locations": "위치",
|
||||
"new_location": "새로운 위치",
|
||||
"no_location": "위치 없음",
|
||||
"no_locations_help": "이 페이지에서는 스풀을 위치별로 정리할 수 있습니다. 시작하려면 스풀을 추가하세요!"
|
||||
},
|
||||
"theme": {
|
||||
"label": "테마",
|
||||
"system": "시스템",
|
||||
"light": "라이트",
|
||||
"dark": "다크"
|
||||
}
|
||||
}
|
||||
@@ -354,7 +354,8 @@
|
||||
"non_unique_key_error": "Raktas turi būti unukalus.",
|
||||
"key_not_changed": "Prašome pakeisti raktą į ką nors kitą.",
|
||||
"delete_confirm": "Šalinti lauką {{name}}?",
|
||||
"delete_confirm_description": "Tai ištrins lauką ir visus susijusius duomenis visiems objektams."
|
||||
"delete_confirm_description": "Tai ištrins lauką ir visus susijusius duomenis visiems objektams.",
|
||||
"choices_reorder_hint": "Temkite arba naudokite rodyklių klavišus, kad pakeistumėte eilės tvarką."
|
||||
}
|
||||
},
|
||||
"documentTitle": {
|
||||
@@ -396,5 +397,10 @@
|
||||
"new_location": "Nauja vieta",
|
||||
"no_location": "Be vietos",
|
||||
"no_locations_help": "Šiame puslapyje galite tvarkyti rites pagal vietas, pridėkite keletą ričių, kad pradėtumėte!"
|
||||
},
|
||||
"theme": {
|
||||
"label": "Tema",
|
||||
"system": "Sistema",
|
||||
"dark": "Tamsus"
|
||||
}
|
||||
}
|
||||
@@ -0,0 +1,400 @@
|
||||
{
|
||||
"actions": {
|
||||
"create": "Izveidot",
|
||||
"edit": "Rediģēt",
|
||||
"clone": "Klonēt",
|
||||
"list": "",
|
||||
"show": ""
|
||||
},
|
||||
"buttons": {
|
||||
"create": "Izveidot",
|
||||
"save": "Saglabāt",
|
||||
"saveAndAdd": "Saglabāt un pievienot",
|
||||
"logout": "Izrakstīties",
|
||||
"delete": "Dzēst",
|
||||
"edit": "Rediģēt",
|
||||
"confirm": "Vai esat pārliecināts?",
|
||||
"continue": "Turpināt",
|
||||
"filter": "Filtrēt",
|
||||
"clear": "Notīrīt",
|
||||
"show": "",
|
||||
"cancel": "",
|
||||
"showArchived": "",
|
||||
"archive": "",
|
||||
"hideColumns": "",
|
||||
"undo": "",
|
||||
"import": "",
|
||||
"refresh": "",
|
||||
"notAccessTitle": "",
|
||||
"hideArchived": "",
|
||||
"clearFilters": "",
|
||||
"unArchive": "",
|
||||
"clone": ""
|
||||
},
|
||||
"vendor": {
|
||||
"fields": {
|
||||
"external_id": "",
|
||||
"registered": "",
|
||||
"comment": "",
|
||||
"name": "",
|
||||
"empty_spool_weight": "",
|
||||
"id": ""
|
||||
},
|
||||
"fields_help": {
|
||||
"empty_spool_weight": ""
|
||||
},
|
||||
"titles": {
|
||||
"show_title": "",
|
||||
"show": "",
|
||||
"edit": "",
|
||||
"clone": "",
|
||||
"create": "",
|
||||
"list": ""
|
||||
},
|
||||
"form": {
|
||||
"vendor_updated": ""
|
||||
},
|
||||
"vendor": ""
|
||||
},
|
||||
"documentTitle": {
|
||||
"vendor": {
|
||||
"create": "",
|
||||
"clone": "",
|
||||
"edit": "",
|
||||
"list": "",
|
||||
"show": ""
|
||||
},
|
||||
"default": "",
|
||||
"home": {
|
||||
"list": ""
|
||||
},
|
||||
"spool": {
|
||||
"edit": "",
|
||||
"list": "",
|
||||
"create": "",
|
||||
"show": "",
|
||||
"clone": ""
|
||||
},
|
||||
"filament": {
|
||||
"list": "",
|
||||
"show": "",
|
||||
"clone": "",
|
||||
"create": "",
|
||||
"edit": ""
|
||||
},
|
||||
"suffix": "",
|
||||
"locations": {
|
||||
"list": ""
|
||||
},
|
||||
"help": {
|
||||
"list": ""
|
||||
}
|
||||
},
|
||||
"spool": {
|
||||
"fields": {
|
||||
"measured_weight": "",
|
||||
"last_used": "",
|
||||
"filament_internal": "",
|
||||
"material": "",
|
||||
"spool_weight": "",
|
||||
"weight_to_use": "",
|
||||
"lot_nr": "",
|
||||
"filament_name": "",
|
||||
"price": "",
|
||||
"comment": "",
|
||||
"filament": "",
|
||||
"location": "",
|
||||
"used_length": "",
|
||||
"archived": "",
|
||||
"remaining_length": "",
|
||||
"registered": "",
|
||||
"first_used": "",
|
||||
"used_weight": "",
|
||||
"id": "",
|
||||
"remaining_weight": "",
|
||||
"initial_weight": "",
|
||||
"filament_external": ""
|
||||
},
|
||||
"titles": {
|
||||
"archive": "",
|
||||
"adjust": "",
|
||||
"show": "",
|
||||
"edit": "",
|
||||
"create": "",
|
||||
"clone": "",
|
||||
"show_title": "",
|
||||
"list": ""
|
||||
},
|
||||
"fields_help": {
|
||||
"external_filament": "",
|
||||
"used_weight": "",
|
||||
"weight_to_use": "",
|
||||
"measured_weight": "",
|
||||
"price": "",
|
||||
"spool_weight": "",
|
||||
"lot_nr": "",
|
||||
"remaining_weight": "",
|
||||
"location": "",
|
||||
"initial_weight": ""
|
||||
},
|
||||
"form": {
|
||||
"spool_updated": "",
|
||||
"measurement_type_label": "",
|
||||
"adjust_filament_value": "",
|
||||
"new_location_prompt": "",
|
||||
"measurement_type": {
|
||||
"weight": "",
|
||||
"length": ""
|
||||
},
|
||||
"adjust_filament_help": ""
|
||||
},
|
||||
"spool": "",
|
||||
"formats": {
|
||||
"last_used": ""
|
||||
},
|
||||
"messages": {
|
||||
"archive": ""
|
||||
}
|
||||
},
|
||||
"filament": {
|
||||
"form": {
|
||||
"import_external": "",
|
||||
"filament_updated": "",
|
||||
"import_external_description": ""
|
||||
},
|
||||
"fields_help": {
|
||||
"name": "",
|
||||
"article_number": "",
|
||||
"spool_weight": "",
|
||||
"price": "",
|
||||
"weight": "",
|
||||
"multi_color_direction": "",
|
||||
"material": ""
|
||||
},
|
||||
"fields": {
|
||||
"material": "",
|
||||
"vendor_name": "",
|
||||
"settings_extruder_temp": "",
|
||||
"comment": "",
|
||||
"multi_color": "",
|
||||
"diameter": "",
|
||||
"weight": "",
|
||||
"spool_weight": "",
|
||||
"external_id": "",
|
||||
"single_color": "",
|
||||
"registered": "",
|
||||
"spools": "",
|
||||
"name": "",
|
||||
"price": "",
|
||||
"settings_bed_temp": "",
|
||||
"vendor": "",
|
||||
"density": "",
|
||||
"longitudinal": "",
|
||||
"id": "",
|
||||
"color_hex": "",
|
||||
"article_number": "",
|
||||
"coaxial": ""
|
||||
},
|
||||
"titles": {
|
||||
"clone": "",
|
||||
"show_title": "",
|
||||
"show": "",
|
||||
"create": "",
|
||||
"edit": "",
|
||||
"list": ""
|
||||
},
|
||||
"buttons": {
|
||||
"add_spool": ""
|
||||
},
|
||||
"filament": ""
|
||||
},
|
||||
"printing": {
|
||||
"generic": {
|
||||
"printerMarginBottom": "",
|
||||
"verticalSpacing": "",
|
||||
"rows": "",
|
||||
"borders": {
|
||||
"none": "",
|
||||
"grid": "",
|
||||
"border": ""
|
||||
},
|
||||
"printerMarginTop": "",
|
||||
"deleteSettingsConfirm": "",
|
||||
"deleteSettings": "",
|
||||
"customSize": "",
|
||||
"title": "",
|
||||
"contentSettings": "",
|
||||
"marginRight": "",
|
||||
"printerMarginRight": "",
|
||||
"itemCopies": "",
|
||||
"helpPrinterMargin": "",
|
||||
"settingsName": "",
|
||||
"previewScale": "",
|
||||
"helpMargin": "",
|
||||
"marginTop": "",
|
||||
"skipItems": "",
|
||||
"newSetting": "",
|
||||
"addSettings": "",
|
||||
"layoutSettings": "",
|
||||
"paperSize": "",
|
||||
"columns": "",
|
||||
"description": "",
|
||||
"marginBottom": "",
|
||||
"horizontalSpacing": "",
|
||||
"duplicateSettings": "",
|
||||
"settings": "",
|
||||
"saveSetting": "",
|
||||
"marginLeft": "",
|
||||
"showBorder": "",
|
||||
"saveAsImage": "",
|
||||
"printerMarginLeft": "",
|
||||
"dimensions": "",
|
||||
"defaultSettings": "",
|
||||
"print": ""
|
||||
},
|
||||
"qrcode": {
|
||||
"useHTTPUrl": {
|
||||
"options": {
|
||||
"default": "",
|
||||
"url": ""
|
||||
},
|
||||
"preview": "",
|
||||
"tooltip": "",
|
||||
"label": ""
|
||||
},
|
||||
"showContent": "",
|
||||
"showQRCodeMode": {
|
||||
"withIcon": "",
|
||||
"no": "",
|
||||
"simple": ""
|
||||
},
|
||||
"templateHelp": "",
|
||||
"textSize": "",
|
||||
"showQRCode": "",
|
||||
"template": "",
|
||||
"title": "",
|
||||
"button": ""
|
||||
},
|
||||
"spoolSelect": {
|
||||
"selectedTotal_zero": "",
|
||||
"selectedTotal_one": "",
|
||||
"selectedTotal_other": "",
|
||||
"description": "",
|
||||
"showArchived": "",
|
||||
"title": "",
|
||||
"selectAll": "",
|
||||
"noSpoolsSelected": ""
|
||||
}
|
||||
},
|
||||
"settings": {
|
||||
"extra_fields": {
|
||||
"non_unique_key_error": "",
|
||||
"params": {
|
||||
"unit": "",
|
||||
"choices": "",
|
||||
"default_value": "",
|
||||
"field_type": "",
|
||||
"multi_choice": "",
|
||||
"order": "",
|
||||
"name": "",
|
||||
"key": ""
|
||||
},
|
||||
"boolean_true": "",
|
||||
"choices_missing_error": "",
|
||||
"boolean_false": "",
|
||||
"delete_confirm_description": "",
|
||||
"field_type": {
|
||||
"boolean": "",
|
||||
"float": "",
|
||||
"choice": "",
|
||||
"float_range": "",
|
||||
"datetime": "",
|
||||
"integer": "",
|
||||
"integer_range": "",
|
||||
"text": ""
|
||||
},
|
||||
"tab": "",
|
||||
"description": "",
|
||||
"delete_confirm": "",
|
||||
"key_not_changed": ""
|
||||
},
|
||||
"general": {
|
||||
"tab": "",
|
||||
"base_url": {
|
||||
"tooltip": "",
|
||||
"label": ""
|
||||
},
|
||||
"round_prices": {
|
||||
"label": "",
|
||||
"tooltip": ""
|
||||
},
|
||||
"currency": {
|
||||
"label": ""
|
||||
}
|
||||
},
|
||||
"header": "",
|
||||
"settings": ""
|
||||
},
|
||||
"home": {
|
||||
"welcome": "",
|
||||
"home": "",
|
||||
"description": ""
|
||||
},
|
||||
"scanner": {
|
||||
"title": "",
|
||||
"error": {
|
||||
"insecureContext": "",
|
||||
"notReadable": "",
|
||||
"notAllowed": "",
|
||||
"unknown": "",
|
||||
"notFound": "",
|
||||
"streamApiNotSupported": ""
|
||||
},
|
||||
"description": ""
|
||||
},
|
||||
"help": {
|
||||
"resources": {
|
||||
"vendor": "",
|
||||
"filament": "",
|
||||
"spool": ""
|
||||
},
|
||||
"description": "",
|
||||
"help": ""
|
||||
},
|
||||
"notifications": {
|
||||
"deleteSuccess": "",
|
||||
"error": "",
|
||||
"editError": "",
|
||||
"saveSuccessful": "",
|
||||
"undoable": "",
|
||||
"importProgress": "",
|
||||
"createError": "",
|
||||
"validationError": "",
|
||||
"success": "",
|
||||
"editSuccess": "",
|
||||
"deleteError": "",
|
||||
"createSuccess": ""
|
||||
},
|
||||
"no": "",
|
||||
"unknown": "",
|
||||
"yes": "",
|
||||
"locations": {
|
||||
"new_location": "",
|
||||
"no_location": "",
|
||||
"locations": "",
|
||||
"no_locations_help": ""
|
||||
},
|
||||
"version": "",
|
||||
"kofi": "",
|
||||
"table": {
|
||||
"actions": ""
|
||||
},
|
||||
"warnWhenUnsavedChanges": "",
|
||||
"loading": "",
|
||||
"dashboard": {
|
||||
"title": ""
|
||||
},
|
||||
"tags": {
|
||||
"clone": ""
|
||||
}
|
||||
}
|
||||
@@ -277,7 +277,7 @@
|
||||
"external_id": "Extern ID",
|
||||
"single_color": "Enkel",
|
||||
"multi_color": "Meervoudig",
|
||||
"coaxial": "Gecoëxtrudeerde",
|
||||
"coaxial": "Gecoëxtrudeerd",
|
||||
"longitudinal": "Longitudinaal"
|
||||
},
|
||||
"titles": {
|
||||
@@ -291,11 +291,11 @@
|
||||
"filament": "Filamenten",
|
||||
"form": {
|
||||
"filament_updated": "Dit filament is bijgewerkt door iemand/iets anders sinds je deze pagina geopend hebt. Deze veranderingen worden overschreven als je op slaat!",
|
||||
"import_external_description": "Selecteer een filament in de lijst om de details ervan automatisch in te vullen in het formulier voor het maken van filamenten. Hierdoor worden alle gegevens die u in het formulier hebt ingevoerd, overschreven.<br><br>Er wordt indien nodig automatisch een Fabrikant-object gemaakt als u op OK klikt.",
|
||||
"import_external_description": "Selecteer een filament uit de lijst om de details automatisch aan het formulier voor het maken van filamenten toe te voegen. Hierdoor worden alle gegevens die je in het formulier ingevoerd hebt, overschreven.<br><br>Er wordt indien nodig automatisch een fabrikant-object aangemaakt als je op OK klikt.",
|
||||
"import_external": "Importeren van extern"
|
||||
},
|
||||
"buttons": {
|
||||
"add_spool": "Spoel toevoegen"
|
||||
"add_spool": "Spoel Toevoegen"
|
||||
}
|
||||
},
|
||||
"scanner": {
|
||||
@@ -314,8 +314,8 @@
|
||||
"titles": {
|
||||
"show": "Fabrikant tonen",
|
||||
"edit": "Fabrikant bewerken",
|
||||
"clone": "Fabrikant klonen",
|
||||
"create": "Fabrikant maken",
|
||||
"clone": "Fabrikant Klonen",
|
||||
"create": "Fabrikant Aanmaken",
|
||||
"list": "Fabrikanten",
|
||||
"show_title": "[Fabrikant #{{id}}] {{name}}"
|
||||
},
|
||||
@@ -324,8 +324,8 @@
|
||||
"comment": "Opmerking",
|
||||
"name": "Naam",
|
||||
"id": "ID",
|
||||
"empty_spool_weight": "Gewicht lege spoel",
|
||||
"external_id": "Extern ID"
|
||||
"empty_spool_weight": "Gewicht Lege Spoel",
|
||||
"external_id": "Externe ID"
|
||||
},
|
||||
"vendor": "Fabrikanten",
|
||||
"form": {
|
||||
@@ -349,7 +349,9 @@
|
||||
},
|
||||
"kofi": "Tip mij op Ko-fi",
|
||||
"home": {
|
||||
"home": "Thuis"
|
||||
"home": "Thuis",
|
||||
"welcome": "Welkom bij je eigen Spoolman-account!",
|
||||
"description": "Het lijkt erop dat je nog geen spoelen hebt toegevoegd. Zie de <helpPageLink>Help-pagina</helpPageLink> voor hulp bij het opstarten."
|
||||
},
|
||||
"settings": {
|
||||
"header": "Instellingen",
|
||||
@@ -371,7 +373,7 @@
|
||||
"tab": "Extra velden",
|
||||
"params": {
|
||||
"name": "Naam",
|
||||
"key": "Key",
|
||||
"key": "Sleutel",
|
||||
"field_type": "Type",
|
||||
"unit": "Eenheid",
|
||||
"order": "Volgorde",
|
||||
@@ -396,7 +398,8 @@
|
||||
"key_not_changed": "Key niet gewijzigd.",
|
||||
"delete_confirm": "Veld {{name}} verwijderen?",
|
||||
"delete_confirm_description": "Hierdoor worden het veld en alle bijbehorende gegevens voor alle entiteiten verwijderd.",
|
||||
"description": "<p>Hier kunt u extra aangepaste velden toevoegen aan uw entiteiten.</p><p>Zodra een veld is toegevoegd, kunt u de key of het type ervan niet wijzigen, en voor velden met keuzetypes kunt u geen keuzes verwijderen of de meervoudige velden wijzigen. Als u een veld verwijdert, worden de bijbehorende gegevens voor alle entiteiten verwijderd.</p><p>De key is hoe andere programma's de gegevens lezen/schrijven, dus of uw aangepaste veld moet worden geïntegreerd met een derde partij programma, zorg ervoor dat u het correct instelt. De standaardwaarde wordt alleen toegepast op nieuwe items.</p><p>Extra velden kunnen niet worden gesorteerd of gefilterd in de tabelweergaven.</p>"
|
||||
"description": "<p>Hier kunt u extra aangepaste velden toevoegen aan uw entiteiten.</p><p>Zodra een veld is toegevoegd, kunt u de key of het type ervan niet wijzigen, en voor velden met keuzetypes kunt u geen keuzes verwijderen of de meervoudige velden wijzigen. Als u een veld verwijdert, worden de bijbehorende gegevens voor alle entiteiten verwijderd.</p><p>De key is hoe andere programma's de gegevens lezen/schrijven, dus of uw aangepaste veld moet worden geïntegreerd met een derde partij programma, zorg ervoor dat u het correct instelt. De standaardwaarde wordt alleen toegepast op nieuwe items.</p><p>Extra velden kunnen worden weergegeven en gesorteerd in de tabelweergaven. Keuze- en booleaanse-velden bieden daar ook filteropties, en alle typen extra velden ondersteunen het filteren op lege waarden.</p>",
|
||||
"choices_reorder_hint": "Sleep of gebruik de pijltjestoetsen om deze keuze opnieuw te ordenen."
|
||||
},
|
||||
"settings": "Instellingen"
|
||||
},
|
||||
@@ -405,5 +408,12 @@
|
||||
"no_locations_help": "Op deze pagina kunt u uw spoelen op verschillende locaties ordenen. Voeg spoelen toe om aan de slag te gaan!",
|
||||
"locations": "Locaties",
|
||||
"new_location": "Nieuwe locatie"
|
||||
}
|
||||
},
|
||||
"theme": {
|
||||
"light": "Licht",
|
||||
"dark": "Donker",
|
||||
"system": "Systeem",
|
||||
"label": "Thema"
|
||||
},
|
||||
"sponsor": "Steun me op GitHub"
|
||||
}
|
||||
@@ -8,7 +8,7 @@
|
||||
},
|
||||
"buttons": {
|
||||
"edit": "Edytuj",
|
||||
"unArchive": "Odarchiwizuj",
|
||||
"unArchive": "Przywróć",
|
||||
"cancel": "Anuluj",
|
||||
"create": "Utwórz",
|
||||
"save": "Zapisz",
|
||||
@@ -56,7 +56,7 @@
|
||||
"first_used": "Pierwsze użycie",
|
||||
"last_used": "Ostatnie użycie",
|
||||
"comment": "Komentarz",
|
||||
"archived": "Zarchiwizowano",
|
||||
"archived": "Zarchiwizowana",
|
||||
"used_weight": "Zużyta waga",
|
||||
"registered": "Zarejestrowano",
|
||||
"measured_weight": "Zmierzona waga",
|
||||
@@ -111,7 +111,7 @@
|
||||
"importProgress": "Importowanie: {{processed}}/{{total}}",
|
||||
"error": "Błąd (kod statusu: {{statusCode}})",
|
||||
"createError": "Wystąpił błąd podczas tworzenia {{resource}} (kod statusu: {{statusCode}})",
|
||||
"saveSuccessful": "Pomyślnie zapisano!",
|
||||
"saveSuccessful": "Zapisano pomyślnie!",
|
||||
"validationError": "Błąd walidacji: {{error}}"
|
||||
},
|
||||
"loading": "Wczytywanie",
|
||||
@@ -125,38 +125,38 @@
|
||||
"printing": {
|
||||
"generic": {
|
||||
"title": "Drukowanie",
|
||||
"helpMargin": "Marginesy powinny być skonfigurowane tak, aby pasowały do papieru etykietowego i drukarki, ich zmiana wpłynie na rozmiar całej siatki.",
|
||||
"helpPrinterMargin": "Bezpieczna strefa powinna być ustawiona tak, aby znajdowała się jak najbliżej krawędzi papieru, na którym drukarka może drukować, zmiana tych ustawień nie wpłynie na całą siatkę.",
|
||||
"helpMargin": "Marginesy powinny odpowiadać papierowi etykiet i drukarce — ich zmiana wpływa na rozmiar całej siatki.",
|
||||
"helpPrinterMargin": "Strefę bezpieczną ustaw na to, jak blisko krawędzi papieru drukarka jeszcze drukuje. Zmiana tych wartości nie wpływa na całą siatkę.",
|
||||
"print": "Drukuj",
|
||||
"columns": "Kolumny",
|
||||
"rows": "Wiersze",
|
||||
"paperSize": "Rozmiar papieru",
|
||||
"customSize": "Niestandardowy",
|
||||
"customSize": "Własny",
|
||||
"dimensions": "Wymiary",
|
||||
"showBorder": "Pokaż obramowanie",
|
||||
"previewScale": "Skala podglądu",
|
||||
"skipItems": "Pomiń elementy",
|
||||
"skipItems": "Pomiń pozycje",
|
||||
"contentSettings": "Ustawienia zawartości",
|
||||
"layoutSettings": "Ustawienia układu",
|
||||
"verticalSpacing": "Pionowy odstęp",
|
||||
"marginLeft": "Lewy margines",
|
||||
"marginRight": "Prawy margines",
|
||||
"marginTop": "Górny margines",
|
||||
"marginBottom": "Dolny margines",
|
||||
"printerMarginLeft": "Bezpieczna strefa po lewej",
|
||||
"printerMarginRight": "Bezpieczna strefa po prawej",
|
||||
"printerMarginTop": "Bezpieczna strefa od góry",
|
||||
"verticalSpacing": "Odstęp pionowy",
|
||||
"marginLeft": "Margines lewy",
|
||||
"marginRight": "Margines prawy",
|
||||
"marginTop": "Margines górny",
|
||||
"marginBottom": "Margines dolny",
|
||||
"printerMarginLeft": "Strefa bezpieczna lewo",
|
||||
"printerMarginRight": "Strefa bezpieczna prawo",
|
||||
"printerMarginTop": "Strefa bezpieczna góra",
|
||||
"borders": {
|
||||
"none": "Brak",
|
||||
"border": "Obwódka",
|
||||
"grid": "Siatka"
|
||||
},
|
||||
"description": "Dostosuj poniższe ustawienia, aby uzyskać pożądany układ wydruku. Należy pamiętać, że drukarki i system operacyjny mogą stosować własne marginesy i skalowanie, więc może być konieczne wykonanie kilku prób i błędów, zanim wszystko będzie prawidłowe. Przed wydrukowaniem etykiet przetestuj je na zwykłym papierze.",
|
||||
"horizontalSpacing": "Poziomy odstęp",
|
||||
"printerMarginBottom": "Bezpieczna strefa od dołu",
|
||||
"description": "Dopasuj ustawienia poniżej, aby uzyskać właściwy układ wydruku. Pamiętaj, że drukarka i system mogą dodać własne marginesy i skalowanie, więc zwykle trzeba trochę poeksperymentować. Przetestuj na zwykłej kartce, zanim zujesz właściwe etykiety.",
|
||||
"horizontalSpacing": "Odstęp poziomy",
|
||||
"printerMarginBottom": "Strefa bezpieczna dół",
|
||||
"newSetting": "Nowe",
|
||||
"defaultSettings": "Domyślne",
|
||||
"itemCopies": "Skopiuj element",
|
||||
"itemCopies": "Kopie pozycji",
|
||||
"settings": "Presety",
|
||||
"saveAsImage": "Zapisz jako obraz",
|
||||
"duplicateSettings": "Zduplikuj",
|
||||
@@ -186,12 +186,12 @@
|
||||
"template": "Wzór etykiety",
|
||||
"useHTTPUrl": {
|
||||
"preview": "Podgląd:",
|
||||
"label": "Link kodu QR",
|
||||
"label": "Link w kodzie QR",
|
||||
"options": {
|
||||
"default": "Domyślne",
|
||||
"default": "Domyślny",
|
||||
"url": "URL"
|
||||
},
|
||||
"tooltip": "Zostanie użyty link który będzie działał tylko gdy zostanie zeskanowany przez funkcję skanowania Spoolmana (Domyślna opcja). Link URL używa bazowego URL ustawionego w ustawieniach lub aktualnego URL strony jeżeli nie jest ustawiony w ustawieniach."
|
||||
"tooltip": "Użyje zastrzeżonego linku, który zadziała tylko po zeskanowaniu za pomocą funkcji skanowania w Spoolman (domyślnie). Opcja URL używa podstawowego adresu URL określonego w ustawieniach lub, jeśli nie jest ustawiony, adresu URL bieżącej strony."
|
||||
},
|
||||
"showQRCode": "Drukuj kod QR",
|
||||
"showQRCodeMode": {
|
||||
@@ -199,7 +199,7 @@
|
||||
"withIcon": "Z ikoną",
|
||||
"simple": "Proste"
|
||||
},
|
||||
"templateHelp": "Użyj {}, aby wstawić wartości obiektu szpuli jako tekst. Na przykład {id} zostanie zastąpione identyfikatorem szpuli lub {filament.material} zostanie zastąpione materiałem szpuli. jeśli brakuje wartości, zostanie ona zastąpiona „?”. Drugi zestaw {} może być użyty do usunięcia tego. Ponadto każdy tekst między zestawami {} zostanie usunięty, jeśli brakuje wartości. Na przykład {Lot Nr: {lot_nr}} pokaże etykietę tylko wtedy, gdy szpula ma numer partii. Otocz tekst podwójną gwiazdką **, aby go pogrubić. Kliknij przycisk, aby wyświetlić listę wszystkich dostępnych tagów."
|
||||
"templateHelp": "Użyj {} do wprowadzenia wartości elementu szpuli jako tekst. Na przykład, {id} zostanie zastąpione przez id szpuli lub {filament.material} zostanie zastąpione przez materiał szpuli. Jeżeli brakuje wartości, to zostanie ona zastąpiona znakiem \"?\". Drugi zestaw {} można użyć, aby usunąć brakujące wartości. Dodatkowo każdy tekst między znakami {} będzie usunięty jeżeli brakuje wartości. Na przykład {Numer partii: {lot_nr}} pokaże etykietę wtedy gdy szpula będzie miała numer partii. Otocz tekst gwiazdkami by go pogrubić. Kliknij na przycisk by zobaczyć listę dostępnych znaczników."
|
||||
},
|
||||
"spoolSelect": {
|
||||
"title": "Wybierz szpule",
|
||||
@@ -216,13 +216,13 @@
|
||||
"title": "Skaner kodów QR",
|
||||
"error": {
|
||||
"notAllowed": "Nie zezwolono na dostęp do kamery.",
|
||||
"insecureContext": "Strona nie jest dostarczana przez HTTPS.",
|
||||
"streamApiNotSupported": "Przeglądarka nie obsługuje API MediaStream.",
|
||||
"insecureContext": "Strona nie jest serwowana przez HTTPS.",
|
||||
"streamApiNotSupported": "Przeglądarka nie obsługuje MediaStream API.",
|
||||
"notReadable": "Kamera jest niedostępna do odczytu.",
|
||||
"notFound": "Nie znaleziono kamery.",
|
||||
"unknown": "Wystąpił nieznany błąd. ({{error}})"
|
||||
},
|
||||
"description": "Zeskanuj kod QR Spoolman, aby wyświetlić szczegółowe informacje o szpuli."
|
||||
"description": "Zeskanuj kod QR Spoolmana, aby zobaczyć szczegóły szpuli."
|
||||
},
|
||||
"filament": {
|
||||
"filament": "Filamenty",
|
||||
@@ -248,7 +248,7 @@
|
||||
"single_color": "Pojedynczy",
|
||||
"multi_color": "Wielo",
|
||||
"longitudinal": "Wzdłużny",
|
||||
"coaxial": "Koekstrudowany"
|
||||
"coaxial": "Współwytłaczany"
|
||||
},
|
||||
"fields_help": {
|
||||
"material": "Np. PLA, ABS, PETG itp.",
|
||||
@@ -348,7 +348,7 @@
|
||||
"help": "Pomoc",
|
||||
"description": "<title>Pomoc</title><p>Oto kilka wskazówek na początek.</p><p>Spoolman przechowuje 3 różne typy danych:</p><itemsHelp/><p>Aby dodać nową szpulę do bazy danych, zacznij od utworzenia obiektu <filamentCreateLink>Filament</filamentCreateLink>. Gdy już to zrobisz, przejdź do utworzenia obiektu <spoolCreateLink>Szpula</spoolCreateLink> dla tej konkretnej szpuli. Jeśli później zdobędziesz dodatkowe szpule tego samego filamentu, po prostu wygeneruj dodatkowe obiekty Szpula i ponownie użyj tego samego obiektu Filament.</p><p>Opcjonalnie możesz także wygenerować obiekt <vendorCreateLink>Producent</vendorCreateLink> dla firmy produkującej filament, jeśli chcesz śledzić te informacje.</p><p>Masz możliwość połączenia innych usług drukarek 3D ze Spoolmanem, takich jak Moonraker, który może automatycznie monitorować zużycie filamentu i aktualizować obiekty Szpula. Wskazówki dotyczące konfiguracji można znaleźć w <readmeLink>Spoolman README</readmeLink>.</p>"
|
||||
},
|
||||
"kofi": "Daj napiwek na Ko-fi",
|
||||
"kofi": "Wesprzyj mnie na Ko-fi",
|
||||
"home": {
|
||||
"home": "Strona główna",
|
||||
"welcome": "Witaj w instancji Spoolman!",
|
||||
@@ -395,11 +395,12 @@
|
||||
"boolean": "Wartość logiczna"
|
||||
},
|
||||
"non_unique_key_error": "Klucz musi być unikalny.",
|
||||
"description": "<p>Tutaj możesz dodać dodatkowe pola niestandardowe do swoich podmiotów.</p><p>Po dodaniu pola nie można zmienić jego klucza ani typu, a w przypadku pól typu wyboru nie można usunąć wyborów ani zmienić stanu wielokrotnego wyboru. Jeśli usuniesz pole, powiązane dane dla wszystkich podmiotów zostaną usunięte.</p><p>Klucz jest tym, co inne programy odczytują/zapisują jako dane, więc jeśli twoje niestandardowe pole ma być zintegrowane z programem innej firmy, upewnij się, że ustawiłeś je poprawnie. Wartość domyślna jest stosowana tylko do nowych elementów.</p><p>Dodatkowych pól nie można sortować ani filtrować w widokach tabeli.</p>",
|
||||
"description": "<p>Tutaj możesz dodać dodatkowe pola niestandardowe do swoich encji.</p><p>Po dodaniu pola nie można zmienić jego klucza ani typu, a w przypadku pól typu „wybór” nie można usuwać opcji ani zmieniać ustawienia wielu wyborów. Usunięcie pola spowoduje usunięcie powiązanych danych dla wszystkich encji.</p><p>Klucz jest wartością, którą inne programy odczytują i zapisują jako dane, więc jeśli Twoje pole niestandardowe ma integrować się z programem zewnętrznym, upewnij się, że jest ustawione poprawnie. Wartość domyślna jest stosowana tylko do nowych elementów.</p><p>Pola dodatkowe można wyświetlać i sortować w widokach tabeli. Pola typu „wybór” i logiczne (boolean) udostępniają tam również opcje filtrowania, a wszystkie typy pól dodatkowych obsługują filtrowanie wartości pustych.</p>",
|
||||
"choices_missing_error": "Nie możesz usunąc możliwośći wyboru. Ten wybór nie istnieje: {{choices}}",
|
||||
"key_not_changed": "Zmień klucz na inny.",
|
||||
"delete_confirm": "Usunąć pole {{name}}?",
|
||||
"delete_confirm_description": "Ta akcja usunie wszystkie pola i powiązane z nimi dane dla wszystkich obiektów."
|
||||
"delete_confirm_description": "Ta akcja usunie wszystkie pola i powiązane z nimi dane dla wszystkich obiektów.",
|
||||
"choices_reorder_hint": "Przeciągnij lub użyj klawiszy strzałek, aby zmienić kolejność tej opcji."
|
||||
},
|
||||
"header": "Ustawienia"
|
||||
},
|
||||
@@ -408,5 +409,12 @@
|
||||
"new_location": "Nowa lokalizacja",
|
||||
"no_location": "Brak lokalizacji",
|
||||
"no_locations_help": "Ta strona pozwala uporządkować szpule w lokalizacjach, dodaj kilka szpul aby rozpocząć!"
|
||||
}
|
||||
},
|
||||
"theme": {
|
||||
"label": "Motyw",
|
||||
"system": "System",
|
||||
"light": "Jasny",
|
||||
"dark": "Ciemny"
|
||||
},
|
||||
"sponsor": "Wesprzyj mnie na GitHubie"
|
||||
}
|
||||
@@ -354,7 +354,8 @@
|
||||
"non_unique_key_error": "A chave deve ser única.",
|
||||
"key_not_changed": "Por favor, escolha outra chave.",
|
||||
"delete_confirm": "Apagar o campo {{name}}?",
|
||||
"delete_confirm_description": "Isso excluirá o campo e todos os dados associados em todas as entidades."
|
||||
"delete_confirm_description": "Isso excluirá o campo e todos os dados associados em todas as entidades.",
|
||||
"choices_reorder_hint": "Arraste, ou use as setas direcionais, para reordenar essa opção."
|
||||
}
|
||||
},
|
||||
"documentTitle": {
|
||||
@@ -396,5 +397,11 @@
|
||||
"new_location": "Novo Local",
|
||||
"no_location": "Sem Local",
|
||||
"no_locations_help": "Esta página permite que você organize seus carretéis em locais, adicione alguns carretéis para começar!"
|
||||
},
|
||||
"theme": {
|
||||
"label": "Tema",
|
||||
"system": "Sistema",
|
||||
"light": "Claro",
|
||||
"dark": "Escuro"
|
||||
}
|
||||
}
|
||||
@@ -376,15 +376,16 @@
|
||||
"boolean": "Booleano",
|
||||
"choice": "Opção"
|
||||
},
|
||||
"key_not_changed": "Por favor, mude a chave por outra.",
|
||||
"key_not_changed": "Por favor, altere a chave para algo diferente.",
|
||||
"delete_confirm": "Apagar o campo {{name}}?",
|
||||
"delete_confirm_description": "Isto irá apagar o campo e todos os dados associados em todas as entidades.",
|
||||
"delete_confirm_description": "Isto irá apagar o campo e todos os dados associados a todas as entidades.",
|
||||
"description": "<p>Aqui pode adicionar campos personalizados extras às suas entidades.</p><p>Uma vez que um campo é adicionado, não se pode alterar sua chave ou tipo, e para campos do tipo \"opção\" não se pode remover as opções ou alterar o estado da múltipla opção. Se remover um campo, os dados associados para todas as entidades serão excluídos.</p><p>A chave é como outros programas leem/gravam os dados, portanto, se o seu campo personalizado se destina a integrar com um programa de terceiros, certifique-se de defini-lo corretamente. O valor padrão só é aplicado a novos itens.</p><p>Campos extras não podem ser ordenados ou filtrados nas visualizações de tabela.</p>",
|
||||
"choices_missing_error": "Não pode remover as opções. As seguintes opções serão perdidas: {{choices}}",
|
||||
"tab": "Campos Extras",
|
||||
"boolean_true": "Sim",
|
||||
"boolean_false": "Não",
|
||||
"non_unique_key_error": "A chave deve ser única."
|
||||
"non_unique_key_error": "A chave deve ser única.",
|
||||
"choices_reorder_hint": "Arraste ou use as setas para reordenar esta escolha."
|
||||
},
|
||||
"settings": "Configurações",
|
||||
"header": "Configurações",
|
||||
@@ -408,5 +409,11 @@
|
||||
"new_location": "Novo Local",
|
||||
"no_location": "Sem Local",
|
||||
"no_locations_help": "Esta página permite organizar as suas bobines em locais, adicione algumas bobines para começar!"
|
||||
},
|
||||
"theme": {
|
||||
"label": "Tema",
|
||||
"system": "Sistema",
|
||||
"light": "Claro",
|
||||
"dark": "Escuro"
|
||||
}
|
||||
}
|
||||
@@ -345,7 +345,7 @@
|
||||
"filament": "Марка филамента. У них есть такие свойства, как имя, материал, цвет, диаметр и многое другое.",
|
||||
"vendor": "Компании, производящие филаменты."
|
||||
},
|
||||
"description": "<title>Помощь</title><p>Вот несколько советов, которые помогут вам начать</p><p>Spoolman хранит 3 различных типа данных:</p><itemsHelp/><p>Чтобы добавить новую катушку в базу данных, начните с создания объекта <filamentCreateLink>Филамент</filamentCreateLink>. Как только это будет сделано, приступайте к созданию объекта <spoolCreateLink>Катушка</spoolCreateLink> для этой конкретной катушки. Если позже вы приобретете дополнительные катушки того же филамента, просто создайте дополнительные объекты катушек и повторно используйте тот же объект Филамент.</p><p>При желании вы также можете создать объект <vendorCreateLink>Производитель</vendorCreateLink> для компании, производящий филамент, если хотите отслеживать эту информацию.</p><p>У вас есть возможность связать Spoolman с другими службами 3D-принтеров, например Moonraker, который может автоматически отслеживать использование филамента и обновлять объекты Катушек для вас. Обратитесь к <readmeLink>Spoolman README</readmeLink> для получения инструкций по настройке.</p>",
|
||||
"description": "<title>Помощь</title><p>Вот несколько советов, которые помогут вам начать.</p><p>Spoolman хранит 3 различных типа данных:</p><itemsHelp/><p>Чтобы добавить новую катушку в базу данных, начните с создания объекта <filamentCreateLink>филамент</filamentCreateLink>. Как только это будет сделано, приступайте к созданию объекта <spoolCreateLink>катушка</spoolCreateLink> для этой конкретной катушки. Если позже вы приобретете дополнительные катушки того же филамента, просто создайте дополнительные объекты катушек и повторно используйте тот же объект филамент.</p><p>При желании вы также можете создать объект <vendorCreateLink>производитель</vendorCreateLink> для компании, производящей филамент, если хотите отслеживать эту информацию.</p><p>У вас есть возможность связать Spoolman с другими службами 3D-принтеров, например Moonraker, который может автоматически отслеживать использование филамента и обновлять объекты катушек для вас. Обратитесь к <readmeLink>Spoolman README</readmeLink> для получения инструкций по настройке.</p>",
|
||||
"help": "Помощь"
|
||||
},
|
||||
"kofi": "Поддержите меня на Ko-fi",
|
||||
@@ -356,7 +356,7 @@
|
||||
},
|
||||
"settings": {
|
||||
"extra_fields": {
|
||||
"description": "<p>Здесь вы можете добавлять дополнительные пользовательские поля к своим сущностям.</p><p>Как только поле добавлено, вы не можете изменить его ключ или тип, а для полей типа выбора вы не можете удалить варианты или изменить состояние множественного выбора. Если вы удалите поле, связанные данные для всех сущностей будут удалены.</p><p>Ключевым моментом является то, как другие программы считывают/записывают данные, поэтому, если предполагается, что ваше пользовательское поле интегрируется со сторонней программой, убедитесь, что оно настроено правильно. Значение по умолчанию применяется только к новым элементам.</p><p>Дополнительные поля нельзя отсортировать или отфильтровать в табличных представлениях.</p>",
|
||||
"description": "<p>Здесь вы можете добавить дополнительные пользовательские поля к сущностям.</p><p>После добавления поля нельзя изменить его ключ или тип, а для полей выбора нельзя удалять варианты или изменять состояние множественного выбора. Если вы удалите поле, связанные данные для всех сущностей будут удалены.</p><p>Ключ используется другими программами для чтения и записи данных, поэтому если ваше пользовательское поле должно интегрироваться со сторонней программой, убедитесь, что задали его правильно. Значение по умолчанию применяется только к новым элементам.</p><p>Дополнительные поля можно отображать и сортировать в табличных представлениях. Поля выбора и логические поля также предоставляют там параметры фильтрации, а все типы дополнительных полей поддерживают фильтрацию по пустым значениям.</p>",
|
||||
"tab": "Дополнительные поля",
|
||||
"params": {
|
||||
"key": "Ключ",
|
||||
@@ -384,7 +384,8 @@
|
||||
"delete_confirm_description": "Это приведет к удалению поля и всех связанных с ним данных для всех объектов.",
|
||||
"boolean_true": "Да",
|
||||
"boolean_false": "Нет",
|
||||
"choices_missing_error": "Вы не можете удалить варианты. Отсутствуют следующие варианты: {{choices}}"
|
||||
"choices_missing_error": "Вы не можете удалить варианты. Отсутствуют следующие варианты: {{choices}}",
|
||||
"choices_reorder_hint": "Перетащите или используйте стрелки."
|
||||
},
|
||||
"header": "Настройки",
|
||||
"general": {
|
||||
@@ -408,5 +409,12 @@
|
||||
"locations": "Местоположения",
|
||||
"new_location": "Новое местоположение",
|
||||
"no_location": "Нет местоположения"
|
||||
}
|
||||
},
|
||||
"theme": {
|
||||
"label": "Тема",
|
||||
"system": "Как в системе",
|
||||
"light": "Светлая",
|
||||
"dark": "Тёмная"
|
||||
},
|
||||
"sponsor": "Поддержать меня на GitHub"
|
||||
}
|
||||
@@ -0,0 +1,400 @@
|
||||
{
|
||||
"buttons": {
|
||||
"clone": "Klonovať",
|
||||
"archive": "Archivovať",
|
||||
"create": "Vytvoriť",
|
||||
"save": "Uložiť",
|
||||
"saveAndAdd": "Uložiť Ako",
|
||||
"logout": "Odhlásiť",
|
||||
"delete": "Zmazať",
|
||||
"edit": "Editovať",
|
||||
"cancel": "Zrušiť",
|
||||
"confirm": "Ste si istý?",
|
||||
"continue": "Pokračovať",
|
||||
"filter": "Filter",
|
||||
"clear": "Vyčistiť",
|
||||
"refresh": "Obnoviť",
|
||||
"show": "Zobraziť",
|
||||
"import": "Importovať",
|
||||
"undo": "Späť",
|
||||
"hideArchived": "Skryť Archivované",
|
||||
"showArchived": "Zobraziť Archivované",
|
||||
"notAccessTitle": "Nedostatočné oprávnenia na prístup",
|
||||
"hideColumns": "",
|
||||
"clearFilters": "",
|
||||
"unArchive": ""
|
||||
},
|
||||
"actions": {
|
||||
"create": "Vytvoriť",
|
||||
"edit": "Editovať",
|
||||
"show": "Zobraziť",
|
||||
"clone": "Klonovať",
|
||||
"list": "Zoznam"
|
||||
},
|
||||
"notifications": {
|
||||
"success": "Hotovo",
|
||||
"error": "Chyba (status code: {{statusCode}})",
|
||||
"undoable": "Máte {{seconds}} sekúnd do undo.",
|
||||
"editSuccess": "Úspešne upravené {{resource}}",
|
||||
"editError": "Chyba pri editácii {{resource}} (status kód: {{statusCode}})",
|
||||
"importProgress": "Import: {{processed}}/{{total}}",
|
||||
"deleteSuccess": "",
|
||||
"saveSuccessful": "",
|
||||
"createError": "",
|
||||
"validationError": "",
|
||||
"deleteError": "",
|
||||
"createSuccess": ""
|
||||
},
|
||||
"vendor": {
|
||||
"fields": {
|
||||
"external_id": "",
|
||||
"registered": "",
|
||||
"comment": "",
|
||||
"name": "",
|
||||
"empty_spool_weight": "",
|
||||
"id": ""
|
||||
},
|
||||
"fields_help": {
|
||||
"empty_spool_weight": ""
|
||||
},
|
||||
"titles": {
|
||||
"show_title": "",
|
||||
"show": "",
|
||||
"edit": "",
|
||||
"clone": "",
|
||||
"create": "",
|
||||
"list": ""
|
||||
},
|
||||
"form": {
|
||||
"vendor_updated": ""
|
||||
},
|
||||
"vendor": ""
|
||||
},
|
||||
"documentTitle": {
|
||||
"vendor": {
|
||||
"create": "",
|
||||
"clone": "",
|
||||
"edit": "",
|
||||
"list": "",
|
||||
"show": ""
|
||||
},
|
||||
"default": "",
|
||||
"home": {
|
||||
"list": ""
|
||||
},
|
||||
"spool": {
|
||||
"edit": "",
|
||||
"list": "",
|
||||
"create": "",
|
||||
"show": "",
|
||||
"clone": ""
|
||||
},
|
||||
"filament": {
|
||||
"list": "",
|
||||
"show": "",
|
||||
"clone": "",
|
||||
"create": "",
|
||||
"edit": ""
|
||||
},
|
||||
"suffix": "",
|
||||
"locations": {
|
||||
"list": ""
|
||||
},
|
||||
"help": {
|
||||
"list": ""
|
||||
}
|
||||
},
|
||||
"spool": {
|
||||
"fields": {
|
||||
"measured_weight": "",
|
||||
"last_used": "",
|
||||
"filament_internal": "",
|
||||
"material": "",
|
||||
"spool_weight": "",
|
||||
"weight_to_use": "",
|
||||
"lot_nr": "",
|
||||
"filament_name": "",
|
||||
"price": "",
|
||||
"comment": "",
|
||||
"filament": "",
|
||||
"location": "",
|
||||
"used_length": "",
|
||||
"archived": "",
|
||||
"remaining_length": "",
|
||||
"registered": "",
|
||||
"first_used": "",
|
||||
"used_weight": "",
|
||||
"id": "",
|
||||
"remaining_weight": "",
|
||||
"initial_weight": "",
|
||||
"filament_external": ""
|
||||
},
|
||||
"titles": {
|
||||
"archive": "",
|
||||
"adjust": "",
|
||||
"show": "",
|
||||
"edit": "",
|
||||
"create": "",
|
||||
"clone": "",
|
||||
"show_title": "",
|
||||
"list": ""
|
||||
},
|
||||
"fields_help": {
|
||||
"external_filament": "",
|
||||
"used_weight": "",
|
||||
"weight_to_use": "",
|
||||
"measured_weight": "",
|
||||
"price": "",
|
||||
"spool_weight": "",
|
||||
"lot_nr": "",
|
||||
"remaining_weight": "",
|
||||
"location": "",
|
||||
"initial_weight": ""
|
||||
},
|
||||
"form": {
|
||||
"spool_updated": "",
|
||||
"measurement_type_label": "",
|
||||
"adjust_filament_value": "",
|
||||
"new_location_prompt": "",
|
||||
"measurement_type": {
|
||||
"weight": "",
|
||||
"length": ""
|
||||
},
|
||||
"adjust_filament_help": ""
|
||||
},
|
||||
"spool": "",
|
||||
"formats": {
|
||||
"last_used": ""
|
||||
},
|
||||
"messages": {
|
||||
"archive": ""
|
||||
}
|
||||
},
|
||||
"filament": {
|
||||
"form": {
|
||||
"import_external": "",
|
||||
"filament_updated": "",
|
||||
"import_external_description": ""
|
||||
},
|
||||
"fields_help": {
|
||||
"name": "",
|
||||
"article_number": "",
|
||||
"spool_weight": "",
|
||||
"price": "",
|
||||
"weight": "",
|
||||
"multi_color_direction": "",
|
||||
"material": ""
|
||||
},
|
||||
"fields": {
|
||||
"material": "",
|
||||
"vendor_name": "",
|
||||
"settings_extruder_temp": "",
|
||||
"comment": "",
|
||||
"multi_color": "",
|
||||
"diameter": "",
|
||||
"weight": "",
|
||||
"spool_weight": "",
|
||||
"external_id": "",
|
||||
"single_color": "",
|
||||
"registered": "",
|
||||
"spools": "",
|
||||
"name": "",
|
||||
"price": "",
|
||||
"settings_bed_temp": "",
|
||||
"vendor": "",
|
||||
"density": "",
|
||||
"longitudinal": "",
|
||||
"id": "",
|
||||
"color_hex": "",
|
||||
"article_number": "",
|
||||
"coaxial": ""
|
||||
},
|
||||
"titles": {
|
||||
"clone": "",
|
||||
"show_title": "",
|
||||
"show": "",
|
||||
"create": "",
|
||||
"edit": "",
|
||||
"list": ""
|
||||
},
|
||||
"buttons": {
|
||||
"add_spool": ""
|
||||
},
|
||||
"filament": ""
|
||||
},
|
||||
"printing": {
|
||||
"generic": {
|
||||
"printerMarginBottom": "",
|
||||
"verticalSpacing": "",
|
||||
"rows": "",
|
||||
"borders": {
|
||||
"none": "",
|
||||
"grid": "",
|
||||
"border": ""
|
||||
},
|
||||
"printerMarginTop": "",
|
||||
"deleteSettingsConfirm": "",
|
||||
"deleteSettings": "",
|
||||
"customSize": "",
|
||||
"title": "",
|
||||
"contentSettings": "",
|
||||
"marginRight": "",
|
||||
"printerMarginRight": "",
|
||||
"itemCopies": "",
|
||||
"helpPrinterMargin": "",
|
||||
"settingsName": "",
|
||||
"previewScale": "",
|
||||
"helpMargin": "",
|
||||
"marginTop": "",
|
||||
"skipItems": "",
|
||||
"newSetting": "",
|
||||
"addSettings": "",
|
||||
"layoutSettings": "",
|
||||
"paperSize": "",
|
||||
"columns": "",
|
||||
"description": "",
|
||||
"marginBottom": "",
|
||||
"horizontalSpacing": "",
|
||||
"duplicateSettings": "",
|
||||
"settings": "",
|
||||
"saveSetting": "",
|
||||
"marginLeft": "",
|
||||
"showBorder": "",
|
||||
"saveAsImage": "",
|
||||
"printerMarginLeft": "",
|
||||
"dimensions": "",
|
||||
"defaultSettings": "",
|
||||
"print": ""
|
||||
},
|
||||
"qrcode": {
|
||||
"useHTTPUrl": {
|
||||
"options": {
|
||||
"default": "",
|
||||
"url": ""
|
||||
},
|
||||
"preview": "",
|
||||
"tooltip": "",
|
||||
"label": ""
|
||||
},
|
||||
"showContent": "",
|
||||
"showQRCodeMode": {
|
||||
"withIcon": "",
|
||||
"no": "",
|
||||
"simple": ""
|
||||
},
|
||||
"templateHelp": "",
|
||||
"textSize": "",
|
||||
"showQRCode": "",
|
||||
"template": "",
|
||||
"title": "",
|
||||
"button": ""
|
||||
},
|
||||
"spoolSelect": {
|
||||
"selectedTotal_one": "",
|
||||
"selectedTotal_few": "",
|
||||
"selectedTotal_other": "",
|
||||
"description": "",
|
||||
"showArchived": "",
|
||||
"title": "",
|
||||
"selectAll": "",
|
||||
"noSpoolsSelected": ""
|
||||
}
|
||||
},
|
||||
"settings": {
|
||||
"extra_fields": {
|
||||
"non_unique_key_error": "",
|
||||
"params": {
|
||||
"unit": "",
|
||||
"choices": "",
|
||||
"default_value": "",
|
||||
"field_type": "",
|
||||
"multi_choice": "",
|
||||
"order": "",
|
||||
"name": "",
|
||||
"key": ""
|
||||
},
|
||||
"boolean_true": "",
|
||||
"choices_missing_error": "",
|
||||
"boolean_false": "",
|
||||
"delete_confirm_description": "",
|
||||
"field_type": {
|
||||
"boolean": "",
|
||||
"float": "",
|
||||
"choice": "",
|
||||
"float_range": "",
|
||||
"datetime": "",
|
||||
"integer": "",
|
||||
"integer_range": "",
|
||||
"text": ""
|
||||
},
|
||||
"tab": "",
|
||||
"description": "",
|
||||
"delete_confirm": "",
|
||||
"key_not_changed": ""
|
||||
},
|
||||
"general": {
|
||||
"tab": "",
|
||||
"base_url": {
|
||||
"tooltip": "",
|
||||
"label": ""
|
||||
},
|
||||
"round_prices": {
|
||||
"label": "",
|
||||
"tooltip": ""
|
||||
},
|
||||
"currency": {
|
||||
"label": ""
|
||||
}
|
||||
},
|
||||
"header": "",
|
||||
"settings": ""
|
||||
},
|
||||
"home": {
|
||||
"welcome": "",
|
||||
"home": "",
|
||||
"description": ""
|
||||
},
|
||||
"scanner": {
|
||||
"title": "",
|
||||
"error": {
|
||||
"insecureContext": "",
|
||||
"notReadable": "",
|
||||
"notAllowed": "",
|
||||
"unknown": "",
|
||||
"notFound": "",
|
||||
"streamApiNotSupported": ""
|
||||
},
|
||||
"description": ""
|
||||
},
|
||||
"help": {
|
||||
"resources": {
|
||||
"vendor": "",
|
||||
"filament": "",
|
||||
"spool": ""
|
||||
},
|
||||
"description": "",
|
||||
"help": ""
|
||||
},
|
||||
"no": "",
|
||||
"unknown": "",
|
||||
"yes": "",
|
||||
"locations": {
|
||||
"new_location": "",
|
||||
"no_location": "",
|
||||
"locations": "",
|
||||
"no_locations_help": ""
|
||||
},
|
||||
"version": "",
|
||||
"kofi": "",
|
||||
"table": {
|
||||
"actions": ""
|
||||
},
|
||||
"warnWhenUnsavedChanges": "",
|
||||
"loading": "",
|
||||
"dashboard": {
|
||||
"title": ""
|
||||
},
|
||||
"tags": {
|
||||
"clone": ""
|
||||
}
|
||||
}
|
||||
@@ -0,0 +1,409 @@
|
||||
{
|
||||
"actions": {
|
||||
"list": "Seznam",
|
||||
"create": "Ustvari",
|
||||
"edit": "Uredi",
|
||||
"show": "Prikaži",
|
||||
"clone": "Podvoji"
|
||||
},
|
||||
"buttons": {
|
||||
"create": "Ustvari",
|
||||
"save": "Shrani",
|
||||
"saveAndAdd": "Shrani in dodaj",
|
||||
"logout": "Odjava",
|
||||
"delete": "Izbriši",
|
||||
"edit": "Uredi",
|
||||
"cancel": "Prekliči",
|
||||
"confirm": "Ste prepričani?",
|
||||
"continue": "Nadaljuj",
|
||||
"filter": "Filter",
|
||||
"clear": "Počisti",
|
||||
"refresh": "Osveži",
|
||||
"show": "Prikaži",
|
||||
"undo": "Razveljavi",
|
||||
"import": "Uvozi",
|
||||
"clone": "Podvoji",
|
||||
"archive": "Arhiviraj",
|
||||
"unArchive": "Odstrani iz arhiva",
|
||||
"hideArchived": "Skrij arhiv",
|
||||
"showArchived": "Prikaži arhiv",
|
||||
"notAccessTitle": "Nimate dovoljenja za dostop",
|
||||
"hideColumns": "Skrij stolpce",
|
||||
"clearFilters": "Počisti filtre"
|
||||
},
|
||||
"notifications": {
|
||||
"saveSuccessful": "Uspešno shranjeno!",
|
||||
"success": "Uspešno",
|
||||
"error": "Napaka (status code: {{statusCode}})",
|
||||
"undoable": "Imate {{seconds}} s časa za preklic.",
|
||||
"createSuccess": "Uspešno ustvarjeno {{resource}}",
|
||||
"createError": "Pri ustvarjanju {{resource}} je prišlo do napake (status code: {{statusCode}})",
|
||||
"deleteSuccess": "{{resource}} uspešno izbrisano",
|
||||
"deleteError": "Napaka pri brisanju {{resource}} (status code: {{statusCode}})",
|
||||
"editSuccess": "{{resource}} uspešno urejeno",
|
||||
"editError": "Napaka pri urejanju {{resource}} (status code:{{statusCode}})",
|
||||
"importProgress": "Uvažanje: {{processed}}/{{total}}",
|
||||
"validationError": "Napaka overjanja: {{error}}"
|
||||
},
|
||||
"loading": "Nalaganje",
|
||||
"version": "Verzija",
|
||||
"unknown": "Neznano",
|
||||
"yes": "Da",
|
||||
"no": "Ne",
|
||||
"tags": {
|
||||
"clone": "Podvoji"
|
||||
},
|
||||
"dashboard": {
|
||||
"title": "Nadzorna plošča"
|
||||
},
|
||||
"printing": {
|
||||
"generic": {
|
||||
"title": "Tiskanje",
|
||||
"print": "Natisni",
|
||||
"columns": "Stolpci",
|
||||
"rows": "Vrste",
|
||||
"paperSize": "Velikost papirja",
|
||||
"customSize": "Po meri",
|
||||
"dimensions": "Dimenzije",
|
||||
"showBorder": "Prikaži obrobo",
|
||||
"layoutSettings": "Nastavitve postavitve",
|
||||
"contentSettings": "Nastavitve vsebine",
|
||||
"description": "Prilagodite spodnje nastavitve, da dobite želeno postavitev tiskanja. Upoštevajte, da lahko tiskalniki in vaš operacijski sistem uporabijo svoje robove in merilo, zato boste morda morali nekajkrat poskusiti, preden bo vse pravilno. Preizkusite to na navadnem listu papirja, preden natisnete na dejanske nalepke.",
|
||||
"helpMargin": "Robove je treba nastaviti tako, da ustrezajo papirju za nalepke in tiskalniku; njihova sprememba bo vplivala na velikost celotne mreže.",
|
||||
"helpPrinterMargin": "Varnostno območje je treba nastaviti glede na to, kako blizu roba papirja lahko tiskalnik tiska; sprememba teh nastavitev ne bo vplivala na celotno mrežo.",
|
||||
"previewScale": "Merilo predogleda",
|
||||
"skipItems": "Preskoči elemente",
|
||||
"itemCopies": "Kopije elementov",
|
||||
"horizontalSpacing": "Vodoraven razmik",
|
||||
"verticalSpacing": "Navpičen razmik",
|
||||
"marginLeft": "Lev rob",
|
||||
"marginRight": "Desen rob",
|
||||
"marginTop": "Zgornji rob",
|
||||
"marginBottom": "Spodnji rob",
|
||||
"printerMarginLeft": "Varno območje levo",
|
||||
"printerMarginRight": "Varno območje desno",
|
||||
"printerMarginTop": "Varno območje zgoraj",
|
||||
"printerMarginBottom": "Varno območje spodaj",
|
||||
"borders": {
|
||||
"none": "Brez",
|
||||
"border": "Obroba",
|
||||
"grid": "Mreža"
|
||||
},
|
||||
"settings": "Prednastavitve",
|
||||
"defaultSettings": "Privzeto",
|
||||
"addSettings": "Dodaj novo prednastavitev",
|
||||
"newSetting": "Nov",
|
||||
"duplicateSettings": "Podvoji",
|
||||
"deleteSettings": "Izbriši trenutno prednastavitev",
|
||||
"deleteSettingsConfirm": "Ali ste prepričani, da želite izbrisati to prednastavitev?",
|
||||
"settingsName": "Ime prednastavitve",
|
||||
"saveSetting": "Shrani prednastavitve",
|
||||
"saveAsImage": "Shrani kot sliko"
|
||||
},
|
||||
"qrcode": {
|
||||
"button": "Natisni nalepke",
|
||||
"title": "Tiskanje nalepk",
|
||||
"template": "Predloga nalepke",
|
||||
"templateHelp": "Uporabite {}, da vstavite vrednosti objekta kolut kot besedilo. Na primer, {id} bo nadomeščen z identifikacijsko številko koluta, {filament.material} pa z materialom koluta. Če vrednost manjka, bo nadomeščena z znakom »?«. To lahko odstranite z dodatnim nizom {}. Poleg tega bo vsak tekst med sklopi {} odstranjen, če vrednost manjka. Na primer, {Lot Nr: {lot_nr}} bo prikazal etiketo le, če ima kolut številko serije. Tekst obdajte z dvojno zvezdico **, da bo poudarjen. Kliknite gumb, da si ogledate seznam vseh razpoložljivih oznak.",
|
||||
"showContent": "Natisni nalepko",
|
||||
"textSize": "Velikost besedila na nalepki",
|
||||
"useHTTPUrl": {
|
||||
"label": "Povezava QR kode",
|
||||
"options": {
|
||||
"default": "Privzeto",
|
||||
"url": "URL"
|
||||
},
|
||||
"preview": "Predogled:",
|
||||
"tooltip": "Uporabljena bo lastniška povezava, ki bo delovala le, če jo skenirate s Kolutarjevo funkcijo skeniranja (privzeto). URL uporablja osnovni URL, določen v nastavitvah, ali pa URL trenutne strani, če ta ni nastavljen."
|
||||
},
|
||||
"showQRCode": "Natisni QR kodo",
|
||||
"showQRCodeMode": {
|
||||
"no": "Ne",
|
||||
"simple": "Preprosto",
|
||||
"withIcon": "Z ikono"
|
||||
}
|
||||
},
|
||||
"spoolSelect": {
|
||||
"description": "Izberite kolute, za katere želite natisniti nalepke.",
|
||||
"title": "Izberite kolute",
|
||||
"showArchived": "Prikaži arhiv",
|
||||
"noSpoolsSelected": "Niste izbrali kolutov.",
|
||||
"selectedTotal_one": "Izbran {{count}} kolut",
|
||||
"selectedTotal_two": "Izbrana {{count}} koluta",
|
||||
"selectedTotal_few": "Izbrani {{count}} koluti",
|
||||
"selectedTotal_other": "Izbranih {{count}} kolutov",
|
||||
"selectAll": "Izberi/Odstrani izbiro vseh"
|
||||
}
|
||||
},
|
||||
"warnWhenUnsavedChanges": "Ali ste prepričani, da želite zapustiti stran? Imate ne shranjene spremembe.",
|
||||
"kofi": "Prispevajte na Ko-fi",
|
||||
"spool": {
|
||||
"form": {
|
||||
"measurement_type_label": "Vrsta meritve",
|
||||
"measurement_type": {
|
||||
"length": "Dolžina",
|
||||
"weight": "Masa"
|
||||
},
|
||||
"adjust_filament_value": "Porabljena količina",
|
||||
"new_location_prompt": "Vnesite novo lokacijo",
|
||||
"adjust_filament_help": "Tukaj lahko neposredno odvzemate ali dodajate filament na kolut. Pozitivna vrednost pomeni porabo filamenta, negativna vrednost pa njegovo dodajanje.",
|
||||
"spool_updated": "Ta kolut je spremenil nekdo drug, odkar ste odprli stran. Shranjevanje bo te spremembe prepisalo!"
|
||||
},
|
||||
"spool": "Koluti",
|
||||
"fields": {
|
||||
"id": "ID",
|
||||
"filament_name": "Filament",
|
||||
"filament": "Filament",
|
||||
"filament_internal": "Notranje",
|
||||
"filament_external": "Zunanje",
|
||||
"price": "Cena",
|
||||
"material": "Material",
|
||||
"weight_to_use": "Masa",
|
||||
"used_weight": "Porabljena masa",
|
||||
"remaining_weight": "Preostala masa",
|
||||
"measured_weight": "Izmerjena masa",
|
||||
"used_length": "Porabljena dolžina",
|
||||
"remaining_length": "Preostala dolžina",
|
||||
"initial_weight": "Začetna masa",
|
||||
"spool_weight": "Prazna masa",
|
||||
"location": "Lokacija",
|
||||
"lot_nr": "Št. serije",
|
||||
"first_used": "Prvič uporabljeno",
|
||||
"last_used": "Zadnjič uporabljeno",
|
||||
"registered": "Registrirano",
|
||||
"comment": "Komentar",
|
||||
"archived": "Arhivirano"
|
||||
},
|
||||
"fields_help": {
|
||||
"price": "Cena polnega koluta. Če ta vrednost ni nastavljena, se namesto nje upošteva cena filamenta.",
|
||||
"weight_to_use": "Izberite, katero vrednost mase želite vnesti. Izmerjena masa je na voljo le, če je za izbran filament nastavljena masa koluta.",
|
||||
"used_weight": "Koliko filamenta je bilo porabljenega s koluta. Pri novem kolutu je vrednost 0 g.",
|
||||
"remaining_weight": "Koliko filamenta je še na kolutu. Pri novem kolutu se ta količina ujema z maso koluta.",
|
||||
"measured_weight": "Koliko tehtata filament in kolut.",
|
||||
"initial_weight": "Začetna masa filamenta na kolutu (neto masa). Če ta vrednost ni nastavljena, se uporabi masa iz objekta filamenta.",
|
||||
"spool_weight": "Masa praznega koluta. Pustite prazno, če želite uporabiti vrednost, navedeno pri filamentu ali pri proizvajalcu.",
|
||||
"location": "Kje se nahaja kolut, če imate več mest za shranjevanje.",
|
||||
"lot_nr": "Številka serije proizvajalca. Uporablja se za zagotavljanje barvne doslednosti tiska, če se uporablja več kolutov.",
|
||||
"external_filament": "Izbrali ste filament iz zunanje zbirke podatkov. Ob ustvarjanju koluta se bo samodejno ustvaril objekt filamenta (in morebiti tudi objekt proizvajalca). Če ste za ta filament že ustvarili objekt filamenta, lahko to povzroči nastanek podvojenih objektov filamenta."
|
||||
},
|
||||
"titles": {
|
||||
"create": "Ustvari kolut",
|
||||
"clone": "Podvoji kolut",
|
||||
"edit": "Uredi kolut",
|
||||
"list": "Koluti",
|
||||
"show": "Prikaži kolut",
|
||||
"show_title": "[Kolut #{{id}}] {{name}}",
|
||||
"archive": "Arhiviraj kolut",
|
||||
"adjust": "Prilagodi filament koluta"
|
||||
},
|
||||
"messages": {
|
||||
"archive": "Ali res želite arhivirati ta kolut?"
|
||||
},
|
||||
"formats": {
|
||||
"last_used": "Nazadnje uporabljeno: {{date}}"
|
||||
}
|
||||
},
|
||||
"settings": {
|
||||
"general": {
|
||||
"currency": {
|
||||
"label": "Valuta"
|
||||
},
|
||||
"base_url": {
|
||||
"label": "Osnovni URL",
|
||||
"tooltip": "Osnoven URL, ki se uporablja pri ustvarjanju elementov, kot npr. QR-kode."
|
||||
},
|
||||
"round_prices": {
|
||||
"label": "Zaokrožene cene",
|
||||
"tooltip": "Zaokroži cene na najbližje celo število."
|
||||
},
|
||||
"tab": "Splošno"
|
||||
},
|
||||
"settings": "Nastavitve",
|
||||
"header": "Nastavitve",
|
||||
"extra_fields": {
|
||||
"tab": "Dodatna polja",
|
||||
"params": {
|
||||
"key": "Ključ",
|
||||
"name": "Ime",
|
||||
"field_type": "Tip",
|
||||
"unit": "Enota",
|
||||
"order": "Zaporedje",
|
||||
"default_value": "Privzeta vrednost",
|
||||
"choices": "Izbire",
|
||||
"multi_choice": "Več izbir"
|
||||
},
|
||||
"field_type": {
|
||||
"text": "Besedilo",
|
||||
"integer": "Celo število",
|
||||
"integer_range": "Območje celih števil",
|
||||
"float": "Decimalno število",
|
||||
"float_range": "Območje decimalnih števil",
|
||||
"datetime": "Datum in čas",
|
||||
"boolean": "Logična vrednost",
|
||||
"choice": "Izbira"
|
||||
},
|
||||
"boolean_true": "Da",
|
||||
"boolean_false": "Ne",
|
||||
"non_unique_key_error": "Ključ mora biti edinstven.",
|
||||
"key_not_changed": "Spremenite geslo v nekaj drugega.",
|
||||
"delete_confirm": "Zbrišem polje {{name}}?",
|
||||
"delete_confirm_description": "S tem boste izbrisali polje in vse povezane podatke za vse vnose.",
|
||||
"description": "<p>Tukaj lahko svojim entitetam dodate dodatna polja po meri.</p><p>Ko je polje dodano, njegovega ključa ali tipa ni mogoče spremeniti, pri poljih tipa »izbira« pa ni mogoče odstraniti možnosti ali spremeniti nastavitve za večkratno izbiro. Če polje odstranite, bodo povezani podatki za vse entitete izbrisani.</p><p>Ključ je tisto, kar drugi programi uporabljajo za branje/pisanje podatkov, zato če naj bi se vaše polje po meri integriralo s programom tretje osebe, poskrbite, da ga nastavite pravilno. Privzeta vrednost se uporablja le za nove elemente.</p><p>V preglednicah je mogoče prikazati in razvrstiti dodatna polja. Polja tipa »izbira« in »booleanska« tam omogočajo tudi možnosti filtriranja, vsi tipi dodatnih polj pa podpirajo filtriranje po praznih vrednostih.</p>",
|
||||
"choices_missing_error": "Možnosti ni mogoče odstraniti. Manjkajo naslednje možnosti: {{choices}}",
|
||||
"choices_reorder_hint": "Za spremembo vrstnega reda izbire, povlecite ali uporabite smerne tipke."
|
||||
}
|
||||
},
|
||||
"scanner": {
|
||||
"title": "Čitalnik QR kode",
|
||||
"description": "Preberite Kolutarjevo QR kodo za ogled podrobnosti o kolutu.",
|
||||
"error": {
|
||||
"notAllowed": "Niste omogočili dostopa do kamere.",
|
||||
"insecureContext": "Stran ni dostopna prek protokola HTTPS.",
|
||||
"streamApiNotSupported": "Brskalnik ne podpira MediaStream API.",
|
||||
"notReadable": "Kamere ni mogoče prebrati.",
|
||||
"notFound": "Kamere ni bilo mogoče najti.",
|
||||
"unknown": "Prišlo je do neznane napake. ({{error}})"
|
||||
}
|
||||
},
|
||||
"filament": {
|
||||
"filament": "Filamenti",
|
||||
"fields": {
|
||||
"id": "ID",
|
||||
"vendor_name": "Proizvajalec",
|
||||
"vendor": "Proizvajalec",
|
||||
"name": "Ime",
|
||||
"material": "Material",
|
||||
"price": "Cena",
|
||||
"density": "Gostota",
|
||||
"diameter": "Premer",
|
||||
"weight": "Masa",
|
||||
"spool_weight": "Masa koluta",
|
||||
"article_number": "Številka izdelka",
|
||||
"registered": "Registrirano",
|
||||
"comment": "Komentar",
|
||||
"settings_extruder_temp": "Temperatura ekstruderja",
|
||||
"settings_bed_temp": "Temperatura mize",
|
||||
"color_hex": "Barva",
|
||||
"single_color": "Enobarvno",
|
||||
"multi_color": "Večbarvno",
|
||||
"external_id": "Zunanji ID",
|
||||
"spools": "Prikaži kolute",
|
||||
"longitudinal": "Vzdolžno",
|
||||
"coaxial": "Soosno"
|
||||
},
|
||||
"fields_help": {
|
||||
"material": "Npr. PLA, ABS, PETG itd.",
|
||||
"price": "Cena polnega koluta.",
|
||||
"article_number": "Npr. EAN, UPC itd.",
|
||||
"name": "Ime filamenta, ki omogoča razlikovanje tega tipa filamenta od drugih izdelkov istega proizvajalca. Vsebovati mora, na primer, barvo.",
|
||||
"weight": "Masa filamenta na polnem kolutu (neto masa). V to se ne sme vključiti mase samega koluta, temveč le masa filamenta. To je običajno navedeno na embalaži.",
|
||||
"spool_weight": "Masa praznega koluta. Uporablja se za določitev izmerjene mase koluta.",
|
||||
"multi_color_direction": "Filamenti imajo lahko več barv na dva načina: bodisi s sočasnim iztiskom, kot na primer dvobarvni filamenti z enakomerno porazdeljenimi večbarvnimi odtenki, bodisi z vzdolžnimi barvnimi prehodi, kot na primer filamenti z barvnim prehodom, pri katerih se barva spreminja po dolžini koluta."
|
||||
},
|
||||
"titles": {
|
||||
"create": "Ustvari filament",
|
||||
"clone": "Podvoji filament",
|
||||
"edit": "Uredi filament",
|
||||
"list": "Filamenti",
|
||||
"show": "Prikaži filament",
|
||||
"show_title": "[Filament #{{id}}]{{name}}"
|
||||
},
|
||||
"form": {
|
||||
"import_external": "Uvozi iz zunanjih",
|
||||
"filament_updated": "Ta filament je spremenil nekdo drug, odkar ste odprli stran. Shranjevanje bo te spremembe prepisalo!",
|
||||
"import_external_description": "Izberite filament s seznama, da se njegovi podatki samodejno vpišejo v obrazec za ustvarjanje filamenta. S tem se bodo nadomestili vsi podatki, ki ste jih vnesli v obrazec.<br><br>Ob kliku na »V redu« se bo po potrebi samodejno ustvaril objekt »Proizvajalec«."
|
||||
},
|
||||
"buttons": {
|
||||
"add_spool": "Dodaj kolut"
|
||||
}
|
||||
},
|
||||
"vendor": {
|
||||
"vendor": "Proizvajalci",
|
||||
"fields": {
|
||||
"id": "ID",
|
||||
"name": "Ime",
|
||||
"empty_spool_weight": "Masa praznega koluta",
|
||||
"external_id": "Zunanji ID",
|
||||
"registered": "Registrirano",
|
||||
"comment": "Komentar"
|
||||
},
|
||||
"titles": {
|
||||
"create": "Ustvari proizvajalca",
|
||||
"clone": "Podvoji proizvajalca",
|
||||
"edit": "Uredi proizvajalca",
|
||||
"list": "Proizvajalci",
|
||||
"show": "Prikaži proizvajalca",
|
||||
"show_title": "[Proizvajalec #{{id}}] {{name}}"
|
||||
},
|
||||
"form": {
|
||||
"vendor_updated": "Ta proizvajalec je spremenil nekdo drug, odkar ste odprli stran. Shranjevanje bo te spremembe prepisalo!"
|
||||
},
|
||||
"fields_help": {
|
||||
"empty_spool_weight": "Masa praznega koluta tega proizvajalca."
|
||||
}
|
||||
},
|
||||
"home": {
|
||||
"home": "Dom",
|
||||
"welcome": "Dobrodošli v Kolutarju!",
|
||||
"description": "Izgleda, da še niste dodali nobenih kolutov. Za pomoč pri začetku si oglejte <helpPageLink>pomoč</helpPageLink>."
|
||||
},
|
||||
"help": {
|
||||
"help": "Pomoč",
|
||||
"resources": {
|
||||
"vendor": "Podjetja, ki proizvajajo filament.",
|
||||
"filament": "Znamke filamentov. Imajo lastnosti, kot so ime, material, barva, premer in drugo.",
|
||||
"spool": "Posamezni fizični koluti določenega filamenta."
|
||||
},
|
||||
"description": "<title>Pomoč</title><p>Tukaj je nekaj nasvetov za začetek.</p><p>Kolutar hrani 3 različne vrste podatkov:</p><itemsHelp/><p>Če želite v bazo podatkov dodati nov kolut, najprej ustvarite objekt <filamentCreateLink>Filament</filamentCreateLink>. Ko to storite, nadaljujte z ustvarjanjem objekta <spoolCreateLink>Kolut</spoolCreateLink> za ta določen kolut. Če kasneje pridobite dodatne kolute istega filamenta, preprosto ustvarite dodatne kolutne objekte in ponovno uporabite isti filamentni objekt.</p><p>Po želji lahko ustvarite tudi objekt <vendorCreateLink>Proizvajalec</vendorCreateLink> za podjetje, ki proizvaja filament, če želite slediti tem informacijam. </p><p>Imate možnost povezati druge storitve za 3D-tiskalnike s Kolutarjem, na primer Moonraker, ki lahko samodejno spremlja porabo filamenta in posodablja objekte koluta za vas. Navodila za nastavitev najdete v Kolutarjevi <readmeLink>README</readmeLink> datoteki.</p>"
|
||||
},
|
||||
"table": {
|
||||
"actions": "Dejanja"
|
||||
},
|
||||
"documentTitle": {
|
||||
"default": "Kolutar",
|
||||
"suffix": " | Kolutar",
|
||||
"home": {
|
||||
"list": "Dom | Kolutar"
|
||||
},
|
||||
"help": {
|
||||
"list": "Pomoč | Kolutar"
|
||||
},
|
||||
"locations": {
|
||||
"list": "Lokacije | Kolutar"
|
||||
},
|
||||
"filament": {
|
||||
"list": "Filamenti | Kolutar",
|
||||
"show": "Prikaži filament #{{id}} | Kolutar",
|
||||
"edit": "Uredi filament #{{id}} | Kolutar",
|
||||
"create": "Ustvari filament | Kolutar",
|
||||
"clone": "Podvoji filament #{{id}} | Kolutar"
|
||||
},
|
||||
"spool": {
|
||||
"list": "Koluti | Kolutar",
|
||||
"show": "Prikaži kolut #{{id}} | Kolutar",
|
||||
"edit": "Uredi kolut #{{id}} | Kolutar",
|
||||
"create": "Ustvari kolut | Kolutar",
|
||||
"clone": "Podvoji kolut #{{id}} | Kolutar"
|
||||
},
|
||||
"vendor": {
|
||||
"list": "Proizvajalci | Kolutar",
|
||||
"show": "Prikaži proizvajalca #{{id}} | Kolutar",
|
||||
"edit": "Uredi proizvajalca #{{id}} | Kolutar",
|
||||
"create": "Ustvari proizvajalca | Kolutar",
|
||||
"clone": "Podvoji proizvajalca #{{id}} | Kolutar"
|
||||
}
|
||||
},
|
||||
"locations": {
|
||||
"locations": "Lokacije",
|
||||
"new_location": "Nova lokacija",
|
||||
"no_location": "Brez lokacije",
|
||||
"no_locations_help": "Na tej strani lahko kolute razvrstite po lokacijah. Za začetek dodajte nekaj kolutov."
|
||||
},
|
||||
"sponsor": "Sponzorirajte me na GitHubu",
|
||||
"theme": {
|
||||
"label": "Tema",
|
||||
"system": "Sistem",
|
||||
"light": "Svetla",
|
||||
"dark": "Temna"
|
||||
}
|
||||
}
|
||||
@@ -125,6 +125,15 @@
|
||||
"no": "Nej",
|
||||
"simple": "Enkel",
|
||||
"withIcon": "Med logga"
|
||||
},
|
||||
"useHTTPUrl": {
|
||||
"options": {
|
||||
"default": "",
|
||||
"url": ""
|
||||
},
|
||||
"preview": "",
|
||||
"tooltip": "",
|
||||
"label": ""
|
||||
}
|
||||
},
|
||||
"spoolSelect": {
|
||||
@@ -293,7 +302,9 @@
|
||||
}
|
||||
},
|
||||
"home": {
|
||||
"home": "Hem"
|
||||
"home": "Hem",
|
||||
"welcome": "",
|
||||
"description": ""
|
||||
},
|
||||
"table": {
|
||||
"actions": "Åtgärder"
|
||||
@@ -305,6 +316,14 @@
|
||||
"tab": "Allmänt",
|
||||
"currency": {
|
||||
"label": "Valuta"
|
||||
},
|
||||
"base_url": {
|
||||
"tooltip": "",
|
||||
"label": ""
|
||||
},
|
||||
"round_prices": {
|
||||
"label": "",
|
||||
"tooltip": ""
|
||||
}
|
||||
},
|
||||
"extra_fields": {
|
||||
@@ -368,6 +387,9 @@
|
||||
},
|
||||
"help": {
|
||||
"list": "Hjälp | Spoolman"
|
||||
},
|
||||
"locations": {
|
||||
"list": ""
|
||||
}
|
||||
},
|
||||
"help": {
|
||||
@@ -382,6 +404,8 @@
|
||||
"kofi": "Dricksa mig på Ko-fi",
|
||||
"locations": {
|
||||
"new_location": "Ny plats",
|
||||
"no_location": "Ingen plats"
|
||||
"no_location": "Ingen plats",
|
||||
"locations": "",
|
||||
"no_locations_help": ""
|
||||
}
|
||||
}
|
||||
@@ -31,7 +31,7 @@
|
||||
"create": "สร้างม้วนพลาสติก",
|
||||
"adjust": "ปรับการใช้ม้วนพลาสติก",
|
||||
"edit": "แก้ไขม้วนพลาสติก",
|
||||
"list": "รายการม้วนพลาสติก",
|
||||
"list": "ม้วนพลาสติก",
|
||||
"show": "แสดงม้วนพลาสติก"
|
||||
},
|
||||
"form": {
|
||||
@@ -175,10 +175,10 @@
|
||||
},
|
||||
"filament": {
|
||||
"fields_help": {
|
||||
"spool_weight": "น้ำหนักม้วนพลาสติกเปล่า ใช้เพื่อคำนวณน้ำหนักรวมของม้วนพลาสติก",
|
||||
"spool_weight": "น้ำหนักของม้วนพลาสติกเปล่า ใช้เพื่อคำนวณน้ำหนักที่วัดได้ของม้วนพลาสติก",
|
||||
"material": "ตัวอย่างเช่น PLA, ABS, PETG, TPU, ASA, PC, PA เป็นต้น",
|
||||
"article_number": "เช่น EAN, UPC, เป็นต้น",
|
||||
"price": "ราคาของม้วนพลาสติกเต็ม (เส้นพลาสติกทั้งหมด)",
|
||||
"price": "ราคาของม้วนพลาสติกเต็ม",
|
||||
"weight": "น้ำหนักของเส้นพลาสติกในม้วนพลาสติก (สุทธิ) ไม่รวมม้วนพลาสติกเปล่า เป็นค่าน้ำหนักที่มักระบุบนบรรจุภัณฑ์",
|
||||
"name": "ชื่อเส้นพลาสติก เพื่อแยกความต่างระหว่างเส้นพลาสติกแบบเดียวกันจากผู้ผลิตเดียวกัน โดยทั่วไปควรระบุสีในชื่อด้วย",
|
||||
"multi_color_direction": "เส้นพลาสติกหลายสีสามารถมีหลายสีได้ 2 รูปแบบ: แบบ coextrusion (เช่น เส้นพลาสติกสองสีพร้อมกัน) หรือแบบไล่สีตามความยาว (เช่น เส้นพลาสติกเปลี่ยนสีไปเรื่อยๆ)"
|
||||
@@ -193,15 +193,15 @@
|
||||
"material": "วัสดุ",
|
||||
"id": "ID",
|
||||
"settings_bed_temp": "อุณหภูมิฐานพิมพ์",
|
||||
"vendor_name": "ยี่ห้อ",
|
||||
"vendor_name": "ผู้ผลิต",
|
||||
"diameter": "เส้นผ่านศูนย์กลาง",
|
||||
"article_number": "เลขบทความ",
|
||||
"article_number": "รหัสสินค้า",
|
||||
"multi_color": "หลายสี",
|
||||
"external_id": "รหัสภายนอก",
|
||||
"color_hex": "สี",
|
||||
"price": "ราคา",
|
||||
"spool_weight": "น้ำหนักม้วนพลาสติกเปล่า",
|
||||
"coaxial": "เส้นหลายสี",
|
||||
"coaxial": "เส้นประกบหลายสี",
|
||||
"name": "ชื่อ",
|
||||
"spools": "แสดงม้วนพลาสติก",
|
||||
"registered": "ลงทะเบียน",
|
||||
@@ -209,7 +209,7 @@
|
||||
},
|
||||
"titles": {
|
||||
"edit": "แก้ไขเส้นพลาสติก",
|
||||
"list": "รายการเส้นพลาสติก",
|
||||
"list": "เส้นพลาสติก",
|
||||
"show": "แสดงเส้นพลาสติก",
|
||||
"clone": "ทำซ้ำเส้นพลาสติก",
|
||||
"show_title": "[เส้นพลาสติก #{{id}}] {{name}}",
|
||||
@@ -218,7 +218,7 @@
|
||||
"form": {
|
||||
"filament_updated": "เส้นพลาสติกนี้ได้รับการอัปเดตโดยผู้อื่นหลังจากที่คุณเปิดหน้านี้ การบันทึกจะเขียนทับการเปลี่ยนแปลง!",
|
||||
"import_external": "นำเข้าจากภายนอก",
|
||||
"import_external_description": "เลือกเส้นพลาสติกในรายการเพื่อกรอกข้อมูลอัตโนมัติในฟอร์มนี้ การดำเนินการนี้จะเขียนทับข้อมูลที่คุณกรอกไว้ อ็อบเจ็กต์ผู้ผลิตจะถูกสร้างขึ้นโดยอัตโนมัติเมื่อคุณคลิกตกลง"
|
||||
"import_external_description": "เลือกเส้นพลาสติกในรายการเพื่อกรอกข้อมูลอัตโนมัติในฟอร์มนี้ การดำเนินการนี้จะเขียนทับข้อมูลที่คุณกรอกไว้<br><br>อ็อบเจ็กต์ผู้ผลิตจะถูกสร้างขึ้นโดยอัตโนมัติเมื่อคุณคลิกตกลง หากจำเป็น"
|
||||
},
|
||||
"buttons": {
|
||||
"add_spool": "เพิ่มม้วนพลาสติก"
|
||||
@@ -270,7 +270,7 @@
|
||||
"locations": {
|
||||
"list": "สถานที่เก็บ | Spoolman"
|
||||
},
|
||||
"default": "สปูลแมน"
|
||||
"default": "Spoolman"
|
||||
},
|
||||
"notifications": {
|
||||
"error": "เกิดข้อผิดพลาด (รหัสสถานะ: {{statusCode}})",
|
||||
@@ -296,12 +296,12 @@
|
||||
},
|
||||
"vendor": {
|
||||
"titles": {
|
||||
"create": "สร้างผู้ผลิต/ยี่ห้อ",
|
||||
"list": "รายการผู้ผลิต/ยี่ห้อ",
|
||||
"clone": "ทำซ้ำผู้ผลิต/ยี่ห้อ",
|
||||
"create": "สร้างผู้ผลิต",
|
||||
"list": "ผู้ผลิต",
|
||||
"clone": "ทำซ้ำผู้ผลิต",
|
||||
"show_title": "[ผู้ผลิต #{{id}}] {{name}}",
|
||||
"edit": "แก้ไขผู้ผลิต/ยี่ห้อ",
|
||||
"show": "แสดงผู้ผลิต/ยี่ห้อ"
|
||||
"edit": "แก้ไขผู้ผลิต",
|
||||
"show": "แสดงผู้ผลิต"
|
||||
},
|
||||
"fields": {
|
||||
"empty_spool_weight": "น้ำหนักม้วนพลาสติกเปล่า",
|
||||
@@ -312,21 +312,21 @@
|
||||
"name": "ชื่อ"
|
||||
},
|
||||
"fields_help": {
|
||||
"empty_spool_weight": "น้ำหนักม้วนพลาสติกเปล่าของผู้ผลิตนี้"
|
||||
"empty_spool_weight": "น้ำหนักของม้วนพลาสติกเปล่าจากผู้ผลิตนี้"
|
||||
},
|
||||
"form": {
|
||||
"vendor_updated": "ผู้ผลิตนี้ถูกอัปเดตโดยผู้อื่นหลังจากที่คุณเปิดหน้านี้ การบันทึกจะเขียนทับการเปลี่ยนแปลง!"
|
||||
"vendor_updated": "ผู้ผลิตนี้ได้รับการอัปเดตโดยผู้อื่นหลังจากที่คุณเปิดหน้านี้ การบันทึกจะเขียนทับการเปลี่ยนแปลง!"
|
||||
},
|
||||
"vendor": "ผู้ผลิต"
|
||||
},
|
||||
"help": {
|
||||
"resources": {
|
||||
"vendor": "บริษัทที่ผลิตเส้นพลาสติก",
|
||||
"spool": "ม้วนพลาสติกจริงสำหรับเส้นพลาสติกเฉพาะ",
|
||||
"filament": "แบรนด์เส้นพลาสติก มีคุณสมบัติต่างๆ เช่น ชื่อ วัสดุ สี เส้นผ่านศูนย์กลาง และอื่นๆ"
|
||||
"vendor": "บริษัทที่เป็นผู้ผลิตเส้นพลาสติก",
|
||||
"spool": "ม้วนพลาสติกจริงของเส้นพลาสติกเฉพาะแต่ละม้วน",
|
||||
"filament": "แบรนด์ของเส้นพลาสติก ซึ่งมีคุณสมบัติต่างๆ เช่น ชื่อ วัสดุ สี เส้นผ่านศูนย์กลาง และอื่นๆ"
|
||||
},
|
||||
"help": "วิธีใช้",
|
||||
"description": "<title>วิธีใช้</title><p>นี่คือเคล็ดลับบางส่วนเพื่อเริ่มต้น</p><p>Spoolman เก็บข้อมูลหลัก 3 ประเภท:</p><itemsHelp/><p>ในการเพิ่มม้วนพลาสติกใหม่ลงในฐานข้อมูล ให้เริ่มด้วยการสร้างอ็อบเจ็กต์ <filamentCreateLink>เส้นพลาสติก</filamentCreateLink> เมื่อเสร็จแล้วจึงสร้างอ็อบเจ็กต์ <spoolCreateLink>ม้วนพลาสติก</spoolCreateLink> สำหรับม้วนพลาสติกนั้น หากคุณได้ม้วนพลาสติกเพิ่มในภายหลัง ก็เพียงสร้างอ็อบเจ็กต์ม้วนพลาสติกใหม่และใช้วัตถุ เส้นพลาสติก เดิมได้</p><p>คุณสามารถสร้างอ็อบเจ็กต์ <vendorCreateLink>Manufacturer</vendorCreateLink> เพื่อเก็บข้อมูลบริษัทผู้ผลิตเส้นพลาสติกหากคุณต้องการติดตามข้อมูลนั้น</p><p>คุณสามารถเชื่อมต่อบริการ 3D printer อื่นๆ เข้ากับ Spoolman เช่น Moonraker เพื่อบันทึกปริมาณการใช้เส้นพลาสติกโดยอัตโนมัติและอัปเดตอ็อบเจ็กต์ม้วนพลาสติกของคุณ ดูเพิ่มเติมได้ที่ <readmeLink>Spoolman README</readmeLink></p>"
|
||||
"description": "<title>วิธีใช้</title><p>นี่คือเคล็ดลับบางส่วนเพื่อเริ่มต้นใช้งาน</p><p>Spoolman เก็บข้อมูล 3 ประเภทที่แตกต่างกัน:</p><itemsHelp/><p>ในการเพิ่มม้วนพลาสติกใหม่ลงในฐานข้อมูล ให้เริ่มด้วยการสร้างอ็อบเจ็กต์ <filamentCreateLink>Filament</filamentCreateLink> เมื่อเสร็จแล้วจึงสร้างอ็อบเจ็กต์ <spoolCreateLink>Spool</spoolCreateLink> สำหรับม้วนพลาสติกนั้น หากคุณได้ม้วนพลาสติกของเส้นพลาสติกเดิมเพิ่มในภายหลัง ก็เพียงสร้างอ็อบเจ็กต์ Spool ใหม่และใช้อ็อบเจ็กต์ Filament เดิมซ้ำได้</p><p>นอกจากนี้คุณยังสามารถสร้างอ็อบเจ็กต์ <vendorCreateLink>Manufacturer</vendorCreateLink> สำหรับบริษัทที่ผลิตเส้นพลาสติกได้หากต้องการติดตามข้อมูลนั้น</p><p>คุณสามารถเชื่อมต่อบริการเครื่องพิมพ์ 3D อื่นๆ เข้ากับ Spoolman เช่น Moonraker ซึ่งสามารถตรวจสอบการใช้เส้นพลาสติกโดยอัตโนมัติและอัปเดตอ็อบเจ็กต์ Spool ให้คุณ ดูคำแนะนำในการตั้งค่าได้ที่ <readmeLink>Spoolman README</readmeLink></p>"
|
||||
},
|
||||
"dashboard": {
|
||||
"title": "แดชบอร์ด"
|
||||
@@ -340,13 +340,17 @@
|
||||
"label": "สกุลเงิน"
|
||||
},
|
||||
"base_url": {
|
||||
"label": "URLพื้นฐาน",
|
||||
"tooltip": "URLพื้นฐาน ที่ใช้สำหรับสร้างฟีเจอร์ต่างๆ เช่น QR code"
|
||||
"label": "URL พื้นฐาน",
|
||||
"tooltip": "URL พื้นฐานที่ใช้สำหรับสร้างฟีเจอร์ต่างๆ เช่น QR code"
|
||||
},
|
||||
"round_prices": {
|
||||
"label": "ปัดเศษราคา",
|
||||
"tooltip": "ปัดเศษราคาเป็นจำนวนเต็มที่ใกล้ที่สุด"
|
||||
}
|
||||
},
|
||||
"extra_fields": {
|
||||
"params": {
|
||||
"multi_choice": "เลือกหลายตัว",
|
||||
"multi_choice": "เลือกได้หลายรายการ",
|
||||
"key": "คีย์",
|
||||
"name": "ชื่อ",
|
||||
"field_type": "ประเภท",
|
||||
@@ -355,7 +359,7 @@
|
||||
"default_value": "ค่าเริ่มต้น",
|
||||
"choices": "ตัวเลือก"
|
||||
},
|
||||
"delete_confirm_description": "สิ่งนี้จะลบฟิลด์และข้อมูลที่เกี่ยวข้องทั้งหมดสำหรับเอนทิตี",
|
||||
"delete_confirm_description": "สิ่งนี้จะลบฟิลด์และข้อมูลที่เกี่ยวข้องทั้งหมดของทุกเอนทิตี",
|
||||
"field_type": {
|
||||
"text": "ข้อความ",
|
||||
"integer": "จำนวนเต็ม",
|
||||
@@ -363,7 +367,7 @@
|
||||
"float": "ทศนิยม",
|
||||
"float_range": "ช่วงทศนิยม",
|
||||
"datetime": "วันเวลา",
|
||||
"boolean": "บูลีน(ใส่เฉพาะ ใช่/ไม่)",
|
||||
"boolean": "บูลีน",
|
||||
"choice": "ตัวเลือก"
|
||||
},
|
||||
"tab": "ฟิลด์เพิ่มเติม",
|
||||
@@ -373,7 +377,8 @@
|
||||
"non_unique_key_error": "คีย์ต้องไม่ซ้ำ",
|
||||
"key_not_changed": "โปรดเปลี่ยนคีย์เป็นอย่างอื่น",
|
||||
"delete_confirm": "ลบฟิลด์ {{name}} หรือไม่?",
|
||||
"description": "<p>คุณสามารถเพิ่มฟิลด์ที่กำหนดเองเพิ่มเติมสำหรับเอนทิตีของคุณได้ที่นี่</p><p>เมื่อเพิ่มฟิลด์แล้ว คุณจะไม่สามารถเปลี่ยนคีย์หรือประเภทของฟิลด์ได้ และสำหรับฟิลด์ประเภทตัวเลือกคุณจะไม่สามารถลบตัวเลือกหรือเปลี่ยนโหมด multi choice ได้ หากคุณลบฟิลด์ ข้อมูลของเอนทิตีทั้งหมดจะถูกลบด้วย</p><p>คีย์คือสิ่งที่โปรแกรมอื่นจะใช้เพื่ออ่าน/เขียนข้อมูล ดังนั้นหากฟิลด์ที่คุณสร้างเพื่อเชื่อมต่อกับโปรแกรมอื่น กรุณาตั้งค่าให้ถูกต้อง ค่าดีฟอลต์จะถูกนำไปใช้เฉพาะกับรายการใหม่เท่านั้น</p><p>ฟิลด์เพิ่มเติมไม่สามารถเรียงหรือกรองได้ในตาราง</p>"
|
||||
"description": "<p>คุณสามารถเพิ่มฟิลด์ที่กำหนดเองเพิ่มเติมสำหรับเอนทิตีของคุณได้ที่นี่</p><p>เมื่อเพิ่มฟิลด์แล้ว คุณจะไม่สามารถเปลี่ยนคีย์หรือประเภทของฟิลด์ได้ และสำหรับฟิลด์ประเภทตัวเลือกคุณจะไม่สามารถลบตัวเลือกหรือเปลี่ยนสถานะตัวเลือกหลายรายการได้ หากคุณลบฟิลด์ ข้อมูลที่เกี่ยวข้องของทุกเอนทิตีจะถูกลบไปด้วย</p><p>คีย์คือสิ่งที่โปรแกรมอื่นจะใช้เพื่ออ่าน/เขียนข้อมูล ดังนั้นหากฟิลด์ที่คุณสร้างต้องการเชื่อมต่อกับโปรแกรมภายนอก กรุณาตั้งค่าให้ถูกต้อง ค่าเริ่มต้นจะถูกนำไปใช้เฉพาะกับรายการใหม่เท่านั้น</p><p>ฟิลด์เพิ่มเติมสามารถแสดงและจัดเรียงในมุมมองตารางได้ ฟิลด์ประเภทตัวเลือกและบูลีนยังมีตัวเลือกการกรองที่นั่นด้วย และฟิลด์เพิ่มเติมทุกประเภทรองรับการกรองหาค่าว่าง</p>",
|
||||
"choices_reorder_hint": "ลาก หรือใช้ปุ่มลูกศร เพื่อจัดเรียงตัวเลือกนี้"
|
||||
}
|
||||
},
|
||||
"locations": {
|
||||
@@ -383,10 +388,18 @@
|
||||
"no_locations_help": "หน้านี้ให้คุณจัดการม้วนพลาสติกตามสถานที่เก็บ เพิ่มม้วนพลาสติกเพื่อเริ่มต้น!"
|
||||
},
|
||||
"home": {
|
||||
"home": "หน้าแรก"
|
||||
"home": "หน้าแรก",
|
||||
"welcome": "ยินดีต้อนรับสู่ Spoolman ของคุณ!",
|
||||
"description": "ดูเหมือนว่าคุณยังไม่ได้เพิ่มม้วนพลาสติกใดๆ ดูคำแนะนำการเริ่มต้นใช้งานได้ที่ <helpPageLink>หน้าวิธีใช้</helpPageLink>"
|
||||
},
|
||||
"warnWhenUnsavedChanges": "คุณแน่ใจหรือไม่ว่าต้องการออก? คุณมีการเปลี่ยนแปลงที่ยังไม่ได้บันทึก",
|
||||
"table": {
|
||||
"actions": "การดำเนินการ"
|
||||
},
|
||||
"theme": {
|
||||
"label": "ธีม",
|
||||
"system": "ตามระบบ",
|
||||
"light": "โหมดสว่าง",
|
||||
"dark": "โหมดมืด"
|
||||
}
|
||||
}
|
||||
@@ -68,7 +68,8 @@
|
||||
"length": "Довжина",
|
||||
"weight": "Вага"
|
||||
},
|
||||
"measurement_type_label": "Вид вимірювання"
|
||||
"measurement_type_label": "Вид вимірювання",
|
||||
"adjust_filament_help": ""
|
||||
},
|
||||
"fields_help": {
|
||||
"used_weight": "Скільки філаменту було використано з котушки. Для нової котушки слід використовувати 0g.",
|
||||
@@ -77,10 +78,16 @@
|
||||
"lot_nr": "Номер партії виробника. Може використовуватися для гарантування рівномірного кольору друку при використанні декількох котушок.",
|
||||
"remaining_weight": "Скільки філаменту залишилося на котушці. Для нової котушки це має відповідати вазі філаменту на котушці.",
|
||||
"location": "Де розташована котушка, якщо у вас є кілька місць для зберігання котушок.",
|
||||
"price": "Ціна цілої котушки. Якщо не вказано, замість неї буде використано ціну філамента."
|
||||
"price": "Ціна цілої котушки. Якщо не вказано, замість неї буде використано ціну філамента.",
|
||||
"spool_weight": "",
|
||||
"initial_weight": "",
|
||||
"external_filament": ""
|
||||
},
|
||||
"messages": {
|
||||
"archive": "Ви впевнені що хочете архівувати цю котушку?"
|
||||
},
|
||||
"formats": {
|
||||
"last_used": ""
|
||||
}
|
||||
},
|
||||
"actions": {
|
||||
@@ -167,7 +174,8 @@
|
||||
"options": {
|
||||
"default": "За замовчуванням",
|
||||
"url": "URL"
|
||||
}
|
||||
},
|
||||
"tooltip": ""
|
||||
},
|
||||
"template": "Шаблон етикетки",
|
||||
"showQRCode": "Надрукувати QR-код",
|
||||
@@ -231,7 +239,8 @@
|
||||
"single_color": "Одноколірний",
|
||||
"external_id": "Зовнішній ID",
|
||||
"multi_color": "Багатокольоровий",
|
||||
"coaxial": "Коекструдтваний"
|
||||
"coaxial": "Коекструдтваний",
|
||||
"longitudinal": ""
|
||||
},
|
||||
"titles": {
|
||||
"show_title": "[Філамент #{{id}}] {{name}}",
|
||||
@@ -247,12 +256,14 @@
|
||||
"name": "Назва філаменту, щоб відрізнити цей філамент поміж інших від того самого виробника. Вона повинна містити, наприклад, колір.",
|
||||
"article_number": "Напр. EAN, UPC тощо.",
|
||||
"spool_weight": "Вага порожньої котушки. Використовується для визначення виміряної ваги котушки.",
|
||||
"weight": "Вага повної котушки філаменту (нетто). Ця вага не повинна включати вагу самої котушки, а тільки філаменту. Зазвичай це вказується на упаковці."
|
||||
"weight": "Вага повної котушки філаменту (нетто). Ця вага не повинна включати вагу самої котушки, а тільки філаменту. Зазвичай це вказується на упаковці.",
|
||||
"multi_color_direction": ""
|
||||
},
|
||||
"filament": "Філаменти",
|
||||
"form": {
|
||||
"filament_updated": "Цей філамент хтось/щось оновив після того, як ви відкрили цю сторінку. Збереження перезапише ці зміни!",
|
||||
"import_external": "Імпортувати з зовнішнього джерела"
|
||||
"import_external": "Імпортувати з зовнішнього джерела",
|
||||
"import_external_description": ""
|
||||
},
|
||||
"buttons": {
|
||||
"add_spool": "Додати Котушку"
|
||||
@@ -286,6 +297,9 @@
|
||||
"vendor": "Виробники",
|
||||
"form": {
|
||||
"vendor_updated": "Цей виробник був оновлений кимось/чимось після відкриття цієї сторінки. Збереження перезапише ці зміни!"
|
||||
},
|
||||
"fields_help": {
|
||||
"empty_spool_weight": ""
|
||||
}
|
||||
},
|
||||
"documentTitle": {
|
||||
@@ -317,6 +331,9 @@
|
||||
},
|
||||
"help": {
|
||||
"list": "Довідка | Spoolman"
|
||||
},
|
||||
"locations": {
|
||||
"list": ""
|
||||
}
|
||||
},
|
||||
"table": {
|
||||
@@ -333,7 +350,9 @@
|
||||
},
|
||||
"kofi": "Задонатити на Ko-fi",
|
||||
"home": {
|
||||
"home": "Домашня"
|
||||
"home": "Домашня",
|
||||
"welcome": "",
|
||||
"description": ""
|
||||
},
|
||||
"settings": {
|
||||
"header": "Налаштування",
|
||||
@@ -343,7 +362,12 @@
|
||||
},
|
||||
"tab": "Загальне",
|
||||
"base_url": {
|
||||
"label": "Базова URL-адреса"
|
||||
"label": "Базова URL-адреса",
|
||||
"tooltip": ""
|
||||
},
|
||||
"round_prices": {
|
||||
"label": "",
|
||||
"tooltip": ""
|
||||
}
|
||||
},
|
||||
"extra_fields": {
|
||||
@@ -378,5 +402,11 @@
|
||||
"description": "<p>Тут ви можете додати додаткові користувацькі поля до своїх об’єктів.</p><p>Після додавання поля ви не можете змінити його ключ або тип, а для полів типу вибору ви не можете видалити варіанти або змінити стан кількох варіантів. Якщо ви вилучите поле, пов’язані дані для всіх об’єктів буде видалено.</p><p>Ключ – це те, як інші програми читають/записують дані, тож якщо ваше спеціальне поле має інтегруватися зі сторонніми програми, переконайтеся, що ви правильно її налаштували. Значення за замовчуванням застосовується лише до нових елементів.</p><p>Додаткові поля не можна сортувати чи фільтрувати в режимі перегляду таблиці.</p>"
|
||||
},
|
||||
"settings": "Налаштування"
|
||||
},
|
||||
"locations": {
|
||||
"new_location": "",
|
||||
"no_location": "",
|
||||
"locations": "",
|
||||
"no_locations_help": ""
|
||||
}
|
||||
}
|
||||
@@ -1,7 +1,7 @@
|
||||
{
|
||||
"actions": {
|
||||
"clone": "複製",
|
||||
"show": "檢視",
|
||||
"show": "顯示",
|
||||
"list": "列表",
|
||||
"create": "建立",
|
||||
"edit": "編輯"
|
||||
@@ -16,7 +16,7 @@
|
||||
"cancel": "取消",
|
||||
"confirm": "您確定嗎?",
|
||||
"continue": "繼續",
|
||||
"filter": "過濾器",
|
||||
"filter": "篩選",
|
||||
"clear": "清除",
|
||||
"refresh": "重新整理",
|
||||
"show": "檢視",
|
||||
@@ -61,8 +61,8 @@
|
||||
"printing": {
|
||||
"generic": {
|
||||
"title": "列印中",
|
||||
"description": "調整以下設定以獲得所需的列印佈局。請注意,列表機和您的操作系統可能會套用自己的邊距和縮放比例,因此可能需要進行一些反覆測試才能達到理想效果。在實際標籤上列印之前,先在普通紙上測試。",
|
||||
"helpMargin": "邊距應配置為與您的標籤紙和列表機相符,調整這些將影響整個網格的大小。",
|
||||
"description": "調整以下設定以取得所需的列印版面。請注意,印表機與作業系統可能會套用自己的邊距和縮放比例,因此可能需要多次測試。列印實際標籤前,請先使用一般紙張測試。",
|
||||
"helpMargin": "邊距應設定為與您的標籤紙和印表機相符,調整這些將影響整個網格的大小。",
|
||||
"rows": "列",
|
||||
"paperSize": "紙張大小",
|
||||
"customSize": "自訂",
|
||||
@@ -70,7 +70,7 @@
|
||||
"showBorder": "顯示外框",
|
||||
"previewScale": "預覽縮放比例",
|
||||
"skipItems": "跳過項目",
|
||||
"itemCopies": "項目複製",
|
||||
"itemCopies": "每項份數",
|
||||
"contentSettings": "內容設定",
|
||||
"layoutSettings": "佈局設定",
|
||||
"horizontalSpacing": "水平間距",
|
||||
@@ -100,17 +100,17 @@
|
||||
"columns": "欄",
|
||||
"verticalSpacing": "垂直間距",
|
||||
"marginTop": "上邊界",
|
||||
"helpPrinterMargin": "安全區域應設定為列表機能列印的距離紙張的邊界,更改此選項不影響整個網格。"
|
||||
"helpPrinterMargin": "安全區域應設定為印表機能列印的距離紙張的邊界,更改此選項不影響整個網格。"
|
||||
},
|
||||
"qrcode": {
|
||||
"title": "標籤列印中",
|
||||
"template": "標籤範本",
|
||||
"button": "列印標籤",
|
||||
"templateHelp": "使用 {} 插入料盤物件的值作為內容。例如,{id} 會顯示料盤的 ID,或者 {filament.material} 會以該料盤的材料取代。如果缺少值,將以 \"?\" 代替。可以使用第二組 {} 來移除這個顯示。此外,任何夾在 {} 之間的文字若該值缺失也會被移除。例如,{Lot Nr: {lot_nr}} 僅在料盤有批號時顯示標籤。用雙星號 ** 圍繞文字使其加粗。點選此按鈕以查看所有可用標籤列表。",
|
||||
"templateHelp": "使用 {} 插入線捲物件的數值。例如,{id} 會被替換為線捲 ID,而 {filament.material} 則會替換為該線捲的材質。若數值缺失,會以「?」代替。您可以使用第二組 {} 來移除此符號;此外,若數值缺失,兩組 {} 之間的任何文字也都會被一併移除。例如,{批號:{lot_nr}} 僅會在該線捲含有批號資訊時顯示標籤。使用雙星號 ** 包圍文字可設為粗體。點擊按鈕可查看所有可用標籤的清單。",
|
||||
"textSize": "標籤文字大小",
|
||||
"showContent": "列印標籤",
|
||||
"useHTTPUrl": {
|
||||
"label": "QR碼連結",
|
||||
"label": "QR 碼連結",
|
||||
"preview": "預覽:",
|
||||
"options": {
|
||||
"default": "預設",
|
||||
@@ -131,11 +131,11 @@
|
||||
"showArchived": "檢視已封存",
|
||||
"noSpoolsSelected": "您尚未選擇任何料盤。",
|
||||
"selectAll": "選擇/取消全選",
|
||||
"selectedTotal_other": "已選擇 {{count}} 個料盤"
|
||||
"selectedTotal_other": "已選擇 {{count}} 個線軸"
|
||||
}
|
||||
},
|
||||
"scanner": {
|
||||
"description": "掃描Spoolman的QR碼以檢視關於料盤的詳細資料。",
|
||||
"description": "掃描 Spoolman QR 碼以檢視線軸的詳細資料。",
|
||||
"error": {
|
||||
"notAllowed": "您未被允許存取攝影機。",
|
||||
"streamApiNotSupported": "瀏覽器不支援MediaStream API。",
|
||||
@@ -144,10 +144,10 @@
|
||||
"insecureContext": "此頁面未通過 HTTPS 提供服務。",
|
||||
"unknown": "發生未知的錯誤。({{error}})"
|
||||
},
|
||||
"title": "掃描QR碼"
|
||||
"title": "QR 碼掃描器"
|
||||
},
|
||||
"spool": {
|
||||
"spool": "料盤",
|
||||
"spool": "線軸",
|
||||
"fields": {
|
||||
"id": "ID",
|
||||
"filament": "線材",
|
||||
@@ -324,7 +324,9 @@
|
||||
}
|
||||
},
|
||||
"home": {
|
||||
"home": "主頁"
|
||||
"home": "主頁",
|
||||
"welcome": "歡迎來到您的 Spoolman!",
|
||||
"description": "您似乎還沒新增任何線捲。請參閱 <helpPageLink>說明頁面</helpPageLink> 以了解如何開始使用。"
|
||||
},
|
||||
"help": {
|
||||
"help": "說明",
|
||||
@@ -344,11 +346,15 @@
|
||||
"general": {
|
||||
"tab": "一般",
|
||||
"currency": {
|
||||
"label": "貨幣設定標籤"
|
||||
"label": "貨幣"
|
||||
},
|
||||
"base_url": {
|
||||
"tooltip": "生成 QR 碼等功能時使用的基本 URL。",
|
||||
"label": "基本URL"
|
||||
},
|
||||
"round_prices": {
|
||||
"label": "價格四捨五入",
|
||||
"tooltip": "將價格四捨五入至最接近的整數。"
|
||||
}
|
||||
},
|
||||
"extra_fields": {
|
||||
@@ -388,5 +394,6 @@
|
||||
"no_location": "未設定位置",
|
||||
"no_locations_help": "這個頁面讓您將料盤按位置進行整理,請從增加一些線盤來開始!",
|
||||
"new_location": "新增位置"
|
||||
}
|
||||
},
|
||||
"sponsor": "在 GitHub 上贊助專案"
|
||||
}
|
||||
@@ -21,10 +21,10 @@
|
||||
"undo": "撤销",
|
||||
"import": "导入",
|
||||
"clone": "克隆",
|
||||
"archive": "存档",
|
||||
"unArchive": "取消存档",
|
||||
"archive": "归档",
|
||||
"unArchive": "解除归档",
|
||||
"hideArchived": "隐藏存档",
|
||||
"showArchived": "显示存档",
|
||||
"showArchived": "显示已归档项",
|
||||
"notAccessTitle": "您没有访问权限",
|
||||
"hideColumns": "隐藏列",
|
||||
"clearFilters": "清除筛选器",
|
||||
@@ -34,7 +34,7 @@
|
||||
"warnWhenUnsavedChanges": "您确定要离开吗?您有未保存的更改。",
|
||||
"notifications": {
|
||||
"success": "操作成功",
|
||||
"error": "出现错误 (状态码:{{statusCode}})",
|
||||
"error": "发生错误 (状态码:{{statusCode}})",
|
||||
"undoable": "您有 {{seconds}} 秒可以撤销。",
|
||||
"createSuccess": "成功创建 {{resource}}",
|
||||
"createError": "创建 {{resource}} 时出现错误 (状态码:{{statusCode}})",
|
||||
@@ -60,30 +60,30 @@
|
||||
"printing": {
|
||||
"generic": {
|
||||
"title": "打印中",
|
||||
"description": "调整以下设置以获得所需的打印布局。请记住,打印机和您的操作系统可能会应用自己的边距和缩放,因此您可能需要多次尝试后才能正确打印。在实际标签上打印之前,请在一张普通纸上进行测试。",
|
||||
"helpMargin": "页边距应设置为与您的标签纸和打印机相匹配,更改这些将影响整个网格的大小。",
|
||||
"helpPrinterMargin": "安全区应设置为打印机可以打印的离纸张边缘距离,更改这些不会影响整个网格。",
|
||||
"description": "在下方微调设置以获取理想的打印布局。请注意,打印机驱动和操作系统可能会自动应用边距与缩放,因此您可能需要进行几次试打印。建议在正式打印前先用普通纸测试。",
|
||||
"helpMargin": "页边距应与您的标签纸和打印机相匹配,修改此项会影响整个标签网格的位置。",
|
||||
"helpPrinterMargin": "安全打印区域应设置为打印机允许贴近纸张边缘打印的极限距离,修改此项不会改变标签网格的位置。",
|
||||
"print": "打印",
|
||||
"columns": "行",
|
||||
"columns": "列数",
|
||||
"rows": "列",
|
||||
"paperSize": "纸张尺寸",
|
||||
"customSize": "自定义",
|
||||
"dimensions": "尺寸标注",
|
||||
"customSize": "自定义尺寸",
|
||||
"dimensions": "尺寸规格",
|
||||
"showBorder": "显示边框",
|
||||
"previewScale": "预览比例",
|
||||
"skipItems": "跳过项目",
|
||||
"skipItems": "跳过初始格子数",
|
||||
"contentSettings": "内容设置",
|
||||
"layoutSettings": "布局设置",
|
||||
"horizontalSpacing": "水平间距",
|
||||
"verticalSpacing": "垂直间距",
|
||||
"marginLeft": "左边界",
|
||||
"marginRight": "右边界",
|
||||
"marginTop": "上边界",
|
||||
"marginBottom": "下边界",
|
||||
"printerMarginLeft": "安全区左侧",
|
||||
"printerMarginRight": "安全区右侧",
|
||||
"printerMarginTop": "安全区顶部",
|
||||
"printerMarginBottom": "安全区底部",
|
||||
"horizontalSpacing": "列间距 (水平)",
|
||||
"verticalSpacing": "行间距 (垂直)",
|
||||
"marginLeft": "左边距",
|
||||
"marginRight": "右边距",
|
||||
"marginTop": "上边距",
|
||||
"marginBottom": "下边距",
|
||||
"printerMarginLeft": "左侧安全区域",
|
||||
"printerMarginRight": "右侧安全区域",
|
||||
"printerMarginTop": "顶部安全区域",
|
||||
"printerMarginBottom": "底部安全区域",
|
||||
"borders": {
|
||||
"none": "无",
|
||||
"border": "外边框",
|
||||
@@ -97,7 +97,7 @@
|
||||
"deleteSettingsConfirm": "确定删除此预设吗?",
|
||||
"saveAsImage": "保存为图片",
|
||||
"newSetting": "新增",
|
||||
"itemCopies": "复制项目",
|
||||
"itemCopies": "单个标签打印份数",
|
||||
"duplicateSettings": "复制",
|
||||
"deleteSettings": "删除当前预设"
|
||||
},
|
||||
@@ -127,11 +127,11 @@
|
||||
},
|
||||
"templateHelp": "使用 {} 将料盘的值插入为文本。例如,{id} 将被替换为料盘的ID,或者 {filament.material} 将被替换为料盘的材质。如果某个值缺失,将用 \"?\" 替代。可以使用第二组 {} 来删除缺失值相关的内容。此外,任意位于两组 {} 之间的文本,如果值缺失,将被一同删除。例如,{Lot Nr: {lot_nr}} 只有在料盘存在批号时才会显示标签内容。用双星号 ** 包裹文本可以将其加粗。点击按钮查看所有可用的标签列表。",
|
||||
"useHTTPUrl": {
|
||||
"tooltip": "将使用专有链接(默认情况下,仅能通过 **Spoolman** 的扫描功能访问)。URL 将使用设置中指定的基础 URL;如果未设置基础 URL,则使用当前页面的 URL。",
|
||||
"label": "二维码链接",
|
||||
"tooltip": "将使用专有链接,该链接仅在通过 Spoolman 的内置扫描功能扫描时生效(默认)。URL 将使用设置中指定的基准 URL;若未设置,则使用当前页面的 URL。",
|
||||
"label": "二维码编码内容",
|
||||
"options": {
|
||||
"default": "默认",
|
||||
"url": "URL"
|
||||
"default": "默认(Spoolman 专属格式)",
|
||||
"url": "标准网页 URL"
|
||||
},
|
||||
"preview": "预览:"
|
||||
}
|
||||
@@ -142,42 +142,42 @@
|
||||
"showArchived": "显示存档",
|
||||
"noSpoolsSelected": "您尚未选择任何料盘。",
|
||||
"selectAll": "选择/取消选择全部",
|
||||
"selectedTotal_other": "已选择{{count}}个料盘"
|
||||
"selectedTotal_other": "已选择 {{count}} 卷耗材"
|
||||
}
|
||||
},
|
||||
"scanner": {
|
||||
"title": "扫码二维码",
|
||||
"description": "扫描Spoolman二维码,查看有关料盘的详细信息。",
|
||||
"title": "二维码扫描器",
|
||||
"description": "扫描 Spoolman 专属二维码以快速查看该耗材卷的详细信息。",
|
||||
"error": {
|
||||
"notAllowed": "您不被允许访问相机。",
|
||||
"insecureContext": "该页面不是通过HTTPS传输。",
|
||||
"streamApiNotSupported": "浏览器不支持MediaStream API。",
|
||||
"notAllowed": "您尚未授权允许使用摄像头。",
|
||||
"insecureContext": "当前页面未通过安全的 HTTPS 协议提供服务。",
|
||||
"streamApiNotSupported": "当前浏览器不支持 MediaStream API 视频流。",
|
||||
"notReadable": "相机不可读。",
|
||||
"notFound": "没有找到相机。",
|
||||
"unknown": "发生未知错误。({{error}})"
|
||||
"notFound": "未检测到可用摄像头。",
|
||||
"unknown": "发生未知错误。({{error}})"
|
||||
}
|
||||
},
|
||||
"spool": {
|
||||
"spool": "料盘",
|
||||
"spool": "耗材卷",
|
||||
"fields": {
|
||||
"id": "编号",
|
||||
"id": "编号 (ID)",
|
||||
"filament_name": "耗材",
|
||||
"filament": "耗材",
|
||||
"material": "材料",
|
||||
"filament": "耗材规格",
|
||||
"material": "材质",
|
||||
"weight_to_use": "重量",
|
||||
"used_weight": "已用重量",
|
||||
"remaining_weight": "剩余重量",
|
||||
"measured_weight": "净重",
|
||||
"used_length": "已用长度",
|
||||
"remaining_length": "剩余长度",
|
||||
"location": "位置",
|
||||
"location": "存放位置",
|
||||
"lot_nr": "批号",
|
||||
"first_used": "首次使用",
|
||||
"last_used": "最后使用",
|
||||
"registered": "登记时间",
|
||||
"registered": "录入时间",
|
||||
"comment": "备注",
|
||||
"archived": "存档",
|
||||
"price": "价格",
|
||||
"archived": "已归档",
|
||||
"price": "采购价格",
|
||||
"spool_weight": "空料盘重量",
|
||||
"initial_weight": "初始重量",
|
||||
"filament_internal": "内部",
|
||||
@@ -224,20 +224,20 @@
|
||||
}
|
||||
},
|
||||
"filament": {
|
||||
"filament": "耗材",
|
||||
"filament": "耗材规格",
|
||||
"fields": {
|
||||
"id": "编号",
|
||||
"id": "ID",
|
||||
"vendor_name": "制造商",
|
||||
"vendor": "制造商",
|
||||
"vendor": "厂商",
|
||||
"name": "名称",
|
||||
"material": "材料",
|
||||
"material": "材质",
|
||||
"price": "价格",
|
||||
"density": "密度",
|
||||
"diameter": "直径",
|
||||
"weight": "重量",
|
||||
"diameter": "线径",
|
||||
"weight": "耗材净重",
|
||||
"spool_weight": "料盘重量",
|
||||
"article_number": "产品编号",
|
||||
"registered": "登记时间",
|
||||
"registered": "录入时间",
|
||||
"comment": "备注",
|
||||
"settings_extruder_temp": "挤出头温度",
|
||||
"settings_bed_temp": "热床温度",
|
||||
@@ -245,8 +245,8 @@
|
||||
"spools": "显示料盘",
|
||||
"external_id": "外部ID",
|
||||
"multi_color": "多色",
|
||||
"longitudinal": "纵向",
|
||||
"coaxial": "共挤出",
|
||||
"longitudinal": "纵向渐变",
|
||||
"coaxial": "双色共挤",
|
||||
"single_color": "单色"
|
||||
},
|
||||
"fields_help": {
|
||||
@@ -278,9 +278,9 @@
|
||||
"vendor": {
|
||||
"vendor": "制造商",
|
||||
"fields": {
|
||||
"id": "编号",
|
||||
"name": "名称",
|
||||
"registered": "登记时间",
|
||||
"id": "ID",
|
||||
"name": "厂商名称",
|
||||
"registered": "录入时间",
|
||||
"comment": "备注",
|
||||
"external_id": "外部ID",
|
||||
"empty_spool_weight": "空料盘重量"
|
||||
@@ -339,7 +339,9 @@
|
||||
},
|
||||
"kofi": "在Ko-fi上给我打赏一点小费",
|
||||
"home": {
|
||||
"home": "主页"
|
||||
"home": "主页",
|
||||
"welcome": "欢迎使用您的 Spoolman 实例!",
|
||||
"description": "看来您尚未添加任何耗材。请参阅 <helpPageLink> 帮助页面 </helpPageLink> ,了解入门指南。"
|
||||
},
|
||||
"help": {
|
||||
"help": "帮助",
|
||||
@@ -365,7 +367,7 @@
|
||||
"choice": "选项"
|
||||
},
|
||||
"delete_confirm_description": "这将删除该字段以及所有实体的关联数据。",
|
||||
"description": "<p>这里你可以为你的实体添加额外的自定义字段。</p><p>一旦添加了字段,就无法更改其键或类型;对于选择类型字段,无法删除选项或更改多选状态。如果删除字段,则所有实体的相关数据将被删除。</p><p>键是其他程序读取/写入数据的标识,因此,如果你的自定义字段需要与第三方程序集成,请确保设置正确。默认值仅适用于新项目。</p><p>额外字段在表视图中无法进行排序或过滤。</p>",
|
||||
"description": "<p>您可以在此处为不同的实体对象添加自定义扩展字段。</p><p>字段一旦添加,其键名 (Key) 和数据类型将无法修改;对于单选/多选字段,已有的选项将无法删除,也无法更改其多选状态。如果您删除某个字段,所有对应实体中存储的该字段数据都将被永久抹除。</p><p>键名 (Key) 是第三方程序读取/写入数据时使用的唯一标识。如果您需要将自定义字段与第三方程序集成,请务必设置正确的键名。默认值仅应用于新建的项目。</p><p>扩展字段可以显示在表格视图中并支持排序。单选框与布尔值字段还提供相应的筛选选项,且所有扩展字段类型均支持筛选空值。</p>",
|
||||
"params": {
|
||||
"name": "名称",
|
||||
"field_type": "类型",
|
||||
@@ -381,13 +383,14 @@
|
||||
"choices_missing_error": "您无法删除选择。以下选项丢失:{{choices}}",
|
||||
"non_unique_key_error": "键必须是唯一的。",
|
||||
"key_not_changed": "请将键改成其他的。",
|
||||
"delete_confirm": "删除字段 {{name}}?"
|
||||
"delete_confirm": "删除字段 {{name}}?",
|
||||
"choices_reorder_hint": "拖动或使用方向键来重新排列此选项的顺序。"
|
||||
},
|
||||
"header": "设置",
|
||||
"header": "系统设置",
|
||||
"general": {
|
||||
"tab": "常规",
|
||||
"tab": "常规设置",
|
||||
"currency": {
|
||||
"label": "货币"
|
||||
"label": "货币单位"
|
||||
},
|
||||
"base_url": {
|
||||
"label": "基础URL",
|
||||
@@ -404,5 +407,12 @@
|
||||
"locations": "位置",
|
||||
"new_location": "新位置",
|
||||
"no_location": "没有位置"
|
||||
},
|
||||
"sponsor": "在 GitHub 上赞助项目",
|
||||
"theme": {
|
||||
"label": "主题",
|
||||
"system": "系统",
|
||||
"light": "明亮",
|
||||
"dark": "暗黑"
|
||||
}
|
||||
}
|
||||
@@ -9,17 +9,53 @@ const __dirname = dirname(fileURLToPath(import.meta.url));
|
||||
|
||||
const LOCALES_DIR = join(__dirname, "../public/locales");
|
||||
const I18N_FILE = join(__dirname, "../src/i18n.ts");
|
||||
const REFERENCE_LOCALE = "en";
|
||||
const MIN_TRANSLATED_RATIO = 0.5; // A locale must be at least 50% translated to be included
|
||||
|
||||
/**
|
||||
* Recursively collect all leaf values of a translation object, keyed by their
|
||||
* dotted path. Only string leaves are considered translatable.
|
||||
*/
|
||||
function collectLeaves(obj, prefix, out) {
|
||||
for (const [key, value] of Object.entries(obj)) {
|
||||
const path = prefix ? `${prefix}.${key}` : key;
|
||||
if (value && typeof value === "object") {
|
||||
collectLeaves(value, path, out);
|
||||
} else if (typeof value === "string") {
|
||||
out[path] = value;
|
||||
}
|
||||
}
|
||||
return out;
|
||||
}
|
||||
|
||||
function loadLocale(locale) {
|
||||
const commonFilePath = join(LOCALES_DIR, locale, "common.json");
|
||||
return collectLeaves(JSON.parse(readFileSync(commonFilePath, "utf8")), "", {});
|
||||
}
|
||||
|
||||
/**
|
||||
* Ratio of keys in `locale` that are present, non-empty, and different from the
|
||||
* English reference. Missing keys and untranslated (identical) strings count as
|
||||
* not translated.
|
||||
*/
|
||||
function translatedRatio(reference, locale) {
|
||||
const refKeys = Object.keys(reference);
|
||||
if (refKeys.length === 0) return 0;
|
||||
let translated = 0;
|
||||
for (const key of refKeys) {
|
||||
const value = locale[key];
|
||||
if (typeof value === "string" && value.trim() !== "" && value !== reference[key]) {
|
||||
translated++;
|
||||
}
|
||||
}
|
||||
return translated / refKeys.length;
|
||||
}
|
||||
|
||||
const minLocaleFileSize = 1024 * 10; // Minimum 10kB for a locale file to be considered
|
||||
function getLocaleFolders() {
|
||||
return readdirSync(LOCALES_DIR).filter((folder) => {
|
||||
const folderPath = join(LOCALES_DIR, folder);
|
||||
const commonFilePath = join(folderPath, "common.json");
|
||||
return (
|
||||
statSync(folderPath).isDirectory() &&
|
||||
statSync(commonFilePath).isFile() &&
|
||||
statSync(commonFilePath).size >= minLocaleFileSize
|
||||
);
|
||||
return statSync(folderPath).isDirectory() && statSync(commonFilePath, { throwIfNoEntry: false })?.isFile();
|
||||
});
|
||||
}
|
||||
|
||||
@@ -30,17 +66,27 @@ function getDeclaredLanguages() {
|
||||
}
|
||||
|
||||
function main() {
|
||||
const foundLocales = new Set(getLocaleFolders());
|
||||
const reference = loadLocale(REFERENCE_LOCALE);
|
||||
const declaredLocales = new Set(getDeclaredLanguages());
|
||||
|
||||
const missingLocales = [...foundLocales].filter((locale) => !declaredLocales.has(locale));
|
||||
// Locales that are sufficiently translated but not yet declared in i18n.ts
|
||||
const missingLocales = [];
|
||||
for (const locale of getLocaleFolders()) {
|
||||
if (locale === REFERENCE_LOCALE || declaredLocales.has(locale)) continue;
|
||||
const ratio = translatedRatio(reference, loadLocale(locale));
|
||||
if (ratio >= MIN_TRANSLATED_RATIO) {
|
||||
missingLocales.push({ locale, ratio });
|
||||
}
|
||||
}
|
||||
|
||||
if (missingLocales.length > 0) {
|
||||
console.error("❌ The following locales are missing from src/i18n.ts:");
|
||||
missingLocales.forEach((locale) => console.error(` - ${locale}`));
|
||||
console.error("❌ The following locales are at least 50% translated but missing from src/i18n.ts:");
|
||||
missingLocales.forEach(({ locale, ratio }) =>
|
||||
console.error(` - ${locale} (${Math.round(ratio * 100)}% translated)`),
|
||||
);
|
||||
console.error("⚠️ Please add them to the `languages` object in i18n.ts.");
|
||||
console.log("Template:");
|
||||
for (const locale of missingLocales) {
|
||||
for (const { locale } of missingLocales) {
|
||||
console.log(`["${locale}"]: {
|
||||
name: "",
|
||||
fullCode: "",
|
||||
@@ -50,7 +96,7 @@ function main() {
|
||||
process.exit(1);
|
||||
}
|
||||
|
||||
console.log("✅ All locales are properly declared in i18n.ts.");
|
||||
console.log("✅ All sufficiently translated locales are declared in i18n.ts.");
|
||||
process.exit(0);
|
||||
}
|
||||
|
||||
|
||||
@@ -1,7 +1,7 @@
|
||||
import { DateField, TextField } from "@refinedev/antd";
|
||||
import { UseQueryResult } from "@tanstack/react-query";
|
||||
import { Button, Col, Dropdown, Row, Space, Spin } from "antd";
|
||||
import { ColumnFilterItem, ColumnType } from "antd/es/table/interface";
|
||||
import { Button, Col, DatePicker, Dropdown, Input, InputNumber, Row, Space, Spin } from "antd";
|
||||
import { ColumnFilterItem, ColumnType, FilterDropdownProps } from "antd/es/table/interface";
|
||||
import dayjs from "dayjs";
|
||||
import utc from "dayjs/plugin/utc";
|
||||
import { AlignType } from "rc-table/lib/interface";
|
||||
@@ -27,6 +27,156 @@ const FilterDropdownLoading = () => {
|
||||
);
|
||||
};
|
||||
|
||||
function TextFilterDropdown({ setSelectedKeys, selectedKeys, confirm, clearFilters }: FilterDropdownProps) {
|
||||
const hasValue = selectedKeys.length > 0;
|
||||
return (
|
||||
<>
|
||||
<div style={{ padding: "8px" }}>
|
||||
<Input
|
||||
placeholder="Search..."
|
||||
value={selectedKeys[0] as string}
|
||||
onChange={(e) => setSelectedKeys(e.target.value ? [e.target.value] : [])}
|
||||
onPressEnter={() => confirm()}
|
||||
/>
|
||||
</div>
|
||||
<div className="ant-table-filter-dropdown-btns">
|
||||
<Button
|
||||
type="link"
|
||||
size="small"
|
||||
disabled={!hasValue}
|
||||
onClick={() => {
|
||||
clearFilters?.();
|
||||
confirm();
|
||||
}}
|
||||
>
|
||||
Reset
|
||||
</Button>
|
||||
<Button type="primary" size="small" onClick={() => confirm()}>
|
||||
OK
|
||||
</Button>
|
||||
</div>
|
||||
</>
|
||||
);
|
||||
}
|
||||
|
||||
function NumberRangeFilterDropdown({
|
||||
setSelectedKeys,
|
||||
selectedKeys,
|
||||
confirm,
|
||||
clearFilters,
|
||||
precision,
|
||||
}: FilterDropdownProps & { precision?: number }) {
|
||||
const current = selectedKeys[0] as string | undefined;
|
||||
let minVal: number | null = null;
|
||||
let maxVal: number | null = null;
|
||||
if (current && current.includes(":")) {
|
||||
const parts = current.split(":", 2);
|
||||
minVal = parts[0] ? Number(parts[0]) : null;
|
||||
maxVal = parts[1] ? Number(parts[1]) : null;
|
||||
}
|
||||
|
||||
const updateKeys = (min: number | null, max: number | null) => {
|
||||
if (min === null && max === null) {
|
||||
setSelectedKeys([]);
|
||||
} else {
|
||||
setSelectedKeys([`${min !== null ? min : ""}:${max !== null ? max : ""}`]);
|
||||
}
|
||||
};
|
||||
|
||||
const hasValue = selectedKeys.length > 0;
|
||||
return (
|
||||
<>
|
||||
<div style={{ padding: "8px", display: "flex", flexDirection: "column", gap: 4 }}>
|
||||
<InputNumber
|
||||
placeholder="Min..."
|
||||
value={minVal}
|
||||
precision={precision ?? 0}
|
||||
onChange={(value) => updateKeys(value, maxVal)}
|
||||
/>
|
||||
<InputNumber
|
||||
placeholder="Max..."
|
||||
value={maxVal}
|
||||
precision={precision ?? 0}
|
||||
onChange={(value) => updateKeys(minVal, value)}
|
||||
/>
|
||||
</div>
|
||||
<div className="ant-table-filter-dropdown-btns">
|
||||
<Button
|
||||
type="link"
|
||||
size="small"
|
||||
disabled={!hasValue}
|
||||
onClick={() => {
|
||||
clearFilters?.();
|
||||
confirm();
|
||||
}}
|
||||
>
|
||||
Reset
|
||||
</Button>
|
||||
<Button type="primary" size="small" onClick={() => confirm()}>
|
||||
OK
|
||||
</Button>
|
||||
</div>
|
||||
</>
|
||||
);
|
||||
}
|
||||
|
||||
function DateTimeRangeFilterDropdown({ setSelectedKeys, selectedKeys, confirm, clearFilters }: FilterDropdownProps) {
|
||||
const current = selectedKeys[0] as string | undefined;
|
||||
let fromVal: dayjs.Dayjs | null = null;
|
||||
let toVal: dayjs.Dayjs | null = null;
|
||||
if (current && current.includes("|")) {
|
||||
const parts = current.split("|", 2);
|
||||
fromVal = parts[0] ? dayjs(parts[0]) : null;
|
||||
toVal = parts[1] ? dayjs(parts[1]) : null;
|
||||
}
|
||||
|
||||
const updateKeys = (from: dayjs.Dayjs | null, to: dayjs.Dayjs | null) => {
|
||||
if (from === null && to === null) {
|
||||
setSelectedKeys([]);
|
||||
} else {
|
||||
setSelectedKeys([`${from ? from.utc().toISOString() : ""}|${to ? to.utc().toISOString() : ""}`]);
|
||||
}
|
||||
};
|
||||
|
||||
const hasValue = selectedKeys.length > 0;
|
||||
return (
|
||||
<>
|
||||
<div style={{ padding: "8px", display: "flex", flexDirection: "column", gap: 4 }}>
|
||||
<DatePicker
|
||||
showTime={{ use12Hours: false }}
|
||||
format="YYYY-MM-DD HH:mm:ss"
|
||||
placeholder="From..."
|
||||
value={fromVal}
|
||||
onChange={(date) => updateKeys(date, toVal)}
|
||||
/>
|
||||
<DatePicker
|
||||
showTime={{ use12Hours: false }}
|
||||
format="YYYY-MM-DD HH:mm:ss"
|
||||
placeholder="To..."
|
||||
value={toVal}
|
||||
onChange={(date) => updateKeys(fromVal, date)}
|
||||
/>
|
||||
</div>
|
||||
<div className="ant-table-filter-dropdown-btns">
|
||||
<Button
|
||||
type="link"
|
||||
size="small"
|
||||
disabled={!hasValue}
|
||||
onClick={() => {
|
||||
clearFilters?.();
|
||||
confirm();
|
||||
}}
|
||||
>
|
||||
Reset
|
||||
</Button>
|
||||
<Button type="primary" size="small" onClick={() => confirm()}>
|
||||
OK
|
||||
</Button>
|
||||
</div>
|
||||
</>
|
||||
);
|
||||
}
|
||||
|
||||
interface Entity {
|
||||
id: number;
|
||||
}
|
||||
@@ -40,7 +190,7 @@ export interface Action {
|
||||
|
||||
interface BaseColumnProps<Obj extends Entity> {
|
||||
id: string | string[];
|
||||
dataId?: keyof Obj & string;
|
||||
dataId?: (keyof Obj & string) | string; // Allow string values for custom fields
|
||||
i18ncat?: string;
|
||||
i18nkey?: string;
|
||||
title?: string;
|
||||
@@ -62,6 +212,7 @@ interface FilteredColumnProps {
|
||||
allowMultipleFilters?: boolean;
|
||||
onFilterDropdownOpen?: () => void;
|
||||
loadingFilters?: boolean;
|
||||
filterDropdown?: (props: FilterDropdownProps) => React.ReactNode;
|
||||
}
|
||||
|
||||
interface CustomColumnProps<Obj> {
|
||||
@@ -98,10 +249,8 @@ function Column<Obj extends Entity>(
|
||||
// Sorting
|
||||
if (props.sorter) {
|
||||
columnProps.sorter = true;
|
||||
columnProps.sortOrder = getSortOrderForField(
|
||||
typeSorters<Obj>(props.tableState.sorters),
|
||||
props.dataId ?? (props.id as keyof Obj),
|
||||
);
|
||||
const sortField = props.dataId ?? (Array.isArray(props.id) ? props.id.join(".") : props.id);
|
||||
columnProps.sortOrder = getSortOrderForField(typeSorters<Obj>(props.tableState.sorters), sortField);
|
||||
}
|
||||
|
||||
// Filter
|
||||
@@ -121,6 +270,13 @@ function Column<Obj extends Entity>(
|
||||
if (props.dataId) {
|
||||
columnProps.key = props.dataId;
|
||||
}
|
||||
} else if (props.filterDropdown) {
|
||||
columnProps.filterDropdown = props.filterDropdown;
|
||||
columnProps.filteredValue = props.filteredValue;
|
||||
columnProps.filterMultiple = false;
|
||||
if (props.dataId) {
|
||||
columnProps.key = props.dataId;
|
||||
}
|
||||
}
|
||||
|
||||
// Render
|
||||
@@ -174,7 +330,7 @@ export function SortedColumn<Obj extends Entity>(props: BaseColumnProps<Obj>) {
|
||||
}
|
||||
|
||||
export function RichColumn<Obj extends Entity>(
|
||||
props: Omit<BaseColumnProps<Obj>, "transform"> & { transform?: (value: unknown) => string },
|
||||
props: Omit<BaseColumnProps<Obj>, "transform"> & FilteredColumnProps & { transform?: (value: unknown) => string },
|
||||
) {
|
||||
return Column({
|
||||
...props,
|
||||
@@ -207,11 +363,12 @@ export function FilteredQueryColumn<Obj extends Entity>(props: FilteredQueryColu
|
||||
}
|
||||
filters.push({
|
||||
text: "<empty>",
|
||||
value: "<empty>",
|
||||
value: "",
|
||||
});
|
||||
|
||||
const typedFilters = typeFilters<Obj>(props.tableState.filters);
|
||||
const filteredValue = getFiltersForField(typedFilters, props.dataId ?? (props.id as keyof Obj));
|
||||
const filterField = props.dataId ?? (Array.isArray(props.id) ? props.id.join(".") : props.id);
|
||||
const filteredValue = getFiltersForField(typedFilters, filterField);
|
||||
|
||||
const onFilterDropdownOpen = () => {
|
||||
query.refetch();
|
||||
@@ -220,7 +377,7 @@ export function FilteredQueryColumn<Obj extends Entity>(props: FilteredQueryColu
|
||||
return Column({ ...props, filters, filteredValue, onFilterDropdownOpen, loadingFilters: query.isLoading });
|
||||
}
|
||||
|
||||
interface NumberColumnProps<Obj extends Entity> extends BaseColumnProps<Obj> {
|
||||
interface NumberColumnProps<Obj extends Entity> extends BaseColumnProps<Obj>, FilteredColumnProps {
|
||||
unit: string;
|
||||
maxDecimals?: number;
|
||||
minDecimals?: number;
|
||||
@@ -250,7 +407,7 @@ export function NumberColumn<Obj extends Entity>(props: NumberColumnProps<Obj>)
|
||||
});
|
||||
}
|
||||
|
||||
export function DateColumn<Obj extends Entity>(props: BaseColumnProps<Obj>) {
|
||||
export function DateColumn<Obj extends Entity>(props: BaseColumnProps<Obj> & FilteredColumnProps) {
|
||||
return Column({
|
||||
...props,
|
||||
render: (rawValue) => {
|
||||
@@ -325,7 +482,8 @@ export function SpoolIconColumn<Obj extends Entity>(props: SpoolIconColumnProps<
|
||||
});
|
||||
|
||||
const typedFilters = typeFilters<Obj>(props.tableState.filters);
|
||||
const filteredValue = getFiltersForField(typedFilters, props.dataId ?? (props.id as keyof Obj));
|
||||
const filterField = props.dataId ?? (Array.isArray(props.id) ? props.id.join(".") : props.id);
|
||||
const filteredValue = getFiltersForField(typedFilters, filterField);
|
||||
|
||||
const onFilterDropdownOpen = () => {
|
||||
query.refetch();
|
||||
@@ -389,13 +547,46 @@ export function NumberRangeColumn<Obj extends Entity>(props: NumberColumnProps<O
|
||||
});
|
||||
}
|
||||
|
||||
// Helper function to create filter items for custom fields (boolean and choice only)
|
||||
function createCustomFieldFilters(field: Field): ColumnFilterItem[] {
|
||||
const filters: ColumnFilterItem[] = [];
|
||||
|
||||
if (field.field_type === FieldType.boolean) {
|
||||
// "No" maps to empty ("") because the backend treats unset and false as equivalent
|
||||
return [
|
||||
{ text: "Yes", value: "true" },
|
||||
{ text: "No / Not set", value: "" },
|
||||
];
|
||||
}
|
||||
|
||||
// For choice fields, add each choice as a filter option
|
||||
if (field.field_type === FieldType.choice && field.choices) {
|
||||
field.choices.forEach((choice) => {
|
||||
filters.push({
|
||||
text: choice,
|
||||
value: `"${choice}"`,
|
||||
});
|
||||
});
|
||||
}
|
||||
|
||||
filters.push({ text: "<empty>", value: "" });
|
||||
|
||||
return filters;
|
||||
}
|
||||
|
||||
export function CustomFieldColumn<Obj extends Entity>(props: Omit<BaseColumnProps<Obj>, "id"> & { field: Field }) {
|
||||
const field = props.field;
|
||||
const fieldId = `extra.${field.key}`;
|
||||
|
||||
const typedFilters = typeFilters<Obj>(props.tableState.filters);
|
||||
const filteredValue = getFiltersForField(typedFilters, fieldId);
|
||||
|
||||
const commonProps = {
|
||||
...props,
|
||||
id: ["extra", field.key],
|
||||
title: field.name,
|
||||
sorter: false,
|
||||
sorter: true,
|
||||
dataId: fieldId,
|
||||
transform: (value: unknown) => {
|
||||
if (value === null || value === undefined) {
|
||||
return undefined;
|
||||
@@ -407,12 +598,16 @@ export function CustomFieldColumn<Obj extends Entity>(props: Omit<BaseColumnProp
|
||||
if (field.field_type === FieldType.integer) {
|
||||
return NumberColumn({
|
||||
...commonProps,
|
||||
filterDropdown: (p: FilterDropdownProps) => <NumberRangeFilterDropdown {...p} precision={0} />,
|
||||
filteredValue,
|
||||
unit: field.unit ?? "",
|
||||
maxDecimals: 0,
|
||||
});
|
||||
} else if (field.field_type === FieldType.float) {
|
||||
return NumberColumn({
|
||||
...commonProps,
|
||||
filterDropdown: (p: FilterDropdownProps) => <NumberRangeFilterDropdown {...p} precision={3} />,
|
||||
filteredValue,
|
||||
unit: field.unit ?? "",
|
||||
minDecimals: 0,
|
||||
maxDecimals: 3,
|
||||
@@ -420,12 +615,16 @@ export function CustomFieldColumn<Obj extends Entity>(props: Omit<BaseColumnProp
|
||||
} else if (field.field_type === FieldType.integer_range) {
|
||||
return NumberRangeColumn({
|
||||
...commonProps,
|
||||
filterDropdown: (p: FilterDropdownProps) => <NumberRangeFilterDropdown {...p} precision={0} />,
|
||||
filteredValue,
|
||||
unit: field.unit ?? "",
|
||||
maxDecimals: 0,
|
||||
});
|
||||
} else if (field.field_type === FieldType.float_range) {
|
||||
return NumberRangeColumn({
|
||||
...commonProps,
|
||||
filterDropdown: (p: FilterDropdownProps) => <NumberRangeFilterDropdown {...p} precision={3} />,
|
||||
filteredValue,
|
||||
unit: field.unit ?? "",
|
||||
minDecimals: 0,
|
||||
maxDecimals: 3,
|
||||
@@ -433,14 +632,20 @@ export function CustomFieldColumn<Obj extends Entity>(props: Omit<BaseColumnProp
|
||||
} else if (field.field_type === FieldType.text) {
|
||||
return RichColumn({
|
||||
...commonProps,
|
||||
filterDropdown: TextFilterDropdown,
|
||||
filteredValue,
|
||||
});
|
||||
} else if (field.field_type === FieldType.datetime) {
|
||||
return DateColumn({
|
||||
...commonProps,
|
||||
filterDropdown: DateTimeRangeFilterDropdown,
|
||||
filteredValue,
|
||||
});
|
||||
} else if (field.field_type === FieldType.boolean) {
|
||||
return Column({
|
||||
...commonProps,
|
||||
filters: createCustomFieldFilters(field),
|
||||
filteredValue,
|
||||
render: (rawValue) => {
|
||||
const value = commonProps.transform ? commonProps.transform(rawValue) : rawValue;
|
||||
let text;
|
||||
@@ -457,6 +662,8 @@ export function CustomFieldColumn<Obj extends Entity>(props: Omit<BaseColumnProp
|
||||
} else if (field.field_type === FieldType.choice && !field.multi_choice) {
|
||||
return Column({
|
||||
...commonProps,
|
||||
filters: createCustomFieldFilters(field),
|
||||
filteredValue,
|
||||
render: (rawValue) => {
|
||||
const value = commonProps.transform ? commonProps.transform(rawValue) : rawValue;
|
||||
return <TextField value={value} />;
|
||||
@@ -465,6 +672,8 @@ export function CustomFieldColumn<Obj extends Entity>(props: Omit<BaseColumnProp
|
||||
} else if (field.field_type === FieldType.choice && field.multi_choice) {
|
||||
return Column({
|
||||
...commonProps,
|
||||
filters: createCustomFieldFilters(field),
|
||||
filteredValue,
|
||||
render: (rawValue) => {
|
||||
const value = commonProps.transform ? commonProps.transform(rawValue) : rawValue;
|
||||
return <TextField value={(value as string[] | undefined)?.join(", ")} />;
|
||||
|
||||
@@ -2,6 +2,8 @@ import { DataProvider } from "@refinedev/core";
|
||||
import { axiosInstance } from "@refinedev/simple-rest";
|
||||
import { AxiosInstance } from "axios";
|
||||
import { stringify } from "query-string";
|
||||
import { getCustomFieldFilters } from "../utils/filtering";
|
||||
import { isCustomField } from "../utils/queryFields";
|
||||
|
||||
type MethodTypes = "get" | "delete" | "head" | "options";
|
||||
type MethodTypesWithBody = "post" | "put" | "patch";
|
||||
@@ -25,20 +27,30 @@ const dataProvider = (
|
||||
}
|
||||
|
||||
if (sorters && sorters.length > 0) {
|
||||
// Map all sorters, including custom field sorters
|
||||
queryParams["sort"] = sorters
|
||||
.map((sort) => {
|
||||
const field = sort.field;
|
||||
// Custom field sorters are already in the correct format (extra.field_key)
|
||||
return `${field}:${sort.order}`;
|
||||
})
|
||||
.join(",");
|
||||
}
|
||||
|
||||
if (filters && filters.length > 0) {
|
||||
// Process regular filters
|
||||
filters.forEach((filter) => {
|
||||
if (!("field" in filter)) {
|
||||
throw Error("Filter must be a LogicalFilter.");
|
||||
}
|
||||
|
||||
const field = filter.field;
|
||||
|
||||
// Skip custom fields, they'll be handled separately
|
||||
if (typeof field === "string" && isCustomField(field)) {
|
||||
return;
|
||||
}
|
||||
|
||||
if (filter.value.length > 0) {
|
||||
const filterValueArray = Array.isArray(filter.value) ? filter.value : [filter.value];
|
||||
|
||||
@@ -54,6 +66,14 @@ const dataProvider = (
|
||||
queryParams[field] = filterValue;
|
||||
}
|
||||
});
|
||||
|
||||
// Process custom field filters
|
||||
const customFieldFilters = getCustomFieldFilters(filters);
|
||||
Object.entries(customFieldFilters).forEach(([key, values]) => {
|
||||
if (values.length > 0) {
|
||||
queryParams[`extra.${key}`] = values.map((value) => (value === "<empty>" ? "" : value)).join(",");
|
||||
}
|
||||
});
|
||||
}
|
||||
|
||||
const { data, headers } = await httpClient[requestMethod](`${url}`, {
|
||||
|
||||
@@ -187,16 +187,20 @@ export function ParsedExtras<T extends { extra?: { [key: string]: string } }>(
|
||||
|
||||
/**
|
||||
* Convert the JSON-parsed value extra key-values of an entity to their string values.
|
||||
*
|
||||
* A field the user left empty has no value, which travels as an explicit null: the API
|
||||
* merges `extra` per key, so a key simply left out of the map would keep whatever it
|
||||
* already held instead of being cleared.
|
||||
* @param obj
|
||||
* @returns
|
||||
*/
|
||||
export function StringifiedExtras<T extends { extra?: { [key: string]: unknown } }>(
|
||||
obj: T,
|
||||
): Omit<T, "extra"> & { extra?: { [key: string]: string } } {
|
||||
): Omit<T, "extra"> & { extra?: { [key: string]: string | null } } {
|
||||
if (obj.extra) {
|
||||
const newExtra: { [key: string]: string } = {};
|
||||
const newExtra: { [key: string]: string | null } = {};
|
||||
Object.entries(obj.extra).forEach(([key, value]) => {
|
||||
newExtra[key] = JSON.stringify(value);
|
||||
newExtra[key] = value === undefined ? null : JSON.stringify(value);
|
||||
});
|
||||
return {
|
||||
...obj,
|
||||
|
||||
@@ -1,9 +1,9 @@
|
||||
import { DownOutlined } from "@ant-design/icons";
|
||||
import { DesktopOutlined, DownOutlined, MoonOutlined, SunOutlined } from "@ant-design/icons";
|
||||
import type { RefineThemedLayoutHeaderProps } from "@refinedev/antd";
|
||||
import { useGetLocale, useSetLocale } from "@refinedev/core";
|
||||
import { Layout as AntdLayout, Button, Dropdown, MenuProps, Space, Switch, theme } from "antd";
|
||||
import { useGetLocale, useSetLocale, useTranslate } from "@refinedev/core";
|
||||
import { Layout as AntdLayout, Button, Dropdown, MenuProps, Segmented, Space, theme } from "antd";
|
||||
import React, { useContext } from "react";
|
||||
import { ColorModeContext } from "../../contexts/color-mode";
|
||||
import { ColorModeContext, ThemePreference } from "../../contexts/color-mode";
|
||||
|
||||
import { languages } from "../../i18n";
|
||||
import QRCodeScannerModal from "../qrCodeScanner";
|
||||
@@ -12,12 +12,19 @@ const { useToken } = theme;
|
||||
|
||||
export const Header = ({ sticky }: RefineThemedLayoutHeaderProps) => {
|
||||
const { token } = useToken();
|
||||
const t = useTranslate();
|
||||
const locale = useGetLocale();
|
||||
const changeLanguage = useSetLocale();
|
||||
const { mode, setMode } = useContext(ColorModeContext);
|
||||
const { preference, setPreference } = useContext(ColorModeContext);
|
||||
|
||||
const currentLocale = locale();
|
||||
|
||||
const themeOptions = [
|
||||
{ value: "system", icon: <DesktopOutlined />, title: t("theme.system") },
|
||||
{ value: "light", icon: <SunOutlined />, title: t("theme.light") },
|
||||
{ value: "dark", icon: <MoonOutlined />, title: t("theme.dark") },
|
||||
];
|
||||
|
||||
const menuItems: MenuProps["items"] = [...(Object.keys(languages) || [])].sort().map((lang: string) => ({
|
||||
key: lang,
|
||||
onClick: () => changeLanguage(lang),
|
||||
@@ -55,11 +62,11 @@ export const Header = ({ sticky }: RefineThemedLayoutHeaderProps) => {
|
||||
</Space>
|
||||
</Button>
|
||||
</Dropdown>
|
||||
<Switch
|
||||
checkedChildren="🌛"
|
||||
unCheckedChildren="🔆"
|
||||
onChange={() => setMode(mode === "light" ? "dark" : "light")}
|
||||
defaultChecked={mode === "dark"}
|
||||
<Segmented
|
||||
aria-label={t("theme.label")}
|
||||
options={themeOptions}
|
||||
value={preference}
|
||||
onChange={(value) => setPreference(value as ThemePreference)}
|
||||
/>
|
||||
<QRCodeScannerModal />
|
||||
</Space>
|
||||
|
||||
@@ -3,10 +3,15 @@ import { useTranslate } from "@refinedev/core";
|
||||
import { Button } from "antd";
|
||||
import { Footer } from "antd/es/layout/layout";
|
||||
import Logo from "../icon.svg?react";
|
||||
import { getBasePath } from "../utils/url";
|
||||
import { Header } from "./header";
|
||||
import { Version } from "./version";
|
||||
|
||||
const SponsorHeart = () => (
|
||||
<svg viewBox="0 0 16 16" width="1.2em" height="1.2em" fill="#db61a2" aria-hidden="true">
|
||||
<path d="m8 14.25.345.666a.75.75 0 0 1-.69 0l-.008-.004-.018-.01a7.152 7.152 0 0 1-.31-.17 22.055 22.055 0 0 1-3.434-2.414C2.045 10.731 0 8.35 0 5.5 0 2.836 2.086 1 4.25 1 5.797 1 7.153 1.802 8 3.02 8.847 1.802 10.203 1 11.75 1 13.914 1 16 2.836 16 5.5c0 2.85-2.045 5.231-3.885 6.818a22.066 22.066 0 0 1-3.744 2.584l-.018.01-.006.003h-.002Z" />
|
||||
</svg>
|
||||
);
|
||||
|
||||
const SpoolmanFooter = () => {
|
||||
const t = useTranslate();
|
||||
|
||||
@@ -26,19 +31,13 @@ const SpoolmanFooter = () => {
|
||||
</div>
|
||||
<div>
|
||||
<Button
|
||||
icon={
|
||||
<img
|
||||
src={getBasePath() + "/kofi_s_logo_nolabel.png"}
|
||||
style={{
|
||||
height: "1.6em",
|
||||
}}
|
||||
/>
|
||||
}
|
||||
icon={<SponsorHeart />}
|
||||
type="text"
|
||||
href="https://ko-fi.com/donkie"
|
||||
href="https://github.com/sponsors/Donkie"
|
||||
target="_blank"
|
||||
rel="noopener noreferrer"
|
||||
>
|
||||
{t("kofi")}
|
||||
{t("sponsor")}
|
||||
</Button>
|
||||
</div>
|
||||
</div>
|
||||
|
||||
@@ -18,12 +18,12 @@ const QRCodeScannerModal = () => {
|
||||
const result = detectedCodes[0].rawValue;
|
||||
|
||||
// Check for the spoolman ID format
|
||||
const match = result.match(/^web\+spoolman:s-(?<id>[0-9]+)$/);
|
||||
const match = result.match(/^web\+spoolman:s-(?<id>[0-9]+)$/i);
|
||||
if (match && match.groups) {
|
||||
setVisible(false);
|
||||
navigate(`/spool/show/${match.groups.id}`);
|
||||
}
|
||||
const fullURLmatch = result.match(/^https?:\/\/[^/]+\/spool\/show\/(?<id>[0-9]+)$/);
|
||||
const fullURLmatch = result.match(/^https?:\/\/[^/]+\/spool\/show\/(?<id>[0-9]+)$/i);
|
||||
if (fullURLmatch && fullURLmatch.groups) {
|
||||
setVisible(false);
|
||||
navigate(`/spool/show/${fullURLmatch.groups.id}`);
|
||||
@@ -41,7 +41,10 @@ const QRCodeScannerModal = () => {
|
||||
facingMode: "environment",
|
||||
}}
|
||||
onScan={onScan}
|
||||
formats={["qr_code"]}
|
||||
// Accept common 2D matrix codes, not just QR, so labels generated with e.g.
|
||||
// Data Matrix or Aztec codes can be scanned too (issue #887). Payloads that
|
||||
// don't match the spoolman format are ignored, so widening this is harmless.
|
||||
formats={["qr_code", "micro_qr_code", "rm_qr_code", "data_matrix", "aztec", "pdf417"]}
|
||||
onError={(err: unknown) => {
|
||||
const error = err as Error;
|
||||
console.error(error);
|
||||
|
||||
@@ -1,39 +1,60 @@
|
||||
import { ConfigProvider, theme } from "antd";
|
||||
import { createContext, PropsWithChildren, useEffect, useState } from "react";
|
||||
|
||||
export type ThemePreference = "system" | "light" | "dark";
|
||||
type ResolvedMode = "light" | "dark";
|
||||
|
||||
type ColorModeContextType = {
|
||||
mode: string;
|
||||
setMode: (mode: string) => void;
|
||||
// The effective theme actually applied ("light" | "dark").
|
||||
mode: ResolvedMode;
|
||||
// The user's chosen preference; "system" follows the OS/browser setting live.
|
||||
preference: ThemePreference;
|
||||
setPreference: (preference: ThemePreference) => void;
|
||||
};
|
||||
|
||||
export const ColorModeContext = createContext<ColorModeContextType>({} as ColorModeContextType);
|
||||
|
||||
const DARK_MEDIA_QUERY = "(prefers-color-scheme: dark)";
|
||||
|
||||
const isThemePreference = (value: string | null): value is ThemePreference =>
|
||||
value === "system" || value === "light" || value === "dark";
|
||||
|
||||
const getSystemMode = (): ResolvedMode => (window?.matchMedia(DARK_MEDIA_QUERY).matches ? "dark" : "light");
|
||||
|
||||
export const ColorModeContextProvider = ({ children }: PropsWithChildren) => {
|
||||
const colorModeFromLocalStorage = localStorage.getItem("colorMode");
|
||||
const isSystemPreferenceDark = window?.matchMedia("(prefers-color-scheme: dark)").matches;
|
||||
// Legacy versions stored the resolved "light"/"dark" here, which are still valid
|
||||
// preference values, so existing users keep whatever they had. New/unset installs
|
||||
// default to "system" so the app follows the OS/browser theme (issue #947).
|
||||
const storedPreference = localStorage.getItem("colorMode");
|
||||
const [preference, setPreferenceState] = useState<ThemePreference>(
|
||||
isThemePreference(storedPreference) ? storedPreference : "system",
|
||||
);
|
||||
|
||||
const systemPreference = isSystemPreferenceDark ? "dark" : "light";
|
||||
const [mode, setMode] = useState(colorModeFromLocalStorage || systemPreference);
|
||||
const [systemMode, setSystemMode] = useState<ResolvedMode>(getSystemMode);
|
||||
|
||||
// Keep tracking the OS/browser theme so "system" reacts to changes at runtime.
|
||||
useEffect(() => {
|
||||
window.localStorage.setItem("colorMode", mode);
|
||||
}, [mode]);
|
||||
const media = window.matchMedia(DARK_MEDIA_QUERY);
|
||||
const handler = (event: MediaQueryListEvent) => setSystemMode(event.matches ? "dark" : "light");
|
||||
media.addEventListener("change", handler);
|
||||
return () => media.removeEventListener("change", handler);
|
||||
}, []);
|
||||
|
||||
const setColorMode = () => {
|
||||
if (mode === "light") {
|
||||
setMode("dark");
|
||||
} else {
|
||||
setMode("light");
|
||||
}
|
||||
const setPreference = (next: ThemePreference) => {
|
||||
setPreferenceState(next);
|
||||
window.localStorage.setItem("colorMode", next);
|
||||
};
|
||||
|
||||
const mode: ResolvedMode = preference === "system" ? systemMode : preference;
|
||||
|
||||
const { darkAlgorithm, defaultAlgorithm } = theme;
|
||||
|
||||
return (
|
||||
<ColorModeContext.Provider
|
||||
value={{
|
||||
setMode: setColorMode,
|
||||
mode,
|
||||
preference,
|
||||
setPreference,
|
||||
}}
|
||||
>
|
||||
<ConfigProvider
|
||||
|
||||
@@ -139,6 +139,16 @@ export const languages: { [key: string]: Language } = {
|
||||
fullCode: "th-TH",
|
||||
djs: () => import("dayjs/locale/th"),
|
||||
},
|
||||
["lt"]: {
|
||||
name: "Lietuvių",
|
||||
fullCode: "lt-LT",
|
||||
djs: () => import("dayjs/locale/lt"),
|
||||
},
|
||||
["tr"]: {
|
||||
name: "Türkçe",
|
||||
fullCode: "tr-TR",
|
||||
djs: () => import("dayjs/locale/tr"),
|
||||
},
|
||||
};
|
||||
|
||||
i18n
|
||||
|
||||
@@ -64,6 +64,7 @@ export const FilamentCreate = (props: IResourceComponentsProps & CreateOrClonePr
|
||||
const { selectProps: vendorSelect } = useSelect<IVendor>({
|
||||
resource: "vendor",
|
||||
optionLabel: "name",
|
||||
pagination: { mode: "off" },
|
||||
});
|
||||
|
||||
const importFilament = async (filament: ExternalFilament) => {
|
||||
|
||||
@@ -19,6 +19,10 @@ We also need to stringify them again before sending them back to the API, which
|
||||
the form's onFinish method. Form.Item's normalize should do this, but it doesn't seem to work.
|
||||
*/
|
||||
|
||||
// What the form submits: extra values back as JSON strings, with null for a field left
|
||||
// empty — the API merges extra per key, so null is what clears a value.
|
||||
type IFilamentRequest = Omit<IFilament, "extra"> & { extra?: { [key: string]: string | null } };
|
||||
|
||||
export const FilamentEdit = () => {
|
||||
const t = useTranslate();
|
||||
const [messageApi, contextHolder] = message.useMessage();
|
||||
@@ -27,7 +31,7 @@ export const FilamentEdit = () => {
|
||||
const currency = useCurrency();
|
||||
const [colorType, setColorType] = useState<"single" | "multi">("single");
|
||||
|
||||
const { formProps, saveButtonProps } = useForm<IFilament, HttpError, IFilament, IFilament>({
|
||||
const { formProps, saveButtonProps } = useForm<IFilament, HttpError, IFilamentRequest, IFilament>({
|
||||
liveMode: "manual",
|
||||
onLiveEvent() {
|
||||
// Warn the user if the filament has been updated since the form was opened
|
||||
@@ -40,6 +44,7 @@ export const FilamentEdit = () => {
|
||||
const { selectProps } = useSelect<IVendor>({
|
||||
resource: "vendor",
|
||||
optionLabel: "name",
|
||||
pagination: { mode: "off" },
|
||||
});
|
||||
|
||||
// Add the vendor_id field to the form
|
||||
|
||||
@@ -107,7 +107,7 @@ export function LocationContainer() {
|
||||
|
||||
// Update the value in the settings
|
||||
const newLocs = [...locationsList].filter((loc) => loc != EMPTYLOC);
|
||||
newLocs[locationsList.indexOf(location)] = newTitle;
|
||||
newLocs[newLocs.indexOf(location)] = newTitle;
|
||||
setLocationsSetting.mutate(newLocs);
|
||||
};
|
||||
|
||||
|
||||
@@ -45,7 +45,6 @@
|
||||
flex-direction: column;
|
||||
gap: 0.5em;
|
||||
min-height: 3em;
|
||||
max-height: 50em;
|
||||
overflow-y: scroll;
|
||||
}
|
||||
|
||||
|
||||
@@ -110,7 +110,7 @@ const QRCodePrintingDialog = ({
|
||||
</Radio.Group>
|
||||
</Form.Item>
|
||||
<Form.Item label={t("printing.qrcode.useHTTPUrl.preview")}>
|
||||
<Text> {useHTTPUrl ? `${baseUrlRoot}/spool/show/{id}` : `web+spoolman:s-{id}`}</Text>
|
||||
<Text> {useHTTPUrl ? `${baseUrlRoot}/spool/show/{id}` : `WEB+SPOOLMAN:S-{id}`}</Text>
|
||||
</Form.Item>
|
||||
</>
|
||||
)}
|
||||
|
||||
@@ -300,7 +300,7 @@ Spool Weight: {filament.spool_weight} g
|
||||
</>
|
||||
}
|
||||
items={items.map((spool) => ({
|
||||
value: useHTTPUrl ? `${baseUrlRoot}/spool/show/${spool.id}` : `web+spoolman:s-${spool.id}`,
|
||||
value: useHTTPUrl ? `${baseUrlRoot}/spool/show/${spool.id}` : `WEB+SPOOLMAN:S-${spool.id}`,
|
||||
label: (
|
||||
<p
|
||||
style={{
|
||||
|
||||
@@ -1,4 +1,4 @@
|
||||
import { PlusOutlined } from "@ant-design/icons";
|
||||
import { HolderOutlined, PlusOutlined } from "@ant-design/icons";
|
||||
import { useTranslate } from "@refinedev/core";
|
||||
import {
|
||||
Button,
|
||||
@@ -12,6 +12,7 @@ import {
|
||||
Select,
|
||||
Space,
|
||||
Table,
|
||||
Tag,
|
||||
message,
|
||||
} from "antd";
|
||||
import { FormItemProps, Rule } from "antd/es/form";
|
||||
@@ -20,7 +21,9 @@ import dayjs from "dayjs";
|
||||
import advancedFormat from "dayjs/plugin/advancedFormat";
|
||||
import timezone from "dayjs/plugin/timezone";
|
||||
import utc from "dayjs/plugin/utc";
|
||||
import { useState } from "react";
|
||||
import { useRef, useState } from "react";
|
||||
import { DndProvider, useDrag, useDrop } from "react-dnd";
|
||||
import { HTML5Backend } from "react-dnd-html5-backend";
|
||||
import { Trans } from "react-i18next";
|
||||
import { useParams } from "react-router";
|
||||
import { DateTimePicker } from "../../components/dateTimePicker";
|
||||
@@ -55,6 +58,92 @@ const canEditField = (dataIndex: string, isNew: boolean) => {
|
||||
return dataIndex !== "key" && dataIndex !== "field_type" && dataIndex !== "multi_choice";
|
||||
};
|
||||
|
||||
const CHOICE_DRAG_TYPE = "extraFieldChoice";
|
||||
|
||||
interface ChoiceDragItem {
|
||||
choice: string;
|
||||
}
|
||||
|
||||
interface DraggableChoiceTagProps {
|
||||
label: React.ReactNode;
|
||||
value: string;
|
||||
closable: boolean;
|
||||
onClose: (e?: React.MouseEvent<HTMLElement>) => void;
|
||||
form: FormInstance;
|
||||
}
|
||||
|
||||
/**
|
||||
* A tag in the choices editor that can be dragged, or arrow-keyed, to a new position.
|
||||
* The order of the choices is the order they're presented in wherever the field is used,
|
||||
* so it's the choices form value itself that gets reordered.
|
||||
*/
|
||||
const DraggableChoiceTag = ({ label, value, closable, onClose, form }: DraggableChoiceTagProps) => {
|
||||
const t = useTranslate();
|
||||
const ref = useRef<HTMLSpanElement>(null);
|
||||
|
||||
// Choices are unique, so a choice's own value identifies its position.
|
||||
const moveChoice = (choice: string, before: string) => {
|
||||
const choices: string[] = [...(form.getFieldValue("choices") || [])];
|
||||
const from = choices.indexOf(choice);
|
||||
const to = choices.indexOf(before);
|
||||
if (from === -1 || to === -1 || from === to) {
|
||||
return;
|
||||
}
|
||||
choices.splice(from, 1);
|
||||
choices.splice(to, 0, choice);
|
||||
form.setFieldValue("choices", choices);
|
||||
};
|
||||
|
||||
const moveChoiceBy = (offset: number) => {
|
||||
const choices: string[] = form.getFieldValue("choices") || [];
|
||||
const to = choices.indexOf(value) + offset;
|
||||
if (to < 0 || to >= choices.length) {
|
||||
return;
|
||||
}
|
||||
moveChoice(value, choices[to]);
|
||||
};
|
||||
|
||||
const [{ isDragging }, drag] = useDrag<ChoiceDragItem, void, { isDragging: boolean }>({
|
||||
type: CHOICE_DRAG_TYPE,
|
||||
item: { choice: value },
|
||||
collect: (monitor) => ({ isDragging: monitor.isDragging() }),
|
||||
});
|
||||
|
||||
const [, drop] = useDrop<ChoiceDragItem>({
|
||||
accept: CHOICE_DRAG_TYPE,
|
||||
hover: (item) => moveChoice(item.choice, value),
|
||||
});
|
||||
|
||||
drag(drop(ref));
|
||||
|
||||
return (
|
||||
<span
|
||||
ref={ref}
|
||||
// rc-select wraps every custom tag in a span that preventDefaults mousedown,
|
||||
// which stops the browser from ever starting a drag. Keep the event away from it.
|
||||
onMouseDown={(e) => e.stopPropagation()}
|
||||
style={{ display: "inline-flex", opacity: isDragging ? 0.4 : 1 }}
|
||||
>
|
||||
<Tag
|
||||
closable={closable}
|
||||
onClose={onClose}
|
||||
tabIndex={0}
|
||||
title={t("settings.extra_fields.choices_reorder_hint")}
|
||||
onKeyDown={(e) => {
|
||||
if (e.key === "ArrowLeft" || e.key === "ArrowRight") {
|
||||
e.preventDefault();
|
||||
moveChoiceBy(e.key === "ArrowLeft" ? -1 : 1);
|
||||
}
|
||||
}}
|
||||
style={{ marginInlineEnd: 4, cursor: "grab", userSelect: "none" }}
|
||||
>
|
||||
<HolderOutlined style={{ marginInlineEnd: 4 }} />
|
||||
{label}
|
||||
</Tag>
|
||||
</span>
|
||||
);
|
||||
};
|
||||
|
||||
const EditableCell = ({ record, editing, dataIndex, children, form, ...restProps }: EditableCellProps) => {
|
||||
const t = useTranslate();
|
||||
|
||||
@@ -221,7 +310,22 @@ const EditableCell = ({ record, editing, dataIndex, children, form, ...restProps
|
||||
}
|
||||
} else if (dataIndex === "choices") {
|
||||
if (fieldType === FieldType.choice) {
|
||||
inputNode = <Select mode="tags" tokenSeparators={[","]} open={false} />;
|
||||
inputNode = (
|
||||
<Select
|
||||
mode="tags"
|
||||
tokenSeparators={[","]}
|
||||
open={false}
|
||||
tagRender={(props) => (
|
||||
<DraggableChoiceTag
|
||||
label={props.label}
|
||||
value={props.value}
|
||||
closable={props.closable}
|
||||
onClose={props.onClose}
|
||||
form={form}
|
||||
/>
|
||||
)}
|
||||
/>
|
||||
);
|
||||
rules.push({
|
||||
required: true,
|
||||
min: 1,
|
||||
@@ -608,18 +712,20 @@ export function ExtraFieldsSettings() {
|
||||
}}
|
||||
/>
|
||||
<Form form={form} component={false} disabled={isSubmitting}>
|
||||
<Table
|
||||
components={{
|
||||
body: {
|
||||
cell: EditableCell,
|
||||
},
|
||||
}}
|
||||
columns={mergedColumns}
|
||||
dataSource={tableFields}
|
||||
loading={fields.isLoading}
|
||||
rowClassName="editable-row"
|
||||
pagination={false}
|
||||
/>
|
||||
<DndProvider backend={HTML5Backend}>
|
||||
<Table
|
||||
components={{
|
||||
body: {
|
||||
cell: EditableCell,
|
||||
},
|
||||
}}
|
||||
columns={mergedColumns}
|
||||
dataSource={tableFields}
|
||||
loading={fields.isLoading}
|
||||
rowClassName="editable-row"
|
||||
pagination={false}
|
||||
/>
|
||||
</DndProvider>
|
||||
</Form>
|
||||
{newField == null && (
|
||||
<Flex justify="center">
|
||||
|
||||
@@ -9,6 +9,7 @@ import { useEffect, useMemo, useState } from "react";
|
||||
import { ExtraFieldFormItem, ParsedExtras, StringifiedExtras } from "../../components/extraFields";
|
||||
import { useSpoolmanLocations } from "../../components/otherModels";
|
||||
import { searchMatches } from "../../utils/filtering";
|
||||
import { useLocations } from "../locations/functions";
|
||||
import "../../utils/overrides.css";
|
||||
import { formatNumberOnUserInput, numberParser, numberParserAllowEmpty } from "../../utils/parsing";
|
||||
import { EntityType, useGetFields } from "../../utils/queryFields";
|
||||
@@ -165,9 +166,15 @@ export const SpoolCreate = (props: IResourceComponentsProps & CreateOrCloneProps
|
||||
};
|
||||
|
||||
const locations = useSpoolmanLocations(true);
|
||||
const settingsLocation = useLocations();
|
||||
const [newLocation, setNewLocation] = useState("");
|
||||
|
||||
const allLocations = [...(locations.data || [])];
|
||||
const allLocations = [...(settingsLocation || [])];
|
||||
locations?.data?.forEach((loc) => {
|
||||
if (!allLocations.includes(loc)) {
|
||||
allLocations.push(loc);
|
||||
}
|
||||
});
|
||||
if (newLocation.trim() && !allLocations.includes(newLocation)) {
|
||||
allLocations.push(newLocation.trim());
|
||||
}
|
||||
|
||||
@@ -128,6 +128,7 @@ export function useGetFilamentSelectOptions() {
|
||||
const t = useTranslate();
|
||||
const { query: internalFilaments } = useSelect<IFilament>({
|
||||
resource: "filament",
|
||||
pagination: { mode: "off" },
|
||||
});
|
||||
const externalFilaments = useGetExternalDBFilaments();
|
||||
|
||||
|
||||
@@ -57,7 +57,10 @@ function collapseSpool(element: ISpool): ISpoolCollapsed {
|
||||
} else {
|
||||
filament_name = element.filament.name ?? element.filament.id.toString();
|
||||
}
|
||||
if (element.price === undefined) {
|
||||
// The REST list omits `price` when unset (response_model_exclude_none), but websocket
|
||||
// live updates send it as `null`. Fall back to the filament price for both cases,
|
||||
// otherwise a live update (e.g. after a weight adjust) blanks the price column until reload.
|
||||
if (element.price === undefined || element.price === null) {
|
||||
element.price = element.filament.price;
|
||||
}
|
||||
return {
|
||||
@@ -381,7 +384,7 @@ export const SpoolList = () => {
|
||||
align: "right",
|
||||
width: 80,
|
||||
render: (_, obj: ISpoolCollapsed) => {
|
||||
if (obj.price === undefined) {
|
||||
if (obj.price === undefined || obj.price === null) {
|
||||
return "";
|
||||
}
|
||||
return currencyFormatter.format(obj.price);
|
||||
|
||||
Vendored
+5
-1
@@ -15,13 +15,17 @@ We also need to stringify them again before sending them back to the API, which
|
||||
the form's onFinish method. Form.Item's normalize should do this, but it doesn't seem to work.
|
||||
*/
|
||||
|
||||
// What the form submits: extra values back as JSON strings, with null for a field left
|
||||
// empty — the API merges extra per key, so null is what clears a value.
|
||||
type IVendorRequest = Omit<IVendor, "extra"> & { extra?: { [key: string]: string | null } };
|
||||
|
||||
export const VendorEdit = () => {
|
||||
const t = useTranslate();
|
||||
const [messageApi, contextHolder] = message.useMessage();
|
||||
const [hasChanged, setHasChanged] = useState(false);
|
||||
const extraFields = useGetFields(EntityType.vendor);
|
||||
|
||||
const { formProps, saveButtonProps } = useForm<IVendor, HttpError, IVendor, IVendor>({
|
||||
const { formProps, saveButtonProps } = useForm<IVendor, HttpError, IVendorRequest, IVendor>({
|
||||
liveMode: "manual",
|
||||
onLiveEvent() {
|
||||
// Warn the user if the vendor has been updated since the form was opened
|
||||
|
||||
@@ -1,7 +1,8 @@
|
||||
import { CrudFilter, CrudOperators } from "@refinedev/core";
|
||||
import { Field, FieldType, getCustomFieldKey, isCustomField } from "./queryFields";
|
||||
|
||||
interface TypedCrudFilter<Obj> {
|
||||
field: keyof Obj;
|
||||
field: keyof Obj | string;
|
||||
operator: Exclude<CrudOperators, "or" | "and">;
|
||||
value: string[];
|
||||
}
|
||||
@@ -16,10 +17,7 @@ export function typeFilters<Obj>(filters: CrudFilter[]): TypedCrudFilter<Obj>[]
|
||||
* @param field The field to get the filter values for.
|
||||
* @returns An array of filter values for the given field.
|
||||
*/
|
||||
export function getFiltersForField<Obj, Field extends keyof Obj>(
|
||||
filters: TypedCrudFilter<Obj>[],
|
||||
field: Field,
|
||||
): string[] {
|
||||
export function getFiltersForField<Obj>(filters: TypedCrudFilter<Obj>[], field: Field | string): string[] {
|
||||
const filterValues: string[] = [];
|
||||
filters.forEach((filter) => {
|
||||
if (filter.field === field) {
|
||||
@@ -29,6 +27,89 @@ export function getFiltersForField<Obj, Field extends keyof Obj>(
|
||||
return filterValues;
|
||||
}
|
||||
|
||||
/**
|
||||
* Creates a filter value for a custom field based on its type
|
||||
* @param field The custom field definition
|
||||
* @param value The value to filter by
|
||||
* @returns The formatted filter value
|
||||
*/
|
||||
type CustomFieldFilterValue =
|
||||
| string
|
||||
| number
|
||||
| boolean
|
||||
| Date
|
||||
| [number | null | undefined, number | null | undefined]
|
||||
| null
|
||||
| undefined;
|
||||
|
||||
export function formatCustomFieldFilterValue(field: Field, value: CustomFieldFilterValue): string {
|
||||
switch (field.field_type) {
|
||||
case FieldType.text:
|
||||
case FieldType.choice:
|
||||
// For text and choice fields, we can use the value directly
|
||||
// If it's an exact match, surround with quotes
|
||||
if (typeof value === "string" && !value.startsWith('"') && !value.endsWith('"')) {
|
||||
// Check if we need an exact match (no wildcards)
|
||||
if (!value.includes("*") && !value.includes("?")) {
|
||||
return `"${value}"`;
|
||||
}
|
||||
}
|
||||
return value == null ? "" : String(value);
|
||||
|
||||
case FieldType.integer:
|
||||
case FieldType.float:
|
||||
// For numeric fields, we can use the value directly
|
||||
return value == null ? "" : value.toString();
|
||||
|
||||
case FieldType.boolean:
|
||||
// For boolean fields, convert to "true" or "false"
|
||||
return value ? "true" : "false";
|
||||
|
||||
case FieldType.datetime:
|
||||
// For datetime fields, format as ISO string
|
||||
if (value instanceof Date) {
|
||||
return value.toISOString();
|
||||
}
|
||||
return value == null ? "" : String(value);
|
||||
|
||||
case FieldType.integer_range:
|
||||
case FieldType.float_range:
|
||||
// For range fields, format as min:max
|
||||
if (Array.isArray(value) && value.length === 2) {
|
||||
return `${value[0] ?? ""}:${value[1] ?? ""}`;
|
||||
}
|
||||
return value == null ? "" : String(value);
|
||||
|
||||
default:
|
||||
return value == null ? "" : String(value);
|
||||
}
|
||||
}
|
||||
|
||||
/**
|
||||
* Extracts all custom field filters from a list of filters
|
||||
* @param filters The list of filters
|
||||
* @returns An object with custom field keys and their filter values
|
||||
*/
|
||||
export function getCustomFieldFilters<Obj = unknown>(
|
||||
filters: CrudFilter[] | TypedCrudFilter<Obj>[],
|
||||
): Record<string, string[]> {
|
||||
const customFieldFilters: Record<string, string[]> = {};
|
||||
|
||||
filters.forEach((filter) => {
|
||||
if (!("field" in filter)) {
|
||||
return; // Skip non-field filters
|
||||
}
|
||||
|
||||
const field = filter.field.toString();
|
||||
if (isCustomField(field)) {
|
||||
const key = getCustomFieldKey(field);
|
||||
customFieldFilters[key] = filter.value as string[];
|
||||
}
|
||||
});
|
||||
|
||||
return customFieldFilters;
|
||||
}
|
||||
|
||||
/**
|
||||
* Function that returns an array with all undefined values removed.
|
||||
*/
|
||||
|
||||
@@ -110,6 +110,24 @@ export function useSetField(entity_type: EntityType) {
|
||||
});
|
||||
}
|
||||
|
||||
/**
|
||||
* Checks if a field is a custom field (starts with "extra.")
|
||||
* @param field The field to check
|
||||
* @returns True if the field is a custom field
|
||||
*/
|
||||
export function isCustomField(field: string): boolean {
|
||||
return field.startsWith("extra.");
|
||||
}
|
||||
|
||||
/**
|
||||
* Extracts the key from a custom field (removes the "extra." prefix)
|
||||
* @param field The custom field
|
||||
* @returns The key of the custom field
|
||||
*/
|
||||
export function getCustomFieldKey(field: string): string {
|
||||
return field.substring(6); // Remove "extra." prefix
|
||||
}
|
||||
|
||||
export function useDeleteField(entity_type: EntityType) {
|
||||
const queryClient = useQueryClient();
|
||||
|
||||
|
||||
@@ -2,7 +2,11 @@ import { useGetSetting } from "./querySettings";
|
||||
|
||||
export function useCurrency() {
|
||||
const { data: currency } = useGetSetting("currency");
|
||||
return JSON.parse(currency?.value ?? '"EUR"');
|
||||
try {
|
||||
return JSON.parse(currency?.value ?? '"EUR"');
|
||||
} catch {
|
||||
return "EUR";
|
||||
}
|
||||
}
|
||||
|
||||
export function getCurrencySymbol(locale: string | undefined, currency: string) {
|
||||
@@ -20,7 +24,12 @@ export function getCurrencySymbol(locale: string | undefined, currency: string)
|
||||
|
||||
export function useCurrencyFormatter() {
|
||||
const currency = useCurrency();
|
||||
const roundPrices = JSON.parse(useGetSetting("round_prices").data?.value ?? "false");
|
||||
let roundPrices = false;
|
||||
try {
|
||||
roundPrices = JSON.parse(useGetSetting("round_prices").data?.value ?? "false");
|
||||
} catch {
|
||||
roundPrices = false;
|
||||
}
|
||||
|
||||
return new Intl.NumberFormat(undefined, {
|
||||
style: "currency",
|
||||
|
||||
@@ -1,8 +1,9 @@
|
||||
import { CrudSort } from "@refinedev/core";
|
||||
import { SortOrder } from "antd/es/table/interface";
|
||||
import { Field, getCustomFieldKey, isCustomField } from "./queryFields";
|
||||
|
||||
interface TypedCrudSort<Obj> {
|
||||
field: keyof Obj;
|
||||
field: keyof Obj | string;
|
||||
order: "asc" | "desc";
|
||||
}
|
||||
|
||||
@@ -12,10 +13,7 @@ interface TypedCrudSort<Obj> {
|
||||
* @param field The field to get the sort order for.
|
||||
* @returns The sort order for the given field, or undefined if the field is not being sorted.
|
||||
*/
|
||||
export function getSortOrderForField<Obj, Field extends keyof Obj>(
|
||||
sorters: TypedCrudSort<Obj>[],
|
||||
field: Field,
|
||||
): SortOrder | undefined {
|
||||
export function getSortOrderForField<Obj>(sorters: TypedCrudSort<Obj>[], field: Field | string): SortOrder | undefined {
|
||||
const sorter = sorters.find((s) => s.field === field);
|
||||
if (sorter) {
|
||||
return sorter.order === "asc" ? "ascend" : "descend";
|
||||
@@ -26,3 +24,33 @@ export function getSortOrderForField<Obj, Field extends keyof Obj>(
|
||||
export function typeSorters<Obj>(sorters: CrudSort[]): TypedCrudSort<Obj>[] {
|
||||
return sorters as TypedCrudSort<Obj>[]; // <-- Unsafe cast
|
||||
}
|
||||
|
||||
/**
|
||||
* Checks if a sorter is for a custom field
|
||||
* @param sorter The sorter to check
|
||||
* @returns True if the sorter is for a custom field
|
||||
*/
|
||||
export function isCustomFieldSorter<Obj = unknown>(sorter: TypedCrudSort<Obj> | CrudSort): boolean {
|
||||
return typeof sorter.field === "string" && isCustomField(sorter.field);
|
||||
}
|
||||
|
||||
/**
|
||||
* Extracts all custom field sorters from a list of sorters
|
||||
* @param sorters The list of sorters
|
||||
* @returns An object with custom field keys and their sort orders
|
||||
*/
|
||||
export function getCustomFieldSorters<Obj = unknown>(
|
||||
sorters: TypedCrudSort<Obj>[] | CrudSort[],
|
||||
): Record<string, "asc" | "desc"> {
|
||||
const customFieldSorters: Record<string, "asc" | "desc"> = {};
|
||||
|
||||
sorters.forEach((sorter) => {
|
||||
if (isCustomFieldSorter(sorter)) {
|
||||
const field = sorter.field.toString();
|
||||
const key = getCustomFieldKey(field);
|
||||
customFieldSorters[key] = sorter.order;
|
||||
}
|
||||
});
|
||||
|
||||
return customFieldSorters;
|
||||
}
|
||||
@@ -0,0 +1,14 @@
|
||||
node_modules
|
||||
/build
|
||||
/.svelte-kit
|
||||
/package
|
||||
.env
|
||||
.env.*
|
||||
!.env.example
|
||||
vite.config.js.timestamp-*
|
||||
vite.config.ts.timestamp-*
|
||||
|
||||
# Playwright a11y audit output
|
||||
/playwright-report
|
||||
/test-results
|
||||
/a11y-report.md
|
||||
@@ -0,0 +1 @@
|
||||
engine-strict=false
|
||||
@@ -0,0 +1,20 @@
|
||||
# Weblate-managed translation files — do not reformat (mirrors the old client).
|
||||
locales
|
||||
|
||||
# Build output and tooling
|
||||
build
|
||||
.svelte-kit
|
||||
dist
|
||||
node_modules
|
||||
|
||||
# Generated code (paraglide i18n compiler output — also gitignored)
|
||||
src/lib/paraglide
|
||||
|
||||
# Written into the inlang project by the compiler; everything but settings.json
|
||||
# there is gitignored, so compiling before linting must not fail the check.
|
||||
project.inlang/.meta.json
|
||||
project.inlang/README.md
|
||||
project.inlang/cache
|
||||
|
||||
# Local scratch notes (gitignored, never reaches CI — don't fail the local hook)
|
||||
docs
|
||||
@@ -0,0 +1,9 @@
|
||||
{
|
||||
"useTabs": true,
|
||||
"singleQuote": true,
|
||||
"trailingComma": "none",
|
||||
"printWidth": 110,
|
||||
"endOfLine": "auto",
|
||||
"plugins": ["prettier-plugin-svelte"],
|
||||
"overrides": [{ "files": "*.svelte", "options": { "parser": "svelte" } }]
|
||||
}
|
||||
@@ -0,0 +1,174 @@
|
||||
# Spoolman client v2
|
||||
|
||||
A ground-up rewrite of the Spoolman frontend using **Svelte 5 + SvelteKit**,
|
||||
replacing the React / Refine / Ant Design stack in `client/`.
|
||||
|
||||
> Status: **connected to the real Spoolman API.** `src/lib/api/spoolSource.ts`
|
||||
> talks to `/api/v1` over HTTP and `src/lib/api/live.ts` opens the real
|
||||
> WebSocket channels; `src/lib/api/map.ts` maps the API shape to the client's
|
||||
> domain types. Reads (grouped + flat lists, inspector details), writes (spool /
|
||||
> filament / vendor edits, adjust weight, archive, add spools, drag-to-relocate)
|
||||
> and live updates all round-trip against the backend.
|
||||
>
|
||||
> **Dev:** point the client at a running backend with `VITE_APIURL`, e.g.
|
||||
> `VITE_APIURL=http://localhost:8000/api/v1 npm run dev`. In production the
|
||||
> backend serves this SPA same-origin, so `VITE_APIURL` is unset and the base
|
||||
> resolves to `<SPOOLMAN_BASE_PATH>/api/v1`.
|
||||
>
|
||||
> **Settings** (currency / round_prices / external URL) round-trip to
|
||||
> `/api/v1/setting`; the low-stock threshold is a local per-browser preference.
|
||||
> **Extra fields** have full parity with the original frontend: manage
|
||||
> definitions per entity (all 8 types, key/type/multi_choice immutable after
|
||||
> create, append-only choices) in Settings, and edit values inline on each
|
||||
> inspector via type-aware inputs (`ExtraFieldInput`).
|
||||
>
|
||||
> **Add spools** is a single unified flow that creates spool + filament + vendor
|
||||
> as needed. It searches the local catalog and **SpoolmanDB**
|
||||
> (`/api/v1/external/filament`); a picked SpoolmanDB filament is imported (with its
|
||||
> vendor, de-duplicated by `external_id`). "Create a new filament" expands the
|
||||
> same modal inline: a **vendor combobox** reuses an existing vendor or creates a
|
||||
> new one (with a live hint), and picking a **material** auto-fills density/temps
|
||||
> from SpoolmanDB material presets. One submit creates whatever doesn't yet exist.
|
||||
> Imported filaments show a "SpoolmanDB" badge in the inspector.
|
||||
>
|
||||
> **Not yet wired:** library search is a filament-name match (the API has no
|
||||
> combined free-text or color-similarity search); status/diameter filters were
|
||||
> dropped as the API can't express them.
|
||||
|
||||
## Data flow (server does the work)
|
||||
|
||||
Filtering, sorting, searching, **aggregation** and pagination are the server's
|
||||
job — the client never sifts the full dataset. The list **paginates groups**, not
|
||||
spools, so a group is atomic on a page (no splitting) and its header totals are
|
||||
server-accurate. See `docs/backend-api-proposal.md` for the endpoints this
|
||||
assumes.
|
||||
|
||||
```
|
||||
UI state (filters/sort/group/search/page)
|
||||
│
|
||||
grouped mode (group≠none, not a color search):
|
||||
│ buildGroupQuery() api/query.ts
|
||||
▼
|
||||
GroupQuery ── listGroups() ──▶ Page<GroupSummary> api/spoolSource.ts
|
||||
▼ (key, title, counts, total_remaining,
|
||||
FilamentList has_stock, last_used — server aggregates)
|
||||
└─ GroupRow (per group)
|
||||
│ buildScopedSpoolQuery(group, limit) ← lazily loads the
|
||||
▼ group's spools,
|
||||
listSpools() ── Page<Spool> ─▶ rows in-use first, "show more"
|
||||
|
||||
flat mode (group=none OR color search):
|
||||
│ buildFlatSpoolQuery()
|
||||
▼
|
||||
SpoolQuery ── listSpools() ──▶ Page<Spool> ─▶ flat rows (no split problem)
|
||||
|
||||
Pagination ── paginates groups (grouped) or spools (flat)
|
||||
```
|
||||
|
||||
- **Grouped**: `listGroups` returns a page of group summaries; each `GroupRow`
|
||||
fetches its own spools (`filament.id` / `vendor.id` / `location` / material
|
||||
scope). "Sort:" orders both the groups (by aggregate) and the rows within.
|
||||
- **Flat** (`group=none` or a color search): plain spool pagination — no groups
|
||||
to split. Color search orders by similarity.
|
||||
- **Pagination** is classic `limit`/`offset` + `X-Total-Count`. Any query change
|
||||
resets to page 1.
|
||||
|
||||
### Live updates (WebSocket)
|
||||
|
||||
Everything viewed is subscribed to and live-updates. The seam is `api/live.ts`
|
||||
(`LiveConnection.subscribe(resource, {id?}, handler)` — mirrors
|
||||
`ws://…/api/v1/<resource>[/<id>]`):
|
||||
|
||||
- **`inventory`** is a reactive normalized **cache**. `api/liveSync.ts` runs one
|
||||
central subscription per resource and applies remote events to it, so every
|
||||
cache-backed view (inspectors, locations) is live automatically.
|
||||
- The **paginated list** fetches server-paged data _outside_ the cache, so it
|
||||
keeps its **own** subscription and refetches the current page on relevant
|
||||
events.
|
||||
- Local edits patch the cache **and** emit a `local` event (mirroring the server
|
||||
echo). Try it in dev: `__spoolman.bumpId(103, 120)` in the console injects a
|
||||
`remote` update — the inspector and list both update instantly.
|
||||
|
||||
## Design
|
||||
|
||||
The look is ported from the design prototype (`Spoolman Prototype.dc.html` /
|
||||
`Spoolman Mobile.dc.html`): a dark theme, IBM Plex type, warm-orange (`#be682f`)
|
||||
accent, and a dense two-pane **Library** (list + inspector). Design tokens live as
|
||||
CSS custom properties in `src/app.css`.
|
||||
|
||||
### Responsiveness
|
||||
|
||||
- **Desktop** — two panes: the filament/spool list on the left, a live inspector
|
||||
on the right.
|
||||
- **Mobile** — the list becomes full-width and front-and-centre; selecting an item
|
||||
slides the _same_ inspector up as a bottom-sheet **Drawer**
|
||||
(`src/lib/components/Drawer.svelte`). The top-bar search/nav reflow onto their
|
||||
own rows and the "Add spools" button becomes a FAB.
|
||||
|
||||
The breakpoint is `860px`.
|
||||
|
||||
## Structure
|
||||
|
||||
```
|
||||
src/
|
||||
app.css design tokens + resets
|
||||
routes/
|
||||
+layout.svelte top bar + add-spools modal shell
|
||||
+page.svelte Library (list + inspector / drawer)
|
||||
locations/+page.svelte drag-and-drop shelf grid
|
||||
settings/+page.svelte server-settings style sections
|
||||
lib/
|
||||
types.ts domain types
|
||||
api/
|
||||
config.ts API base + WebSocket URL resolution (VITE_APIURL)
|
||||
http.ts fetch wrappers (list + X-Total-Count, GET/PATCH/POST)
|
||||
map.ts API JSON ↔ domain types (colors, rel-time, patches)
|
||||
types.ts GroupQuery/SpoolQuery/Page/SpoolDataSource contract
|
||||
query.ts UI state → queries (sort/group field maps)
|
||||
spoolSource.ts HTTP client: /spool/group, /spool (+ scoping),
|
||||
writes, filter-option lists; populates the cache
|
||||
live.ts real WebSockets to /api/v1/{spool,filament,vendor}
|
||||
liveSync.ts central live events → cache
|
||||
stores/ inventory (reactive cache), settings, ui (runes)
|
||||
utils/ color, format, saver (debounced writes), library
|
||||
components/ Swatch, ProgressBar, Button, Toggle, TopBar,
|
||||
Pagination, library/* (GroupRow, …), Drawer, …
|
||||
docs/
|
||||
backend-api-proposal.md the grouped/aggregated endpoint (implemented)
|
||||
```
|
||||
|
||||
### How the backend is wired
|
||||
|
||||
- **Reads** — `api/spoolSource.ts` hits `GET /api/v1/spool/group` (grouped) and
|
||||
`GET /api/v1/spool` (flat / group-scoped), both `limit`/`offset` +
|
||||
`X-Total-Count`. Filter option lists come from `/material`, `/location`,
|
||||
`/lot-number`, `/vendor`. Every fetched entity is upserted into the cache.
|
||||
- **Writes** — inline edits PATCH `/spool|/filament|/vendor/{id}` (debounced,
|
||||
optimistic); adjust-weight and archive PATCH the spool; Add-spools POSTs
|
||||
`/spool`; drag-to-relocate PATCHes `location`.
|
||||
- **Live** — `api/live.ts` opens one WebSocket per resource; `liveSync` applies
|
||||
events to the cache, so cache-backed views update instantly and the paginated
|
||||
list refetches. `api/map.ts` maps every payload to domain types.
|
||||
|
||||
## Develop
|
||||
|
||||
```bash
|
||||
npm install
|
||||
npm run dev # http://localhost:5174
|
||||
npm run check # svelte-check (type gate)
|
||||
npm run build # static SPA build (adapter-static, index.html fallback)
|
||||
```
|
||||
|
||||
### Mobile accessibility audit
|
||||
|
||||
```bash
|
||||
npm run audit:a11y # Playwright + axe-core under Pixel 5 emulation
|
||||
npm run audit:a11y:report # open the last HTML report
|
||||
```
|
||||
|
||||
Runs [axe-core](https://github.com/dequelabs/axe-core) (WCAG 2.0/2.1 A+AA plus the
|
||||
2.2 `target-size` rule) and a custom tap-target measurement across the main
|
||||
surfaces (library, locations, labels, settings, add-spool modal, inspector
|
||||
drawer). Reuses a `vite dev` already on 5174, or starts one. Human-readable
|
||||
results land in `a11y-report.md`; the tap-target advisory minimum is 44px (Apple
|
||||
HIG / Material), stricter than the WCAG 24px floor. See `e2e/a11y-mobile.spec.ts`.
|
||||
@@ -0,0 +1,190 @@
|
||||
import { test, expect, type Page, type TestInfo } from '@playwright/test';
|
||||
import AxeBuilder from '@axe-core/playwright';
|
||||
import { writeFile } from 'node:fs/promises';
|
||||
import path from 'node:path';
|
||||
import { SURFACES_DIR, TAP_MIN, type SurfaceResult, type TapTarget } from './report';
|
||||
|
||||
// Mobile-accessibility audit for client_v2.
|
||||
//
|
||||
// Two independent checks run against every surface, under a Pixel 5 mobile
|
||||
// emulation (see playwright.config.ts):
|
||||
//
|
||||
// 1. axe-core — the full WCAG 2.0/2.1 A + AA ruleset PLUS the WCAG 2.2
|
||||
// `target-size` rule (SC 2.5.8, 24x24 CSS px minimum). Real conformance
|
||||
// failures.
|
||||
//
|
||||
// 2. A custom tap-target measurement — flags interactive controls smaller
|
||||
// than TAP_MIN px in either dimension. An *advisory* thumb-comfort check
|
||||
// (Apple HIG 44px / Material 48px), stricter than the WCAG minimum and
|
||||
// catching targets axe considers technically compliant.
|
||||
//
|
||||
// Each surface's findings are written to SURFACES_DIR as JSON; the consolidated
|
||||
// `a11y-report.md` is rendered by globalTeardown (which survives worker
|
||||
// restarts). Raw findings are also attached to the Playwright HTML report.
|
||||
|
||||
let surfaceCount = 0;
|
||||
|
||||
// Let the DOM and any async lists settle. The app holds an open live-sync
|
||||
// WebSocket, so `networkidle` never fires — we bound it and fall through.
|
||||
async function settle(page: Page, ms = 500) {
|
||||
await page.waitForLoadState('domcontentloaded').catch(() => {});
|
||||
await page.waitForLoadState('networkidle', { timeout: 2500 }).catch(() => {});
|
||||
await page.waitForTimeout(ms);
|
||||
}
|
||||
|
||||
// Measure every interactive control in the live DOM and return those smaller
|
||||
// than `min` px in either dimension. Runs in the browser.
|
||||
function collectSmallTargets(min: number): TapTarget[] {
|
||||
const SELECTOR = [
|
||||
'a[href]',
|
||||
'button',
|
||||
'input:not([type="hidden"])',
|
||||
'select',
|
||||
'textarea',
|
||||
'summary',
|
||||
'[role="button"]',
|
||||
'[role="link"]',
|
||||
'[role="checkbox"]',
|
||||
'[role="radio"]',
|
||||
'[role="switch"]',
|
||||
'[role="tab"]',
|
||||
'[role="menuitem"]',
|
||||
'[tabindex]:not([tabindex="-1"])'
|
||||
].join(',');
|
||||
|
||||
const out: TapTarget[] = [];
|
||||
const seen = new Set<Element>();
|
||||
|
||||
for (const el of Array.from(document.querySelectorAll(SELECTOR))) {
|
||||
if (seen.has(el)) continue;
|
||||
seen.add(el);
|
||||
|
||||
const style = getComputedStyle(el);
|
||||
if (style.display === 'none' || style.visibility === 'hidden' || style.opacity === '0') continue;
|
||||
if ((el as HTMLButtonElement).disabled) continue;
|
||||
|
||||
// WCAG exempts targets rendered inline within a run of text (e.g. a link
|
||||
// inside a sentence). Skip inline <a> elements to avoid false positives.
|
||||
if (el.tagName === 'A' && style.display.startsWith('inline')) continue;
|
||||
|
||||
const rect = el.getBoundingClientRect();
|
||||
if (rect.width === 0 || rect.height === 0) continue; // not rendered
|
||||
if (rect.width >= min && rect.height >= min) continue;
|
||||
|
||||
const id = el.id ? `#${el.id}` : '';
|
||||
const rawCls = (el as HTMLElement).className;
|
||||
const cls =
|
||||
typeof rawCls === 'string' && rawCls.trim()
|
||||
? '.' + rawCls.trim().split(/\s+/).slice(0, 2).join('.')
|
||||
: '';
|
||||
const aria = el.getAttribute('aria-label');
|
||||
|
||||
out.push({
|
||||
tag: el.tagName.toLowerCase(),
|
||||
text: (aria || el.textContent || '').trim().replace(/\s+/g, ' ').slice(0, 40),
|
||||
selector: `${el.tagName.toLowerCase()}${id}${cls}`,
|
||||
width: Math.round(rect.width),
|
||||
height: Math.round(rect.height)
|
||||
});
|
||||
}
|
||||
return out;
|
||||
}
|
||||
|
||||
// Run both checks against whatever is currently rendered and record the result.
|
||||
async function audit(page: Page, testInfo: TestInfo, label: string) {
|
||||
await settle(page);
|
||||
|
||||
const axeResults = await new AxeBuilder({ page })
|
||||
.withTags(['wcag2a', 'wcag2aa', 'wcag21a', 'wcag21aa', 'wcag22aa'])
|
||||
.analyze();
|
||||
|
||||
const smallTargets = await page.evaluate(collectSmallTargets, TAP_MIN);
|
||||
|
||||
const surface: SurfaceResult = {
|
||||
order: surfaceCount++,
|
||||
label,
|
||||
url: page.url(),
|
||||
axe: axeResults.violations.map((v) => ({
|
||||
id: v.id,
|
||||
impact: v.impact,
|
||||
help: v.help,
|
||||
nodes: v.nodes.length,
|
||||
targets: v.nodes.slice(0, 5).map((n) => n.target.join(' '))
|
||||
})),
|
||||
smallTargets
|
||||
};
|
||||
|
||||
const file = path.join(SURFACES_DIR, `${label.replace(/[^a-z0-9]+/gi, '-')}.json`);
|
||||
await writeFile(file, JSON.stringify(surface, null, 2), 'utf8');
|
||||
|
||||
await testInfo.attach(`${label} — axe violations`, {
|
||||
body: JSON.stringify(axeResults.violations, null, 2),
|
||||
contentType: 'application/json'
|
||||
});
|
||||
await testInfo.attach(`${label} — small tap targets`, {
|
||||
body: JSON.stringify(smallTargets, null, 2),
|
||||
contentType: 'application/json'
|
||||
});
|
||||
|
||||
// Soft assertions: the run completes and reports every surface, but the test
|
||||
// is still marked failed if anything is out of spec — useful as a CI gate.
|
||||
const serious = surface.axe.filter((v) => v.impact === 'serious' || v.impact === 'critical');
|
||||
expect.soft(serious, `${label}: serious/critical axe violations`).toEqual([]);
|
||||
expect.soft(smallTargets, `${label}: tap targets under ${TAP_MIN}px`).toEqual([]);
|
||||
}
|
||||
|
||||
const STATIC_ROUTES: { path: string; label: string }[] = [
|
||||
{ path: '/', label: 'library (home)' },
|
||||
{ path: '/dashboard', label: 'dashboard' },
|
||||
{ path: '/labels', label: 'labels' },
|
||||
{ path: '/settings', label: 'settings' }
|
||||
];
|
||||
|
||||
for (const route of STATIC_ROUTES) {
|
||||
test(`a11y: ${route.label}`, async ({ page }, testInfo) => {
|
||||
await page.goto(route.path);
|
||||
await audit(page, testInfo, route.label);
|
||||
});
|
||||
}
|
||||
|
||||
test('a11y: add-spool modal', async ({ page }, testInfo) => {
|
||||
await page.goto('/');
|
||||
await settle(page);
|
||||
// The mobile TopBar exposes the add control via aria-label "Add spools".
|
||||
const addBtn = page.getByRole('button', { name: /add spool/i }).first();
|
||||
if ((await addBtn.count()) === 0) test.skip(true, 'no add button found');
|
||||
await addBtn.click();
|
||||
await audit(page, testInfo, 'add-spool modal');
|
||||
});
|
||||
|
||||
test('a11y: inspector drawer (mobile bottom sheet)', async ({ page }, testInfo) => {
|
||||
await page.goto('/');
|
||||
await settle(page, 800);
|
||||
// Select the first library row to open the mobile drawer.
|
||||
const firstItem = page.locator('.list-pane a[href], .list-pane [role="button"]').first();
|
||||
if ((await firstItem.count()) === 0) test.skip(true, 'no list items to select');
|
||||
await firstItem.click({ timeout: 5000 }).catch(() => {});
|
||||
await audit(page, testInfo, 'inspector drawer');
|
||||
});
|
||||
|
||||
test('a11y: detail pages (filament / spool)', async ({ page }, testInfo) => {
|
||||
await page.goto('/');
|
||||
await settle(page, 800);
|
||||
|
||||
// Discover a real detail URL from the live DOM rather than hardcoding an id.
|
||||
const hrefs = await page.$$eval('a[href]', (els) =>
|
||||
els.map((e) => (e as HTMLAnchorElement).getAttribute('href') || '')
|
||||
);
|
||||
const filament = hrefs.find((h) => /\/filament\/show\/\d/.test(h));
|
||||
const spool = hrefs.find((h) => /\/spool\/show\/\d/.test(h));
|
||||
|
||||
if (filament) {
|
||||
await page.goto(filament);
|
||||
await audit(page, testInfo, 'filament detail');
|
||||
}
|
||||
if (spool) {
|
||||
await page.goto(spool);
|
||||
await audit(page, testInfo, 'spool detail');
|
||||
}
|
||||
if (!filament && !spool) test.skip(true, 'no detail links found in library');
|
||||
});
|
||||
@@ -0,0 +1,10 @@
|
||||
import { rm, mkdir } from 'node:fs/promises';
|
||||
import { SURFACES_DIR, REPORT_PATH } from './report';
|
||||
|
||||
// Runs once before the suite: clear any per-surface results and the report from
|
||||
// a previous run so the new report reflects only this run.
|
||||
export default async function globalSetup() {
|
||||
await rm(SURFACES_DIR, { recursive: true, force: true });
|
||||
await rm(REPORT_PATH, { force: true });
|
||||
await mkdir(SURFACES_DIR, { recursive: true });
|
||||
}
|
||||
@@ -0,0 +1,83 @@
|
||||
import { readdir, readFile, writeFile } from 'node:fs/promises';
|
||||
import path from 'node:path';
|
||||
import { SURFACES_DIR, REPORT_PATH, TAP_MIN, type SurfaceResult } from './report';
|
||||
|
||||
// Runs once after the suite (in the main process, so it survives worker
|
||||
// restarts): read every per-surface JSON and render the consolidated report.
|
||||
export default async function globalTeardown() {
|
||||
let files: string[];
|
||||
try {
|
||||
files = (await readdir(SURFACES_DIR)).filter((f) => f.endsWith('.json'));
|
||||
} catch {
|
||||
return;
|
||||
}
|
||||
|
||||
const results: SurfaceResult[] = [];
|
||||
for (const f of files) {
|
||||
try {
|
||||
results.push(JSON.parse(await readFile(path.join(SURFACES_DIR, f), 'utf8')));
|
||||
} catch {
|
||||
/* ignore malformed */
|
||||
}
|
||||
}
|
||||
results.sort((a, b) => a.order - b.order);
|
||||
|
||||
// Escape backslash and pipe in one pass (escaping them separately would let a
|
||||
// trailing backslash re-escape its own escape and leak the pipe through), and
|
||||
// flatten newlines since they'd break the table row regardless.
|
||||
const esc = (s: string) => s.replace(/[\\|]/g, '\\$&').replace(/\s*[\r\n]+\s*/g, ' ');
|
||||
const lines: string[] = [];
|
||||
lines.push('# Mobile accessibility audit — client_v2');
|
||||
lines.push('');
|
||||
lines.push(`Device profile: **Pixel 5** (393×851 CSS px, touch). Generated ${new Date().toISOString()}.`);
|
||||
lines.push('');
|
||||
lines.push(
|
||||
`Advisory tap-target minimum: **${TAP_MIN}px**. WCAG 2.2 target-size (24px) failures appear under axe.`
|
||||
);
|
||||
lines.push('');
|
||||
|
||||
const totalAxe = results.reduce((n, s) => n + s.axe.reduce((m, v) => m + v.nodes, 0), 0);
|
||||
const totalSmall = results.reduce((n, s) => n + s.smallTargets.length, 0);
|
||||
lines.push('## Summary');
|
||||
lines.push('');
|
||||
lines.push(`- Surfaces audited: **${results.length}**`);
|
||||
lines.push(`- Total axe violation instances: **${totalAxe}**`);
|
||||
lines.push(`- Total tap targets under ${TAP_MIN}px: **${totalSmall}**`);
|
||||
lines.push('');
|
||||
|
||||
for (const s of results) {
|
||||
lines.push(`## ${s.label}`);
|
||||
lines.push(`\`${s.url}\``);
|
||||
lines.push('');
|
||||
if (s.axe.length === 0) {
|
||||
lines.push('**axe:** no violations ✅');
|
||||
} else {
|
||||
lines.push('**axe violations:**');
|
||||
lines.push('');
|
||||
lines.push('| Rule | Impact | Instances | Example target |');
|
||||
lines.push('| --- | --- | --- | --- |');
|
||||
for (const v of s.axe) {
|
||||
lines.push(
|
||||
`| ${v.id} — ${esc(v.help)} | ${v.impact ?? '?'} | ${v.nodes} | \`${esc((v.targets[0] ?? '').slice(0, 50))}\` |`
|
||||
);
|
||||
}
|
||||
}
|
||||
lines.push('');
|
||||
if (s.smallTargets.length === 0) {
|
||||
lines.push(`**Tap targets:** all ≥ ${TAP_MIN}px ✅`);
|
||||
} else {
|
||||
lines.push(`**Tap targets under ${TAP_MIN}px (${s.smallTargets.length}):**`);
|
||||
lines.push('');
|
||||
lines.push('| Element | Size (w×h) | Text/label |');
|
||||
lines.push('| --- | --- | --- |');
|
||||
for (const t of s.smallTargets.slice(0, 30)) {
|
||||
lines.push(`| \`${esc(t.selector.slice(0, 40))}\` | ${t.width}×${t.height} | ${esc(t.text)} |`);
|
||||
}
|
||||
if (s.smallTargets.length > 30) lines.push(`| … | | +${s.smallTargets.length - 30} more |`);
|
||||
}
|
||||
lines.push('');
|
||||
}
|
||||
|
||||
await writeFile(REPORT_PATH, lines.join('\n'), 'utf8');
|
||||
console.log(`\nWrote ${path.relative(process.cwd(), REPORT_PATH)} (${results.length} surfaces)`);
|
||||
}
|
||||
@@ -0,0 +1,35 @@
|
||||
// Shared types and paths for the mobile-a11y audit's file-based result
|
||||
// aggregation. Each test writes one JSON file per audited surface into
|
||||
// SURFACES_DIR; globalTeardown reads them all and renders a11y-report.md.
|
||||
//
|
||||
// We go through disk rather than module-level state because Playwright may
|
||||
// recycle the worker process between failing tests, which would wipe any
|
||||
// in-memory accumulator before the final report is written.
|
||||
import path from 'node:path';
|
||||
|
||||
export const TAP_MIN = 44;
|
||||
|
||||
export const SURFACES_DIR = path.resolve('test-results', 'a11y-surfaces');
|
||||
export const REPORT_PATH = path.resolve('a11y-report.md');
|
||||
|
||||
export interface TapTarget {
|
||||
tag: string;
|
||||
text: string;
|
||||
selector: string;
|
||||
width: number;
|
||||
height: number;
|
||||
}
|
||||
|
||||
export interface SurfaceResult {
|
||||
order: number;
|
||||
label: string;
|
||||
url: string;
|
||||
axe: {
|
||||
id: string;
|
||||
impact: string | null | undefined;
|
||||
help: string;
|
||||
nodes: number;
|
||||
targets: string[];
|
||||
}[];
|
||||
smallTargets: TapTarget[];
|
||||
}
|
||||
@@ -0,0 +1,58 @@
|
||||
import js from '@eslint/js';
|
||||
import svelte from 'eslint-plugin-svelte';
|
||||
import prettier from 'eslint-config-prettier';
|
||||
import globals from 'globals';
|
||||
import ts from 'typescript-eslint';
|
||||
import svelteConfig from './svelte.config.js';
|
||||
|
||||
export default ts.config(
|
||||
// Generated, tooling-managed, and build-output directories are not linted.
|
||||
{
|
||||
ignores: [
|
||||
'build/',
|
||||
'.svelte-kit/',
|
||||
'dist/',
|
||||
'package/',
|
||||
'src/lib/paraglide/', // auto-generated by inlang paraglide-js
|
||||
'project.inlang/', // inlang-managed
|
||||
'locales/', // Weblate-managed translation files
|
||||
'playwright-report/', // generated a11y-audit report (bundled/minified JS)
|
||||
'test-results/' // generated Playwright artifacts
|
||||
]
|
||||
},
|
||||
js.configs.recommended,
|
||||
...ts.configs.recommended,
|
||||
...svelte.configs.recommended,
|
||||
prettier,
|
||||
...svelte.configs.prettier,
|
||||
{
|
||||
languageOptions: {
|
||||
globals: { ...globals.browser, ...globals.node }
|
||||
},
|
||||
rules: {
|
||||
// Typed as `no-undef`; TypeScript already reports undefined identifiers.
|
||||
'no-undef': 'off'
|
||||
// svelte/no-navigation-without-resolve is left ON: it is the only automated guard
|
||||
// against base-path navigation bugs, and those are invisible to anyone developing
|
||||
// at the root path. It can't see through the helpers in src/lib/library/params.ts
|
||||
// (selectHref/libraryHref/... already call resolve() from $app/paths) nor through
|
||||
// components that take an already-resolved href prop, so the files where that is
|
||||
// the case carry a file-level disable naming the reason. Never "fix" one of those
|
||||
// by wrapping the call site in resolve() — that double-applies the base path.
|
||||
// svelte/prefer-svelte-reactivity is left ON to guard against in-place mutation of
|
||||
// reactive Set/Map. The current hits are all transient computation-local collections
|
||||
// and are silenced with per-line eslint-disable comments at each site.
|
||||
}
|
||||
},
|
||||
{
|
||||
files: ['**/*.svelte', '**/*.svelte.ts', '**/*.svelte.js'],
|
||||
languageOptions: {
|
||||
parserOptions: {
|
||||
projectService: true,
|
||||
extraFileExtensions: ['.svelte'],
|
||||
parser: ts.parser,
|
||||
svelteConfig
|
||||
}
|
||||
}
|
||||
}
|
||||
);
|
||||
@@ -0,0 +1,561 @@
|
||||
{
|
||||
"add.addAndNew": "Přidat & nová",
|
||||
"add.addN_few": "Přidat {{count}} cívky",
|
||||
"add.addN_one": "Přidat {{count}} cívku",
|
||||
"add.addN_other": "Přidat {{count}} cívky",
|
||||
"add.adding": "Přidávám...",
|
||||
"add.advanced": "Podrobné technické údaje",
|
||||
"add.advancedNote": "hustota, průměr, teploty (automaticky vyplněno podle materiálu)",
|
||||
"add.change": "změna",
|
||||
"add.count": "Počet",
|
||||
"add.createNew": "Vytvořit nový filament",
|
||||
"add.createNewSub": "není ve vašem katalogu ani v {{name}}",
|
||||
"add.dbUnavailable": "{{name}} není k dispozici",
|
||||
"add.duplicate": "duplikát",
|
||||
"add.duplicateNote": "Technické parametry, výrobce a cena byly zkopírovány. Zadejte nový název a barvu.",
|
||||
"add.duplicateRename": "Stále má stejný název jako původní – přejmenujte jej, abyste je mohli od sebe odlišit.",
|
||||
"add.duplicateTitle": "Nový filament · kopie „{{name}}“",
|
||||
"add.filamentNamePlaceholder": "např. PolyTerra Matte Sage",
|
||||
"add.fill.full": "Celý",
|
||||
"add.fillLevel": "Úroveň naplnění",
|
||||
"add.importNote": "Tento filament se přidá do vašeho katalogu jakmile přidáte cívky.",
|
||||
"add.inCatalog": "v katalogu",
|
||||
"add.locationHint": "Kde cívku fyzicky uchováváte – na polici, v krabici nebo v tiskárně. Pokud je všechny uchováváte na jednom místě, pole nechte prázdné.",
|
||||
"add.locationPlaceholder": "např. police A, sušička 2, tiskárna 1",
|
||||
"add.manufacturerPlaceholder": "např. Polymaker",
|
||||
"add.nameHint": "Uveďte barvu – právě podle ní se dají vaše filamenty od sebe rozeznat.",
|
||||
"add.newFilament": "nový filament",
|
||||
"add.newFilamentTitle": "Nový filament",
|
||||
"add.noCatalog": "Ve vašem katalogu nejsou žádné filamenty",
|
||||
"add.noManufacturer": "Žádný výrobce",
|
||||
"add.pickColor": "Vyberte barvu",
|
||||
"add.searchPlaceholder": "Prohledejte svůj katalog a {{name}}...",
|
||||
"add.searching": "Hledám...",
|
||||
"add.section.filament": "Filament",
|
||||
"add.section.filamentNote": "Výrobek na cívce – jedna položka na každou barvu.",
|
||||
"add.section.manufacturer": "Výrobce",
|
||||
"add.section.manufacturerNote": "Subjekt, který filament vyrobil. Uvedeno jednou, poté se tento údaj používá pro všechny jejich filamenty.",
|
||||
"add.section.spool": "Cívka",
|
||||
"add.section.spoolNote": "Fyzické cívky, které se přidávají do vašeho inventáře.",
|
||||
"add.section.spoolSharedNote": "Jako výchozí hodnoty nového filamentu se uloží také hmotnost, hmotnost cívky a cena.",
|
||||
"add.spoolWeightPreset.cardboard": "Karton {{weight}} g",
|
||||
"add.spoolWeightPreset.plastic": "Plast {{weight}} g",
|
||||
"add.spoolWeightPresetsLead": "Začněte s typickou cívkou:",
|
||||
"add.step2": "Krok 2 · podrobnosti o cívce",
|
||||
"add.step2New": "Krok 2 · Údaje o filamentu a cívce",
|
||||
"add.summary_few": "{{count}} cívky",
|
||||
"add.summary_one": "{{count}} cívka",
|
||||
"add.summary_other": "{{count}} cívek",
|
||||
"add.typeToSearchAll": "Zadejte text a prohledejte tisíce filamentů",
|
||||
"add.typeToSearchMatches": "Zadejte text pro vyhledávání — žádné výsledky",
|
||||
"add.useExisting": "použít stávající",
|
||||
"add.vendorHint.existing": "S využitím stávajícího výrobce “{{name}}”",
|
||||
"add.vendorHint.new": "Nový výrobce “{{name}}” bude vytvořen",
|
||||
"add.vendorHint.optional": "Volitelné — pokud není uveden výrobce, ponechte pole prázdné",
|
||||
"add.weightPresets": "Běžné rozměry rolí",
|
||||
"add.yourCatalog": "Váš katalog",
|
||||
"buttons.apply": "Použít",
|
||||
"buttons.archive": "Archivovat",
|
||||
"buttons.cancel": "Zrušit",
|
||||
"buttons.clear": "Vymazat",
|
||||
"buttons.close": "Zavřít",
|
||||
"buttons.delete": "Smazat",
|
||||
"buttons.edit": "Upravit",
|
||||
"buttons.filter": "Filtr",
|
||||
"buttons.save": "Uložit",
|
||||
"buttons.showArchived": "Zobrazit archivované",
|
||||
"buttons.showNoSpools": "Zobrazit filamenty bez cívek",
|
||||
"buttons.unArchive": "Zrušit archivaci",
|
||||
"changeFilament.action": "Výměna",
|
||||
"changeFilament.adoptWeight": "Nastavte celkovou hmotnost této cívky na {{full}}",
|
||||
"changeFilament.adoptWeightHelp": "Je zaznamenána jako {{current}}, a to na základě hodnoty, kterou měla předtím. Použitá hmotnost ({{used}}) se v každém případě zachová, takže zůstává hodnota {{remaining}}.",
|
||||
"changeFilament.apply": "Vyměnit filament",
|
||||
"changeFilament.applying": "Probíhá změna...",
|
||||
"changeFilament.current": "aktuální",
|
||||
"changeFilament.done": "Filament vyměněn.",
|
||||
"changeFilament.failed": "Nepodařilo se vyměnit filament.",
|
||||
"changeFilament.importNote": "Tento filament bude přidán do vašeho katalogu, jakmile změnu potvrdíte.",
|
||||
"changeFilament.intro": "Cívka č. {{id}} si zachovává své číslo, umístění, data a historii použití – mění se pouze filament, který obsahuje.",
|
||||
"changeFilament.newTag": "nový",
|
||||
"changeFilament.next": "Změnit na",
|
||||
"changeFilament.now": "V současné době",
|
||||
"changeFilament.pickBelow": "Vyberte si z níže uvedených filamentů",
|
||||
"changeFilament.title": "Vyměnit filament",
|
||||
"changeFilament.useExisting": "Vyberte existující filament",
|
||||
"changeFilament.weightFollows": "Tento filamentnemá žádnou vlastní plnou hmotnost, takže přebírá plnou hmotnost nového filamentu: {{full}}, přičemž po odečtení již spotřebovaného množství {{used}} zbývá {{remaining}}.",
|
||||
"changeVendor.action": "Výměna",
|
||||
"changeVendor.apply": "Změnit výrobce",
|
||||
"changeVendor.applying": "Probíhá změna...",
|
||||
"changeVendor.clearHint": "Uveďte u tohoto filamentu, že nemá výrobce",
|
||||
"changeVendor.create": "Vytvořit “{{name}}”",
|
||||
"changeVendor.createHint": "Zatím mezi vašimi výrobci není – bude přidán",
|
||||
"changeVendor.current": "aktuální",
|
||||
"changeVendor.done": "Změna výrobce.",
|
||||
"changeVendor.emptySpool": "Prázdná cívka {{value}}",
|
||||
"changeVendor.failed": "Nepodařilo se změnit výrobce.",
|
||||
"changeVendor.intro": "“{{name}}” si zachovává své cívky, technické parametry i historii – mění se pouze výrobce, pod jehož jménem je zařazeno.",
|
||||
"changeVendor.next": "Změnit na",
|
||||
"changeVendor.noEmptySpool": "Žádná hmotnost prázdné cívky",
|
||||
"changeVendor.noMatches": "Žádný výrobce neodpovídá",
|
||||
"changeVendor.none": "Zatím žádní výrobci",
|
||||
"changeVendor.noneNote": "Zařazeno do kategorie bez značky",
|
||||
"changeVendor.now": "V současné době",
|
||||
"changeVendor.pickBelow": "Vyberte si níže výrobce",
|
||||
"changeVendor.searchPlaceholder": "Vyhledat nebo zadat název výrobce",
|
||||
"changeVendor.tareFollows": "Tento filament nemá vlastní hmotnost prázdné cívky, takže se přebírá hodnota udávaná výrobcem. Po výměně je to {{value}}, což je hmotnost prázdné cívky při měření.",
|
||||
"changeVendor.tareGone": "Tato filamentová cívka nemá vlastní hmotnost prázdné cívky a přebírá hodnotu {{current}} od výrobce. Po změně není žádná hodnota k převzetí, dokud filamentu žádnou hodnotu nepřidělíte.",
|
||||
"changeVendor.title": "Změnit výrobce",
|
||||
"changeVendor.willBeCreated": "Bude vytvořeno",
|
||||
"common.decrement": "Snížení",
|
||||
"common.increment": "Zvýšení",
|
||||
"common.remove": "Odstranit",
|
||||
"common.search": "Hledat",
|
||||
"dashboard.addFieldHint": "V nastaveních přidejte do cívek textové nebo výběrové pole, abyste mohli seskupovat i podle něj",
|
||||
"dashboard.dashboard": "Přehledová obrazovka",
|
||||
"dashboard.deleteGroup": "Odstranit skupinu",
|
||||
"dashboard.dragHint": "Přetáhněte cívku na jinou kartu, abyste změnili její {{field}}, nebo ji přetáhněte v rámci jedné karty, abyste změnili pořadí",
|
||||
"dashboard.dropHere": "vložte cívky sem",
|
||||
"dashboard.emptyHelp": "Na této stránce jsou vaše cívky seskupeny podle pole, které si sami vyberete. Přidejte nějaké cívky a můžete začít!",
|
||||
"dashboard.errorEmptyName": "Jméno nesmí být prázdné",
|
||||
"dashboard.errorExists": "Skupina s tímto názvem již existuje",
|
||||
"dashboard.errorRename": "Přejmenování skupiny se nezdařilo",
|
||||
"dashboard.lastUsed": "Naposledy použito před {{time}}",
|
||||
"dashboard.newGroup": "Nová skupina",
|
||||
"dashboard.newGroupName": "Nová skupina {{n}}",
|
||||
"dashboard.reorderGroup": "Přetažením změňte pořadí ve skupině",
|
||||
"dashboard.spoolCount_few": "{{count}} cívky",
|
||||
"dashboard.spoolCount_one": "{{count}} cívka",
|
||||
"dashboard.spoolCount_other": "{{count}} cívek",
|
||||
"dashboard.unassigned": "Nepřiřazeno",
|
||||
"datetime.done": "Hotovo",
|
||||
"datetime.hour": "Hodina",
|
||||
"datetime.minute": "Minuta",
|
||||
"datetime.nextMonth": "Příští měsíc",
|
||||
"datetime.now": "Nyní",
|
||||
"datetime.pick": "Vyberte datum a čas",
|
||||
"datetime.prevMonth": "Předchozí měsíc",
|
||||
"datetime.time": "Čas",
|
||||
"documentTitle.dashboard.list": "Ovládací panel | Spoolman",
|
||||
"documentTitle.labels.list": "Etikety | Spoolman",
|
||||
"documentTitle.library.list": "Knihovna | Spoolman",
|
||||
"documentTitle.locations.list": "Umístění | Spoolman",
|
||||
"documentTitle.settings.list": "Nastavení | Spoolman",
|
||||
"filament.fields.addColor": "Přidat barvu",
|
||||
"filament.fields.articleNumber": "Číslo výrobku",
|
||||
"filament.fields.coaxial": "Koextrudovaný",
|
||||
"filament.fields.colorHex": "Barva",
|
||||
"filament.fields.colorType": "Typ barvy",
|
||||
"filament.fields.comment": "Komentář",
|
||||
"filament.fields.density": "Hustota",
|
||||
"filament.fields.diameter": "Průměr",
|
||||
"filament.fields.externalId": "Externí ID",
|
||||
"filament.fields.id": "Id",
|
||||
"filament.fields.longitudinal": "Podélná",
|
||||
"filament.fields.material": "Materiál",
|
||||
"filament.fields.multiColor": "Více",
|
||||
"filament.fields.name": "Název",
|
||||
"filament.fields.opacity": "Průhlednost",
|
||||
"filament.fields.price": "Cena",
|
||||
"filament.fields.registered": "Registrováno",
|
||||
"filament.fields.removeColor": "Odstranit barvu",
|
||||
"filament.fields.settingsBedTemp": "Teplota podložky",
|
||||
"filament.fields.settingsExtruderTemp": "Teplota extruderu",
|
||||
"filament.fields.singleColor": "Jediný",
|
||||
"filament.fields.spoolWeight": "Hmotnost cívky",
|
||||
"filament.fields.vendor": "Výrobce",
|
||||
"filament.fields.weight": "Váha",
|
||||
"filament.fieldsHelp.articleNumber": "Např. EAN, UPC, atd.",
|
||||
"filament.fieldsHelp.multiColorDirection": "Filamenty mohou mít více barev dvěma způsoby: buď koextruzí jako dvoubarevná vlákna s konzistentními více barvami, nebo podélnými změnami barev jako gradientní vlákna, která mění barvy podél cívky.",
|
||||
"filament.fieldsHelp.spoolWeight": "Hmotnost prázdné cívky. Slouží k určení naměřené hmotnosti cívky.",
|
||||
"filament.fieldsHelp.weight": "Hmotnost plného cívky filamentu (čistá hmotnost). Tato hmotnost by neměla zahrnovat hmotnost samotné cívky, ale pouze filamentu. Obvykle se uvádí na obalu.",
|
||||
"filament.filament": "Filamenty",
|
||||
"footer.documentation": "Dokumentace",
|
||||
"footer.reportIssue": "Nahlásit problém",
|
||||
"help.help": "Nápověda",
|
||||
"inspector.addSpoolsOfThis": "Přidejte k tomu tyto cívky",
|
||||
"inspector.adjustFailed": "Nastavení hmotnosti se nezdařilo.",
|
||||
"inspector.adjustHelp": "Kladná hodnota spotřebovává filament, záporna jej zase doplňuje.",
|
||||
"inspector.adjustWeight": "Nastavit váhu",
|
||||
"inspector.apply": "Použít",
|
||||
"inspector.applying": "Používám...",
|
||||
"inspector.colorHex": "Hexadecimální kód barvy",
|
||||
"inspector.consumeAmount": "Spotřebované množství:",
|
||||
"inspector.defaultFrom.filament": "{{value}} · výchozí filament",
|
||||
"inspector.defaultFrom.manufacturer": "{{value}} · výchozí výrobce",
|
||||
"inspector.delete.deleting": "Odstraňování...",
|
||||
"inspector.delete.errorGone": "Už to bylo smazáno.",
|
||||
"inspector.delete.errorSpoolsExist": "Tento filament nelze smazat – cívky ho stále používají.",
|
||||
"inspector.delete.errorUnknown": "Odstranění se nezdařilo. Podrobnosti najdete v protokolech serveru.",
|
||||
"inspector.delete.filament": "Odstranit filament",
|
||||
"inspector.delete.filamentBlockedHint": "Nejdřív smažte tyto cívky. Jejich archivace nestačí.",
|
||||
"inspector.delete.filamentBlockedTitle": "Tento filament nelze smazat",
|
||||
"inspector.delete.filamentBlocked_few": "{{count}} cívky stále používá „{{name}}“, včetně archivovaných.",
|
||||
"inspector.delete.filamentBlocked_one": "{{count}} cívka stále používá „{{name}}“, včetně archivovaných.",
|
||||
"inspector.delete.filamentBlocked_other": "{{count}} cívek stále používá „{{name}}“, včetně archivovaných.",
|
||||
"inspector.delete.filamentBody": "“{{name}}“ bude z vašeho katalogu odstraněno. Tuto akci nelze vrátit zpět.",
|
||||
"inspector.delete.filamentDone": "Filament byl odstraněn.",
|
||||
"inspector.delete.filamentTitle": "Smazat tento filament?",
|
||||
"inspector.delete.spool": "Smazat cívku",
|
||||
"inspector.delete.spoolBody": "Cívka # {{id}} z “{{name}}“ bude odstraněna spolu s její historií používání. Toto nelze vrátit zpět.",
|
||||
"inspector.delete.spoolDone": "Cívka vymazána.",
|
||||
"inspector.delete.spoolRemaining": "Zbývá na ní ještě {{weight}} filamentu. Pokud ji chcete jen odstranit, archivujte ji.",
|
||||
"inspector.delete.spoolTitle": "Smazat tuto cívku?",
|
||||
"inspector.delete.vendor": "Odstranit výrobce",
|
||||
"inspector.delete.vendorBody": "“{{name}}“ bude odstraněn. Tuto akci nelze vrátit zpět.",
|
||||
"inspector.delete.vendorDone": "Výrobce vymazán.",
|
||||
"inspector.delete.vendorOrphans_few": "{{count}} vlákna zůstávají zachována, ale není k nim uveden výrobce.",
|
||||
"inspector.delete.vendorOrphans_one": "{{count}} vlákno zůstává zachováno, ale není k němu uveden výrobce.",
|
||||
"inspector.delete.vendorOrphans_other": "{{count}} vláken zůstávají zachována, ale není k nim uveden výrobce.",
|
||||
"inspector.delete.vendorTitle": "Smazat tohoto výrobce?",
|
||||
"inspector.duplicateFilament": "Duplikát",
|
||||
"inspector.empty": "Vyberte si ze seznamu cívku, filament nebo výrobce a zobrazte si zde jejich podrobnosti.",
|
||||
"inspector.enterValidLength": "Zadejte platnou délku.",
|
||||
"inspector.enterValidWeight": "Zadejte platnou váhu.",
|
||||
"inspector.loading": "Načítání...",
|
||||
"inspector.manageExtraFields": "Správa polí",
|
||||
"inspector.measuredHelp": "Celková hmotnost cívky + zbývajícího filamentu, jak ji ukazuje váha.",
|
||||
"inspector.multi": "multi ×{{count}}",
|
||||
"inspector.newGross": "Nová celková hmotnost:",
|
||||
"inspector.noExtraFields": "Zatím žádná — přidejte si vlastní pole, abyste mohli sledovat vše, co Spoolman nesleduje.",
|
||||
"inspector.notFound": "Tuto položku se nepodařilo najít. Možná byla smazána.",
|
||||
"inspector.ofRemaining": "zbývá {{weight}} · {{length}} m",
|
||||
"inspector.openFilament": "Otevřený filament",
|
||||
"inspector.openLink": "Otevřít {{url}} v nové záložce",
|
||||
"inspector.openManufacturer": "Otevřít výrobce",
|
||||
"inspector.override.byFilament": "Přepsáno tímto vláknem · {{value}}",
|
||||
"inspector.override.bySpool": "Přepsáno touto cívkou · {{value}}",
|
||||
"inspector.override.overridesFilament": "Přepíše filament · {{value}}",
|
||||
"inspector.override.overridesManufacturer": "Přepsání výrobce · {{value}}",
|
||||
"inspector.specs": "Specifikace — úpravy přímo v dokumentu",
|
||||
"inspector.spoolsCount": "Cívky · {{count}}",
|
||||
"inspector.spoolsTotalRemaining": "{{weight}} celkem",
|
||||
"inspector.used": "použité",
|
||||
"inspector.vendorSub_few": "{{count}} filamenty",
|
||||
"inspector.vendorSub_one": "{{count}} filament",
|
||||
"inspector.vendorSub_other": "{{count}} filamentů",
|
||||
"kofi": "Příspěvek autorovi na Ko-fi",
|
||||
"labels.addHead": "Přidat",
|
||||
"labels.addQr": "QR kód",
|
||||
"labels.addRect": "Obdélník",
|
||||
"labels.addSwatch": "Vzorník barev",
|
||||
"labels.addText": "Text / pole",
|
||||
"labels.align": "Zarovnat",
|
||||
"labels.alignCenter": "Na střed",
|
||||
"labels.alignLeft": "Vlevo",
|
||||
"labels.alignRight": "Vpravo",
|
||||
"labels.blank": "Zatím nemáte žádné návrhy etiket.",
|
||||
"labels.bold": "Tučně",
|
||||
"labels.canvasHint": "Přetažením přesunete · kliknutím vyberete · pomocí úchytů změníte velikost.",
|
||||
"labels.centerLogo": "Spoolman logo uprostřed",
|
||||
"labels.chooseField": "Vyberte pole...",
|
||||
"labels.clearFill": "Průhledné vyplnění (pouze obrys)",
|
||||
"labels.copies": "Kopie",
|
||||
"labels.cornerRadiusMm": "Zaoblení rohu",
|
||||
"labels.createFirst": "Vytvořte svůj první šítek",
|
||||
"labels.cutGuides": "Řezací vodítka",
|
||||
"labels.deleteConfirm": "Chcete tento návrh etikety smazat?",
|
||||
"labels.deleteElement": "Odstranit prvek",
|
||||
"labels.designName": "Název návrhu",
|
||||
"labels.designerDesc": "Navrhujte etikety s QR kódy s libovolnými poli pro cívky, filamenty nebo dodavatele a poté je vytiskněte na archy nebo na tiskárně etiket. Návrhy se ukládají na server.",
|
||||
"labels.designerTitle": "Návrhář etiket",
|
||||
"labels.dpi": "Rozlišení",
|
||||
"labels.dpiHint": "",
|
||||
"labels.duplicate": "Duplikát",
|
||||
"labels.exportFormat": "Formát souboru",
|
||||
"labels.exportFormatOptions.aml": "Formát souboru etiket AML",
|
||||
"labels.exportFormatOptions.png": "Obrázek PNG",
|
||||
"labels.fields.bedTemp": "Teplota podložky",
|
||||
"labels.fields.diameterMm": "Průměr (mm)",
|
||||
"labels.fields.groupVendor": "Dodavatel",
|
||||
"labels.fields.initialG": "Počáteční (g)",
|
||||
"labels.fields.netWeightG": "Čistá hmotnost (g)",
|
||||
"labels.fields.remainingG": "Zbývající množství (g)",
|
||||
"labels.filamentsSelected_few": "{{count}} filamenty byl vybrány",
|
||||
"labels.filamentsSelected_one": "{{count}} filament byl vybrán",
|
||||
"labels.filamentsSelected_other": "{{count}} filamentů bylo vybráno",
|
||||
"labels.fill": "Vyplnit",
|
||||
"labels.fitWidth": "Přizpůsobit šířku sloupcům",
|
||||
"labels.fitWidthHint": "Nastavte šířku popisků tak, aby zvolený počet sloupců vyplnil celou stránku.",
|
||||
"labels.fontMm": "Písmo",
|
||||
"labels.gridInfo": "{{cols}} × {{rows}} = {{perPage}} etiket / stránka",
|
||||
"labels.hMm": "H",
|
||||
"labels.heightMm": "Výška",
|
||||
"labels.hintNowrap": "Text zůstává na jednom řádku; vše, co přesahuje šířku, se ořízne.",
|
||||
"labels.hintSwatch": "",
|
||||
"labels.hintWrap": "",
|
||||
"labels.imageDesc": "",
|
||||
"labels.imageZipNote": "",
|
||||
"labels.insertField": "Přidat pole",
|
||||
"labels.kind.qr": "QR kód",
|
||||
"labels.kind.rect": "Obdelník",
|
||||
"labels.kind.swatch": "Vzorek",
|
||||
"labels.kind.text": "Text",
|
||||
"labels.labelSize": "Velikost etikety",
|
||||
"labels.labelType": "Typ etikety",
|
||||
"labels.layout": "Rozvržení",
|
||||
"labels.modeImage": "Obrázkové soubory",
|
||||
"labels.modeLabel": "Tiskárna etiket",
|
||||
"labels.modeSheet": "",
|
||||
"labels.new": "Nový",
|
||||
"labels.newText": "Nový text",
|
||||
"labels.noDesignsOption": "Zatím žádné návrhy",
|
||||
"labels.noFilaments": "Žádné filamenty.",
|
||||
"labels.noSpools": "Žádné cívky.",
|
||||
"labels.onePerLabel": "",
|
||||
"labels.preparing": "Příprava...",
|
||||
"labels.preview": "Náhled",
|
||||
"labels.previewWith": "Náhled pomocí",
|
||||
"labels.printN_few": "Vytisknout {{count}} štítky",
|
||||
"labels.printN_one": "Vytisknout {{count}} etiket",
|
||||
"labels.printN_other": "Vytisknout {{count}} štítků",
|
||||
"labels.radiusMm": "Poloměr",
|
||||
"labels.sampleData": "Ukázková data",
|
||||
"labels.saveAsFormat": "Uložit jako {{format}}",
|
||||
"labels.saved": "Uloženo",
|
||||
"labels.saving": "Ukládání...",
|
||||
"labels.searchFilaments": "Vyhledávám filamenty...",
|
||||
"labels.searchSpools": "Vyhledávám cívky...",
|
||||
"labels.selectAllShort": "Vše",
|
||||
"labels.selectAtLeastOne": "Vyberte alespoň jednu cívku.",
|
||||
"labels.selectAtLeastOneFilament": "Vyberte alespoň jeden filament.",
|
||||
"labels.selectDesign": "Vyberte návrh etikety",
|
||||
"labels.selectElement": "",
|
||||
"labels.selectNoneShort": "Žádné",
|
||||
"labels.selectRecentHint": "",
|
||||
"labels.selectRecentShort": "",
|
||||
"labels.showingFilament": "",
|
||||
"labels.showingReal": "",
|
||||
"labels.showingSpool": "",
|
||||
"labels.showingTags": "",
|
||||
"labels.sizeMm": "Velikost",
|
||||
"labels.skipHint": "",
|
||||
"labels.sortHint": "Seřadit cívky",
|
||||
"labels.sortId": "#",
|
||||
"labels.sortNewest": "Nejnovější",
|
||||
"labels.stroke": "",
|
||||
"labels.strokeMm": "",
|
||||
"labels.tabDesign": "",
|
||||
"labels.tabPrint": "Tisk",
|
||||
"labels.textTemplate": "Text / šablona",
|
||||
"labels.typeFilament": "Filament",
|
||||
"labels.typeHint": "",
|
||||
"labels.typeSpool": "Cívka",
|
||||
"labels.unknownFilament": "Neznámý filament",
|
||||
"labels.wMm": "Š",
|
||||
"labels.widthMm": "Šířka",
|
||||
"labels.wrapText": "",
|
||||
"labels.xMm": "X",
|
||||
"labels.yMm": "Y",
|
||||
"library.apiError": "",
|
||||
"library.collapseGroup": "",
|
||||
"library.dateFilter.never": "Nikdy",
|
||||
"library.dateFilter.olderThan": "Starší než {{span}}",
|
||||
"library.dateFilter.since": "Od {{date}}",
|
||||
"library.dateFilter.to": "Do (volitelně)",
|
||||
"library.emptyBody": "",
|
||||
"library.emptyFiltered": "",
|
||||
"library.emptyTitle": "Zatím žádné cívky",
|
||||
"library.expandGroup": "Zobrazit tyto cívky",
|
||||
"library.filterBy": "Filtrovat podle",
|
||||
"library.groupBy": "Skupina",
|
||||
"library.groupNone": "",
|
||||
"library.groupSpools_few": "{{count}} cívky",
|
||||
"library.groupSpools_one": "{{count}} cívka",
|
||||
"library.groupSpools_other": "{{count}} cívek",
|
||||
"library.nUnused": "",
|
||||
"library.noLocation": "bez uvedení místa",
|
||||
"library.noSpools": "Žádné cívky",
|
||||
"library.noValues": "Žádné hodnoty",
|
||||
"library.openGroup": "",
|
||||
"library.openManufacturer": "",
|
||||
"library.section.extra": "",
|
||||
"library.section.filament": "Filament",
|
||||
"library.section.spool": "Cívka",
|
||||
"library.section.vendor": "Výrobce",
|
||||
"library.showMore": "",
|
||||
"library.sort.nozzle": "Teplota trysky",
|
||||
"library.sortBy": "",
|
||||
"library.unassigned": "",
|
||||
"library.unitGroups": "",
|
||||
"library.unitSpools": "cívky",
|
||||
"library.unused": "",
|
||||
"library.unusedGroup": "",
|
||||
"library.unusedGroupMixed": "",
|
||||
"library.unusedSub": "",
|
||||
"library.unusedSubMixed": "{{location}}",
|
||||
"library.used": "",
|
||||
"library.usedAgo": "",
|
||||
"loading": "Načítání",
|
||||
"locations.locations": "Umístění",
|
||||
"locations.newLocation": "Nové umístění",
|
||||
"locations.noLocation": "Žádné umístění",
|
||||
"locations.noLocationsHelp": "Na této stránce můžete uspořádat své cívky podle umístění, přidejte několik cívek a začněte!",
|
||||
"nav.labels": "Etikety",
|
||||
"nav.library": "Knihovna",
|
||||
"no": "Ne",
|
||||
"notifications.error": "Chyba (kód chyby: {{statusCode}})",
|
||||
"notifications.saveSuccessful": "Úspěšně uloženo!",
|
||||
"pagination.empty": "",
|
||||
"pagination.next": "Další stránka",
|
||||
"pagination.pageSize": "Velikost stránky",
|
||||
"pagination.perPage": "",
|
||||
"pagination.prev": "Předchozí stránka",
|
||||
"pagination.range": "",
|
||||
"printing.generic.columns": "Sloupce",
|
||||
"printing.generic.customSize": "Vlastní",
|
||||
"printing.generic.description": "Níže uvedeným nastavením dosáhnete požadovaného rozložení tisku. Mějte na paměti, že tiskárny a váš operační systém mohou použít vlastní okraje a měřítka, takže možná budete muset provést několik pokusů a omylů, než bude vše správně nastaveno. Před tiskem na skutečné etikety si to vyzkoušejte na listu běžného papíru.",
|
||||
"printing.generic.dimensions": "Rozměry",
|
||||
"printing.generic.gridTooWide": "",
|
||||
"printing.generic.helpMargin": "Okraje by měly být nastaveny tak, aby odpovídaly listu etiket a tiskárně, jejich změna ovlivní velikost celé mřížky.",
|
||||
"printing.generic.helpPrinterMargin": "Bezpečná zóna by měla být nastavena tak, jak blízko okraje papíru může tiskárna tisknout, jejich změna neovlivní celou mřížku.",
|
||||
"printing.generic.horizontalSpacing": "Vodorovná rozteč",
|
||||
"printing.generic.itemCopies": "Kopie položky",
|
||||
"printing.generic.marginBottom": "Dolní okraj",
|
||||
"printing.generic.marginLeft": "Levý okraj",
|
||||
"printing.generic.marginRight": "Pravý okraj",
|
||||
"printing.generic.marginTop": "Horní okraj",
|
||||
"printing.generic.paperSize": "Velikost papíru",
|
||||
"printing.generic.printerMarginBottom": "Okraj tiskárny dolní",
|
||||
"printing.generic.printerMarginLeft": "Okraj tiskárny vlevo",
|
||||
"printing.generic.printerMarginRight": "Okraj tiskárny vpravo",
|
||||
"printing.generic.printerMarginTop": "Okraj tiskárny horní",
|
||||
"printing.generic.saveAsImage": "Uložit jako obrázek",
|
||||
"printing.generic.skipItems": "Vynechat položky",
|
||||
"printing.generic.verticalSpacing": "Svislá rozteč",
|
||||
"printing.qrcode.button": "Tisk etiket",
|
||||
"printing.qrcode.customUrl.caveat": "",
|
||||
"printing.qrcode.customUrl.hint": "",
|
||||
"printing.qrcode.customUrl.label": "",
|
||||
"printing.qrcode.useHTTPUrl.label": "Odkaz na QR kód",
|
||||
"printing.qrcode.useHTTPUrl.options.custom": "",
|
||||
"printing.qrcode.useHTTPUrl.options.default": "Výchozí",
|
||||
"printing.qrcode.useHTTPUrl.options.url": "URL",
|
||||
"printing.qrcode.useHTTPUrl.preview": "Náhled:",
|
||||
"printing.qrcode.useHTTPUrl.tooltip": "Použije proprietární odkaz, který bude fungovat pouze v případě, že bude skenován pomocí funkce skenování Spoolman (výchozí). Adresa URL používá buď základní adresu URL zadanou v nastavení, nebo adresu URL aktuální stránky, pokud není nastavena.",
|
||||
"printing.spoolSelect.selectedTotal_few": "{{count}} vybrané cívky",
|
||||
"printing.spoolSelect.selectedTotal_one": "{{count}} vybraná cívka",
|
||||
"printing.spoolSelect.selectedTotal_other": "{{count}} vybraných cívek",
|
||||
"scanner.description": "Naskenováním QR kódu Spoolman zobrazíte podrobnosti o cívce.",
|
||||
"scanner.error.inUse": "",
|
||||
"scanner.error.insecureContext": "Stránka se nezobrazuje přes protokol HTTPS.",
|
||||
"scanner.error.notAllowed": "Nemáte povolen přístup ke kameře.",
|
||||
"scanner.error.notFound": "Nebyla nalezena žádná kamera.",
|
||||
"scanner.error.streamApiNotSupported": "Prohlížeč nepodporuje MediaStream API.",
|
||||
"scanner.error.unknown": "Došlo k neznámé chybě. ({{error}})",
|
||||
"scanner.starting": "",
|
||||
"scanner.title": "Skener QR kódu",
|
||||
"search.colorHint": "Názvy barev je třeba zadávat v angličtině.",
|
||||
"search.moreSpools": "+{{count}} více",
|
||||
"search.noResults": "Nebyly nalezeny žádné výsledky",
|
||||
"search.searching": "Vyhledávám...",
|
||||
"search.section.filaments": "Filamenty",
|
||||
"search.section.spools": "Cívky",
|
||||
"search.section.vendors": "Výrobci",
|
||||
"search.threshold": "Shoda barev",
|
||||
"search.unknownFilament": "Neznámý filament",
|
||||
"settings.appearance.tab": "",
|
||||
"settings.appearance.theme.dark": "Tmavé",
|
||||
"settings.appearance.theme.desc": "Barevné téma (pouze v tomto prohlížeči)",
|
||||
"settings.appearance.theme.label": "Téma",
|
||||
"settings.appearance.theme.light": "Světlé",
|
||||
"settings.appearance.theme.system": "Systém",
|
||||
"settings.extraFields.addChoice": "",
|
||||
"settings.extraFields.addChoicesFirst": "",
|
||||
"settings.extraFields.addEntityField": "",
|
||||
"settings.extraFields.booleanFalse": "Ne",
|
||||
"settings.extraFields.booleanTrue": "Ano",
|
||||
"settings.extraFields.deleteConfirm": "Mám odstranit pole {{name}} z {{entity}}?",
|
||||
"settings.extraFields.description.constraints": "Jakmile je pole přidáno, nemůžete změnit jeho klíč ani typ a u polí typu výběr nemůžete odebrat volby ani změnit stav více voleb. Pokud pole odstraníte, budou odstraněna přidružená data pro všechny subjekty.",
|
||||
"settings.extraFields.description.intro": "Zde můžete přidat další vlastní pole k subjektům.",
|
||||
"settings.extraFields.description.keyUsage": "Klíčové je, jako co ostatní programy čtou/zapisují data, takže pokud má být vaše vlastní pole integrováno s programem třetí strany, ujistěte se, že je správně nastaveno. Výchozí hodnota se použije pouze pro nové položky.",
|
||||
"settings.extraFields.description.tableViews": "Výstupní pole nelze v zobrazeních tabulky řadit ani filtrovat.",
|
||||
"settings.extraFields.editorEdit": "",
|
||||
"settings.extraFields.editorNew": "",
|
||||
"settings.extraFields.errors.choiceNeeded": "",
|
||||
"settings.extraFields.errors.choicesRemoved": "",
|
||||
"settings.extraFields.errors.deleteFailed": "",
|
||||
"settings.extraFields.errors.keyFormat": "",
|
||||
"settings.extraFields.errors.nameRequired": "Jméno je povinné.",
|
||||
"settings.extraFields.errors.saveFailed": "",
|
||||
"settings.extraFields.fieldType.boolean": "Logická hodnota",
|
||||
"settings.extraFields.fieldType.choice": "Volba",
|
||||
"settings.extraFields.fieldType.datetime": "Datumčas",
|
||||
"settings.extraFields.fieldType.float": "Plovoucí",
|
||||
"settings.extraFields.fieldType.floatRange": "Plovoucí rozsah",
|
||||
"settings.extraFields.fieldType.integer": "Celé číslo",
|
||||
"settings.extraFields.fieldType.integerRange": "Rozsah celých čísel",
|
||||
"settings.extraFields.fieldType.text": "Text",
|
||||
"settings.extraFields.max": "max",
|
||||
"settings.extraFields.min": "min",
|
||||
"settings.extraFields.multiSuffix": "",
|
||||
"settings.extraFields.multiple": "Více",
|
||||
"settings.extraFields.namePlaceholder": "Zobrazovaný název",
|
||||
"settings.extraFields.nonUniqueKeyError": "Tento klíč musí být jedinečný.",
|
||||
"settings.extraFields.none": "",
|
||||
"settings.extraFields.params.choices": "Volby",
|
||||
"settings.extraFields.params.defaultValue": "Výchozí hodnota",
|
||||
"settings.extraFields.params.fieldType": "Typ",
|
||||
"settings.extraFields.params.key": "Klíč",
|
||||
"settings.extraFields.params.name": "Název",
|
||||
"settings.extraFields.params.order": "Objednávka",
|
||||
"settings.extraFields.params.unit": "Jednotka",
|
||||
"settings.extraFields.saveField": "Uložit pole",
|
||||
"settings.extraFields.tab": "Další pole",
|
||||
"settings.general.baseUrl.label": "Základní URL",
|
||||
"settings.general.baseUrl.tooltip": "Základní adresa URL, která se má použít při generování funkcí, jako jsou QR kódy.",
|
||||
"settings.general.currency.desc": "Třípísmenný kód ISO (např. EUR, USD) používaný pro ceny",
|
||||
"settings.general.currency.label": "Měna",
|
||||
"settings.general.roundPrices.label": "Zaokrouhlené ceny",
|
||||
"settings.general.roundPrices.tooltip": "Zaokrouhlete ceny na nejbližší celé číslo.",
|
||||
"settings.general.tab": "Obecné",
|
||||
"settings.header": "Nastavení",
|
||||
"settings.language.desc": "Jazyk rozhraní (pouze v tomto prohlížeči)",
|
||||
"settings.language.label": "Jazyk",
|
||||
"settings.library.lowThreshold.desc": "",
|
||||
"settings.library.lowThreshold.label": "",
|
||||
"settings.library.tab": "Chování knihovny",
|
||||
"spool.fields.archived": "Archivováno",
|
||||
"spool.fields.comment": "Komentář",
|
||||
"spool.fields.filament": "Filament",
|
||||
"spool.fields.firstUsed": "První použití",
|
||||
"spool.fields.id": "ID",
|
||||
"spool.fields.lastUsed": "Naposledy použitá",
|
||||
"spool.fields.location": "Umístění",
|
||||
"spool.fields.lotNr": "Číslo šarže",
|
||||
"spool.fields.material": "Materiál",
|
||||
"spool.fields.measuredWeight": "Naměřená hmotnost",
|
||||
"spool.fields.price": "Cena",
|
||||
"spool.fields.registered": "Registrováno",
|
||||
"spool.fields.remainingWeight": "Zbývající hmotnost",
|
||||
"spool.fields.spoolWeight": "Váha cívky",
|
||||
"spool.fields.usedWeight": "Použitá hmotnost",
|
||||
"spool.fields.weight": "Váha",
|
||||
"spool.fieldsHelp.location": "Kde se cívka nachází, pokud máte více míst, kde cívky skladujete.",
|
||||
"spool.fieldsHelp.lotNr": "Číslo šarže výrobce. Lze použít k zajištění jednotné barvy tisku v případě použití více cívek.",
|
||||
"spool.fieldsHelp.measuredWeight": "Jaká je hmotnost filamentu a cívky.",
|
||||
"spool.fieldsHelp.price": "Cena celé cívky. Pokud není nastavena, předpokládá se cena filamentu.",
|
||||
"spool.fieldsHelp.remainingWeight": "Kolik filamentu zbývá na cívce. U nové cívky by to mělo odpovídat hmotnosti filamentu na cívce.",
|
||||
"spool.fieldsHelp.usedWeight": "Kolik filamntu bylo z cívky spotřebováno. Na nové cívce by mělo být použito 0 g.",
|
||||
"spool.fieldsHelp.weight": "Kolik filamentu tato cívka pojala, když byla plná (čistá hmotnost, bez hmotnosti samotné cívky). Nechte toto pole prázdné, chcete-li sledovat hmotnost filamentu, a zadejte hodnotu pouze v případě, že se tato konkrétní cívka liší – jedná-li se o částečně naplněnou cívku nebo o stejný filament zakoupený na větší cívce.",
|
||||
"spool.form.measurementType.length": "Délka",
|
||||
"spool.form.measurementType.weight": "Hmotnost",
|
||||
"spool.spool": "Cívky",
|
||||
"topbar.addSpools": "Přidat cívky",
|
||||
"topbar.searchPlaceholder": "Vyhledávání — zkuste \"červený“ nebo \"pla“",
|
||||
"unknown": "Neznámý",
|
||||
"validation.hexDigits": "",
|
||||
"validation.maxChars": "",
|
||||
"validation.mustBeGt": "",
|
||||
"validation.mustBeMax": "",
|
||||
"validation.mustBeMin": "",
|
||||
"validation.mustBeNumber": "Musí to být číslo",
|
||||
"validation.required": "Povinné",
|
||||
"vendor.fields.comment": "Komentář",
|
||||
"vendor.fields.emptySpoolWeight": "Hmotnost prázdné cívky",
|
||||
"vendor.fields.externalId": "Externí ID",
|
||||
"vendor.fields.id": "Id",
|
||||
"vendor.fields.name": "Název",
|
||||
"vendor.fields.registered": "Registrováno",
|
||||
"vendor.fieldsHelp.emptySpoolWeight": "Hmotnost prázdné cívky od tohoto výrobce.",
|
||||
"yes": "Ano"
|
||||
}
|
||||
@@ -0,0 +1,462 @@
|
||||
{
|
||||
"add.addAndNew": "",
|
||||
"add.adding": "",
|
||||
"add.advanced": "",
|
||||
"add.advancedNote": "",
|
||||
"add.change": "",
|
||||
"add.count": "",
|
||||
"add.createNew": "",
|
||||
"add.createNewSub": "",
|
||||
"add.dbUnavailable": "",
|
||||
"add.duplicate": "",
|
||||
"add.duplicateNote": "",
|
||||
"add.duplicateRename": "",
|
||||
"add.duplicateTitle": "",
|
||||
"add.filamentNamePlaceholder": "",
|
||||
"add.fill.full": "",
|
||||
"add.fillLevel": "",
|
||||
"add.importNote": "",
|
||||
"add.inCatalog": "",
|
||||
"add.locationHint": "",
|
||||
"add.locationPlaceholder": "",
|
||||
"add.manufacturerPlaceholder": "",
|
||||
"add.nameHint": "",
|
||||
"add.newFilament": "",
|
||||
"add.newFilamentTitle": "",
|
||||
"add.noCatalog": "",
|
||||
"add.noManufacturer": "",
|
||||
"add.pickColor": "",
|
||||
"add.searchPlaceholder": "",
|
||||
"add.searching": "",
|
||||
"add.spoolWeightPreset.cardboard": "",
|
||||
"add.spoolWeightPreset.plastic": "",
|
||||
"add.spoolWeightPresetsLead": "",
|
||||
"add.step2": "",
|
||||
"add.typeToSearchAll": "",
|
||||
"add.typeToSearchMatches": "",
|
||||
"add.useExisting": "",
|
||||
"add.vendorHint.existing": "",
|
||||
"add.vendorHint.new": "",
|
||||
"add.vendorHint.optional": "",
|
||||
"add.yourCatalog": "",
|
||||
"buttons.archive": "Arkivér",
|
||||
"buttons.cancel": "Annuller",
|
||||
"buttons.clear": "Ryd",
|
||||
"buttons.close": "",
|
||||
"buttons.delete": "Slet",
|
||||
"buttons.edit": "Redigér",
|
||||
"buttons.filter": "Filtrér",
|
||||
"buttons.save": "Gem",
|
||||
"buttons.showArchived": "Vis arkiverede",
|
||||
"buttons.unArchive": "Gendan arkiv",
|
||||
"common.decrement": "",
|
||||
"common.increment": "",
|
||||
"common.remove": "",
|
||||
"common.search": "",
|
||||
"dashboard.addFieldHint": "",
|
||||
"dashboard.dashboard": "",
|
||||
"dashboard.deleteGroup": "",
|
||||
"dashboard.dragHint": "",
|
||||
"dashboard.dropHere": "",
|
||||
"dashboard.emptyHelp": "",
|
||||
"dashboard.errorEmptyName": "",
|
||||
"dashboard.errorExists": "",
|
||||
"dashboard.errorRename": "",
|
||||
"dashboard.lastUsed": "",
|
||||
"dashboard.newGroup": "",
|
||||
"dashboard.newGroupName": "",
|
||||
"dashboard.reorderGroup": "",
|
||||
"dashboard.unassigned": "",
|
||||
"datetime.done": "",
|
||||
"datetime.hour": "",
|
||||
"datetime.minute": "",
|
||||
"datetime.nextMonth": "",
|
||||
"datetime.now": "",
|
||||
"datetime.pick": "",
|
||||
"datetime.prevMonth": "",
|
||||
"datetime.time": "",
|
||||
"documentTitle.dashboard.list": "",
|
||||
"documentTitle.labels.list": "",
|
||||
"documentTitle.library.list": "",
|
||||
"documentTitle.locations.list": "Lokationer | Spoolman",
|
||||
"documentTitle.settings.list": "",
|
||||
"filament.fields.addColor": "",
|
||||
"filament.fields.articleNumber": "Produktnummer",
|
||||
"filament.fields.coaxial": "Koaksialt",
|
||||
"filament.fields.colorHex": "Farve",
|
||||
"filament.fields.colorType": "",
|
||||
"filament.fields.comment": "Kommentar",
|
||||
"filament.fields.density": "Massefylde",
|
||||
"filament.fields.diameter": "Diameter",
|
||||
"filament.fields.externalId": "Eksternt ID",
|
||||
"filament.fields.id": "ID",
|
||||
"filament.fields.longitudinal": "Langsgående",
|
||||
"filament.fields.material": "Materiale",
|
||||
"filament.fields.multiColor": "Flerfarvet",
|
||||
"filament.fields.name": "Navn",
|
||||
"filament.fields.price": "Pris",
|
||||
"filament.fields.registered": "Registreret",
|
||||
"filament.fields.removeColor": "",
|
||||
"filament.fields.settingsBedTemp": "Printpladetemperatur",
|
||||
"filament.fields.settingsExtruderTemp": "Ekstrudertemperatur",
|
||||
"filament.fields.singleColor": "Enkeltfarvet",
|
||||
"filament.fields.spoolWeight": "Spolevægt",
|
||||
"filament.fields.vendor": "Producent",
|
||||
"filament.fields.weight": "Vægt",
|
||||
"filament.fieldsHelp.articleNumber": "F.eks. EAN, UPC, e.l.",
|
||||
"filament.fieldsHelp.multiColorDirection": "Filamenter kan have flere farver på to måder: Enten koaksialt, som 2- & 3-farvede filamenter med vedvarende flerfarvethed, eller gennem langsgående ændringer, som regnbuefilamenter, hvor farven skifter undervejs på spolen.",
|
||||
"filament.fieldsHelp.spoolWeight": "Vægten af en tom spole. Bruges til at angive den målte vægt af en spole.",
|
||||
"filament.fieldsHelp.weight": "Filamentets vægt på en ny spole (nettovægt). Dette bør ikke inkludere vægten af selve spolen, kun filamentet. Det er som regel den angivne vægt på pakken.",
|
||||
"filament.filament": "Filamenter",
|
||||
"footer.documentation": "",
|
||||
"footer.reportIssue": "",
|
||||
"help.help": "Hjælp",
|
||||
"inspector.addSpoolsOfThis": "",
|
||||
"inspector.adjustFailed": "",
|
||||
"inspector.adjustHelp": "",
|
||||
"inspector.adjustWeight": "",
|
||||
"inspector.apply": "",
|
||||
"inspector.applying": "",
|
||||
"inspector.colorHex": "",
|
||||
"inspector.consumeAmount": "",
|
||||
"inspector.delete.deleting": "",
|
||||
"inspector.delete.errorGone": "",
|
||||
"inspector.delete.errorSpoolsExist": "",
|
||||
"inspector.delete.errorUnknown": "",
|
||||
"inspector.delete.filament": "",
|
||||
"inspector.delete.filamentBlockedHint": "",
|
||||
"inspector.delete.filamentBlockedTitle": "",
|
||||
"inspector.delete.filamentBody": "",
|
||||
"inspector.delete.filamentDone": "",
|
||||
"inspector.delete.filamentTitle": "",
|
||||
"inspector.delete.spool": "",
|
||||
"inspector.delete.spoolBody": "",
|
||||
"inspector.delete.spoolDone": "",
|
||||
"inspector.delete.spoolRemaining": "",
|
||||
"inspector.delete.spoolTitle": "",
|
||||
"inspector.delete.vendor": "",
|
||||
"inspector.delete.vendorBody": "",
|
||||
"inspector.delete.vendorDone": "",
|
||||
"inspector.delete.vendorTitle": "",
|
||||
"inspector.duplicateFilament": "",
|
||||
"inspector.empty": "",
|
||||
"inspector.enterValidLength": "",
|
||||
"inspector.enterValidWeight": "",
|
||||
"inspector.loading": "",
|
||||
"inspector.manageExtraFields": "",
|
||||
"inspector.measuredHelp": "",
|
||||
"inspector.multi": "",
|
||||
"inspector.newGross": "",
|
||||
"inspector.noExtraFields": "",
|
||||
"inspector.notFound": "",
|
||||
"inspector.ofRemaining": "",
|
||||
"inspector.openFilament": "",
|
||||
"inspector.openLink": "",
|
||||
"inspector.openManufacturer": "",
|
||||
"inspector.specs": "",
|
||||
"inspector.spoolsCount": "",
|
||||
"inspector.spoolsTotalRemaining": "",
|
||||
"inspector.used": "",
|
||||
"kofi": "Donér på Ko-fi",
|
||||
"labels.addHead": "",
|
||||
"labels.addQr": "",
|
||||
"labels.addRect": "",
|
||||
"labels.addSwatch": "",
|
||||
"labels.addText": "",
|
||||
"labels.align": "",
|
||||
"labels.alignCenter": "",
|
||||
"labels.alignLeft": "",
|
||||
"labels.alignRight": "",
|
||||
"labels.blank": "",
|
||||
"labels.bold": "",
|
||||
"labels.canvasHint": "",
|
||||
"labels.centerLogo": "",
|
||||
"labels.chooseField": "",
|
||||
"labels.clearFill": "",
|
||||
"labels.copies": "",
|
||||
"labels.cornerRadiusMm": "",
|
||||
"labels.createFirst": "",
|
||||
"labels.cutGuides": "",
|
||||
"labels.deleteConfirm": "",
|
||||
"labels.deleteElement": "",
|
||||
"labels.designName": "",
|
||||
"labels.designerDesc": "",
|
||||
"labels.designerTitle": "",
|
||||
"labels.dpi": "",
|
||||
"labels.dpiHint": "",
|
||||
"labels.duplicate": "",
|
||||
"labels.fields.bedTemp": "",
|
||||
"labels.fields.diameterMm": "",
|
||||
"labels.fields.groupVendor": "",
|
||||
"labels.fields.initialG": "",
|
||||
"labels.fields.netWeightG": "",
|
||||
"labels.fields.remainingG": "",
|
||||
"labels.fill": "",
|
||||
"labels.fitWidth": "",
|
||||
"labels.fitWidthHint": "",
|
||||
"labels.fontMm": "",
|
||||
"labels.gridInfo": "",
|
||||
"labels.hMm": "",
|
||||
"labels.heightMm": "",
|
||||
"labels.hintNowrap": "",
|
||||
"labels.hintSwatch": "",
|
||||
"labels.hintWrap": "",
|
||||
"labels.imageDesc": "",
|
||||
"labels.imageZipNote": "",
|
||||
"labels.insertField": "",
|
||||
"labels.kind.qr": "",
|
||||
"labels.kind.rect": "",
|
||||
"labels.kind.swatch": "",
|
||||
"labels.kind.text": "",
|
||||
"labels.labelSize": "",
|
||||
"labels.labelType": "",
|
||||
"labels.layout": "",
|
||||
"labels.modeImage": "",
|
||||
"labels.modeLabel": "",
|
||||
"labels.modeSheet": "",
|
||||
"labels.new": "",
|
||||
"labels.newText": "",
|
||||
"labels.noDesignsOption": "",
|
||||
"labels.noFilaments": "",
|
||||
"labels.noSpools": "",
|
||||
"labels.onePerLabel": "",
|
||||
"labels.preparing": "",
|
||||
"labels.preview": "",
|
||||
"labels.previewWith": "",
|
||||
"labels.radiusMm": "",
|
||||
"labels.sampleData": "",
|
||||
"labels.saved": "",
|
||||
"labels.saving": "",
|
||||
"labels.searchFilaments": "",
|
||||
"labels.searchSpools": "",
|
||||
"labels.selectAllShort": "",
|
||||
"labels.selectAtLeastOne": "",
|
||||
"labels.selectAtLeastOneFilament": "",
|
||||
"labels.selectDesign": "",
|
||||
"labels.selectElement": "",
|
||||
"labels.selectNoneShort": "",
|
||||
"labels.selectRecentHint": "",
|
||||
"labels.selectRecentShort": "",
|
||||
"labels.showingFilament": "",
|
||||
"labels.showingReal": "",
|
||||
"labels.showingSpool": "",
|
||||
"labels.showingTags": "",
|
||||
"labels.sizeMm": "",
|
||||
"labels.skipHint": "",
|
||||
"labels.sortHint": "",
|
||||
"labels.sortId": "",
|
||||
"labels.sortNewest": "",
|
||||
"labels.stroke": "",
|
||||
"labels.strokeMm": "",
|
||||
"labels.tabDesign": "",
|
||||
"labels.tabPrint": "",
|
||||
"labels.textTemplate": "",
|
||||
"labels.typeFilament": "",
|
||||
"labels.typeHint": "",
|
||||
"labels.typeSpool": "",
|
||||
"labels.unknownFilament": "",
|
||||
"labels.wMm": "",
|
||||
"labels.widthMm": "",
|
||||
"labels.wrapText": "",
|
||||
"labels.xMm": "",
|
||||
"labels.yMm": "",
|
||||
"library.apiError": "",
|
||||
"library.collapseGroup": "",
|
||||
"library.emptyBody": "",
|
||||
"library.emptyFiltered": "",
|
||||
"library.emptyTitle": "",
|
||||
"library.expandGroup": "",
|
||||
"library.filterBy": "",
|
||||
"library.groupBy": "",
|
||||
"library.groupNone": "",
|
||||
"library.nUnused": "",
|
||||
"library.noLocation": "",
|
||||
"library.noValues": "",
|
||||
"library.openGroup": "",
|
||||
"library.openManufacturer": "",
|
||||
"library.section.extra": "",
|
||||
"library.section.filament": "",
|
||||
"library.section.spool": "",
|
||||
"library.section.vendor": "",
|
||||
"library.showMore": "",
|
||||
"library.sort.nozzle": "",
|
||||
"library.sortBy": "",
|
||||
"library.unassigned": "",
|
||||
"library.unitGroups": "",
|
||||
"library.unitSpools": "",
|
||||
"library.unused": "",
|
||||
"library.unusedGroup": "",
|
||||
"library.unusedGroupMixed": "",
|
||||
"library.unusedSub": "",
|
||||
"library.unusedSubMixed": "",
|
||||
"library.used": "",
|
||||
"library.usedAgo": "",
|
||||
"loading": "Indlæser",
|
||||
"locations.locations": "Lokationer",
|
||||
"locations.newLocation": "Ny lokation",
|
||||
"locations.noLocation": "Ingen lokation",
|
||||
"locations.noLocationsHelp": "Denne side lader dig organisere dine spoler i lokationer, tilføj nogle spoler for at komme i gang!",
|
||||
"nav.labels": "",
|
||||
"nav.library": "",
|
||||
"no": "Nej",
|
||||
"notifications.error": "Fejl (statuskode: {{statusCode}})",
|
||||
"notifications.saveSuccessful": "Gemt!",
|
||||
"pagination.empty": "",
|
||||
"pagination.next": "",
|
||||
"pagination.pageSize": "",
|
||||
"pagination.perPage": "",
|
||||
"pagination.prev": "",
|
||||
"pagination.range": "",
|
||||
"printing.generic.columns": "Kolonner",
|
||||
"printing.generic.customSize": "Brugerdefineret",
|
||||
"printing.generic.description": "Redigér nedenstående indstillinger for at opnå det ønskede layout. Husk på at printere og dit operativsystem kan tilføje deres egne margener og skalering, så det kan kræve et par forsøg, før alt er korrekt. Test på et stykke almindeligt papir, før du udskriver på etiketter.",
|
||||
"printing.generic.dimensions": "Dimensioner",
|
||||
"printing.generic.gridTooWide": "",
|
||||
"printing.generic.helpMargin": "Margener bør indstilles til at matche din printer og papir. Ændringer her vil have indflydelse på hele layoutet.",
|
||||
"printing.generic.helpPrinterMargin": "\"Safe-Zone\" bør indstilles til hvor tæt på kanten af papiret din printer kan printe. Ændringer her vil IKKE have indflydelse på hele layoutet.",
|
||||
"printing.generic.horizontalSpacing": "Horisontal afstand",
|
||||
"printing.generic.itemCopies": "Kopier",
|
||||
"printing.generic.marginBottom": "Bund margen",
|
||||
"printing.generic.marginLeft": "Venstre margen",
|
||||
"printing.generic.marginRight": "Højre margen",
|
||||
"printing.generic.marginTop": "Top margen",
|
||||
"printing.generic.paperSize": "Papirstørrelse",
|
||||
"printing.generic.printerMarginBottom": "Safe-Zone bund",
|
||||
"printing.generic.printerMarginLeft": "Safe-Zone venstre",
|
||||
"printing.generic.printerMarginRight": "Safe-Zone højre",
|
||||
"printing.generic.printerMarginTop": "Safe-Zone top",
|
||||
"printing.generic.saveAsImage": "Gem som Billede",
|
||||
"printing.generic.skipItems": "Spring over",
|
||||
"printing.generic.verticalSpacing": "Vertikal afstand",
|
||||
"printing.qrcode.button": "Print etiketter",
|
||||
"printing.qrcode.customUrl.caveat": "",
|
||||
"printing.qrcode.customUrl.hint": "",
|
||||
"printing.qrcode.customUrl.label": "",
|
||||
"printing.qrcode.useHTTPUrl.label": "QR-kode link",
|
||||
"printing.qrcode.useHTTPUrl.options.custom": "",
|
||||
"printing.qrcode.useHTTPUrl.options.default": "Standard",
|
||||
"printing.qrcode.useHTTPUrl.options.url": "Webadresse",
|
||||
"printing.qrcode.useHTTPUrl.preview": "Forhåndsvisning:",
|
||||
"printing.qrcode.useHTTPUrl.tooltip": "Vil bruge proprietært link, der kun vil virke, hvis skannet med Spoolmans skanningsfunktion (standard). Webadressen bruger enten den basis-webadresse, specificeret i indstillinger, eller den nuværende sides webadresse, hvis ikke indstillet.",
|
||||
"printing.spoolSelect.selectedTotal_one": "{{count}} spole valgt",
|
||||
"printing.spoolSelect.selectedTotal_other": "{{count}} spoler valgt",
|
||||
"scanner.description": "Skan en Spoolman QR-kode for at se detaljer om spolen.",
|
||||
"scanner.error.inUse": "",
|
||||
"scanner.error.insecureContext": "Denne side er ikke sikret med HTTPS.",
|
||||
"scanner.error.notAllowed": "Du har ikke givet adgang til kameraet.",
|
||||
"scanner.error.notFound": "Intet kamera fundet.",
|
||||
"scanner.error.streamApiNotSupported": "Denne browser understøtter ikke MediaStream API'et.",
|
||||
"scanner.error.unknown": "En ukendt fejl opstod. {{error}}",
|
||||
"scanner.starting": "",
|
||||
"scanner.title": "QR-kode skanner",
|
||||
"search.colorHint": "",
|
||||
"search.noResults": "",
|
||||
"search.searching": "",
|
||||
"search.section.filaments": "",
|
||||
"search.section.spools": "",
|
||||
"search.section.vendors": "",
|
||||
"search.threshold": "",
|
||||
"search.unknownFilament": "",
|
||||
"settings.appearance.tab": "",
|
||||
"settings.appearance.theme.dark": "",
|
||||
"settings.appearance.theme.desc": "",
|
||||
"settings.appearance.theme.label": "",
|
||||
"settings.appearance.theme.light": "",
|
||||
"settings.appearance.theme.system": "",
|
||||
"settings.extraFields.addChoice": "",
|
||||
"settings.extraFields.addChoicesFirst": "",
|
||||
"settings.extraFields.addEntityField": "",
|
||||
"settings.extraFields.booleanFalse": "Nej",
|
||||
"settings.extraFields.booleanTrue": "Ja",
|
||||
"settings.extraFields.deleteConfirm": "Slet felt: {{name}}?",
|
||||
"settings.extraFields.description.constraints": "Når et felt er tilføjet kan du ikke redigere dens Nøgle eller Type, og for visse felttyper kan du ikke fjerne valg, eller ændre multi-valgstatus. Hvis du fjerner et felt, vil associeret data i alle poster blive slettet.",
|
||||
"settings.extraFields.description.intro": "Her kan du tilføje ekstra felter til dine poster.",
|
||||
"settings.extraFields.description.keyUsage": "Nøglen er hvad andre programmer læser/skriver data som, så hvis dit felt skal integreres med et tredjepartsprogram, skal du sørge for at indstille det korrekt. Standardværdi bliver kun tilføjet til nye felter.",
|
||||
"settings.extraFields.description.tableViews": "Ekstra felter kan ikke sorteres eller filtreres i oversigterne.",
|
||||
"settings.extraFields.editorEdit": "",
|
||||
"settings.extraFields.editorNew": "",
|
||||
"settings.extraFields.errors.choiceNeeded": "",
|
||||
"settings.extraFields.errors.choicesRemoved": "",
|
||||
"settings.extraFields.errors.deleteFailed": "",
|
||||
"settings.extraFields.errors.keyFormat": "",
|
||||
"settings.extraFields.errors.nameRequired": "",
|
||||
"settings.extraFields.errors.saveFailed": "",
|
||||
"settings.extraFields.fieldType.boolean": "Boolean (Ja/Nej)",
|
||||
"settings.extraFields.fieldType.choice": "Valg",
|
||||
"settings.extraFields.fieldType.datetime": "Dato-tid",
|
||||
"settings.extraFields.fieldType.float": "Decimaltal",
|
||||
"settings.extraFields.fieldType.floatRange": "Decimaltalspænd",
|
||||
"settings.extraFields.fieldType.integer": "Heltal",
|
||||
"settings.extraFields.fieldType.integerRange": "Heltalspænd",
|
||||
"settings.extraFields.fieldType.text": "Tekst",
|
||||
"settings.extraFields.max": "",
|
||||
"settings.extraFields.min": "",
|
||||
"settings.extraFields.multiSuffix": "",
|
||||
"settings.extraFields.multiple": "",
|
||||
"settings.extraFields.namePlaceholder": "",
|
||||
"settings.extraFields.nonUniqueKeyError": "Nøglen skal være Unik.",
|
||||
"settings.extraFields.none": "",
|
||||
"settings.extraFields.params.choices": "Valgmuligheder",
|
||||
"settings.extraFields.params.defaultValue": "Standardværdi",
|
||||
"settings.extraFields.params.fieldType": "Type",
|
||||
"settings.extraFields.params.key": "Nøgle",
|
||||
"settings.extraFields.params.name": "Navn",
|
||||
"settings.extraFields.params.order": "Sortering",
|
||||
"settings.extraFields.params.unit": "Enhed",
|
||||
"settings.extraFields.saveField": "",
|
||||
"settings.extraFields.tab": "Ekstra felter",
|
||||
"settings.general.baseUrl.label": "Basis-webadresse",
|
||||
"settings.general.baseUrl.tooltip": "Basis-webadressen til at benytte ved generering af funktioner, såsom QR-koder.",
|
||||
"settings.general.currency.desc": "",
|
||||
"settings.general.currency.label": "Valuta",
|
||||
"settings.general.roundPrices.label": "Afrund priser",
|
||||
"settings.general.roundPrices.tooltip": "Afrund priser til nærmeste heltal.",
|
||||
"settings.general.tab": "Generelt",
|
||||
"settings.header": "Indstillinger",
|
||||
"settings.language.desc": "",
|
||||
"settings.language.label": "",
|
||||
"settings.library.lowThreshold.desc": "",
|
||||
"settings.library.lowThreshold.label": "",
|
||||
"settings.library.tab": "",
|
||||
"spool.fields.archived": "Arkiveret",
|
||||
"spool.fields.comment": "Kommentar",
|
||||
"spool.fields.filament": "Filament",
|
||||
"spool.fields.firstUsed": "Først anvendt",
|
||||
"spool.fields.id": "ID",
|
||||
"spool.fields.lastUsed": "Sidst anvendt",
|
||||
"spool.fields.location": "Placering",
|
||||
"spool.fields.lotNr": "Partinummer",
|
||||
"spool.fields.material": "Materiale",
|
||||
"spool.fields.measuredWeight": "Målt vægt",
|
||||
"spool.fields.price": "Pris",
|
||||
"spool.fields.registered": "Registreret",
|
||||
"spool.fields.remainingWeight": "Resterende vægt",
|
||||
"spool.fields.usedWeight": "Brugt vægt",
|
||||
"spool.fieldsHelp.location": "Placering af spolen, hvis du opbevarer spoler flere steder.",
|
||||
"spool.fieldsHelp.lotNr": "Producentens \"batch/partinummer\". Kan bruges til at sikre ensartede farver ved brug af flere ruller.",
|
||||
"spool.fieldsHelp.measuredWeight": "Hvor meget filament og spole vejer.",
|
||||
"spool.fieldsHelp.price": "Pris for en fuld spole. Hvis ikke indstillet, vil prisen i stedet blive antaget.",
|
||||
"spool.fieldsHelp.remainingWeight": "Hvor meget filament er der tilbage på spolen. For en ny spole bør dette matche spolens vægt.",
|
||||
"spool.fieldsHelp.usedWeight": "Hvor meget filament er der brugt fra spolen. En ny spole bør have 0g brugt.",
|
||||
"spool.form.measurementType.length": "Længde",
|
||||
"spool.form.measurementType.weight": "Vægt",
|
||||
"spool.spool": "Spoler",
|
||||
"topbar.addSpools": "",
|
||||
"topbar.searchPlaceholder": "",
|
||||
"unknown": "Ukendt",
|
||||
"validation.hexDigits": "",
|
||||
"validation.maxChars": "",
|
||||
"validation.mustBeGt": "",
|
||||
"validation.mustBeMax": "",
|
||||
"validation.mustBeMin": "",
|
||||
"validation.mustBeNumber": "",
|
||||
"validation.required": "",
|
||||
"vendor.fields.comment": "Kommentar",
|
||||
"vendor.fields.emptySpoolWeight": "Tom Spolevægt",
|
||||
"vendor.fields.externalId": "Eksternt ID",
|
||||
"vendor.fields.id": "ID",
|
||||
"vendor.fields.name": "Navn",
|
||||
"vendor.fields.registered": "Registreret",
|
||||
"vendor.fieldsHelp.emptySpoolWeight": "Vægten af en tom spole fra denne producent.",
|
||||
"yes": "Ja"
|
||||
}
|
||||
@@ -0,0 +1,620 @@
|
||||
{
|
||||
"add.addAndNew": "Hinzufügen & neu",
|
||||
"add.addN_one": "{{count}} Spule hinzufügen",
|
||||
"add.addN_other": "{{count}} Spulen hinzufügen",
|
||||
"add.adding": "Hinzufügen...",
|
||||
"add.advanced": "Erweiterte Spezifikation",
|
||||
"add.advancedNote": "Dichte, Durchmesser, Temperaturen (autom. von Material gesetzt)",
|
||||
"add.change": "ändern",
|
||||
"add.count": "Anzahl",
|
||||
"add.createNew": "Erstelle ein neues Filament",
|
||||
"add.createNewSub": "nicht in deinem Katalog oder {{name}}",
|
||||
"add.dbUnavailable": "{{name}} nicht verfügbar",
|
||||
"add.duplicate": "duplizieren",
|
||||
"add.duplicateNote": "Spezifikationen, Hersteller und Preis wurden übernommen. Vergib einen neuen Namen und Farbe.",
|
||||
"add.duplicateRename": "Heißt Immer noch so wie das Original — Benenne es um, um sie voneinander unterscheiden zu können.",
|
||||
"add.duplicateTitle": "Neues Filament · Kopie von \"{{name}}\"",
|
||||
"add.filamentNamePlaceholder": "z.B. PolyTerra Matte Sage",
|
||||
"add.fill.full": "Voll",
|
||||
"add.fillLevel": "Füllstand",
|
||||
"add.importNote": "Wenn du Spulen hinzufügst, wird dieses Filament in deinen Katalog übernommen.",
|
||||
"add.inCatalog": "im Katalog",
|
||||
"add.locationHint": "Wo du physikalisch deine Spule aufbewahrst — ein Regal, eine Kiste, oder einen Drucker. Lasse es leer, wenn du sie alle an einem Platz aufbewahrst.",
|
||||
"add.locationPlaceholder": "z.B. Regal A, Trockenbox 2, Drucker 1",
|
||||
"add.manufacturerPlaceholder": "z.B. Polymaker",
|
||||
"add.nameHint": "Gib die Farbe mit an — Daran lässt sich dein Filament unterscheiden.",
|
||||
"add.newFilament": "neues Filament",
|
||||
"add.newFilamentTitle": "Neues Filament",
|
||||
"add.noCatalog": "Kein Filament in deinem Katalog",
|
||||
"add.noManufacturer": "Kein Hersteller",
|
||||
"add.pickColor": "Wähle eine Farbe",
|
||||
"add.searchPlaceholder": "Suche deinen Katalog und {{name}}...",
|
||||
"add.searching": "Suche...",
|
||||
"add.section.filament": "Filament",
|
||||
"add.section.filamentNote": "Das Produkt auf der Spule — ein Eintrag pro Farbe.",
|
||||
"add.section.manufacturer": "Hersteller",
|
||||
"add.section.manufacturerNote": "Wer das Filament herstellt. Einmal hinzugefügt, wird es für alle ihre Filamente wiederverwendet.",
|
||||
"add.section.spool": "Spule",
|
||||
"add.section.spoolNote": "Die physischen Spulen, die in deinen Bestand kommen.",
|
||||
"add.section.spoolSharedNote": "Gewicht, Spulengewicht und Preis werden ebenfalls als neuer Filament Standard gespeichert.",
|
||||
"add.spoolWeightPreset.cardboard": "Kartonspule {{weight}} g",
|
||||
"add.spoolWeightPreset.plastic": "Plastikspule {{weight}} g",
|
||||
"add.spoolWeightPresetsLead": "Gehe von einer typischen Spule aus:",
|
||||
"add.step2": "Schritt 2 - Spulendetails",
|
||||
"add.step2New": "Schritt 2 - Filament & Spulen Details",
|
||||
"add.summary_one": "{{count}} Spule",
|
||||
"add.summary_other": "{{count}} Spulen",
|
||||
"add.typeToSearchAll": "Tippe um nach tausenden von Filamenten zu suchen",
|
||||
"add.typeToSearchMatches": "Tippe um zu suchen — keine Treffer",
|
||||
"add.useExisting": "Verwende ein Bestehendes",
|
||||
"add.vendorHint.existing": "Verwende vorhandenen Hersteller \"{{name}}\"",
|
||||
"add.vendorHint.new": "Neuer Hersteller \"{{name}}\" wird erstellt",
|
||||
"add.vendorHint.optional": "Optional — leer lassen für keinen Hersteller",
|
||||
"add.weightPresets": "häufige Spulengrößen",
|
||||
"add.yourCatalog": "Dein Katalog",
|
||||
"buttons.apply": "Zustimmen",
|
||||
"buttons.archive": "Archiv",
|
||||
"buttons.cancel": "Abbrechen",
|
||||
"buttons.clear": "Bereinigen",
|
||||
"buttons.close": "Schließen",
|
||||
"buttons.delete": "Löschen",
|
||||
"buttons.edit": "Bearbeiten",
|
||||
"buttons.filter": "Filter",
|
||||
"buttons.save": "Speichern",
|
||||
"buttons.showArchived": "Archivierte anzeigen",
|
||||
"buttons.showNoSpools": "Zeige Filamente die keine Spulen haben",
|
||||
"buttons.unArchive": "Archivieren rückgängig machen",
|
||||
"changeFilament.action": "Ändern",
|
||||
"changeFilament.adoptWeight": "Setze das volle Gewicht dieser Spule auf {{full}}",
|
||||
"changeFilament.adoptWeightHelp": "Es wird als {{current}} aufgezeichnet, von dem Filament, das es zuvor hielt. Das verwendete Gewicht ({{used}}) bleibt in jedem Fall erhalten, sodass {{remaining}} übrig bleibt.",
|
||||
"changeFilament.apply": "Filament ändern",
|
||||
"changeFilament.applying": "Ändern...",
|
||||
"changeFilament.current": "aktuell",
|
||||
"changeFilament.done": "Filament geändert.",
|
||||
"changeFilament.failed": "Konnte das Filament nicht ändern.",
|
||||
"changeFilament.importNote": "Wenn du der Änderung zustimmst, wird dieses Filament deinem Katalog hinzugefügt.",
|
||||
"changeFilament.intro": "Spule #{{id}} behält ihre Nummer, Standort, Daten und Verbrauchshistorie — nur das Filament, das es hält, verändert sich.",
|
||||
"changeFilament.newTag": "neu",
|
||||
"changeFilament.next": "Ändere zu",
|
||||
"changeFilament.now": "Momentan",
|
||||
"changeFilament.pickBelow": "Wähle ein Filament von unten",
|
||||
"changeFilament.title": "Ändere Filament",
|
||||
"changeFilament.useExisting": "Wähle ein bestehendes Filament",
|
||||
"changeFilament.weightFollows": "Diese Spule hat selbst kein volles Gewicht, deshalb wird die des Filaments verwendet: {{full}}, damit bleiben {{remaining}} nachdem {{used}} verwendet wurden.",
|
||||
"changeVendor.action": "Ändern",
|
||||
"changeVendor.apply": "Ändere Hersteller",
|
||||
"changeVendor.applying": "Ändere...",
|
||||
"changeVendor.clearHint": "Belasse dieses Filament ohne Hersteller",
|
||||
"changeVendor.create": "Erstelle \"{{name}}\"",
|
||||
"changeVendor.createHint": "Bis jetzt noch keiner deiner Hersteller — er wird hinzugefügt",
|
||||
"changeVendor.current": "aktuell",
|
||||
"changeVendor.done": "Hersteller geändert.",
|
||||
"changeVendor.emptySpool": "Leere Spule {{value}}",
|
||||
"changeVendor.failed": "Konnte den Hersteller nicht ändern.",
|
||||
"changeVendor.intro": "\"{{name}}\" behält seine Spulen, seine Spezifikationen und die Historie — nur beim Hersteller ändern sich die Einträge.",
|
||||
"changeVendor.next": "Ändere zu",
|
||||
"changeVendor.noEmptySpool": "Kein leeres Spulengewicht",
|
||||
"changeVendor.noMatches": "Kein Hersteller gefunden",
|
||||
"changeVendor.none": "Keine Hersteller vorhanden",
|
||||
"changeVendor.noneNote": "Unter keiner Marke gespeichert",
|
||||
"changeVendor.now": "Momentan",
|
||||
"changeVendor.pickBelow": "Wähle einen Hersteller von unten",
|
||||
"changeVendor.searchPlaceholder": "Suche oder nenne einen Hersteller",
|
||||
"changeVendor.tareFollows": "Dieses Filament hat kein eigenes Leergewicht der Spule, also das seines Herstellers übernommen. Nach der Änderung beträgt es {{value}}, also das Gewicht einer leeren Spule, wenn man eine wiegt.",
|
||||
"changeVendor.tareGone": "Dieses Filament hat kein eigenes Spulenleergewicht und übernimmt das des Herstellers {{current}}. Nach der Änderung gibt es keins zu übernehmen, bis du dem Filament eines gibst.",
|
||||
"changeVendor.title": "Ändere Hersteller",
|
||||
"changeVendor.willBeCreated": "Wird erzeugt",
|
||||
"common.decrement": "Verringern",
|
||||
"common.increment": "Erhöhen",
|
||||
"common.remove": "Entfernen",
|
||||
"common.search": "Suchen",
|
||||
"dashboard.addFieldHint": "Füge in den Einstellungen ein Text- oder Auswahlfeld zu den Spulen hinzu, um auch danach gruppieren zu können",
|
||||
"dashboard.dashboard": "Verwaltung",
|
||||
"dashboard.deleteGroup": "Lösche Gruppe",
|
||||
"dashboard.dragHint": "Ziehe eine Spule auf eine andere Karte, um ihr {{field}} zu ändern, oder innerhalb einer Karte, um die Reihenfolge zu ändern",
|
||||
"dashboard.dropHere": "Spulen hier ablegen",
|
||||
"dashboard.emptyHelp": "Diese Seite gruppiert deine Spulen nach einem von dir gewählten Feld, füge ein paar Spulen hinzu, um zu starten!",
|
||||
"dashboard.errorEmptyName": "Name darf nicht leer sein",
|
||||
"dashboard.errorExists": "Eine Gruppe mit diesem Namen existiert bereits",
|
||||
"dashboard.errorRename": "Umbenennen der Gruppe fehlgeschlagen",
|
||||
"dashboard.lastUsed": "Zuletzt vor {{time}} benutzt",
|
||||
"dashboard.newGroup": "Neue Gruppe",
|
||||
"dashboard.newGroupName": "Neue Gruppe {{n}}",
|
||||
"dashboard.reorderGroup": "Ziehe um die Gruppe neu anzuordnen",
|
||||
"dashboard.spoolCount_one": "{{count}} Spule",
|
||||
"dashboard.spoolCount_other": "{{count}} Spulen",
|
||||
"dashboard.unassigned": "Nicht zugewiesen",
|
||||
"datetime.done": "Erledigt",
|
||||
"datetime.hour": "Stunde",
|
||||
"datetime.minute": "Minute",
|
||||
"datetime.nextMonth": "Nächster Monat",
|
||||
"datetime.now": "Jetzt",
|
||||
"datetime.pick": "Datum und Uhrzeit wählen",
|
||||
"datetime.prevMonth": "Vorheriger Monat",
|
||||
"datetime.time": "Zeit",
|
||||
"documentTitle.dashboard.list": "Verwaltung | Spoolman",
|
||||
"documentTitle.labels.list": "Etiketten | Spoolman",
|
||||
"documentTitle.library.list": "Bibliothek | Spoolman",
|
||||
"documentTitle.locations.list": "Orte | Spoolman",
|
||||
"documentTitle.settings.list": "Einstellungen | Spoolman",
|
||||
"filament.fields.addColor": "Farbe hinzufügen",
|
||||
"filament.fields.articleNumber": "Artikelnummer",
|
||||
"filament.fields.coaxial": "Coextrudiert",
|
||||
"filament.fields.colorHex": "Farbe",
|
||||
"filament.fields.colorType": "Farben Typ",
|
||||
"filament.fields.comment": "Kommentar",
|
||||
"filament.fields.density": "Dichte",
|
||||
"filament.fields.diameter": "Durchmesser",
|
||||
"filament.fields.externalId": "Externe ID",
|
||||
"filament.fields.id": "ID",
|
||||
"filament.fields.longitudinal": "Längs",
|
||||
"filament.fields.material": "Material",
|
||||
"filament.fields.multiColor": "Mehrfarbig",
|
||||
"filament.fields.name": "Name",
|
||||
"filament.fields.opacity": "Deckkraft",
|
||||
"filament.fields.price": "Preis",
|
||||
"filament.fields.registered": "Registriert",
|
||||
"filament.fields.removeColor": "Farbe entfernen",
|
||||
"filament.fields.settingsBedTemp": "Betttemperatur",
|
||||
"filament.fields.settingsExtruderTemp": "Extruder Temperatur",
|
||||
"filament.fields.singleColor": "Einfarbig",
|
||||
"filament.fields.spoolWeight": "Gewicht Spule",
|
||||
"filament.fields.vendor": "Hersteller",
|
||||
"filament.fields.weight": "Gewicht",
|
||||
"filament.fieldsHelp.articleNumber": "z.B. EAN, UPC o.Ä.",
|
||||
"filament.fieldsHelp.multiColorDirection": "Filamente können auf zwei Arten mehrere Farben haben: entweder durch Koextrusion, wie bei zweifarbigen Filamenten mit konsistenten Mehrfarben, oder durch Farbveränderungen in Längsrichtung, wie bei Gradient-Filamenten, welche die Farben entlang der Spule verschieben.",
|
||||
"filament.fieldsHelp.spoolWeight": "Das Gewicht der leeren Spule. Wird verwendet, um das gemessene Gewicht der Spule zu berechnen.",
|
||||
"filament.fieldsHelp.weight": "Das Gewicht einer vollen Spule (Nettogewicht). Sollte nicht das Gewicht der Spule, sondern nur dass des Filaments auf der Spule enthalten. Entspricht normalerweise dem Gewicht, das auf der Spule aufgedruckt ist.",
|
||||
"filament.filament": "Filamente",
|
||||
"footer.documentation": "Dokumentation",
|
||||
"footer.reportIssue": "Ein Problem melden",
|
||||
"help.help": "Hilfe",
|
||||
"inspector.addSpoolsOfThis": "Diese Spulen hinzufügen",
|
||||
"inspector.adjustFailed": "Anpassung des Gewichts fehlgeschlagen.",
|
||||
"inspector.adjustHelp": "Positiv verbraucht Filament, negativ fügt hinzu.",
|
||||
"inspector.adjustWeight": "Gewicht anpassen",
|
||||
"inspector.apply": "Zustimmen",
|
||||
"inspector.applying": "Zustimmen...",
|
||||
"inspector.colorHex": "Farbe hex",
|
||||
"inspector.consumeAmount": "Verbrauchsmenge:",
|
||||
"inspector.defaultFrom.filament": "{{value}} · Standard des Filaments",
|
||||
"inspector.defaultFrom.manufacturer": "{{value}} · Standard des Herstellers",
|
||||
"inspector.delete.deleting": "Löschen...",
|
||||
"inspector.delete.errorGone": "Es wurde bereits gelöscht.",
|
||||
"inspector.delete.errorSpoolsExist": "Kann das Filament nicht löschen — Spule ist in Benutzung.",
|
||||
"inspector.delete.errorUnknown": "Löschen fehlgeschlagen. Für Details, im ServerLog schauen..",
|
||||
"inspector.delete.filament": "Filament löschen",
|
||||
"inspector.delete.filamentBlockedHint": "Lösche diese Spulen zunächst. Archivieren ist nicht ausreichend.",
|
||||
"inspector.delete.filamentBlockedTitle": "Dieses Filament kann nicht gelöscht werden",
|
||||
"inspector.delete.filamentBlocked_one": "{{count}} Spule verwendet \"{{name}}\", inklusive Archivierter.",
|
||||
"inspector.delete.filamentBlocked_other": "{{count}} Spulen verwenden \"{{name}}\", inklusive Archivierter.",
|
||||
"inspector.delete.filamentBody": "“{{name}}” wird aus Deinem Katalog entfernt. Das kann nicht rückgängig gemacht werden.",
|
||||
"inspector.delete.filamentDone": "Filament gelöscht.",
|
||||
"inspector.delete.filamentTitle": "Dieses Filament löschen?",
|
||||
"inspector.delete.spool": "Spule löschen",
|
||||
"inspector.delete.spoolBody": "Spule #{{id}} von “{{name}}” wird gelöscht, gemeinsam mit ihrer Nutzungshistorie. Das kann nicht rückgängig gemacht werden.",
|
||||
"inspector.delete.spoolDone": "Spule gelöscht.",
|
||||
"inspector.delete.spoolRemaining": "Die Spule hat {{weight}} Filament übrig. Archiviere sie stattdessen, falls Du sie nur aus dem Weg haben möchtest.",
|
||||
"inspector.delete.spoolTitle": "Diese Spule löschen?",
|
||||
"inspector.delete.vendor": "Hersteller löschen",
|
||||
"inspector.delete.vendorBody": "\"{{name}}\" wird gelöscht. Das kann nicht rückgängig gemacht werden.",
|
||||
"inspector.delete.vendorDone": "Hersteller gelöscht.",
|
||||
"inspector.delete.vendorOrphans_one": "Das {{count}} Filament wird behalten, aber es bleibt ohne Hersteller.",
|
||||
"inspector.delete.vendorOrphans_other": "Die {{count}} Filamente werden behalten, aber sie bleiben ohne Hersteller.",
|
||||
"inspector.delete.vendorTitle": "Diesen Hersteller löschen?",
|
||||
"inspector.duplicateFilament": "Duplizieren",
|
||||
"inspector.empty": "Wähle eine Spule, ein Filament oder einen Hersteller aus der Liste, um Details dazu hier anzuzeigen.",
|
||||
"inspector.enterValidLength": "Gib eine valide Länge ein.",
|
||||
"inspector.enterValidWeight": "Gib ein valides Gewicht ein.",
|
||||
"inspector.loading": "Lade...",
|
||||
"inspector.manageExtraFields": "Felder bearbeiten",
|
||||
"inspector.measuredHelp": "Gesamtgewicht der Spule + übriges Filament, wie auf der Waage gemessen.",
|
||||
"inspector.multi": "mehrfach x{{count}}",
|
||||
"inspector.newGross": "Neues Bruttogewicht:",
|
||||
"inspector.noExtraFields": "Noch keine — füge deine eigenen Felder hinzu, um alles zu verfolgen, was Spoolman nicht tut.",
|
||||
"inspector.notFound": "Dieses Objekt konnte nicht gefunden werden. Es könnte gelöscht worden sein.",
|
||||
"inspector.ofRemaining": "von {{weight}} übrig · {{length}} m",
|
||||
"inspector.openFilament": "Filament öffnen",
|
||||
"inspector.openLink": "{{url}} in einem neuen Tab öffnen",
|
||||
"inspector.openManufacturer": "Hersteller öffnen",
|
||||
"inspector.override.byFilament": "Überschrieben durch dieses Filament · {{value}}",
|
||||
"inspector.override.bySpool": "Überschrieben durch diese Spule · {{value}}",
|
||||
"inspector.override.overridesFilament": "Überschreibt Filament · {{value}}",
|
||||
"inspector.override.overridesManufacturer": "Überschreibt Hersteller · {{value}}",
|
||||
"inspector.specs": "Spezifikationen — Direktbearbeitung",
|
||||
"inspector.spoolsCount": "Spulen · {{count}}",
|
||||
"inspector.spoolsTotalRemaining": "Gesamt {{weight}}",
|
||||
"inspector.used": "verwendet",
|
||||
"inspector.vendorSub_one": "{{count}} Filament",
|
||||
"inspector.vendorSub_other": "{{count}} Filamente",
|
||||
"kofi": "Schick mir ein Trinkgeld über Ko-fi",
|
||||
"labels.addHead": "Hinzufügen",
|
||||
"labels.addQr": "QR Code",
|
||||
"labels.addRect": "Rechteck",
|
||||
"labels.addSwatch": "Farbmuster",
|
||||
"labels.addText": "Text / Feld",
|
||||
"labels.align": "Ausrichten",
|
||||
"labels.alignCenter": "Mittig",
|
||||
"labels.alignLeft": "Links",
|
||||
"labels.alignRight": "Rechts",
|
||||
"labels.blank": "Du hast bisher kein Label Design.",
|
||||
"labels.bold": "Fettgedruckt",
|
||||
"labels.canvasHint": "Ziehen zum Verschieben · Klicken zum Auswählen · Eckpunkte zum Ändern der Größe.",
|
||||
"labels.centerLogo": "Zentriere Spoolman Logo",
|
||||
"labels.chooseField": "Wähle ein Feld aus...",
|
||||
"labels.clearFill": "Lösche Füllung (nur Rahmen)",
|
||||
"labels.copies": "Kopien",
|
||||
"labels.cornerRadiusMm": "Eckenradius",
|
||||
"labels.createFirst": "Erstelle Dein erstes Label",
|
||||
"labels.cutGuides": "Schnittlinie",
|
||||
"labels.deleteConfirm": "Dieses Label Design löschen?",
|
||||
"labels.deleteElement": "Element löschen",
|
||||
"labels.designName": "Name des Designs",
|
||||
"labels.designerDesc": "Erstelle QR-Code Etiketten mit beliebigen Spulen-, Filament-, oder Herstellerfeldern und drucke sie auf Papier oder mit einem Etikettendrucker. Die Designs werden auf dem Server gespeichert.",
|
||||
"labels.designerTitle": "Label Designer",
|
||||
"labels.dpi": "Auflösung",
|
||||
"labels.dpiHint": "Stelle deinen Drucker ein, um kleine Etiketten scharf zu halten: 203 dpi für die meisten Thermodrucker, 300 oder mehr für Laser- und Tintenstrahldrucker.",
|
||||
"labels.duplicate": "Duplizieren",
|
||||
"labels.exportDescAml": "Speichert für jedes ausgewählte Etikett eine .aml-Datei, jeweils {{w}}×{{h}} mm. Kann in den LPAPI-basierten Apps geöffnet werden, die mit den meisten Thermodruckern geliefert werden und die physische Größe aus der Datei lesen.",
|
||||
"labels.exportDescPng": "Speichert ein PNG-Bild pro ausgewähltem Label, jeweils {{w}}×{{h}} mm.",
|
||||
"labels.exportFormat": "Dateiformat",
|
||||
"labels.exportFormatOptions.aml": "AML Label Datei",
|
||||
"labels.exportFormatOptions.png": "PNG Bild",
|
||||
"labels.fields.bedTemp": "Druckbetttemperatur",
|
||||
"labels.fields.diameterMm": "Durchmesser (mm)",
|
||||
"labels.fields.groupVendor": "Verkäufer",
|
||||
"labels.fields.initialG": "Initial Gewicht (g)",
|
||||
"labels.fields.netWeightG": "Nettogewicht (g)",
|
||||
"labels.fields.remainingG": "Verbleibend (g)",
|
||||
"labels.filamentsSelected_one": "{{count}} Filament ausgewählt",
|
||||
"labels.filamentsSelected_other": "{{count}} Filamente ausgewählt",
|
||||
"labels.fill": "Füllen",
|
||||
"labels.fitWidth": "Breite an Spalten anpassen",
|
||||
"labels.fitWidthHint": "Setzt die Breite der Etiketten so, dass die ausgewählte Anzahl an Spalten die Seite ausfüllt.",
|
||||
"labels.fontMm": "Schriftart",
|
||||
"labels.gridInfo": "{{cols}} × {{rows}} = {{perPage}} Etiketten / Seite",
|
||||
"labels.hMm": "H",
|
||||
"labels.heightMm": "Höhe",
|
||||
"labels.hintNowrap": "Text bleibt in einer Zeile; alles, was über die Breite hinausgeht, wird abgeschnitten.",
|
||||
"labels.hintSwatch": "Wird mit den Filamentfarbe(n) der Spule zum Druckzeitpunkt gefüllt.",
|
||||
"labels.hintWrap": "Umhülle ein Feld, um es zu verbergen, wenn es leer ist:",
|
||||
"labels.imageDesc": "",
|
||||
"labels.imageZipNote": "Mehr als {{threshold}} Etiketten werden als eine einzige zip Datei geliefert.",
|
||||
"labels.insertField": "Feld hinzufügen",
|
||||
"labels.kind.qr": "QR Code",
|
||||
"labels.kind.rect": "Rechteck",
|
||||
"labels.kind.swatch": "Farbmuster",
|
||||
"labels.kind.text": "Text",
|
||||
"labels.labelSize": "Größe des Etiketts",
|
||||
"labels.labelType": "Art des Etiketts",
|
||||
"labels.layout": "Layout",
|
||||
"labels.modeImage": "Dateien",
|
||||
"labels.modeLabel": "Etikettendrucker",
|
||||
"labels.modeSheet": "Blatt (Kachel)",
|
||||
"labels.new": "Neu",
|
||||
"labels.newText": "Neuer Text",
|
||||
"labels.noDesignsOption": "Noch keine Designs",
|
||||
"labels.noFilaments": "Keine Filamente.",
|
||||
"labels.noSpools": "Keine Spulen.",
|
||||
"labels.onePerLabel": "Eine {{w}}×{{h}} mm Seite pro Etikett.",
|
||||
"labels.preparing": "Bereite vor...",
|
||||
"labels.preview": "Vorschau",
|
||||
"labels.previewWith": "Vorschau mit",
|
||||
"labels.printN_one": "{{count}} Etikett drucken",
|
||||
"labels.printN_other": "{{count}} Etiketten drucken",
|
||||
"labels.radiusMm": "Radius",
|
||||
"labels.sampleData": "Beispieldaten",
|
||||
"labels.saveAsFormat": "Speichern als {{format}}",
|
||||
"labels.saved": "Gespeichert",
|
||||
"labels.saving": "Speichere...",
|
||||
"labels.searchFilaments": "Filamente suchen...",
|
||||
"labels.searchSpools": "Spulen suchen...",
|
||||
"labels.selectAllShort": "Alle",
|
||||
"labels.selectAtLeastOne": "Wähle mindestens eine Spule.",
|
||||
"labels.selectAtLeastOneFilament": "Wähle mindestens ein Filament.",
|
||||
"labels.selectDesign": "Wähle Label Design",
|
||||
"labels.selectElement": "Wähle ein Element aus, um es zu bearbeiten, oder füge eines aus der Palette hinzu.",
|
||||
"labels.selectNoneShort": "Keine",
|
||||
"labels.selectRecentHint": "Wähle alle Spulen, die in den letzten 24 Stunden hinzugefügt wurden",
|
||||
"labels.selectRecentShort": "Kürzlich ({{count}})",
|
||||
"labels.showingFilament": "Zeige Filament #{{id}}",
|
||||
"labels.showingReal": "Echte Spulendaten anzeigen.",
|
||||
"labels.showingSpool": "Zeige Spule #{{id}}",
|
||||
"labels.showingTags": "Felder werden als Tags angezeigt, bis du oben eine Spule auswählst.",
|
||||
"labels.sizeMm": "Größe",
|
||||
"labels.skipHint": "Mit 'Objekt überspringen' werden so viele Zellen vor dem ersten Etikett leer gelassen, dass du ein teilweise benutztes Blatt wiederverwenden kannst: Zähle die Etiketten, die schon abgezogen wurden, von oben nach unten und von links nach rechts.",
|
||||
"labels.sortHint": "Sortiere Spulen",
|
||||
"labels.sortId": "#",
|
||||
"labels.sortNewest": "Neueste",
|
||||
"labels.stroke": "Rahmen",
|
||||
"labels.strokeMm": "Rahmen",
|
||||
"labels.tabDesign": "Design",
|
||||
"labels.tabPrint": "Drucken",
|
||||
"labels.textTemplate": "Text / Vorlage",
|
||||
"labels.typeFilament": "'Filamen",
|
||||
"labels.typeHint": "Filament-Etiketten lassen spool-only-Felder weg, und ihr QR-Code verlinkt zum Filament statt zu einer Spule.",
|
||||
"labels.typeSpool": "Spule",
|
||||
"labels.unknownFilament": "Unbekanntes Filament",
|
||||
"labels.wMm": "B",
|
||||
"labels.widthMm": "Breite",
|
||||
"labels.wrapText": "Zeilenumbruch",
|
||||
"labels.xMm": "X",
|
||||
"labels.yMm": "Y",
|
||||
"library.apiError": "Konnte die Spoolman API nicht erreichen. Läuft das Backend?",
|
||||
"library.collapseGroup": "Verstecke diese Spulen",
|
||||
"library.dateFilter.ago": "vor {{span}}",
|
||||
"library.dateFilter.between": "{{from}} – {{to}}",
|
||||
"library.dateFilter.customRange": "Benutzerdefinierter Bereich",
|
||||
"library.dateFilter.from": "Von",
|
||||
"library.dateFilter.last": "Letzte {{span}}",
|
||||
"library.dateFilter.never": "Nie",
|
||||
"library.dateFilter.olderThan": "Älter als {{span}}",
|
||||
"library.dateFilter.since": "Seit {{date}}",
|
||||
"library.dateFilter.to": "Bis (optional)",
|
||||
"library.dateFilter.until": "Bis {{date}}",
|
||||
"library.emptyBody": "Füge deine erste Spule hinzu, um dein Filament zu verfolgen.",
|
||||
"library.emptyFiltered": "Keine {{unit}} passen zu den aktuellen Filtern.",
|
||||
"library.emptyTitle": "Noch keine Spulen",
|
||||
"library.expandGroup": "Zeige diese Spulen",
|
||||
"library.filterBy": "Filtern nach",
|
||||
"library.groupBy": "Gruppieren",
|
||||
"library.groupNone": "Keine (flach)",
|
||||
"library.groupSpools_one": "{{count}} Spule",
|
||||
"library.groupSpools_other": "{{count}} Spulen",
|
||||
"library.nUnused": "×{{count}} unbenutzt",
|
||||
"library.noLocation": "kein Ort",
|
||||
"library.noSpools": "Keine Spulen",
|
||||
"library.noValues": "Keine Werte",
|
||||
"library.openGroup": "Öffne {{name}}",
|
||||
"library.openManufacturer": "Öffne Hersteller {{name}}",
|
||||
"library.resizeList": "Größe der Liste ändern (doppelklicken zum Zurücksetzen)",
|
||||
"library.reverseSort": "Sortierreihenfolge umkehren",
|
||||
"library.section.extra": "Zusätzliche Felder",
|
||||
"library.section.filament": "Filament",
|
||||
"library.section.spool": "Spule",
|
||||
"library.section.vendor": "Hersteller",
|
||||
"library.showMore": "zeige {{count}} mehr",
|
||||
"library.sort.nozzle": "Düsen Temperatur",
|
||||
"library.sortBy": "Sortieren",
|
||||
"library.unassigned": "nicht zugewiesen",
|
||||
"library.unitGroups": "Guppen",
|
||||
"library.unitSpools": "Spulen",
|
||||
"library.unused": "ungenutzt",
|
||||
"library.unusedGroup": "{{count}} unbenutzt · {{weight}} g jede",
|
||||
"library.unusedGroupMixed": "{{count}} unbenutzt",
|
||||
"library.unusedSub": "jede {{weight}} g · {{location}}",
|
||||
"library.unusedSubMixed": "{{location}}",
|
||||
"library.used": "verbraucht",
|
||||
"library.usedAgo": "vor {{time}} verwendet",
|
||||
"loading": "Läd",
|
||||
"locations.locations": "Orte",
|
||||
"locations.newLocation": "Neuer Ort",
|
||||
"locations.noLocation": "Kein Ort",
|
||||
"locations.noLocationsHelp": "Diese Seite lässt Sie Ihre Spulen zu Orten zuweisen, fügen Sie ein paar Spulen hinzu um loszulegen!",
|
||||
"nav.labels": "Labels",
|
||||
"nav.library": "Bibliothek",
|
||||
"no": "Nein",
|
||||
"notifications.error": "Fehler (status code: {{statusCode}})",
|
||||
"notifications.saveSuccessful": "Erfolgreich gespeichert!",
|
||||
"pagination.empty": "Keine {{unit}}",
|
||||
"pagination.next": "Nächste Seite",
|
||||
"pagination.pageSize": "Seitengröße",
|
||||
"pagination.perPage": "{{size}} / Seite",
|
||||
"pagination.prev": "vorherige Seite",
|
||||
"pagination.range": "{{from}}–{{to}} von {{total}} {{unit}}",
|
||||
"printing.generic.columns": "Spalten",
|
||||
"printing.generic.customSize": "Benutzerdefiniert",
|
||||
"printing.generic.description": "Passe die Einstellungen unten an, um das gewünschte Drucklayout zu bekommen. Denk daran, dass Drucker und dein OS eigene Abstände und Skalierungen anwenden könnte, also musst du vielleicht ein bisschen ausprobieren, bis alles passt. Teste es auf einem normalen Blatt Papier, bevor du auf die richtigen Labels druckst.",
|
||||
"printing.generic.dimensions": "Dimensionen",
|
||||
"printing.generic.gridTooWide": "Die Etiketten sind breiter als die Seite. Reduziere die Anzahl der Spalten, den Abstand oder die Ränder.",
|
||||
"printing.generic.helpMargin": "Abstände sollten so konfiguriert werden, dass sie zum Papier und Drucker passen. Änderungen beeinflussen die Abmessungen des gesamten Gitters.",
|
||||
"printing.generic.helpPrinterMargin": "Der Sicherheitsabstand sollte so eingestellt werden, wie dicht der Drucker am Rand des Papiers drucken kann. Änderungen beeinflussen nicht die Abmessungen des Gitters.",
|
||||
"printing.generic.horizontalSpacing": "Horizontaler Abstand",
|
||||
"printing.generic.itemCopies": "Anzahl der Kopien",
|
||||
"printing.generic.marginBottom": "Abstand Unten",
|
||||
"printing.generic.marginLeft": "Abstand Links",
|
||||
"printing.generic.marginRight": "Abstand Rechts",
|
||||
"printing.generic.marginTop": "Abstand Oben",
|
||||
"printing.generic.paperSize": "Papiergröße",
|
||||
"printing.generic.printerMarginBottom": "Sicherheitsabstand Unten",
|
||||
"printing.generic.printerMarginLeft": "Sicherheitsabstand Links",
|
||||
"printing.generic.printerMarginRight": "Sicherheitsabstand Rechts",
|
||||
"printing.generic.printerMarginTop": "Sicherheitsabstand Oben",
|
||||
"printing.generic.saveAsImage": "Als Bild speichern",
|
||||
"printing.generic.skipItems": "Objekt überspringen",
|
||||
"printing.generic.verticalSpacing": "Vertikaler Abstand",
|
||||
"printing.qrcode.button": "Beschriftung drucken",
|
||||
"printing.qrcode.customUrl.caveat": "Eine benutzerdefinierte URL wird nicht zurück in Spoolman gescannt – benutze sie, um einen gedruckten QR-Code auf eine externe App oder einen anderen Host zu verweisen.",
|
||||
"printing.qrcode.customUrl.hint": "Setze die Spulen Id irgendwo mit dem Platzhalter ein",
|
||||
"printing.qrcode.customUrl.label": "Benutzerdefinierte URL-Vorlage",
|
||||
"printing.qrcode.useHTTPUrl.label": "QR Code Link",
|
||||
"printing.qrcode.useHTTPUrl.options.custom": "Benutzerdefinierte URL",
|
||||
"printing.qrcode.useHTTPUrl.options.default": "Standard",
|
||||
"printing.qrcode.useHTTPUrl.options.url": "URL",
|
||||
"printing.qrcode.useHTTPUrl.preview": "Vorschau:",
|
||||
"printing.qrcode.useHTTPUrl.tooltip": "Die Standardeinstellung verwendet einen proprietären Link, der nur funktioniert, wenn er mit der Scanfunktion von Spoolman gescannt wird. URL verwendet entweder die in den Einstellungen angegebene Basis-URL oder wenn diese nicht festgelegt ist die aktuelle Seiten-URL.",
|
||||
"printing.spoolSelect.selectedTotal_one": "{{count}} Spule ausgewählt",
|
||||
"printing.spoolSelect.selectedTotal_other": "{{count}} Spulen ausgewählt",
|
||||
"scanner.description": "Spoolman QR-Code scannen, um Details der Spule anzuzeigen.",
|
||||
"scanner.error.inUse": "Die Kamera wird bereits von einer anderen Anwendung genutzt.",
|
||||
"scanner.error.insecureContext": "Die Seite wird nicht über HTTPS bereitgestellt.",
|
||||
"scanner.error.notAllowed": "Zugriff auf Kamera wurde nicht erlaubt.",
|
||||
"scanner.error.notFound": "Keine Kamera gefunden.",
|
||||
"scanner.error.streamApiNotSupported": "Der Browser unterstützt die MediaStream API nicht.",
|
||||
"scanner.error.unknown": "Ein unbekannter Fehler ist aufgetreten. ({{error}})",
|
||||
"scanner.starting": "Starte Kamera…",
|
||||
"scanner.title": "QR-Code Scanner",
|
||||
"search.colorHint": "Farbnamen müssen in englisch eingegeben werden.",
|
||||
"search.moreSpools": "+{{count}} mehr",
|
||||
"search.noResults": "Keine Treffer gefunden",
|
||||
"search.searching": "Suchen…",
|
||||
"search.section.filaments": "Filamente",
|
||||
"search.section.spools": "Spulen",
|
||||
"search.section.vendors": "Hersteller",
|
||||
"search.threshold": "Farbtreffer",
|
||||
"search.unknownFilament": "Unbekanntes Filament",
|
||||
"settings.appearance.tab": "Darstellung",
|
||||
"settings.appearance.theme.dark": "Dunkel",
|
||||
"settings.appearance.theme.desc": "Farbschema (nur dieser Browser)",
|
||||
"settings.appearance.theme.label": "Schema",
|
||||
"settings.appearance.theme.light": "Hell",
|
||||
"settings.appearance.theme.system": "System",
|
||||
"settings.extraFields.addChoice": "Option hinzufügen…",
|
||||
"settings.extraFields.addChoicesFirst": "Füge zuerst Optionen hinzu",
|
||||
"settings.extraFields.addEntityField": "Feld {{entity}} hinzufügen",
|
||||
"settings.extraFields.booleanFalse": "Nein",
|
||||
"settings.extraFields.booleanTrue": "Ja",
|
||||
"settings.extraFields.deleteConfirm": "Feld {{name}} des Objekts {{entity}} löschen?",
|
||||
"settings.extraFields.description.constraints": "Nach dem Hinzufügen eines Feldes können Sie dessen Schlüssel oder Typ nicht mehr ändern, und bei Auswahlfeldern können Sie keine Auswahlmöglichkeiten entfernen oder den Mehrfachauswahlstatus ändern. Wenn Sie ein Feld entfernen, werden die zugehörigen Daten für alle Elemente gelöscht.",
|
||||
"settings.extraFields.description.intro": "Hier können Sie zusätzliche benutzerdefinierte Felder zu Ihren Elementen hinzufügen.",
|
||||
"settings.extraFields.description.keyUsage": "Der Schlüssel ist derjenige, unter dem andere Programme die Daten lesen/schreiben, wenn Ihr benutzerdefiniertes Feld also mit einem Programm eines Drittanbieters integriert werden soll, stellen Sie sicher, dass Sie ihn richtig einstellen. Der Standardwert wird nur auf neue Elemente angewendet.",
|
||||
"settings.extraFields.description.tableViews": "Zusätzliche Felder können in den Tabellenansichten nicht sortiert oder gefiltert werden.",
|
||||
"settings.extraFields.editorEdit": "Feld {{entity}} bearbeiten",
|
||||
"settings.extraFields.editorNew": "Neues Feld {{entity}}",
|
||||
"settings.extraFields.errors.choiceNeeded": "Auswahlfelder brauchen mindestens eine Auswahlmöglichkeit.",
|
||||
"settings.extraFields.errors.choicesRemoved": "Bestehende Optionen können nicht entfernt werden: {{choices}}.",
|
||||
"settings.extraFields.errors.deleteFailed": "Feld konnte nicht gelöscht werden.",
|
||||
"settings.extraFields.errors.keyFormat": "Der Schlüssel darf nur Kleinbuchstaben, Zahlen und Unterstriche enthalten.",
|
||||
"settings.extraFields.errors.nameRequired": "Name wird benötigt.",
|
||||
"settings.extraFields.errors.saveFailed": "Feld konnte nicht gespeichert werden.",
|
||||
"settings.extraFields.fieldType.boolean": "Wahr/Falsch",
|
||||
"settings.extraFields.fieldType.choice": "Auswahl",
|
||||
"settings.extraFields.fieldType.datetime": "Datum und Uhrzeit",
|
||||
"settings.extraFields.fieldType.float": "Dezimalzahl",
|
||||
"settings.extraFields.fieldType.floatRange": "Float-Bereich",
|
||||
"settings.extraFields.fieldType.integer": "Ganze Zahl",
|
||||
"settings.extraFields.fieldType.integerRange": "Ganzzahlbereich",
|
||||
"settings.extraFields.fieldType.text": "Text",
|
||||
"settings.extraFields.max": "max",
|
||||
"settings.extraFields.min": "min",
|
||||
"settings.extraFields.multiSuffix": " ·· multi",
|
||||
"settings.extraFields.multiple": "Mehrere",
|
||||
"settings.extraFields.namePlaceholder": "Anzeigename",
|
||||
"settings.extraFields.nonUniqueKeyError": "Der Schlüssel muss einzigartig sein.",
|
||||
"settings.extraFields.none": "Noch keine zusätzlichen {{entity}} Felder definiert.",
|
||||
"settings.extraFields.params.choices": "Auswahlmöglichkeiten",
|
||||
"settings.extraFields.params.defaultValue": "Standardwert",
|
||||
"settings.extraFields.params.fieldType": "Typ",
|
||||
"settings.extraFields.params.key": "Schlüssel",
|
||||
"settings.extraFields.params.name": "Name",
|
||||
"settings.extraFields.params.order": "Reihenfolge",
|
||||
"settings.extraFields.params.unit": "Einheit",
|
||||
"settings.extraFields.reorderChoice": "Ziehen oder benutze die Pfeiltasten, um diese Auswahl neu zu ordnen.",
|
||||
"settings.extraFields.saveField": "Feld speichern",
|
||||
"settings.extraFields.tab": "Extra Felder",
|
||||
"settings.general.baseUrl.label": "Basis URL",
|
||||
"settings.general.baseUrl.tooltip": "Die basis URL für die Generierung von Funktionen wie QR Codes.",
|
||||
"settings.general.currency.desc": "Dreistelliger ISO Code (z.B. EUR, USD) der für Preise genutzt wird",
|
||||
"settings.general.currency.label": "Währung",
|
||||
"settings.general.roundPrices.label": "Gerundeter Preis",
|
||||
"settings.general.roundPrices.tooltip": "Rundet die Preise auf die nächsthöhere ganze Zahl.",
|
||||
"settings.general.tab": "Allgemein",
|
||||
"settings.header": "Einstellungen",
|
||||
"settings.language.desc": "Benutzeroberflächensprache (nur für diesen Browser)",
|
||||
"settings.language.label": "Sprache",
|
||||
"settings.library.lowThreshold.desc": "Spulen mit diesem Gewicht oder weniger werden rot markiert (nur in diesem Browser)",
|
||||
"settings.library.lowThreshold.label": "Niedriger Lagerbestand Schwelle",
|
||||
"settings.library.tab": "Bibliotheksverhalten",
|
||||
"settings.scanner.autoNavigate.desc": "Navigiere automatisch in diesem Webbrowser zu einer Spule, die von einem Tag Lesegerät gelesen wird.",
|
||||
"settings.scanner.autoNavigate.label": "Auto-Navigation",
|
||||
"settings.scanner.docs": "Wie man einen Tag Leser einrichtet",
|
||||
"settings.scanner.lastSeen": "vor {{when}}",
|
||||
"settings.scanner.pair": "Zum Koppeln tippen",
|
||||
"settings.scanner.reader.anyDesc": "Scans von jedem Leser, öffnet Spulen in diesem Webbrowser. Wenn du mehr Kontrolle willst, kannst du dich mit einem bestimmten koppeln. Das ist auch der Leser, der verwendet wird, um neue Tags zu Spulen hinzuzufügen.",
|
||||
"settings.scanner.reader.label": "Tag Leser",
|
||||
"settings.scanner.reader.pairedDesc": "Nur Scans von diesem Leser öffnen Spulen in diesem Webbrowser.",
|
||||
"settings.scanner.recent": "Kürzliche Leser",
|
||||
"settings.scanner.recentNone": "Kein Leser im Speicher, richte einen Tag Leser ein und lese dann einen beliebigen Tag, damit er hier erscheint.",
|
||||
"settings.scanner.tab": "Tag Scannen",
|
||||
"settings.scanner.unpair": "Benutze irgendeinen Leser",
|
||||
"settings.scanner.use": "Benutze diesen",
|
||||
"settings.scanner.waiting": "Tippe auf einen beliebigen Tag auf dem Leser, den du möchtest...",
|
||||
"sponsor": "Unterstütze mich auf GitHub",
|
||||
"spool.fields.archived": "Archiviert",
|
||||
"spool.fields.comment": "Kommentar",
|
||||
"spool.fields.filament": "Filament",
|
||||
"spool.fields.firstUsed": "Erste Verwendung",
|
||||
"spool.fields.id": "ID",
|
||||
"spool.fields.lastUsed": "Letzte Verwendung",
|
||||
"spool.fields.location": "Ort",
|
||||
"spool.fields.lotNr": "Chargennummer",
|
||||
"spool.fields.material": "Material",
|
||||
"spool.fields.measuredWeight": "Gemessenes Gewicht",
|
||||
"spool.fields.price": "Preis",
|
||||
"spool.fields.registered": "Registriert",
|
||||
"spool.fields.remainingWeight": "Verbleibendes Gewicht",
|
||||
"spool.fields.spoolWeight": "Spulengewicht",
|
||||
"spool.fields.usedWeight": "Verbrauchtes Gewicht",
|
||||
"spool.fields.weight": "Gewicht",
|
||||
"spool.fieldsHelp.location": "Ort, an dem die Spule gelagert wird.",
|
||||
"spool.fieldsHelp.lotNr": "Chargennummer des Herstellers. Kann verwendet werden um gleichmäßige Farben zu garantieren, wenn mehrere Spulen verwendet werden.",
|
||||
"spool.fieldsHelp.measuredWeight": "Gesamtgewicht von Spule und Filament.",
|
||||
"spool.fieldsHelp.price": "Preis einer vollen Spule. Falls nicht ausgewählt, wird der Preis des Filaments geschätzt.",
|
||||
"spool.fieldsHelp.remainingWeight": "Wie viel Filament noch auf der Spule ist. Entspricht dem auf der Spule angegeben Nettogewicht, wenn die Spule neu ist.",
|
||||
"spool.fieldsHelp.spoolWeight": "Was diese Spule wiegt, wenn sie leer ist. Lasse es leer, um das Gewicht der Spule (Filament) zu nehmen, und stelle es ein, wenn diese spezielle Spule anders ist – eine neu aufgewickelte Spule oder eine Pappspule, die gegen einen Plastikspule getauscht wurde. Das ist das, was vom gewogenen Gewicht abgezogen wird, wenn du es nach gemessenem Gewicht anpasst, also gibt ein falsches Spulengewicht einen falschen Wert, wie viel Filament noch übrig ist.",
|
||||
"spool.fieldsHelp.usedWeight": "Wie viel Gewicht bereits verbraucht wurde z.B. 0g für eine neue Spule.",
|
||||
"spool.fieldsHelp.weight": "Wie viel Filament diese Spule hatte, als sie voll war (Nettogewicht, ohne die Spule selbst). Lasse es leer, um das Gewicht der Spule (Filament) zu nehmen, und trage es ein, wenn diese spezielle Spule anders ist – eine partielle Spule oder dasselbe Filament auf einer größeren Spule gekauft.",
|
||||
"spool.form.measurementType.length": "Länge",
|
||||
"spool.form.measurementType.weight": "Gewicht",
|
||||
"spool.spool": "Spulen",
|
||||
"tags.add": "Tag hinzufügen",
|
||||
"tags.added": "Tag verlinkt.",
|
||||
"tags.addedOn": "Hinzugefügt {{date}}",
|
||||
"tags.modal.alreadyHere": "Dieser Tag kennzeichnet diese Spule bereits.",
|
||||
"tags.modal.badUid": "Eine Tag UID ist hexadezimal, wie 04A2B3C4.",
|
||||
"tags.modal.checking": "Prüfen…",
|
||||
"tags.modal.failed": "Konnte den Tag nicht verknüpfen.",
|
||||
"tags.modal.free": "Dieser Tag ist noch mit nichts verbunden.",
|
||||
"tags.modal.intro": "Wenn du diesen Tag auf einem Reader antippst, findest du dann Spule #{{id}}.",
|
||||
"tags.modal.lastSeenOn": "{{reader}} zuletzt gelesen {{uid}}.",
|
||||
"tags.modal.link": "Verbinde Tag",
|
||||
"tags.modal.linking": "Verbinden…",
|
||||
"tags.modal.move": "Verschiebe es hierher von #{{id}}",
|
||||
"tags.modal.moveFailed": "Konnte den Tag nicht verschieben. Er ist nun möglicherweise mit keiner Spule verbunden – versuche ihn erneut zu verlinken.",
|
||||
"tags.modal.moving": "Verschieben…",
|
||||
"tags.modal.phoneReading": "Halte den Tag an dein Handy...",
|
||||
"tags.modal.phoneScan": "Lese den Tag mit deinem Handy",
|
||||
"tags.modal.spoolNamed": "Spule #{{id}}, {{name}}",
|
||||
"tags.modal.spoolShort": "Spule #{{id}}",
|
||||
"tags.modal.takenBy": "Derzeit mit {{spool}} verbunden.",
|
||||
"tags.modal.title": "Verbinde einen Tag",
|
||||
"tags.modal.uidHelp": "Trennzeichen und Großschreibung machen keinen Unterschied: 04:a2:b3:c4, 04-A2-B3-C4 und 04a2b3c4 sind alle derselbe Tag.",
|
||||
"tags.modal.uidLabel": "Tag UID",
|
||||
"tags.modal.uidPlaceholder": "04A2B3C4",
|
||||
"tags.modal.useLastSeen": "Benutze es",
|
||||
"tags.modal.waitingAny": "Warte auf ein Tippen auf einem beliebigen Leser.",
|
||||
"tags.modal.waitingOn": "Warte auf ein Tippen auf {{reader}}.",
|
||||
"tags.moved": "Tag wurde von Spule #{{id}} hierher verschoben.",
|
||||
"tags.nfc.insecureContext": "Das Lesen von Tags erfordert eine sichere Verbindung. Öffne Spoolman über HTTPS, um das NFC deines Handy zu nutzen.",
|
||||
"tags.nfc.notAllowed": "Diese Seite darf NFC nicht verwenden. Gewähre ihr die Erlaubnis in den Seiten Einstellungen deines Browsers und versuche es erneut.",
|
||||
"tags.nfc.notReadable": "Der NFC-Leser ist nicht verfügbar — eine andere App könnte ihn gerade benutzen.",
|
||||
"tags.nfc.notSupported": "Dieses Handy hat kein NFC oder NFC ist in den Systemeinstellungen ausgeschaltet.",
|
||||
"tags.nfc.unknown": "Konnte keinen Tag lesen.",
|
||||
"tags.none": "Keine Tag's verbunden.",
|
||||
"tags.scan.unknown": "Unbekannter Tag {{uid}}. Öffne die zugehörige Spule und benutze „Tag hinzufügen“, um ihn zu verknüpfen.",
|
||||
"tags.section": "Tag's",
|
||||
"tags.unlink": "Verknüpfung aufheben",
|
||||
"tags.unlinkBody": "Tag {{uid}} wird stoppen, diese Spule zu identifizieren. Nichts wird direkt auf dem Tag selbst geschrieben, daher kannst du ihn jederzeit wieder — mit dieser Spule oder einer Anderen — verknüpfen.",
|
||||
"tags.unlinkFailed": "Konnte die Verbindung des Tag's nicht entfernen.",
|
||||
"tags.unlinkTitle": "Verbindung für diesen Tag aufheben?",
|
||||
"tags.unlinked": "Verbindung des Tag's aufgehoben.",
|
||||
"tags.unlinking": "Verbindung aufheben…",
|
||||
"topbar.addSpools": "Spulen hinzufügen",
|
||||
"topbar.searchPlaceholder": "Suchen — versuche \"rot\" oder \"pla\"",
|
||||
"unknown": "Unbekannt",
|
||||
"validation.hexDigits": "Benutze 6 oder 8 hexadezimal Stellen",
|
||||
"validation.maxChars": "Höchstens {{max}} Zeichen",
|
||||
"validation.mustBeGt": "Muss größer als {{value}} sein",
|
||||
"validation.mustBeMax": "Muss {{value}}, oder weniger sein",
|
||||
"validation.mustBeMin": "Muss {{value}}, oder mehr sein",
|
||||
"validation.mustBeNumber": "Muss eine Zahl sein",
|
||||
"validation.required": "Erforderlich",
|
||||
"vendor.fields.comment": "Kommentar",
|
||||
"vendor.fields.emptySpoolWeight": "Gewicht der leeren Spule",
|
||||
"vendor.fields.externalId": "Externe ID",
|
||||
"vendor.fields.id": "ID",
|
||||
"vendor.fields.name": "Name",
|
||||
"vendor.fields.registered": "Registriert",
|
||||
"vendor.fieldsHelp.emptySpoolWeight": "Das Gewicht einer leeren Spule von diesem Hersteller.",
|
||||
"yes": "Ja"
|
||||
}
|
||||
@@ -0,0 +1,457 @@
|
||||
{
|
||||
"add.addAndNew": "",
|
||||
"add.adding": "",
|
||||
"add.advanced": "",
|
||||
"add.advancedNote": "",
|
||||
"add.change": "",
|
||||
"add.count": "",
|
||||
"add.createNew": "",
|
||||
"add.createNewSub": "",
|
||||
"add.dbUnavailable": "",
|
||||
"add.duplicate": "",
|
||||
"add.duplicateNote": "",
|
||||
"add.duplicateRename": "",
|
||||
"add.duplicateTitle": "",
|
||||
"add.filamentNamePlaceholder": "",
|
||||
"add.fill.full": "",
|
||||
"add.fillLevel": "",
|
||||
"add.importNote": "",
|
||||
"add.inCatalog": "",
|
||||
"add.locationHint": "",
|
||||
"add.locationPlaceholder": "",
|
||||
"add.manufacturerPlaceholder": "",
|
||||
"add.nameHint": "",
|
||||
"add.newFilament": "",
|
||||
"add.newFilamentTitle": "",
|
||||
"add.noCatalog": "",
|
||||
"add.noManufacturer": "",
|
||||
"add.pickColor": "",
|
||||
"add.searchPlaceholder": "",
|
||||
"add.searching": "",
|
||||
"add.spoolWeightPreset.cardboard": "",
|
||||
"add.spoolWeightPreset.plastic": "",
|
||||
"add.spoolWeightPresetsLead": "",
|
||||
"add.step2": "",
|
||||
"add.typeToSearchAll": "",
|
||||
"add.typeToSearchMatches": "",
|
||||
"add.useExisting": "",
|
||||
"add.vendorHint.existing": "",
|
||||
"add.vendorHint.new": "",
|
||||
"add.vendorHint.optional": "",
|
||||
"add.yourCatalog": "",
|
||||
"buttons.archive": "Αρχειοθέτηση",
|
||||
"buttons.cancel": "Ακύρωση",
|
||||
"buttons.clear": "Εκκαθάριση",
|
||||
"buttons.close": "",
|
||||
"buttons.delete": "Διαγραφή",
|
||||
"buttons.edit": "Τροποποίηση",
|
||||
"buttons.filter": "Φιλτράρισμα",
|
||||
"buttons.save": "Αποθήκευση",
|
||||
"buttons.showArchived": "Εμφάνιση Αρχειοθετημένων",
|
||||
"buttons.unArchive": "Επαναφορά Αρχειοθετημένου",
|
||||
"common.decrement": "",
|
||||
"common.increment": "",
|
||||
"common.remove": "",
|
||||
"common.search": "",
|
||||
"dashboard.addFieldHint": "",
|
||||
"dashboard.dashboard": "",
|
||||
"dashboard.deleteGroup": "",
|
||||
"dashboard.dragHint": "",
|
||||
"dashboard.dropHere": "",
|
||||
"dashboard.emptyHelp": "",
|
||||
"dashboard.errorEmptyName": "",
|
||||
"dashboard.errorExists": "",
|
||||
"dashboard.errorRename": "",
|
||||
"dashboard.lastUsed": "",
|
||||
"dashboard.newGroup": "",
|
||||
"dashboard.newGroupName": "",
|
||||
"dashboard.reorderGroup": "",
|
||||
"dashboard.unassigned": "",
|
||||
"datetime.done": "",
|
||||
"datetime.hour": "",
|
||||
"datetime.minute": "",
|
||||
"datetime.nextMonth": "",
|
||||
"datetime.now": "",
|
||||
"datetime.pick": "",
|
||||
"datetime.prevMonth": "",
|
||||
"datetime.time": "",
|
||||
"documentTitle.dashboard.list": "",
|
||||
"documentTitle.labels.list": "",
|
||||
"documentTitle.library.list": "",
|
||||
"documentTitle.settings.list": "",
|
||||
"filament.fields.addColor": "",
|
||||
"filament.fields.articleNumber": "Κωδικός Προϊόντος",
|
||||
"filament.fields.coaxial": "",
|
||||
"filament.fields.colorHex": "Χρώμα",
|
||||
"filament.fields.colorType": "",
|
||||
"filament.fields.comment": "Σχόλια",
|
||||
"filament.fields.density": "Πυκνότητα",
|
||||
"filament.fields.diameter": "Διάμετρος",
|
||||
"filament.fields.externalId": "",
|
||||
"filament.fields.id": "Α/Α",
|
||||
"filament.fields.longitudinal": "",
|
||||
"filament.fields.material": "Υλικό",
|
||||
"filament.fields.multiColor": "",
|
||||
"filament.fields.name": "Όνομα",
|
||||
"filament.fields.price": "Τιμή",
|
||||
"filament.fields.registered": "Ημερομηνία Εγγραφής",
|
||||
"filament.fields.removeColor": "",
|
||||
"filament.fields.settingsBedTemp": "Θερμοκρασία Κρεβατιού",
|
||||
"filament.fields.settingsExtruderTemp": "Θερμοκρασία Μύτης",
|
||||
"filament.fields.singleColor": "",
|
||||
"filament.fields.spoolWeight": "Βάρος Καρουλιού",
|
||||
"filament.fields.vendor": "Προμηθευτής",
|
||||
"filament.fields.weight": "Βάρος",
|
||||
"filament.fieldsHelp.articleNumber": "Π.χ. EAN, UPC, κλπ.",
|
||||
"filament.fieldsHelp.multiColorDirection": "",
|
||||
"filament.fieldsHelp.spoolWeight": "Το βάρος ενός άδειου καρουλιού. Χρησιμοποιείται για τον προσδιορισμό του μετρημένου βάρους ενός καρουλιού.",
|
||||
"filament.fieldsHelp.weight": "Το βάρος του νήματος ενός πλήρους καρουλιού (καθαρό βάρος). Αυτό δεν πρέπει να περιλαμβάνει το βάρος του ίδιου του καρουλιού, μόνο το βάρος του νήματος. Είναι αυτό που συνήθως αναγράφεται στη συσκευασία.",
|
||||
"filament.filament": "Νήματα",
|
||||
"footer.documentation": "",
|
||||
"footer.reportIssue": "",
|
||||
"help.help": "Βοήθεια",
|
||||
"inspector.addSpoolsOfThis": "",
|
||||
"inspector.adjustFailed": "",
|
||||
"inspector.adjustHelp": "",
|
||||
"inspector.adjustWeight": "",
|
||||
"inspector.apply": "",
|
||||
"inspector.applying": "",
|
||||
"inspector.colorHex": "",
|
||||
"inspector.consumeAmount": "",
|
||||
"inspector.delete.deleting": "",
|
||||
"inspector.delete.errorGone": "",
|
||||
"inspector.delete.errorSpoolsExist": "",
|
||||
"inspector.delete.errorUnknown": "",
|
||||
"inspector.delete.filament": "",
|
||||
"inspector.delete.filamentBlockedHint": "",
|
||||
"inspector.delete.filamentBlockedTitle": "",
|
||||
"inspector.delete.filamentBody": "",
|
||||
"inspector.delete.filamentDone": "",
|
||||
"inspector.delete.filamentTitle": "",
|
||||
"inspector.delete.spool": "",
|
||||
"inspector.delete.spoolBody": "",
|
||||
"inspector.delete.spoolDone": "",
|
||||
"inspector.delete.spoolRemaining": "",
|
||||
"inspector.delete.spoolTitle": "",
|
||||
"inspector.delete.vendor": "",
|
||||
"inspector.delete.vendorBody": "",
|
||||
"inspector.delete.vendorDone": "",
|
||||
"inspector.delete.vendorTitle": "",
|
||||
"inspector.duplicateFilament": "",
|
||||
"inspector.empty": "",
|
||||
"inspector.enterValidLength": "",
|
||||
"inspector.enterValidWeight": "",
|
||||
"inspector.loading": "",
|
||||
"inspector.manageExtraFields": "",
|
||||
"inspector.measuredHelp": "",
|
||||
"inspector.multi": "",
|
||||
"inspector.newGross": "",
|
||||
"inspector.noExtraFields": "",
|
||||
"inspector.notFound": "",
|
||||
"inspector.ofRemaining": "",
|
||||
"inspector.openFilament": "",
|
||||
"inspector.openLink": "",
|
||||
"inspector.openManufacturer": "",
|
||||
"inspector.specs": "",
|
||||
"inspector.spoolsCount": "",
|
||||
"inspector.spoolsTotalRemaining": "",
|
||||
"inspector.used": "",
|
||||
"kofi": "Φιλοδώρημα στο Ko-fi",
|
||||
"labels.addHead": "",
|
||||
"labels.addQr": "",
|
||||
"labels.addRect": "",
|
||||
"labels.addSwatch": "",
|
||||
"labels.addText": "",
|
||||
"labels.align": "",
|
||||
"labels.alignCenter": "",
|
||||
"labels.alignLeft": "",
|
||||
"labels.alignRight": "",
|
||||
"labels.blank": "",
|
||||
"labels.bold": "",
|
||||
"labels.canvasHint": "",
|
||||
"labels.centerLogo": "",
|
||||
"labels.chooseField": "",
|
||||
"labels.clearFill": "",
|
||||
"labels.copies": "",
|
||||
"labels.cornerRadiusMm": "",
|
||||
"labels.createFirst": "",
|
||||
"labels.cutGuides": "",
|
||||
"labels.deleteConfirm": "",
|
||||
"labels.deleteElement": "",
|
||||
"labels.designName": "",
|
||||
"labels.designerDesc": "",
|
||||
"labels.designerTitle": "",
|
||||
"labels.dpi": "",
|
||||
"labels.dpiHint": "",
|
||||
"labels.duplicate": "",
|
||||
"labels.fields.bedTemp": "",
|
||||
"labels.fields.diameterMm": "",
|
||||
"labels.fields.groupVendor": "",
|
||||
"labels.fields.initialG": "",
|
||||
"labels.fields.netWeightG": "",
|
||||
"labels.fields.remainingG": "",
|
||||
"labels.fill": "",
|
||||
"labels.fitWidth": "",
|
||||
"labels.fitWidthHint": "",
|
||||
"labels.fontMm": "",
|
||||
"labels.gridInfo": "",
|
||||
"labels.hMm": "",
|
||||
"labels.heightMm": "",
|
||||
"labels.hintNowrap": "",
|
||||
"labels.hintSwatch": "",
|
||||
"labels.hintWrap": "",
|
||||
"labels.imageDesc": "",
|
||||
"labels.imageZipNote": "",
|
||||
"labels.insertField": "",
|
||||
"labels.kind.qr": "",
|
||||
"labels.kind.rect": "",
|
||||
"labels.kind.swatch": "",
|
||||
"labels.kind.text": "",
|
||||
"labels.labelSize": "",
|
||||
"labels.labelType": "",
|
||||
"labels.layout": "",
|
||||
"labels.modeImage": "",
|
||||
"labels.modeLabel": "",
|
||||
"labels.modeSheet": "",
|
||||
"labels.new": "",
|
||||
"labels.newText": "",
|
||||
"labels.noDesignsOption": "",
|
||||
"labels.noFilaments": "",
|
||||
"labels.noSpools": "",
|
||||
"labels.onePerLabel": "",
|
||||
"labels.preparing": "",
|
||||
"labels.preview": "",
|
||||
"labels.previewWith": "",
|
||||
"labels.radiusMm": "",
|
||||
"labels.sampleData": "",
|
||||
"labels.saved": "",
|
||||
"labels.saving": "",
|
||||
"labels.searchFilaments": "",
|
||||
"labels.searchSpools": "",
|
||||
"labels.selectAllShort": "",
|
||||
"labels.selectAtLeastOne": "",
|
||||
"labels.selectAtLeastOneFilament": "",
|
||||
"labels.selectDesign": "",
|
||||
"labels.selectElement": "",
|
||||
"labels.selectNoneShort": "",
|
||||
"labels.selectRecentHint": "",
|
||||
"labels.selectRecentShort": "",
|
||||
"labels.showingFilament": "",
|
||||
"labels.showingReal": "",
|
||||
"labels.showingSpool": "",
|
||||
"labels.showingTags": "",
|
||||
"labels.sizeMm": "",
|
||||
"labels.skipHint": "",
|
||||
"labels.sortHint": "",
|
||||
"labels.sortId": "",
|
||||
"labels.sortNewest": "",
|
||||
"labels.stroke": "",
|
||||
"labels.strokeMm": "",
|
||||
"labels.tabDesign": "",
|
||||
"labels.tabPrint": "",
|
||||
"labels.textTemplate": "",
|
||||
"labels.typeFilament": "",
|
||||
"labels.typeHint": "",
|
||||
"labels.typeSpool": "",
|
||||
"labels.unknownFilament": "",
|
||||
"labels.wMm": "",
|
||||
"labels.widthMm": "",
|
||||
"labels.wrapText": "",
|
||||
"labels.xMm": "",
|
||||
"labels.yMm": "",
|
||||
"library.apiError": "",
|
||||
"library.collapseGroup": "",
|
||||
"library.emptyBody": "",
|
||||
"library.emptyFiltered": "",
|
||||
"library.emptyTitle": "",
|
||||
"library.expandGroup": "",
|
||||
"library.filterBy": "",
|
||||
"library.groupBy": "",
|
||||
"library.groupNone": "",
|
||||
"library.nUnused": "",
|
||||
"library.noLocation": "",
|
||||
"library.noValues": "",
|
||||
"library.openGroup": "",
|
||||
"library.openManufacturer": "",
|
||||
"library.section.extra": "",
|
||||
"library.section.filament": "",
|
||||
"library.section.spool": "",
|
||||
"library.section.vendor": "",
|
||||
"library.showMore": "",
|
||||
"library.sort.nozzle": "",
|
||||
"library.sortBy": "",
|
||||
"library.unassigned": "",
|
||||
"library.unitGroups": "",
|
||||
"library.unitSpools": "",
|
||||
"library.unused": "",
|
||||
"library.unusedGroup": "",
|
||||
"library.unusedGroupMixed": "",
|
||||
"library.unusedSub": "",
|
||||
"library.unusedSubMixed": "",
|
||||
"library.used": "",
|
||||
"library.usedAgo": "",
|
||||
"loading": "Φόρτωση",
|
||||
"nav.labels": "",
|
||||
"nav.library": "",
|
||||
"no": "Όχι",
|
||||
"notifications.error": "Λάθος (status code: {{statusCode}})",
|
||||
"notifications.saveSuccessful": "Επιτυχής Αποθήκευση!",
|
||||
"pagination.empty": "",
|
||||
"pagination.next": "",
|
||||
"pagination.pageSize": "",
|
||||
"pagination.perPage": "",
|
||||
"pagination.prev": "",
|
||||
"pagination.range": "",
|
||||
"printing.generic.columns": "Στήλες",
|
||||
"printing.generic.customSize": "Προσαρμοσμένο",
|
||||
"printing.generic.description": "Τροποποιήστε τις παρακάτω ρυθμίσεις για να αποκτήσετε την επιθυμητή διάταξη εκτύπωσης. Λάβετε υπόψη ότι οι εκτυπωτές και το λειτουργικό σας σύστημα ενδέχεται να εφαρμόζουν τα δικά τους περιθώρια και την δική τους μεγέθυνση, επομένως ίσως χρειαστεί να εκτελέσετε κάποιες δοκιμές πριν είναι όλα σωστά. Δοκιμάστε τις ρυθμίσεις σε ένα κομμάτι κανονικού χαρτιού πριν εκτυπώσετε στις πραγματικές ετικέτες.",
|
||||
"printing.generic.dimensions": "Διαστάσεις",
|
||||
"printing.generic.gridTooWide": "",
|
||||
"printing.generic.helpMargin": "Τα περιθώρια θα πρέπει να διαμορφωθούν ώστε να ταιριάζουν με το χαρτί ετικετών που χρησιμοποιείτε αλλά και τον εκτυπωτή σας. Η αλλαγή αυτών των περιθωρίων θα επηρεάσει το μέγεθος ολόκληρου του πλέγματος.",
|
||||
"printing.generic.helpPrinterMargin": "Το ασφαλές περιθώριο πρέπει να ρυθμιστεί στο πόσο κοντά στην άκρη του χαρτιού μπορεί να εκτυπώσει ο εκτυπωτής σας. Η αλλαγή αυτών δεν θα επηρεάσει ολόκληρο το πλέγμα.",
|
||||
"printing.generic.horizontalSpacing": "Οριζόντιο Διάστημα",
|
||||
"printing.generic.itemCopies": "",
|
||||
"printing.generic.marginBottom": "Κάτω Περιθώριο",
|
||||
"printing.generic.marginLeft": "Αριστερό περιθώριο",
|
||||
"printing.generic.marginRight": "Δεξιό Περιθώριο",
|
||||
"printing.generic.marginTop": "Επάνω Περιθώριο",
|
||||
"printing.generic.paperSize": "Μέγεθος Χαρτιού",
|
||||
"printing.generic.printerMarginBottom": "Ασφαλές Περιθώριο Κάτω",
|
||||
"printing.generic.printerMarginLeft": "Ασφαλές Περιθώριο Αριστερά",
|
||||
"printing.generic.printerMarginRight": "Ασφαλές Περιθώριο Δεξιά",
|
||||
"printing.generic.printerMarginTop": "Ασφαλές Περιθώριο Επάνω",
|
||||
"printing.generic.saveAsImage": "",
|
||||
"printing.generic.skipItems": "Παράληψη Αντικειμένων",
|
||||
"printing.generic.verticalSpacing": "Κάθετο Διάστημα",
|
||||
"printing.qrcode.button": "Tύπωση Κωδικών QR",
|
||||
"printing.qrcode.customUrl.caveat": "",
|
||||
"printing.qrcode.customUrl.hint": "",
|
||||
"printing.qrcode.customUrl.label": "",
|
||||
"printing.qrcode.useHTTPUrl.label": "",
|
||||
"printing.qrcode.useHTTPUrl.options.custom": "",
|
||||
"printing.qrcode.useHTTPUrl.options.default": "",
|
||||
"printing.qrcode.useHTTPUrl.options.url": "",
|
||||
"printing.qrcode.useHTTPUrl.preview": "",
|
||||
"printing.qrcode.useHTTPUrl.tooltip": "",
|
||||
"printing.spoolSelect.selectedTotal_one": "{{count}} καρούλι έχει επιλεγεί",
|
||||
"printing.spoolSelect.selectedTotal_other": "{{count}} καρούλια έχουν επιλεγεί",
|
||||
"scanner.description": "Σκάναρε τον Spoolman κωδικό QR για να δεις πληροφορίες για το νήμα.",
|
||||
"scanner.error.inUse": "",
|
||||
"scanner.error.insecureContext": "Η σελίδα δεν υποστηρίζεται μέσω HTTPS.",
|
||||
"scanner.error.notAllowed": "Δεν έχετε επιτρέψει την πρόσβαση στην κάμερα.",
|
||||
"scanner.error.notFound": "Δεν βρέθηκε κάμερα.",
|
||||
"scanner.error.streamApiNotSupported": "Αυτός ο browser δεν υποστηρίζει το MediaStream API.",
|
||||
"scanner.error.unknown": "Προέκυψε άγνωστο σφάλμα. ({{error}})",
|
||||
"scanner.starting": "",
|
||||
"scanner.title": "Αναγνώστης κωδικού QR",
|
||||
"search.colorHint": "",
|
||||
"search.noResults": "",
|
||||
"search.searching": "",
|
||||
"search.section.filaments": "",
|
||||
"search.section.spools": "",
|
||||
"search.section.vendors": "",
|
||||
"search.threshold": "",
|
||||
"search.unknownFilament": "",
|
||||
"settings.appearance.tab": "",
|
||||
"settings.appearance.theme.dark": "",
|
||||
"settings.appearance.theme.desc": "",
|
||||
"settings.appearance.theme.label": "",
|
||||
"settings.appearance.theme.light": "",
|
||||
"settings.appearance.theme.system": "",
|
||||
"settings.extraFields.addChoice": "",
|
||||
"settings.extraFields.addChoicesFirst": "",
|
||||
"settings.extraFields.addEntityField": "",
|
||||
"settings.extraFields.booleanFalse": "Τιμή για ένα πρόσθετο πεδίο boolean Λανθασμένο",
|
||||
"settings.extraFields.booleanTrue": "Τιμή για ένα πρόσθετο πεδίο boolean Αληθές",
|
||||
"settings.extraFields.deleteConfirm": "Διαγραφή πεδίου {{name}};",
|
||||
"settings.extraFields.description.constraints": "Μόλις προστεθεί ένα πεδίο, δεν μπορείτε να αλλάξετε το κλειδί ή τον τύπο του και για στα πεδία τύπου επιλογής δεν μπορείτε να αφαιρέσετε επιλογές ή να αλλάξετε την κατάσταση πολλαπλών επιλογών. Εάν καταργήσετε ένα πεδίο, τα συσχετισμένα δεδομένα για όλες τις οντότητες θα διαγραφούν.",
|
||||
"settings.extraFields.description.intro": "Εδώ μπορείτε να προσθέσετε επιπλέον προσαρμοσμένα πεδία στις οντότητες σας.",
|
||||
"settings.extraFields.description.keyUsage": "Το κλειδί είναι πώς τα άλλα προγράμματα διαβάζουν/εγγράφουν τα δεδομένα, οπότε αν το προσαρμοσμένο πεδίο σας υποτίθεται ότι ενσωματώνεται με ένα πρόγραμμα τρίτου κατασκευαστή, φροντίστε να το ρυθμίσετε σωστά. Η προεπιλεγμένη τιμή εφαρμόζεται μόνο σε νέα στοιχεία.",
|
||||
"settings.extraFields.description.tableViews": "Τα πρόσθετα πεδία δεν μπορούν να ταξινομηθούν ή να φιλτραριστούν στις προβολές πίνακα.",
|
||||
"settings.extraFields.editorEdit": "",
|
||||
"settings.extraFields.editorNew": "",
|
||||
"settings.extraFields.errors.choiceNeeded": "",
|
||||
"settings.extraFields.errors.choicesRemoved": "",
|
||||
"settings.extraFields.errors.deleteFailed": "",
|
||||
"settings.extraFields.errors.keyFormat": "",
|
||||
"settings.extraFields.errors.nameRequired": "",
|
||||
"settings.extraFields.errors.saveFailed": "",
|
||||
"settings.extraFields.fieldType.boolean": "Πρόσθετο πεδίο τύπου \"Boolean\", Ναι/Όχι",
|
||||
"settings.extraFields.fieldType.choice": "\"Choice\" πληκτρολογήστε επιπλέον πεδίο, οι χρήστες μπορούν να επιλέξουν από μια λίστα τιμών",
|
||||
"settings.extraFields.fieldType.datetime": "Πληκτρολογήστε επιπλέον πεδίο \"Date+Time\"",
|
||||
"settings.extraFields.fieldType.float": "\"Float\" πληκτρολογήστε επιπλέον πεδίο, έναν αριθμό με δεκαδικούς αριθμούς",
|
||||
"settings.extraFields.fieldType.floatRange": "\"Float Range\" πληκτρολογήστε επιπλέον πεδίο, ένα εύρος δύο αριθμών με δεκαδικούς αριθμούς",
|
||||
"settings.extraFields.fieldType.integer": "\"Integer\" πληκτρολογήστε επιπλέον πεδίο, ακέραιο αριθμό χωρίς δεκαδικούς αριθμούς",
|
||||
"settings.extraFields.fieldType.integerRange": "\"Integer Range\" πληκτρολογήστε επιπλέον πεδίο, ένα εύρος δύο ακέραιων αριθμών χωρίς δεκαδικoύς αριθμούς",
|
||||
"settings.extraFields.fieldType.text": "Πληκτρολογήστε επιπλέον πεδίο \"Text\".",
|
||||
"settings.extraFields.max": "",
|
||||
"settings.extraFields.min": "",
|
||||
"settings.extraFields.multiSuffix": "",
|
||||
"settings.extraFields.multiple": "",
|
||||
"settings.extraFields.namePlaceholder": "",
|
||||
"settings.extraFields.nonUniqueKeyError": "Το κλειδί πρέπει να είναι μοναδικό.",
|
||||
"settings.extraFields.none": "",
|
||||
"settings.extraFields.params.choices": "Επιλογές",
|
||||
"settings.extraFields.params.defaultValue": "Προεπιλεγμένη τιμή",
|
||||
"settings.extraFields.params.fieldType": "Τύπος",
|
||||
"settings.extraFields.params.key": "Κλειδί",
|
||||
"settings.extraFields.params.name": "Όνομα",
|
||||
"settings.extraFields.params.order": "Σειρά",
|
||||
"settings.extraFields.params.unit": "Μονάδα",
|
||||
"settings.extraFields.saveField": "",
|
||||
"settings.extraFields.tab": "Επιπλέον Πεδία",
|
||||
"settings.general.baseUrl.label": "",
|
||||
"settings.general.baseUrl.tooltip": "",
|
||||
"settings.general.currency.desc": "",
|
||||
"settings.general.currency.label": "Ετικέτα για τη ρύθμιση του νομίσματος",
|
||||
"settings.general.roundPrices.label": "",
|
||||
"settings.general.roundPrices.tooltip": "",
|
||||
"settings.general.tab": "Γενικές",
|
||||
"settings.header": "Ρυθμίσεις",
|
||||
"settings.language.desc": "",
|
||||
"settings.language.label": "",
|
||||
"settings.library.lowThreshold.desc": "",
|
||||
"settings.library.lowThreshold.label": "",
|
||||
"settings.library.tab": "",
|
||||
"spool.fields.archived": "Αρχειοθετημένο",
|
||||
"spool.fields.comment": "Σχόλια",
|
||||
"spool.fields.filament": "Νήμα",
|
||||
"spool.fields.firstUsed": "Πρώτη Χρήση",
|
||||
"spool.fields.id": "Α/Α",
|
||||
"spool.fields.lastUsed": "Τελευταία Χρήση",
|
||||
"spool.fields.location": "Τοποθεσία Αποθήκευσης",
|
||||
"spool.fields.lotNr": "Αριθμός Παρτίδας",
|
||||
"spool.fields.material": "Υλικό",
|
||||
"spool.fields.measuredWeight": "Μετρημένο Βάρος",
|
||||
"spool.fields.price": "Τιμή",
|
||||
"spool.fields.registered": "Ημερομηνία Εγγραφής",
|
||||
"spool.fields.remainingWeight": "Υπολειπόμενο Βάρος",
|
||||
"spool.fields.usedWeight": "Χρησιμοποιημένο Βάρος",
|
||||
"spool.fieldsHelp.location": "Που βρίσκεται το καρούλι, εάν υπάρχουν πολλαπλά σημεία αποθήκευσης για τα καρούλια.",
|
||||
"spool.fieldsHelp.lotNr": "Αριθμός παρτίδας κατασκευαστή. Μπορεί να χρησιμοποιηθεί για να διασφαλιστεί ότι μια εκτύπωση έχει σταθερό χρώμα εάν χρησιμοποιούνται πολλαπλά καρούλια.",
|
||||
"spool.fieldsHelp.measuredWeight": "Πόσο ζυγίζουν το νήμα και το καρούλι.",
|
||||
"spool.fieldsHelp.price": "Τιμή πλήρους καρουλιού. Εάν δεν οριστεί, η τιμή του νήματος θα θεωρηθεί αντ' αυτού.",
|
||||
"spool.fieldsHelp.remainingWeight": "Πόσο νήμα έχει απομείνει στο καρούλι. Για ένα καινούργιο καρούλι αυτό πρέπει να συμπίπτει με το βάρος του καρουλιού.",
|
||||
"spool.fieldsHelp.usedWeight": "Πόσο νήμα έχει χρησιμοποιηθεί από το καρούλι. Σε ένα καινούργιο καρούλι θα πρέπει να έχουν χρησιμοποιηθεί 0g.",
|
||||
"spool.form.measurementType.length": "",
|
||||
"spool.form.measurementType.weight": "",
|
||||
"spool.spool": "Καρούλια",
|
||||
"topbar.addSpools": "",
|
||||
"topbar.searchPlaceholder": "",
|
||||
"unknown": "Άγνωστος",
|
||||
"validation.hexDigits": "",
|
||||
"validation.maxChars": "",
|
||||
"validation.mustBeGt": "",
|
||||
"validation.mustBeMax": "",
|
||||
"validation.mustBeMin": "",
|
||||
"validation.mustBeNumber": "",
|
||||
"validation.required": "",
|
||||
"vendor.fields.comment": "Σχόλια",
|
||||
"vendor.fields.emptySpoolWeight": "",
|
||||
"vendor.fields.externalId": "",
|
||||
"vendor.fields.id": "Α/Α",
|
||||
"vendor.fields.name": "Όνομα",
|
||||
"vendor.fields.registered": "Ημερομηνία Εγγραφής",
|
||||
"vendor.fieldsHelp.emptySpoolWeight": "",
|
||||
"yes": "Ναι"
|
||||
}
|
||||
@@ -0,0 +1,642 @@
|
||||
{
|
||||
"add.addAndNew": "Add & new",
|
||||
"add.addN_one": "Add {{count}} spool",
|
||||
"add.addN_other": "Add {{count}} spools",
|
||||
"add.adding": "Adding...",
|
||||
"add.advanced": "Advanced specs",
|
||||
"add.advancedNote": "density, diameter, temperatures (auto-filled from material)",
|
||||
"add.change": "change",
|
||||
"add.count": "Count",
|
||||
"add.createNew": "Create a new filament",
|
||||
"add.createNewSub": "not in your catalog or {{name}}",
|
||||
"add.duplicate": "duplicate",
|
||||
"add.duplicateTitle": "New filament · copy of “{{name}}”",
|
||||
"add.duplicateNote": "Specs, manufacturer and price were copied over. Give it a new name and color.",
|
||||
"add.duplicateRename": "Still named like the original — rename it to tell them apart.",
|
||||
"add.dbUnavailable": "{{name}} unavailable",
|
||||
"add.manufacturerPlaceholder": "e.g. Polymaker",
|
||||
"add.filamentNamePlaceholder": "e.g. PolyTerra Matte Sage",
|
||||
"add.nameHint": "Include the color — it’s what tells your filaments apart.",
|
||||
"add.fill.full": "Full",
|
||||
"add.fillLevel": "Fill level",
|
||||
"add.importNote": "This filament will be added to your catalog when you add the spools.",
|
||||
"add.inCatalog": "in catalog",
|
||||
"add.locationHint": "Where you physically keep the spool — a shelf, a box, or a printer. Leave it blank if you keep them all in one place.",
|
||||
"add.locationPlaceholder": "e.g. Shelf A, Dry box 2, Printer 1",
|
||||
"add.newFilament": "new filament",
|
||||
"add.newFilamentTitle": "New filament",
|
||||
"add.noCatalog": "No filaments in your catalog",
|
||||
"add.noManufacturer": "No manufacturer",
|
||||
"add.pickColor": "Pick color",
|
||||
"add.searchPlaceholder": "Search your catalog and {{name}}...",
|
||||
"add.searching": "Searching...",
|
||||
"add.section.manufacturer": "Manufacturer",
|
||||
"add.section.manufacturerNote": "Who makes the filament. Added once, then reused for all their filaments.",
|
||||
"add.section.filament": "Filament",
|
||||
"add.section.filamentNote": "The product on the spool — one entry per color.",
|
||||
"add.section.spool": "Spool",
|
||||
"add.section.spoolNote": "The physical spools going into your inventory.",
|
||||
"add.section.spoolSharedNote": "Weight, spool weight and price are also saved as the new filament’s defaults.",
|
||||
"add.spoolWeightPreset.cardboard": "Cardboard {{weight}} g",
|
||||
"add.spoolWeightPreset.plastic": "Plastic {{weight}} g",
|
||||
"add.spoolWeightPresetsLead": "Start from a typical spool:",
|
||||
"add.step2": "Step 2 · spool details",
|
||||
"add.step2New": "Step 2 · filament & spool details",
|
||||
"add.summary_one": "{{count}} spool",
|
||||
"add.summary_other": "{{count}} spools",
|
||||
"add.typeToSearchAll": "Type to search thousands of filaments",
|
||||
"add.typeToSearchMatches": "Type to search — no matches",
|
||||
"add.useExisting": "use an existing one",
|
||||
"add.vendorHint.existing": "Using existing manufacturer “{{name}}”",
|
||||
"add.vendorHint.new": "New manufacturer “{{name}}” will be created",
|
||||
"add.vendorHint.optional": "Optional — leave blank for no manufacturer",
|
||||
"add.weightPresets": "Common roll sizes",
|
||||
"add.yourCatalog": "Your catalog",
|
||||
"buttons.apply": "Apply",
|
||||
"buttons.archive": "Archive",
|
||||
"buttons.cancel": "Cancel",
|
||||
"buttons.clear": "Clear",
|
||||
"buttons.close": "Close",
|
||||
"buttons.delete": "Delete",
|
||||
"buttons.edit": "Edit",
|
||||
"buttons.filter": "Filter",
|
||||
"buttons.save": "Save",
|
||||
"buttons.showArchived": "Show Archived",
|
||||
"buttons.showNoSpools": "Show filaments with no spools",
|
||||
"buttons.unArchive": "Unarchive",
|
||||
"changeFilament.adoptWeight": "Set this spool’s full weight to {{full}}",
|
||||
"changeFilament.adoptWeightHelp": "It is recorded as {{current}}, from the filament it held before. Used weight ({{used}}) is kept either way, leaving {{remaining}}.",
|
||||
"changeFilament.action": "Change",
|
||||
"changeFilament.apply": "Change filament",
|
||||
"changeFilament.applying": "Changing...",
|
||||
"changeFilament.current": "current",
|
||||
"changeFilament.done": "Filament changed.",
|
||||
"changeFilament.failed": "Couldn’t change the filament.",
|
||||
"changeFilament.importNote": "This filament will be added to your catalog when you apply the change.",
|
||||
"changeFilament.intro": "Spool #{{id}} keeps its number, location, dates and usage history — only the filament it holds changes.",
|
||||
"changeFilament.newTag": "new",
|
||||
"changeFilament.next": "Change to",
|
||||
"changeFilament.now": "Currently",
|
||||
"changeFilament.pickBelow": "Pick a filament below",
|
||||
"changeFilament.title": "Change filament",
|
||||
"changeFilament.useExisting": "Pick an existing filament",
|
||||
"changeFilament.weightFollows": "This spool has no full weight of its own, so it takes the new filament’s: {{full}}, leaving {{remaining}} after the {{used}} already used.",
|
||||
"changeVendor.action": "Change",
|
||||
"changeVendor.apply": "Change manufacturer",
|
||||
"changeVendor.applying": "Changing...",
|
||||
"changeVendor.clearHint": "Leave this filament with no manufacturer",
|
||||
"changeVendor.create": "Create “{{name}}”",
|
||||
"changeVendor.createHint": "Not one of your manufacturers yet — it will be added",
|
||||
"changeVendor.current": "current",
|
||||
"changeVendor.done": "Manufacturer changed.",
|
||||
"changeVendor.emptySpool": "Empty spool {{value}}",
|
||||
"changeVendor.failed": "Couldn’t change the manufacturer.",
|
||||
"changeVendor.intro": "“{{name}}” keeps its spools, its specs and its history — only the manufacturer it is filed under changes.",
|
||||
"changeVendor.next": "Change to",
|
||||
"changeVendor.noEmptySpool": "No empty spool weight",
|
||||
"changeVendor.noMatches": "No manufacturer matches",
|
||||
"changeVendor.none": "No manufacturers yet",
|
||||
"changeVendor.noneNote": "Filed under no brand",
|
||||
"changeVendor.now": "Currently",
|
||||
"changeVendor.pickBelow": "Pick a manufacturer below",
|
||||
"changeVendor.searchPlaceholder": "Search or name a manufacturer",
|
||||
"changeVendor.tareFollows": "This filament has no empty spool weight of its own, so it takes its manufacturer’s. After the change that is {{value}}, which is what a spool of it weighs empty when you measure one.",
|
||||
"changeVendor.tareGone": "This filament has no empty spool weight of its own and takes its manufacturer’s {{current}}. After the change there is none to take, until you give the filament one.",
|
||||
"changeVendor.title": "Change manufacturer",
|
||||
"changeVendor.willBeCreated": "Will be created",
|
||||
"common.decrement": "Decrement",
|
||||
"common.increment": "Increment",
|
||||
"common.remove": "Remove",
|
||||
"common.search": "Search",
|
||||
"dashboard.addFieldHint": "Add a text or choice field to spools in Settings to group by it too",
|
||||
"dashboard.dashboard": "Dashboard",
|
||||
"dashboard.deleteGroup": "Delete group",
|
||||
"dashboard.dragHint": "Drag a spool to another card to change its {{field}}, or within a card to reorder",
|
||||
"dashboard.dropHere": "drop spools here",
|
||||
"dashboard.emptyHelp": "This page groups your spools by a field of your choosing, add some spools to get started!",
|
||||
"dashboard.errorEmptyName": "Name cannot be empty",
|
||||
"dashboard.errorExists": "A group with that name already exists",
|
||||
"dashboard.errorRename": "Failed to rename group",
|
||||
"dashboard.lastUsed": "Last used {{time}} ago",
|
||||
"dashboard.newGroup": "New group",
|
||||
"dashboard.newGroupName": "New group {{n}}",
|
||||
"dashboard.reorderGroup": "Drag to reorder group",
|
||||
"dashboard.spoolCount_one": "{{count}} spool",
|
||||
"dashboard.spoolCount_other": "{{count}} spools",
|
||||
"dashboard.unassigned": "Unassigned",
|
||||
"datetime.done": "Done",
|
||||
"datetime.hour": "Hour",
|
||||
"datetime.minute": "Minute",
|
||||
"datetime.nextMonth": "Next month",
|
||||
"datetime.now": "Now",
|
||||
"datetime.pick": "Pick date and time",
|
||||
"datetime.prevMonth": "Previous month",
|
||||
"datetime.time": "Time",
|
||||
"documentTitle.dashboard.list": "Dashboard | Spoolman",
|
||||
"documentTitle.labels.list": "Labels | Spoolman",
|
||||
"documentTitle.library.list": "Library | Spoolman",
|
||||
"documentTitle.settings.list": "Settings | Spoolman",
|
||||
"filament.fields.addColor": "Add color",
|
||||
"filament.fields.articleNumber": "Article Number",
|
||||
"filament.fields.coaxial": "Coextruded",
|
||||
"filament.fields.colorHex": "Color",
|
||||
"filament.fields.colorType": "Color type",
|
||||
"filament.fields.comment": "Comment",
|
||||
"filament.fields.density": "Density",
|
||||
"filament.fields.diameter": "Diameter",
|
||||
"filament.fields.externalId": "External ID",
|
||||
"filament.fields.id": "ID",
|
||||
"filament.fields.longitudinal": "Longitudinal",
|
||||
"filament.fields.material": "Material",
|
||||
"filament.fields.multiColor": "Multi",
|
||||
"filament.fields.name": "Name",
|
||||
"filament.fields.opacity": "Opacity",
|
||||
"filament.fields.price": "Price",
|
||||
"filament.fields.registered": "Registered",
|
||||
"filament.fields.removeColor": "Remove color",
|
||||
"filament.fields.settingsBedTemp": "Bed Temp",
|
||||
"filament.fields.settingsExtruderTemp": "Extruder Temp",
|
||||
"filament.fields.singleColor": "Single",
|
||||
"filament.fields.spoolWeight": "Spool Weight",
|
||||
"filament.fields.vendor": "Manufacturer",
|
||||
"filament.fields.weight": "Weight",
|
||||
"filament.fieldsHelp.articleNumber": "E.g. EAN, UPC, etc.",
|
||||
"filament.fieldsHelp.multiColorDirection": "Filaments can have multiple colors in two ways: either through coextrusion, like dual-color filaments with consistent multi-colors, or through longitudinal color changes, like gradient filaments that shift colors along the spool.",
|
||||
"filament.fieldsHelp.spoolWeight": "The weight of an empty spool. Used to determine measured weight of a spool. Not sure? Cardboard spools usually weigh 130–150 g and plastic ones 180–250 g — for an exact number, put the spool on a scale once it runs out.",
|
||||
"filament.fieldsHelp.weight": "The filament weight of a full spool (net weight). This should not include the weight of the spool itself, only the filament. It is what is usually written on the packaging.",
|
||||
"filament.filament": "Filaments",
|
||||
"footer.documentation": "Documentation",
|
||||
"footer.reportIssue": "Report an issue",
|
||||
"footer.updateAvailable": "v{{version}} available",
|
||||
"help.help": "Help",
|
||||
"inspector.addSpoolsOfThis": "Add spools of this",
|
||||
"inspector.adjustFailed": "Failed to adjust weight.",
|
||||
"inspector.adjustHelp": "Positive consumes filament, negative adds it back.",
|
||||
"inspector.adjustWeight": "Adjust weight",
|
||||
"inspector.apply": "Apply",
|
||||
"inspector.applying": "Applying...",
|
||||
"inspector.colorHex": "Color hex",
|
||||
"inspector.consumeAmount": "Consume amount:",
|
||||
"inspector.delete.deleting": "Deleting...",
|
||||
"inspector.delete.errorGone": "It had already been deleted.",
|
||||
"inspector.delete.errorSpoolsExist": "Can't delete this filament — spools still use it.",
|
||||
"inspector.delete.errorUnknown": "Delete failed. See the server logs for details.",
|
||||
"inspector.delete.filament": "Delete filament",
|
||||
"inspector.delete.filamentBlockedHint": "Delete those spools first. Archiving them is not enough.",
|
||||
"inspector.delete.filamentBlockedTitle": "This filament can't be deleted",
|
||||
"inspector.delete.filamentBlocked_one": "{{count}} spool still uses “{{name}}”, including archived ones.",
|
||||
"inspector.delete.filamentBlocked_other": "{{count}} spools still use “{{name}}”, including archived ones.",
|
||||
"inspector.delete.filamentBody": "“{{name}}” will be removed from your catalog. This cannot be undone.",
|
||||
"inspector.delete.filamentDone": "Filament deleted.",
|
||||
"inspector.delete.filamentTitle": "Delete this filament?",
|
||||
"inspector.delete.spool": "Delete spool",
|
||||
"inspector.delete.spoolBody": "Spool #{{id}} of “{{name}}” will be removed, along with its usage history. This cannot be undone.",
|
||||
"inspector.delete.spoolDone": "Spool deleted.",
|
||||
"inspector.delete.spoolRemaining": "It still has {{weight}} of filament left. Archive it instead if you only want it out of the way.",
|
||||
"inspector.delete.spoolTitle": "Delete this spool?",
|
||||
"inspector.delete.vendor": "Delete manufacturer",
|
||||
"inspector.delete.vendorBody": "“{{name}}” will be removed. This cannot be undone.",
|
||||
"inspector.delete.vendorDone": "Manufacturer deleted.",
|
||||
"inspector.delete.vendorOrphans_one": "Its {{count}} filament is kept, but is left without a manufacturer.",
|
||||
"inspector.delete.vendorOrphans_other": "Its {{count}} filaments are kept, but are left without a manufacturer.",
|
||||
"inspector.delete.vendorTitle": "Delete this manufacturer?",
|
||||
"inspector.duplicateFilament": "Duplicate",
|
||||
"inspector.empty": "Select a spool, filament or manufacturer from the list to see its details here.",
|
||||
"inspector.loading": "Loading...",
|
||||
"inspector.notFound": "This item could not be found. It may have been deleted.",
|
||||
"inspector.enterValidLength": "Enter a valid length.",
|
||||
"inspector.enterValidWeight": "Enter a valid weight.",
|
||||
"inspector.defaultFrom.filament": "{{value}} · filament default",
|
||||
"inspector.defaultFrom.manufacturer": "{{value}} · manufacturer default",
|
||||
"inspector.override.byFilament": "Overridden by this filament · {{value}}",
|
||||
"inspector.override.bySpool": "Overridden by this spool · {{value}}",
|
||||
"inspector.override.overridesFilament": "Overrides filament · {{value}}",
|
||||
"inspector.override.overridesManufacturer": "Overrides manufacturer · {{value}}",
|
||||
"inspector.measuredHelp": "Total weight of the spool + remaining filament, as read from a scale.",
|
||||
"inspector.manageExtraFields": "Manage fields",
|
||||
"inspector.multi": "multi ×{{count}}",
|
||||
"inspector.newGross": "New gross weight:",
|
||||
"inspector.noExtraFields": "None yet — add your own fields to track anything Spoolman doesn't.",
|
||||
"inspector.ofRemaining": "of {{weight}} remaining · {{length}} m",
|
||||
"inspector.openFilament": "Open filament",
|
||||
"inspector.openLink": "Open {{url}} in a new tab",
|
||||
"inspector.openManufacturer": "Open manufacturer",
|
||||
"inspector.specs": "Specs — edit in place",
|
||||
"inspector.spoolsCount": "Spools · {{count}}",
|
||||
"inspector.spoolsTotalRemaining": "{{weight}} total",
|
||||
"inspector.used": "used",
|
||||
"inspector.vendorSub_one": "{{count}} filament",
|
||||
"inspector.vendorSub_other": "{{count}} filaments",
|
||||
"labels.addHead": "Add",
|
||||
"labels.addQr": "QR code",
|
||||
"labels.addRect": "Rectangle",
|
||||
"labels.addSwatch": "Color swatch",
|
||||
"labels.addText": "Text / field",
|
||||
"labels.align": "Align",
|
||||
"labels.alignCenter": "Center",
|
||||
"labels.alignLeft": "Left",
|
||||
"labels.alignRight": "Right",
|
||||
"labels.blank": "You don't have any label designs yet.",
|
||||
"labels.bold": "Bold",
|
||||
"labels.canvasHint": "Drag to move · click to select · handles to resize.",
|
||||
"labels.centerLogo": "Center Spoolman logo",
|
||||
"labels.chooseField": "Choose a field...",
|
||||
"labels.clearFill": "Clear fill (outline only)",
|
||||
"labels.copies": "Copies",
|
||||
"labels.cornerRadiusMm": "Corner radius",
|
||||
"labels.createFirst": "Create your first label",
|
||||
"labels.cutGuides": "Cut guides",
|
||||
"labels.deleteConfirm": "Delete this label design?",
|
||||
"labels.deleteElement": "Delete element",
|
||||
"labels.designName": "Design name",
|
||||
"labels.selectDesign": "Select label design",
|
||||
"labels.designerDesc": "Design QR-code labels with any spool, filament, or vendor field, then print them on sheets or a label printer. Designs are saved on the server.",
|
||||
"labels.designerTitle": "Label designer",
|
||||
"labels.dpi": "Resolution",
|
||||
"labels.dpiHint": "Match your printer to keep small labels sharp: 203 dpi for most thermal label printers, 300 or more for laser and inkjet.",
|
||||
"labels.duplicate": "Duplicate",
|
||||
"labels.exportDescAml": "Saves one .aml label file per selected label, each {{w}}×{{h}} mm. Opens in the LPAPI-based apps that ship with most thermal label printers, which read the physical size from the file.",
|
||||
"labels.exportDescPng": "Saves one PNG image per selected label, each {{w}}×{{h}} mm.",
|
||||
"labels.exportFormat": "File format",
|
||||
"labels.exportFormatOptions.aml": "AML label file",
|
||||
"labels.exportFormatOptions.png": "PNG image",
|
||||
"labels.fields.bedTemp": "Bed temp",
|
||||
"labels.fields.diameterMm": "Diameter (mm)",
|
||||
"labels.fields.groupVendor": "Vendor",
|
||||
"labels.fields.initialG": "Initial (g)",
|
||||
"labels.fields.netWeightG": "Net weight (g)",
|
||||
"labels.fields.remainingG": "Remaining (g)",
|
||||
"labels.filamentsSelected_one": "{{count}} filament selected",
|
||||
"labels.filamentsSelected_other": "{{count}} filaments selected",
|
||||
"labels.fill": "Fill",
|
||||
"labels.fitWidth": "Fit width to columns",
|
||||
"labels.fitWidthHint": "Set the label width so the chosen number of columns fills the page.",
|
||||
"labels.fontMm": "Font",
|
||||
"labels.gridInfo": "{{cols}} × {{rows}} = {{perPage}} labels / page",
|
||||
"labels.hMm": "H",
|
||||
"labels.heightMm": "Height",
|
||||
"labels.hintNowrap": "Text stays on one line; anything past the width is clipped.",
|
||||
"labels.hintSwatch": "Filled with the spool's filament color(s) at print time.",
|
||||
"labels.hintWrap": "Wrap a field to hide it when empty:",
|
||||
"labels.imageZipNote": "More than {{threshold}} labels are delivered as a single zip file.",
|
||||
"labels.insertField": "Insert field",
|
||||
"labels.kind.qr": "QR code",
|
||||
"labels.kind.rect": "Rectangle",
|
||||
"labels.kind.swatch": "Swatch",
|
||||
"labels.kind.text": "Text",
|
||||
"labels.labelSize": "Label size",
|
||||
"labels.labelType": "Label type",
|
||||
"labels.layout": "Layout",
|
||||
"labels.modeImage": "Files",
|
||||
"labels.modeLabel": "Label printer",
|
||||
"labels.modeSheet": "Sheet (tile)",
|
||||
"labels.new": "New",
|
||||
"labels.newText": "New text",
|
||||
"labels.noDesignsOption": "No designs yet",
|
||||
"labels.noFilaments": "No filaments.",
|
||||
"labels.noSpools": "No spools.",
|
||||
"labels.onePerLabel": "One {{w}}×{{h}} mm page per label.",
|
||||
"labels.preparing": "Preparing...",
|
||||
"labels.preview": "Preview",
|
||||
"labels.previewWith": "Preview with",
|
||||
"labels.printN_one": "Print {{count}} label",
|
||||
"labels.printN_other": "Print {{count}} labels",
|
||||
"labels.radiusMm": "Radius",
|
||||
"labels.sampleData": "Sample data",
|
||||
"labels.saveAsFormat": "Save as {{format}}",
|
||||
"labels.saved": "Saved",
|
||||
"labels.saving": "Saving...",
|
||||
"labels.searchFilaments": "Search filaments...",
|
||||
"labels.searchSpools": "Search spools...",
|
||||
"labels.selectAllShort": "All",
|
||||
"labels.selectAtLeastOne": "Select at least one spool.",
|
||||
"labels.selectAtLeastOneFilament": "Select at least one filament.",
|
||||
"labels.selectElement": "Select an element to edit it, or add one from the palette.",
|
||||
"labels.selectNoneShort": "None",
|
||||
"labels.selectRecentShort": "Recent ({{count}})",
|
||||
"labels.selectRecentHint": "Select spools added in the last 24 hours",
|
||||
"labels.sortNewest": "Newest",
|
||||
"labels.sortId": "#",
|
||||
"labels.sortHint": "Sort spools",
|
||||
"labels.showingFilament": "Showing filament #{{id}}",
|
||||
"labels.showingReal": "Showing real spool data.",
|
||||
"labels.showingSpool": "Showing spool #{{id}}",
|
||||
"labels.showingTags": "Fields show as tags until you pick a spool above.",
|
||||
"labels.sizeMm": "Size",
|
||||
"labels.skipHint": "Skip Items leaves that many cells blank before the first label, letting you reuse a partly used sheet: count the labels already peeled off, left to right from the top.",
|
||||
"labels.stroke": "Stroke",
|
||||
"labels.strokeMm": "Stroke",
|
||||
"labels.tabDesign": "Design",
|
||||
"labels.tabPrint": "Print",
|
||||
"labels.textTemplate": "Text / template",
|
||||
"labels.typeFilament": "Filament",
|
||||
"labels.typeHint": "Filament labels leave out spool-only fields, and their QR code links to the filament instead of a spool.",
|
||||
"labels.typeSpool": "Spool",
|
||||
"labels.unknownFilament": "Unknown filament",
|
||||
"labels.wMm": "W",
|
||||
"labels.widthMm": "Width",
|
||||
"labels.wrapText": "Wrap text",
|
||||
"labels.xMm": "X",
|
||||
"labels.yMm": "Y",
|
||||
"library.apiError": "Couldn't reach the Spoolman API. Is the backend running?",
|
||||
"library.collapseGroup": "Hide these spools",
|
||||
"library.dateFilter.ago": "{{span}} ago",
|
||||
"library.dateFilter.between": "{{from}} – {{to}}",
|
||||
"library.dateFilter.customRange": "Custom range",
|
||||
"library.dateFilter.from": "From",
|
||||
"library.dateFilter.last": "Last {{span}}",
|
||||
"library.dateFilter.never": "Never",
|
||||
"library.dateFilter.olderThan": "Older than {{span}}",
|
||||
"library.dateFilter.since": "Since {{date}}",
|
||||
"library.dateFilter.to": "To (optional)",
|
||||
"library.dateFilter.until": "Until {{date}}",
|
||||
"library.catalog.allFilaments": "All filaments",
|
||||
"library.catalog.allManufacturers": "All manufacturers",
|
||||
"library.catalog.backToSpools": "Back to spools",
|
||||
"library.catalog.filamentCount_one": "{{count}} filament",
|
||||
"library.catalog.filamentCount_other": "{{count}} filaments",
|
||||
"library.catalog.manufacturerCount_one": "{{count}} manufacturer",
|
||||
"library.catalog.manufacturerCount_other": "{{count}} manufacturers",
|
||||
"library.catalog.noManufacturer": "No manufacturer",
|
||||
"library.catalog.notSet": "Not set",
|
||||
"library.catalog.switchList": "Switch list",
|
||||
"library.catalog.unitFilaments": "filaments",
|
||||
"library.catalog.unitManufacturers": "manufacturers",
|
||||
"library.emptyFiltered": "No {{unit}} match the current filters.",
|
||||
"library.emptyTitle": "No spools yet",
|
||||
"library.emptyBody": "Add your first spool to start tracking your filament.",
|
||||
"library.expandGroup": "Show these spools",
|
||||
"library.filterBy": "Filter by",
|
||||
"library.groupBy": "Group",
|
||||
"library.groupNone": "None (flat)",
|
||||
"library.groupSpools_one": "{{count}} spool",
|
||||
"library.groupSpools_other": "{{count}} spools",
|
||||
"library.nUnused": "×{{count}} unused",
|
||||
"library.noLocation": "no location",
|
||||
"library.noSpools": "No spools",
|
||||
"library.noValues": "No values",
|
||||
"library.openGroup": "Open {{name}}",
|
||||
"library.openManufacturer": "Open manufacturer {{name}}",
|
||||
"library.resizeList": "Resize the list (double-click to reset)",
|
||||
"library.reverseSort": "Reverse the sort order",
|
||||
"library.section.extra": "Extra fields",
|
||||
"library.section.filament": "Filament",
|
||||
"library.section.spool": "Spool",
|
||||
"library.section.vendor": "Manufacturer",
|
||||
"library.showMore": "show {{count}} more",
|
||||
"library.sort.nozzle": "Nozzle temp",
|
||||
"library.sortBy": "Sort",
|
||||
"library.unassigned": "unassigned",
|
||||
"library.unitGroups": "groups",
|
||||
"library.unitSpools": "spools",
|
||||
"library.unused": "unused",
|
||||
"library.unusedGroup": "{{count}} unused · {{weight}} g each",
|
||||
"library.unusedGroupMixed": "{{count}} unused",
|
||||
"library.unusedSub": "{{weight}} g each · {{location}}",
|
||||
"library.unusedSubMixed": "{{location}}",
|
||||
"library.used": "used",
|
||||
"library.usedAgo": "used {{time}} ago",
|
||||
"library.viewMenu.browse": "Browse",
|
||||
"library.views": "Library views",
|
||||
"loading": "Loading",
|
||||
"nav.labels": "Labels",
|
||||
"nav.library": "Library",
|
||||
"no": "No",
|
||||
"notifications.error": "Error (status code: {{statusCode}})",
|
||||
"notifications.saveSuccessful": "Save successful!",
|
||||
"pagination.empty": "No {{unit}}",
|
||||
"pagination.next": "Next page",
|
||||
"pagination.pageSize": "Page size",
|
||||
"pagination.perPage": "{{size}} / page",
|
||||
"pagination.prev": "Previous page",
|
||||
"pagination.range": "{{from}}–{{to}} of {{total}} {{unit}}",
|
||||
"printing.generic.columns": "Columns",
|
||||
"printing.generic.customSize": "Custom",
|
||||
"printing.generic.description": "Tune in the settings below to get the desired print layout. Keep in mind that printers and your OS may apply it's own margins and scaling, so you may need to perform some trial-and-error before it's all correct. Test it on a piece of regular paper before printing on the actual labels.",
|
||||
"printing.generic.dimensions": "Dimensions",
|
||||
"printing.generic.gridTooWide": "The labels are wider than the page. Reduce the number of columns, the spacing, or the margins.",
|
||||
"printing.generic.helpMargin": "Margins should be configured to match your label paper and printer, changing these will affect the size of the entire grid.",
|
||||
"printing.generic.helpPrinterMargin": "Safe-Zone should be set to how close to the paper edge your printer can print, changing these will not affect the entire grid.",
|
||||
"printing.generic.horizontalSpacing": "Horizontal Spacing",
|
||||
"printing.generic.itemCopies": "Item Copies",
|
||||
"printing.generic.marginBottom": "Bottom Margin",
|
||||
"printing.generic.marginLeft": "Left Margin",
|
||||
"printing.generic.marginRight": "Right Margin",
|
||||
"printing.generic.marginTop": "Top Margin",
|
||||
"printing.generic.paperSize": "Paper Size",
|
||||
"printing.generic.printerMarginBottom": "Safe-Zone Bottom",
|
||||
"printing.generic.printerMarginLeft": "Safe-Zone Left",
|
||||
"printing.generic.printerMarginRight": "Safe-Zone Right",
|
||||
"printing.generic.printerMarginTop": "Safe-Zone Top",
|
||||
"printing.generic.skipItems": "Skip Items",
|
||||
"printing.generic.verticalSpacing": "Vertical Spacing",
|
||||
"printing.qrcode.button": "Print Labels",
|
||||
"printing.qrcode.customUrl.caveat": "A custom URL won't scan back into Spoolman — use it to point a printed QR at an external app or a different host.",
|
||||
"printing.qrcode.customUrl.fieldsHint": "Label fields work too, for example",
|
||||
"printing.qrcode.customUrl.hint": "Insert the spool id anywhere with the placeholder",
|
||||
"printing.qrcode.customUrl.label": "Custom URL template",
|
||||
"printing.qrcode.useHTTPUrl.label": "QR code link",
|
||||
"printing.qrcode.useHTTPUrl.options.custom": "Custom URL",
|
||||
"printing.qrcode.useHTTPUrl.options.default": "Default",
|
||||
"printing.qrcode.useHTTPUrl.options.url": "URL",
|
||||
"printing.qrcode.useHTTPUrl.preview": "Preview:",
|
||||
"printing.qrcode.useHTTPUrl.tooltip": "Default encodes a Spoolman-only code that only Spoolman's own scanner can read. URL encodes a normal web link that any scanner can open, built from the base URL in settings — or this site's address if that's unset.",
|
||||
"printing.spoolSelect.selectedTotal_one": "{{count}} spool selected",
|
||||
"printing.spoolSelect.selectedTotal_other": "{{count}} spools selected",
|
||||
"scanner.camera": "Camera",
|
||||
"scanner.cameraNumbered": "Camera {{number}}",
|
||||
"scanner.description": "Scan a Spoolman QR code to view details about the spool.",
|
||||
"scanner.error.insecureContext": "The page is not served over HTTPS.",
|
||||
"scanner.error.notAllowed": "You have not allowed access to the camera.",
|
||||
"scanner.error.notFound": "No camera was found.",
|
||||
"scanner.error.streamApiNotSupported": "The browser does not support the MediaStream API.",
|
||||
"scanner.error.unknown": "An unknown error occurred. ({{error}})",
|
||||
"scanner.error.inUse": "The camera is already in use by another application.",
|
||||
"scanner.starting": "Starting camera...",
|
||||
"scanner.title": "QR Code Scanner",
|
||||
"search.colorHint": "Color names must be entered in English.",
|
||||
"search.browseAll": "Browse all",
|
||||
"search.hint": "Search spools, filaments and manufacturers by name, color, material or any field.",
|
||||
"search.moreSpools": "+{{count}} more",
|
||||
"search.noResults": "No matches found",
|
||||
"search.searching": "Searching...",
|
||||
"search.section.filaments": "Filaments",
|
||||
"search.section.spools": "Spools",
|
||||
"search.section.vendors": "Manufacturers",
|
||||
"search.threshold": "Color match",
|
||||
"search.unknownFilament": "Unknown filament",
|
||||
"settings.appearance.tab": "Appearance",
|
||||
"settings.appearance.theme.dark": "Dark",
|
||||
"settings.appearance.theme.desc": "Color theme (this browser only)",
|
||||
"settings.appearance.theme.label": "Theme",
|
||||
"settings.appearance.theme.light": "Light",
|
||||
"settings.appearance.theme.system": "System",
|
||||
"settings.extraFields.addChoice": "add choice...",
|
||||
"settings.extraFields.addChoicesFirst": "Add choices first",
|
||||
"settings.extraFields.addEntityField": "Add {{entity}} field",
|
||||
"settings.extraFields.booleanFalse": "No",
|
||||
"settings.extraFields.booleanTrue": "Yes",
|
||||
"settings.extraFields.deleteConfirm": "Delete field {{name}} on {{entity}}?",
|
||||
"settings.extraFields.description.constraints": "Once a field is added, you can not change its key or type, and for choice type fields you can not remove choices or change the multi choice state. If you remove a field, the associated data for all entities will be deleted.",
|
||||
"settings.extraFields.description.intro": "Here you can add extra custom fields to your entities.",
|
||||
"settings.extraFields.description.keyUsage": "The key is what other programs read/write the data as, so if your custom field is supposed to integrate with a third-party program, make sure to set it correctly. Default value is only applied to new items.",
|
||||
"settings.extraFields.description.tableViews": "Extra fields can be shown and sorted in the table views. Choice and boolean fields expose filter options there as well, and all extra field types support filtering for empty values.",
|
||||
"settings.extraFields.editorEdit": "Edit {{entity}} field",
|
||||
"settings.extraFields.editorNew": "New {{entity}} field",
|
||||
"settings.extraFields.errors.choiceNeeded": "Choice fields need at least one choice.",
|
||||
"settings.extraFields.errors.choicesRemoved": "Existing choices cannot be removed: {{choices}}.",
|
||||
"settings.extraFields.errors.deleteFailed": "Failed to delete field.",
|
||||
"settings.extraFields.errors.keyFormat": "Key must contain only lowercase letters, numbers and underscores.",
|
||||
"settings.extraFields.errors.nameRequired": "Name is required.",
|
||||
"settings.extraFields.errors.saveFailed": "Failed to save field.",
|
||||
"settings.extraFields.fieldType.boolean": "Boolean",
|
||||
"settings.extraFields.fieldType.choice": "Choice",
|
||||
"settings.extraFields.fieldType.datetime": "Datetime",
|
||||
"settings.extraFields.fieldType.float": "Float",
|
||||
"settings.extraFields.fieldType.floatRange": "Float Range",
|
||||
"settings.extraFields.fieldType.integer": "Integer",
|
||||
"settings.extraFields.fieldType.integerRange": "Integer Range",
|
||||
"settings.extraFields.fieldType.text": "Text",
|
||||
"settings.extraFields.max": "max",
|
||||
"settings.extraFields.min": "min",
|
||||
"settings.extraFields.multiSuffix": " · multi",
|
||||
"settings.extraFields.multiple": "Multiple",
|
||||
"settings.extraFields.namePlaceholder": "Display name",
|
||||
"settings.extraFields.nonUniqueKeyError": "The key must be unique.",
|
||||
"settings.extraFields.none": "No {{entity}} extra fields defined yet.",
|
||||
"settings.extraFields.params.choices": "Choices",
|
||||
"settings.extraFields.params.defaultValue": "Default Value",
|
||||
"settings.extraFields.params.fieldType": "Type",
|
||||
"settings.extraFields.params.key": "Key",
|
||||
"settings.extraFields.params.name": "Name",
|
||||
"settings.extraFields.params.order": "Order",
|
||||
"settings.extraFields.params.unit": "Unit",
|
||||
"settings.extraFields.reorderChoice": "Drag, or use the arrow keys, to reorder this choice.",
|
||||
"settings.extraFields.saveField": "Save field",
|
||||
"settings.extraFields.tab": "Extra Fields",
|
||||
"settings.general.baseUrl.label": "Base URL",
|
||||
"settings.general.baseUrl.tooltip": "The base URL to use when generating features such as QR codes.",
|
||||
"settings.general.currency.desc": "Three-letter ISO code (e.g. EUR, USD) used for prices",
|
||||
"settings.general.currency.label": "Currency",
|
||||
"settings.general.roundPrices.label": "Round prices",
|
||||
"settings.general.roundPrices.tooltip": "Round prices to the nearest whole number.",
|
||||
"settings.general.tab": "General",
|
||||
"settings.header": "Settings",
|
||||
"settings.language.desc": "Interface language (this browser only)",
|
||||
"settings.language.label": "Language",
|
||||
"settings.library.lowThreshold.desc": "Spools at or below this weight are flagged red (this browser only)",
|
||||
"settings.library.lowThreshold.label": "Low-stock threshold",
|
||||
"settings.library.tab": "Library behavior",
|
||||
"settings.scanner.autoNavigate.desc": "Automatically navigate in this web browser to a spool or filament that gets read by a tag reader.",
|
||||
"settings.scanner.autoNavigate.label": "Auto-navigate",
|
||||
"settings.scanner.docs": "How to set up a tag reader",
|
||||
"settings.scanner.lastSeen": "{{when}} ago",
|
||||
"settings.scanner.pair": "Pair by tapping",
|
||||
"settings.scanner.reader.anyDesc": "Scans from any reader open spools or filaments in this web browser. You can pair with a specific one if you want finer control. This is also the reader that will be used for adding new tags to spools and filaments.",
|
||||
"settings.scanner.reader.label": "Tag Reader",
|
||||
"settings.scanner.reader.pairedDesc": "Only scans from this reader open spools in this web browser.",
|
||||
"settings.scanner.recent": "Recent readers",
|
||||
"settings.scanner.recentNone": "No reader in memory, set up a tag reader then read any tag for it to appear here.",
|
||||
"settings.scanner.tab": "Tag Scanning",
|
||||
"settings.scanner.unpair": "Use any reader",
|
||||
"settings.scanner.use": "Use this one",
|
||||
"settings.scanner.waiting": "Tap any tag on the reader you want...",
|
||||
"sponsor": "Sponsor me on GitHub",
|
||||
"spool.fields.archived": "Archived",
|
||||
"spool.fields.comment": "Comment",
|
||||
"spool.fields.filament": "Filament",
|
||||
"spool.fields.firstUsed": "First Used",
|
||||
"spool.fields.id": "ID",
|
||||
"spool.fields.lastUsed": "Last Used",
|
||||
"spool.fields.location": "Location",
|
||||
"spool.fields.lotNr": "Lot Nr",
|
||||
"spool.fields.material": "Material",
|
||||
"spool.fields.measuredWeight": "Measured Weight",
|
||||
"spool.fields.price": "Price",
|
||||
"spool.fields.registered": "Registered",
|
||||
"spool.fields.remainingWeight": "Remaining Weight",
|
||||
"spool.fields.spoolWeight": "Spool Weight",
|
||||
"spool.fields.usedWeight": "Used Weight",
|
||||
"spool.fields.weight": "Weight",
|
||||
"spool.fieldsHelp.location": "Where you physically keep this spool — a shelf, a drawer, a dry box, or the printer it is loaded in. Spools are grouped by location in your library, so it is how you find one again.",
|
||||
"spool.fieldsHelp.lotNr": "Manufacturer's lot number. Can be used to ensure a print has consistent color if multiple spools are used.",
|
||||
"spool.fieldsHelp.measuredWeight": "How much the filament and spool weigh.",
|
||||
"spool.fieldsHelp.price": "Price of a full spool. If not set, the price of the filament will be assumed instead.",
|
||||
"spool.fieldsHelp.remainingWeight": "How much filament is left on the spool. For a new spool this should match the spool weight.",
|
||||
"spool.fieldsHelp.spoolWeight": "What this spool weighs when empty. Leave it blank to follow the filament's spool weight, and set it when this particular spool differs — a respooled roll, or a cardboard core swapped for a plastic one. It is what gets subtracted from the reading when you adjust by measured weight, so a wrong one misstates how much filament is left.",
|
||||
"spool.fieldsHelp.usedWeight": "How much filament has been used from the spool. A new spool should have 0g used.",
|
||||
"spool.fieldsHelp.weight": "How much filament this spool held when full (net weight, not counting the spool itself). Leave it blank to follow the filament's weight, and set it when this particular spool differs — a partial roll, or the same filament bought on a larger one.",
|
||||
"spool.form.measurementType.length": "Length",
|
||||
"spool.form.measurementType.weight": "Weight",
|
||||
"spool.spool": "Spools",
|
||||
"tags.add": "Add tag",
|
||||
"tags.added": "Tag linked.",
|
||||
"tags.addedOn": "Added {{date}}",
|
||||
"tags.modal.alreadyHere": "This tag already identifies this spool.",
|
||||
"tags.modal.alreadyHereFilament": "This tag already identifies this filament.",
|
||||
"tags.modal.badUid": "A tag UID is hexadecimal, like 04A2B3C4.",
|
||||
"tags.modal.checking": "Checking...",
|
||||
"tags.modal.failed": "Could not link the tag.",
|
||||
"tags.modal.filamentNamed": "filament {{name}}",
|
||||
"tags.modal.free": "This tag is not linked to anything yet.",
|
||||
"tags.modal.intro": "Tapping this tag on a reader will then find spool #{{id}}.",
|
||||
"tags.modal.introFilament": "Tapping this tag on a reader will then find this filament.",
|
||||
"tags.modal.lastSeenOn": "{{reader}} last read {{uid}}.",
|
||||
"tags.modal.link": "Link tag",
|
||||
"tags.modal.linking": "Linking...",
|
||||
"tags.modal.move": "Move it here from #{{id}}",
|
||||
"tags.modal.moveFailed": "Could not move the tag. It may now be linked to neither spool — try linking it again.",
|
||||
"tags.modal.moveFailedFilament": "Could not move the tag. It may now be linked to nothing — try linking it again.",
|
||||
"tags.modal.moveHere": "Move it here",
|
||||
"tags.modal.moving": "Moving...",
|
||||
"tags.modal.phoneReading": "Hold the tag against your phone...",
|
||||
"tags.modal.phoneScan": "Read a tag with this phone",
|
||||
"tags.modal.spoolNamed": "spool #{{id}}, {{name}}",
|
||||
"tags.modal.spoolShort": "spool #{{id}}",
|
||||
"tags.modal.takenBy": "Currently linked to {{spool}}.",
|
||||
"tags.modal.title": "Link a tag",
|
||||
"tags.modal.uidHelp": "Separators and capitalisation make no difference: 04:a2:b3:c4, 04-A2-B3-C4 and 04a2b3c4 are all the same tag.",
|
||||
"tags.modal.uidLabel": "Tag UID",
|
||||
"tags.modal.uidPlaceholder": "04A2B3C4",
|
||||
"tags.modal.useLastSeen": "Use it",
|
||||
"tags.modal.waitingAny": "Waiting for a tap on any reader.",
|
||||
"tags.modal.waitingOn": "Waiting for a tap on {{reader}}.",
|
||||
"tags.moved": "Tag moved here from spool #{{id}}.",
|
||||
"tags.movedFromFilament": "Tag moved here from filament {{name}}.",
|
||||
"tags.nfc.insecureContext": "Reading tags needs a secure connection. Open Spoolman over HTTPS to use your phone's NFC.",
|
||||
"tags.nfc.notAllowed": "This site is not allowed to use NFC. Grant it permission in your browser's site settings and try again.",
|
||||
"tags.nfc.notReadable": "The NFC reader is unavailable — another app may be using it.",
|
||||
"tags.nfc.notSupported": "This phone has no NFC, or NFC is switched off in system settings.",
|
||||
"tags.nfc.unknown": "Could not read a tag.",
|
||||
"tags.none": "No tags linked.",
|
||||
"tags.scan.openedFilament": "Tag scanned: opened filament {{name}}.",
|
||||
"tags.scan.openedSpool": "Tag scanned: opened spool #{{id}}, {{name}}.",
|
||||
"tags.scan.unknown": "Unknown tag {{uid}}. Open the spool or filament it belongs to and use Add tag to link it.",
|
||||
"tags.section": "Tags",
|
||||
"tags.unlink": "Unlink",
|
||||
"tags.unlinkBody": "Tag {{uid}} will stop identifying this spool. Nothing is written to the tag itself, so you can link it again — to this spool or another one — whenever you like.",
|
||||
"tags.unlinkBodyFilament": "Tag {{uid}} will stop identifying this filament. Nothing is written to the tag itself, so you can link it again — here or somewhere else — whenever you like.",
|
||||
"tags.unlinkFailed": "Could not unlink the tag.",
|
||||
"tags.unlinkTitle": "Unlink this tag?",
|
||||
"tags.unlinked": "Tag unlinked.",
|
||||
"tags.unlinking": "Unlinking...",
|
||||
"topbar.addSpools": "Add spools",
|
||||
"topbar.searchPlaceholder": "Search — try \"red\" or \"pla\"",
|
||||
"unknown": "Unknown",
|
||||
"validation.hexDigits": "Use 6 or 8 hex digits",
|
||||
"validation.maxChars": "At most {{max}} characters",
|
||||
"validation.mustBeGt": "Must be greater than {{value}}",
|
||||
"validation.mustBeMax": "Must be {{value}} or less",
|
||||
"validation.mustBeMin": "Must be {{value}} or more",
|
||||
"validation.mustBeNumber": "Must be a number",
|
||||
"validation.required": "Required",
|
||||
"vendor.fields.comment": "Comment",
|
||||
"vendor.fields.emptySpoolWeight": "Empty Spool Weight",
|
||||
"vendor.fields.externalId": "External ID",
|
||||
"vendor.fields.id": "ID",
|
||||
"vendor.fields.name": "Name",
|
||||
"vendor.fields.registered": "Registered",
|
||||
"vendor.showAsList": "Show as a list",
|
||||
"vendor.fieldsHelp.emptySpoolWeight": "The weight of an empty spool from this manufacturer.",
|
||||
"yes": "Yes"
|
||||
}
|
||||
@@ -0,0 +1,466 @@
|
||||
{
|
||||
"add.addAndNew": "",
|
||||
"add.addN_many": "Añadir {{count}} bobinas",
|
||||
"add.addN_one": "Añadir {{count}} bobina",
|
||||
"add.addN_other": "Añadir {{count}} bobinas",
|
||||
"add.adding": "",
|
||||
"add.advanced": "Especificaciones Avanzadas",
|
||||
"add.advancedNote": "densidad, diámetro, temperaturas (autorrellenado desde material)",
|
||||
"add.change": "",
|
||||
"add.count": "",
|
||||
"add.createNew": "",
|
||||
"add.createNewSub": "",
|
||||
"add.dbUnavailable": "",
|
||||
"add.duplicate": "",
|
||||
"add.duplicateNote": "",
|
||||
"add.duplicateRename": "",
|
||||
"add.duplicateTitle": "",
|
||||
"add.filamentNamePlaceholder": "",
|
||||
"add.fill.full": "",
|
||||
"add.fillLevel": "",
|
||||
"add.importNote": "",
|
||||
"add.inCatalog": "",
|
||||
"add.locationHint": "",
|
||||
"add.locationPlaceholder": "",
|
||||
"add.manufacturerPlaceholder": "",
|
||||
"add.nameHint": "",
|
||||
"add.newFilament": "",
|
||||
"add.newFilamentTitle": "",
|
||||
"add.noCatalog": "",
|
||||
"add.noManufacturer": "",
|
||||
"add.pickColor": "",
|
||||
"add.searchPlaceholder": "",
|
||||
"add.searching": "",
|
||||
"add.spoolWeightPreset.cardboard": "",
|
||||
"add.spoolWeightPreset.plastic": "",
|
||||
"add.spoolWeightPresetsLead": "",
|
||||
"add.step2": "",
|
||||
"add.typeToSearchAll": "",
|
||||
"add.typeToSearchMatches": "",
|
||||
"add.useExisting": "",
|
||||
"add.vendorHint.existing": "",
|
||||
"add.vendorHint.new": "",
|
||||
"add.vendorHint.optional": "",
|
||||
"add.yourCatalog": "",
|
||||
"buttons.archive": "Archivar",
|
||||
"buttons.cancel": "Cancelar",
|
||||
"buttons.clear": "Limpiar",
|
||||
"buttons.close": "",
|
||||
"buttons.delete": "Borrar",
|
||||
"buttons.edit": "Editar",
|
||||
"buttons.filter": "Filtrar",
|
||||
"buttons.save": "Guardar",
|
||||
"buttons.showArchived": "Mostrar Archivados",
|
||||
"buttons.unArchive": "Desarchivar",
|
||||
"common.decrement": "",
|
||||
"common.increment": "",
|
||||
"common.remove": "",
|
||||
"common.search": "",
|
||||
"dashboard.addFieldHint": "",
|
||||
"dashboard.dashboard": "",
|
||||
"dashboard.deleteGroup": "",
|
||||
"dashboard.dragHint": "",
|
||||
"dashboard.dropHere": "",
|
||||
"dashboard.emptyHelp": "",
|
||||
"dashboard.errorEmptyName": "",
|
||||
"dashboard.errorExists": "",
|
||||
"dashboard.errorRename": "",
|
||||
"dashboard.lastUsed": "",
|
||||
"dashboard.newGroup": "",
|
||||
"dashboard.newGroupName": "",
|
||||
"dashboard.reorderGroup": "",
|
||||
"dashboard.unassigned": "",
|
||||
"datetime.done": "",
|
||||
"datetime.hour": "",
|
||||
"datetime.minute": "",
|
||||
"datetime.nextMonth": "",
|
||||
"datetime.now": "",
|
||||
"datetime.pick": "",
|
||||
"datetime.prevMonth": "",
|
||||
"datetime.time": "",
|
||||
"documentTitle.dashboard.list": "",
|
||||
"documentTitle.labels.list": "",
|
||||
"documentTitle.library.list": "",
|
||||
"documentTitle.locations.list": "Ubicaciones | Spoolman",
|
||||
"documentTitle.settings.list": "",
|
||||
"filament.fields.addColor": "",
|
||||
"filament.fields.articleNumber": "Numero de Articulo",
|
||||
"filament.fields.coaxial": "coextruido",
|
||||
"filament.fields.colorHex": "Color",
|
||||
"filament.fields.colorType": "",
|
||||
"filament.fields.comment": "Comentarios",
|
||||
"filament.fields.density": "Densidad",
|
||||
"filament.fields.diameter": "Diámetro",
|
||||
"filament.fields.externalId": "ID Externo",
|
||||
"filament.fields.id": "ID",
|
||||
"filament.fields.longitudinal": "Longitudinal",
|
||||
"filament.fields.material": "Material",
|
||||
"filament.fields.multiColor": "Multiple",
|
||||
"filament.fields.name": "Nombre",
|
||||
"filament.fields.price": "Precio",
|
||||
"filament.fields.registered": "Registrado",
|
||||
"filament.fields.removeColor": "",
|
||||
"filament.fields.settingsBedTemp": "Temp. de Cama",
|
||||
"filament.fields.settingsExtruderTemp": "Temp. del Extrusor",
|
||||
"filament.fields.singleColor": "Único",
|
||||
"filament.fields.spoolWeight": "Peso de la Bobina",
|
||||
"filament.fields.vendor": "Fabricante",
|
||||
"filament.fields.weight": "Peso",
|
||||
"filament.fieldsHelp.articleNumber": "ej. EAN, UPC, etc.",
|
||||
"filament.fieldsHelp.multiColorDirection": "Los filamentos pueden tener varios colores de dos formas: mediante coextrusión, como los filamentos bicolor con multicolores consistentes, o mediante cambios de color longitudinales, como los filamentos degradados que cambian de color a lo largo de la bobina.",
|
||||
"filament.fieldsHelp.spoolWeight": "El peso de una bobina vacía. Se utiliza para determinar el peso medido de una bobina.",
|
||||
"filament.fieldsHelp.weight": "El peso de una bobina entera (peso neto). Esta cifra no debe incluir el peso de la bobina vacía, solo el filamento. Es, normalmente, el peso escrito en la etiqueta de la bobina.",
|
||||
"filament.filament": "Filamentos",
|
||||
"footer.documentation": "",
|
||||
"footer.reportIssue": "",
|
||||
"help.help": "Ayuda",
|
||||
"inspector.addSpoolsOfThis": "",
|
||||
"inspector.adjustFailed": "",
|
||||
"inspector.adjustHelp": "",
|
||||
"inspector.adjustWeight": "",
|
||||
"inspector.apply": "",
|
||||
"inspector.applying": "",
|
||||
"inspector.colorHex": "",
|
||||
"inspector.consumeAmount": "",
|
||||
"inspector.delete.deleting": "",
|
||||
"inspector.delete.errorGone": "",
|
||||
"inspector.delete.errorSpoolsExist": "",
|
||||
"inspector.delete.errorUnknown": "",
|
||||
"inspector.delete.filament": "",
|
||||
"inspector.delete.filamentBlockedHint": "",
|
||||
"inspector.delete.filamentBlockedTitle": "",
|
||||
"inspector.delete.filamentBody": "",
|
||||
"inspector.delete.filamentDone": "",
|
||||
"inspector.delete.filamentTitle": "",
|
||||
"inspector.delete.spool": "",
|
||||
"inspector.delete.spoolBody": "",
|
||||
"inspector.delete.spoolDone": "",
|
||||
"inspector.delete.spoolRemaining": "",
|
||||
"inspector.delete.spoolTitle": "",
|
||||
"inspector.delete.vendor": "",
|
||||
"inspector.delete.vendorBody": "",
|
||||
"inspector.delete.vendorDone": "",
|
||||
"inspector.delete.vendorTitle": "",
|
||||
"inspector.duplicateFilament": "",
|
||||
"inspector.empty": "",
|
||||
"inspector.enterValidLength": "",
|
||||
"inspector.enterValidWeight": "",
|
||||
"inspector.loading": "",
|
||||
"inspector.manageExtraFields": "",
|
||||
"inspector.measuredHelp": "",
|
||||
"inspector.multi": "",
|
||||
"inspector.newGross": "",
|
||||
"inspector.noExtraFields": "",
|
||||
"inspector.notFound": "",
|
||||
"inspector.ofRemaining": "",
|
||||
"inspector.openFilament": "",
|
||||
"inspector.openLink": "",
|
||||
"inspector.openManufacturer": "",
|
||||
"inspector.specs": "",
|
||||
"inspector.spoolsCount": "",
|
||||
"inspector.spoolsTotalRemaining": "",
|
||||
"inspector.used": "",
|
||||
"kofi": "Donar en Ko-fi",
|
||||
"labels.addHead": "",
|
||||
"labels.addQr": "",
|
||||
"labels.addRect": "",
|
||||
"labels.addSwatch": "",
|
||||
"labels.addText": "",
|
||||
"labels.align": "",
|
||||
"labels.alignCenter": "",
|
||||
"labels.alignLeft": "",
|
||||
"labels.alignRight": "",
|
||||
"labels.blank": "",
|
||||
"labels.bold": "",
|
||||
"labels.canvasHint": "",
|
||||
"labels.centerLogo": "",
|
||||
"labels.chooseField": "",
|
||||
"labels.clearFill": "",
|
||||
"labels.copies": "",
|
||||
"labels.cornerRadiusMm": "",
|
||||
"labels.createFirst": "",
|
||||
"labels.cutGuides": "",
|
||||
"labels.deleteConfirm": "",
|
||||
"labels.deleteElement": "",
|
||||
"labels.designName": "",
|
||||
"labels.designerDesc": "",
|
||||
"labels.designerTitle": "",
|
||||
"labels.dpi": "",
|
||||
"labels.dpiHint": "",
|
||||
"labels.duplicate": "",
|
||||
"labels.fields.bedTemp": "",
|
||||
"labels.fields.diameterMm": "",
|
||||
"labels.fields.groupVendor": "",
|
||||
"labels.fields.initialG": "",
|
||||
"labels.fields.netWeightG": "",
|
||||
"labels.fields.remainingG": "",
|
||||
"labels.fill": "",
|
||||
"labels.fitWidth": "",
|
||||
"labels.fitWidthHint": "",
|
||||
"labels.fontMm": "",
|
||||
"labels.gridInfo": "",
|
||||
"labels.hMm": "",
|
||||
"labels.heightMm": "",
|
||||
"labels.hintNowrap": "",
|
||||
"labels.hintSwatch": "",
|
||||
"labels.hintWrap": "",
|
||||
"labels.imageDesc": "",
|
||||
"labels.imageZipNote": "",
|
||||
"labels.insertField": "",
|
||||
"labels.kind.qr": "",
|
||||
"labels.kind.rect": "",
|
||||
"labels.kind.swatch": "",
|
||||
"labels.kind.text": "",
|
||||
"labels.labelSize": "",
|
||||
"labels.labelType": "",
|
||||
"labels.layout": "",
|
||||
"labels.modeImage": "",
|
||||
"labels.modeLabel": "",
|
||||
"labels.modeSheet": "",
|
||||
"labels.new": "",
|
||||
"labels.newText": "",
|
||||
"labels.noDesignsOption": "",
|
||||
"labels.noFilaments": "",
|
||||
"labels.noSpools": "",
|
||||
"labels.onePerLabel": "",
|
||||
"labels.preparing": "",
|
||||
"labels.preview": "",
|
||||
"labels.previewWith": "",
|
||||
"labels.radiusMm": "",
|
||||
"labels.sampleData": "",
|
||||
"labels.saved": "",
|
||||
"labels.saving": "",
|
||||
"labels.searchFilaments": "",
|
||||
"labels.searchSpools": "",
|
||||
"labels.selectAllShort": "",
|
||||
"labels.selectAtLeastOne": "",
|
||||
"labels.selectAtLeastOneFilament": "",
|
||||
"labels.selectDesign": "",
|
||||
"labels.selectElement": "",
|
||||
"labels.selectNoneShort": "",
|
||||
"labels.selectRecentHint": "",
|
||||
"labels.selectRecentShort": "",
|
||||
"labels.showingFilament": "",
|
||||
"labels.showingReal": "",
|
||||
"labels.showingSpool": "",
|
||||
"labels.showingTags": "",
|
||||
"labels.sizeMm": "",
|
||||
"labels.skipHint": "",
|
||||
"labels.sortHint": "",
|
||||
"labels.sortId": "",
|
||||
"labels.sortNewest": "",
|
||||
"labels.stroke": "",
|
||||
"labels.strokeMm": "",
|
||||
"labels.tabDesign": "",
|
||||
"labels.tabPrint": "",
|
||||
"labels.textTemplate": "",
|
||||
"labels.typeFilament": "",
|
||||
"labels.typeHint": "",
|
||||
"labels.typeSpool": "",
|
||||
"labels.unknownFilament": "",
|
||||
"labels.wMm": "",
|
||||
"labels.widthMm": "",
|
||||
"labels.wrapText": "",
|
||||
"labels.xMm": "",
|
||||
"labels.yMm": "",
|
||||
"library.apiError": "",
|
||||
"library.collapseGroup": "",
|
||||
"library.emptyBody": "",
|
||||
"library.emptyFiltered": "",
|
||||
"library.emptyTitle": "",
|
||||
"library.expandGroup": "",
|
||||
"library.filterBy": "",
|
||||
"library.groupBy": "",
|
||||
"library.groupNone": "",
|
||||
"library.nUnused": "",
|
||||
"library.noLocation": "",
|
||||
"library.noValues": "",
|
||||
"library.openGroup": "",
|
||||
"library.openManufacturer": "",
|
||||
"library.section.extra": "",
|
||||
"library.section.filament": "",
|
||||
"library.section.spool": "",
|
||||
"library.section.vendor": "",
|
||||
"library.showMore": "",
|
||||
"library.sort.nozzle": "",
|
||||
"library.sortBy": "",
|
||||
"library.unassigned": "",
|
||||
"library.unitGroups": "",
|
||||
"library.unitSpools": "",
|
||||
"library.unused": "",
|
||||
"library.unusedGroup": "",
|
||||
"library.unusedGroupMixed": "",
|
||||
"library.unusedSub": "",
|
||||
"library.unusedSubMixed": "",
|
||||
"library.used": "",
|
||||
"library.usedAgo": "",
|
||||
"loading": "Cargando",
|
||||
"locations.locations": "Ubicaciones",
|
||||
"locations.newLocation": "Nueva ubicación",
|
||||
"locations.noLocation": "Sin ubicación",
|
||||
"locations.noLocationsHelp": "Esta página te permite organizar tus carretes en ubicaciones, ¡añade algunos carretes para empezar!",
|
||||
"nav.labels": "",
|
||||
"nav.library": "",
|
||||
"no": "No",
|
||||
"notifications.error": "Error (status code: {{statusCode}})",
|
||||
"notifications.saveSuccessful": "¡Se guardo correctamente!",
|
||||
"pagination.empty": "",
|
||||
"pagination.next": "",
|
||||
"pagination.pageSize": "",
|
||||
"pagination.perPage": "",
|
||||
"pagination.prev": "",
|
||||
"pagination.range": "",
|
||||
"printing.generic.columns": "Columnas",
|
||||
"printing.generic.customSize": "Personalizar",
|
||||
"printing.generic.description": "Ajuste los parámetros siguientes para obtener el diseño de impresión deseado. Recuerda que impresoras y el sistema operativo aplican sus propios márgenes y escala. Es probable que tengas que probar con valores varias veces hasta que el diseño te parezca correcto. Prueba en papel normal antes de usar etiquetas.",
|
||||
"printing.generic.dimensions": "Dimensiones",
|
||||
"printing.generic.gridTooWide": "",
|
||||
"printing.generic.helpMargin": "Los márgenes deben ser configurados a ser los mismos que tu papel e impresora. Cambiar los mismos afectaran todas las etiquetas.",
|
||||
"printing.generic.helpPrinterMargin": "La Zona de Seguridad debe ajustarse lo más cercano posible al borde que tu impresora es capaz de imprimir. Cambiar estos valores no afectaran todas las etiquetas.",
|
||||
"printing.generic.horizontalSpacing": "Espacio Horizontal",
|
||||
"printing.generic.itemCopies": "Copias del artículo",
|
||||
"printing.generic.marginBottom": "Margen Inferior",
|
||||
"printing.generic.marginLeft": "Margen Izquierdo",
|
||||
"printing.generic.marginRight": "Margen Derecho",
|
||||
"printing.generic.marginTop": "Margen Superior",
|
||||
"printing.generic.paperSize": "Tamaño de Papel",
|
||||
"printing.generic.printerMarginBottom": "Zona Segura Inferior",
|
||||
"printing.generic.printerMarginLeft": "Zona Segura Izquierda",
|
||||
"printing.generic.printerMarginRight": "Zona Segura Derecha",
|
||||
"printing.generic.printerMarginTop": "Zona Segura Superior",
|
||||
"printing.generic.saveAsImage": "Guardar como una imagen",
|
||||
"printing.generic.skipItems": "Saltar Elementos",
|
||||
"printing.generic.verticalSpacing": "Espacio Vertical",
|
||||
"printing.qrcode.button": "Imprimir las etiquetas",
|
||||
"printing.qrcode.customUrl.caveat": "",
|
||||
"printing.qrcode.customUrl.hint": "",
|
||||
"printing.qrcode.customUrl.label": "",
|
||||
"printing.qrcode.useHTTPUrl.label": "Enlace al código QR",
|
||||
"printing.qrcode.useHTTPUrl.options.custom": "",
|
||||
"printing.qrcode.useHTTPUrl.options.default": "Por defecto",
|
||||
"printing.qrcode.useHTTPUrl.options.url": "URL",
|
||||
"printing.qrcode.useHTTPUrl.preview": "Vista previa:",
|
||||
"printing.qrcode.useHTTPUrl.tooltip": "Se utilizará un enlace propietario que funcionará solo si se escanea desde la función de escaneo de Spoolman (predeterminado). La URL utiliza la URL base especificada en la configuración o la URL de la página actual si no está configurada.",
|
||||
"printing.spoolSelect.selectedTotal_many": "{{count}} bobinas seleccionadas",
|
||||
"printing.spoolSelect.selectedTotal_one": "{{count}} bobina seleccionada",
|
||||
"printing.spoolSelect.selectedTotal_other": "{{count}} bobinas seleccionadas",
|
||||
"scanner.description": "Escanea un código QR de Spoolman para ver detalles de la bobina.",
|
||||
"scanner.error.inUse": "",
|
||||
"scanner.error.insecureContext": "La página no se muestra a través de HTTPS.",
|
||||
"scanner.error.notAllowed": "No has dado permiso de acceso a la cámara.",
|
||||
"scanner.error.notFound": "La cámara no ha sido detectada.",
|
||||
"scanner.error.streamApiNotSupported": "El navegador no es compatible con la API MediaStream.",
|
||||
"scanner.error.unknown": "Un error desconocido ocurrió. ({{error}})",
|
||||
"scanner.starting": "",
|
||||
"scanner.title": "Escáner de Código QR",
|
||||
"search.colorHint": "",
|
||||
"search.noResults": "",
|
||||
"search.searching": "",
|
||||
"search.section.filaments": "",
|
||||
"search.section.spools": "",
|
||||
"search.section.vendors": "",
|
||||
"search.threshold": "",
|
||||
"search.unknownFilament": "",
|
||||
"settings.appearance.tab": "",
|
||||
"settings.appearance.theme.dark": "",
|
||||
"settings.appearance.theme.desc": "",
|
||||
"settings.appearance.theme.label": "",
|
||||
"settings.appearance.theme.light": "",
|
||||
"settings.appearance.theme.system": "",
|
||||
"settings.extraFields.addChoice": "",
|
||||
"settings.extraFields.addChoicesFirst": "",
|
||||
"settings.extraFields.addEntityField": "",
|
||||
"settings.extraFields.booleanFalse": "No",
|
||||
"settings.extraFields.booleanTrue": "Sí",
|
||||
"settings.extraFields.deleteConfirm": "¿Borrar campo {{name}}?",
|
||||
"settings.extraFields.description.constraints": " Una vez que se agrega un campo, no puede cambiar su clave o tipo, y no puede eliminar opciones ni cambiar el estado de múltiples opciones para campos seleccionados. Si elimina un campo, se eliminarán los datos asociados a todos los sujetos.",
|
||||
"settings.extraFields.description.intro": " Aquí puede agregar más campos personalizados a los asuntos.",
|
||||
"settings.extraFields.description.keyUsage": " La forma en que otros programas leen/escriben los datos es clave, por lo que si su campo personalizado se va a integrar con un programa de terceros, asegúrese de que esté configurado correctamente. El valor predeterminado solo se utilizará para elementos nuevos.",
|
||||
"settings.extraFields.description.tableViews": " Los campos de salida no se pueden ordenar ni filtrar en las vistas de tabla.",
|
||||
"settings.extraFields.editorEdit": "",
|
||||
"settings.extraFields.editorNew": "",
|
||||
"settings.extraFields.errors.choiceNeeded": "",
|
||||
"settings.extraFields.errors.choicesRemoved": "",
|
||||
"settings.extraFields.errors.deleteFailed": "",
|
||||
"settings.extraFields.errors.keyFormat": "",
|
||||
"settings.extraFields.errors.nameRequired": "",
|
||||
"settings.extraFields.errors.saveFailed": "",
|
||||
"settings.extraFields.fieldType.boolean": "Booleano",
|
||||
"settings.extraFields.fieldType.choice": "Opción",
|
||||
"settings.extraFields.fieldType.datetime": "Fecha y hora",
|
||||
"settings.extraFields.fieldType.float": "Decimal",
|
||||
"settings.extraFields.fieldType.floatRange": "Rango Decimal",
|
||||
"settings.extraFields.fieldType.integer": "Entero",
|
||||
"settings.extraFields.fieldType.integerRange": "Rango de enteros",
|
||||
"settings.extraFields.fieldType.text": "Texto",
|
||||
"settings.extraFields.max": "",
|
||||
"settings.extraFields.min": "",
|
||||
"settings.extraFields.multiSuffix": "",
|
||||
"settings.extraFields.multiple": "",
|
||||
"settings.extraFields.namePlaceholder": "",
|
||||
"settings.extraFields.nonUniqueKeyError": "La clave debe ser única.",
|
||||
"settings.extraFields.none": "",
|
||||
"settings.extraFields.params.choices": "Opciones",
|
||||
"settings.extraFields.params.defaultValue": "Valor predeterminado",
|
||||
"settings.extraFields.params.fieldType": "Tipo",
|
||||
"settings.extraFields.params.key": "Clave",
|
||||
"settings.extraFields.params.name": "Nombre",
|
||||
"settings.extraFields.params.order": "Orden",
|
||||
"settings.extraFields.params.unit": "Unidad",
|
||||
"settings.extraFields.saveField": "",
|
||||
"settings.extraFields.tab": "Campos adicionales",
|
||||
"settings.general.baseUrl.label": "URL base",
|
||||
"settings.general.baseUrl.tooltip": "La URL base que se utilizará al generar funciones como códigos QR.",
|
||||
"settings.general.currency.desc": "",
|
||||
"settings.general.currency.label": "Moneda",
|
||||
"settings.general.roundPrices.label": "Redondear precios",
|
||||
"settings.general.roundPrices.tooltip": "Redondear precios al número entero más cercano.",
|
||||
"settings.general.tab": "General",
|
||||
"settings.header": "Ajustes",
|
||||
"settings.language.desc": "",
|
||||
"settings.language.label": "",
|
||||
"settings.library.lowThreshold.desc": "",
|
||||
"settings.library.lowThreshold.label": "",
|
||||
"settings.library.tab": "",
|
||||
"spool.fields.archived": "Archivado",
|
||||
"spool.fields.comment": "Comentarios",
|
||||
"spool.fields.filament": "Filamento",
|
||||
"spool.fields.firstUsed": "Fecha de Primer Uso",
|
||||
"spool.fields.id": "ID",
|
||||
"spool.fields.lastUsed": "Ultimo Uso",
|
||||
"spool.fields.location": "Ubicación",
|
||||
"spool.fields.lotNr": "No. Lote",
|
||||
"spool.fields.material": "Material",
|
||||
"spool.fields.measuredWeight": "Peso Medido",
|
||||
"spool.fields.price": "Precio",
|
||||
"spool.fields.registered": "Registrado",
|
||||
"spool.fields.remainingWeight": "Peso Restante",
|
||||
"spool.fields.usedWeight": "Peso Usado",
|
||||
"spool.fieldsHelp.location": "Dónde se encuentra el carrete si tiene varias ubicaciones donde almacena sus carretes.",
|
||||
"spool.fieldsHelp.lotNr": "Número de lote del fabricante. Puede ser usado si el modelo a imprimir necesita color homogéneo y varias bobinas son necesarias.",
|
||||
"spool.fieldsHelp.measuredWeight": "Cuanto pesa el filamento y la bobina.",
|
||||
"spool.fieldsHelp.price": "Precio de una bobina completa. Si no se establece, se asumirá en su lugar el precio del filamento.",
|
||||
"spool.fieldsHelp.remainingWeight": "Cuanto filamento resta en la bobina. Para una bobina nueva el peso debe ser igual al peso indicado de fábrica.",
|
||||
"spool.fieldsHelp.usedWeight": "Cuanto filamento ha sido usado de la bobina. Una bobina nueva debería tener 0g usados.",
|
||||
"spool.form.measurementType.length": "Longitud",
|
||||
"spool.form.measurementType.weight": "Peso",
|
||||
"spool.spool": "Bobinas",
|
||||
"topbar.addSpools": "",
|
||||
"topbar.searchPlaceholder": "",
|
||||
"unknown": "Desconocido",
|
||||
"validation.hexDigits": "",
|
||||
"validation.maxChars": "",
|
||||
"validation.mustBeGt": "",
|
||||
"validation.mustBeMax": "",
|
||||
"validation.mustBeMin": "",
|
||||
"validation.mustBeNumber": "",
|
||||
"validation.required": "",
|
||||
"vendor.fields.comment": "Comentarios",
|
||||
"vendor.fields.emptySpoolWeight": "Peso de bobina vacía",
|
||||
"vendor.fields.externalId": "ID Externa",
|
||||
"vendor.fields.id": "ID",
|
||||
"vendor.fields.name": "Nombre",
|
||||
"vendor.fields.registered": "Registrado",
|
||||
"vendor.fieldsHelp.emptySpoolWeight": "El peso de una bobina vacía de este fabricante.",
|
||||
"yes": "Si"
|
||||
}
|
||||
@@ -0,0 +1,463 @@
|
||||
{
|
||||
"add.addAndNew": "",
|
||||
"add.adding": "",
|
||||
"add.advanced": "",
|
||||
"add.advancedNote": "",
|
||||
"add.change": "",
|
||||
"add.count": "",
|
||||
"add.createNew": "",
|
||||
"add.createNewSub": "",
|
||||
"add.dbUnavailable": "",
|
||||
"add.duplicate": "",
|
||||
"add.duplicateNote": "",
|
||||
"add.duplicateRename": "",
|
||||
"add.duplicateTitle": "",
|
||||
"add.filamentNamePlaceholder": "",
|
||||
"add.fill.full": "",
|
||||
"add.fillLevel": "",
|
||||
"add.importNote": "",
|
||||
"add.inCatalog": "",
|
||||
"add.locationHint": "",
|
||||
"add.locationPlaceholder": "",
|
||||
"add.manufacturerPlaceholder": "",
|
||||
"add.nameHint": "",
|
||||
"add.newFilament": "",
|
||||
"add.newFilamentTitle": "",
|
||||
"add.noCatalog": "",
|
||||
"add.noManufacturer": "",
|
||||
"add.pickColor": "",
|
||||
"add.searchPlaceholder": "",
|
||||
"add.searching": "",
|
||||
"add.spoolWeightPreset.cardboard": "",
|
||||
"add.spoolWeightPreset.plastic": "",
|
||||
"add.spoolWeightPresetsLead": "",
|
||||
"add.step2": "",
|
||||
"add.typeToSearchAll": "",
|
||||
"add.typeToSearchMatches": "",
|
||||
"add.useExisting": "",
|
||||
"add.vendorHint.existing": "",
|
||||
"add.vendorHint.new": "",
|
||||
"add.vendorHint.optional": "",
|
||||
"add.yourCatalog": "",
|
||||
"buttons.archive": "Arhiveeri",
|
||||
"buttons.cancel": "Tühista",
|
||||
"buttons.clear": "Tühjenda",
|
||||
"buttons.close": "",
|
||||
"buttons.delete": "Kustuta",
|
||||
"buttons.edit": "Muuda",
|
||||
"buttons.filter": "Filtreeri",
|
||||
"buttons.save": "Salvesta",
|
||||
"buttons.showArchived": "Näita arhiveeritud",
|
||||
"buttons.unArchive": "Võta arhiivist tagasi",
|
||||
"common.decrement": "",
|
||||
"common.increment": "",
|
||||
"common.remove": "",
|
||||
"common.search": "",
|
||||
"dashboard.addFieldHint": "",
|
||||
"dashboard.dashboard": "",
|
||||
"dashboard.deleteGroup": "",
|
||||
"dashboard.dragHint": "",
|
||||
"dashboard.dropHere": "",
|
||||
"dashboard.emptyHelp": "",
|
||||
"dashboard.errorEmptyName": "",
|
||||
"dashboard.errorExists": "",
|
||||
"dashboard.errorRename": "",
|
||||
"dashboard.lastUsed": "",
|
||||
"dashboard.newGroup": "",
|
||||
"dashboard.newGroupName": "",
|
||||
"dashboard.reorderGroup": "",
|
||||
"dashboard.unassigned": "",
|
||||
"datetime.done": "",
|
||||
"datetime.hour": "",
|
||||
"datetime.minute": "",
|
||||
"datetime.nextMonth": "",
|
||||
"datetime.now": "",
|
||||
"datetime.pick": "",
|
||||
"datetime.prevMonth": "",
|
||||
"datetime.time": "",
|
||||
"documentTitle.dashboard.list": "",
|
||||
"documentTitle.labels.list": "",
|
||||
"documentTitle.library.list": "",
|
||||
"documentTitle.locations.list": "",
|
||||
"documentTitle.settings.list": "",
|
||||
"filament.fields.addColor": "",
|
||||
"filament.fields.articleNumber": "",
|
||||
"filament.fields.coaxial": "",
|
||||
"filament.fields.colorHex": "",
|
||||
"filament.fields.colorType": "",
|
||||
"filament.fields.comment": "",
|
||||
"filament.fields.density": "",
|
||||
"filament.fields.diameter": "",
|
||||
"filament.fields.externalId": "",
|
||||
"filament.fields.id": "",
|
||||
"filament.fields.longitudinal": "",
|
||||
"filament.fields.material": "",
|
||||
"filament.fields.multiColor": "",
|
||||
"filament.fields.name": "",
|
||||
"filament.fields.price": "",
|
||||
"filament.fields.registered": "",
|
||||
"filament.fields.removeColor": "",
|
||||
"filament.fields.settingsBedTemp": "",
|
||||
"filament.fields.settingsExtruderTemp": "",
|
||||
"filament.fields.singleColor": "",
|
||||
"filament.fields.spoolWeight": "",
|
||||
"filament.fields.vendor": "",
|
||||
"filament.fields.weight": "",
|
||||
"filament.fieldsHelp.articleNumber": "",
|
||||
"filament.fieldsHelp.multiColorDirection": "",
|
||||
"filament.fieldsHelp.spoolWeight": "",
|
||||
"filament.fieldsHelp.weight": "",
|
||||
"filament.filament": "",
|
||||
"footer.documentation": "",
|
||||
"footer.reportIssue": "",
|
||||
"help.help": "",
|
||||
"inspector.addSpoolsOfThis": "",
|
||||
"inspector.adjustFailed": "",
|
||||
"inspector.adjustHelp": "",
|
||||
"inspector.adjustWeight": "",
|
||||
"inspector.apply": "",
|
||||
"inspector.applying": "",
|
||||
"inspector.colorHex": "",
|
||||
"inspector.consumeAmount": "",
|
||||
"inspector.delete.deleting": "",
|
||||
"inspector.delete.errorGone": "",
|
||||
"inspector.delete.errorSpoolsExist": "",
|
||||
"inspector.delete.errorUnknown": "",
|
||||
"inspector.delete.filament": "",
|
||||
"inspector.delete.filamentBlockedHint": "",
|
||||
"inspector.delete.filamentBlockedTitle": "",
|
||||
"inspector.delete.filamentBody": "",
|
||||
"inspector.delete.filamentDone": "",
|
||||
"inspector.delete.filamentTitle": "",
|
||||
"inspector.delete.spool": "",
|
||||
"inspector.delete.spoolBody": "",
|
||||
"inspector.delete.spoolDone": "",
|
||||
"inspector.delete.spoolRemaining": "",
|
||||
"inspector.delete.spoolTitle": "",
|
||||
"inspector.delete.vendor": "",
|
||||
"inspector.delete.vendorBody": "",
|
||||
"inspector.delete.vendorDone": "",
|
||||
"inspector.delete.vendorTitle": "",
|
||||
"inspector.duplicateFilament": "",
|
||||
"inspector.empty": "",
|
||||
"inspector.enterValidLength": "",
|
||||
"inspector.enterValidWeight": "",
|
||||
"inspector.loading": "",
|
||||
"inspector.manageExtraFields": "",
|
||||
"inspector.measuredHelp": "",
|
||||
"inspector.multi": "",
|
||||
"inspector.newGross": "",
|
||||
"inspector.noExtraFields": "",
|
||||
"inspector.notFound": "",
|
||||
"inspector.ofRemaining": "",
|
||||
"inspector.openFilament": "",
|
||||
"inspector.openLink": "",
|
||||
"inspector.openManufacturer": "",
|
||||
"inspector.specs": "",
|
||||
"inspector.spoolsCount": "",
|
||||
"inspector.spoolsTotalRemaining": "",
|
||||
"inspector.used": "",
|
||||
"kofi": "Anna mulle tippi Ko-fi's",
|
||||
"labels.addHead": "",
|
||||
"labels.addQr": "",
|
||||
"labels.addRect": "",
|
||||
"labels.addSwatch": "",
|
||||
"labels.addText": "",
|
||||
"labels.align": "",
|
||||
"labels.alignCenter": "",
|
||||
"labels.alignLeft": "",
|
||||
"labels.alignRight": "",
|
||||
"labels.blank": "",
|
||||
"labels.bold": "",
|
||||
"labels.canvasHint": "",
|
||||
"labels.centerLogo": "",
|
||||
"labels.chooseField": "",
|
||||
"labels.clearFill": "",
|
||||
"labels.copies": "",
|
||||
"labels.cornerRadiusMm": "",
|
||||
"labels.createFirst": "",
|
||||
"labels.cutGuides": "",
|
||||
"labels.deleteConfirm": "",
|
||||
"labels.deleteElement": "",
|
||||
"labels.designName": "",
|
||||
"labels.designerDesc": "",
|
||||
"labels.designerTitle": "",
|
||||
"labels.dpi": "",
|
||||
"labels.dpiHint": "",
|
||||
"labels.duplicate": "",
|
||||
"labels.fields.bedTemp": "",
|
||||
"labels.fields.diameterMm": "",
|
||||
"labels.fields.groupVendor": "",
|
||||
"labels.fields.initialG": "",
|
||||
"labels.fields.netWeightG": "",
|
||||
"labels.fields.remainingG": "",
|
||||
"labels.fill": "",
|
||||
"labels.fitWidth": "",
|
||||
"labels.fitWidthHint": "",
|
||||
"labels.fontMm": "",
|
||||
"labels.gridInfo": "",
|
||||
"labels.hMm": "",
|
||||
"labels.heightMm": "",
|
||||
"labels.hintNowrap": "",
|
||||
"labels.hintSwatch": "",
|
||||
"labels.hintWrap": "",
|
||||
"labels.imageDesc": "",
|
||||
"labels.imageZipNote": "",
|
||||
"labels.insertField": "",
|
||||
"labels.kind.qr": "",
|
||||
"labels.kind.rect": "",
|
||||
"labels.kind.swatch": "",
|
||||
"labels.kind.text": "",
|
||||
"labels.labelSize": "",
|
||||
"labels.labelType": "",
|
||||
"labels.layout": "",
|
||||
"labels.modeImage": "",
|
||||
"labels.modeLabel": "",
|
||||
"labels.modeSheet": "",
|
||||
"labels.new": "",
|
||||
"labels.newText": "",
|
||||
"labels.noDesignsOption": "",
|
||||
"labels.noFilaments": "",
|
||||
"labels.noSpools": "",
|
||||
"labels.onePerLabel": "",
|
||||
"labels.preparing": "",
|
||||
"labels.preview": "",
|
||||
"labels.previewWith": "",
|
||||
"labels.radiusMm": "",
|
||||
"labels.sampleData": "",
|
||||
"labels.saved": "",
|
||||
"labels.saving": "",
|
||||
"labels.searchFilaments": "",
|
||||
"labels.searchSpools": "",
|
||||
"labels.selectAllShort": "",
|
||||
"labels.selectAtLeastOne": "",
|
||||
"labels.selectAtLeastOneFilament": "",
|
||||
"labels.selectDesign": "",
|
||||
"labels.selectElement": "",
|
||||
"labels.selectNoneShort": "",
|
||||
"labels.selectRecentHint": "",
|
||||
"labels.selectRecentShort": "",
|
||||
"labels.showingFilament": "",
|
||||
"labels.showingReal": "",
|
||||
"labels.showingSpool": "",
|
||||
"labels.showingTags": "",
|
||||
"labels.sizeMm": "",
|
||||
"labels.skipHint": "",
|
||||
"labels.sortHint": "",
|
||||
"labels.sortId": "",
|
||||
"labels.sortNewest": "",
|
||||
"labels.stroke": "",
|
||||
"labels.strokeMm": "",
|
||||
"labels.tabDesign": "",
|
||||
"labels.tabPrint": "",
|
||||
"labels.textTemplate": "",
|
||||
"labels.typeFilament": "",
|
||||
"labels.typeHint": "",
|
||||
"labels.typeSpool": "",
|
||||
"labels.unknownFilament": "",
|
||||
"labels.wMm": "",
|
||||
"labels.widthMm": "",
|
||||
"labels.wrapText": "",
|
||||
"labels.xMm": "",
|
||||
"labels.yMm": "",
|
||||
"library.apiError": "",
|
||||
"library.collapseGroup": "",
|
||||
"library.emptyBody": "",
|
||||
"library.emptyFiltered": "",
|
||||
"library.emptyTitle": "",
|
||||
"library.expandGroup": "",
|
||||
"library.filterBy": "",
|
||||
"library.groupBy": "",
|
||||
"library.groupNone": "",
|
||||
"library.nUnused": "",
|
||||
"library.noLocation": "",
|
||||
"library.noValues": "",
|
||||
"library.openGroup": "",
|
||||
"library.openManufacturer": "",
|
||||
"library.section.extra": "",
|
||||
"library.section.filament": "",
|
||||
"library.section.spool": "",
|
||||
"library.section.vendor": "",
|
||||
"library.showMore": "",
|
||||
"library.sort.nozzle": "",
|
||||
"library.sortBy": "",
|
||||
"library.unassigned": "",
|
||||
"library.unitGroups": "",
|
||||
"library.unitSpools": "",
|
||||
"library.unused": "",
|
||||
"library.unusedGroup": "",
|
||||
"library.unusedGroupMixed": "",
|
||||
"library.unusedSub": "",
|
||||
"library.unusedSubMixed": "",
|
||||
"library.used": "",
|
||||
"library.usedAgo": "",
|
||||
"loading": "Laadimine",
|
||||
"locations.locations": "",
|
||||
"locations.newLocation": "",
|
||||
"locations.noLocation": "",
|
||||
"locations.noLocationsHelp": "",
|
||||
"nav.labels": "",
|
||||
"nav.library": "",
|
||||
"no": "Ei",
|
||||
"notifications.error": "Viga (kood: {{statusCode}})",
|
||||
"notifications.saveSuccessful": "Salvesta edukalt!",
|
||||
"pagination.empty": "",
|
||||
"pagination.next": "",
|
||||
"pagination.pageSize": "",
|
||||
"pagination.perPage": "",
|
||||
"pagination.prev": "",
|
||||
"pagination.range": "",
|
||||
"printing.generic.columns": "",
|
||||
"printing.generic.customSize": "",
|
||||
"printing.generic.description": "",
|
||||
"printing.generic.dimensions": "",
|
||||
"printing.generic.gridTooWide": "",
|
||||
"printing.generic.helpMargin": "",
|
||||
"printing.generic.helpPrinterMargin": "",
|
||||
"printing.generic.horizontalSpacing": "",
|
||||
"printing.generic.itemCopies": "",
|
||||
"printing.generic.marginBottom": "",
|
||||
"printing.generic.marginLeft": "",
|
||||
"printing.generic.marginRight": "",
|
||||
"printing.generic.marginTop": "",
|
||||
"printing.generic.paperSize": "",
|
||||
"printing.generic.printerMarginBottom": "",
|
||||
"printing.generic.printerMarginLeft": "",
|
||||
"printing.generic.printerMarginRight": "",
|
||||
"printing.generic.printerMarginTop": "",
|
||||
"printing.generic.saveAsImage": "",
|
||||
"printing.generic.skipItems": "",
|
||||
"printing.generic.verticalSpacing": "",
|
||||
"printing.qrcode.button": "",
|
||||
"printing.qrcode.customUrl.caveat": "",
|
||||
"printing.qrcode.customUrl.hint": "",
|
||||
"printing.qrcode.customUrl.label": "",
|
||||
"printing.qrcode.useHTTPUrl.label": "",
|
||||
"printing.qrcode.useHTTPUrl.options.custom": "",
|
||||
"printing.qrcode.useHTTPUrl.options.default": "",
|
||||
"printing.qrcode.useHTTPUrl.options.url": "",
|
||||
"printing.qrcode.useHTTPUrl.preview": "",
|
||||
"printing.qrcode.useHTTPUrl.tooltip": "",
|
||||
"printing.spoolSelect.selectedTotal_one": "",
|
||||
"printing.spoolSelect.selectedTotal_other": "",
|
||||
"scanner.description": "",
|
||||
"scanner.error.inUse": "",
|
||||
"scanner.error.insecureContext": "",
|
||||
"scanner.error.notAllowed": "",
|
||||
"scanner.error.notFound": "",
|
||||
"scanner.error.streamApiNotSupported": "",
|
||||
"scanner.error.unknown": "",
|
||||
"scanner.starting": "",
|
||||
"scanner.title": "",
|
||||
"search.colorHint": "",
|
||||
"search.noResults": "",
|
||||
"search.searching": "",
|
||||
"search.section.filaments": "",
|
||||
"search.section.spools": "",
|
||||
"search.section.vendors": "",
|
||||
"search.threshold": "",
|
||||
"search.unknownFilament": "",
|
||||
"settings.appearance.tab": "",
|
||||
"settings.appearance.theme.dark": "",
|
||||
"settings.appearance.theme.desc": "",
|
||||
"settings.appearance.theme.label": "",
|
||||
"settings.appearance.theme.light": "",
|
||||
"settings.appearance.theme.system": "",
|
||||
"settings.extraFields.addChoice": "",
|
||||
"settings.extraFields.addChoicesFirst": "",
|
||||
"settings.extraFields.addEntityField": "",
|
||||
"settings.extraFields.booleanFalse": "",
|
||||
"settings.extraFields.booleanTrue": "",
|
||||
"settings.extraFields.deleteConfirm": "",
|
||||
"settings.extraFields.description": "",
|
||||
"settings.extraFields.description.constraints": "",
|
||||
"settings.extraFields.description.intro": "",
|
||||
"settings.extraFields.description.keyUsage": "",
|
||||
"settings.extraFields.description.tableViews": "",
|
||||
"settings.extraFields.editorEdit": "",
|
||||
"settings.extraFields.editorNew": "",
|
||||
"settings.extraFields.errors.choiceNeeded": "",
|
||||
"settings.extraFields.errors.choicesRemoved": "",
|
||||
"settings.extraFields.errors.deleteFailed": "",
|
||||
"settings.extraFields.errors.keyFormat": "",
|
||||
"settings.extraFields.errors.nameRequired": "",
|
||||
"settings.extraFields.errors.saveFailed": "",
|
||||
"settings.extraFields.fieldType.boolean": "",
|
||||
"settings.extraFields.fieldType.choice": "",
|
||||
"settings.extraFields.fieldType.datetime": "",
|
||||
"settings.extraFields.fieldType.float": "",
|
||||
"settings.extraFields.fieldType.floatRange": "",
|
||||
"settings.extraFields.fieldType.integer": "",
|
||||
"settings.extraFields.fieldType.integerRange": "",
|
||||
"settings.extraFields.fieldType.text": "",
|
||||
"settings.extraFields.max": "",
|
||||
"settings.extraFields.min": "",
|
||||
"settings.extraFields.multiSuffix": "",
|
||||
"settings.extraFields.multiple": "",
|
||||
"settings.extraFields.namePlaceholder": "",
|
||||
"settings.extraFields.nonUniqueKeyError": "",
|
||||
"settings.extraFields.none": "",
|
||||
"settings.extraFields.params.choices": "",
|
||||
"settings.extraFields.params.defaultValue": "",
|
||||
"settings.extraFields.params.fieldType": "",
|
||||
"settings.extraFields.params.key": "",
|
||||
"settings.extraFields.params.name": "",
|
||||
"settings.extraFields.params.order": "",
|
||||
"settings.extraFields.params.unit": "",
|
||||
"settings.extraFields.saveField": "",
|
||||
"settings.extraFields.tab": "",
|
||||
"settings.general.baseUrl.label": "",
|
||||
"settings.general.baseUrl.tooltip": "",
|
||||
"settings.general.currency.desc": "",
|
||||
"settings.general.currency.label": "",
|
||||
"settings.general.roundPrices.label": "",
|
||||
"settings.general.roundPrices.tooltip": "",
|
||||
"settings.general.tab": "",
|
||||
"settings.header": "",
|
||||
"settings.language.desc": "",
|
||||
"settings.language.label": "",
|
||||
"settings.library.lowThreshold.desc": "",
|
||||
"settings.library.lowThreshold.label": "",
|
||||
"settings.library.tab": "",
|
||||
"spool.fields.archived": "",
|
||||
"spool.fields.comment": "",
|
||||
"spool.fields.filament": "",
|
||||
"spool.fields.firstUsed": "",
|
||||
"spool.fields.id": "",
|
||||
"spool.fields.lastUsed": "",
|
||||
"spool.fields.location": "",
|
||||
"spool.fields.lotNr": "",
|
||||
"spool.fields.material": "",
|
||||
"spool.fields.measuredWeight": "",
|
||||
"spool.fields.price": "",
|
||||
"spool.fields.registered": "",
|
||||
"spool.fields.remainingWeight": "",
|
||||
"spool.fields.usedWeight": "",
|
||||
"spool.fieldsHelp.location": "",
|
||||
"spool.fieldsHelp.lotNr": "",
|
||||
"spool.fieldsHelp.measuredWeight": "",
|
||||
"spool.fieldsHelp.price": "",
|
||||
"spool.fieldsHelp.remainingWeight": "",
|
||||
"spool.fieldsHelp.usedWeight": "",
|
||||
"spool.form.measurementType.length": "",
|
||||
"spool.form.measurementType.weight": "",
|
||||
"spool.spool": "",
|
||||
"topbar.addSpools": "",
|
||||
"topbar.searchPlaceholder": "",
|
||||
"unknown": "Tundmatu",
|
||||
"validation.hexDigits": "",
|
||||
"validation.maxChars": "",
|
||||
"validation.mustBeGt": "",
|
||||
"validation.mustBeMax": "",
|
||||
"validation.mustBeMin": "",
|
||||
"validation.mustBeNumber": "",
|
||||
"validation.required": "",
|
||||
"vendor.fields.comment": "",
|
||||
"vendor.fields.emptySpoolWeight": "",
|
||||
"vendor.fields.externalId": "",
|
||||
"vendor.fields.id": "",
|
||||
"vendor.fields.name": "",
|
||||
"vendor.fields.registered": "",
|
||||
"vendor.fieldsHelp.emptySpoolWeight": "",
|
||||
"yes": "Jah"
|
||||
}
|
||||
@@ -0,0 +1,457 @@
|
||||
{
|
||||
"add.addAndNew": "",
|
||||
"add.adding": "",
|
||||
"add.advanced": "",
|
||||
"add.advancedNote": "",
|
||||
"add.change": "",
|
||||
"add.count": "",
|
||||
"add.createNew": "",
|
||||
"add.createNewSub": "",
|
||||
"add.dbUnavailable": "",
|
||||
"add.duplicate": "",
|
||||
"add.duplicateNote": "",
|
||||
"add.duplicateRename": "",
|
||||
"add.duplicateTitle": "",
|
||||
"add.filamentNamePlaceholder": "",
|
||||
"add.fill.full": "",
|
||||
"add.fillLevel": "",
|
||||
"add.importNote": "",
|
||||
"add.inCatalog": "",
|
||||
"add.locationHint": "",
|
||||
"add.locationPlaceholder": "",
|
||||
"add.manufacturerPlaceholder": "",
|
||||
"add.nameHint": "",
|
||||
"add.newFilament": "",
|
||||
"add.newFilamentTitle": "",
|
||||
"add.noCatalog": "",
|
||||
"add.noManufacturer": "",
|
||||
"add.pickColor": "",
|
||||
"add.searchPlaceholder": "",
|
||||
"add.searching": "",
|
||||
"add.spoolWeightPreset.cardboard": "",
|
||||
"add.spoolWeightPreset.plastic": "",
|
||||
"add.spoolWeightPresetsLead": "",
|
||||
"add.step2": "",
|
||||
"add.typeToSearchAll": "",
|
||||
"add.typeToSearchMatches": "",
|
||||
"add.useExisting": "",
|
||||
"add.vendorHint.existing": "",
|
||||
"add.vendorHint.new": "",
|
||||
"add.vendorHint.optional": "",
|
||||
"add.yourCatalog": "",
|
||||
"buttons.archive": "آرشیو کردن",
|
||||
"buttons.cancel": "انصراف",
|
||||
"buttons.clear": "پاک کردن",
|
||||
"buttons.close": "",
|
||||
"buttons.delete": "حذف",
|
||||
"buttons.edit": "ویرایش",
|
||||
"buttons.filter": "فیلتر",
|
||||
"buttons.save": "ذخیره",
|
||||
"buttons.showArchived": "نمایش آرشیو",
|
||||
"buttons.unArchive": "درآوردن از آرشیو",
|
||||
"common.decrement": "",
|
||||
"common.increment": "",
|
||||
"common.remove": "",
|
||||
"common.search": "",
|
||||
"dashboard.addFieldHint": "",
|
||||
"dashboard.dashboard": "",
|
||||
"dashboard.deleteGroup": "",
|
||||
"dashboard.dragHint": "",
|
||||
"dashboard.dropHere": "",
|
||||
"dashboard.emptyHelp": "",
|
||||
"dashboard.errorEmptyName": "",
|
||||
"dashboard.errorExists": "",
|
||||
"dashboard.errorRename": "",
|
||||
"dashboard.lastUsed": "",
|
||||
"dashboard.newGroup": "",
|
||||
"dashboard.newGroupName": "",
|
||||
"dashboard.reorderGroup": "",
|
||||
"dashboard.unassigned": "",
|
||||
"datetime.done": "",
|
||||
"datetime.hour": "",
|
||||
"datetime.minute": "",
|
||||
"datetime.nextMonth": "",
|
||||
"datetime.now": "",
|
||||
"datetime.pick": "",
|
||||
"datetime.prevMonth": "",
|
||||
"datetime.time": "",
|
||||
"documentTitle.dashboard.list": "",
|
||||
"documentTitle.labels.list": "",
|
||||
"documentTitle.library.list": "",
|
||||
"documentTitle.settings.list": "",
|
||||
"filament.fields.addColor": "",
|
||||
"filament.fields.articleNumber": "شماره انحصاری تولید",
|
||||
"filament.fields.coaxial": "کوپلیمری",
|
||||
"filament.fields.colorHex": "رنگ",
|
||||
"filament.fields.colorType": "",
|
||||
"filament.fields.comment": "توضیحات",
|
||||
"filament.fields.density": "چگالی (Density)",
|
||||
"filament.fields.diameter": "ضخامت",
|
||||
"filament.fields.externalId": "آیدی خارجی",
|
||||
"filament.fields.id": "شماره",
|
||||
"filament.fields.longitudinal": "طولی",
|
||||
"filament.fields.material": "متریال",
|
||||
"filament.fields.multiColor": "تغییر رنگ",
|
||||
"filament.fields.name": "عنوان",
|
||||
"filament.fields.price": "قیمت",
|
||||
"filament.fields.registered": "ثبت شده",
|
||||
"filament.fields.removeColor": "",
|
||||
"filament.fields.settingsBedTemp": "دمای هیت بد",
|
||||
"filament.fields.settingsExtruderTemp": "دمای اکسترودر",
|
||||
"filament.fields.singleColor": "تک رنگ",
|
||||
"filament.fields.spoolWeight": "وزن قرقره فیلامنت",
|
||||
"filament.fields.vendor": "تولید کننده",
|
||||
"filament.fields.weight": "وزن",
|
||||
"filament.fieldsHelp.articleNumber": "برای مثال EAN/UPC یا ...",
|
||||
"filament.fieldsHelp.multiColorDirection": "فیلامنتها میتوانند به دو روش دارای چندین رنگ باشند: یا از طریق کوپلیمری، مانند فیلامنتهای دو رنگ با رنگهای چندگانه ثابت، یا از طریق تغییر رنگ طولی، مانند فیلامنتهای گرادیانت که رنگها را در طول قرقره تغییر میدهند.",
|
||||
"filament.fieldsHelp.spoolWeight": "وزن یک قرقره خالی. برای تعیین وزن اندازهگیریشده یک قرقره استفاده میشود.",
|
||||
"filament.fieldsHelp.weight": "وزن فیلامنت یک قرقره کامل (وزن خالص). این باید شامل وزن خود قرقره نباشد و فقط فیلامنت را شامل شود. معمولاً روی بستهبندی نوشته شده است.",
|
||||
"filament.filament": "فیلامنت ها",
|
||||
"footer.documentation": "",
|
||||
"footer.reportIssue": "",
|
||||
"help.help": "راهنما",
|
||||
"inspector.addSpoolsOfThis": "",
|
||||
"inspector.adjustFailed": "",
|
||||
"inspector.adjustHelp": "",
|
||||
"inspector.adjustWeight": "",
|
||||
"inspector.apply": "",
|
||||
"inspector.applying": "",
|
||||
"inspector.colorHex": "",
|
||||
"inspector.consumeAmount": "",
|
||||
"inspector.delete.deleting": "",
|
||||
"inspector.delete.errorGone": "",
|
||||
"inspector.delete.errorSpoolsExist": "",
|
||||
"inspector.delete.errorUnknown": "",
|
||||
"inspector.delete.filament": "",
|
||||
"inspector.delete.filamentBlockedHint": "",
|
||||
"inspector.delete.filamentBlockedTitle": "",
|
||||
"inspector.delete.filamentBody": "",
|
||||
"inspector.delete.filamentDone": "",
|
||||
"inspector.delete.filamentTitle": "",
|
||||
"inspector.delete.spool": "",
|
||||
"inspector.delete.spoolBody": "",
|
||||
"inspector.delete.spoolDone": "",
|
||||
"inspector.delete.spoolRemaining": "",
|
||||
"inspector.delete.spoolTitle": "",
|
||||
"inspector.delete.vendor": "",
|
||||
"inspector.delete.vendorBody": "",
|
||||
"inspector.delete.vendorDone": "",
|
||||
"inspector.delete.vendorTitle": "",
|
||||
"inspector.duplicateFilament": "",
|
||||
"inspector.empty": "",
|
||||
"inspector.enterValidLength": "",
|
||||
"inspector.enterValidWeight": "",
|
||||
"inspector.loading": "",
|
||||
"inspector.manageExtraFields": "",
|
||||
"inspector.measuredHelp": "",
|
||||
"inspector.multi": "",
|
||||
"inspector.newGross": "",
|
||||
"inspector.noExtraFields": "",
|
||||
"inspector.notFound": "",
|
||||
"inspector.ofRemaining": "",
|
||||
"inspector.openFilament": "",
|
||||
"inspector.openLink": "",
|
||||
"inspector.openManufacturer": "",
|
||||
"inspector.specs": "",
|
||||
"inspector.spoolsCount": "",
|
||||
"inspector.spoolsTotalRemaining": "",
|
||||
"inspector.used": "",
|
||||
"kofi": "حمایت از سازنده این برنامه",
|
||||
"labels.addHead": "",
|
||||
"labels.addQr": "",
|
||||
"labels.addRect": "",
|
||||
"labels.addSwatch": "",
|
||||
"labels.addText": "",
|
||||
"labels.align": "",
|
||||
"labels.alignCenter": "",
|
||||
"labels.alignLeft": "",
|
||||
"labels.alignRight": "",
|
||||
"labels.blank": "",
|
||||
"labels.bold": "",
|
||||
"labels.canvasHint": "",
|
||||
"labels.centerLogo": "",
|
||||
"labels.chooseField": "",
|
||||
"labels.clearFill": "",
|
||||
"labels.copies": "",
|
||||
"labels.cornerRadiusMm": "",
|
||||
"labels.createFirst": "",
|
||||
"labels.cutGuides": "",
|
||||
"labels.deleteConfirm": "",
|
||||
"labels.deleteElement": "",
|
||||
"labels.designName": "",
|
||||
"labels.designerDesc": "",
|
||||
"labels.designerTitle": "",
|
||||
"labels.dpi": "",
|
||||
"labels.dpiHint": "",
|
||||
"labels.duplicate": "",
|
||||
"labels.fields.bedTemp": "",
|
||||
"labels.fields.diameterMm": "",
|
||||
"labels.fields.groupVendor": "",
|
||||
"labels.fields.initialG": "",
|
||||
"labels.fields.netWeightG": "",
|
||||
"labels.fields.remainingG": "",
|
||||
"labels.fill": "",
|
||||
"labels.fitWidth": "",
|
||||
"labels.fitWidthHint": "",
|
||||
"labels.fontMm": "",
|
||||
"labels.gridInfo": "",
|
||||
"labels.hMm": "",
|
||||
"labels.heightMm": "",
|
||||
"labels.hintNowrap": "",
|
||||
"labels.hintSwatch": "",
|
||||
"labels.hintWrap": "",
|
||||
"labels.imageDesc": "",
|
||||
"labels.imageZipNote": "",
|
||||
"labels.insertField": "",
|
||||
"labels.kind.qr": "",
|
||||
"labels.kind.rect": "",
|
||||
"labels.kind.swatch": "",
|
||||
"labels.kind.text": "",
|
||||
"labels.labelSize": "",
|
||||
"labels.labelType": "",
|
||||
"labels.layout": "",
|
||||
"labels.modeImage": "",
|
||||
"labels.modeLabel": "",
|
||||
"labels.modeSheet": "",
|
||||
"labels.new": "",
|
||||
"labels.newText": "",
|
||||
"labels.noDesignsOption": "",
|
||||
"labels.noFilaments": "",
|
||||
"labels.noSpools": "",
|
||||
"labels.onePerLabel": "",
|
||||
"labels.preparing": "",
|
||||
"labels.preview": "",
|
||||
"labels.previewWith": "",
|
||||
"labels.radiusMm": "",
|
||||
"labels.sampleData": "",
|
||||
"labels.saved": "",
|
||||
"labels.saving": "",
|
||||
"labels.searchFilaments": "",
|
||||
"labels.searchSpools": "",
|
||||
"labels.selectAllShort": "",
|
||||
"labels.selectAtLeastOne": "",
|
||||
"labels.selectAtLeastOneFilament": "",
|
||||
"labels.selectDesign": "",
|
||||
"labels.selectElement": "",
|
||||
"labels.selectNoneShort": "",
|
||||
"labels.selectRecentHint": "",
|
||||
"labels.selectRecentShort": "",
|
||||
"labels.showingFilament": "",
|
||||
"labels.showingReal": "",
|
||||
"labels.showingSpool": "",
|
||||
"labels.showingTags": "",
|
||||
"labels.sizeMm": "",
|
||||
"labels.skipHint": "",
|
||||
"labels.sortHint": "",
|
||||
"labels.sortId": "",
|
||||
"labels.sortNewest": "",
|
||||
"labels.stroke": "",
|
||||
"labels.strokeMm": "",
|
||||
"labels.tabDesign": "",
|
||||
"labels.tabPrint": "",
|
||||
"labels.textTemplate": "",
|
||||
"labels.typeFilament": "",
|
||||
"labels.typeHint": "",
|
||||
"labels.typeSpool": "",
|
||||
"labels.unknownFilament": "",
|
||||
"labels.wMm": "",
|
||||
"labels.widthMm": "",
|
||||
"labels.wrapText": "",
|
||||
"labels.xMm": "",
|
||||
"labels.yMm": "",
|
||||
"library.apiError": "",
|
||||
"library.collapseGroup": "",
|
||||
"library.emptyBody": "",
|
||||
"library.emptyFiltered": "",
|
||||
"library.emptyTitle": "",
|
||||
"library.expandGroup": "",
|
||||
"library.filterBy": "",
|
||||
"library.groupBy": "",
|
||||
"library.groupNone": "",
|
||||
"library.nUnused": "",
|
||||
"library.noLocation": "",
|
||||
"library.noValues": "",
|
||||
"library.openGroup": "",
|
||||
"library.openManufacturer": "",
|
||||
"library.section.extra": "",
|
||||
"library.section.filament": "",
|
||||
"library.section.spool": "",
|
||||
"library.section.vendor": "",
|
||||
"library.showMore": "",
|
||||
"library.sort.nozzle": "",
|
||||
"library.sortBy": "",
|
||||
"library.unassigned": "",
|
||||
"library.unitGroups": "",
|
||||
"library.unitSpools": "",
|
||||
"library.unused": "",
|
||||
"library.unusedGroup": "",
|
||||
"library.unusedGroupMixed": "",
|
||||
"library.unusedSub": "",
|
||||
"library.unusedSubMixed": "",
|
||||
"library.used": "",
|
||||
"library.usedAgo": "",
|
||||
"loading": "در حال بارگذاری",
|
||||
"nav.labels": "",
|
||||
"nav.library": "",
|
||||
"no": "خیر",
|
||||
"notifications.error": "خطای {{statusCode}} رخ داد",
|
||||
"notifications.saveSuccessful": "با موفقیت ثبت شد!",
|
||||
"pagination.empty": "",
|
||||
"pagination.next": "",
|
||||
"pagination.pageSize": "",
|
||||
"pagination.perPage": "",
|
||||
"pagination.prev": "",
|
||||
"pagination.range": "",
|
||||
"printing.generic.columns": "ستون",
|
||||
"printing.generic.customSize": "کاستوم",
|
||||
"printing.generic.description": "تنظیمات زیر را جوری تنظیم کنید که چیدمان پرینت لیبل مد نظرتان بدست بیاید. توجه کنید پرینتر و سیستم عامل شما ممکن است تنظیمات خودشان را لحاظ کنند، لذا ممکن است کمی آزمون و خطا نیاز باشد تا نتیجه مطلوب بدست بیاید. قبل اینکه لیبل نهایی را پرینت کنید ابتدا روی یک تکه کاغذ معمولی پرینت بگیرید و تست کنید.",
|
||||
"printing.generic.dimensions": "ابعاد",
|
||||
"printing.generic.gridTooWide": "",
|
||||
"printing.generic.helpMargin": "حاشیهها باید با کاغذ برچسب و چاپگر شما هماهنگ شوند، تغییر دادن این تنظیمات بر اندازه کل شبکه تأثیر میگذارد.",
|
||||
"printing.generic.helpPrinterMargin": "ناحیه امن باید بر اساس نزدیکترین فاصلهای که چاپگر شما میتواند تا لبه کاغذ چاپ کند تنظیم شود. تغییر این تنظیمات بر کل شبکه تأثیری نخواهد داشت.",
|
||||
"printing.generic.horizontalSpacing": "فاصله افقی",
|
||||
"printing.generic.itemCopies": "تعداد کپی هر آیتم",
|
||||
"printing.generic.marginBottom": "فاصله از پایین",
|
||||
"printing.generic.marginLeft": "فاصله از چپ",
|
||||
"printing.generic.marginRight": "فاصله از راست",
|
||||
"printing.generic.marginTop": "فاصله از بالا",
|
||||
"printing.generic.paperSize": "اندازه کاغذ",
|
||||
"printing.generic.printerMarginBottom": "منطقه ایمن از پایین",
|
||||
"printing.generic.printerMarginLeft": "منطقه ایمن از چپ",
|
||||
"printing.generic.printerMarginRight": "منطقه ایمن از راست",
|
||||
"printing.generic.printerMarginTop": "منطقه ایمن از بالا",
|
||||
"printing.generic.saveAsImage": "ذخیره به عنوان عکس",
|
||||
"printing.generic.skipItems": "نادیده گرفتن یک آیتم",
|
||||
"printing.generic.verticalSpacing": "فاصله عمودی",
|
||||
"printing.qrcode.button": "پرینت لیبل",
|
||||
"printing.qrcode.customUrl.caveat": "",
|
||||
"printing.qrcode.customUrl.hint": "",
|
||||
"printing.qrcode.customUrl.label": "",
|
||||
"printing.qrcode.useHTTPUrl.label": "لینک بارکد QR",
|
||||
"printing.qrcode.useHTTPUrl.options.custom": "",
|
||||
"printing.qrcode.useHTTPUrl.options.default": "پیشفرض",
|
||||
"printing.qrcode.useHTTPUrl.options.url": "لینک",
|
||||
"printing.qrcode.useHTTPUrl.preview": "پیش نمایش:",
|
||||
"printing.qrcode.useHTTPUrl.tooltip": "از لینک اختصاصی استفاده خواهد شد که فقط در صورتی کار میکند که از ویژگی اسکن Spoolman اسکن شود (پیشفرض). آدرس URL یا از آدرس پایهای که در تنظیمات مشخص شده استفاده میکند، یا در صورت عدم تنظیم، از آدرس صفحه فعلی.",
|
||||
"printing.spoolSelect.selectedTotal_one": "{{count}} رول فیلامنت انتخاب شد",
|
||||
"printing.spoolSelect.selectedTotal_other": "تعدا د {{count}} رول فیلامنت انتخاب شد",
|
||||
"scanner.description": "یک بارکد QR از Spoolman را اسکن کنید تا جزئیات مربوط به spool را مشاهده کنید.",
|
||||
"scanner.error.inUse": "",
|
||||
"scanner.error.insecureContext": "این صفحه از طریق HTTPS ارائه نمیشود.",
|
||||
"scanner.error.notAllowed": "شما اجازه دسترسی به دوربین را ندادهاید.",
|
||||
"scanner.error.notFound": "دوربینی پیدا نشد.",
|
||||
"scanner.error.streamApiNotSupported": "مرورگر از API رسانهای (MediaStream API) پشتیبانی نمیکند.",
|
||||
"scanner.error.unknown": "خطای نامشخص {{error}} رخ داد",
|
||||
"scanner.starting": "",
|
||||
"scanner.title": "اسکنر بارکد QR",
|
||||
"search.colorHint": "",
|
||||
"search.noResults": "",
|
||||
"search.searching": "",
|
||||
"search.section.filaments": "",
|
||||
"search.section.spools": "",
|
||||
"search.section.vendors": "",
|
||||
"search.threshold": "",
|
||||
"search.unknownFilament": "",
|
||||
"settings.appearance.tab": "",
|
||||
"settings.appearance.theme.dark": "",
|
||||
"settings.appearance.theme.desc": "",
|
||||
"settings.appearance.theme.label": "",
|
||||
"settings.appearance.theme.light": "",
|
||||
"settings.appearance.theme.system": "",
|
||||
"settings.extraFields.addChoice": "",
|
||||
"settings.extraFields.addChoicesFirst": "",
|
||||
"settings.extraFields.addEntityField": "",
|
||||
"settings.extraFields.booleanFalse": "خیر",
|
||||
"settings.extraFields.booleanTrue": "بله",
|
||||
"settings.extraFields.deleteConfirm": "آیا میخواهید {{name}} را حذف کنید؟",
|
||||
"settings.extraFields.description.constraints": "پس از افزودن یک فیلد، نمیتوانید کلید یا نوع آن را تغییر دهید و برای فیلدهای نوع انتخاب، نمیتوانید گزینهها را حذف یا وضعیت چندانتخابی را تغییر دهید. اگر یک فیلد را حذف کنید، دادههای مرتبط با تمام موجودیها حذف خواهد شد.",
|
||||
"settings.extraFields.description.intro": "در اینجا میتوانید فیلدهای سفارشی اضافی را به موجودیهای خود اضافه کنید.",
|
||||
"settings.extraFields.description.keyUsage": "کلید، اطلاعاتی است که برنامههای دیگر آن را میخوانند یا مینویسند، بنابراین اگر فیلد سفارشی شما قرار است با یک برنامه شخص ثالث ادغام شود، اطمینان حاصل کنید که به درستی تنظیم شده باشد. مقدار پیشفرض فقط بر روی اقلام جدید اعمال میشود.",
|
||||
"settings.extraFields.description.tableViews": "فیلدهای اضافی نمیتوانند در نماهای جدول مرتب یا فیلتر شوند.",
|
||||
"settings.extraFields.editorEdit": "",
|
||||
"settings.extraFields.editorNew": "",
|
||||
"settings.extraFields.errors.choiceNeeded": "",
|
||||
"settings.extraFields.errors.choicesRemoved": "",
|
||||
"settings.extraFields.errors.deleteFailed": "",
|
||||
"settings.extraFields.errors.keyFormat": "",
|
||||
"settings.extraFields.errors.nameRequired": "",
|
||||
"settings.extraFields.errors.saveFailed": "",
|
||||
"settings.extraFields.fieldType.boolean": "Boolean",
|
||||
"settings.extraFields.fieldType.choice": "انتخاب",
|
||||
"settings.extraFields.fieldType.datetime": "زمان و تاریخ",
|
||||
"settings.extraFields.fieldType.float": "عدد اعشاری",
|
||||
"settings.extraFields.fieldType.floatRange": "رنج عددی اعشاری",
|
||||
"settings.extraFields.fieldType.integer": "عدد بدون اعشار",
|
||||
"settings.extraFields.fieldType.integerRange": "رنج عددی بدون اعشار",
|
||||
"settings.extraFields.fieldType.text": "متن",
|
||||
"settings.extraFields.max": "",
|
||||
"settings.extraFields.min": "",
|
||||
"settings.extraFields.multiSuffix": "",
|
||||
"settings.extraFields.multiple": "",
|
||||
"settings.extraFields.namePlaceholder": "",
|
||||
"settings.extraFields.nonUniqueKeyError": "شاخصه کلیدی باید منحصر به فرد باشد.",
|
||||
"settings.extraFields.none": "",
|
||||
"settings.extraFields.params.choices": "آپشن های قابل استفاده",
|
||||
"settings.extraFields.params.defaultValue": "مقدار پیشفرض",
|
||||
"settings.extraFields.params.fieldType": "نوع",
|
||||
"settings.extraFields.params.key": "شاخصه کلیدی",
|
||||
"settings.extraFields.params.name": "عنوان",
|
||||
"settings.extraFields.params.order": "ترتیب",
|
||||
"settings.extraFields.params.unit": "واحد",
|
||||
"settings.extraFields.saveField": "",
|
||||
"settings.extraFields.tab": "فیلد های اضافه",
|
||||
"settings.general.baseUrl.label": "لینک Spoolman",
|
||||
"settings.general.baseUrl.tooltip": "آدرس پایگاه داده Spoolman که باید هنگام ایجاد ویژگیهایی مانند کدهای QR استفاده شود.",
|
||||
"settings.general.currency.desc": "",
|
||||
"settings.general.currency.label": "ارز مورد استفاده",
|
||||
"settings.general.roundPrices.label": "",
|
||||
"settings.general.roundPrices.tooltip": "",
|
||||
"settings.general.tab": "تنظیمات کلی",
|
||||
"settings.header": "تنظیمات",
|
||||
"settings.language.desc": "",
|
||||
"settings.language.label": "",
|
||||
"settings.library.lowThreshold.desc": "",
|
||||
"settings.library.lowThreshold.label": "",
|
||||
"settings.library.tab": "",
|
||||
"spool.fields.archived": "آرشیو شده",
|
||||
"spool.fields.comment": "توضیحات",
|
||||
"spool.fields.filament": "فیلامنت",
|
||||
"spool.fields.firstUsed": "زمان اولین استفاده",
|
||||
"spool.fields.id": "شماره",
|
||||
"spool.fields.lastUsed": "زمان آخرین استفاده",
|
||||
"spool.fields.location": "محل نگهداری",
|
||||
"spool.fields.lotNr": "شماره تولید",
|
||||
"spool.fields.material": "متریال",
|
||||
"spool.fields.measuredWeight": "مقدار اندازه گیری شده",
|
||||
"spool.fields.price": "قیمت",
|
||||
"spool.fields.registered": "ثبت شده",
|
||||
"spool.fields.remainingWeight": "مقدار باقی مانده",
|
||||
"spool.fields.usedWeight": "مقدار استفاده شده",
|
||||
"spool.fieldsHelp.location": "مکانی که قرقره در آن قرار دارد اگر چندین مکان برای ذخیره قرقرهها دارید.",
|
||||
"spool.fieldsHelp.lotNr": "شماره بچ تولیدکننده. میتواند برای اطمینان از اینکه چاپ رنگ ثابتی دارد در صورتی که از چندین قرقره استفاده شود، استفاده شود.",
|
||||
"spool.fieldsHelp.measuredWeight": "وزن فیلامنت و قرقره چقدر است.",
|
||||
"spool.fieldsHelp.price": "قیمت یک قرقره کامل. در صورت عدم تنظیم، قیمت فیلامنت در نظر گرفته میشود.",
|
||||
"spool.fieldsHelp.remainingWeight": "چقدر فیلامنت در قرقره باقی مانده است. برای یک قرقره جدید، این باید با وزن قرقره مطابقت داشته باشد.",
|
||||
"spool.fieldsHelp.usedWeight": "چقدر فیلامنت از قرقره استفاده شده است. یک قرقره جدید باید 0 گرم استفاده شده داشته باشد.",
|
||||
"spool.form.measurementType.length": "طول",
|
||||
"spool.form.measurementType.weight": "وزن",
|
||||
"spool.spool": "رول های فیلامنت",
|
||||
"topbar.addSpools": "",
|
||||
"topbar.searchPlaceholder": "",
|
||||
"unknown": "نامشخص",
|
||||
"validation.hexDigits": "",
|
||||
"validation.maxChars": "",
|
||||
"validation.mustBeGt": "",
|
||||
"validation.mustBeMax": "",
|
||||
"validation.mustBeMin": "",
|
||||
"validation.mustBeNumber": "",
|
||||
"validation.required": "",
|
||||
"vendor.fields.comment": "توضیحات",
|
||||
"vendor.fields.emptySpoolWeight": "وزن قرقره فیلامنت خالی",
|
||||
"vendor.fields.externalId": "شماره خارجی",
|
||||
"vendor.fields.id": "شماره",
|
||||
"vendor.fields.name": "اسم",
|
||||
"vendor.fields.registered": "ثبت شده",
|
||||
"vendor.fieldsHelp.emptySpoolWeight": "وزن یک قرقره خالی فیلامنت ارائه شده از تولید کننده.",
|
||||
"yes": "بله"
|
||||
}
|
||||
@@ -0,0 +1,639 @@
|
||||
{
|
||||
"add.addAndNew": "Ajouter & nouveau",
|
||||
"add.addN_many": "Ajouter {{count}} bobines",
|
||||
"add.addN_one": "Ajouter {{count}} bobine",
|
||||
"add.addN_other": "Ajouter {{count}} bobines",
|
||||
"add.adding": "Ajout...",
|
||||
"add.advanced": "Spécifications avancées",
|
||||
"add.advancedNote": "densité, diamètre, températures (remplies automatiquement à partir du matériau)",
|
||||
"add.change": "changer",
|
||||
"add.count": "Décompte",
|
||||
"add.createNew": "Créer un nouveau filament",
|
||||
"add.createNewSub": "n'est pas dans votre catalogue ou {{name}}",
|
||||
"add.dbUnavailable": "{{name}} indisponible",
|
||||
"add.duplicate": "dupliquer",
|
||||
"add.duplicateNote": "Les caractéristiques, le fabricant et le prix ont été repris. Donnez-lui un nouveau nom et une nouvelle couleur.",
|
||||
"add.duplicateRename": "Il porte toujours le même nom que l'original : renommez-le pour les distinguer.",
|
||||
"add.duplicateTitle": "Nouveau filament copie de “{{name}}”",
|
||||
"add.filamentNamePlaceholder": "Exemple : PolyTerra Matte Sage",
|
||||
"add.fill.full": "Rempli",
|
||||
"add.fillLevel": "Niveau de remplissage",
|
||||
"add.importNote": "Ce filament sera ajouté à votre catalogue lorsque vous ajouterez les bobines.",
|
||||
"add.inCatalog": "au catalogue",
|
||||
"add.locationHint": "L’endroit où vous rangez physiquement la bobine — une étagère, une caisse ou une imprimante. Laissez vide si vous les gardez toutes au même endroit.",
|
||||
"add.locationPlaceholder": "ex. Étagère A, Caisson 2, Imprimante 1",
|
||||
"add.manufacturerPlaceholder": "exemple : Polymaker",
|
||||
"add.nameHint": "Indiquez la couleur : c’est ce qui permet de distinguer vos filaments.",
|
||||
"add.newFilament": "Ajouter filament",
|
||||
"add.newFilamentTitle": "Nouveau filament",
|
||||
"add.noCatalog": "Aucun filament dans votre catalogue",
|
||||
"add.noManufacturer": "Sans fabriquant",
|
||||
"add.pickColor": "Choisissez une couleur",
|
||||
"add.searchPlaceholder": "Recherchez dans votre catalogue et {{name}}…",
|
||||
"add.searching": "Recherche…",
|
||||
"add.section.filament": "Filament",
|
||||
"add.section.filamentNote": "Le produit sur la bobine — une entrée par couleur.",
|
||||
"add.section.manufacturer": "Fabriquant",
|
||||
"add.section.manufacturerNote": "Qui fabrique le filament ? Ajouté une seule fois, puis réutilisé pour tous leurs filaments.",
|
||||
"add.section.spool": "Bobine",
|
||||
"add.section.spoolNote": "Les bobines physiques qui rejoignent votre inventaire.",
|
||||
"add.section.spoolSharedNote": "Le poids, le poids de la bobine et le prix sont également enregistrés comme valeurs par défaut pour le nouveau filament.",
|
||||
"add.spoolWeightPreset.cardboard": "Carton {{weight}}g",
|
||||
"add.spoolWeightPreset.plastic": "Plastique {{weight}}g",
|
||||
"add.spoolWeightPresetsLead": "Partez d'une bobine standard :",
|
||||
"add.step2": "Étape 2 · Détails de la bobine",
|
||||
"add.step2New": "Étape 2 · Détails du filament et de la bobine",
|
||||
"add.summary_many": "{{count}} bobines",
|
||||
"add.summary_one": "{{count}} bobine",
|
||||
"add.summary_other": "{{count}} bobines",
|
||||
"add.typeToSearchAll": "Tapez pour rechercher parmi des milliers de filaments",
|
||||
"add.typeToSearchMatches": "Tapez pour rechercher — aucun résultat",
|
||||
"add.useExisting": "utiliser un existant",
|
||||
"add.vendorHint.existing": "Utilisation du fabricant existant \"{{name}}\"",
|
||||
"add.vendorHint.new": "Le nouveau fabricant « {{name}} » sera créé",
|
||||
"add.vendorHint.optional": "Facultatif — laissez vide pour ne pas indiquer de fabricant",
|
||||
"add.weightPresets": "Tailles de bobines courantes",
|
||||
"add.yourCatalog": "Votre catalogue",
|
||||
"buttons.apply": "Appliquer",
|
||||
"buttons.archive": "Archiver",
|
||||
"buttons.cancel": "Abandonner",
|
||||
"buttons.clear": "Effacer",
|
||||
"buttons.close": "Fermer",
|
||||
"buttons.delete": "Supprimer",
|
||||
"buttons.edit": "Editer",
|
||||
"buttons.filter": "Filtre",
|
||||
"buttons.save": "Enregistrer",
|
||||
"buttons.showArchived": "Afficher les archives",
|
||||
"buttons.showNoSpools": "Afficher les filaments sans bobine",
|
||||
"buttons.unArchive": "Désarchiver",
|
||||
"changeFilament.action": "Changer",
|
||||
"changeFilament.adoptWeight": "Fixer le poids plein de cette bobine à {{full}}",
|
||||
"changeFilament.adoptWeightHelp": "Il est enregistré à {{current}}, hérité du filament précédent. Le poids consommé ({{used}}) est conservé dans les deux cas, ce qui laisse {{remaining}}.",
|
||||
"changeFilament.apply": "Changer le filament",
|
||||
"changeFilament.applying": "Changement en cours…",
|
||||
"changeFilament.current": "actuel",
|
||||
"changeFilament.done": "Filament changé.",
|
||||
"changeFilament.failed": "Le changement de filament a échoué.",
|
||||
"changeFilament.importNote": "Ce filament sera ajouté à votre catalogue lorsque vous validerez le changement.",
|
||||
"changeFilament.intro": "La bobine n° {{id}} conserve son numéro, son emplacement, ses dates et son historique d’utilisation — seul le filament qu’elle contient change.",
|
||||
"changeFilament.newTag": "nouveau",
|
||||
"changeFilament.next": "Remplacer par",
|
||||
"changeFilament.now": "Actuellement",
|
||||
"changeFilament.pickBelow": "Choisissez un filament ci-dessous",
|
||||
"changeFilament.title": "Changer le filament",
|
||||
"changeFilament.useExisting": "Choisir un filament existant",
|
||||
"changeFilament.weightFollows": "Cette bobine n’a pas de poids plein propre : elle reprend celui du nouveau filament, soit {{full}}, ce qui laisse {{remaining}} après les {{used}} déjà consommés.",
|
||||
"changeVendor.action": "Changer",
|
||||
"changeVendor.apply": "Changer le fabricant",
|
||||
"changeVendor.applying": "Changement en cours…",
|
||||
"changeVendor.clearHint": "Laisser ce filament sans fabricant",
|
||||
"changeVendor.create": "Créer « {{name}} »",
|
||||
"changeVendor.createHint": "Ne fait pas encore partie de vos fabricants — il sera ajouté",
|
||||
"changeVendor.current": "actuel",
|
||||
"changeVendor.done": "Fabricant changé.",
|
||||
"changeVendor.emptySpool": "Bobine vide {{value}}",
|
||||
"changeVendor.failed": "Le changement de fabricant a échoué.",
|
||||
"changeVendor.intro": "« {{name}} » conserve ses bobines, ses caractéristiques et son historique — seul le fabricant sous lequel il est classé change.",
|
||||
"changeVendor.next": "Remplacer par",
|
||||
"changeVendor.noEmptySpool": "Aucun poids de bobine vide",
|
||||
"changeVendor.noMatches": "Aucun fabricant ne correspond",
|
||||
"changeVendor.none": "Aucun fabricant pour l’instant",
|
||||
"changeVendor.noneNote": "Classé sans marque",
|
||||
"changeVendor.now": "Actuellement",
|
||||
"changeVendor.pickBelow": "Choisissez un fabricant ci-dessous",
|
||||
"changeVendor.searchPlaceholder": "Rechercher ou nommer un fabricant",
|
||||
"changeVendor.tareFollows": "Ce filament n’a pas de poids de bobine vide propre : il reprend celui de son fabricant. Après le changement, ce sera {{value}}, c’est-à-dire ce que pèse une bobine vide de ce filament lorsque vous la mesurez.",
|
||||
"changeVendor.tareGone": "Ce filament n’a pas de poids de bobine vide propre et reprend les {{current}} de son fabricant. Après le changement, il n’y en aura plus à reprendre, jusqu’à ce que vous en donniez un au filament.",
|
||||
"changeVendor.title": "Changer le fabricant",
|
||||
"changeVendor.willBeCreated": "Sera créé",
|
||||
"common.decrement": "Diminuer",
|
||||
"common.increment": "Augmenter",
|
||||
"common.remove": "Retirer",
|
||||
"common.search": "Rechercher",
|
||||
"dashboard.addFieldHint": "Ajoutez un champ texte ou à choix aux bobines dans les Réglages pour pouvoir aussi les grouper par ce champ",
|
||||
"dashboard.dashboard": "Tableau de bord",
|
||||
"dashboard.deleteGroup": "Supprimer le groupe",
|
||||
"dashboard.dragHint": "Faites glisser une bobine vers une autre carte pour changer son champ {{field}}, ou à l’intérieur d’une carte pour la réordonner",
|
||||
"dashboard.dropHere": "déposez des bobines ici",
|
||||
"dashboard.emptyHelp": "Cette page regroupe vos bobines selon le champ de votre choix. Ajoutez des bobines pour commencer !",
|
||||
"dashboard.errorEmptyName": "Le nom ne peut pas être vide",
|
||||
"dashboard.errorExists": "Un groupe portant ce nom existe déjà",
|
||||
"dashboard.errorRename": "Le renommage du groupe a échoué",
|
||||
"dashboard.lastUsed": "Utilisée il y a {{time}}",
|
||||
"dashboard.newGroup": "Nouveau groupe",
|
||||
"dashboard.newGroupName": "Nouveau groupe {{n}}",
|
||||
"dashboard.reorderGroup": "Faites glisser pour réordonner le groupe",
|
||||
"dashboard.spoolCount_many": "{{count}} bobines",
|
||||
"dashboard.spoolCount_one": "{{count}} bobine",
|
||||
"dashboard.spoolCount_other": "{{count}} bobines",
|
||||
"dashboard.unassigned": "Sans groupe",
|
||||
"datetime.done": "Terminé",
|
||||
"datetime.hour": "Heure",
|
||||
"datetime.minute": "Minute",
|
||||
"datetime.nextMonth": "Mois suivant",
|
||||
"datetime.now": "Maintenant",
|
||||
"datetime.pick": "Choisir la date et l’heure",
|
||||
"datetime.prevMonth": "Mois précédent",
|
||||
"datetime.time": "Heure",
|
||||
"documentTitle.dashboard.list": "Tableau de bord | Spoolman",
|
||||
"documentTitle.labels.list": "Étiquettes | Spoolman",
|
||||
"documentTitle.library.list": "Bibliothèque | Spoolman",
|
||||
"documentTitle.locations.list": "Emplacements | Spoolman",
|
||||
"documentTitle.settings.list": "Réglages | Spoolman",
|
||||
"filament.fields.addColor": "Ajouter une couleur",
|
||||
"filament.fields.articleNumber": "Numéro d'article",
|
||||
"filament.fields.coaxial": "Coextrudée",
|
||||
"filament.fields.colorHex": "Couleur",
|
||||
"filament.fields.colorType": "Type de couleur",
|
||||
"filament.fields.comment": "Commentaire",
|
||||
"filament.fields.density": "Densité",
|
||||
"filament.fields.diameter": "Diamètre",
|
||||
"filament.fields.externalId": "ID externe",
|
||||
"filament.fields.id": "Identifiant",
|
||||
"filament.fields.longitudinal": "Longitudinale",
|
||||
"filament.fields.material": "Matériau",
|
||||
"filament.fields.multiColor": "Multi",
|
||||
"filament.fields.name": "Nom",
|
||||
"filament.fields.opacity": "Opacité",
|
||||
"filament.fields.price": "Prix",
|
||||
"filament.fields.registered": "Enregistré",
|
||||
"filament.fields.removeColor": "Retirer la couleur",
|
||||
"filament.fields.settingsBedTemp": "Température du lit",
|
||||
"filament.fields.settingsExtruderTemp": "Température de l'extrudeuse",
|
||||
"filament.fields.singleColor": "Unique",
|
||||
"filament.fields.spoolWeight": "Poids de la bobine",
|
||||
"filament.fields.vendor": "Fabricant",
|
||||
"filament.fields.weight": "Poids",
|
||||
"filament.fieldsHelp.articleNumber": "Exemple EAN, UPC, etc.",
|
||||
"filament.fieldsHelp.multiColorDirection": "Les filaments peuvent avoir plusieurs couleurs de deux manières : soit par coextrusion, comme les filaments bicolores avec plusieurs couleurs uniformes, soit par des changements de couleur longitudinaux, comme les filaments dégradés qui changent de couleurs le long de la bobine.",
|
||||
"filament.fieldsHelp.spoolWeight": "Le poids d'une bobine vide. Utilisé pour déterminer le poids d'une bobine.",
|
||||
"filament.fieldsHelp.weight": "Le poids du filament d'une bobine complète (poids net). Ce poids ne doit pas inclure le poids de la bobine elle-même, mais uniquement celui du filament. C'est ce qui est généralement indiqué sur l'emballage.",
|
||||
"filament.filament": "Filaments",
|
||||
"footer.documentation": "Documentation",
|
||||
"footer.reportIssue": "Signaler un problème",
|
||||
"help.help": "Aide",
|
||||
"inspector.addSpoolsOfThis": "Ajouter des bobines de ce filament",
|
||||
"inspector.adjustFailed": "L’ajustement du poids a échoué.",
|
||||
"inspector.adjustHelp": "Une valeur positive consomme du filament, une valeur négative en rend.",
|
||||
"inspector.adjustWeight": "Ajuster le poids",
|
||||
"inspector.apply": "Appliquer",
|
||||
"inspector.applying": "Application en cours…",
|
||||
"inspector.colorHex": "Couleur hexadécimale",
|
||||
"inspector.consumeAmount": "Quantité à consommer :",
|
||||
"inspector.defaultFrom.filament": "{{value}} — valeur par défaut du filament",
|
||||
"inspector.defaultFrom.manufacturer": "{{value}} — valeur par défaut du fabricant",
|
||||
"inspector.delete.deleting": "Suppression en cours…",
|
||||
"inspector.delete.errorGone": "L’élément avait déjà été supprimé.",
|
||||
"inspector.delete.errorSpoolsExist": "Impossible de supprimer ce filament — des bobines l’utilisent encore.",
|
||||
"inspector.delete.errorUnknown": "La suppression a échoué. Consultez les journaux du serveur pour en savoir plus.",
|
||||
"inspector.delete.filament": "Supprimer le filament",
|
||||
"inspector.delete.filamentBlockedHint": "Supprimez d’abord ces bobines. Les archiver ne suffit pas.",
|
||||
"inspector.delete.filamentBlockedTitle": "Ce filament ne peut pas être supprimé",
|
||||
"inspector.delete.filamentBlocked_many": "{{count}} bobines utilisent encore « {{name}} », archives comprises.",
|
||||
"inspector.delete.filamentBlocked_one": "{{count}} bobine utilise encore « {{name}} », archives comprises.",
|
||||
"inspector.delete.filamentBlocked_other": "{{count}} bobines utilisent encore « {{name}} », archives comprises.",
|
||||
"inspector.delete.filamentBody": "« {{name}} » sera retiré de votre catalogue. Cette action est irréversible.",
|
||||
"inspector.delete.filamentDone": "Filament supprimé.",
|
||||
"inspector.delete.filamentTitle": "Supprimer ce filament ?",
|
||||
"inspector.delete.spool": "Supprimer la bobine",
|
||||
"inspector.delete.spoolBody": "La bobine n° {{id}} de « {{name}} » sera supprimée, ainsi que son historique d’utilisation. Cette action est irréversible.",
|
||||
"inspector.delete.spoolDone": "Bobine supprimée.",
|
||||
"inspector.delete.spoolRemaining": "Il lui reste encore {{weight}} de filament. Archivez-la plutôt, si vous voulez simplement l’écarter.",
|
||||
"inspector.delete.spoolTitle": "Supprimer cette bobine ?",
|
||||
"inspector.delete.vendor": "Supprimer le fabricant",
|
||||
"inspector.delete.vendorBody": "« {{name}} » sera supprimé. Cette action est irréversible.",
|
||||
"inspector.delete.vendorDone": "Fabricant supprimé.",
|
||||
"inspector.delete.vendorOrphans_many": "Ses {{count}} filaments sont conservés, mais se retrouvent sans fabricant.",
|
||||
"inspector.delete.vendorOrphans_one": "Son {{count}} filament est conservé, mais se retrouve sans fabricant.",
|
||||
"inspector.delete.vendorOrphans_other": "Ses {{count}} filaments sont conservés, mais se retrouvent sans fabricant.",
|
||||
"inspector.delete.vendorTitle": "Supprimer ce fabricant ?",
|
||||
"inspector.duplicateFilament": "Dupliquer",
|
||||
"inspector.empty": "Sélectionnez une bobine, un filament ou un fabricant dans la liste pour en afficher le détail ici.",
|
||||
"inspector.enterValidLength": "Saisissez une longueur valide.",
|
||||
"inspector.enterValidWeight": "Saisissez un poids valide.",
|
||||
"inspector.loading": "Chargement…",
|
||||
"inspector.manageExtraFields": "Gérer les champs",
|
||||
"inspector.measuredHelp": "Poids total de la bobine et du filament restant, tel que lu sur une balance.",
|
||||
"inspector.multi": "multi ×{{count}}",
|
||||
"inspector.newGross": "Nouveau poids brut :",
|
||||
"inspector.noExtraFields": "Aucun pour l’instant — ajoutez vos propres champs pour suivre ce que Spoolman ne gère pas.",
|
||||
"inspector.notFound": "Cet élément est introuvable. Il a peut-être été supprimé.",
|
||||
"inspector.ofRemaining": "sur {{weight}} restants · {{length}} m",
|
||||
"inspector.openFilament": "Ouvrir le filament",
|
||||
"inspector.openLink": "Ouvrir {{url}} dans un nouvel onglet",
|
||||
"inspector.openManufacturer": "Ouvrir le fabricant",
|
||||
"inspector.override.byFilament": "Remplacé par ce filament — {{value}}",
|
||||
"inspector.override.bySpool": "Remplacé par cette bobine — {{value}}",
|
||||
"inspector.override.overridesFilament": "Remplace le filament — {{value}}",
|
||||
"inspector.override.overridesManufacturer": "Remplace le fabricant — {{value}}",
|
||||
"inspector.specs": "Caractéristiques — modifiables sur place",
|
||||
"inspector.spoolsCount": "Bobines · {{count}}",
|
||||
"inspector.spoolsTotalRemaining": "{{weight}} au total",
|
||||
"inspector.used": "consommé",
|
||||
"inspector.vendorSub_many": "{{count}} filaments",
|
||||
"inspector.vendorSub_one": "{{count}} filament",
|
||||
"inspector.vendorSub_other": "{{count}} filaments",
|
||||
"kofi": "Me donner un pourboire sur Ko-fi",
|
||||
"labels.addHead": "Ajouter",
|
||||
"labels.addQr": "QR code",
|
||||
"labels.addRect": "Rectangle",
|
||||
"labels.addSwatch": "Pastille de couleur",
|
||||
"labels.addText": "Texte / champ",
|
||||
"labels.align": "Alignement",
|
||||
"labels.alignCenter": "Centré",
|
||||
"labels.alignLeft": "À gauche",
|
||||
"labels.alignRight": "À droite",
|
||||
"labels.blank": "Vous n’avez encore aucun modèle d’étiquette.",
|
||||
"labels.bold": "Gras",
|
||||
"labels.canvasHint": "Glissez pour déplacer · cliquez pour sélectionner · poignées pour redimensionner.",
|
||||
"labels.centerLogo": "Centrer le logo Spoolman",
|
||||
"labels.chooseField": "Choisissez un champ…",
|
||||
"labels.clearFill": "Supprimer le remplissage (contour seul)",
|
||||
"labels.copies": "Exemplaires",
|
||||
"labels.cornerRadiusMm": "Rayon des coins",
|
||||
"labels.createFirst": "Créez votre première étiquette",
|
||||
"labels.cutGuides": "Repères de coupe",
|
||||
"labels.deleteConfirm": "Supprimer ce modèle d’étiquette ?",
|
||||
"labels.deleteElement": "Supprimer l’élément",
|
||||
"labels.designName": "Nom du modèle",
|
||||
"labels.designerDesc": "Concevez des étiquettes à QR code avec n’importe quel champ de bobine, de filament ou de fabricant, puis imprimez-les sur planche ou sur une imprimante d’étiquettes. Les modèles sont enregistrés sur le serveur.",
|
||||
"labels.designerTitle": "Éditeur d’étiquettes",
|
||||
"labels.dpi": "Résolution",
|
||||
"labels.dpiHint": "Accordez-la à votre imprimante pour que les petites étiquettes restent nettes : 203 ppp pour la plupart des imprimantes thermiques, 300 ou plus pour le laser et le jet d’encre.",
|
||||
"labels.duplicate": "Dupliquer",
|
||||
"labels.exportDescAml": "Enregistre un fichier d’étiquette .aml par étiquette sélectionnée, chacune de {{w}} × {{h}} mm. S’ouvre dans les applications LPAPI fournies avec la plupart des imprimantes d’étiquettes thermiques, qui lisent la taille physique dans le fichier.",
|
||||
"labels.exportDescPng": "Enregistre une image PNG par étiquette sélectionnée, chacune de {{w}} × {{h}} mm.",
|
||||
"labels.exportFormat": "Format de fichier",
|
||||
"labels.exportFormatOptions.aml": "Fichier d’étiquette AML",
|
||||
"labels.exportFormatOptions.png": "Image PNG",
|
||||
"labels.fields.bedTemp": "Temp. plateau",
|
||||
"labels.fields.diameterMm": "Diamètre (mm)",
|
||||
"labels.fields.groupVendor": "Fabricant",
|
||||
"labels.fields.initialG": "Initial (g)",
|
||||
"labels.fields.netWeightG": "Poids net (g)",
|
||||
"labels.fields.remainingG": "Restant (g)",
|
||||
"labels.filamentsSelected_many": "{{count}} filaments sélectionnés",
|
||||
"labels.filamentsSelected_one": "{{count}} filament sélectionné",
|
||||
"labels.filamentsSelected_other": "{{count}} filaments sélectionnés",
|
||||
"labels.fill": "Remplissage",
|
||||
"labels.fitWidth": "Ajuster la largeur aux colonnes",
|
||||
"labels.fitWidthHint": "Règle la largeur de l’étiquette pour que le nombre de colonnes choisi remplisse la page.",
|
||||
"labels.fontMm": "Police",
|
||||
"labels.gridInfo": "{{cols}} × {{rows}} = {{perPage}} étiquettes par page",
|
||||
"labels.hMm": "H",
|
||||
"labels.heightMm": "Hauteur",
|
||||
"labels.hintNowrap": "Le texte reste sur une seule ligne ; ce qui dépasse la largeur est coupé.",
|
||||
"labels.hintSwatch": "Rempli avec la ou les couleurs du filament de la bobine au moment de l’impression.",
|
||||
"labels.hintWrap": "Encadrez un champ pour le masquer lorsqu’il est vide :",
|
||||
"labels.imageDesc": "",
|
||||
"labels.imageZipNote": "Au-delà de {{threshold}} étiquettes, le tout est livré dans un seul fichier zip.",
|
||||
"labels.insertField": "Insérer un champ",
|
||||
"labels.kind.qr": "QR code",
|
||||
"labels.kind.rect": "Rectangle",
|
||||
"labels.kind.swatch": "Pastille",
|
||||
"labels.kind.text": "Texte",
|
||||
"labels.labelSize": "Taille de l’étiquette",
|
||||
"labels.labelType": "Type d’étiquette",
|
||||
"labels.layout": "Disposition",
|
||||
"labels.modeImage": "Fichiers",
|
||||
"labels.modeLabel": "Imprimante d’étiquettes",
|
||||
"labels.modeSheet": "Planche (mosaïque)",
|
||||
"labels.new": "Nouveau",
|
||||
"labels.newText": "Nouveau texte",
|
||||
"labels.noDesignsOption": "Aucun modèle pour l’instant",
|
||||
"labels.noFilaments": "Aucun filament.",
|
||||
"labels.noSpools": "Aucune bobine.",
|
||||
"labels.onePerLabel": "Une page de {{w}} × {{h}} mm par étiquette.",
|
||||
"labels.preparing": "Préparation…",
|
||||
"labels.preview": "Aperçu",
|
||||
"labels.previewWith": "Aperçu avec",
|
||||
"labels.printN_many": "Imprimer {{count}} étiquettes",
|
||||
"labels.printN_one": "Imprimer {{count}} étiquette",
|
||||
"labels.printN_other": "Imprimer {{count}} étiquettes",
|
||||
"labels.radiusMm": "Rayon",
|
||||
"labels.sampleData": "Données d’exemple",
|
||||
"labels.saveAsFormat": "Enregistrer au format {{format}}",
|
||||
"labels.saved": "Enregistré",
|
||||
"labels.saving": "Enregistrement…",
|
||||
"labels.searchFilaments": "Rechercher des filaments…",
|
||||
"labels.searchSpools": "Rechercher des bobines…",
|
||||
"labels.selectAllShort": "Tout",
|
||||
"labels.selectAtLeastOne": "Sélectionnez au moins une bobine.",
|
||||
"labels.selectAtLeastOneFilament": "Sélectionnez au moins un filament.",
|
||||
"labels.selectDesign": "Choisir un modèle d’étiquette",
|
||||
"labels.selectElement": "Sélectionnez un élément pour le modifier, ou ajoutez-en un depuis la palette.",
|
||||
"labels.selectNoneShort": "Aucun",
|
||||
"labels.selectRecentHint": "Sélectionner les bobines ajoutées dans les dernières 24 heures",
|
||||
"labels.selectRecentShort": "Récentes ({{count}})",
|
||||
"labels.showingFilament": "Affichage du filament n° {{id}}",
|
||||
"labels.showingReal": "Affichage des données réelles de la bobine.",
|
||||
"labels.showingSpool": "Affichage de la bobine n° {{id}}",
|
||||
"labels.showingTags": "Les champs s’affichent sous forme d’étiquettes tant que vous n’avez pas choisi une bobine ci-dessus.",
|
||||
"labels.sizeMm": "Taille",
|
||||
"labels.skipHint": "« Ignorer des cases » laisse ce nombre de cases vides avant la première étiquette, ce qui permet de réutiliser une planche entamée : comptez les étiquettes déjà décollées, de gauche à droite en partant du haut.",
|
||||
"labels.sortHint": "Trier les bobines",
|
||||
"labels.sortId": "N°",
|
||||
"labels.sortNewest": "Plus récentes",
|
||||
"labels.stroke": "Contour",
|
||||
"labels.strokeMm": "Contour",
|
||||
"labels.tabDesign": "Conception",
|
||||
"labels.tabPrint": "Impression",
|
||||
"labels.textTemplate": "Texte / modèle",
|
||||
"labels.typeFilament": "Filament",
|
||||
"labels.typeHint": "Les étiquettes de filament omettent les champs propres aux bobines, et leur QR code renvoie vers le filament plutôt que vers une bobine.",
|
||||
"labels.typeSpool": "Bobine",
|
||||
"labels.unknownFilament": "Filament inconnu",
|
||||
"labels.wMm": "L",
|
||||
"labels.widthMm": "Largeur",
|
||||
"labels.wrapText": "Retour à la ligne",
|
||||
"labels.xMm": "X",
|
||||
"labels.yMm": "Y",
|
||||
"library.apiError": "Impossible de joindre l’API de Spoolman. Le serveur est-il démarré ?",
|
||||
"library.collapseGroup": "Masquer ces bobines",
|
||||
"library.dateFilter.ago": "il y a {{span}}",
|
||||
"library.dateFilter.between": "{{from}} — {{to}}",
|
||||
"library.dateFilter.customRange": "Période personnalisée",
|
||||
"library.dateFilter.from": "Du",
|
||||
"library.dateFilter.last": "{{span}} écoulés",
|
||||
"library.dateFilter.never": "Jamais",
|
||||
"library.dateFilter.olderThan": "Plus ancien que {{span}}",
|
||||
"library.dateFilter.since": "Depuis le {{date}}",
|
||||
"library.dateFilter.to": "Au (facultatif)",
|
||||
"library.dateFilter.until": "Jusqu’au {{date}}",
|
||||
"library.emptyBody": "Ajoutez votre première bobine pour commencer à suivre votre filament.",
|
||||
"library.emptyFiltered": "Aucune correspondance parmi les {{unit}} avec les filtres actuels.",
|
||||
"library.emptyTitle": "Aucune bobine pour l’instant",
|
||||
"library.expandGroup": "Afficher ces bobines",
|
||||
"library.filterBy": "Filtrer par",
|
||||
"library.groupBy": "Grouper",
|
||||
"library.groupNone": "Aucun (liste simple)",
|
||||
"library.groupSpools_many": "{{count}} bobines",
|
||||
"library.groupSpools_one": "{{count}} bobine",
|
||||
"library.groupSpools_other": "{{count}} bobines",
|
||||
"library.nUnused": "×{{count}} neuves",
|
||||
"library.noLocation": "sans emplacement",
|
||||
"library.noSpools": "Aucune bobine",
|
||||
"library.noValues": "Aucune valeur",
|
||||
"library.openGroup": "Ouvrir {{name}}",
|
||||
"library.openManufacturer": "Ouvrir le fabricant {{name}}",
|
||||
"library.resizeList": "Redimensionner la liste (double-clic pour réinitialiser)",
|
||||
"library.reverseSort": "Inverser l’ordre de tri",
|
||||
"library.section.extra": "Champs supplémentaires",
|
||||
"library.section.filament": "Filament",
|
||||
"library.section.spool": "Bobine",
|
||||
"library.section.vendor": "Fabricant",
|
||||
"library.showMore": "afficher {{count}} de plus",
|
||||
"library.sort.nozzle": "Temp. buse",
|
||||
"library.sortBy": "Trier",
|
||||
"library.unassigned": "non assignée",
|
||||
"library.unitGroups": "groupes",
|
||||
"library.unitSpools": "bobines",
|
||||
"library.unused": "neuve",
|
||||
"library.unusedGroup": "{{count}} neuves · {{weight}} g chacune",
|
||||
"library.unusedGroupMixed": "{{count}} neuves",
|
||||
"library.unusedSub": "{{weight}} g chacune · {{location}}",
|
||||
"library.unusedSubMixed": "{{location}}",
|
||||
"library.used": "entamée",
|
||||
"library.usedAgo": "utilisée il y a {{time}}",
|
||||
"loading": "Chargement",
|
||||
"locations.locations": "Emplacements",
|
||||
"locations.newLocation": "Créer un emplacement",
|
||||
"locations.noLocation": "Pas de localisation",
|
||||
"locations.noLocationsHelp": "Cette page vous permet d'organiser vos bobines par lieu, ajoutez une bobine pour commencer !",
|
||||
"nav.labels": "Étiquettes",
|
||||
"nav.library": "Bibliothèque",
|
||||
"no": "Non",
|
||||
"notifications.error": "Erreur (status code : {{statusCode}})",
|
||||
"notifications.saveSuccessful": "Sauvegarde réussie !",
|
||||
"pagination.empty": "Aucune {{unit}}",
|
||||
"pagination.next": "Page suivante",
|
||||
"pagination.pageSize": "Taille de page",
|
||||
"pagination.perPage": "{{size}} par page",
|
||||
"pagination.prev": "Page précédente",
|
||||
"pagination.range": "{{from}}–{{to}} sur {{total}} {{unit}}",
|
||||
"printing.generic.columns": "Colonnes",
|
||||
"printing.generic.customSize": "Personnaliser",
|
||||
"printing.generic.description": "Ajustez les paramètres ci-dessous pour obtenir la mise en page d'impression souhaitée. Gardez à l'esprit que les imprimantes et votre système d'exploitation peuvent appliquer leurs propres marges et mises à l'échelle, il se peut donc que vous deviez faire quelques essais avant que tout soit correct. Testez-le sur une feuille de papier ordinaire avant d'imprimer les étiquettes en elles mêmes.",
|
||||
"printing.generic.dimensions": "Dimensions",
|
||||
"printing.generic.gridTooWide": "Les étiquettes sont plus larges que la page. Réduisez le nombre de colonnes, l’espacement ou les marges.",
|
||||
"printing.generic.helpMargin": "Les marges doivent être configurées en fonction de votre papier à étiquettes et de votre imprimante, leur modification aura une incidence sur la taille de l'ensemble de la grille.",
|
||||
"printing.generic.helpPrinterMargin": "La zone de sécurité doit être définie en fonction de la proximité du bord du papier que votre imprimante peut imprimer, la modification de ces paramètres n'affectera pas l'ensemble de la grille.",
|
||||
"printing.generic.horizontalSpacing": "Espacement horizontal",
|
||||
"printing.generic.itemCopies": "Nombre d'articles",
|
||||
"printing.generic.marginBottom": "Marge inférieure",
|
||||
"printing.generic.marginLeft": "Marge gauche",
|
||||
"printing.generic.marginRight": "Marge droite",
|
||||
"printing.generic.marginTop": "Marge supérieure",
|
||||
"printing.generic.paperSize": "Format du papier",
|
||||
"printing.generic.printerMarginBottom": "Zone de sécurité en bas",
|
||||
"printing.generic.printerMarginLeft": "Zone de sécurité à gauche",
|
||||
"printing.generic.printerMarginRight": "Zone de sécurité à droite",
|
||||
"printing.generic.printerMarginTop": "Zone de sécurité en haut",
|
||||
"printing.generic.saveAsImage": "Enregistrer comme image",
|
||||
"printing.generic.skipItems": "Articles ignorés",
|
||||
"printing.generic.verticalSpacing": "Espacement vertical",
|
||||
"printing.qrcode.button": "Imprimer des étiquettes",
|
||||
"printing.qrcode.customUrl.caveat": "Une URL personnalisée ne ramènera pas vers Spoolman à la lecture — utilisez-la pour pointer un QR code imprimé vers une application externe ou un autre serveur.",
|
||||
"printing.qrcode.customUrl.hint": "Insérez l’identifiant de la bobine où vous voulez à l’aide du marqueur",
|
||||
"printing.qrcode.customUrl.label": "Modèle d’URL personnalisée",
|
||||
"printing.qrcode.useHTTPUrl.label": "Lien du QR code",
|
||||
"printing.qrcode.useHTTPUrl.options.custom": "URL personnalisée",
|
||||
"printing.qrcode.useHTTPUrl.options.default": "Défaut",
|
||||
"printing.qrcode.useHTTPUrl.options.url": "URL",
|
||||
"printing.qrcode.useHTTPUrl.preview": "Prévisualisation :",
|
||||
"printing.qrcode.useHTTPUrl.tooltip": "Utilise un lien privé qui ne marchera que si il est scanné depuis Spoolman (défaut). URL utilises soit l'URL spécifiée dans les options soit l'URL de la page actuelle si ce n'est pas défini.",
|
||||
"printing.spoolSelect.selectedTotal_many": "{{count}} bobines sélectionnées",
|
||||
"printing.spoolSelect.selectedTotal_one": "{{count}} bobine sélectionnée",
|
||||
"printing.spoolSelect.selectedTotal_other": "{{count}} bobines sélectionnées",
|
||||
"scanner.description": "Scannez un code QR de Spoolman pour afficher les détails de la bobine.",
|
||||
"scanner.error.inUse": "La caméra est déjà utilisée par une autre application.",
|
||||
"scanner.error.insecureContext": "La page n'est pas servie par HTTPS.",
|
||||
"scanner.error.notAllowed": "Vous n'avez pas autorisé l'accès à l'appareil photo.",
|
||||
"scanner.error.notFound": "Aucun appareil photo n'a été trouvé.",
|
||||
"scanner.error.streamApiNotSupported": "Le navigateur ne prend pas en charge l'API MediaStream.",
|
||||
"scanner.error.unknown": "Une erreur inconnue s'est produite. ({{error}})",
|
||||
"scanner.starting": "Démarrage de la caméra…",
|
||||
"scanner.title": "Scanner de code QR",
|
||||
"search.colorHint": "Les noms de couleurs doivent être saisis en anglais.",
|
||||
"search.moreSpools": "+{{count}} de plus",
|
||||
"search.noResults": "Aucun résultat",
|
||||
"search.searching": "Recherche en cours…",
|
||||
"search.section.filaments": "Filaments",
|
||||
"search.section.spools": "Bobines",
|
||||
"search.section.vendors": "Fabricants",
|
||||
"search.threshold": "Correspondance de couleur",
|
||||
"search.unknownFilament": "Filament inconnu",
|
||||
"settings.appearance.tab": "Apparence",
|
||||
"settings.appearance.theme.dark": "Sombre",
|
||||
"settings.appearance.theme.desc": "Thème de couleurs (ce navigateur uniquement)",
|
||||
"settings.appearance.theme.label": "Thème",
|
||||
"settings.appearance.theme.light": "Clair",
|
||||
"settings.appearance.theme.system": "Système",
|
||||
"settings.extraFields.addChoice": "ajouter un choix…",
|
||||
"settings.extraFields.addChoicesFirst": "Ajoutez d’abord des choix",
|
||||
"settings.extraFields.addEntityField": "Ajouter un champ {{entity}}",
|
||||
"settings.extraFields.booleanFalse": "Non",
|
||||
"settings.extraFields.booleanTrue": "Oui",
|
||||
"settings.extraFields.deleteConfirm": "Supprimer le champ {{name}} de {{entity}} ?",
|
||||
"settings.extraFields.description.constraints": "Une fois qu'un champ est ajouté, vous ne pouvez plus changer sa clé ou son type, et pour les champs de types \"Choix\", vous ne pouvez plus retirer un choix ou changer l'état des choix multiples. Si vous supprimez un champ, les données associées aux entités seront supprimées.",
|
||||
"settings.extraFields.description.intro": "Ici vous pouvez ajouter des champs personnalisés supplémentaires à vos entités.",
|
||||
"settings.extraFields.description.keyUsage": "La clé correspond à ce que les autres programmes lisent/écrivent, donc si votre champs doit s'intégrer avec un programme tiers, assurez-vous de le configurer correctement. La valeur par défaut n'est appliquées qu'aux nouveaux éléments.",
|
||||
"settings.extraFields.description.tableViews": "Les champs supplementaires ne peuvent pas être triés ou filtrés dans les vues de table.",
|
||||
"settings.extraFields.editorEdit": "Modifier le champ {{entity}}",
|
||||
"settings.extraFields.editorNew": "Nouveau champ {{entity}}",
|
||||
"settings.extraFields.errors.choiceNeeded": "Un champ à choix nécessite au moins un choix.",
|
||||
"settings.extraFields.errors.choicesRemoved": "Les choix existants ne peuvent pas être retirés : {{choices}}.",
|
||||
"settings.extraFields.errors.deleteFailed": "La suppression du champ a échoué.",
|
||||
"settings.extraFields.errors.keyFormat": "La clé ne doit contenir que des minuscules, des chiffres et des tirets bas.",
|
||||
"settings.extraFields.errors.nameRequired": "Le nom est obligatoire.",
|
||||
"settings.extraFields.errors.saveFailed": "L’enregistrement du champ a échoué.",
|
||||
"settings.extraFields.fieldType.boolean": "Booléen",
|
||||
"settings.extraFields.fieldType.choice": "Choix",
|
||||
"settings.extraFields.fieldType.datetime": "Date et heure",
|
||||
"settings.extraFields.fieldType.float": "Décimal",
|
||||
"settings.extraFields.fieldType.floatRange": "Plage décimal",
|
||||
"settings.extraFields.fieldType.integer": "Entier",
|
||||
"settings.extraFields.fieldType.integerRange": "Plage d'entier",
|
||||
"settings.extraFields.fieldType.text": "Texte",
|
||||
"settings.extraFields.max": "max",
|
||||
"settings.extraFields.min": "min",
|
||||
"settings.extraFields.multiSuffix": " · multiple",
|
||||
"settings.extraFields.multiple": "Multiple",
|
||||
"settings.extraFields.namePlaceholder": "Nom affiché",
|
||||
"settings.extraFields.nonUniqueKeyError": "La clé doit être unique.",
|
||||
"settings.extraFields.none": "Aucun champ supplémentaire défini pour {{entity}}.",
|
||||
"settings.extraFields.params.choices": "Choix",
|
||||
"settings.extraFields.params.defaultValue": "Valeur par défaut",
|
||||
"settings.extraFields.params.fieldType": "Type",
|
||||
"settings.extraFields.params.key": "Clé",
|
||||
"settings.extraFields.params.name": "Nom",
|
||||
"settings.extraFields.params.order": "Ordre",
|
||||
"settings.extraFields.params.unit": "Unité",
|
||||
"settings.extraFields.reorderChoice": "Faites glisser, ou utilisez les flèches du clavier, pour réordonner ce choix.",
|
||||
"settings.extraFields.saveField": "Enregistrer le champ",
|
||||
"settings.extraFields.tab": "Champs additionnel",
|
||||
"settings.general.baseUrl.label": "Base de l'URL",
|
||||
"settings.general.baseUrl.tooltip": "La base de l'URL à utiliser lors de la génération de QR codes.",
|
||||
"settings.general.currency.desc": "Code ISO à trois lettres (par exemple EUR, USD) utilisé pour les prix",
|
||||
"settings.general.currency.label": "Devise",
|
||||
"settings.general.roundPrices.label": "Arrondir les prix",
|
||||
"settings.general.roundPrices.tooltip": "Arrondir les prix au nombre entier le plus proche.",
|
||||
"settings.general.tab": "Général",
|
||||
"settings.header": "Paramètres",
|
||||
"settings.language.desc": "Langue de l’interface (ce navigateur uniquement)",
|
||||
"settings.language.label": "Langue",
|
||||
"settings.library.lowThreshold.desc": "Les bobines à ce poids ou en dessous sont signalées en rouge (ce navigateur uniquement)",
|
||||
"settings.library.lowThreshold.label": "Seuil de stock bas",
|
||||
"settings.library.tab": "Comportement de la bibliothèque",
|
||||
"settings.scanner.autoNavigate.desc": "Ouvrir automatiquement, dans ce navigateur, la bobine ou le filament lu par un lecteur de puces.",
|
||||
"settings.scanner.autoNavigate.label": "Ouverture automatique",
|
||||
"settings.scanner.docs": "Comment configurer un lecteur de puces",
|
||||
"settings.scanner.lastSeen": "il y a {{when}}",
|
||||
"settings.scanner.pair": "Associer par lecture",
|
||||
"settings.scanner.reader.anyDesc": "Les lectures de n’importe quel lecteur ouvrent les bobines dans ce navigateur. Vous pouvez en associer un en particulier si vous souhaitez un contrôle plus fin. C’est aussi ce lecteur qui servira à ajouter de nouvelles puces aux bobines et aux filaments.",
|
||||
"settings.scanner.reader.label": "Lecteur de puces",
|
||||
"settings.scanner.reader.pairedDesc": "Seules les lectures de ce lecteur ouvrent les bobines dans ce navigateur.",
|
||||
"settings.scanner.recent": "Lecteurs récents",
|
||||
"settings.scanner.recentNone": "Aucun lecteur en mémoire. Configurez un lecteur de puces, puis lisez une puce pour le voir apparaître ici.",
|
||||
"settings.scanner.tab": "Lecture de puces",
|
||||
"settings.scanner.unpair": "Utiliser n’importe quel lecteur",
|
||||
"settings.scanner.use": "Utiliser celui-ci",
|
||||
"settings.scanner.waiting": "Présentez une puce sur le lecteur que vous souhaitez associer…",
|
||||
"sponsor": "Soutenez-moi sur GitHub",
|
||||
"spool.fields.archived": "Archivé",
|
||||
"spool.fields.comment": "Commentaire",
|
||||
"spool.fields.filament": "Filament",
|
||||
"spool.fields.firstUsed": "Première utilisation",
|
||||
"spool.fields.id": "Identifiant",
|
||||
"spool.fields.lastUsed": "Dernière utilisation",
|
||||
"spool.fields.location": "Localisation",
|
||||
"spool.fields.lotNr": "N° de Lot",
|
||||
"spool.fields.material": "Matériau",
|
||||
"spool.fields.measuredWeight": "Poids mesuré",
|
||||
"spool.fields.price": "Prix",
|
||||
"spool.fields.registered": "Enregistré",
|
||||
"spool.fields.remainingWeight": "Poids restant",
|
||||
"spool.fields.spoolWeight": "Poids de la bobine",
|
||||
"spool.fields.usedWeight": "Poids utilisé",
|
||||
"spool.fields.weight": "Poids",
|
||||
"spool.fieldsHelp.location": "L'emplacement de la bobine si vous stockez vos bobines à plusieurs endroits.",
|
||||
"spool.fieldsHelp.lotNr": "Numéro de lot du fabricant. Peut être utilisé pour s'assurer que la couleur d'une impression est homogène si plusieurs bobines sont utilisées.",
|
||||
"spool.fieldsHelp.measuredWeight": "Le poids du filament et de la bobine.",
|
||||
"spool.fieldsHelp.price": "Prix d'une bobine complète. S'il n'est pas défini, le prix du filament sera pris en compte.",
|
||||
"spool.fieldsHelp.remainingWeight": "La quantité de filament restant sur la bobine. Pour une nouvelle bobine, cela devrait correspondre au poids de la bobine.",
|
||||
"spool.fieldsHelp.spoolWeight": "Ce que pèse cette bobine à vide. Laissez le champ libre pour suivre le poids de bobine du filament, et renseignez-le lorsque cette bobine précise diffère — un rouleau rembobiné, ou un mandrin carton remplacé par du plastique. C’est ce qui est soustrait de la mesure lorsque vous ajustez au poids pesé : une valeur erronée fausse aussi la quantité de filament restante.",
|
||||
"spool.fieldsHelp.usedWeight": "Combien de filament a été utilisé à partir de la bobine. Une bobine neuve devrait avoir 0g utilisé.",
|
||||
"spool.fieldsHelp.weight": "Quantité de filament que contenait cette bobine pleine (poids net, sans compter la bobine elle-même). Laissez le champ libre pour suivre le poids du filament, et renseignez-le lorsque cette bobine précise diffère — un rouleau entamé, ou le même filament acheté sur une bobine plus grande.",
|
||||
"spool.form.measurementType.length": "Longueur",
|
||||
"spool.form.measurementType.weight": "Poids",
|
||||
"spool.spool": "Bobines",
|
||||
"tags.add": "Ajouter une puce",
|
||||
"tags.added": "Puce associée.",
|
||||
"tags.addedOn": "Ajoutée le {{date}}",
|
||||
"tags.modal.alreadyHere": "Cette puce identifie déjà cette bobine.",
|
||||
"tags.modal.alreadyHereFilament": "Cette puce identifie déjà ce filament.",
|
||||
"tags.modal.badUid": "L’UID d’une puce est hexadécimal, par exemple 04A2B3C4.",
|
||||
"tags.modal.checking": "Vérification…",
|
||||
"tags.modal.failed": "L’association de la puce a échoué.",
|
||||
"tags.modal.filamentNamed": "le filament {{name}}",
|
||||
"tags.modal.free": "Cette puce n’est encore associée à rien.",
|
||||
"tags.modal.intro": "Présenter cette puce sur un lecteur ouvrira désormais la bobine n° {{id}}.",
|
||||
"tags.modal.introFilament": "Présenter cette puce sur un lecteur ouvrira désormais ce filament.",
|
||||
"tags.modal.lastSeenOn": "{{reader}} a lu {{uid}} en dernier.",
|
||||
"tags.modal.link": "Associer la puce",
|
||||
"tags.modal.linking": "Association en cours…",
|
||||
"tags.modal.move": "La déplacer ici depuis la n° {{id}}",
|
||||
"tags.modal.moveFailed": "Le déplacement de la puce a échoué. Elle peut n’être désormais associée à aucune des deux bobines — essayez de l’associer à nouveau.",
|
||||
"tags.modal.moveFailedFilament": "Le déplacement de la puce a échoué. Elle peut n’être désormais associée à rien — essayez de l’associer à nouveau.",
|
||||
"tags.modal.moveHere": "La déplacer ici",
|
||||
"tags.modal.moving": "Déplacement en cours…",
|
||||
"tags.modal.phoneReading": "Maintenez la puce contre votre téléphone…",
|
||||
"tags.modal.phoneScan": "Lire une puce avec ce téléphone",
|
||||
"tags.modal.spoolNamed": "la bobine n° {{id}}, {{name}}",
|
||||
"tags.modal.spoolShort": "la bobine n° {{id}}",
|
||||
"tags.modal.takenBy": "Actuellement associée à {{spool}}.",
|
||||
"tags.modal.title": "Associer une puce",
|
||||
"tags.modal.uidHelp": "Les séparateurs et la casse n’ont aucune importance : 04:a2:b3:c4, 04-A2-B3-C4 et 04a2b3c4 désignent la même puce.",
|
||||
"tags.modal.uidLabel": "UID de la puce",
|
||||
"tags.modal.uidPlaceholder": "04A2B3C4",
|
||||
"tags.modal.useLastSeen": "L’utiliser",
|
||||
"tags.modal.waitingAny": "En attente d’une lecture sur n’importe quel lecteur.",
|
||||
"tags.modal.waitingOn": "En attente d’une lecture sur {{reader}}.",
|
||||
"tags.moved": "Puce déplacée ici depuis la bobine n° {{id}}.",
|
||||
"tags.movedFromFilament": "Puce déplacée ici depuis le filament {{name}}.",
|
||||
"tags.nfc.insecureContext": "La lecture des puces nécessite une connexion sécurisée. Ouvrez Spoolman en HTTPS pour utiliser le NFC de votre téléphone.",
|
||||
"tags.nfc.notAllowed": "Ce site n’est pas autorisé à utiliser le NFC. Accordez-lui la permission dans les réglages de site de votre navigateur, puis réessayez.",
|
||||
"tags.nfc.notReadable": "Le lecteur NFC est indisponible — une autre application l’utilise peut-être.",
|
||||
"tags.nfc.notSupported": "Ce téléphone n’a pas de NFC, ou le NFC est désactivé dans les réglages du système.",
|
||||
"tags.nfc.unknown": "La lecture de la puce a échoué.",
|
||||
"tags.none": "Aucune puce associée.",
|
||||
"tags.scan.openedFilament": "Puce lue : filament {{name}} ouvert.",
|
||||
"tags.scan.openedSpool": "Puce lue : bobine n° {{id}} ouverte, {{name}}.",
|
||||
"tags.scan.unknown": "Puce inconnue {{uid}}. Ouvrez la bobine à laquelle elle appartient et utilisez « Ajouter une puce » pour l’associer.",
|
||||
"tags.section": "Puces",
|
||||
"tags.unlink": "Dissocier",
|
||||
"tags.unlinkBody": "La puce {{uid}} cessera d’identifier cette bobine. Rien n’est écrit sur la puce elle-même : vous pourrez l’associer à nouveau — à cette bobine ou à une autre — quand vous le souhaiterez.",
|
||||
"tags.unlinkBodyFilament": "La puce {{uid}} cessera d’identifier ce filament. Rien n’est écrit sur la puce elle-même : vous pourrez l’associer à nouveau — ici ou ailleurs — quand vous le souhaiterez.",
|
||||
"tags.unlinkFailed": "La dissociation de la puce a échoué.",
|
||||
"tags.unlinkTitle": "Dissocier cette puce ?",
|
||||
"tags.unlinked": "Puce dissociée.",
|
||||
"tags.unlinking": "Dissociation en cours…",
|
||||
"topbar.addSpools": "Ajouter des bobines",
|
||||
"topbar.searchPlaceholder": "Rechercher — essayez « red » ou « pla »",
|
||||
"unknown": "Inconnu",
|
||||
"validation.hexDigits": "Utilisez 6 ou 8 chiffres hexadécimaux",
|
||||
"validation.maxChars": "{{max}} caractères au maximum",
|
||||
"validation.mustBeGt": "Doit être supérieur à {{value}}",
|
||||
"validation.mustBeMax": "Doit être inférieur ou égal à {{value}}",
|
||||
"validation.mustBeMin": "Doit être supérieur ou égal à {{value}}",
|
||||
"validation.mustBeNumber": "Doit être un nombre",
|
||||
"validation.required": "Obligatoire",
|
||||
"vendor.fields.comment": "Commentaire",
|
||||
"vendor.fields.emptySpoolWeight": "Poids de la bobine vide",
|
||||
"vendor.fields.externalId": "ID externe",
|
||||
"vendor.fields.id": "Identifiant",
|
||||
"vendor.fields.name": "Nom",
|
||||
"vendor.fields.registered": "Enregistré",
|
||||
"vendor.fieldsHelp.emptySpoolWeight": "Le poids d'une bobine vide de ce fabricant.",
|
||||
"yes": "Oui"
|
||||
}
|
||||
@@ -0,0 +1,463 @@
|
||||
{
|
||||
"add.addAndNew": "",
|
||||
"add.adding": "",
|
||||
"add.advanced": "",
|
||||
"add.advancedNote": "",
|
||||
"add.change": "",
|
||||
"add.count": "",
|
||||
"add.createNew": "",
|
||||
"add.createNewSub": "",
|
||||
"add.dbUnavailable": "",
|
||||
"add.duplicate": "",
|
||||
"add.duplicateNote": "",
|
||||
"add.duplicateRename": "",
|
||||
"add.duplicateTitle": "",
|
||||
"add.filamentNamePlaceholder": "",
|
||||
"add.fill.full": "",
|
||||
"add.fillLevel": "",
|
||||
"add.importNote": "",
|
||||
"add.inCatalog": "",
|
||||
"add.locationHint": "",
|
||||
"add.locationPlaceholder": "",
|
||||
"add.manufacturerPlaceholder": "",
|
||||
"add.nameHint": "",
|
||||
"add.newFilament": "",
|
||||
"add.newFilamentTitle": "",
|
||||
"add.noCatalog": "",
|
||||
"add.noManufacturer": "",
|
||||
"add.pickColor": "",
|
||||
"add.searchPlaceholder": "",
|
||||
"add.searching": "",
|
||||
"add.spoolWeightPreset.cardboard": "",
|
||||
"add.spoolWeightPreset.plastic": "",
|
||||
"add.spoolWeightPresetsLead": "",
|
||||
"add.step2": "",
|
||||
"add.typeToSearchAll": "",
|
||||
"add.typeToSearchMatches": "",
|
||||
"add.useExisting": "",
|
||||
"add.vendorHint.existing": "",
|
||||
"add.vendorHint.new": "",
|
||||
"add.vendorHint.optional": "",
|
||||
"add.yourCatalog": "",
|
||||
"buttons.archive": "",
|
||||
"buttons.cancel": "",
|
||||
"buttons.clear": "",
|
||||
"buttons.close": "",
|
||||
"buttons.delete": "",
|
||||
"buttons.edit": "Sampadan Karen",
|
||||
"buttons.filter": "",
|
||||
"buttons.save": "Sahejen",
|
||||
"buttons.showArchived": "",
|
||||
"buttons.unArchive": "",
|
||||
"common.decrement": "",
|
||||
"common.increment": "",
|
||||
"common.remove": "",
|
||||
"common.search": "",
|
||||
"dashboard.addFieldHint": "",
|
||||
"dashboard.dashboard": "",
|
||||
"dashboard.deleteGroup": "",
|
||||
"dashboard.dragHint": "",
|
||||
"dashboard.dropHere": "",
|
||||
"dashboard.emptyHelp": "",
|
||||
"dashboard.errorEmptyName": "",
|
||||
"dashboard.errorExists": "",
|
||||
"dashboard.errorRename": "",
|
||||
"dashboard.lastUsed": "",
|
||||
"dashboard.newGroup": "",
|
||||
"dashboard.newGroupName": "",
|
||||
"dashboard.reorderGroup": "",
|
||||
"dashboard.unassigned": "",
|
||||
"datetime.done": "",
|
||||
"datetime.hour": "",
|
||||
"datetime.minute": "",
|
||||
"datetime.nextMonth": "",
|
||||
"datetime.now": "",
|
||||
"datetime.pick": "",
|
||||
"datetime.prevMonth": "",
|
||||
"datetime.time": "",
|
||||
"documentTitle.dashboard.list": "",
|
||||
"documentTitle.labels.list": "",
|
||||
"documentTitle.library.list": "",
|
||||
"documentTitle.locations.list": "",
|
||||
"documentTitle.settings.list": "",
|
||||
"filament.fields.addColor": "",
|
||||
"filament.fields.articleNumber": "",
|
||||
"filament.fields.coaxial": "",
|
||||
"filament.fields.colorHex": "",
|
||||
"filament.fields.colorType": "",
|
||||
"filament.fields.comment": "",
|
||||
"filament.fields.density": "",
|
||||
"filament.fields.diameter": "",
|
||||
"filament.fields.externalId": "",
|
||||
"filament.fields.id": "",
|
||||
"filament.fields.longitudinal": "",
|
||||
"filament.fields.material": "",
|
||||
"filament.fields.multiColor": "",
|
||||
"filament.fields.name": "",
|
||||
"filament.fields.price": "",
|
||||
"filament.fields.registered": "",
|
||||
"filament.fields.removeColor": "",
|
||||
"filament.fields.settingsBedTemp": "",
|
||||
"filament.fields.settingsExtruderTemp": "",
|
||||
"filament.fields.singleColor": "",
|
||||
"filament.fields.spoolWeight": "",
|
||||
"filament.fields.vendor": "",
|
||||
"filament.fields.weight": "",
|
||||
"filament.fieldsHelp.articleNumber": "",
|
||||
"filament.fieldsHelp.multiColorDirection": "",
|
||||
"filament.fieldsHelp.spoolWeight": "",
|
||||
"filament.fieldsHelp.weight": "",
|
||||
"filament.filament": "",
|
||||
"footer.documentation": "",
|
||||
"footer.reportIssue": "",
|
||||
"help.help": "",
|
||||
"inspector.addSpoolsOfThis": "",
|
||||
"inspector.adjustFailed": "",
|
||||
"inspector.adjustHelp": "",
|
||||
"inspector.adjustWeight": "",
|
||||
"inspector.apply": "",
|
||||
"inspector.applying": "",
|
||||
"inspector.colorHex": "",
|
||||
"inspector.consumeAmount": "",
|
||||
"inspector.delete.deleting": "",
|
||||
"inspector.delete.errorGone": "",
|
||||
"inspector.delete.errorSpoolsExist": "",
|
||||
"inspector.delete.errorUnknown": "",
|
||||
"inspector.delete.filament": "",
|
||||
"inspector.delete.filamentBlockedHint": "",
|
||||
"inspector.delete.filamentBlockedTitle": "",
|
||||
"inspector.delete.filamentBody": "",
|
||||
"inspector.delete.filamentDone": "",
|
||||
"inspector.delete.filamentTitle": "",
|
||||
"inspector.delete.spool": "",
|
||||
"inspector.delete.spoolBody": "",
|
||||
"inspector.delete.spoolDone": "",
|
||||
"inspector.delete.spoolRemaining": "",
|
||||
"inspector.delete.spoolTitle": "",
|
||||
"inspector.delete.vendor": "",
|
||||
"inspector.delete.vendorBody": "",
|
||||
"inspector.delete.vendorDone": "",
|
||||
"inspector.delete.vendorTitle": "",
|
||||
"inspector.duplicateFilament": "",
|
||||
"inspector.empty": "",
|
||||
"inspector.enterValidLength": "",
|
||||
"inspector.enterValidWeight": "",
|
||||
"inspector.loading": "",
|
||||
"inspector.manageExtraFields": "",
|
||||
"inspector.measuredHelp": "",
|
||||
"inspector.multi": "",
|
||||
"inspector.newGross": "",
|
||||
"inspector.noExtraFields": "",
|
||||
"inspector.notFound": "",
|
||||
"inspector.ofRemaining": "",
|
||||
"inspector.openFilament": "",
|
||||
"inspector.openLink": "",
|
||||
"inspector.openManufacturer": "",
|
||||
"inspector.specs": "",
|
||||
"inspector.spoolsCount": "",
|
||||
"inspector.spoolsTotalRemaining": "",
|
||||
"inspector.used": "",
|
||||
"kofi": "",
|
||||
"labels.addHead": "",
|
||||
"labels.addQr": "",
|
||||
"labels.addRect": "",
|
||||
"labels.addSwatch": "",
|
||||
"labels.addText": "",
|
||||
"labels.align": "",
|
||||
"labels.alignCenter": "",
|
||||
"labels.alignLeft": "",
|
||||
"labels.alignRight": "",
|
||||
"labels.blank": "",
|
||||
"labels.bold": "",
|
||||
"labels.canvasHint": "",
|
||||
"labels.centerLogo": "",
|
||||
"labels.chooseField": "",
|
||||
"labels.clearFill": "",
|
||||
"labels.copies": "",
|
||||
"labels.cornerRadiusMm": "",
|
||||
"labels.createFirst": "",
|
||||
"labels.cutGuides": "",
|
||||
"labels.deleteConfirm": "",
|
||||
"labels.deleteElement": "",
|
||||
"labels.designName": "",
|
||||
"labels.designerDesc": "",
|
||||
"labels.designerTitle": "",
|
||||
"labels.dpi": "",
|
||||
"labels.dpiHint": "",
|
||||
"labels.duplicate": "",
|
||||
"labels.fields.bedTemp": "",
|
||||
"labels.fields.diameterMm": "",
|
||||
"labels.fields.groupVendor": "",
|
||||
"labels.fields.initialG": "",
|
||||
"labels.fields.netWeightG": "",
|
||||
"labels.fields.remainingG": "",
|
||||
"labels.fill": "",
|
||||
"labels.fitWidth": "",
|
||||
"labels.fitWidthHint": "",
|
||||
"labels.fontMm": "",
|
||||
"labels.gridInfo": "",
|
||||
"labels.hMm": "",
|
||||
"labels.heightMm": "",
|
||||
"labels.hintNowrap": "",
|
||||
"labels.hintSwatch": "",
|
||||
"labels.hintWrap": "",
|
||||
"labels.imageDesc": "",
|
||||
"labels.imageZipNote": "",
|
||||
"labels.insertField": "",
|
||||
"labels.kind.qr": "",
|
||||
"labels.kind.rect": "",
|
||||
"labels.kind.swatch": "",
|
||||
"labels.kind.text": "",
|
||||
"labels.labelSize": "",
|
||||
"labels.labelType": "",
|
||||
"labels.layout": "",
|
||||
"labels.modeImage": "",
|
||||
"labels.modeLabel": "",
|
||||
"labels.modeSheet": "",
|
||||
"labels.new": "",
|
||||
"labels.newText": "",
|
||||
"labels.noDesignsOption": "",
|
||||
"labels.noFilaments": "",
|
||||
"labels.noSpools": "",
|
||||
"labels.onePerLabel": "",
|
||||
"labels.preparing": "",
|
||||
"labels.preview": "",
|
||||
"labels.previewWith": "",
|
||||
"labels.radiusMm": "",
|
||||
"labels.sampleData": "",
|
||||
"labels.saved": "",
|
||||
"labels.saving": "",
|
||||
"labels.searchFilaments": "",
|
||||
"labels.searchSpools": "",
|
||||
"labels.selectAllShort": "",
|
||||
"labels.selectAtLeastOne": "",
|
||||
"labels.selectAtLeastOneFilament": "",
|
||||
"labels.selectDesign": "",
|
||||
"labels.selectElement": "",
|
||||
"labels.selectNoneShort": "",
|
||||
"labels.selectRecentHint": "",
|
||||
"labels.selectRecentShort": "",
|
||||
"labels.showingFilament": "",
|
||||
"labels.showingReal": "",
|
||||
"labels.showingSpool": "",
|
||||
"labels.showingTags": "",
|
||||
"labels.sizeMm": "",
|
||||
"labels.skipHint": "",
|
||||
"labels.sortHint": "",
|
||||
"labels.sortId": "",
|
||||
"labels.sortNewest": "",
|
||||
"labels.stroke": "",
|
||||
"labels.strokeMm": "",
|
||||
"labels.tabDesign": "",
|
||||
"labels.tabPrint": "",
|
||||
"labels.textTemplate": "",
|
||||
"labels.typeFilament": "",
|
||||
"labels.typeHint": "",
|
||||
"labels.typeSpool": "",
|
||||
"labels.unknownFilament": "",
|
||||
"labels.wMm": "",
|
||||
"labels.widthMm": "",
|
||||
"labels.wrapText": "",
|
||||
"labels.xMm": "",
|
||||
"labels.yMm": "",
|
||||
"library.apiError": "",
|
||||
"library.collapseGroup": "",
|
||||
"library.emptyBody": "",
|
||||
"library.emptyFiltered": "",
|
||||
"library.emptyTitle": "",
|
||||
"library.expandGroup": "",
|
||||
"library.filterBy": "",
|
||||
"library.groupBy": "",
|
||||
"library.groupNone": "",
|
||||
"library.nUnused": "",
|
||||
"library.noLocation": "",
|
||||
"library.noValues": "",
|
||||
"library.openGroup": "",
|
||||
"library.openManufacturer": "",
|
||||
"library.section.extra": "",
|
||||
"library.section.filament": "",
|
||||
"library.section.spool": "",
|
||||
"library.section.vendor": "",
|
||||
"library.showMore": "",
|
||||
"library.sort.nozzle": "",
|
||||
"library.sortBy": "",
|
||||
"library.unassigned": "",
|
||||
"library.unitGroups": "",
|
||||
"library.unitSpools": "",
|
||||
"library.unused": "",
|
||||
"library.unusedGroup": "",
|
||||
"library.unusedGroupMixed": "",
|
||||
"library.unusedSub": "",
|
||||
"library.unusedSubMixed": "",
|
||||
"library.used": "",
|
||||
"library.usedAgo": "",
|
||||
"loading": "",
|
||||
"locations.locations": "",
|
||||
"locations.newLocation": "",
|
||||
"locations.noLocation": "",
|
||||
"locations.noLocationsHelp": "",
|
||||
"nav.labels": "",
|
||||
"nav.library": "",
|
||||
"no": "",
|
||||
"notifications.error": "",
|
||||
"notifications.saveSuccessful": "",
|
||||
"pagination.empty": "",
|
||||
"pagination.next": "",
|
||||
"pagination.pageSize": "",
|
||||
"pagination.perPage": "",
|
||||
"pagination.prev": "",
|
||||
"pagination.range": "",
|
||||
"printing.generic.columns": "",
|
||||
"printing.generic.customSize": "",
|
||||
"printing.generic.description": "",
|
||||
"printing.generic.dimensions": "",
|
||||
"printing.generic.gridTooWide": "",
|
||||
"printing.generic.helpMargin": "",
|
||||
"printing.generic.helpPrinterMargin": "",
|
||||
"printing.generic.horizontalSpacing": "",
|
||||
"printing.generic.itemCopies": "",
|
||||
"printing.generic.marginBottom": "",
|
||||
"printing.generic.marginLeft": "",
|
||||
"printing.generic.marginRight": "",
|
||||
"printing.generic.marginTop": "",
|
||||
"printing.generic.paperSize": "",
|
||||
"printing.generic.printerMarginBottom": "",
|
||||
"printing.generic.printerMarginLeft": "",
|
||||
"printing.generic.printerMarginRight": "",
|
||||
"printing.generic.printerMarginTop": "",
|
||||
"printing.generic.saveAsImage": "",
|
||||
"printing.generic.skipItems": "",
|
||||
"printing.generic.verticalSpacing": "",
|
||||
"printing.qrcode.button": "",
|
||||
"printing.qrcode.customUrl.caveat": "",
|
||||
"printing.qrcode.customUrl.hint": "",
|
||||
"printing.qrcode.customUrl.label": "",
|
||||
"printing.qrcode.useHTTPUrl.label": "",
|
||||
"printing.qrcode.useHTTPUrl.options.custom": "",
|
||||
"printing.qrcode.useHTTPUrl.options.default": "",
|
||||
"printing.qrcode.useHTTPUrl.options.url": "",
|
||||
"printing.qrcode.useHTTPUrl.preview": "",
|
||||
"printing.qrcode.useHTTPUrl.tooltip": "",
|
||||
"printing.spoolSelect.selectedTotal_one": "",
|
||||
"printing.spoolSelect.selectedTotal_other": "",
|
||||
"scanner.description": "",
|
||||
"scanner.error.inUse": "",
|
||||
"scanner.error.insecureContext": "",
|
||||
"scanner.error.notAllowed": "",
|
||||
"scanner.error.notFound": "",
|
||||
"scanner.error.streamApiNotSupported": "",
|
||||
"scanner.error.unknown": "",
|
||||
"scanner.starting": "",
|
||||
"scanner.title": "",
|
||||
"search.colorHint": "",
|
||||
"search.noResults": "",
|
||||
"search.searching": "",
|
||||
"search.section.filaments": "",
|
||||
"search.section.spools": "",
|
||||
"search.section.vendors": "",
|
||||
"search.threshold": "",
|
||||
"search.unknownFilament": "",
|
||||
"settings.appearance.tab": "",
|
||||
"settings.appearance.theme.dark": "",
|
||||
"settings.appearance.theme.desc": "",
|
||||
"settings.appearance.theme.label": "",
|
||||
"settings.appearance.theme.light": "",
|
||||
"settings.appearance.theme.system": "",
|
||||
"settings.extraFields.addChoice": "",
|
||||
"settings.extraFields.addChoicesFirst": "",
|
||||
"settings.extraFields.addEntityField": "",
|
||||
"settings.extraFields.booleanFalse": "",
|
||||
"settings.extraFields.booleanTrue": "",
|
||||
"settings.extraFields.deleteConfirm": "",
|
||||
"settings.extraFields.description": "",
|
||||
"settings.extraFields.description.constraints": "",
|
||||
"settings.extraFields.description.intro": "",
|
||||
"settings.extraFields.description.keyUsage": "",
|
||||
"settings.extraFields.description.tableViews": "",
|
||||
"settings.extraFields.editorEdit": "",
|
||||
"settings.extraFields.editorNew": "",
|
||||
"settings.extraFields.errors.choiceNeeded": "",
|
||||
"settings.extraFields.errors.choicesRemoved": "",
|
||||
"settings.extraFields.errors.deleteFailed": "",
|
||||
"settings.extraFields.errors.keyFormat": "",
|
||||
"settings.extraFields.errors.nameRequired": "",
|
||||
"settings.extraFields.errors.saveFailed": "",
|
||||
"settings.extraFields.fieldType.boolean": "",
|
||||
"settings.extraFields.fieldType.choice": "",
|
||||
"settings.extraFields.fieldType.datetime": "",
|
||||
"settings.extraFields.fieldType.float": "",
|
||||
"settings.extraFields.fieldType.floatRange": "",
|
||||
"settings.extraFields.fieldType.integer": "",
|
||||
"settings.extraFields.fieldType.integerRange": "",
|
||||
"settings.extraFields.fieldType.text": "",
|
||||
"settings.extraFields.max": "",
|
||||
"settings.extraFields.min": "",
|
||||
"settings.extraFields.multiSuffix": "",
|
||||
"settings.extraFields.multiple": "",
|
||||
"settings.extraFields.namePlaceholder": "",
|
||||
"settings.extraFields.nonUniqueKeyError": "",
|
||||
"settings.extraFields.none": "",
|
||||
"settings.extraFields.params.choices": "",
|
||||
"settings.extraFields.params.defaultValue": "",
|
||||
"settings.extraFields.params.fieldType": "",
|
||||
"settings.extraFields.params.key": "",
|
||||
"settings.extraFields.params.name": "",
|
||||
"settings.extraFields.params.order": "",
|
||||
"settings.extraFields.params.unit": "",
|
||||
"settings.extraFields.saveField": "",
|
||||
"settings.extraFields.tab": "",
|
||||
"settings.general.baseUrl.label": "",
|
||||
"settings.general.baseUrl.tooltip": "",
|
||||
"settings.general.currency.desc": "",
|
||||
"settings.general.currency.label": "",
|
||||
"settings.general.roundPrices.label": "",
|
||||
"settings.general.roundPrices.tooltip": "",
|
||||
"settings.general.tab": "",
|
||||
"settings.header": "",
|
||||
"settings.language.desc": "",
|
||||
"settings.language.label": "",
|
||||
"settings.library.lowThreshold.desc": "",
|
||||
"settings.library.lowThreshold.label": "",
|
||||
"settings.library.tab": "",
|
||||
"spool.fields.archived": "",
|
||||
"spool.fields.comment": "",
|
||||
"spool.fields.filament": "",
|
||||
"spool.fields.firstUsed": "",
|
||||
"spool.fields.id": "",
|
||||
"spool.fields.lastUsed": "",
|
||||
"spool.fields.location": "",
|
||||
"spool.fields.lotNr": "",
|
||||
"spool.fields.material": "",
|
||||
"spool.fields.measuredWeight": "",
|
||||
"spool.fields.price": "",
|
||||
"spool.fields.registered": "",
|
||||
"spool.fields.remainingWeight": "",
|
||||
"spool.fields.usedWeight": "",
|
||||
"spool.fieldsHelp.location": "",
|
||||
"spool.fieldsHelp.lotNr": "",
|
||||
"spool.fieldsHelp.measuredWeight": "",
|
||||
"spool.fieldsHelp.price": "",
|
||||
"spool.fieldsHelp.remainingWeight": "",
|
||||
"spool.fieldsHelp.usedWeight": "",
|
||||
"spool.form.measurementType.length": "",
|
||||
"spool.form.measurementType.weight": "",
|
||||
"spool.spool": "",
|
||||
"topbar.addSpools": "",
|
||||
"topbar.searchPlaceholder": "",
|
||||
"unknown": "",
|
||||
"validation.hexDigits": "",
|
||||
"validation.maxChars": "",
|
||||
"validation.mustBeGt": "",
|
||||
"validation.mustBeMax": "",
|
||||
"validation.mustBeMin": "",
|
||||
"validation.mustBeNumber": "",
|
||||
"validation.required": "",
|
||||
"vendor.fields.comment": "",
|
||||
"vendor.fields.emptySpoolWeight": "",
|
||||
"vendor.fields.externalId": "",
|
||||
"vendor.fields.id": "",
|
||||
"vendor.fields.name": "",
|
||||
"vendor.fields.registered": "",
|
||||
"vendor.fieldsHelp.emptySpoolWeight": "",
|
||||
"yes": ""
|
||||
}
|
||||
@@ -0,0 +1,462 @@
|
||||
{
|
||||
"add.addAndNew": "",
|
||||
"add.adding": "",
|
||||
"add.advanced": "",
|
||||
"add.advancedNote": "",
|
||||
"add.change": "",
|
||||
"add.count": "",
|
||||
"add.createNew": "",
|
||||
"add.createNewSub": "",
|
||||
"add.dbUnavailable": "",
|
||||
"add.duplicate": "",
|
||||
"add.duplicateNote": "",
|
||||
"add.duplicateRename": "",
|
||||
"add.duplicateTitle": "",
|
||||
"add.filamentNamePlaceholder": "",
|
||||
"add.fill.full": "",
|
||||
"add.fillLevel": "",
|
||||
"add.importNote": "",
|
||||
"add.inCatalog": "",
|
||||
"add.locationHint": "",
|
||||
"add.locationPlaceholder": "",
|
||||
"add.manufacturerPlaceholder": "",
|
||||
"add.nameHint": "",
|
||||
"add.newFilament": "",
|
||||
"add.newFilamentTitle": "",
|
||||
"add.noCatalog": "",
|
||||
"add.noManufacturer": "",
|
||||
"add.pickColor": "",
|
||||
"add.searchPlaceholder": "",
|
||||
"add.searching": "",
|
||||
"add.spoolWeightPreset.cardboard": "",
|
||||
"add.spoolWeightPreset.plastic": "",
|
||||
"add.spoolWeightPresetsLead": "",
|
||||
"add.step2": "",
|
||||
"add.typeToSearchAll": "",
|
||||
"add.typeToSearchMatches": "",
|
||||
"add.useExisting": "",
|
||||
"add.vendorHint.existing": "",
|
||||
"add.vendorHint.new": "",
|
||||
"add.vendorHint.optional": "",
|
||||
"add.yourCatalog": "",
|
||||
"buttons.archive": "Arhiválás",
|
||||
"buttons.cancel": "Mégse",
|
||||
"buttons.clear": "Törlés",
|
||||
"buttons.close": "",
|
||||
"buttons.delete": "Töröl",
|
||||
"buttons.edit": "Szerkeszt",
|
||||
"buttons.filter": "Szűrő",
|
||||
"buttons.save": "Mentés",
|
||||
"buttons.showArchived": "Arhiváltak megjelítése",
|
||||
"buttons.unArchive": "Arhiválás visszavonása",
|
||||
"common.decrement": "",
|
||||
"common.increment": "",
|
||||
"common.remove": "",
|
||||
"common.search": "",
|
||||
"dashboard.addFieldHint": "",
|
||||
"dashboard.dashboard": "",
|
||||
"dashboard.deleteGroup": "",
|
||||
"dashboard.dragHint": "",
|
||||
"dashboard.dropHere": "",
|
||||
"dashboard.emptyHelp": "",
|
||||
"dashboard.errorEmptyName": "",
|
||||
"dashboard.errorExists": "",
|
||||
"dashboard.errorRename": "",
|
||||
"dashboard.lastUsed": "",
|
||||
"dashboard.newGroup": "",
|
||||
"dashboard.newGroupName": "",
|
||||
"dashboard.reorderGroup": "",
|
||||
"dashboard.unassigned": "",
|
||||
"datetime.done": "",
|
||||
"datetime.hour": "",
|
||||
"datetime.minute": "",
|
||||
"datetime.nextMonth": "",
|
||||
"datetime.now": "",
|
||||
"datetime.pick": "",
|
||||
"datetime.prevMonth": "",
|
||||
"datetime.time": "",
|
||||
"documentTitle.dashboard.list": "",
|
||||
"documentTitle.labels.list": "",
|
||||
"documentTitle.library.list": "",
|
||||
"documentTitle.locations.list": "Tároló helyek | Spoolman",
|
||||
"documentTitle.settings.list": "",
|
||||
"filament.fields.addColor": "",
|
||||
"filament.fields.articleNumber": "Cikkszám",
|
||||
"filament.fields.coaxial": "",
|
||||
"filament.fields.colorHex": "Szín",
|
||||
"filament.fields.colorType": "",
|
||||
"filament.fields.comment": "Megjegyzés",
|
||||
"filament.fields.density": "Sűrűség",
|
||||
"filament.fields.diameter": "Átmérő",
|
||||
"filament.fields.externalId": "Külső ID",
|
||||
"filament.fields.id": "ID",
|
||||
"filament.fields.longitudinal": "",
|
||||
"filament.fields.material": "Anyag",
|
||||
"filament.fields.multiColor": "",
|
||||
"filament.fields.name": "Név",
|
||||
"filament.fields.price": "Ár",
|
||||
"filament.fields.registered": "Nyilvántartott",
|
||||
"filament.fields.removeColor": "",
|
||||
"filament.fields.settingsBedTemp": "Tárgyasztal hőmérséklet",
|
||||
"filament.fields.settingsExtruderTemp": "Extruder hőmérséklet",
|
||||
"filament.fields.singleColor": "",
|
||||
"filament.fields.spoolWeight": "Tekercs súlya",
|
||||
"filament.fields.vendor": "Gyártó",
|
||||
"filament.fields.weight": "Súly",
|
||||
"filament.fieldsHelp.articleNumber": "Például. EAN, UPC stb.",
|
||||
"filament.fieldsHelp.multiColorDirection": "",
|
||||
"filament.fieldsHelp.spoolWeight": "Az üres tekercs súlya. Ezt használják a tekercs mért súlyának meghatározásához.",
|
||||
"filament.fieldsHelp.weight": "A teljes tekercs súlya (nettó súly), amely nem tartalmazza a tekercs saját súlyát, csak a filament súlyát. Általában ez szerepel a csomagoláson.",
|
||||
"filament.filament": "Szálak",
|
||||
"footer.documentation": "",
|
||||
"footer.reportIssue": "",
|
||||
"help.help": "Segítség",
|
||||
"inspector.addSpoolsOfThis": "",
|
||||
"inspector.adjustFailed": "",
|
||||
"inspector.adjustHelp": "",
|
||||
"inspector.adjustWeight": "",
|
||||
"inspector.apply": "",
|
||||
"inspector.applying": "",
|
||||
"inspector.colorHex": "",
|
||||
"inspector.consumeAmount": "",
|
||||
"inspector.delete.deleting": "",
|
||||
"inspector.delete.errorGone": "",
|
||||
"inspector.delete.errorSpoolsExist": "",
|
||||
"inspector.delete.errorUnknown": "",
|
||||
"inspector.delete.filament": "",
|
||||
"inspector.delete.filamentBlockedHint": "",
|
||||
"inspector.delete.filamentBlockedTitle": "",
|
||||
"inspector.delete.filamentBody": "",
|
||||
"inspector.delete.filamentDone": "",
|
||||
"inspector.delete.filamentTitle": "",
|
||||
"inspector.delete.spool": "",
|
||||
"inspector.delete.spoolBody": "",
|
||||
"inspector.delete.spoolDone": "",
|
||||
"inspector.delete.spoolRemaining": "",
|
||||
"inspector.delete.spoolTitle": "",
|
||||
"inspector.delete.vendor": "",
|
||||
"inspector.delete.vendorBody": "",
|
||||
"inspector.delete.vendorDone": "",
|
||||
"inspector.delete.vendorTitle": "",
|
||||
"inspector.duplicateFilament": "",
|
||||
"inspector.empty": "",
|
||||
"inspector.enterValidLength": "",
|
||||
"inspector.enterValidWeight": "",
|
||||
"inspector.loading": "",
|
||||
"inspector.manageExtraFields": "",
|
||||
"inspector.measuredHelp": "",
|
||||
"inspector.multi": "",
|
||||
"inspector.newGross": "",
|
||||
"inspector.noExtraFields": "",
|
||||
"inspector.notFound": "",
|
||||
"inspector.ofRemaining": "",
|
||||
"inspector.openFilament": "",
|
||||
"inspector.openLink": "",
|
||||
"inspector.openManufacturer": "",
|
||||
"inspector.specs": "",
|
||||
"inspector.spoolsCount": "",
|
||||
"inspector.spoolsTotalRemaining": "",
|
||||
"inspector.used": "",
|
||||
"kofi": "Tipp a Ko-fi-ra",
|
||||
"labels.addHead": "",
|
||||
"labels.addQr": "",
|
||||
"labels.addRect": "",
|
||||
"labels.addSwatch": "",
|
||||
"labels.addText": "",
|
||||
"labels.align": "",
|
||||
"labels.alignCenter": "",
|
||||
"labels.alignLeft": "",
|
||||
"labels.alignRight": "",
|
||||
"labels.blank": "",
|
||||
"labels.bold": "",
|
||||
"labels.canvasHint": "",
|
||||
"labels.centerLogo": "",
|
||||
"labels.chooseField": "",
|
||||
"labels.clearFill": "",
|
||||
"labels.copies": "",
|
||||
"labels.cornerRadiusMm": "",
|
||||
"labels.createFirst": "",
|
||||
"labels.cutGuides": "",
|
||||
"labels.deleteConfirm": "",
|
||||
"labels.deleteElement": "",
|
||||
"labels.designName": "",
|
||||
"labels.designerDesc": "",
|
||||
"labels.designerTitle": "",
|
||||
"labels.dpi": "",
|
||||
"labels.dpiHint": "",
|
||||
"labels.duplicate": "",
|
||||
"labels.fields.bedTemp": "",
|
||||
"labels.fields.diameterMm": "",
|
||||
"labels.fields.groupVendor": "",
|
||||
"labels.fields.initialG": "",
|
||||
"labels.fields.netWeightG": "",
|
||||
"labels.fields.remainingG": "",
|
||||
"labels.fill": "",
|
||||
"labels.fitWidth": "",
|
||||
"labels.fitWidthHint": "",
|
||||
"labels.fontMm": "",
|
||||
"labels.gridInfo": "",
|
||||
"labels.hMm": "",
|
||||
"labels.heightMm": "",
|
||||
"labels.hintNowrap": "",
|
||||
"labels.hintSwatch": "",
|
||||
"labels.hintWrap": "",
|
||||
"labels.imageDesc": "",
|
||||
"labels.imageZipNote": "",
|
||||
"labels.insertField": "",
|
||||
"labels.kind.qr": "",
|
||||
"labels.kind.rect": "",
|
||||
"labels.kind.swatch": "",
|
||||
"labels.kind.text": "",
|
||||
"labels.labelSize": "",
|
||||
"labels.labelType": "",
|
||||
"labels.layout": "",
|
||||
"labels.modeImage": "",
|
||||
"labels.modeLabel": "",
|
||||
"labels.modeSheet": "",
|
||||
"labels.new": "",
|
||||
"labels.newText": "",
|
||||
"labels.noDesignsOption": "",
|
||||
"labels.noFilaments": "",
|
||||
"labels.noSpools": "",
|
||||
"labels.onePerLabel": "",
|
||||
"labels.preparing": "",
|
||||
"labels.preview": "",
|
||||
"labels.previewWith": "",
|
||||
"labels.radiusMm": "",
|
||||
"labels.sampleData": "",
|
||||
"labels.saved": "",
|
||||
"labels.saving": "",
|
||||
"labels.searchFilaments": "",
|
||||
"labels.searchSpools": "",
|
||||
"labels.selectAllShort": "",
|
||||
"labels.selectAtLeastOne": "",
|
||||
"labels.selectAtLeastOneFilament": "",
|
||||
"labels.selectDesign": "",
|
||||
"labels.selectElement": "",
|
||||
"labels.selectNoneShort": "",
|
||||
"labels.selectRecentHint": "",
|
||||
"labels.selectRecentShort": "",
|
||||
"labels.showingFilament": "",
|
||||
"labels.showingReal": "",
|
||||
"labels.showingSpool": "",
|
||||
"labels.showingTags": "",
|
||||
"labels.sizeMm": "",
|
||||
"labels.skipHint": "",
|
||||
"labels.sortHint": "",
|
||||
"labels.sortId": "",
|
||||
"labels.sortNewest": "",
|
||||
"labels.stroke": "",
|
||||
"labels.strokeMm": "",
|
||||
"labels.tabDesign": "",
|
||||
"labels.tabPrint": "",
|
||||
"labels.textTemplate": "",
|
||||
"labels.typeFilament": "",
|
||||
"labels.typeHint": "",
|
||||
"labels.typeSpool": "",
|
||||
"labels.unknownFilament": "",
|
||||
"labels.wMm": "",
|
||||
"labels.widthMm": "",
|
||||
"labels.wrapText": "",
|
||||
"labels.xMm": "",
|
||||
"labels.yMm": "",
|
||||
"library.apiError": "",
|
||||
"library.collapseGroup": "",
|
||||
"library.emptyBody": "",
|
||||
"library.emptyFiltered": "",
|
||||
"library.emptyTitle": "",
|
||||
"library.expandGroup": "",
|
||||
"library.filterBy": "",
|
||||
"library.groupBy": "",
|
||||
"library.groupNone": "",
|
||||
"library.nUnused": "",
|
||||
"library.noLocation": "",
|
||||
"library.noValues": "",
|
||||
"library.openGroup": "",
|
||||
"library.openManufacturer": "",
|
||||
"library.section.extra": "",
|
||||
"library.section.filament": "",
|
||||
"library.section.spool": "",
|
||||
"library.section.vendor": "",
|
||||
"library.showMore": "",
|
||||
"library.sort.nozzle": "",
|
||||
"library.sortBy": "",
|
||||
"library.unassigned": "",
|
||||
"library.unitGroups": "",
|
||||
"library.unitSpools": "",
|
||||
"library.unused": "",
|
||||
"library.unusedGroup": "",
|
||||
"library.unusedGroupMixed": "",
|
||||
"library.unusedSub": "",
|
||||
"library.unusedSubMixed": "",
|
||||
"library.used": "",
|
||||
"library.usedAgo": "",
|
||||
"loading": "Betöltés",
|
||||
"locations.locations": "Helyek",
|
||||
"locations.newLocation": "Új hely",
|
||||
"locations.noLocation": "Nincs hely megadva",
|
||||
"locations.noLocationsHelp": "Ez az oldal lehetővé teszi, hogy rendszerezd a tekercseket helyek szerint, adj hozzá néhány tekercset a kezdéshez!",
|
||||
"nav.labels": "",
|
||||
"nav.library": "",
|
||||
"no": "Nem",
|
||||
"notifications.error": "Hiba (Hibakód: {{statusCode}})",
|
||||
"notifications.saveSuccessful": "Sikeres mentés!",
|
||||
"pagination.empty": "",
|
||||
"pagination.next": "",
|
||||
"pagination.pageSize": "",
|
||||
"pagination.perPage": "",
|
||||
"pagination.prev": "",
|
||||
"pagination.range": "",
|
||||
"printing.generic.columns": "Oszlopok",
|
||||
"printing.generic.customSize": "Egyéni",
|
||||
"printing.generic.description": "A kívánt nyomtatási elrendezés eléréséhez állítsd be az alábbi beállításokat. Tartsd észben, hogy a nyomtatók és az operációs rendszer saját margókat és méretezéseket alkalmazhatnak, ezért szükséged lehet néhány próbára és hibára, mielőtt minden tökéletes lesz. Teszteld egy darab normál papíron, mielőtt az aktuális címkéken nyomtatnád.",
|
||||
"printing.generic.dimensions": "Dimenziók",
|
||||
"printing.generic.gridTooWide": "",
|
||||
"printing.generic.helpMargin": "A margókat úgy kell beállítani, hogy illeszkedjenek a címképapírhoz és a nyomtatóhoz, azok megváltoztatása befolyásolja az egész rács méretét.",
|
||||
"printing.generic.helpPrinterMargin": "A biztonsági zónát úgy kell beállítani, hogy mekkora távolságban legyen a tárgyasztal szélétől, ahol a nyomtató tud nyomtatni. Ezeknek a beállításoknak a megváltoztatása nem befolyásolja az egész rácsot.",
|
||||
"printing.generic.horizontalSpacing": "Vízszintes távolság",
|
||||
"printing.generic.itemCopies": "Termék másolatok",
|
||||
"printing.generic.marginBottom": "Alsó margó",
|
||||
"printing.generic.marginLeft": "Bal margó",
|
||||
"printing.generic.marginRight": "Jobb margó",
|
||||
"printing.generic.marginTop": "Felső margó",
|
||||
"printing.generic.paperSize": "Papír méret",
|
||||
"printing.generic.printerMarginBottom": "Biztonságos zóna alja",
|
||||
"printing.generic.printerMarginLeft": "Biztonságos zóna balra",
|
||||
"printing.generic.printerMarginRight": "Biztonságos zóna jobbra",
|
||||
"printing.generic.printerMarginTop": "Biztonságos zóna felül",
|
||||
"printing.generic.saveAsImage": "Mentés Képként",
|
||||
"printing.generic.skipItems": "Elem átugrása",
|
||||
"printing.generic.verticalSpacing": "Függőleges térköz",
|
||||
"printing.qrcode.button": "Cimkék Nyomtatása",
|
||||
"printing.qrcode.customUrl.caveat": "",
|
||||
"printing.qrcode.customUrl.hint": "",
|
||||
"printing.qrcode.customUrl.label": "",
|
||||
"printing.qrcode.useHTTPUrl.label": "QR kód link",
|
||||
"printing.qrcode.useHTTPUrl.options.custom": "",
|
||||
"printing.qrcode.useHTTPUrl.options.default": "Alapbeállítás",
|
||||
"printing.qrcode.useHTTPUrl.options.url": "URL",
|
||||
"printing.qrcode.useHTTPUrl.preview": "Előnézet:",
|
||||
"printing.qrcode.useHTTPUrl.tooltip": "",
|
||||
"printing.spoolSelect.selectedTotal_one": "{{count}} tekercs kiválasztva",
|
||||
"printing.spoolSelect.selectedTotal_other": "{{count}} db tekercs kiválasztva",
|
||||
"scanner.description": "Olvass be egy Spoolman QR kódot a tekercsről szóló részletek megtekintéséhez.",
|
||||
"scanner.error.inUse": "",
|
||||
"scanner.error.insecureContext": "Az oldal kiszolgálása nem HTTPS-en keresztül történik.",
|
||||
"scanner.error.notAllowed": "Nem engedélyezte a kamerához való hozzáférést.",
|
||||
"scanner.error.notFound": "Nem található kamera.",
|
||||
"scanner.error.streamApiNotSupported": "A böngésző nem támogatja a MediaStream API-t.",
|
||||
"scanner.error.unknown": "Ismeretlen hiba történt. ({{error}})",
|
||||
"scanner.starting": "",
|
||||
"scanner.title": "QR kód beolvasása",
|
||||
"search.colorHint": "",
|
||||
"search.noResults": "",
|
||||
"search.searching": "",
|
||||
"search.section.filaments": "",
|
||||
"search.section.spools": "",
|
||||
"search.section.vendors": "",
|
||||
"search.threshold": "",
|
||||
"search.unknownFilament": "",
|
||||
"settings.appearance.tab": "",
|
||||
"settings.appearance.theme.dark": "",
|
||||
"settings.appearance.theme.desc": "",
|
||||
"settings.appearance.theme.label": "",
|
||||
"settings.appearance.theme.light": "",
|
||||
"settings.appearance.theme.system": "",
|
||||
"settings.extraFields.addChoice": "",
|
||||
"settings.extraFields.addChoicesFirst": "",
|
||||
"settings.extraFields.addEntityField": "",
|
||||
"settings.extraFields.booleanFalse": "Nem",
|
||||
"settings.extraFields.booleanTrue": "Igen",
|
||||
"settings.extraFields.deleteConfirm": "Töröli a következő mezőt: {{name}}?",
|
||||
"settings.extraFields.description.constraints": "Ha egy mezőt hozzáadtál, nem lehet megváltoztatni annak kulcsát vagy típusát, és a választási típusú mezők esetében nem lehet eltávolítani a választásokat vagy megváltoztatni a többválasztásos állapotot. Ha eltávolítasz egy mezőt, az összes entitásra vonatkozó adat törlődik.",
|
||||
"settings.extraFields.description.intro": "Itt hozzáadhatsz további egyedi mezőket az entitásokhoz.",
|
||||
"settings.extraFields.description.keyUsage": "A kulcs az, amit más programok olvasnak/írnak az adatokként, tehát ha az egyedi meződ egy harmadik féllel integrálódik, győződj meg róla, hogy helyesen van beállítva. Az alapértelmezett érték csak az új elemekre vonatkozik.",
|
||||
"settings.extraFields.description.tableViews": "Az extra mezőket nem lehet rendezni vagy szűrni a táblázatnézetekben.",
|
||||
"settings.extraFields.editorEdit": "",
|
||||
"settings.extraFields.editorNew": "",
|
||||
"settings.extraFields.errors.choiceNeeded": "",
|
||||
"settings.extraFields.errors.choicesRemoved": "",
|
||||
"settings.extraFields.errors.deleteFailed": "",
|
||||
"settings.extraFields.errors.keyFormat": "",
|
||||
"settings.extraFields.errors.nameRequired": "",
|
||||
"settings.extraFields.errors.saveFailed": "",
|
||||
"settings.extraFields.fieldType.boolean": "Logikai",
|
||||
"settings.extraFields.fieldType.choice": "Választás",
|
||||
"settings.extraFields.fieldType.datetime": "Dátum és idő",
|
||||
"settings.extraFields.fieldType.float": "Lebegőpontos szám",
|
||||
"settings.extraFields.fieldType.floatRange": "Lebegőpontos szám tartomány",
|
||||
"settings.extraFields.fieldType.integer": "Egész szám",
|
||||
"settings.extraFields.fieldType.integerRange": "Egész szám tartománya",
|
||||
"settings.extraFields.fieldType.text": "Szöveg",
|
||||
"settings.extraFields.max": "",
|
||||
"settings.extraFields.min": "",
|
||||
"settings.extraFields.multiSuffix": "",
|
||||
"settings.extraFields.multiple": "",
|
||||
"settings.extraFields.namePlaceholder": "",
|
||||
"settings.extraFields.nonUniqueKeyError": "A kulcsnak egyedinek kell lennie.",
|
||||
"settings.extraFields.none": "",
|
||||
"settings.extraFields.params.choices": "Választás",
|
||||
"settings.extraFields.params.defaultValue": "Alapértelmezet érték",
|
||||
"settings.extraFields.params.fieldType": "Típus",
|
||||
"settings.extraFields.params.key": "Kulcs",
|
||||
"settings.extraFields.params.name": "Név",
|
||||
"settings.extraFields.params.order": "Rendezés",
|
||||
"settings.extraFields.params.unit": "Egység",
|
||||
"settings.extraFields.saveField": "",
|
||||
"settings.extraFields.tab": "Extra mezők",
|
||||
"settings.general.baseUrl.label": "Alap URL",
|
||||
"settings.general.baseUrl.tooltip": "",
|
||||
"settings.general.currency.desc": "",
|
||||
"settings.general.currency.label": "Pénznem",
|
||||
"settings.general.roundPrices.label": "Árak kerekítése",
|
||||
"settings.general.roundPrices.tooltip": "Az árak legközelebbi egész számra való kerekítése.",
|
||||
"settings.general.tab": "Általános",
|
||||
"settings.header": "Beállítások",
|
||||
"settings.language.desc": "",
|
||||
"settings.language.label": "",
|
||||
"settings.library.lowThreshold.desc": "",
|
||||
"settings.library.lowThreshold.label": "",
|
||||
"settings.library.tab": "",
|
||||
"spool.fields.archived": "Arhivált",
|
||||
"spool.fields.comment": "Megjegyzés",
|
||||
"spool.fields.filament": "Szál",
|
||||
"spool.fields.firstUsed": "Először használt",
|
||||
"spool.fields.id": "ID",
|
||||
"spool.fields.lastUsed": "Utoljára használt",
|
||||
"spool.fields.location": "Hely",
|
||||
"spool.fields.lotNr": "Tételszám",
|
||||
"spool.fields.material": "Anyag",
|
||||
"spool.fields.measuredWeight": "Mért súly",
|
||||
"spool.fields.price": "Ár",
|
||||
"spool.fields.registered": "Nyilvántartott",
|
||||
"spool.fields.remainingWeight": "Maradék súly",
|
||||
"spool.fields.usedWeight": "Felhasznált súly",
|
||||
"spool.fieldsHelp.location": "Hol található a tekercs, ha több helyen tárolod a tekercseidet.",
|
||||
"spool.fieldsHelp.lotNr": "Gyártói tételszám. A szín egységesség ellenőrzésére használható, ha több tekercset használsz egy nyomtatáshoz.",
|
||||
"spool.fieldsHelp.measuredWeight": "Mennyit nyom a filament és a tekercs együtt.",
|
||||
"spool.fieldsHelp.price": "Egy teljes tekercs ára. Ha nincs beállítva, a rendszer az filament árát veszi fel helyette.",
|
||||
"spool.fieldsHelp.remainingWeight": "Mennyi filament van még a tekercsen. Egy új tekercsnél ez a tekercs súlyával kell megegyeznie.",
|
||||
"spool.fieldsHelp.usedWeight": "Mennyi filament használódott el a tekercsről. Egy új tekercsnek 0 gramm használt mennyiséggel kell rendelkeznie.",
|
||||
"spool.form.measurementType.length": "Hossz",
|
||||
"spool.form.measurementType.weight": "Súly",
|
||||
"spool.spool": "Tekercsek",
|
||||
"topbar.addSpools": "",
|
||||
"topbar.searchPlaceholder": "",
|
||||
"unknown": "Ismeretlen",
|
||||
"validation.hexDigits": "",
|
||||
"validation.maxChars": "",
|
||||
"validation.mustBeGt": "",
|
||||
"validation.mustBeMax": "",
|
||||
"validation.mustBeMin": "",
|
||||
"validation.mustBeNumber": "",
|
||||
"validation.required": "",
|
||||
"vendor.fields.comment": "Megjegyzés",
|
||||
"vendor.fields.emptySpoolWeight": "Üres tekercs súlya",
|
||||
"vendor.fields.externalId": "Külső ID",
|
||||
"vendor.fields.id": "ID",
|
||||
"vendor.fields.name": "Név",
|
||||
"vendor.fields.registered": "Nyilvántartott",
|
||||
"vendor.fieldsHelp.emptySpoolWeight": "Ettől a gyártótól származó üres tekercs súlya.",
|
||||
"yes": "Igen"
|
||||
}
|
||||
@@ -0,0 +1,463 @@
|
||||
{
|
||||
"add.addAndNew": "",
|
||||
"add.adding": "",
|
||||
"add.advanced": "",
|
||||
"add.advancedNote": "",
|
||||
"add.change": "",
|
||||
"add.count": "",
|
||||
"add.createNew": "",
|
||||
"add.createNewSub": "",
|
||||
"add.dbUnavailable": "",
|
||||
"add.duplicate": "",
|
||||
"add.duplicateNote": "",
|
||||
"add.duplicateRename": "",
|
||||
"add.duplicateTitle": "",
|
||||
"add.filamentNamePlaceholder": "",
|
||||
"add.fill.full": "",
|
||||
"add.fillLevel": "",
|
||||
"add.importNote": "",
|
||||
"add.inCatalog": "",
|
||||
"add.locationHint": "",
|
||||
"add.locationPlaceholder": "",
|
||||
"add.manufacturerPlaceholder": "",
|
||||
"add.nameHint": "",
|
||||
"add.newFilament": "",
|
||||
"add.newFilamentTitle": "",
|
||||
"add.noCatalog": "",
|
||||
"add.noManufacturer": "",
|
||||
"add.pickColor": "",
|
||||
"add.searchPlaceholder": "",
|
||||
"add.searching": "",
|
||||
"add.spoolWeightPreset.cardboard": "",
|
||||
"add.spoolWeightPreset.plastic": "",
|
||||
"add.spoolWeightPresetsLead": "",
|
||||
"add.step2": "",
|
||||
"add.typeToSearchAll": "",
|
||||
"add.typeToSearchMatches": "",
|
||||
"add.useExisting": "",
|
||||
"add.vendorHint.existing": "",
|
||||
"add.vendorHint.new": "",
|
||||
"add.vendorHint.optional": "",
|
||||
"add.yourCatalog": "",
|
||||
"buttons.archive": "Archivia",
|
||||
"buttons.cancel": "Cancella",
|
||||
"buttons.clear": "Pulisci",
|
||||
"buttons.close": "",
|
||||
"buttons.delete": "Elimina",
|
||||
"buttons.edit": "Modifica",
|
||||
"buttons.filter": "Filtro",
|
||||
"buttons.save": "Salva",
|
||||
"buttons.showArchived": "Mostra Archiviati",
|
||||
"buttons.unArchive": "Ripristina",
|
||||
"common.decrement": "",
|
||||
"common.increment": "",
|
||||
"common.remove": "",
|
||||
"common.search": "",
|
||||
"dashboard.addFieldHint": "",
|
||||
"dashboard.dashboard": "",
|
||||
"dashboard.deleteGroup": "",
|
||||
"dashboard.dragHint": "",
|
||||
"dashboard.dropHere": "",
|
||||
"dashboard.emptyHelp": "",
|
||||
"dashboard.errorEmptyName": "",
|
||||
"dashboard.errorExists": "",
|
||||
"dashboard.errorRename": "",
|
||||
"dashboard.lastUsed": "",
|
||||
"dashboard.newGroup": "",
|
||||
"dashboard.newGroupName": "",
|
||||
"dashboard.reorderGroup": "",
|
||||
"dashboard.unassigned": "",
|
||||
"datetime.done": "",
|
||||
"datetime.hour": "",
|
||||
"datetime.minute": "",
|
||||
"datetime.nextMonth": "",
|
||||
"datetime.now": "",
|
||||
"datetime.pick": "",
|
||||
"datetime.prevMonth": "",
|
||||
"datetime.time": "",
|
||||
"documentTitle.dashboard.list": "",
|
||||
"documentTitle.labels.list": "",
|
||||
"documentTitle.library.list": "",
|
||||
"documentTitle.locations.list": "Posizione | Spoolman",
|
||||
"documentTitle.settings.list": "",
|
||||
"filament.fields.addColor": "",
|
||||
"filament.fields.articleNumber": "Numero Articolo",
|
||||
"filament.fields.coaxial": "Coestruso",
|
||||
"filament.fields.colorHex": "Colore",
|
||||
"filament.fields.colorType": "",
|
||||
"filament.fields.comment": "Note",
|
||||
"filament.fields.density": "Densità",
|
||||
"filament.fields.diameter": "Diametro",
|
||||
"filament.fields.externalId": "ID esterno",
|
||||
"filament.fields.id": "ID",
|
||||
"filament.fields.longitudinal": "Longitudinale",
|
||||
"filament.fields.material": "Materiale",
|
||||
"filament.fields.multiColor": "Multiplo",
|
||||
"filament.fields.name": "Nome",
|
||||
"filament.fields.price": "Prezzo",
|
||||
"filament.fields.registered": "Registrato",
|
||||
"filament.fields.removeColor": "",
|
||||
"filament.fields.settingsBedTemp": "Temperatura Piatto",
|
||||
"filament.fields.settingsExtruderTemp": "Temperatura Estrusore",
|
||||
"filament.fields.singleColor": "Unico",
|
||||
"filament.fields.spoolWeight": "Peso Bobina",
|
||||
"filament.fields.vendor": "Produttore",
|
||||
"filament.fields.weight": "Peso",
|
||||
"filament.fieldsHelp.articleNumber": "Es.: EAN, UPC, etc.",
|
||||
"filament.fieldsHelp.multiColorDirection": "I filamenti possono avere più colori in due modi: attraverso la coestrusione, come i filamenti a due colori con più colori omogenei, o attraverso cambiamenti di colore longitudinali, come i filamenti a gradiente che cambiano colore lungo la bobina.",
|
||||
"filament.fieldsHelp.spoolWeight": "Il peso di una bobina vuota. Utilizzato per determinare il peso misurato di una bobina.",
|
||||
"filament.fieldsHelp.weight": "Il peso del filamento di una bobina piena (peso netto). Questo non dovrebbe includere il peso della bobina stessa, ma solo del filamento. È quello che solitamente c'è scritto sulla confezione.",
|
||||
"filament.filament": "Filamenti",
|
||||
"footer.documentation": "",
|
||||
"footer.reportIssue": "",
|
||||
"help.help": "Aiuto",
|
||||
"inspector.addSpoolsOfThis": "",
|
||||
"inspector.adjustFailed": "",
|
||||
"inspector.adjustHelp": "",
|
||||
"inspector.adjustWeight": "",
|
||||
"inspector.apply": "",
|
||||
"inspector.applying": "",
|
||||
"inspector.colorHex": "",
|
||||
"inspector.consumeAmount": "",
|
||||
"inspector.delete.deleting": "",
|
||||
"inspector.delete.errorGone": "",
|
||||
"inspector.delete.errorSpoolsExist": "",
|
||||
"inspector.delete.errorUnknown": "",
|
||||
"inspector.delete.filament": "",
|
||||
"inspector.delete.filamentBlockedHint": "",
|
||||
"inspector.delete.filamentBlockedTitle": "",
|
||||
"inspector.delete.filamentBody": "",
|
||||
"inspector.delete.filamentDone": "",
|
||||
"inspector.delete.filamentTitle": "",
|
||||
"inspector.delete.spool": "",
|
||||
"inspector.delete.spoolBody": "",
|
||||
"inspector.delete.spoolDone": "",
|
||||
"inspector.delete.spoolRemaining": "",
|
||||
"inspector.delete.spoolTitle": "",
|
||||
"inspector.delete.vendor": "",
|
||||
"inspector.delete.vendorBody": "",
|
||||
"inspector.delete.vendorDone": "",
|
||||
"inspector.delete.vendorTitle": "",
|
||||
"inspector.duplicateFilament": "",
|
||||
"inspector.empty": "",
|
||||
"inspector.enterValidLength": "",
|
||||
"inspector.enterValidWeight": "",
|
||||
"inspector.loading": "",
|
||||
"inspector.manageExtraFields": "",
|
||||
"inspector.measuredHelp": "",
|
||||
"inspector.multi": "",
|
||||
"inspector.newGross": "",
|
||||
"inspector.noExtraFields": "",
|
||||
"inspector.notFound": "",
|
||||
"inspector.ofRemaining": "",
|
||||
"inspector.openFilament": "",
|
||||
"inspector.openLink": "",
|
||||
"inspector.openManufacturer": "",
|
||||
"inspector.specs": "",
|
||||
"inspector.spoolsCount": "",
|
||||
"inspector.spoolsTotalRemaining": "",
|
||||
"inspector.used": "",
|
||||
"kofi": "Donazione su Ko-fi",
|
||||
"labels.addHead": "",
|
||||
"labels.addQr": "",
|
||||
"labels.addRect": "",
|
||||
"labels.addSwatch": "",
|
||||
"labels.addText": "",
|
||||
"labels.align": "",
|
||||
"labels.alignCenter": "",
|
||||
"labels.alignLeft": "",
|
||||
"labels.alignRight": "",
|
||||
"labels.blank": "",
|
||||
"labels.bold": "",
|
||||
"labels.canvasHint": "",
|
||||
"labels.centerLogo": "",
|
||||
"labels.chooseField": "",
|
||||
"labels.clearFill": "",
|
||||
"labels.copies": "",
|
||||
"labels.cornerRadiusMm": "",
|
||||
"labels.createFirst": "",
|
||||
"labels.cutGuides": "",
|
||||
"labels.deleteConfirm": "",
|
||||
"labels.deleteElement": "",
|
||||
"labels.designName": "",
|
||||
"labels.designerDesc": "",
|
||||
"labels.designerTitle": "",
|
||||
"labels.dpi": "",
|
||||
"labels.dpiHint": "",
|
||||
"labels.duplicate": "",
|
||||
"labels.fields.bedTemp": "",
|
||||
"labels.fields.diameterMm": "",
|
||||
"labels.fields.groupVendor": "",
|
||||
"labels.fields.initialG": "",
|
||||
"labels.fields.netWeightG": "",
|
||||
"labels.fields.remainingG": "",
|
||||
"labels.fill": "",
|
||||
"labels.fitWidth": "",
|
||||
"labels.fitWidthHint": "",
|
||||
"labels.fontMm": "",
|
||||
"labels.gridInfo": "",
|
||||
"labels.hMm": "",
|
||||
"labels.heightMm": "",
|
||||
"labels.hintNowrap": "",
|
||||
"labels.hintSwatch": "",
|
||||
"labels.hintWrap": "",
|
||||
"labels.imageDesc": "",
|
||||
"labels.imageZipNote": "",
|
||||
"labels.insertField": "",
|
||||
"labels.kind.qr": "",
|
||||
"labels.kind.rect": "",
|
||||
"labels.kind.swatch": "",
|
||||
"labels.kind.text": "",
|
||||
"labels.labelSize": "",
|
||||
"labels.labelType": "",
|
||||
"labels.layout": "",
|
||||
"labels.modeImage": "",
|
||||
"labels.modeLabel": "",
|
||||
"labels.modeSheet": "",
|
||||
"labels.new": "",
|
||||
"labels.newText": "",
|
||||
"labels.noDesignsOption": "",
|
||||
"labels.noFilaments": "",
|
||||
"labels.noSpools": "",
|
||||
"labels.onePerLabel": "",
|
||||
"labels.preparing": "",
|
||||
"labels.preview": "",
|
||||
"labels.previewWith": "",
|
||||
"labels.radiusMm": "",
|
||||
"labels.sampleData": "",
|
||||
"labels.saved": "",
|
||||
"labels.saving": "",
|
||||
"labels.searchFilaments": "",
|
||||
"labels.searchSpools": "",
|
||||
"labels.selectAllShort": "",
|
||||
"labels.selectAtLeastOne": "",
|
||||
"labels.selectAtLeastOneFilament": "",
|
||||
"labels.selectDesign": "",
|
||||
"labels.selectElement": "",
|
||||
"labels.selectNoneShort": "",
|
||||
"labels.selectRecentHint": "",
|
||||
"labels.selectRecentShort": "",
|
||||
"labels.showingFilament": "",
|
||||
"labels.showingReal": "",
|
||||
"labels.showingSpool": "",
|
||||
"labels.showingTags": "",
|
||||
"labels.sizeMm": "",
|
||||
"labels.skipHint": "",
|
||||
"labels.sortHint": "",
|
||||
"labels.sortId": "",
|
||||
"labels.sortNewest": "",
|
||||
"labels.stroke": "",
|
||||
"labels.strokeMm": "",
|
||||
"labels.tabDesign": "",
|
||||
"labels.tabPrint": "",
|
||||
"labels.textTemplate": "",
|
||||
"labels.typeFilament": "",
|
||||
"labels.typeHint": "",
|
||||
"labels.typeSpool": "",
|
||||
"labels.unknownFilament": "",
|
||||
"labels.wMm": "",
|
||||
"labels.widthMm": "",
|
||||
"labels.wrapText": "",
|
||||
"labels.xMm": "",
|
||||
"labels.yMm": "",
|
||||
"library.apiError": "",
|
||||
"library.collapseGroup": "",
|
||||
"library.emptyBody": "",
|
||||
"library.emptyFiltered": "",
|
||||
"library.emptyTitle": "",
|
||||
"library.expandGroup": "",
|
||||
"library.filterBy": "",
|
||||
"library.groupBy": "",
|
||||
"library.groupNone": "",
|
||||
"library.nUnused": "",
|
||||
"library.noLocation": "",
|
||||
"library.noValues": "",
|
||||
"library.openGroup": "",
|
||||
"library.openManufacturer": "",
|
||||
"library.section.extra": "",
|
||||
"library.section.filament": "",
|
||||
"library.section.spool": "",
|
||||
"library.section.vendor": "",
|
||||
"library.showMore": "",
|
||||
"library.sort.nozzle": "",
|
||||
"library.sortBy": "",
|
||||
"library.unassigned": "",
|
||||
"library.unitGroups": "",
|
||||
"library.unitSpools": "",
|
||||
"library.unused": "",
|
||||
"library.unusedGroup": "",
|
||||
"library.unusedGroupMixed": "",
|
||||
"library.unusedSub": "",
|
||||
"library.unusedSubMixed": "",
|
||||
"library.used": "",
|
||||
"library.usedAgo": "",
|
||||
"loading": "Caricamento",
|
||||
"locations.locations": "Posizioni",
|
||||
"locations.newLocation": "Nuova Posizione",
|
||||
"locations.noLocation": "Nessuna Posizione",
|
||||
"locations.noLocationsHelp": "Questa pagina ti consente di organizzare le bobine in base alla posizione. Aggiungi alcune bobine per iniziare!",
|
||||
"nav.labels": "",
|
||||
"nav.library": "",
|
||||
"no": "No",
|
||||
"notifications.error": "Errore (status code: {{statusCode}})",
|
||||
"notifications.saveSuccessful": "Salvataggio completato!",
|
||||
"pagination.empty": "",
|
||||
"pagination.next": "",
|
||||
"pagination.pageSize": "",
|
||||
"pagination.perPage": "",
|
||||
"pagination.prev": "",
|
||||
"pagination.range": "",
|
||||
"printing.generic.columns": "Colonne",
|
||||
"printing.generic.customSize": "Personalizzato",
|
||||
"printing.generic.description": "Sintonizza le impostazioni di seguito per ottenere il layout di stampa desiderato. Tieni presente che le stampanti e il tuo sistema operativo potrebbero applicare i propri margini e ridimensionamenti, quindi potrebbe essere necessario eseguire alcuni tentativi ed errori prima che tutto sia corretto. Provalo su un pezzo di carta normale prima di stampare sulle etichette effettive.",
|
||||
"printing.generic.dimensions": "Dimensioni",
|
||||
"printing.generic.gridTooWide": "",
|
||||
"printing.generic.helpMargin": "I margini devono essere configurati affinchè corrispondano alla carta per etichette e alla stampante, la modifica di questi influirà sulla dimensione dell'intera griglia.",
|
||||
"printing.generic.helpPrinterMargin": "La Safe-Zone deve essere impostata in prossimità del bordo stampabile della carta; la modifica di questi valori non influirà sull'intera griglia.",
|
||||
"printing.generic.horizontalSpacing": "Spaziatura Orizzontale",
|
||||
"printing.generic.itemCopies": "Copie dell'elemento",
|
||||
"printing.generic.marginBottom": "Margine Inferiore",
|
||||
"printing.generic.marginLeft": "Margine Sinistro",
|
||||
"printing.generic.marginRight": "Margine Destro",
|
||||
"printing.generic.marginTop": "Margine Superiore",
|
||||
"printing.generic.paperSize": "Dimensione Carta",
|
||||
"printing.generic.printerMarginBottom": "Safe-Zone Inferiore",
|
||||
"printing.generic.printerMarginLeft": "Safe-Zone Sinistra",
|
||||
"printing.generic.printerMarginRight": "Safe-Zone Destra",
|
||||
"printing.generic.printerMarginTop": "Safe-Zone Superiore",
|
||||
"printing.generic.saveAsImage": "Salva come immagine",
|
||||
"printing.generic.skipItems": "Salta Elementi",
|
||||
"printing.generic.verticalSpacing": "Spaziatura Verticale",
|
||||
"printing.qrcode.button": "Stampa etichette",
|
||||
"printing.qrcode.customUrl.caveat": "",
|
||||
"printing.qrcode.customUrl.hint": "",
|
||||
"printing.qrcode.customUrl.label": "",
|
||||
"printing.qrcode.useHTTPUrl.label": "Link codice QR",
|
||||
"printing.qrcode.useHTTPUrl.options.custom": "",
|
||||
"printing.qrcode.useHTTPUrl.options.default": "Preimpostato",
|
||||
"printing.qrcode.useHTTPUrl.options.url": "URL",
|
||||
"printing.qrcode.useHTTPUrl.preview": "Anteprima:",
|
||||
"printing.qrcode.useHTTPUrl.tooltip": "Verrà utilizzato un link che funzionerà solo se scansionato dalla funzione di scansione di Spoolman (impostazione predefinita). L'URL utilizza l'URL di base specificato nelle impostazioni o l'URL della pagina corrente, se non impostato.",
|
||||
"printing.spoolSelect.selectedTotal_many": "{{count}} bobine selezionate",
|
||||
"printing.spoolSelect.selectedTotal_one": "{{count}} bobina selezionata",
|
||||
"printing.spoolSelect.selectedTotal_other": "{{count}} bobine selezionate",
|
||||
"scanner.description": "Scansiona uno Spoolman QR-Code per visualizzare i dettagli della bobina.",
|
||||
"scanner.error.inUse": "",
|
||||
"scanner.error.insecureContext": "La pagina non è disponibile tramite HTTPS.",
|
||||
"scanner.error.notAllowed": "Non hai accesso alla fotocamera.",
|
||||
"scanner.error.notFound": "Nessuna fotocamera rilevata.",
|
||||
"scanner.error.streamApiNotSupported": "il browser non supporta le API MediaStream.",
|
||||
"scanner.error.unknown": "Si è verificato un errore. ({{error}})",
|
||||
"scanner.starting": "",
|
||||
"scanner.title": "QR-Code Scanner",
|
||||
"search.colorHint": "",
|
||||
"search.noResults": "",
|
||||
"search.searching": "",
|
||||
"search.section.filaments": "",
|
||||
"search.section.spools": "",
|
||||
"search.section.vendors": "",
|
||||
"search.threshold": "",
|
||||
"search.unknownFilament": "",
|
||||
"settings.appearance.tab": "",
|
||||
"settings.appearance.theme.dark": "",
|
||||
"settings.appearance.theme.desc": "",
|
||||
"settings.appearance.theme.label": "",
|
||||
"settings.appearance.theme.light": "",
|
||||
"settings.appearance.theme.system": "",
|
||||
"settings.extraFields.addChoice": "",
|
||||
"settings.extraFields.addChoicesFirst": "",
|
||||
"settings.extraFields.addEntityField": "",
|
||||
"settings.extraFields.booleanFalse": "No",
|
||||
"settings.extraFields.booleanTrue": "Si",
|
||||
"settings.extraFields.deleteConfirm": "Cancellare il campo {{name}}?",
|
||||
"settings.extraFields.description.constraints": "Una volta aggiunto un campo, non è possibile modificarne la chiave o il tipo, e per i campi di tipo scelta non è possibile rimuovere le scelte o modificare lo stato di scelta multipla. Se si rimuove un campo, tutti i dati associati saranno cancellati.",
|
||||
"settings.extraFields.description.intro": "Qui è possibile aggiungere campi personalizzati.",
|
||||
"settings.extraFields.description.keyUsage": "La chiave è il modo in cui gli altri programmi leggono/scrivono i dati, quindi se il campo personalizzato deve integrarsi con un programma di terze parti, assicurarsi di impostarla correttamente. Il valore predefinito viene applicato solo ai nuovi elementi.",
|
||||
"settings.extraFields.description.tableViews": "I campi extra non possono essere ordinati o filtrati nelle viste tabella.",
|
||||
"settings.extraFields.editorEdit": "",
|
||||
"settings.extraFields.editorNew": "",
|
||||
"settings.extraFields.errors.choiceNeeded": "",
|
||||
"settings.extraFields.errors.choicesRemoved": "",
|
||||
"settings.extraFields.errors.deleteFailed": "",
|
||||
"settings.extraFields.errors.keyFormat": "",
|
||||
"settings.extraFields.errors.nameRequired": "",
|
||||
"settings.extraFields.errors.saveFailed": "",
|
||||
"settings.extraFields.fieldType.boolean": "Booleano",
|
||||
"settings.extraFields.fieldType.choice": "Scelta",
|
||||
"settings.extraFields.fieldType.datetime": "Data e ora",
|
||||
"settings.extraFields.fieldType.float": "Decimali",
|
||||
"settings.extraFields.fieldType.floatRange": "Intervallo decimali",
|
||||
"settings.extraFields.fieldType.integer": "\"Intero\" per tipo campo extra, numero intero senza decimali",
|
||||
"settings.extraFields.fieldType.integerRange": "Intervallo di numeri interi",
|
||||
"settings.extraFields.fieldType.text": "\"Testo\" per tipo campo extra",
|
||||
"settings.extraFields.max": "",
|
||||
"settings.extraFields.min": "",
|
||||
"settings.extraFields.multiSuffix": "",
|
||||
"settings.extraFields.multiple": "",
|
||||
"settings.extraFields.namePlaceholder": "",
|
||||
"settings.extraFields.nonUniqueKeyError": "La chiave deve essere univoca.",
|
||||
"settings.extraFields.none": "",
|
||||
"settings.extraFields.params.choices": "Scelte",
|
||||
"settings.extraFields.params.defaultValue": "Valore di Default",
|
||||
"settings.extraFields.params.fieldType": "Tipo",
|
||||
"settings.extraFields.params.key": "Chiave",
|
||||
"settings.extraFields.params.name": "Nome",
|
||||
"settings.extraFields.params.order": "Ordine",
|
||||
"settings.extraFields.params.unit": "Unità",
|
||||
"settings.extraFields.saveField": "",
|
||||
"settings.extraFields.tab": "Campi extra",
|
||||
"settings.general.baseUrl.label": "URL di base",
|
||||
"settings.general.baseUrl.tooltip": "L'URL di base da utilizzare quando si generano funzioni come i codici QR.",
|
||||
"settings.general.currency.desc": "",
|
||||
"settings.general.currency.label": "Valuta",
|
||||
"settings.general.roundPrices.label": "Prezzi arrotondati",
|
||||
"settings.general.roundPrices.tooltip": "Prezzi arrotondati al numero intero più vicino.",
|
||||
"settings.general.tab": "Generale",
|
||||
"settings.header": "Configurazione",
|
||||
"settings.language.desc": "",
|
||||
"settings.language.label": "",
|
||||
"settings.library.lowThreshold.desc": "",
|
||||
"settings.library.lowThreshold.label": "",
|
||||
"settings.library.tab": "",
|
||||
"spool.fields.archived": "Archiviati",
|
||||
"spool.fields.comment": "Note",
|
||||
"spool.fields.filament": "Filamento",
|
||||
"spool.fields.firstUsed": "Primo Utilizzo",
|
||||
"spool.fields.id": "ID",
|
||||
"spool.fields.lastUsed": "Ultimo Utilizzo",
|
||||
"spool.fields.location": "Posizione",
|
||||
"spool.fields.lotNr": "Lotto Nr",
|
||||
"spool.fields.material": "Materiale",
|
||||
"spool.fields.measuredWeight": "Peso Misurato",
|
||||
"spool.fields.price": "Prezzo",
|
||||
"spool.fields.registered": "Registrato",
|
||||
"spool.fields.remainingWeight": "Peso Rimanente",
|
||||
"spool.fields.usedWeight": "Peso Utilizzato",
|
||||
"spool.fieldsHelp.location": "Dove si trova la bobina se disponi di più posizioni in cui conservare le bobine.",
|
||||
"spool.fieldsHelp.lotNr": "Numero di lotto del produttore. Può essere utilizzato per garantire che la stampa abbia colori uniformi se vengono utilizzate più bobine.",
|
||||
"spool.fieldsHelp.measuredWeight": "Quanto pesano il filamento e la bobina.",
|
||||
"spool.fieldsHelp.price": "Prezzo di una bobina completa. Se non viene impostato, verrà utilizzato il prezzo del filamento.",
|
||||
"spool.fieldsHelp.remainingWeight": "Quanto filamento è rimasto sulla bobina. Per una nuova bobina questo dovrebbe corrispondere al peso della bobina.",
|
||||
"spool.fieldsHelp.usedWeight": "Quanto filamento è stato utilizzato dalla bobina. Una nuova bobina dovrebbe avere 0 gr utilizzati.",
|
||||
"spool.form.measurementType.length": "Lunghezza",
|
||||
"spool.form.measurementType.weight": "Peso",
|
||||
"spool.spool": "Bobine",
|
||||
"topbar.addSpools": "",
|
||||
"topbar.searchPlaceholder": "",
|
||||
"unknown": "Sconosciuto",
|
||||
"validation.hexDigits": "",
|
||||
"validation.maxChars": "",
|
||||
"validation.mustBeGt": "",
|
||||
"validation.mustBeMax": "",
|
||||
"validation.mustBeMin": "",
|
||||
"validation.mustBeNumber": "",
|
||||
"validation.required": "",
|
||||
"vendor.fields.comment": "Note",
|
||||
"vendor.fields.emptySpoolWeight": "Peso a vuoto della bobina/tara",
|
||||
"vendor.fields.externalId": "ID Esterno",
|
||||
"vendor.fields.id": "ID",
|
||||
"vendor.fields.name": "Nome",
|
||||
"vendor.fields.registered": "Registrato",
|
||||
"vendor.fieldsHelp.emptySpoolWeight": "Il peso di una bobina vuota di questo produttore.",
|
||||
"yes": "Si"
|
||||
}
|
||||
@@ -0,0 +1,470 @@
|
||||
{
|
||||
"add.addAndNew": "",
|
||||
"add.addN_other": "",
|
||||
"add.adding": "",
|
||||
"add.advanced": "",
|
||||
"add.advancedNote": "",
|
||||
"add.change": "",
|
||||
"add.count": "",
|
||||
"add.createNew": "",
|
||||
"add.createNewSub": "",
|
||||
"add.dbUnavailable": "",
|
||||
"add.duplicate": "",
|
||||
"add.duplicateNote": "",
|
||||
"add.duplicateRename": "",
|
||||
"add.duplicateTitle": "",
|
||||
"add.filamentNamePlaceholder": "",
|
||||
"add.fill.full": "",
|
||||
"add.fillLevel": "",
|
||||
"add.importNote": "",
|
||||
"add.inCatalog": "",
|
||||
"add.locationHint": "",
|
||||
"add.locationPlaceholder": "",
|
||||
"add.manufacturerPlaceholder": "",
|
||||
"add.nameHint": "",
|
||||
"add.newFilament": "",
|
||||
"add.newFilamentTitle": "",
|
||||
"add.noCatalog": "",
|
||||
"add.noManufacturer": "",
|
||||
"add.pickColor": "",
|
||||
"add.searchPlaceholder": "",
|
||||
"add.searching": "",
|
||||
"add.spoolWeightPreset.cardboard": "",
|
||||
"add.spoolWeightPreset.plastic": "",
|
||||
"add.spoolWeightPresetsLead": "",
|
||||
"add.step2": "",
|
||||
"add.summary_other": "",
|
||||
"add.typeToSearchAll": "",
|
||||
"add.typeToSearchMatches": "",
|
||||
"add.useExisting": "",
|
||||
"add.vendorHint.existing": "",
|
||||
"add.vendorHint.new": "",
|
||||
"add.vendorHint.optional": "",
|
||||
"add.yourCatalog": "",
|
||||
"buttons.archive": "アーカイブ",
|
||||
"buttons.cancel": "キャンセル",
|
||||
"buttons.clear": "クリア",
|
||||
"buttons.close": "",
|
||||
"buttons.delete": "削除",
|
||||
"buttons.edit": "編集",
|
||||
"buttons.filter": "フィルター",
|
||||
"buttons.save": "保存",
|
||||
"buttons.showArchived": "アーカイブを表示",
|
||||
"buttons.unArchive": "非アーカイブ",
|
||||
"common.decrement": "",
|
||||
"common.increment": "",
|
||||
"common.remove": "",
|
||||
"common.search": "",
|
||||
"dashboard.addFieldHint": "",
|
||||
"dashboard.dashboard": "",
|
||||
"dashboard.deleteGroup": "",
|
||||
"dashboard.dragHint": "",
|
||||
"dashboard.dropHere": "",
|
||||
"dashboard.emptyHelp": "",
|
||||
"dashboard.errorEmptyName": "",
|
||||
"dashboard.errorExists": "",
|
||||
"dashboard.errorRename": "",
|
||||
"dashboard.lastUsed": "",
|
||||
"dashboard.newGroup": "",
|
||||
"dashboard.newGroupName": "",
|
||||
"dashboard.reorderGroup": "",
|
||||
"dashboard.spoolCount_other": "",
|
||||
"dashboard.unassigned": "",
|
||||
"datetime.done": "",
|
||||
"datetime.hour": "",
|
||||
"datetime.minute": "",
|
||||
"datetime.nextMonth": "",
|
||||
"datetime.now": "",
|
||||
"datetime.pick": "",
|
||||
"datetime.prevMonth": "",
|
||||
"datetime.time": "",
|
||||
"documentTitle.dashboard.list": "",
|
||||
"documentTitle.labels.list": "",
|
||||
"documentTitle.library.list": "",
|
||||
"documentTitle.locations.list": "場所 | Spoolman",
|
||||
"documentTitle.settings.list": "",
|
||||
"filament.fields.addColor": "",
|
||||
"filament.fields.articleNumber": "製品番号",
|
||||
"filament.fields.coaxial": "断面",
|
||||
"filament.fields.colorHex": "色",
|
||||
"filament.fields.colorType": "",
|
||||
"filament.fields.comment": "コメント",
|
||||
"filament.fields.density": "密度",
|
||||
"filament.fields.diameter": "直径",
|
||||
"filament.fields.externalId": "外部ID",
|
||||
"filament.fields.id": "ID",
|
||||
"filament.fields.longitudinal": "縦方向",
|
||||
"filament.fields.material": "マテリアル",
|
||||
"filament.fields.multiColor": "複数色",
|
||||
"filament.fields.name": "名称",
|
||||
"filament.fields.price": "価格",
|
||||
"filament.fields.registered": "登録",
|
||||
"filament.fields.removeColor": "",
|
||||
"filament.fields.settingsBedTemp": "ベッド温度",
|
||||
"filament.fields.settingsExtruderTemp": "エクストルーダー温度",
|
||||
"filament.fields.singleColor": "単色",
|
||||
"filament.fields.spoolWeight": "スプールの重さ",
|
||||
"filament.fields.vendor": "製造者",
|
||||
"filament.fields.weight": "重さ",
|
||||
"filament.fieldsHelp.articleNumber": "例: EAN, UPC, etc.",
|
||||
"filament.fieldsHelp.multiColorDirection": "フィラメントは2つの方法で複数の色を持つことができます。断面: 押出し時に円の断面に複数色を持つ二色フィラメントのような形態です。縦方向: 長手方向の色変化によるもので、スプールに沿って色が変化するグラデーションフィラメントのような形態です。",
|
||||
"filament.fieldsHelp.spoolWeight": "空のスプールの重量。スプールの測定重量を決定するために使用されます。",
|
||||
"filament.fieldsHelp.weight": "フィラメントの正味重量(フルスプール時)。スプール自体の重量は含まず、フィラメントのみの重量です。通常、パッケージに記載されている重量です。",
|
||||
"filament.filament": "フィラメント",
|
||||
"footer.documentation": "",
|
||||
"footer.reportIssue": "",
|
||||
"help.help": "ヘルプ",
|
||||
"inspector.addSpoolsOfThis": "",
|
||||
"inspector.adjustFailed": "",
|
||||
"inspector.adjustHelp": "",
|
||||
"inspector.adjustWeight": "",
|
||||
"inspector.apply": "",
|
||||
"inspector.applying": "",
|
||||
"inspector.colorHex": "",
|
||||
"inspector.consumeAmount": "",
|
||||
"inspector.delete.deleting": "",
|
||||
"inspector.delete.errorGone": "",
|
||||
"inspector.delete.errorSpoolsExist": "",
|
||||
"inspector.delete.errorUnknown": "",
|
||||
"inspector.delete.filament": "",
|
||||
"inspector.delete.filamentBlockedHint": "",
|
||||
"inspector.delete.filamentBlockedTitle": "",
|
||||
"inspector.delete.filamentBlocked_other": "",
|
||||
"inspector.delete.filamentBody": "",
|
||||
"inspector.delete.filamentDone": "",
|
||||
"inspector.delete.filamentTitle": "",
|
||||
"inspector.delete.spool": "",
|
||||
"inspector.delete.spoolBody": "",
|
||||
"inspector.delete.spoolDone": "",
|
||||
"inspector.delete.spoolRemaining": "",
|
||||
"inspector.delete.spoolTitle": "",
|
||||
"inspector.delete.vendor": "",
|
||||
"inspector.delete.vendorBody": "",
|
||||
"inspector.delete.vendorDone": "",
|
||||
"inspector.delete.vendorOrphans_other": "",
|
||||
"inspector.delete.vendorTitle": "",
|
||||
"inspector.duplicateFilament": "",
|
||||
"inspector.empty": "",
|
||||
"inspector.enterValidLength": "",
|
||||
"inspector.enterValidWeight": "",
|
||||
"inspector.loading": "",
|
||||
"inspector.manageExtraFields": "",
|
||||
"inspector.measuredHelp": "",
|
||||
"inspector.multi": "",
|
||||
"inspector.newGross": "",
|
||||
"inspector.noExtraFields": "",
|
||||
"inspector.notFound": "",
|
||||
"inspector.ofRemaining": "",
|
||||
"inspector.openFilament": "",
|
||||
"inspector.openLink": "",
|
||||
"inspector.openManufacturer": "",
|
||||
"inspector.specs": "",
|
||||
"inspector.spoolsCount": "",
|
||||
"inspector.spoolsTotalRemaining": "",
|
||||
"inspector.used": "",
|
||||
"inspector.vendorSub_other": "",
|
||||
"kofi": "Ko-fiでチップをください",
|
||||
"labels.addHead": "",
|
||||
"labels.addQr": "",
|
||||
"labels.addRect": "",
|
||||
"labels.addSwatch": "",
|
||||
"labels.addText": "",
|
||||
"labels.align": "",
|
||||
"labels.alignCenter": "",
|
||||
"labels.alignLeft": "",
|
||||
"labels.alignRight": "",
|
||||
"labels.blank": "",
|
||||
"labels.bold": "",
|
||||
"labels.canvasHint": "",
|
||||
"labels.centerLogo": "",
|
||||
"labels.chooseField": "",
|
||||
"labels.clearFill": "",
|
||||
"labels.copies": "",
|
||||
"labels.cornerRadiusMm": "",
|
||||
"labels.createFirst": "",
|
||||
"labels.cutGuides": "",
|
||||
"labels.deleteConfirm": "",
|
||||
"labels.deleteElement": "",
|
||||
"labels.designName": "",
|
||||
"labels.designerDesc": "",
|
||||
"labels.designerTitle": "",
|
||||
"labels.dpi": "",
|
||||
"labels.dpiHint": "",
|
||||
"labels.duplicate": "",
|
||||
"labels.fields.bedTemp": "",
|
||||
"labels.fields.diameterMm": "",
|
||||
"labels.fields.groupVendor": "",
|
||||
"labels.fields.initialG": "",
|
||||
"labels.fields.netWeightG": "",
|
||||
"labels.fields.remainingG": "",
|
||||
"labels.filamentsSelected_other": "",
|
||||
"labels.fill": "",
|
||||
"labels.fitWidth": "",
|
||||
"labels.fitWidthHint": "",
|
||||
"labels.fontMm": "",
|
||||
"labels.gridInfo": "",
|
||||
"labels.hMm": "",
|
||||
"labels.heightMm": "",
|
||||
"labels.hintNowrap": "",
|
||||
"labels.hintSwatch": "",
|
||||
"labels.hintWrap": "",
|
||||
"labels.imageDesc": "",
|
||||
"labels.imageZipNote": "",
|
||||
"labels.insertField": "",
|
||||
"labels.kind.qr": "",
|
||||
"labels.kind.rect": "",
|
||||
"labels.kind.swatch": "",
|
||||
"labels.kind.text": "",
|
||||
"labels.labelSize": "",
|
||||
"labels.labelType": "",
|
||||
"labels.layout": "",
|
||||
"labels.modeImage": "",
|
||||
"labels.modeLabel": "",
|
||||
"labels.modeSheet": "",
|
||||
"labels.new": "",
|
||||
"labels.newText": "",
|
||||
"labels.noDesignsOption": "",
|
||||
"labels.noFilaments": "",
|
||||
"labels.noSpools": "",
|
||||
"labels.onePerLabel": "",
|
||||
"labels.preparing": "",
|
||||
"labels.preview": "",
|
||||
"labels.previewWith": "",
|
||||
"labels.printN_other": "",
|
||||
"labels.radiusMm": "",
|
||||
"labels.sampleData": "",
|
||||
"labels.saved": "",
|
||||
"labels.saving": "",
|
||||
"labels.searchFilaments": "",
|
||||
"labels.searchSpools": "",
|
||||
"labels.selectAllShort": "",
|
||||
"labels.selectAtLeastOne": "",
|
||||
"labels.selectAtLeastOneFilament": "",
|
||||
"labels.selectDesign": "",
|
||||
"labels.selectElement": "",
|
||||
"labels.selectNoneShort": "",
|
||||
"labels.selectRecentHint": "",
|
||||
"labels.selectRecentShort": "",
|
||||
"labels.showingFilament": "",
|
||||
"labels.showingReal": "",
|
||||
"labels.showingSpool": "",
|
||||
"labels.showingTags": "",
|
||||
"labels.sizeMm": "",
|
||||
"labels.skipHint": "",
|
||||
"labels.sortHint": "",
|
||||
"labels.sortId": "",
|
||||
"labels.sortNewest": "",
|
||||
"labels.stroke": "",
|
||||
"labels.strokeMm": "",
|
||||
"labels.tabDesign": "",
|
||||
"labels.tabPrint": "",
|
||||
"labels.textTemplate": "",
|
||||
"labels.typeFilament": "",
|
||||
"labels.typeHint": "",
|
||||
"labels.typeSpool": "",
|
||||
"labels.unknownFilament": "",
|
||||
"labels.wMm": "",
|
||||
"labels.widthMm": "",
|
||||
"labels.wrapText": "",
|
||||
"labels.xMm": "",
|
||||
"labels.yMm": "",
|
||||
"library.apiError": "",
|
||||
"library.collapseGroup": "",
|
||||
"library.emptyBody": "",
|
||||
"library.emptyFiltered": "",
|
||||
"library.emptyTitle": "",
|
||||
"library.expandGroup": "",
|
||||
"library.filterBy": "",
|
||||
"library.groupBy": "",
|
||||
"library.groupNone": "",
|
||||
"library.groupSpools_other": "",
|
||||
"library.nUnused": "",
|
||||
"library.noLocation": "",
|
||||
"library.noValues": "",
|
||||
"library.openGroup": "",
|
||||
"library.openManufacturer": "",
|
||||
"library.section.extra": "",
|
||||
"library.section.filament": "",
|
||||
"library.section.spool": "",
|
||||
"library.section.vendor": "",
|
||||
"library.showMore": "",
|
||||
"library.sort.nozzle": "",
|
||||
"library.sortBy": "",
|
||||
"library.unassigned": "",
|
||||
"library.unitGroups": "",
|
||||
"library.unitSpools": "",
|
||||
"library.unused": "",
|
||||
"library.unusedGroup": "",
|
||||
"library.unusedGroupMixed": "",
|
||||
"library.unusedSub": "",
|
||||
"library.unusedSubMixed": "",
|
||||
"library.used": "",
|
||||
"library.usedAgo": "",
|
||||
"loading": "読み込み中",
|
||||
"locations.locations": "場所",
|
||||
"locations.newLocation": "新しい場所",
|
||||
"locations.noLocation": "場所なし",
|
||||
"locations.noLocationsHelp": "このページでは、スプールを場所ごとに整理することができます!",
|
||||
"nav.labels": "",
|
||||
"nav.library": "",
|
||||
"no": "いいえ",
|
||||
"notifications.error": "エラー (status code: {{statusCode}})",
|
||||
"notifications.saveSuccessful": "保存完了!",
|
||||
"pagination.empty": "",
|
||||
"pagination.next": "",
|
||||
"pagination.pageSize": "",
|
||||
"pagination.perPage": "",
|
||||
"pagination.prev": "",
|
||||
"pagination.range": "",
|
||||
"printing.generic.columns": "列",
|
||||
"printing.generic.customSize": "カスタム",
|
||||
"printing.generic.description": "以下の設定を調整して、希望する印刷レイアウトを得てください。プリンターやOSが独自のマージンや拡大縮小を適用する場合があるため、すべてが正確になるまでには試行錯誤が必要かもしれません。実際のラベルに印刷する前に、普通の紙でテストしてください。",
|
||||
"printing.generic.dimensions": "寸法",
|
||||
"printing.generic.gridTooWide": "",
|
||||
"printing.generic.helpMargin": "マージンはラベル用紙とプリンターに合わせて設定する必要があります。これらを変更すると、グリッド全体のサイズに影響します。",
|
||||
"printing.generic.helpPrinterMargin": "セーフゾーンは、プリンターが用紙の端にどれだけ近づけて印刷できるかの設定です。これらを変更しても、グリッド全体には影響しません。",
|
||||
"printing.generic.horizontalSpacing": "水平方向の余白",
|
||||
"printing.generic.itemCopies": "複製",
|
||||
"printing.generic.marginBottom": "下側の余白",
|
||||
"printing.generic.marginLeft": "左側の余白",
|
||||
"printing.generic.marginRight": "右側の余白",
|
||||
"printing.generic.marginTop": "上側の余白",
|
||||
"printing.generic.paperSize": "用紙サイズ",
|
||||
"printing.generic.printerMarginBottom": "下側のセーフゾーン",
|
||||
"printing.generic.printerMarginLeft": "左側のセーフゾーン",
|
||||
"printing.generic.printerMarginRight": "右側のセーフゾーン",
|
||||
"printing.generic.printerMarginTop": "上側のセーフゾーン",
|
||||
"printing.generic.saveAsImage": "画像として保存",
|
||||
"printing.generic.skipItems": "スキップ",
|
||||
"printing.generic.verticalSpacing": "垂直方向の余白",
|
||||
"printing.qrcode.button": "ラベルを印刷",
|
||||
"printing.qrcode.customUrl.caveat": "",
|
||||
"printing.qrcode.customUrl.hint": "",
|
||||
"printing.qrcode.customUrl.label": "",
|
||||
"printing.qrcode.useHTTPUrl.label": "QRコードリンク",
|
||||
"printing.qrcode.useHTTPUrl.options.custom": "",
|
||||
"printing.qrcode.useHTTPUrl.options.default": "デフォルト",
|
||||
"printing.qrcode.useHTTPUrl.options.url": "URL",
|
||||
"printing.qrcode.useHTTPUrl.preview": "プレビュー:",
|
||||
"printing.qrcode.useHTTPUrl.tooltip": "Spoolmanのスキャン機能からスキャンした場合にのみ機能する独自リンクを使用します(デフォルト)。URLは設定で指定されたベースURLを使用するか、設定されていない場合は現在のページURLを使用します。",
|
||||
"printing.spoolSelect.selectedTotal_other": "{{count}}本のスプールを選択",
|
||||
"scanner.description": "スプールの詳細を表示するには、SpoolmanのQRコードをスキャンしてください。",
|
||||
"scanner.error.inUse": "",
|
||||
"scanner.error.insecureContext": "このページはHTTPSで接続されていません。",
|
||||
"scanner.error.notAllowed": "カメラへのアクセスが許可されていません。",
|
||||
"scanner.error.notFound": "カメラが見つかりません。",
|
||||
"scanner.error.streamApiNotSupported": "ブラウザがMediaStream APIに対応していません。",
|
||||
"scanner.error.unknown": "未知のエラーが発生しました。({{error}})",
|
||||
"scanner.starting": "",
|
||||
"scanner.title": "QRコードスキャナ",
|
||||
"search.colorHint": "",
|
||||
"search.noResults": "",
|
||||
"search.searching": "",
|
||||
"search.section.filaments": "",
|
||||
"search.section.spools": "",
|
||||
"search.section.vendors": "",
|
||||
"search.threshold": "",
|
||||
"search.unknownFilament": "",
|
||||
"settings.appearance.tab": "",
|
||||
"settings.appearance.theme.dark": "",
|
||||
"settings.appearance.theme.desc": "",
|
||||
"settings.appearance.theme.label": "",
|
||||
"settings.appearance.theme.light": "",
|
||||
"settings.appearance.theme.system": "",
|
||||
"settings.extraFields.addChoice": "",
|
||||
"settings.extraFields.addChoicesFirst": "",
|
||||
"settings.extraFields.addEntityField": "",
|
||||
"settings.extraFields.booleanFalse": "いいえ",
|
||||
"settings.extraFields.booleanTrue": "はい",
|
||||
"settings.extraFields.deleteConfirm": "{{name}}のフィールドを削除しますか?",
|
||||
"settings.extraFields.description.constraints": "フィールドを追加すると、そのキーやタイプを変更することはできません。また、選択肢タイプのフィールドでは、選択肢の削除や複数選択の状態を変更することはできません。フィールドを削除すると、すべてのエンティティの関連データが削除されます。",
|
||||
"settings.extraFields.description.intro": "ここで追加のカスタムフィールドを追加できます。",
|
||||
"settings.extraFields.description.keyUsage": "キーは他のプログラムがデータを読み書きする際に使用するものなので、カスタムフィールドがサードパーティのプログラムと連携する予定がある場合は、正しく設定してください。デフォルト値は新しいアイテムにのみ適用されます。",
|
||||
"settings.extraFields.description.tableViews": "追加フィールドはテーブルビューで並べ替えやフィルタリングすることはできません。",
|
||||
"settings.extraFields.editorEdit": "",
|
||||
"settings.extraFields.editorNew": "",
|
||||
"settings.extraFields.errors.choiceNeeded": "",
|
||||
"settings.extraFields.errors.choicesRemoved": "",
|
||||
"settings.extraFields.errors.deleteFailed": "",
|
||||
"settings.extraFields.errors.keyFormat": "",
|
||||
"settings.extraFields.errors.nameRequired": "",
|
||||
"settings.extraFields.errors.saveFailed": "",
|
||||
"settings.extraFields.fieldType.boolean": "真偽値",
|
||||
"settings.extraFields.fieldType.choice": "選択肢",
|
||||
"settings.extraFields.fieldType.datetime": "日時",
|
||||
"settings.extraFields.fieldType.float": "小数点型",
|
||||
"settings.extraFields.fieldType.floatRange": "小数点型の範囲",
|
||||
"settings.extraFields.fieldType.integer": "整数",
|
||||
"settings.extraFields.fieldType.integerRange": "数値範囲",
|
||||
"settings.extraFields.fieldType.text": "テキスト",
|
||||
"settings.extraFields.max": "",
|
||||
"settings.extraFields.min": "",
|
||||
"settings.extraFields.multiSuffix": "",
|
||||
"settings.extraFields.multiple": "",
|
||||
"settings.extraFields.namePlaceholder": "",
|
||||
"settings.extraFields.nonUniqueKeyError": "キーは一意の値である必要があります。",
|
||||
"settings.extraFields.none": "",
|
||||
"settings.extraFields.params.choices": "選択肢",
|
||||
"settings.extraFields.params.defaultValue": "デフォルト値",
|
||||
"settings.extraFields.params.fieldType": "タイプ",
|
||||
"settings.extraFields.params.key": "キー",
|
||||
"settings.extraFields.params.name": "名称",
|
||||
"settings.extraFields.params.order": "数量",
|
||||
"settings.extraFields.params.unit": "単位",
|
||||
"settings.extraFields.saveField": "",
|
||||
"settings.extraFields.tab": "追加項目",
|
||||
"settings.general.baseUrl.label": "ベースURL",
|
||||
"settings.general.baseUrl.tooltip": "QRコードなどの機能を生成する際に使用する基本URL。",
|
||||
"settings.general.currency.desc": "",
|
||||
"settings.general.currency.label": "通過",
|
||||
"settings.general.roundPrices.label": "価格の端数処理",
|
||||
"settings.general.roundPrices.tooltip": "価格の小数点以下を四捨五入する。",
|
||||
"settings.general.tab": "一般",
|
||||
"settings.header": "設定",
|
||||
"settings.language.desc": "",
|
||||
"settings.language.label": "",
|
||||
"settings.library.lowThreshold.desc": "",
|
||||
"settings.library.lowThreshold.label": "",
|
||||
"settings.library.tab": "",
|
||||
"spool.fields.archived": "アーカイブ",
|
||||
"spool.fields.comment": "コメント",
|
||||
"spool.fields.filament": "フィラメント",
|
||||
"spool.fields.firstUsed": "最初の使用",
|
||||
"spool.fields.id": "ID",
|
||||
"spool.fields.lastUsed": "最後の使用",
|
||||
"spool.fields.location": "場所",
|
||||
"spool.fields.lotNr": "ロットナンバー",
|
||||
"spool.fields.material": "マテリアル",
|
||||
"spool.fields.measuredWeight": "計測した重さ",
|
||||
"spool.fields.price": "価格",
|
||||
"spool.fields.registered": "登録",
|
||||
"spool.fields.remainingWeight": "残りの重さ",
|
||||
"spool.fields.usedWeight": "使用した重さ",
|
||||
"spool.fieldsHelp.location": "スプールを複数の場所に保管している場合、そのスプールの保管場所。",
|
||||
"spool.fieldsHelp.lotNr": "メーカーのロット番号。複数のスプールを使用する場合、印刷の色が一定であることを確認するために使用できます。",
|
||||
"spool.fieldsHelp.measuredWeight": "フィラメントとスプールの重量。",
|
||||
"spool.fieldsHelp.price": "スプール全体の価格。設定されていない場合は、フィラメントの価格が代わりに使用されます。",
|
||||
"spool.fieldsHelp.remainingWeight": "スプールに残っているフィラメントの量。新しいスプールの場合、これはスプールの重量と一致するはずです。",
|
||||
"spool.fieldsHelp.usedWeight": "スプールからどれだけのフィラメントが使用されたか。新しいスプールは0gとなるはずです。",
|
||||
"spool.form.measurementType.length": "長さ",
|
||||
"spool.form.measurementType.weight": "重さ",
|
||||
"spool.spool": "スプール",
|
||||
"topbar.addSpools": "",
|
||||
"topbar.searchPlaceholder": "",
|
||||
"unknown": "未知",
|
||||
"validation.hexDigits": "",
|
||||
"validation.maxChars": "",
|
||||
"validation.mustBeGt": "",
|
||||
"validation.mustBeMax": "",
|
||||
"validation.mustBeMin": "",
|
||||
"validation.mustBeNumber": "",
|
||||
"validation.required": "",
|
||||
"vendor.fields.comment": "コメント",
|
||||
"vendor.fields.emptySpoolWeight": "空スプールの重さ",
|
||||
"vendor.fields.externalId": "外部ID",
|
||||
"vendor.fields.id": "ID",
|
||||
"vendor.fields.name": "名称",
|
||||
"vendor.fields.registered": "登録",
|
||||
"vendor.fieldsHelp.emptySpoolWeight": "この製造者の空スプールの重量。",
|
||||
"yes": "はい"
|
||||
}
|
||||
Loaded 100 of 444 files, more files were not shown because too many files have changed in this diff.
Show more
Reference in new issue
Block a user