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 | ||
|
|
8a29ce063a | ||
|
|
fa6343c368 | ||
|
|
1cd8c7a962 | ||
|
|
b361aee956 | ||
|
|
c179a38f03 | ||
|
|
6e9f6e5af4 | ||
|
|
0f5775c2d4 | ||
|
|
b942d1f8a1 | ||
|
|
cda756557d | ||
|
|
b627e151a8 | ||
|
|
848f5dcc94 | ||
|
|
6adb6bedc2 | ||
|
|
edda1e965a | ||
|
|
7bb0c6b1ec | ||
|
|
9124ce0b86 | ||
|
|
753140ecc3 | ||
|
|
9baf91380a | ||
|
|
e1349cc760 | ||
|
|
185c8b07e0 | ||
|
|
572a5eea27 | ||
|
|
da7c274d21 | ||
|
|
15ca571c1d | ||
|
|
7b9e9c00b2 | ||
|
|
eb2df7cd6a | ||
|
|
c84de2b940 | ||
|
|
5fd999151f | ||
|
|
6f05ce81c7 | ||
|
|
a533f2556f | ||
|
|
c88d443782 | ||
|
|
3cd1ff6ac4 | ||
|
|
a41b1df76e | ||
|
|
bed385b796 | ||
|
|
2508210469 | ||
|
|
fae3a92f5e | ||
|
|
37fcad4a0a | ||
|
|
4d62eb24c1 | ||
|
|
05f0d7fd20 | ||
|
|
3666c10117 | ||
|
|
902fbbaec2 | ||
|
|
b10c1e1aef | ||
|
|
a6c4e8c49b | ||
|
|
975cd9c613 | ||
|
|
a124d73fae | ||
|
|
21f46427e5 | ||
|
|
4d48fca237 | ||
|
|
967b9d5b31 | ||
|
|
19ccb7099a | ||
|
|
13b141dcdf | ||
|
|
9df3f0c91b | ||
|
|
e8ca2d55bc | ||
|
|
e49976bf8a | ||
|
|
3efb99f635 | ||
|
|
a05113c454 | ||
|
|
25f78e90e6 | ||
|
|
d3181382ae | ||
|
|
8af6013331 | ||
|
|
a6607fb162 | ||
|
|
e1923b8083 | ||
|
|
3e6750765f | ||
|
|
13d320ab1d | ||
|
|
d11bc1a6bb | ||
|
|
d27a967737 | ||
|
|
8712ad4840 | ||
|
|
7b7d73224d | ||
|
|
25536233fc | ||
|
|
1962945c5d | ||
|
|
0b9b3e7391 | ||
|
|
77aa955766 | ||
|
|
2766f32d4e | ||
|
|
ff473429c7 | ||
|
|
5ccd225ed6 | ||
|
|
de7fccdc1a | ||
|
|
1ecf70773f | ||
|
|
8bfb263858 | ||
|
|
488b37c5a0 | ||
|
|
fb355945cb | ||
|
|
5c8e8b9d11 | ||
|
|
d975020260 | ||
|
|
fdb34f5c5e | ||
|
|
37803e1029 | ||
|
|
b1d061cf08 | ||
|
|
b6ed0cb6e9 | ||
|
|
3e8b3526e2 | ||
|
|
f31b40bec6 | ||
|
|
73a087fce0 | ||
|
|
eabb10a009 | ||
|
|
ed500ef293 | ||
|
|
8e8cf7eaaa | ||
|
|
4c876d7aef | ||
|
|
97eddadb3b | ||
|
|
c3c2b70213 | ||
|
|
11a74e2197 | ||
|
|
ea36a94327 | ||
|
|
4e10f1019d | ||
|
|
ec5173067e | ||
|
|
4003c0aadd | ||
|
|
dbdad84120 | ||
|
|
1888240044 | ||
|
|
9e2d10a816 | ||
|
|
db59fce383 | ||
|
|
dcb21f71cb | ||
|
|
aa839b08e5 | ||
|
|
3d1bb70913 | ||
|
|
6f01f372d6 | ||
|
|
a775beb5bf | ||
|
|
a94163dc1a | ||
|
|
dcf043cb71 | ||
|
|
3fc2f712e3 | ||
|
|
f041207db8 | ||
|
|
dde468ed69 | ||
|
|
e538f06483 | ||
|
|
53d5fdf7e3 | ||
|
|
a5df70a803 | ||
|
|
70ea7ad414 | ||
|
|
92065fd8df | ||
|
|
11b12ac2e7 | ||
|
|
0e4d0b3e14 | ||
|
|
15e3e3f187 | ||
|
|
88c25d9fea | ||
|
|
8cc485ac96 | ||
|
|
3c2936bf5e | ||
|
|
3963ec6203 | ||
|
|
c8ab290f33 | ||
|
|
55acc4993d | ||
|
|
d253391b63 | ||
|
|
2761829db8 | ||
|
|
4a1358a438 | ||
|
|
e54608f139 | ||
|
|
4b8fd3aed3 | ||
|
|
28f6f8e916 | ||
|
|
cd274a9968 | ||
|
|
3a44a01467 | ||
|
|
4b08f27614 | ||
|
|
d930217cd3 | ||
|
|
80b869feec | ||
|
|
cf0d458364 | ||
|
|
9d9f297065 | ||
|
|
58a6233e7b | ||
|
|
03815687ff | ||
|
|
c0af80d439 | ||
|
|
53da38e396 | ||
|
|
4a914d7bce | ||
|
|
d52826656d | ||
|
|
5a32d140ef | ||
|
|
834fd1ed18 | ||
|
|
4fcd42a301 | ||
|
|
07dbb09a5e | ||
|
|
3f97be2e51 | ||
|
|
9efed6dea7 | ||
|
|
67c2c89e2a | ||
|
|
c5878883a8 | ||
|
|
21befc2993 | ||
|
|
108fdd2908 | ||
|
|
418c8cf518 | ||
|
|
2e67d7e6a3 | ||
|
|
1f3c1c0ad5 | ||
|
|
a2e6ad983a | ||
|
|
e93f89aa51 | ||
|
|
276fd1e733 | ||
|
|
a14a520116 | ||
|
|
524e0f8657 | ||
|
|
c83ddbf5c5 | ||
|
|
e6cd503ebd | ||
|
|
291572ddc1 | ||
|
|
e2a1113033 | ||
|
|
6421f723ee | ||
|
|
45ea68bbc0 | ||
|
|
6b2dbda354 | ||
|
|
b37c19eb9e | ||
|
|
385d9bb3da | ||
|
|
4479da84ed | ||
|
|
4ee34f67d1 | ||
|
|
9ceee4aa7a | ||
|
|
053b20f19c | ||
|
|
a3f506ce85 | ||
|
|
0e6bdd764f | ||
|
|
d4ddb1f63e | ||
|
|
bb7b64669e | ||
|
|
1372d75d90 | ||
|
|
139d435cee | ||
|
|
a3be91b89c | ||
|
|
649c074bb3 | ||
|
|
04920e463a | ||
|
|
c57141254c | ||
|
|
46a9097491 | ||
|
|
d142b0eaec | ||
|
|
0827cc8a5a | ||
|
|
755e06c989 | ||
|
|
bb0b00b973 | ||
|
|
1a55855ce9 | ||
|
|
67c5b34bf5 | ||
|
|
c68c32698a | ||
|
|
289818ab06 | ||
|
|
bf06408368 | ||
|
|
ce42d687ed | ||
|
|
37b6d1fcee | ||
|
|
5861190821 | ||
|
|
8d6f2636c5 | ||
|
|
3dc0082f0e | ||
|
|
e4175e26ec | ||
|
|
1eca7b2503 | ||
|
|
b568147884 | ||
|
|
a4355967d0 | ||
|
|
502ea1ba8b | ||
|
|
b555f812ef | ||
|
|
e0371192a7 | ||
|
|
b129fd3cb7 | ||
|
|
0c8ec342ce | ||
|
|
ba488655bf | ||
|
|
0ef4649927 | ||
|
|
281e6cbe44 | ||
|
|
fd256bab95 | ||
|
|
39aea03a01 | ||
|
|
86f69d470f | ||
|
|
d60b93349a | ||
|
|
a95ddcedd1 | ||
|
|
dc93e5b725 | ||
|
|
7783718d44 | ||
|
|
5645b5358f | ||
|
|
9c0f1c489d | ||
|
|
4a4a6c20e3 | ||
|
|
3bbfb1d92e | ||
|
|
25a33c6361 | ||
|
|
8a0370d74b | ||
|
|
761a4978b6 | ||
|
|
efae0d8466 | ||
|
|
6a5847c152 | ||
|
|
b74b7e0205 | ||
|
|
ea215efdfc | ||
|
|
590b0df191 | ||
|
|
62705b590b | ||
|
|
551e31a9c6 | ||
|
|
6f6cebb88e | ||
|
|
00d4ae7c22 | ||
|
|
5b6151c4ac | ||
|
|
d06f044b83 | ||
|
|
09f5cba082 | ||
|
|
980809f1ad | ||
|
|
59c76c37cf | ||
|
|
9cb1dfbf79 | ||
|
|
3aa2f93cf2 | ||
|
|
36b04ae242 | ||
|
|
4f8d5abcec | ||
|
|
a826db12ea | ||
|
|
608d88f6c5 | ||
|
|
533139b879 | ||
|
|
df150553f7 | ||
|
|
909d8c38bd | ||
|
|
13a038cb3e | ||
|
|
eeb1e53490 | ||
|
|
4469523650 | ||
|
|
a0e62e2fd5 | ||
|
|
b70cfb0e79 | ||
|
|
b930c68479 | ||
|
|
c9e8d1b80f | ||
|
|
7b0e98827e | ||
|
|
5bd9d055d0 | ||
|
|
1f2e26b6f1 | ||
|
|
334a00054e | ||
|
|
fbcaa81128 | ||
|
|
5f4bbe6a7b | ||
|
|
a6d271ac87 | ||
|
|
93c9f46385 | ||
|
|
e65b87cc33 | ||
|
|
c54e11ca11 | ||
|
|
a0e9f10127 | ||
|
|
e3175723ea | ||
|
|
2937d7d5bc | ||
|
|
54ac546f78 | ||
|
|
32c737fa98 | ||
|
|
8edf6d2e20 | ||
|
|
1a9b964fc2 | ||
|
|
e5f79493cc | ||
|
|
813d299c8c | ||
|
|
5c5bd4627b | ||
|
|
da89b80d07 | ||
|
|
14a22e072f | ||
|
|
2e414af9bb | ||
|
|
d7479d3cdf | ||
|
|
4a65ff574c | ||
|
|
ed7f09df3a | ||
|
|
5829d24807 | ||
|
|
88661c08ad | ||
|
|
225aa77d41 | ||
|
|
322354a6c3 | ||
|
|
ebbaa6ee12 | ||
|
|
b2f6227540 | ||
|
|
2fd80038e3 | ||
|
|
9469f47f09 | ||
|
|
eb4e1a950a | ||
|
|
208e2f67e3 | ||
|
|
eee36fad66 | ||
|
|
c93ca5d916 | ||
|
|
902e98b059 | ||
|
|
3454002c09 | ||
|
|
515722bf4f | ||
|
|
efa93615ec | ||
|
|
ae26bf5733 | ||
|
|
10ad8cebcb | ||
|
|
7082c5206b | ||
|
|
7108b0e7a1 | ||
|
|
8413e33895 | ||
|
|
736e59d1eb | ||
|
|
3bd93cb0af | ||
|
|
701ed2fae6 | ||
|
|
00e35584f4 | ||
|
|
48ef3a23f2 | ||
|
|
93d27a96d3 | ||
|
|
694e4b9f61 | ||
|
|
f3711f3789 | ||
|
|
3b1a09752e | ||
|
|
71b3ad8f7b | ||
|
|
ae0dbc740b | ||
|
|
5afe53e05b | ||
|
|
4f49481475 | ||
|
|
093d5e095c | ||
|
|
6f1338caf0 | ||
|
|
65b8762805 | ||
|
|
d32d6779c3 | ||
|
|
f7a5149c81 | ||
|
|
b7d2e13b8f | ||
|
|
59089303eb | ||
|
|
f5cd2c8771 | ||
|
|
1587b116db | ||
|
|
3df7d6ad3e | ||
|
|
c288dc3f9b | ||
|
|
98105f7bab | ||
|
|
fc505c98f1 | ||
|
|
92f70e73e0 | ||
|
|
21b9f16531 | ||
|
|
bf8cbc7a96 | ||
|
|
f8c518e808 | ||
|
|
356946d8d3 | ||
|
|
edbde651ed | ||
|
|
d90426b63d | ||
|
|
87e1e4fb5d | ||
|
|
19af94efb9 | ||
|
|
c69035e707 | ||
|
|
981d08ea65 | ||
|
|
d9cfc90060 | ||
|
|
cbdb3ad221 | ||
|
|
69b856447d | ||
|
|
e5a6bf6118 | ||
|
|
38ec685356 | ||
|
|
71f6ce55f5 | ||
|
|
b764e9ecd9 | ||
|
|
9318ef5c19 | ||
|
|
7e87751caf | ||
|
|
9aa9479a14 | ||
|
|
052bdb453d | ||
|
|
20923deebd | ||
|
|
515aafac8f | ||
|
|
58e76b0ece | ||
|
|
b2e49aa270 | ||
|
|
4100813f22 | ||
|
|
0452b0be04 | ||
|
|
426496b4e5 | ||
|
|
4d0e76b64f | ||
|
|
f1b27b441d | ||
|
|
e2df888e96 | ||
|
|
f7fce7f2cc | ||
|
|
111eab1f24 | ||
|
|
30098e0213 | ||
|
|
f3d23ad9fe | ||
|
|
ac2829ef84 | ||
|
|
4b155a93d2 | ||
|
|
cc7dceb2a3 | ||
|
|
c7d58a2938 | ||
|
|
d9417655b4 | ||
|
|
62573ecaff | ||
|
|
06e04c9000 | ||
|
|
2d0d4ff425 | ||
|
|
2ec56ec89f | ||
|
|
6e034eb345 | ||
|
|
68e231e5d1 | ||
|
|
6b0c6218b7 | ||
|
|
773f24921b | ||
|
|
37aab5eb77 | ||
|
|
8f2cc05a7c | ||
|
|
9bc0a03582 | ||
|
|
8c164ac55f | ||
|
|
91f33ae9b2 | ||
|
|
b00075ab87 | ||
|
|
65bfba89cf | ||
|
|
c851950701 | ||
|
|
535fa40ad2 | ||
|
|
306dbe40af | ||
|
|
26f5eaa2f7 | ||
|
|
620febc3ab | ||
|
|
0ab6e92d65 | ||
|
|
59295a3e5a | ||
|
|
4eee6712c1 | ||
|
|
ca545b72b9 | ||
|
|
52c52bcfd8 | ||
|
|
5dcc28aa98 | ||
|
|
c834d3dd01 | ||
|
|
2f1776cbb6 | ||
|
|
cef3eba46c | ||
|
|
7bd2eac94b | ||
|
|
6fea0b77b9 | ||
|
|
835235257c | ||
|
|
c4693d3f34 | ||
|
|
51c3b46f1f | ||
|
|
090cbadf3b | ||
|
|
69bb3cec77 | ||
|
|
98aa1fdf8b | ||
|
|
c6520d336e | ||
|
|
ccd4026279 | ||
|
|
5a8d71fe70 | ||
|
|
46ab709f72 | ||
|
|
55471062ab | ||
|
|
4598d8f520 | ||
|
|
3de2c94098 | ||
|
|
e4d2ecf0dc | ||
|
|
4af975d390 | ||
|
|
c2f2f845f6 | ||
|
|
7f8606050b | ||
|
|
1e4c73138c | ||
|
|
36945f449d | ||
|
|
8d03a53228 | ||
|
|
eca8e32a55 | ||
|
|
987f357f97 | ||
|
|
cbaa7b81df | ||
|
|
595fd82b56 | ||
|
|
21d541a680 | ||
|
|
c7347cf512 | ||
|
|
8454825999 | ||
|
|
35a6e1cc09 | ||
|
|
78e91a199a | ||
|
|
1962ffb43e | ||
|
|
9040a55204 | ||
|
|
1ed06912ba | ||
|
|
a46188adca | ||
|
|
986d06d912 | ||
|
|
e1d5493f15 | ||
|
|
172db393b8 | ||
|
|
cd9cca0c06 | ||
|
|
9ff457f2fd | ||
|
|
88705a7f18 | ||
|
|
bc32f1e890 | ||
|
|
fc532ff697 | ||
|
|
4f93fdd4ea | ||
|
|
1ddd9fb94a | ||
|
|
3db02717da | ||
|
|
506b390b7f | ||
|
|
d80a9b60b1 | ||
|
|
e61b05344f | ||
|
|
ab98a9ca12 | ||
|
|
3f82da9743 | ||
|
|
210cda4369 | ||
|
|
bfec375a67 | ||
|
|
5139c885be | ||
|
|
a6774dd054 | ||
|
|
c7f02f52e5 | ||
|
|
fa4905de0f | ||
|
|
153b21408b | ||
|
|
fdec032d19 | ||
|
|
92a5868ccb | ||
|
|
1ec16e64fb | ||
|
|
fd33446a59 | ||
|
|
047b0b286b | ||
|
|
6aef3a82f4 | ||
|
|
91d922d0b8 | ||
|
|
fc8df5346d | ||
|
|
640ca8c430 | ||
|
|
2aa0a4f1b0 | ||
|
|
c6f9abeced | ||
|
|
28b2bfec50 | ||
|
|
fc6ab9ee3a | ||
|
|
81ef9b115d | ||
|
|
dad446621f | ||
|
|
23cfb42ba8 | ||
|
|
37804c14a8 | ||
|
|
c77d0186ca | ||
|
|
163c809fd5 | ||
|
|
1696759325 | ||
|
|
29f54358d6 | ||
|
|
e391d041ac | ||
|
|
80fbfdfe65 | ||
|
|
db18a5f19d | ||
|
|
e6aa80347f | ||
|
|
b86841d7fe | ||
|
|
ba084b47b5 | ||
|
|
90795fea84 | ||
|
|
9dd87049d2 | ||
|
|
a49f150560 | ||
|
|
cc19079bd9 | ||
|
|
7808615b1d | ||
|
|
23f67b6739 | ||
|
|
951592ab4c | ||
|
|
a6ae808389 | ||
|
|
19c414da4b | ||
|
|
3ea4937f24 | ||
|
|
3aed735cea | ||
|
|
e68f88da2a | ||
|
|
83fd3073ec | ||
|
|
1d6830d769 | ||
|
|
2a723da910 | ||
|
|
6d72dd69fd | ||
|
|
06e546f3fa | ||
|
|
8c19efa2c4 | ||
|
|
a68e0d59bd | ||
|
|
7e8611668e | ||
|
|
1109474ee2 | ||
|
|
3bff50871f | ||
|
|
65dcc5cc58 | ||
|
|
ce1d38ea94 | ||
|
|
dabf3f5a51 | ||
|
|
bd1d1a6d7c | ||
|
|
37a65e954c | ||
|
|
6149e75332 | ||
|
|
a177d561e1 | ||
|
|
8fd4147b5d | ||
|
|
7f3df034af | ||
|
|
eae391f34d | ||
|
|
e3b2bed573 | ||
|
|
aee0b477d6 | ||
|
|
739e982215 | ||
|
|
d1598e0407 | ||
|
|
30ee5b7cae | ||
|
|
babb95d086 | ||
|
|
c6c75e6271 | ||
|
|
c65bc4201b | ||
|
|
220457c1ac | ||
|
|
126ba45bff | ||
|
|
b6756e76e0 | ||
|
|
4fb4e58d3f | ||
|
|
a7783812aa | ||
|
|
f969e11d28 | ||
|
|
c2335366bb | ||
|
|
b6b6fcf6bd | ||
|
|
6d63519bee | ||
|
|
ad177a4cba | ||
|
|
cccb0de982 | ||
|
|
d3511b232c | ||
|
|
de9515f6ce | ||
|
|
c0714e053d | ||
|
|
88fa4b636a | ||
|
|
23f383dd63 | ||
|
|
41a40d9fa3 | ||
|
|
81b7a9b4ec | ||
|
|
36926c9ccf | ||
|
|
4d65dea1e9 | ||
|
|
290eb5cb81 | ||
|
|
414c11cd7f | ||
|
|
c8b8dab906 | ||
|
|
a99530391b | ||
|
|
a034e96939 | ||
|
|
445331369b | ||
|
|
7a7d43b548 | ||
|
|
b854f936c5 | ||
|
|
684b17619c | ||
|
|
a6cb08a587 | ||
|
|
e4b25d1eda | ||
|
|
30c5891c11 | ||
|
|
9b5d8969e5 | ||
|
|
9d3fb02231 | ||
|
|
d0a958decb | ||
|
|
f7c9c44ea7 | ||
|
|
721733551f | ||
|
|
46c95eb5dd | ||
|
|
b40da6e2ee | ||
|
|
c0b4951a68 | ||
|
|
e77623bab0 | ||
|
|
1479e13d94 | ||
|
|
2786eff3da | ||
|
|
52cdb01110 | ||
|
|
44d3ed72b0 | ||
|
|
1273b20224 | ||
|
|
f294561d57 | ||
|
|
40d3a3184f | ||
|
|
fb23024ed0 | ||
|
|
23818c1005 | ||
|
|
f8cc9f7eda | ||
|
|
7972f4d401 | ||
|
|
3340da3067 | ||
|
|
1caae75d81 | ||
|
|
f9787158b8 | ||
|
|
483c48151b | ||
|
|
77e781f1ea | ||
|
|
9362d04dad | ||
|
|
4adee1327b | ||
|
|
a868e1889f | ||
|
|
36a346bf64 | ||
|
|
09b8705133 | ||
|
|
86e126f775 | ||
|
|
06e3849862 | ||
|
|
77ac9d6a5c | ||
|
|
71c29d2467 | ||
|
|
4acb649a21 | ||
|
|
ccfec28bcd | ||
|
|
c014fb361b | ||
|
|
9ef4f16214 |
No files matched your search
@@ -1,4 +1,5 @@
|
||||
client/node_modules
|
||||
client_v2/node_modules
|
||||
|
||||
*.egg-info
|
||||
*.egg/
|
||||
|
||||
@@ -1,17 +1,25 @@
|
||||
# DB Type: sqlite, mysql, postgresql, cockroachdb
|
||||
# DB Type: sqlite, mysql, postgres, cockroachdb
|
||||
# Default if not set: sqlite
|
||||
#SPOOLMAN_DB_TYPE=sqlite
|
||||
|
||||
# DB Setup, if not using sqlite
|
||||
# Database hostname
|
||||
#SPOOLMAN_DB_HOST=
|
||||
# Database port
|
||||
#SPOOLMAN_DB_PORT=
|
||||
# Database name
|
||||
#SPOOLMAN_DB_NAME=
|
||||
# Database login username
|
||||
#SPOOLMAN_DB_USERNAME=
|
||||
# Path of file which contains the database password. Can be used instead of SPOOLMAN_DB_PASSWORD if desired.
|
||||
#SPOOLMAN_DB_PASSWORD_FILE=
|
||||
# Database login password
|
||||
#SPOOLMAN_DB_PASSWORD=
|
||||
# Query parameters for the database connection, e.g. set to `unix_socket=/path/to/mysql.sock` to connect using a MySQL socket.
|
||||
#SPOOLMAN_DB_QUERY=
|
||||
|
||||
# Logging level: DEBUG, INFO, WARNING, ERROR, CRITICAL
|
||||
# Logs will only be reported if the level is higher than the level set here
|
||||
# Default if not set: INFO
|
||||
#SPOOLMAN_LOGGING_LEVEL=INFO
|
||||
|
||||
@@ -34,3 +42,72 @@
|
||||
# Host and port to listen on
|
||||
SPOOLMAN_HOST=0.0.0.0
|
||||
SPOOLMAN_PORT=7912
|
||||
|
||||
# Change base path
|
||||
# Set this if you want to host Spoolman at a sub-path
|
||||
# If you want the root to be e.g. myhost.com/spoolman
|
||||
# Then set this to /spoolman
|
||||
#SPOOLMAN_BASE_PATH=
|
||||
|
||||
# Enable Collect Prometheus metrics at database
|
||||
# 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/
|
||||
#EXTERNAL_DB_URL=https://myhost.com/spoolmandb/
|
||||
# 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
|
||||
# This can be useful when developing, but is also a security risk
|
||||
# Default: FALSE
|
||||
#SPOOLMAN_DEBUG_MODE=TRUE
|
||||
|
||||
# UID and GID of the user in the docker container
|
||||
# These only make sense if you are running Spoolman in a docker container
|
||||
# Default if not set: 1000
|
||||
#PUID=1000
|
||||
#PGID=1000
|
||||
|
||||
# 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
|
||||
@@ -0,0 +1,7 @@
|
||||
# Handle line endings automatically for files detected as text
|
||||
# and leave all files detected as binary untouched.
|
||||
* text=auto
|
||||
|
||||
# Never modify line endings of our bash scripts
|
||||
*.sh -crlf
|
||||
.env.example text eol=lf
|
||||
@@ -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
|
||||
|
||||
@@ -23,16 +23,15 @@ A clear and concise description of what you expected to happen.
|
||||
**Screenshots**
|
||||
If applicable, add screenshots to help explain your problem.
|
||||
|
||||
**Desktop (please complete the following information):**
|
||||
- OS: [e.g. iOS]
|
||||
- Browser [e.g. chrome, safari]
|
||||
- Version [e.g. 22]
|
||||
**Spoolman Host (please complete the following information):**
|
||||
- Installation type: [Docker or Standalone]
|
||||
- Installed version: [e.g. 0.17.0, can be found at the bottom of your spoolman website if you don't know]
|
||||
- OS and Distro: [e.g. Ubuntu, Raspbian]
|
||||
- Database type: [SQLite, PostgreSQL, etc]
|
||||
|
||||
**Smartphone (please complete the following information):**
|
||||
- Device: [e.g. iPhone6]
|
||||
- OS: [e.g. iOS8.1]
|
||||
- Browser [e.g. stock browser, safari]
|
||||
- Version [e.g. 22]
|
||||
**Desktop (please complete the following information):**
|
||||
- OS: [e.g. Windows, Mac, iOS, Android, ...]
|
||||
- Browser [e.g. Chrome, Firefox, Safari, ...]
|
||||
|
||||
**Additional context**
|
||||
Add any other context about the problem here.
|
||||
|
After Width: | Height: | Size: 312 KiB |
|
After Width: | Height: | Size: 136 KiB |
|
After Width: | Height: | Size: 162 KiB |
|
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
|
||||
@@ -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,
|
||||
},
|
||||
],
|
||||
})
|
||||
@@ -25,19 +25,25 @@ jobs:
|
||||
runs-on: ubuntu-latest
|
||||
steps:
|
||||
- name: Checkout
|
||||
uses: actions/checkout@v3
|
||||
- name: Set up PDM
|
||||
uses: pdm-project/setup-pdm@v2
|
||||
uses: actions/checkout@v6
|
||||
- name: Install uv
|
||||
uses: astral-sh/setup-uv@v7
|
||||
with:
|
||||
python-version: "3.9"
|
||||
- run: pdm sync
|
||||
- run: pdm run docs
|
||||
version: "0.9.26"
|
||||
- name: "Set up Python"
|
||||
uses: actions/setup-python@v6
|
||||
with:
|
||||
python-version-file: "pyproject.toml"
|
||||
- name: Install Poe the Poet
|
||||
run: uv tool install poethepoet
|
||||
- run: uv sync
|
||||
- run: poe generate-docs
|
||||
- name: Setup Pages
|
||||
uses: actions/configure-pages@v3
|
||||
uses: actions/configure-pages@v5.0.0
|
||||
- name: Upload artifact
|
||||
uses: actions/upload-pages-artifact@v1
|
||||
uses: actions/upload-pages-artifact@v3.0.1
|
||||
with:
|
||||
path: "docs/"
|
||||
- name: Deploy to GitHub Pages
|
||||
id: deployment
|
||||
uses: actions/deploy-pages@v2
|
||||
uses: actions/deploy-pages@v4.0.5
|
||||
@@ -3,53 +3,111 @@ 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:
|
||||
branches:
|
||||
- master
|
||||
|
||||
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:
|
||||
REGISTRY: ghcr.io
|
||||
IMAGE_NAME: donkie/spoolman
|
||||
GHCR_IMAGE: donkie/spoolman
|
||||
|
||||
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
|
||||
uses: actions/checkout@v3
|
||||
uses: actions/checkout@v6
|
||||
|
||||
- name: Set up Python
|
||||
uses: actions/setup-python@v4
|
||||
- name: Install node
|
||||
uses: actions/setup-node@v4.0.3
|
||||
with:
|
||||
python-version: "3.9"
|
||||
node-version: '24'
|
||||
|
||||
- name: Install pre-commit
|
||||
run: pip install pre-commit==3.3.3
|
||||
- name: Install uv
|
||||
uses: astral-sh/setup-uv@v7
|
||||
with:
|
||||
version: "0.9.26"
|
||||
|
||||
- name: "Set up Python"
|
||||
uses: actions/setup-python@v6
|
||||
with:
|
||||
python-version-file: "pyproject.toml"
|
||||
|
||||
- name: Install lefthook
|
||||
run: uv add --dev lefthook
|
||||
|
||||
- name: Install client dependencies
|
||||
run: |
|
||||
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: pre-commit run --all-files
|
||||
run: uv run lefthook run ci
|
||||
#
|
||||
# Build the Spoolman client for baking into the docker images
|
||||
# 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
|
||||
uses: actions/checkout@v3
|
||||
uses: actions/checkout@v6
|
||||
|
||||
- name: Install node
|
||||
uses: actions/setup-node@v3
|
||||
uses: actions/setup-node@v4.0.3
|
||||
with:
|
||||
node-version: '20'
|
||||
node-version: '24'
|
||||
|
||||
- name: Install dependencies
|
||||
- name: Install uv
|
||||
uses: astral-sh/setup-uv@v7
|
||||
with:
|
||||
version: "0.9.26"
|
||||
|
||||
- name: "Set up Python"
|
||||
uses: actions/setup-python@v6
|
||||
with:
|
||||
python-version-file: "pyproject.toml"
|
||||
|
||||
- name: Install client dependencies
|
||||
run: |
|
||||
cd client
|
||||
npm ci
|
||||
@@ -60,24 +118,57 @@ jobs:
|
||||
rm -f .env && echo "VITE_APIURL=/api/v1" > .env.production
|
||||
npm run build
|
||||
|
||||
# Remove client source and keep only the built dist
|
||||
# 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 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@v3
|
||||
uses: actions/upload-artifact@v4.4.0
|
||||
with:
|
||||
name: client
|
||||
path: client/dist
|
||||
|
||||
- name: Upload full Spoolman artifact
|
||||
uses: actions/upload-artifact@v3
|
||||
- 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:
|
||||
include-hidden-files: true
|
||||
name: spoolman
|
||||
path: .
|
||||
#
|
||||
@@ -86,48 +177,56 @@ jobs:
|
||||
build-amd64:
|
||||
needs: [build-client]
|
||||
runs-on: ubuntu-latest
|
||||
permissions:
|
||||
packages: write
|
||||
steps:
|
||||
- name: Checkout
|
||||
uses: actions/checkout@v3
|
||||
uses: actions/checkout@v6
|
||||
|
||||
- name: Download client
|
||||
uses: actions/download-artifact@v3
|
||||
uses: actions/download-artifact@v4.1.7
|
||||
with:
|
||||
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@v2
|
||||
uses: docker/setup-buildx-action@v3.6.1
|
||||
|
||||
- name: Log in to the Github Container registry
|
||||
uses: docker/login-action@v2
|
||||
uses: docker/login-action@v3.3.0
|
||||
with:
|
||||
registry: ${{ env.REGISTRY }}
|
||||
registry: ghcr.io
|
||||
username: ${{ github.actor }}
|
||||
password: ${{ secrets.GITHUB_TOKEN }}
|
||||
|
||||
- name: Build Spoolman
|
||||
if: ${{ github.event_name != 'pull_request' }}
|
||||
uses: docker/build-push-action@v4
|
||||
uses: docker/build-push-action@v6.7.0
|
||||
with:
|
||||
context: .
|
||||
tags: ${{ env.IMAGE_NAME }}:test
|
||||
tags: ${{ env.GHCR_IMAGE }}:test
|
||||
outputs: type=docker,dest=/tmp/spoolman.tar
|
||||
cache-from: type=registry,ref=${{ env.REGISTRY }}/${{ env.IMAGE_NAME }}:buildcache-amd64
|
||||
cache-to: type=registry,ref=${{ env.REGISTRY }}/${{ env.IMAGE_NAME }}:buildcache-amd64,mode=max
|
||||
cache-from: type=registry,ref=ghcr.io/${{ env.GHCR_IMAGE }}:buildcache-amd64
|
||||
cache-to: type=registry,ref=ghcr.io/${{ env.GHCR_IMAGE }}:buildcache-amd64,mode=max
|
||||
|
||||
# Separate build for pull requests since PRs dont have access to store cache
|
||||
- name: Build Spoolman (PR)
|
||||
if: ${{ github.event_name == 'pull_request' }}
|
||||
uses: docker/build-push-action@v4
|
||||
uses: docker/build-push-action@v6.7.0
|
||||
with:
|
||||
context: .
|
||||
tags: ${{ env.IMAGE_NAME }}:test
|
||||
tags: ${{ env.GHCR_IMAGE }}:test
|
||||
outputs: type=docker,dest=/tmp/spoolman.tar
|
||||
cache-from: type=registry,ref=${{ env.REGISTRY }}/${{ env.IMAGE_NAME }}:buildcache-amd64
|
||||
cache-from: type=registry,ref=ghcr.io/${{ env.GHCR_IMAGE }}:buildcache-amd64
|
||||
|
||||
- name: Upload artifact
|
||||
uses: actions/upload-artifact@v3
|
||||
uses: actions/upload-artifact@v4.4.0
|
||||
with:
|
||||
name: spoolman-image
|
||||
path: /tmp/spoolman.tar
|
||||
@@ -135,43 +234,50 @@ 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
|
||||
steps:
|
||||
- name: Checkout
|
||||
uses: actions/checkout@v3
|
||||
uses: actions/checkout@v6
|
||||
|
||||
- name: Set up Docker Buildx
|
||||
uses: docker/setup-buildx-action@v2
|
||||
uses: docker/setup-buildx-action@v3.6.1
|
||||
|
||||
- name: Log in to the Github Container registry
|
||||
uses: docker/login-action@v2
|
||||
uses: docker/login-action@v3.3.0
|
||||
with:
|
||||
registry: ${{ env.REGISTRY }}
|
||||
registry: ghcr.io
|
||||
username: ${{ github.actor }}
|
||||
password: ${{ secrets.GITHUB_TOKEN }}
|
||||
|
||||
- name: Build Spoolman Tester
|
||||
if: ${{ github.event_name != 'pull_request' }}
|
||||
uses: docker/build-push-action@v4
|
||||
uses: docker/build-push-action@v6.7.0
|
||||
with:
|
||||
context: ./tests_integration
|
||||
tags: ${{ env.IMAGE_NAME }}-tester:latest
|
||||
tags: ${{ env.GHCR_IMAGE }}-tester:latest
|
||||
outputs: type=docker,dest=/tmp/spoolman-tester.tar
|
||||
cache-from: type=registry,ref=${{ env.REGISTRY }}/${{ env.IMAGE_NAME }}:buildcache-tester
|
||||
cache-to: type=registry,ref=${{ env.REGISTRY }}/${{ env.IMAGE_NAME }}:buildcache-tester,mode=max
|
||||
cache-from: type=registry,ref=ghcr.io/${{ env.GHCR_IMAGE }}:buildcache-tester
|
||||
cache-to: type=registry,ref=ghcr.io/${{ env.GHCR_IMAGE }}:buildcache-tester,mode=max
|
||||
|
||||
# Separate build for pull requests since PRs dont have access to store cache
|
||||
- name: Build Spoolman Tester (PR)
|
||||
if: ${{ github.event_name == 'pull_request' }}
|
||||
uses: docker/build-push-action@v4
|
||||
uses: docker/build-push-action@v6.7.0
|
||||
with:
|
||||
context: ./tests_integration
|
||||
tags: ${{ env.IMAGE_NAME }}-tester:latest
|
||||
tags: ${{ env.GHCR_IMAGE }}-tester:latest
|
||||
outputs: type=docker,dest=/tmp/spoolman-tester.tar
|
||||
cache-from: type=registry,ref=${{ env.REGISTRY }}/${{ env.IMAGE_NAME }}:buildcache-tester
|
||||
cache-from: type=registry,ref=ghcr.io/${{ env.GHCR_IMAGE }}:buildcache-tester
|
||||
|
||||
- name: Upload artifact
|
||||
uses: actions/upload-artifact@v3
|
||||
uses: actions/upload-artifact@v4.4.0
|
||||
with:
|
||||
name: spoolman-tester-image
|
||||
path: /tmp/spoolman-tester.tar
|
||||
@@ -186,11 +292,12 @@ jobs:
|
||||
runs-on: ubuntu-latest
|
||||
steps:
|
||||
- name: Checkout
|
||||
uses: actions/checkout@v3
|
||||
uses: actions/checkout@v6
|
||||
|
||||
- name: Download built images
|
||||
uses: actions/download-artifact@v3
|
||||
uses: actions/download-artifact@v4.1.7
|
||||
with:
|
||||
pattern: spoolman*-image
|
||||
path: /tmp
|
||||
|
||||
- name: Load built images
|
||||
@@ -199,162 +306,495 @@ jobs:
|
||||
docker load --input /tmp/spoolman-tester-image/spoolman-tester.tar
|
||||
|
||||
- name: Perform integration tests
|
||||
uses: isbang/compose-action@v1.4.1
|
||||
uses: hoverkraft-tech/compose-action@v2.0.1
|
||||
with:
|
||||
compose-file: "./tests_integration/docker-compose-${{ matrix.dbtype }}.yml"
|
||||
up-flags: "--abort-on-container-exit"
|
||||
down-flags: "--volumes"
|
||||
#
|
||||
# Build arm64 image
|
||||
# Don't run this for pull requests
|
||||
# Only push to buildcache and let release job push to registry
|
||||
# Perform frontend (browser) integration tests against the real image
|
||||
#
|
||||
build-arm64:
|
||||
if: ${{ github.event_name != 'pull_request' }}
|
||||
needs: [build-client]
|
||||
test-frontend:
|
||||
needs: [build-amd64]
|
||||
runs-on: ubuntu-latest
|
||||
steps:
|
||||
- name: Checkout
|
||||
uses: actions/checkout@v3
|
||||
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
|
||||
# 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:
|
||||
needs: [build-client]
|
||||
runs-on: ubuntu-latest
|
||||
permissions:
|
||||
packages: write
|
||||
steps:
|
||||
- name: Checkout
|
||||
uses: actions/checkout@v6
|
||||
|
||||
- name: Download client
|
||||
uses: actions/download-artifact@v3
|
||||
uses: actions/download-artifact@v4.1.7
|
||||
with:
|
||||
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@v2
|
||||
uses: docker/setup-qemu-action@v3.2.0
|
||||
|
||||
- name: Set up Docker Buildx
|
||||
uses: docker/setup-buildx-action@v2
|
||||
uses: docker/setup-buildx-action@v3.6.1
|
||||
|
||||
- name: Log in to the Github Container registry
|
||||
uses: docker/login-action@v2
|
||||
uses: docker/login-action@v3.3.0
|
||||
with:
|
||||
registry: ${{ env.REGISTRY }}
|
||||
registry: ghcr.io
|
||||
username: ${{ github.actor }}
|
||||
password: ${{ secrets.GITHUB_TOKEN }}
|
||||
|
||||
- name: Build and cache Docker image
|
||||
uses: docker/build-push-action@v4
|
||||
if: ${{ github.event_name != 'pull_request' }}
|
||||
uses: docker/build-push-action@v6.7.0
|
||||
with:
|
||||
context: .
|
||||
platforms: linux/arm64
|
||||
cache-from: type=registry,ref=${{ env.REGISTRY }}/${{ env.IMAGE_NAME }}:buildcache-arm64
|
||||
cache-to: type=registry,ref=${{ env.REGISTRY }}/${{ env.IMAGE_NAME }}:buildcache-arm64,mode=max
|
||||
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:
|
||||
packages: write
|
||||
steps:
|
||||
- name: Checkout
|
||||
uses: actions/checkout@v3
|
||||
uses: actions/checkout@v6
|
||||
|
||||
- name: Download client
|
||||
uses: actions/download-artifact@v3
|
||||
uses: actions/download-artifact@v4.1.7
|
||||
with:
|
||||
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@v2
|
||||
uses: docker/setup-qemu-action@v3.2.0
|
||||
|
||||
- name: Set up Docker Buildx
|
||||
uses: docker/setup-buildx-action@v2
|
||||
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@v2
|
||||
uses: docker/login-action@v3.3.0
|
||||
with:
|
||||
registry: ${{ env.REGISTRY }}
|
||||
registry: ghcr.io
|
||||
username: ${{ github.actor }}
|
||||
password: ${{ secrets.GITHUB_TOKEN }}
|
||||
|
||||
- name: Build and cache Docker image
|
||||
uses: docker/build-push-action@v4
|
||||
if: ${{ github.event_name != 'pull_request' }}
|
||||
uses: docker/build-push-action@v6.7.0
|
||||
with:
|
||||
context: .
|
||||
platforms: linux/arm/v7
|
||||
cache-from: type=registry,ref=${{ env.REGISTRY }}/${{ env.IMAGE_NAME }}:buildcache-armv7
|
||||
cache-to: type=registry,ref=${{ env.REGISTRY }}/${{ env.IMAGE_NAME }}:buildcache-armv7,mode=max
|
||||
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
|
||||
#
|
||||
# Release image if tests pass
|
||||
# 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@v3
|
||||
uses: actions/checkout@v6
|
||||
|
||||
- name: Download client
|
||||
uses: actions/download-artifact@v3
|
||||
uses: actions/download-artifact@v4.1.7
|
||||
with:
|
||||
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@v2
|
||||
uses: docker/setup-qemu-action@v3.2.0
|
||||
|
||||
- name: Set up Docker Buildx
|
||||
uses: docker/setup-buildx-action@v2
|
||||
uses: docker/setup-buildx-action@v3.6.1
|
||||
|
||||
- name: Log in to the Github Container registry
|
||||
uses: docker/login-action@v2
|
||||
uses: docker/login-action@v3.3.0
|
||||
with:
|
||||
registry: ${{ env.REGISTRY }}
|
||||
registry: ghcr.io
|
||||
username: ${{ github.actor }}
|
||||
password: ${{ secrets.GITHUB_TOKEN }}
|
||||
|
||||
- name: Extract metadata (tags, labels) for Docker
|
||||
id: meta
|
||||
uses: docker/metadata-action@v4
|
||||
# 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
|
||||
with:
|
||||
images: |
|
||||
${{ env.REGISTRY }}/${{ env.IMAGE_NAME }}
|
||||
ghcr.io/${{ env.GHCR_IMAGE }}
|
||||
tags: |
|
||||
type=edge
|
||||
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
|
||||
uses: docker/metadata-action@v5.5.1
|
||||
with:
|
||||
images: |
|
||||
${{ vars.REMOTE_REGISTRY_URL }}/${{ vars.REMOTE_REGISTRY_NAMESPACE }}/${{ vars.REMOTE_REGISTRY_REPOSITORY }}
|
||||
tags: |
|
||||
type=edge
|
||||
type=semver,pattern={{version}}
|
||||
type=semver,pattern={{major}}.{{minor}}
|
||||
type=semver,pattern={{major}}
|
||||
|
||||
- name: Log in to DockerHub
|
||||
uses: docker/login-action@v3.3.0
|
||||
with:
|
||||
registry: ${{ vars.REMOTE_REGISTRY_URL }}
|
||||
username: ${{ secrets.REMOTE_REGISTRY_USERNAME }}
|
||||
password: ${{ secrets.REMOTE_REGISTRY_PASSWORD }}
|
||||
|
||||
- name: Store git commit and build date
|
||||
run: |
|
||||
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
|
||||
uses: docker/build-push-action@v4
|
||||
id: build
|
||||
uses: docker/build-push-action@v6.7.0
|
||||
with:
|
||||
context: .
|
||||
platforms: linux/amd64,linux/arm64,linux/arm/v7
|
||||
push: true
|
||||
tags: ${{ steps.meta.outputs.tags }}
|
||||
labels: ${{ steps.meta.outputs.labels }}
|
||||
tags: |
|
||||
${{ steps.meta-ghcr.outputs.tags }}
|
||||
${{ steps.meta-dh.outputs.tags }}
|
||||
labels: ${{ steps.meta-ghcr.outputs.labels }}
|
||||
build-args: |
|
||||
GIT_COMMIT
|
||||
BUILD_DATE
|
||||
cache-from: |
|
||||
type=registry,ref=${{ env.REGISTRY }}/${{ env.IMAGE_NAME }}:buildcache-amd64
|
||||
type=registry,ref=${{ env.REGISTRY }}/${{ env.IMAGE_NAME }}:buildcache-arm64
|
||||
type=registry,ref=${{ env.REGISTRY }}/${{ env.IMAGE_NAME }}:buildcache-armv7
|
||||
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
|
||||
#
|
||||
publish-release:
|
||||
if: ${{ github.event_name != 'pull_request' }} && startsWith(github.event.ref, 'refs/tags/v')
|
||||
if: ${{ (github.event_name != 'pull_request') && startsWith(github.event.ref, 'refs/tags/v') }}
|
||||
needs: [publish-images]
|
||||
runs-on: ubuntu-latest
|
||||
permissions:
|
||||
contents: write
|
||||
steps:
|
||||
- name: Download built spoolman
|
||||
uses: actions/download-artifact@v3
|
||||
uses: actions/download-artifact@v4.1.7
|
||||
with:
|
||||
name: spoolman
|
||||
path: /tmp/spoolman
|
||||
@@ -383,4 +823,3 @@ jobs:
|
||||
files: /tmp/spoolman/spoolman.zip
|
||||
token: ${{ secrets.GITHUB_TOKEN }}
|
||||
body: "⚠️ TODO ⚠️"
|
||||
|
||||
@@ -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
|
||||
@@ -0,0 +1,38 @@
|
||||
name: Issue Manager
|
||||
|
||||
on:
|
||||
schedule:
|
||||
- cron: "0 0 * * *"
|
||||
issue_comment:
|
||||
types:
|
||||
- created
|
||||
issues:
|
||||
types:
|
||||
- labeled
|
||||
pull_request_target:
|
||||
types:
|
||||
- labeled
|
||||
workflow_dispatch:
|
||||
|
||||
permissions:
|
||||
issues: write
|
||||
pull-requests: write
|
||||
|
||||
jobs:
|
||||
issue-manager:
|
||||
runs-on: ubuntu-latest
|
||||
steps:
|
||||
- uses: tiangolo/issue-manager@0.8.1
|
||||
with:
|
||||
token: ${{ secrets.GITHUB_TOKEN }}
|
||||
config: >
|
||||
{
|
||||
"answered": {
|
||||
"delay": 604800,
|
||||
"message": "It seems the issue was answered, closing this now."
|
||||
},
|
||||
"waiting": {
|
||||
"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
|
||||
@@ -13,34 +13,38 @@ on:
|
||||
- minor
|
||||
- major
|
||||
|
||||
permissions:
|
||||
contents: write
|
||||
|
||||
jobs:
|
||||
bump-version:
|
||||
runs-on: ubuntu-latest
|
||||
steps:
|
||||
steps:
|
||||
- name: Checkout
|
||||
uses: actions/checkout@v4
|
||||
uses: actions/checkout@v6
|
||||
with:
|
||||
token: ${{ secrets.PAT }}
|
||||
|
||||
- name: Set up Python
|
||||
uses: actions/setup-python@v4
|
||||
|
||||
- name: Install uv
|
||||
uses: astral-sh/setup-uv@v7
|
||||
with:
|
||||
python-version: "3.9"
|
||||
version: "0.9.26"
|
||||
|
||||
- name: "Set up Python"
|
||||
uses: actions/setup-python@v6
|
||||
with:
|
||||
python-version-file: "pyproject.toml"
|
||||
|
||||
- name: Install node
|
||||
uses: actions/setup-node@v3
|
||||
uses: actions/setup-node@v4.0.3
|
||||
with:
|
||||
node-version: '20'
|
||||
node-version: '24'
|
||||
|
||||
- name: Setup PDM
|
||||
run: |
|
||||
pip install pdm pdm-bump
|
||||
|
||||
- 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"
|
||||
pdm run bump ${{ 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"
|
||||
@@ -15,7 +15,6 @@ dist/
|
||||
downloads/
|
||||
eggs/
|
||||
.eggs/
|
||||
lib/
|
||||
lib64/
|
||||
parts/
|
||||
sdist/
|
||||
@@ -26,6 +25,8 @@ share/python-wheels/
|
||||
.installed.cfg
|
||||
*.egg
|
||||
MANIFEST
|
||||
# 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
|
||||
@@ -200,6 +201,10 @@ $RECYCLE.BIN/
|
||||
|
||||
### VisualStudioCode ###
|
||||
.vscode/
|
||||
|
||||
data/
|
||||
devdata
|
||||
.pdm-python
|
||||
.history
|
||||
.claude
|
||||
|
||||
# playwright-cli debug artifacts
|
||||
.playwright-cli/
|
||||
@@ -1,24 +0,0 @@
|
||||
default_language_version:
|
||||
python: python3.9
|
||||
repos:
|
||||
- repo: https://github.com/pre-commit/pre-commit-hooks
|
||||
rev: v4.4.0
|
||||
hooks:
|
||||
- id: check-yaml
|
||||
- id: check-added-large-files
|
||||
- id: check-case-conflict
|
||||
- id: check-merge-conflict
|
||||
- repo: https://github.com/psf/black
|
||||
rev: 23.3.0
|
||||
hooks:
|
||||
- id: black
|
||||
args: ["--check"]
|
||||
- repo: https://github.com/astral-sh/ruff-pre-commit
|
||||
rev: v0.0.286
|
||||
hooks:
|
||||
- id: ruff
|
||||
args: ["--target-version", "py39"]
|
||||
- repo: https://github.com/pdm-project/pdm
|
||||
rev: 2.7.4
|
||||
hooks:
|
||||
- id: pdm-lock-check
|
||||
@@ -1,47 +1,75 @@
|
||||
FROM python:3.11-alpine as python-builder
|
||||
FROM python:3.14-slim-bookworm AS python-builder
|
||||
|
||||
RUN apk add --no-cache g++ python3-dev libpq-dev libstdc++ shadow
|
||||
ENV UV_COMPILE_BYTECODE=1
|
||||
ENV UV_LINK_MODE=copy
|
||||
ENV UV_NO_DEV=1
|
||||
ENV UV_PYTHON_DOWNLOADS=0
|
||||
|
||||
# Add local user so we don't run as root
|
||||
RUN groupmod -g 1000 users \
|
||||
&& useradd -u 911 -U app \
|
||||
&& usermod -G users app
|
||||
# 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++ \
|
||||
libpq-dev \
|
||||
libffi-dev \
|
||||
patchelf \
|
||||
&& apt-get clean \
|
||||
&& rm -rf /var/lib/apt/lists/*
|
||||
|
||||
ENV PATH="/home/app/.local/bin:${PATH}"
|
||||
# Install UV
|
||||
RUN pip install --no-cache-dir uv
|
||||
|
||||
# Install PDM
|
||||
RUN pip install pip setuptools wheel\
|
||||
&& pip install pdm
|
||||
|
||||
# Copy and install dependencies
|
||||
COPY --chown=app:app pyproject.toml /home/app/spoolman/
|
||||
COPY --chown=app:app pdm.lock /home/app/spoolman/
|
||||
# Install dependencies
|
||||
WORKDIR /home/app/spoolman
|
||||
RUN pdm sync --prod --no-editable
|
||||
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 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 /home/app/spoolman/
|
||||
COPY --chown=app:app README.md /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
|
||||
|
||||
FROM python:3.11-alpine as python-runner
|
||||
# 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 cache prune --ci
|
||||
|
||||
FROM python:3.14-slim-bookworm AS python-runner
|
||||
|
||||
LABEL org.opencontainers.image.source=https://github.com/Donkie/Spoolman
|
||||
LABEL org.opencontainers.image.description="Keep track of your inventory of 3D-printer filament spools."
|
||||
LABEL org.opencontainers.image.licenses=MIT
|
||||
|
||||
RUN apk add --no-cache libstdc++ su-exec shadow
|
||||
# Install gosu for privilege dropping
|
||||
RUN apt-get update && apt-get install -y \
|
||||
gosu \
|
||||
&& 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 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
|
||||
@@ -52,14 +80,16 @@ RUN chmod +x /home/app/spoolman/entrypoint.sh
|
||||
WORKDIR /home/app/spoolman
|
||||
|
||||
ENV PATH="/home/app/spoolman/.venv/bin:${PATH}"
|
||||
ENV PYTHONPATH="/home/app/spoolman:${PYTHONPATH}"
|
||||
|
||||
ARG GIT_COMMIT=unknown
|
||||
ARG BUILD_DATE=unknown
|
||||
ENV GIT_COMMIT=${GIT_COMMIT}
|
||||
ENV BUILD_DATE=${BUILD_DATE}
|
||||
|
||||
# Write GIT_COMMIT and BUILD_DATE to a build.txt file
|
||||
RUN echo "GIT_COMMIT=${GIT_COMMIT}" > build.txt \
|
||||
&& echo "BUILD_DATE=${BUILD_DATE}" >> build.txt
|
||||
|
||||
# Run command
|
||||
EXPOSE 8000
|
||||
ENTRYPOINT ["/home/app/spoolman/entrypoint.sh"]
|
||||
CMD ["--host", "0.0.0.0", "--port", "8000"]
|
||||
@@ -4,184 +4,63 @@
|
||||
<img alt="Icon of a filament spool" src="https://github.com/Donkie/Spoolman/assets/2332094/3c120b3a-1422-42f6-a16b-8d5a07c33000">
|
||||
</picture>
|
||||
|
||||
<br/><br/>
|
||||
<br/>
|
||||
|
||||
_Keep track of your inventory of 3D-printer filament spools._
|
||||
|
||||
Spoolman is a web service that helps you keep track of your filament spools and how they are being used.
|
||||
Spoolman is a self-hosted web service designed to help you efficiently manage your 3D printer filament spools and monitor their usage. It acts as a centralized database that seamlessly integrates with popular 3D printing software like [OctoPrint](https://octoprint.org/) and [Klipper](https://www.klipper3d.org/)/[Moonraker](https://moonraker.readthedocs.io/en/latest/). When connected, it automatically updates spool weights as printing progresses, giving you real-time insights into filament usage.
|
||||
|
||||
It acts as a database, where other printer software such as Octoprint and Moonraker can interact with to have a centralized place for spool information.
|
||||
For example, if used together with Moonraker, your spool weight will automatically be reduced as your print is progressing.
|
||||
[](https://github.com/Donkie/Spoolman/wiki)
|
||||
[](https://github.com/Donkie/Spoolman/releases)
|
||||
[](https://github.com/sponsors/Donkie)
|
||||
|
||||
It exposes a HTTP API which services can interact with. See the [OpenAPI description](https://donkie.github.io/Spoolman/) for more information.
|
||||
### Features
|
||||
* **Filament Management**: Keep comprehensive records of filament types, manufacturers, and individual spools.
|
||||
* **API Integration**: The [REST API](https://donkie.github.io/Spoolman/) allows easy integration with other software, facilitating automated workflows and data exchange.
|
||||
* **Real-Time Updates**: Stay informed with live spool updates through Websockets, providing immediate feedback during printing operations.
|
||||
* **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.
|
||||
* 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.
|
||||
* **Advanced Monitoring**: Integrate with [Prometheus](https://prometheus.io/) for detailed historical analysis of filament usage, helping you track and optimize your printing processes. See the [Wiki](https://github.com/Donkie/Spoolman/wiki/Filament-Usage-History) for instructions on how to set it up.
|
||||
|
||||
## Client
|
||||
Spoolman includes a web-client that lets you directly manipulate all the data. It also has a few additional nice features such as label printing.
|
||||
**Spoolman integrates with:**
|
||||
* [Moonraker](https://moonraker.readthedocs.io/en/latest/configuration/#spoolman) and most front-ends (Fluidd, KlipperScreen, Mainsail, ...)
|
||||
* [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:**
|
||||

|
||||
|
||||
<picture>
|
||||
<source media="(prefers-color-scheme: dark)" srcset="https://hosted.weblate.org/widget/spoolman/287x66-black.png">
|
||||
<source media="(prefers-color-scheme: light)" srcset="https://hosted.weblate.org/widget/spoolman/287x66-white.png">
|
||||
<img alt="Icon of a filament spool" src="https://hosted.weblate.org/widget/spoolman/287x66-white.png">
|
||||
</picture>
|
||||
|
||||
_The web client is translated by the community using [Weblate](https://hosted.weblate.org/projects/spoolman/)._
|
||||
|
||||
## Integration status
|
||||
Spoolman doesn't depend on any specific printer software, but to make the most out of it, you should use it together with a frontend that supports it.
|
||||
It is currently only supported in the Klipper ecosystem, with official support for the major frontends. Support for other ecosystems like Octoprint is ongoing.
|
||||
|
||||
* ✔️ Moonraker - See the [Moonraker Documentation](https://moonraker.readthedocs.io/en/latest/configuration/#spoolman)
|
||||
* ✔️ Fluidd
|
||||
* ✔️ KlipperScreen
|
||||
* ✔️ Mainsail
|
||||
* ✖️ Octoprint - A plugin is in progress: [OctoPrint-Spoolman](https://github.com/mkevenaar/OctoPrint-Spoolman)
|
||||
* ✔️ Home Assistant integration (https://github.com/Disane87/spoolman-homeassistant)
|
||||
<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
|
||||
Spoolman can interact with any of the following databases: SQLite, PostgreSQL, MySQL, MariaDB, CockroachDB.
|
||||
By default, SQLite is used which is a simple no-install database solution that saves to a single .db file located in the server's user directory.
|
||||
Please see the [Installation page on the Wiki](https://github.com/Donkie/Spoolman/wiki/Installation) for details how to install Spoolman.
|
||||
|
||||
Spoolman can be installed in two ways, either standalone on your machine or using Docker. If you already have Docker installed, it's recommended to use that.
|
||||
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.
|
||||
|
||||
### Standalone
|
||||
This installation guide assumes you are using a Debian-based Linux distribution such as Ubuntu or Raspberry Pi OS. If you are using another distribution, please look inside the bash scripts to see what commands are being run and adapt them to your distribution.
|
||||
## 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).
|
||||
|
||||
Copy-paste the entire below command and run it on your machine to install Spoolman.
|
||||
```bash
|
||||
sudo apt-get update && \
|
||||
sudo apt-get install -y curl jq && \
|
||||
mkdir -p ./Spoolman && \
|
||||
source_url=$(curl -s https://api.github.com/repos/Donkie/Spoolman/releases/latest | jq -r '.assets[] | select(.name == "spoolman.zip").browser_download_url') && \
|
||||
curl -sSL $source_url -o temp.zip && unzip temp.zip -d ./Spoolman && rm temp.zip && \
|
||||
cd ./Spoolman && \
|
||||
bash ./scripts/install_debian.sh
|
||||
```
|
||||
|
||||
#### Updating
|
||||
Updating Spoolman is quite simple. If you use the default database type, SQLite, it is stored outside of the installation folder (in `~/.local/share/spoolman`), so you will not lose any data by moving to a new installation folder.
|
||||
|
||||
Copy-paste the entire below commands and run it on your machine to update Spoolman to the latest version. The command assumes your existing Spoolman folder is named `Spoolman` and is located in your current directory.
|
||||
```bash
|
||||
# Stop and disable the old Spoolman service
|
||||
sudo systemctl stop Spoolman
|
||||
sudo systemctl disable Spoolman
|
||||
systemctl --user stop Spoolman
|
||||
systemctl --user disable Spoolman
|
||||
|
||||
# Download and install the new version
|
||||
mv Spoolman Spoolman_old && \
|
||||
mkdir -p ./Spoolman && \
|
||||
source_url=$(curl -s https://api.github.com/repos/Donkie/Spoolman/releases/latest | jq -r '.assets[] | select(.name == "spoolman.zip").browser_download_url') && \
|
||||
curl -sSL $source_url -o temp.zip && unzip temp.zip -d ./Spoolman && rm temp.zip && \
|
||||
cp Spoolman_old/.env Spoolman/.env && \
|
||||
cd ./Spoolman && \
|
||||
bash ./scripts/install_debian.sh && \
|
||||
rm -rf ../Spoolman_old
|
||||
```
|
||||
|
||||
### Using Docker
|
||||
You can also run Spoolman using Docker. Docker is a platform for developing, shipping, and running applications in containers. Containers are lightweight, portable, and self-contained environments that can run on any machine with Docker installed.
|
||||
|
||||
To install Docker on your machine, follow the instructions for your operating system on the [Docker website](https://docs.docker.com/engine/install/). Docker also includes the docker-compose tool which lets you configure the container deployment in a simple yaml file, without having to remember all the command line options. Note: older versions of docker-compose require you to have a dash (`-`) in the following commands, like `docker-compose` instead of `docker compose`.
|
||||
|
||||
Here is a sample docker-compose config to get you started. Copy-paste it into a file called `docker-compose.yml` and run `docker compose up -d` to start it. If you want to use the SQLite database as in this sample, you must first create a folder called `data` in the same directory as the `docker-compose.yml`, then you should run `chown 1000:1000 data` on it in order to give it the correct permissions for the user inside the docker container.
|
||||
```yaml
|
||||
version: '3.8'
|
||||
services:
|
||||
spoolman:
|
||||
image: ghcr.io/donkie/spoolman:latest
|
||||
restart: unless-stopped
|
||||
volumes:
|
||||
# Mount the host machine's ./data directory into the container's /home/app/.local/share/spoolman directory
|
||||
- type: bind
|
||||
source: ./data # This is where the data will be stored locally. Could also be set to for example `source: /home/pi/printer_data/spoolman`.
|
||||
target: /home/app/.local/share/spoolman # Do NOT change this line
|
||||
ports:
|
||||
# Map the host machine's port 7912 to the container's port 8000
|
||||
- "7912:8000"
|
||||
environment:
|
||||
- TZ=Europe/Stockholm # Optional, defaults to UTC
|
||||
```
|
||||
Once you have it up and running, you can access the web UI by browsing to `http://your.ip:7912`. Make sure that the data folder you created now contains a `spoolman.db` file. If you cannot find this file in your machine, then **your data will be lost** every time you update Spoolman.
|
||||
|
||||
#### Updating
|
||||
If a new version of Spoolman has been released, you can update to it by first browsing to the directory where you have the `docker-compose.yml` file and then running `docker compose pull && docker compose up -d`.
|
||||
|
||||
### Environment variables
|
||||
These are either set in the .env file if you use the standalone installation, or in the docker-compose.yml if you use Docker.
|
||||
|
||||
If you want to connect with an external database instead, specify the `SPOOLMAN_DB_*` environment variables from the table below.
|
||||
|
||||
| Variable | Description |
|
||||
| ------------------------- | ---------------------------------------------------------------------------------------------------------------------------- |
|
||||
| SPOOLMAN_DB_TYPE | Type of database, any of: `postgres`, `mysql`, `sqlite`, `cockroachdb` |
|
||||
| SPOOLMAN_DB_HOST | Database hostname |
|
||||
| SPOOLMAN_DB_PORT | Database port |
|
||||
| SPOOLMAN_DB_NAME | Database name |
|
||||
| SPOOLMAN_DB_USERNAME | Database username |
|
||||
| SPOOLMAN_DB_PASSWORD_FILE | Path of file which contains the database password. Can be used instead of SPOOLMAN_DB_PASSWORD if desired. |
|
||||
| SPOOLMAN_DB_PASSWORD | Database password |
|
||||
| SPOOLMAN_DB_QUERY | Query parameters for the database connection, e.g. set to `unix_socket=/path/to/mysql.sock` to connect using a MySQL socket. |
|
||||
| SPOOLMAN_LOGGING_LEVEL | Logging level, any of: `CRITICAL`, `ERROR`, `WARNING`, `INFO`, `DEBUG`, defaults to `INFO`. |
|
||||
| SPOOLMAN_AUTOMATIC_BACKUP | Automatic nightly DB backups for SQLite databases. Enabled by default, set to `FALSE` to disable. |
|
||||
| PUID | (*docker only*) Set the UID of the user in the docker container. Default is 1000. |
|
||||
| PGID | (*docker only*) Set the GID of the user in the docker container. Default is 1000. |
|
||||
|
||||
## Frequently Asked Questions (FAQs)
|
||||
### QR Code Does not work on HTTP / The page is not served over HTTPS
|
||||
This is a limitation of the browsers. Browsers require a secure connection to the server to enable HTTPS. This is not a limitation of Spoolman. For more information read this [blog](https://blog.mozilla.org/webrtc/camera-microphone-require-https-in-firefox-68/) from Mozilla.
|
||||
|
||||
You can put Spoolman behind a reverse proxy like Caddy or Nginx to enable HTTPS. See for example [this guide](https://caddyserver.com/docs/quick-starts/reverse-proxy) for Caddy.
|
||||
|
||||
### Can Spoolman be translated into my language?
|
||||
Yes, head over to [Weblate](https://hosted.weblate.org/projects/spoolman/) to start the Translation
|
||||
|
||||
## Development
|
||||
### Server/Backend (Python)
|
||||
The Python backend runs on Python 3.9. It's built on FastAPI for the REST API, and SQLAlchemy to handle the databases.
|
||||
|
||||
To setup yourself for Python development, do the following:
|
||||
1. Clone this repo
|
||||
2. CD into the repo
|
||||
3. Install PDM: `pip install --user pdm`
|
||||
4. Install Spoolman dependencies: `pdm sync`
|
||||
|
||||
And you should be all setup. Read the Style and Integration Testing sections below as well.
|
||||
|
||||
#### Style
|
||||
[Black](https://black.readthedocs.io/en/stable/) and [Ruff](https://docs.astral.sh/ruff/) is used to ensure a consistent style and good code quality. You can install extensions in your editor to make them run automatically.
|
||||
|
||||
[Pre-commit](https://pre-commit.com/) is used to ensure the style is maintained for each commit. You can setup pre-commit by simply running the following in the Spoolman root directory:
|
||||
```
|
||||
pip install pre-commit
|
||||
pre-commit install
|
||||
```
|
||||
|
||||
#### Integration Testing
|
||||
The entire REST API is integration tested using an isolated docker container, with all 4 database types that we support (Postgres, MySQL, SQLite and CockroachDB). These integration tests live in `tests_integration/`. They are designed to "use" the REST API in the same way that a client would, and ensures that everything remains consistent between updates. The databases are created as part of the integration testing, so no external database is needed to run them.
|
||||
|
||||
If you have docker installed, you can run the integration tests using `pdm run itest` for all databases, or e.g. `pdm run itest postgres` for a single database.
|
||||
|
||||
|
||||
### Client (Node/React/Typescript)
|
||||
The client is a React-based web client, built using the [refine.dev](https://refine.dev) framework, with Ant Design as the components.
|
||||
|
||||
To test out changes to the web client, the best way is to run it in development mode.
|
||||
|
||||
Prerequisites:
|
||||
* NodeJS 20 or above installed, along with NPM. Running `node --version` should print a correct version.
|
||||
* A running Spoolman server, with the following two environment variables added in the `docker-compose.yml`:
|
||||
```yaml
|
||||
environment:
|
||||
- FORWARDED_ALLOW_IPS=*
|
||||
- SPOOLMAN_DEBUG_MODE=TRUE
|
||||
```
|
||||
|
||||
Instructions:
|
||||
1. Open a terminal and CD to the `client` subdirectory
|
||||
2. Run `npm install`. If it doesn't succeed, you probably have an incorrect node version. Spoolman is only tested on NodeJS 20.
|
||||
3. Run `echo "VITE_APIURL=http://192.168.0.123:7901/api/v1" > .env`, where the ip:port is the address of the running Spoolman server. This should create a `.env` file in the `client` directory. If you don't already have one running on your network, you can start one up using the `docker-compose.yml` showed above.
|
||||
4. Run `npm run dev`. The terminal will print a "Local: xxxx" URL, open that in your browser and the web client should show up. Your existing spools etc in your Spoolman database should be loaded in.
|
||||
5. Any edits in .ts/.tsx files will be automatically reloaded in your browser. If you make any change to .json files you will need to F5 in your browser.
|
||||
<a href="https://github.com/sponsors/Donkie">
|
||||
<img alt="The people currently sponsoring Spoolman" src=".github/media/sponsors.svg">
|
||||
</a>
|
||||
@@ -1,16 +0,0 @@
|
||||
/* eslint-env node */
|
||||
|
||||
module.exports = {
|
||||
env: { browser: true, es2020: true },
|
||||
extends: [
|
||||
"eslint:recommended",
|
||||
"plugin:@typescript-eslint/recommended",
|
||||
"plugin:react-hooks/recommended",
|
||||
],
|
||||
parser: "@typescript-eslint/parser",
|
||||
parserOptions: { ecmaVersion: "latest", sourceType: "module" },
|
||||
plugins: ["react-refresh"],
|
||||
rules: {
|
||||
"react-refresh/only-export-components": "warn",
|
||||
},
|
||||
};
|
||||
@@ -7,6 +7,7 @@
|
||||
|
||||
# testing
|
||||
/coverage
|
||||
/dev-dist
|
||||
|
||||
# production
|
||||
/build
|
||||
@@ -17,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*
|
||||
|
||||
@@ -0,0 +1,6 @@
|
||||
public/locales
|
||||
dist
|
||||
dev-dist
|
||||
node_modules
|
||||
.vscode
|
||||
.vite
|
||||
@@ -1,5 +1,6 @@
|
||||
{
|
||||
"printWidth": 120,
|
||||
"endOfLine": "auto",
|
||||
"overrides": [
|
||||
{
|
||||
"files": ["public/locales/**/*.json"],
|
||||
|
||||
@@ -0,0 +1,23 @@
|
||||
import js from "@eslint/js";
|
||||
import eslintConfigPrettier from "eslint-config-prettier/flat";
|
||||
import reactPlugin from "eslint-plugin-react";
|
||||
import reactHooks from "eslint-plugin-react-hooks";
|
||||
import reactRefresh from "eslint-plugin-react-refresh";
|
||||
import { defineConfig, globalIgnores } from "eslint/config";
|
||||
import globals from "globals";
|
||||
import tseslint from "typescript-eslint";
|
||||
|
||||
export default defineConfig([
|
||||
globalIgnores(["node_modules/", "dist/", "dev-dist/"]),
|
||||
{
|
||||
files: ["**/*.{js,mjs,cjs,ts,mts,cts,jsx,tsx}"],
|
||||
plugins: { js, reactHooks, reactRefresh },
|
||||
extends: ["js/recommended"],
|
||||
languageOptions: { globals: globals.browser },
|
||||
settings: { react: { version: "detect" } },
|
||||
},
|
||||
tseslint.configs.recommended,
|
||||
reactPlugin.configs.flat.recommended,
|
||||
reactPlugin.configs.flat["jsx-runtime"],
|
||||
eslintConfigPrettier,
|
||||
]);
|
||||
@@ -1,93 +1 @@
|
||||
<?xml version="1.0" encoding="UTF-8" standalone="no"?>
|
||||
<svg
|
||||
version="1.1"
|
||||
width="235"
|
||||
height="500"
|
||||
viewBox="0 0 235 500"
|
||||
xml:space="preserve"
|
||||
id="svg5"
|
||||
sodipodi:docname="spool.svg"
|
||||
inkscape:version="1.3 (0e150ed6c4, 2023-07-21)"
|
||||
xmlns:inkscape="http://www.inkscape.org/namespaces/inkscape"
|
||||
xmlns:sodipodi="http://sodipodi.sourceforge.net/DTD/sodipodi-0.dtd"
|
||||
xmlns="http://www.w3.org/2000/svg"
|
||||
xmlns:svg="http://www.w3.org/2000/svg"><sodipodi:namedview
|
||||
id="namedview5"
|
||||
pagecolor="#ffffff"
|
||||
bordercolor="#000000"
|
||||
borderopacity="0.25"
|
||||
inkscape:showpageshadow="2"
|
||||
inkscape:pageopacity="0.0"
|
||||
inkscape:pagecheckerboard="true"
|
||||
inkscape:deskcolor="#d1d1d1"
|
||||
inkscape:zoom="1.6588725"
|
||||
inkscape:cx="132.92161"
|
||||
inkscape:cy="209.47963"
|
||||
inkscape:window-width="1350"
|
||||
inkscape:window-height="1237"
|
||||
inkscape:window-x="1189"
|
||||
inkscape:window-y="48"
|
||||
inkscape:window-maximized="0"
|
||||
inkscape:current-layer="svg5" /> <desc
|
||||
id="desc1">Created with Fabric.js 5.3.0</desc> <defs
|
||||
id="defs1"> </defs> <path
|
||||
style="stroke:rgb(110, 11, 48);stroke-width:0;stroke-dasharray:none;stroke-linecap:butt;stroke-dashoffset:0;stroke-linejoin:miter;stroke-miterlimit:4;fill:rgb(52, 52, 52);fill-rule:nonzero;opacity:1"
|
||||
vector-effect="non-scaling-stroke"
|
||||
transform="matrix(0.58757483,0,0,3.9476902,197.13549,250.04675)"
|
||||
d="M 0 -63.26949 C 34.92476 -63.26949 63.26949 -34.92476 63.26949 0 C 63.26949 34.92476 34.92476 63.26949 0 63.26949 C -34.92476 63.26949 -63.26949 34.92476 -63.26949 0 C -63.26949 -34.92476 -34.92476 -63.26949 0 -63.26949 z"
|
||||
stroke-linecap="round"
|
||||
id="path1"
|
||||
inkscape:label="rightside" /><path
|
||||
style="stroke:rgb(110, 11, 48);stroke-width:0;stroke-dasharray:none;stroke-linecap:butt;stroke-dashoffset:0;stroke-linejoin:miter;stroke-miterlimit:4;fill:rgb(255, 0, 0);fill-rule:nonzero;opacity:1"
|
||||
vector-effect="non-scaling-stroke"
|
||||
transform="matrix(0.38157612,0,0,3.4623174,197.13549,250.04674)"
|
||||
d="M 0 -63.26949 C 34.92476 -63.26949 63.26949 -34.92476 63.26949 0 C 63.26949 34.92476 34.92476 63.26949 0 63.26949 C -34.92476 63.26949 -63.26949 34.92476 -63.26949 0 C -63.26949 -34.92476 -34.92476 -63.26949 0 -63.26949 z"
|
||||
stroke-linecap="round"
|
||||
id="path2"
|
||||
inkscape:label="filament_right" /><path
|
||||
style="stroke:rgb(0, 0, 0);stroke-width:0;stroke-dasharray:none;stroke-linecap:butt;stroke-dashoffset:0;stroke-linejoin:miter;stroke-miterlimit:4;fill:rgb(255, 0, 0);fill-rule:nonzero;opacity:1"
|
||||
vector-effect="non-scaling-stroke"
|
||||
transform="matrix(2.073642,0,0,3.3577086,117.29471,250.04674)"
|
||||
d="M -38.50267 -65.24064 L 38.502680000000005 -65.24064 L 38.502680000000005 65.24064 L -38.50267 65.24064 z"
|
||||
stroke-linecap="round"
|
||||
id="path3"
|
||||
inkscape:label="filament_main" /><g
|
||||
transform="matrix(0.58757483,0,0,3.9476902,37.453957,250.04674)"
|
||||
id="OvgM38-6CZm9R47a1TDIX"
|
||||
inkscape:label="fg"> <filter
|
||||
id="SVGID_1"
|
||||
y="-0.056899467"
|
||||
height="1.1137989"
|
||||
x="-0.056899467"
|
||||
width="1.271853"> <feGaussianBlur
|
||||
in="SourceAlpha"
|
||||
stdDeviation="3"
|
||||
id="feGaussianBlur3" /> <feOffset
|
||||
dx="20"
|
||||
dy="0"
|
||||
result="oBlur"
|
||||
id="feOffset3" /> <feFlood
|
||||
flood-color="rgb(0,0,0)"
|
||||
flood-opacity="0.67"
|
||||
id="feFlood3" /> <feComposite
|
||||
in2="oBlur"
|
||||
operator="in"
|
||||
id="feComposite3" /> <feMerge
|
||||
id="feMerge4"> <feMergeNode
|
||||
id="feMergeNode3" /> <feMergeNode
|
||||
in="SourceGraphic"
|
||||
id="feMergeNode4" /> </feMerge> </filter> <path
|
||||
style="stroke:rgb(110, 11, 48);stroke-width:0;stroke-dasharray:none;stroke-linecap:butt;stroke-dashoffset:0;stroke-linejoin:miter;stroke-miterlimit:4;fill:rgb(52, 52, 52);fill-rule:nonzero;opacity:1;filter:url(#SVGID_1)"
|
||||
vector-effect="non-scaling-stroke"
|
||||
transform="translate(8.4959392e-7)"
|
||||
d="M 0 -63.26949 C 34.92476 -63.26949 63.26949 -34.92476 63.26949 0 C 63.26949 34.92476 34.92476 63.26949 0 63.26949 C -34.92476 63.26949 -63.26949 34.92476 -63.26949 0 C -63.26949 -34.92476 -34.92476 -63.26949 0 -63.26949 z"
|
||||
stroke-linecap="round"
|
||||
id="path4"
|
||||
inkscape:label="leftside" /><path
|
||||
style="stroke:rgb(110, 11, 48);stroke-width:0;stroke-dasharray:none;stroke-linecap:butt;stroke-dashoffset:0;stroke-linejoin:miter;stroke-miterlimit:4;fill:rgb(17, 17, 17);fill-rule:nonzero;opacity:1"
|
||||
vector-effect="non-scaling-stroke"
|
||||
transform="scale(0.41451706)"
|
||||
d="M 0 -63.26949 C 34.92476 -63.26949 63.26949 -34.92476 63.26949 0 C 63.26949 34.92476 34.92476 63.26949 0 63.26949 C -34.92476 63.26949 -63.26949 34.92476 -63.26949 0 C -63.26949 -34.92476 -34.92476 -63.26949 0 -63.26949 z"
|
||||
stroke-linecap="round"
|
||||
id="path5"
|
||||
inkscape:label="hole" /></g> </svg>
|
||||
<svg xmlns="http://www.w3.org/2000/svg" xmlns:svg="http://www.w3.org/2000/svg" id="svg5" width="235" height="500" version="1.1" viewBox="0 0 235 500" xml:space="preserve"><desc id="desc1">Created with Fabric.js 5.3.0</desc><path style="stroke:#6e0b30;stroke-width:0;stroke-dasharray:none;stroke-linecap:butt;stroke-dashoffset:0;stroke-linejoin:miter;stroke-miterlimit:4;fill:#343434;fill-rule:nonzero;opacity:1" id="path1" stroke-linecap="round" d="M 0 -63.26949 C 34.92476 -63.26949 63.26949 -34.92476 63.26949 0 C 63.26949 34.92476 34.92476 63.26949 0 63.26949 C -34.92476 63.26949 -63.26949 34.92476 -63.26949 0 C -63.26949 -34.92476 -34.92476 -63.26949 0 -63.26949 z" transform="matrix(0.58757483,0,0,3.9476902,197.13549,250.04675)" vector-effect="non-scaling-stroke"/><path style="stroke:#6e0b30;stroke-width:0;stroke-dasharray:none;stroke-linecap:butt;stroke-dashoffset:0;stroke-linejoin:miter;stroke-miterlimit:4;fill:red;fill-rule:nonzero;opacity:1" id="path2" stroke-linecap="round" d="M 0 -63.26949 C 34.92476 -63.26949 63.26949 -34.92476 63.26949 0 C 63.26949 34.92476 34.92476 63.26949 0 63.26949 C -34.92476 63.26949 -63.26949 34.92476 -63.26949 0 C -63.26949 -34.92476 -34.92476 -63.26949 0 -63.26949 z" transform="matrix(0.38157612,0,0,3.4623174,197.13549,250.04674)" vector-effect="non-scaling-stroke"/><path style="stroke:#000;stroke-width:0;stroke-dasharray:none;stroke-linecap:butt;stroke-dashoffset:0;stroke-linejoin:miter;stroke-miterlimit:4;fill:red;fill-rule:nonzero;opacity:1" id="path3" stroke-linecap="round" d="M -38.50267 -65.24064 L 38.502680000000005 -65.24064 L 38.502680000000005 65.24064 L -38.50267 65.24064 z" transform="matrix(2.073642,0,0,3.3577086,117.29471,250.04674)" vector-effect="non-scaling-stroke"/><g id="OvgM38-6CZm9R47a1TDIX" transform="matrix(0.58757483,0,0,3.9476902,37.453957,250.04674)"><filter id="SVGID_1" width="1.272" height="1.114" x="-.057" y="-.057"><feGaussianBlur id="feGaussianBlur3" in="SourceAlpha" stdDeviation="3"/><feOffset id="feOffset3" dx="20" dy="0" result="oBlur"/><feFlood id="feFlood3" flood-color="#000" flood-opacity=".67"/><feComposite id="feComposite3" in2="oBlur" operator="in"/><feMerge id="feMerge4"><feMergeNode id="feMergeNode3"/><feMergeNode id="feMergeNode4" in="SourceGraphic"/></feMerge></filter><path style="stroke:#6e0b30;stroke-width:0;stroke-dasharray:none;stroke-linecap:butt;stroke-dashoffset:0;stroke-linejoin:miter;stroke-miterlimit:4;fill:#343434;fill-rule:nonzero;opacity:1;filter:url(#SVGID_1)" id="path4" stroke-linecap="round" d="M 0 -63.26949 C 34.92476 -63.26949 63.26949 -34.92476 63.26949 0 C 63.26949 34.92476 34.92476 63.26949 0 63.26949 C -34.92476 63.26949 -63.26949 34.92476 -63.26949 0 C -63.26949 -34.92476 -34.92476 -63.26949 0 -63.26949 z" transform="translate(8.4959392e-7)" vector-effect="non-scaling-stroke"/><path style="stroke:#6e0b30;stroke-width:0;stroke-dasharray:none;stroke-linecap:butt;stroke-dashoffset:0;stroke-linejoin:miter;stroke-miterlimit:4;fill:#111;fill-rule:nonzero;opacity:1" id="path5" stroke-linecap="round" d="M 0 -63.26949 C 34.92476 -63.26949 63.26949 -34.92476 63.26949 0 C 63.26949 34.92476 34.92476 63.26949 0 63.26949 C -34.92476 63.26949 -63.26949 34.92476 -63.26949 0 C -63.26949 -34.92476 -34.92476 -63.26949 0 -63.26949 z" transform="scale(0.41451706)" vector-effect="non-scaling-stroke"/></g></svg>
|
||||
|
Before Width: | Height: | Size: 4.7 KiB After Width: | Height: | Size: 3.3 KiB |
@@ -1,89 +1 @@
|
||||
<?xml version="1.0" encoding="UTF-8" standalone="no"?>
|
||||
<svg
|
||||
version="1.1"
|
||||
width="220"
|
||||
height="220"
|
||||
viewBox="0 0 220 220"
|
||||
xml:space="preserve"
|
||||
id="svg8"
|
||||
sodipodi:docname="spoolman.svg"
|
||||
inkscape:version="1.3 (0e150ed6c4, 2023-07-21)"
|
||||
xmlns:inkscape="http://www.inkscape.org/namespaces/inkscape"
|
||||
xmlns:sodipodi="http://sodipodi.sourceforge.net/DTD/sodipodi-0.dtd"
|
||||
xmlns="http://www.w3.org/2000/svg"
|
||||
xmlns:svg="http://www.w3.org/2000/svg"><sodipodi:namedview
|
||||
id="namedview8"
|
||||
pagecolor="#ffffff"
|
||||
bordercolor="#000000"
|
||||
borderopacity="0.25"
|
||||
inkscape:showpageshadow="2"
|
||||
inkscape:pageopacity="0.0"
|
||||
inkscape:pagecheckerboard="true"
|
||||
inkscape:deskcolor="#d1d1d1"
|
||||
inkscape:zoom="5.3318182"
|
||||
inkscape:cx="110"
|
||||
inkscape:cy="106.53026"
|
||||
inkscape:window-width="1898"
|
||||
inkscape:window-height="1360"
|
||||
inkscape:window-x="868"
|
||||
inkscape:window-y="0"
|
||||
inkscape:window-maximized="0"
|
||||
inkscape:current-layer="svg8" /> <desc
|
||||
id="desc1">Created with Fabric.js 5.3.0</desc> <defs
|
||||
id="defs1"> </defs> <path
|
||||
style="stroke:rgb(0, 0, 0);stroke-width:0;stroke-dasharray:none;stroke-linecap:butt;stroke-dashoffset:0;stroke-linejoin:miter;stroke-miterlimit:4;fill:rgb(220, 119, 52);fill-rule:nonzero;opacity:1"
|
||||
vector-effect="non-scaling-stroke"
|
||||
transform="matrix(0.941963,0,0,0.941963,110,110)"
|
||||
d="M -116.77741 -67.23295 C -116.77741 -94.5956 -94.5956 -116.77741 -67.23295 -116.77741 L 67.23295 -116.77741 L 67.23295 -116.77741 C 94.5956 -116.77741 116.77741 -94.5956 116.77741 -67.23295 L 116.77741 67.23295 L 116.77741 67.23295 C 116.77741 94.5956 94.5956 116.77741 67.23295 116.77741 L -67.23295 116.77741 L -67.23295 116.77741 C -94.5956 116.77741 -116.77741 94.5956 -116.77741 67.23295 z"
|
||||
stroke-linecap="round"
|
||||
id="path1"
|
||||
inkscape:label="iconbg" /><path
|
||||
style="stroke:rgb(89, 142, 199);stroke-width:0;stroke-dasharray:none;stroke-linecap:butt;stroke-dashoffset:0;stroke-linejoin:miter;stroke-miterlimit:4;fill:rgb(52, 52, 52);fill-rule:nonzero;opacity:1"
|
||||
vector-effect="non-scaling-stroke"
|
||||
transform="matrix(4.0068,0,0,4.0068,110,110)"
|
||||
d="M 0 -22.46181 C 12.39892 -22.46181 22.46181 -12.39892 22.46181 0 C 22.46181 12.39892 12.39892 22.46181 0 22.46181 C -12.39892 22.46181 -22.46181 12.39892 -22.46181 0 C -22.46181 -12.39892 -12.39892 -22.46181 0 -22.46181 z"
|
||||
stroke-linecap="round"
|
||||
id="path2"
|
||||
inkscape:label="spoolface" /><path
|
||||
style="stroke:rgb(255, 255, 255);stroke-width:0;stroke-dasharray:none;stroke-linecap:butt;stroke-dashoffset:0;stroke-linejoin:miter;stroke-miterlimit:4;fill:rgb(17, 17, 17);fill-rule:nonzero;opacity:1"
|
||||
vector-effect="non-scaling-stroke"
|
||||
transform="matrix(-0.65629473,0.65629473,-0.65629473,-0.65629473,169.99999,109.99999)"
|
||||
d="M -33.16071 25.30347 C -35.26675 24.713710000000003 -37.021860000000004 23.25476 -37.98653 21.29195 C -38.95121 19.32914 -39.0341 17.04834 -38.21447 15.020669999999999 L -38.21447 15.020669999999999 L -38.21447 15.020669999999999 C -28.42178 -9.205020000000001 -9.211359999999999 -28.41564 15.014230000000005 -38.20859 L 15.047580000000005 -38.22207 L 15.047580000000005 -38.22207 C 17.067020000000007 -39.03841 19.338600000000007 -38.95586 21.293460000000003 -37.995110000000004 C 23.248330000000003 -37.03435 24.701380000000004 -35.286350000000006 25.288750000000004 -33.188840000000006 L 37.998650000000005 12.198379999999993 L 37.998650000000005 12.198379999999993 C 40.03828000000001 19.481909999999992 37.990640000000006 27.299259999999993 32.64228000000001 32.64761999999999 C 27.293920000000007 37.99597999999999 19.476570000000006 40.04361999999999 12.193040000000007 38.00398999999999 z"
|
||||
stroke-linecap="round"
|
||||
id="path3"
|
||||
inkscape:label="bean3_bg" /><path
|
||||
style="stroke:rgb(255, 255, 255);stroke-width:0;stroke-dasharray:none;stroke-linecap:butt;stroke-dashoffset:0;stroke-linejoin:miter;stroke-miterlimit:4;fill:rgb(190, 190, 190);fill-rule:nonzero;opacity:1"
|
||||
vector-effect="non-scaling-stroke"
|
||||
transform="matrix(-0.65629473,0.65629473,-0.65629473,-0.65629473,158.49213,110.08398)"
|
||||
d="M -29.98183 19.80196 L -29.17187 17.09468 L -29.17187 17.09468 C -22.390079999999998 -5.573499999999999 -4.466099999999997 -23.18579 18.31756 -29.568920000000002 L 19.88717 -30.008660000000003 L 29.21402 3.473359999999996 L 29.21402 3.473359999999996 C 31.243070000000003 10.757369999999996 29.183770000000003 18.569419999999994 23.82768 23.906659999999995 C 18.47159 29.243899999999996 10.652330000000001 31.275649999999995 3.375510000000002 29.220929999999996 z"
|
||||
stroke-linecap="round"
|
||||
id="path4"
|
||||
inkscape:label="bean3_fg" /><path
|
||||
style="stroke:rgb(255, 255, 255);stroke-width:0;stroke-dasharray:none;stroke-linecap:butt;stroke-dashoffset:0;stroke-linejoin:miter;stroke-miterlimit:4;fill:rgb(17, 17, 17);fill-rule:nonzero;opacity:1"
|
||||
vector-effect="non-scaling-stroke"
|
||||
transform="matrix(-0.24022054,-0.89651527,0.89651527,-0.24022054,81.095899,162.73972)"
|
||||
d="M -33.16071 25.30347 C -35.26675 24.713710000000003 -37.021860000000004 23.25476 -37.98653 21.29195 C -38.95121 19.32914 -39.0341 17.04834 -38.21447 15.020669999999999 L -38.21447 15.020669999999999 L -38.21447 15.020669999999999 C -28.42178 -9.205020000000001 -9.211359999999999 -28.41564 15.014230000000005 -38.20859 L 15.047580000000005 -38.22207 L 15.047580000000005 -38.22207 C 17.067020000000007 -39.03841 19.338600000000007 -38.95586 21.293460000000003 -37.995110000000004 C 23.248330000000003 -37.03435 24.701380000000004 -35.286350000000006 25.288750000000004 -33.188840000000006 L 37.998650000000005 12.198379999999993 L 37.998650000000005 12.198379999999993 C 40.03828000000001 19.481909999999992 37.990640000000006 27.299259999999993 32.64228000000001 32.64761999999999 C 27.293920000000007 37.99597999999999 19.476570000000006 40.04361999999999 12.193040000000007 38.00398999999999 z"
|
||||
stroke-linecap="round"
|
||||
id="path5"
|
||||
inkscape:label="bean2_bg" /><path
|
||||
style="stroke:rgb(255, 255, 255);stroke-width:0;stroke-dasharray:none;stroke-linecap:butt;stroke-dashoffset:0;stroke-linejoin:miter;stroke-miterlimit:4;fill:rgb(190, 190, 190);fill-rule:nonzero;opacity:1"
|
||||
vector-effect="non-scaling-stroke"
|
||||
transform="matrix(-0.24022054,-0.89651527,0.89651527,-0.24022054,86.7771,152.73163)"
|
||||
d="M -29.98183 19.80196 L -29.17187 17.09468 L -29.17187 17.09468 C -22.390079999999998 -5.573499999999999 -4.466099999999997 -23.18579 18.31756 -29.568920000000002 L 19.88717 -30.008660000000003 L 29.21402 3.473359999999996 L 29.21402 3.473359999999996 C 31.243070000000003 10.757369999999996 29.183770000000003 18.569419999999994 23.82768 23.906659999999995 C 18.47159 29.243899999999996 10.652330000000001 31.275649999999995 3.375510000000002 29.220929999999996 z"
|
||||
stroke-linecap="round"
|
||||
id="path6"
|
||||
inkscape:label="bean2_fg" /><path
|
||||
style="stroke:rgb(255, 255, 255);stroke-width:0;stroke-dasharray:none;stroke-linecap:butt;stroke-dashoffset:0;stroke-linejoin:miter;stroke-miterlimit:4;fill:rgb(17, 17, 17);fill-rule:nonzero;opacity:1"
|
||||
vector-effect="non-scaling-stroke"
|
||||
transform="matrix(0.89651527,0.24022054,-0.24022054,0.89651527,80.684929,58.484107)"
|
||||
d="M -33.16071 25.30347 C -35.26675 24.713710000000003 -37.021860000000004 23.25476 -37.98653 21.29195 C -38.95121 19.32914 -39.0341 17.04834 -38.21447 15.020669999999999 L -38.21447 15.020669999999999 L -38.21447 15.020669999999999 C -28.42178 -9.205020000000001 -9.211359999999999 -28.41564 15.014230000000005 -38.20859 L 15.047580000000005 -38.22207 L 15.047580000000005 -38.22207 C 17.067020000000007 -39.03841 19.338600000000007 -38.95586 21.293460000000003 -37.995110000000004 C 23.248330000000003 -37.03435 24.701380000000004 -35.286350000000006 25.288750000000004 -33.188840000000006 L 37.998650000000005 12.198379999999993 L 37.998650000000005 12.198379999999993 C 40.03828000000001 19.481909999999992 37.990640000000006 27.299259999999993 32.64228000000001 32.64761999999999 C 27.293920000000007 37.99597999999999 19.476570000000006 40.04361999999999 12.193040000000007 38.00398999999999 z"
|
||||
stroke-linecap="round"
|
||||
id="path7"
|
||||
inkscape:label="bean1_bg" /><path
|
||||
style="stroke:rgb(255, 255, 255);stroke-width:0;stroke-dasharray:none;stroke-linecap:butt;stroke-dashoffset:0;stroke-linejoin:miter;stroke-miterlimit:4;fill:rgb(190, 190, 190);fill-rule:nonzero;opacity:1"
|
||||
vector-effect="non-scaling-stroke"
|
||||
transform="matrix(0.89651527,0.24022054,-0.24022054,0.89651527,86.511593,68.408219)"
|
||||
d="M -29.98183 19.80196 L -29.17187 17.09468 L -29.17187 17.09468 C -22.390079999999998 -5.573499999999999 -4.466099999999997 -23.18579 18.31756 -29.568920000000002 L 19.88717 -30.008660000000003 L 29.21402 3.473359999999996 L 29.21402 3.473359999999996 C 31.243070000000003 10.757369999999996 29.183770000000003 18.569419999999994 23.82768 23.906659999999995 C 18.47159 29.243899999999996 10.652330000000001 31.275649999999995 3.375510000000002 29.220929999999996 z"
|
||||
stroke-linecap="round"
|
||||
id="path8"
|
||||
inkscape:label="bean1_fg" /> </svg>
|
||||
<svg xmlns="http://www.w3.org/2000/svg" xmlns:svg="http://www.w3.org/2000/svg" id="svg8" width="220" height="220" version="1.1" viewBox="0 0 220 220" xml:space="preserve"><desc id="desc1">Created with Fabric.js 5.3.0</desc><path style="stroke:#000;stroke-width:0;stroke-dasharray:none;stroke-linecap:butt;stroke-dashoffset:0;stroke-linejoin:miter;stroke-miterlimit:4;fill:#dc7734;fill-rule:nonzero;opacity:1" id="path1" stroke-linecap="round" d="M -116.77741 -67.23295 C -116.77741 -94.5956 -94.5956 -116.77741 -67.23295 -116.77741 L 67.23295 -116.77741 L 67.23295 -116.77741 C 94.5956 -116.77741 116.77741 -94.5956 116.77741 -67.23295 L 116.77741 67.23295 L 116.77741 67.23295 C 116.77741 94.5956 94.5956 116.77741 67.23295 116.77741 L -67.23295 116.77741 L -67.23295 116.77741 C -94.5956 116.77741 -116.77741 94.5956 -116.77741 67.23295 z" transform="matrix(0.941963,0,0,0.941963,110,110)" vector-effect="non-scaling-stroke"/><path style="stroke:#598ec7;stroke-width:0;stroke-dasharray:none;stroke-linecap:butt;stroke-dashoffset:0;stroke-linejoin:miter;stroke-miterlimit:4;fill:#343434;fill-rule:nonzero;opacity:1" id="path2" stroke-linecap="round" d="M 0 -22.46181 C 12.39892 -22.46181 22.46181 -12.39892 22.46181 0 C 22.46181 12.39892 12.39892 22.46181 0 22.46181 C -12.39892 22.46181 -22.46181 12.39892 -22.46181 0 C -22.46181 -12.39892 -12.39892 -22.46181 0 -22.46181 z" transform="matrix(4.0068,0,0,4.0068,110,110)" vector-effect="non-scaling-stroke"/><path style="stroke:#fff;stroke-width:0;stroke-dasharray:none;stroke-linecap:butt;stroke-dashoffset:0;stroke-linejoin:miter;stroke-miterlimit:4;fill:#111;fill-rule:nonzero;opacity:1" id="path3" stroke-linecap="round" d="M -33.16071 25.30347 C -35.26675 24.713710000000003 -37.021860000000004 23.25476 -37.98653 21.29195 C -38.95121 19.32914 -39.0341 17.04834 -38.21447 15.020669999999999 L -38.21447 15.020669999999999 L -38.21447 15.020669999999999 C -28.42178 -9.205020000000001 -9.211359999999999 -28.41564 15.014230000000005 -38.20859 L 15.047580000000005 -38.22207 L 15.047580000000005 -38.22207 C 17.067020000000007 -39.03841 19.338600000000007 -38.95586 21.293460000000003 -37.995110000000004 C 23.248330000000003 -37.03435 24.701380000000004 -35.286350000000006 25.288750000000004 -33.188840000000006 L 37.998650000000005 12.198379999999993 L 37.998650000000005 12.198379999999993 C 40.03828000000001 19.481909999999992 37.990640000000006 27.299259999999993 32.64228000000001 32.64761999999999 C 27.293920000000007 37.99597999999999 19.476570000000006 40.04361999999999 12.193040000000007 38.00398999999999 z" transform="matrix(-0.65629473,0.65629473,-0.65629473,-0.65629473,169.99999,109.99999)" vector-effect="non-scaling-stroke"/><path style="stroke:#fff;stroke-width:0;stroke-dasharray:none;stroke-linecap:butt;stroke-dashoffset:0;stroke-linejoin:miter;stroke-miterlimit:4;fill:#bebebe;fill-rule:nonzero;opacity:1" id="path4" stroke-linecap="round" d="M -29.98183 19.80196 L -29.17187 17.09468 L -29.17187 17.09468 C -22.390079999999998 -5.573499999999999 -4.466099999999997 -23.18579 18.31756 -29.568920000000002 L 19.88717 -30.008660000000003 L 29.21402 3.473359999999996 L 29.21402 3.473359999999996 C 31.243070000000003 10.757369999999996 29.183770000000003 18.569419999999994 23.82768 23.906659999999995 C 18.47159 29.243899999999996 10.652330000000001 31.275649999999995 3.375510000000002 29.220929999999996 z" transform="matrix(-0.65629473,0.65629473,-0.65629473,-0.65629473,158.49213,110.08398)" vector-effect="non-scaling-stroke"/><path style="stroke:#fff;stroke-width:0;stroke-dasharray:none;stroke-linecap:butt;stroke-dashoffset:0;stroke-linejoin:miter;stroke-miterlimit:4;fill:#111;fill-rule:nonzero;opacity:1" id="path5" stroke-linecap="round" d="M -33.16071 25.30347 C -35.26675 24.713710000000003 -37.021860000000004 23.25476 -37.98653 21.29195 C -38.95121 19.32914 -39.0341 17.04834 -38.21447 15.020669999999999 L -38.21447 15.020669999999999 L -38.21447 15.020669999999999 C -28.42178 -9.205020000000001 -9.211359999999999 -28.41564 15.014230000000005 -38.20859 L 15.047580000000005 -38.22207 L 15.047580000000005 -38.22207 C 17.067020000000007 -39.03841 19.338600000000007 -38.95586 21.293460000000003 -37.995110000000004 C 23.248330000000003 -37.03435 24.701380000000004 -35.286350000000006 25.288750000000004 -33.188840000000006 L 37.998650000000005 12.198379999999993 L 37.998650000000005 12.198379999999993 C 40.03828000000001 19.481909999999992 37.990640000000006 27.299259999999993 32.64228000000001 32.64761999999999 C 27.293920000000007 37.99597999999999 19.476570000000006 40.04361999999999 12.193040000000007 38.00398999999999 z" transform="matrix(-0.24022054,-0.89651527,0.89651527,-0.24022054,81.095899,162.73972)" vector-effect="non-scaling-stroke"/><path style="stroke:#fff;stroke-width:0;stroke-dasharray:none;stroke-linecap:butt;stroke-dashoffset:0;stroke-linejoin:miter;stroke-miterlimit:4;fill:#bebebe;fill-rule:nonzero;opacity:1" id="path6" stroke-linecap="round" d="M -29.98183 19.80196 L -Line truncated
|
||||
|
Before Width: | Height: | Size: 8.9 KiB After Width: | Height: | Size: 7.4 KiB |
@@ -1,61 +1 @@
|
||||
<?xml version="1.0" encoding="UTF-8" standalone="no"?>
|
||||
<svg
|
||||
version="1.1"
|
||||
width="220"
|
||||
height="220"
|
||||
viewBox="0 0 220 220"
|
||||
xml:space="preserve"
|
||||
id="svg8"
|
||||
sodipodi:docname="spoolman_monochrome.svg"
|
||||
inkscape:version="1.3 (0e150ed6c4, 2023-07-21)"
|
||||
xmlns:inkscape="http://www.inkscape.org/namespaces/inkscape"
|
||||
xmlns:sodipodi="http://sodipodi.sourceforge.net/DTD/sodipodi-0.dtd"
|
||||
xmlns="http://www.w3.org/2000/svg"
|
||||
xmlns:svg="http://www.w3.org/2000/svg"><sodipodi:namedview
|
||||
id="namedview8"
|
||||
pagecolor="#ffffff"
|
||||
bordercolor="#000000"
|
||||
borderopacity="0.25"
|
||||
inkscape:showpageshadow="2"
|
||||
inkscape:pageopacity="0.0"
|
||||
inkscape:pagecheckerboard="true"
|
||||
inkscape:deskcolor="#d1d1d1"
|
||||
inkscape:zoom="2.6659091"
|
||||
inkscape:cx="73.333333"
|
||||
inkscape:cy="97.1526"
|
||||
inkscape:window-width="1898"
|
||||
inkscape:window-height="1360"
|
||||
inkscape:window-x="684"
|
||||
inkscape:window-y="0"
|
||||
inkscape:window-maximized="0"
|
||||
inkscape:current-layer="svg8" /> <desc
|
||||
id="desc1">Created with Fabric.js 5.3.0</desc> <defs
|
||||
id="defs1"><inkscape:path-effect
|
||||
effect="powerclip"
|
||||
id="path-effect13"
|
||||
is_visible="true"
|
||||
lpeversion="1"
|
||||
inverse="true"
|
||||
flatten="false"
|
||||
hide_clip="false"
|
||||
message="Use fill-rule evenodd on <b>fill and stroke</b> dialog if no flatten result after convert clip to paths." /> <clipPath
|
||||
clipPathUnits="userSpaceOnUse"
|
||||
id="clipPath13"><path
|
||||
id="path13"
|
||||
style="display:none;opacity:1;fill:#bebebe;fill-rule:nonzero;stroke:#ffffff;stroke-width:0;stroke-linecap:butt;stroke-linejoin:miter;stroke-miterlimit:4;stroke-dasharray:none;stroke-dashoffset:0"
|
||||
inkscape:label="bean1_fg"
|
||||
d="m -13.757715,-7.7471481 0.343537,-0.55719 v 0 c 2.876446,-4.6653799 7.9428216,-7.5315019 13.42331996,-7.5937639 l 0.37756065,-0.0043 0.0795148,8.0507248 v 0 c 0.0172956,1.7514341 -0.91182739,3.3759065 -2.43022861,4.2489907 -1.5184012,0.8730843 -3.3897584,0.8588954 -4.8947484,-0.037114 z M 0.4322926,16.185974 -0.22201757,16.167056 v 0 C -5.7005765,16.00867 -10.715899,13.054123 -13.510068,8.3390037 l -0.192495,-0.3248328 6.9323756,-4.0942248 v 0 c 1.5081376,-0.8906958 3.3795333,-0.8982879 4.894848,-0.019866 1.51531394,0.8784316 2.43870418,2.5061695 2.41523158,4.2575347 z m 13.3375784,-24.319362 0.310774,0.5761074 v 0 c 2.602114,4.8237643 2.551061,10.6444349 -0.135267,15.4218159 L 13.76031,8.1936583 6.7484202,4.2371568 v 0 C 5.2229859,3.3764201 4.2807128,1.7595388 4.2838,0.00802386 4.2868948,-1.7434936 5.2348557,-3.3570423 6.7633174,-4.2123972 Z" /><path
|
||||
id="lpe_path-effect13"
|
||||
style="opacity:1;fill:#bebebe;fill-rule:nonzero;stroke:#ffffff;stroke-width:0;stroke-linecap:butt;stroke-linejoin:miter;stroke-miterlimit:4;stroke-dasharray:none;stroke-dashoffset:0"
|
||||
class="powerclip"
|
||||
d="m -27.46181,-27.46181 h 54.92362 v 54.92362 h -54.92362 z m 13.704095,19.7146619 6.8989554,4.1073476 c 1.50499,0.8960094 3.3763472,0.9101983 4.8947484,0.037114 1.51840122,-0.8730842 2.44752421,-2.4975566 2.43022861,-4.2489907 v 0 l -0.0795148,-8.0507248 -0.37756065,0.0043 c -5.48049836,0.06226 -10.54687396,2.928384 -13.42331996,7.5937639 v 0 z M 0.4322926,16.185974 0.53989218,8.1576148 C 0.56336478,6.4062496 -0.36002546,4.7785117 -1.8753394,3.9000801 -3.3906541,3.0216582 -5.2620498,3.0292503 -6.7701874,3.9199461 v 0 l -6.9323756,4.0942248 0.192495,0.3248328 c 2.794169,4.7151193 7.8094915,7.6696663 13.28805043,7.8280523 v 0 z M 13.769871,-8.133388 6.7633174,-4.2123972 C 5.2348557,-3.3570423 4.2868948,-1.7434936 4.2838,0.00802386 4.2807128,1.7595388 5.2229859,3.3764201 6.7484202,4.2371568 v 0 l 7.0118898,3.9565015 0.185068,-0.329123 c 2.686328,-4.777381 2.737381,-10.5980516 0.135267,-15.4218159 v 0 z" /></clipPath></defs> <path
|
||||
style="stroke:rgb(89, 142, 199);stroke-width:0;stroke-dasharray:none;stroke-linecap:butt;stroke-dashoffset:0;stroke-linejoin:miter;stroke-miterlimit:4;fill:#000000;fill-rule:nonzero;opacity:1;fill-opacity:1"
|
||||
vector-effect="non-scaling-stroke"
|
||||
transform="matrix(4.0068,0,0,4.0068,110,110)"
|
||||
d="M 0,-22.46181 C 12.39892,-22.46181 22.46181,-12.39892 22.46181,0 22.46181,12.39892 12.39892,22.46181 0,22.46181 -12.39892,22.46181 -22.46181,12.39892 -22.46181,0 -22.46181,-12.39892 -12.39892,-22.46181 0,-22.46181 Z"
|
||||
stroke-linecap="round"
|
||||
id="path2"
|
||||
inkscape:label="spoolface"
|
||||
clip-path="url(#clipPath13)"
|
||||
inkscape:path-effect="#path-effect13"
|
||||
inkscape:original-d="M 0 -22.46181 C 12.39892 -22.46181 22.46181 -12.39892 22.46181 0 C 22.46181 12.39892 12.39892 22.46181 0 22.46181 C -12.39892 22.46181 -22.46181 12.39892 -22.46181 0 C -22.46181 -12.39892 -12.39892 -22.46181 0 -22.46181 z" /> </svg>
|
||||
<svg xmlns="http://www.w3.org/2000/svg" xmlns:svg="http://www.w3.org/2000/svg" id="svg8" width="220" height="220" version="1.1" viewBox="0 0 220 220" xml:space="preserve"><desc id="desc1">Created with Fabric.js 5.3.0</desc><defs id="defs1"><clipPath id="clipPath13" clipPathUnits="userSpaceOnUse"><path id="path13" style="display:none;opacity:1;fill:#bebebe;fill-rule:nonzero;stroke:#fff;stroke-width:0;stroke-linecap:butt;stroke-linejoin:miter;stroke-miterlimit:4;stroke-dasharray:none;stroke-dashoffset:0" d="m -13.757715,-7.7471481 0.343537,-0.55719 v 0 c 2.876446,-4.6653799 7.9428216,-7.5315019 13.42331996,-7.5937639 l 0.37756065,-0.0043 0.0795148,8.0507248 v 0 c 0.0172956,1.7514341 -0.91182739,3.3759065 -2.43022861,4.2489907 -1.5184012,0.8730843 -3.3897584,0.8588954 -4.8947484,-0.037114 z M 0.4322926,16.185974 -0.22201757,16.167056 v 0 C -5.7005765,16.00867 -10.715899,13.054123 -13.510068,8.3390037 l -0.192495,-0.3248328 6.9323756,-4.0942248 v 0 c 1.5081376,-0.8906958 3.3795333,-0.8982879 4.894848,-0.019866 1.51531394,0.8784316 2.43870418,2.5061695 2.41523158,4.2575347 z m 13.3375784,-24.319362 0.310774,0.5761074 v 0 c 2.602114,4.8237643 2.551061,10.6444349 -0.135267,15.4218159 L 13.76031,8.1936583 6.7484202,4.2371568 v 0 C 5.2229859,3.3764201 4.2807128,1.7595388 4.2838,0.00802386 4.2868948,-1.7434936 5.2348557,-3.3570423 6.7633174,-4.2123972 Z"/><path id="lpe_path-effect13" style="opacity:1;fill:#bebebe;fill-rule:nonzero;stroke:#fff;stroke-width:0;stroke-linecap:butt;stroke-linejoin:miter;stroke-miterlimit:4;stroke-dasharray:none;stroke-dashoffset:0" d="m -27.46181,-27.46181 h 54.92362 v 54.92362 h -54.92362 z m 13.704095,19.7146619 6.8989554,4.1073476 c 1.50499,0.8960094 3.3763472,0.9101983 4.8947484,0.037114 1.51840122,-0.8730842 2.44752421,-2.4975566 2.43022861,-4.2489907 v 0 l -0.0795148,-8.0507248 -0.37756065,0.0043 c -5.48049836,0.06226 -10.54687396,2.928384 -13.42331996,7.5937639 v 0 z M 0.4322926,16.185974 0.53989218,8.1576148 C 0.56336478,6.4062496 -0.36002546,4.7785117 -1.8753394,3.9000801 -3.3906541,3.0216582 -5.2620498,3.0292503 -6.7701874,3.9199461 v 0 l -6.9323756,4.0942248 0.192495,0.3248328 c 2.794169,4.7151193 7.8094915,7.6696663 13.28805043,7.8280523 v 0 z M 13.769871,-8.133388 6.7633174,-4.2123972 C 5.2348557,-3.3570423 4.2868948,-1.7434936 4.2838,0.00802386 4.2807128,1.7595388 5.2229859,3.3764201 6.7484202,4.2371568 v 0 l 7.0118898,3.9565015 0.185068,-0.329123 c 2.686328,-4.777381 2.737381,-10.5980516 0.135267,-15.4218159 v 0 z" class="powerclip"/></clipPath></defs><path style="stroke:#598ec7;stroke-width:0;stroke-dasharray:none;stroke-linecap:butt;stroke-dashoffset:0;stroke-linejoin:miter;stroke-miterlimit:4;fill:#000;fill-rule:nonzero;opacity:1;fill-opacity:1" id="path2" stroke-linecap="round" d="M 0,-22.46181 C 12.39892,-22.46181 22.46181,-12.39892 22.46181,0 22.46181,12.39892 12.39892,22.46181 0,22.46181 -12.39892,22.46181 -22.46181,12.39892 -22.46181,0 -22.46181,-12.39892 -12.39892,-22.46181 0,-22.46181 Z" clip-path="url(#clipPath13)" transform="matrix(4.0068,0,0,4.0068,110,110)" vector-effect="non-scaling-stroke"/></svg>
|
||||
|
Before Width: | Height: | Size: 4.6 KiB After Width: | Height: | Size: 3.0 KiB |
@@ -1,13 +1,13 @@
|
||||
<!DOCTYPE html>
|
||||
<!doctype html>
|
||||
<html lang="en">
|
||||
<head>
|
||||
<meta charset="utf-8" />
|
||||
<link rel="icon" href="/favicon.svg" />
|
||||
<meta name="viewport" content="width=device-width, initial-scale=1" />
|
||||
<meta name="theme-color" content="#DC7734" />
|
||||
<meta name="description" content="Spoolman - Keep track of your inventory of 3D-printer filament spools." />
|
||||
<meta name="robots" content="noindex,nofollow" />
|
||||
<meta name="apple-mobile-web-app-capable" content="yes" />
|
||||
<script type="text/javascript" src="./config.js"></script>
|
||||
<title>Spoolman</title>
|
||||
</head>
|
||||
|
||||
|
||||
@@ -1,57 +1,76 @@
|
||||
{
|
||||
"name": "spoolman-ui",
|
||||
"version": "0.15.0",
|
||||
"version": "0.27.0",
|
||||
"engines": {
|
||||
"node": "20.x"
|
||||
"node": "^20.19 || ^22.12 || >=24"
|
||||
},
|
||||
"private": true,
|
||||
"type": "module",
|
||||
"dependencies": {
|
||||
"axios": "^1.6.2",
|
||||
"@ant-design/icons": "^5.2.6",
|
||||
"@loadable/component": "^5.16.2",
|
||||
"@refinedev/antd": "^5.37.0",
|
||||
"@refinedev/core": "^4.46.0",
|
||||
"@refinedev/kbar": "^1.3.4",
|
||||
"@refinedev/react-router-v6": "^4.5.4",
|
||||
"@refinedev/simple-rest": "^5.0.0",
|
||||
"@tanstack/react-query": "^4.36.1",
|
||||
"@tanstack/react-query-devtools": "^4.36.1",
|
||||
"@types/loadable__component": "^5.13.8",
|
||||
"@yudiel/react-qr-scanner": "^1.2.4",
|
||||
"antd": "^5.12.2",
|
||||
"flag-icons": "^7.1.0",
|
||||
"i18next": "^23.7.11",
|
||||
"i18next-browser-languagedetector": "^7.2.0",
|
||||
"i18next-xhr-backend": "^3.2.2",
|
||||
"react": "^18.2.0",
|
||||
"react-dom": "^18.2.0",
|
||||
"react-i18next": "^13.5.0",
|
||||
"react-router-dom": "^6.21.0",
|
||||
"react-to-print": "^2.14.15",
|
||||
"vite-plugin-svgr": "^4.2.0"
|
||||
"@ant-design/v5-patch-for-react-19": "^1.0.3",
|
||||
"@loadable/component": "^5.16.7",
|
||||
"@refinedev/antd": "^6.0.3",
|
||||
"@refinedev/core": "^5.0.7",
|
||||
"@refinedev/kbar": "^2.0.1",
|
||||
"@refinedev/react-router": "^2.0.3",
|
||||
"@refinedev/simple-rest": "^6.0.1",
|
||||
"@tanstack/react-query": "^5.90.16",
|
||||
"@tanstack/react-query-devtools": "^5.91.2",
|
||||
"@yudiel/react-qr-scanner": "^2.5.0",
|
||||
"axios": "^1.13.2",
|
||||
"dayjs": "^1.11.10",
|
||||
"html-to-image": "^1.11.13",
|
||||
"i18next": "^25.7.3",
|
||||
"i18next-browser-languagedetector": "^8.2.0",
|
||||
"i18next-http-backend": "^3.0.2",
|
||||
"react": "^19.2.3",
|
||||
"react-dnd": "^16.0.1",
|
||||
"react-dnd-html5-backend": "^16.0.1",
|
||||
"react-dom": "^19.2.3",
|
||||
"react-i18next": "^16.5.1",
|
||||
"react-router": "^7.18.3",
|
||||
"react-to-print": "^3.2.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": {
|
||||
"@refinedev/cli": "^2.16.20",
|
||||
"@types/node": "^20.10.4",
|
||||
"@types/react": "^18.2.45",
|
||||
"@types/react-dom": "^18.2.18",
|
||||
"@typescript-eslint/eslint-plugin": "^6.14.0",
|
||||
"@typescript-eslint/parser": "^6.14.0",
|
||||
"@vitejs/plugin-react": "^4.2.1",
|
||||
"eslint": "^8.56.0",
|
||||
"eslint-plugin-react-hooks": "^4.6.0",
|
||||
"eslint-plugin-react-refresh": "^0.4.5",
|
||||
"typescript": "^5.3.3",
|
||||
"vite": "^5.0.10",
|
||||
"vite-plugin-mkcert": "^1.17.1"
|
||||
"@eslint/js": "^9.39.2",
|
||||
"@refinedev/cli": "^2.16.50",
|
||||
"@types/loadable__component": "^5.13.10",
|
||||
"@types/node": "^25.0.3",
|
||||
"@types/react-dom": "^19.2.3",
|
||||
"@types/react": "^19.2.7",
|
||||
"@types/uuid": "^10.0.0",
|
||||
"@vitejs/plugin-react": "^5.1.2",
|
||||
"eslint-config-prettier": "^10.1.8",
|
||||
"eslint-plugin-react-hooks": "^7.0.1",
|
||||
"eslint-plugin-react-refresh": "^0.4.26",
|
||||
"eslint-plugin-react": "^7.37.5",
|
||||
"eslint": "^9.39.2",
|
||||
"globals": "^17.0.0",
|
||||
"prettier": "3.7.4",
|
||||
"typescript-eslint": "^8.52.0",
|
||||
"typescript": "^5.9.3",
|
||||
"vite": "^7.3.0",
|
||||
"vite-plugin-mkcert": "^1.17.9",
|
||||
"vite-plugin-pwa": "^1.2.0"
|
||||
},
|
||||
"scripts": {
|
||||
"dev": "refine dev",
|
||||
"build": "tsc && refine build",
|
||||
"build.zip": "cd ./dist && zip -r spoolman-client.zip ./ ./ && cd ..",
|
||||
"preview": "refine start",
|
||||
"refine": "refine"
|
||||
"refine": "refine",
|
||||
"check-i18n": "node scripts/check-i18n.js",
|
||||
"lint": "eslint . --ext .js,.jsx,.ts,.tsx",
|
||||
"format": "prettier --write .",
|
||||
"format-check": "prettier --check ."
|
||||
},
|
||||
"browserslist": {
|
||||
"production": [
|
||||
@@ -65,4 +84,4 @@
|
||||
"last 1 safari version"
|
||||
]
|
||||
}
|
||||
}
|
||||
}
|
||||
|
After Width: | Height: | Size: 6.3 KiB |
|
Before Width: | Height: | Size: 20 KiB |
|
Before Width: | Height: | Size: 25 KiB After Width: | Height: | Size: 768 B |
@@ -1,32 +1 @@
|
||||
<?xml version="1.0" encoding="UTF-8" standalone="no"?>
|
||||
<!DOCTYPE svg PUBLIC "-//W3C//DTD SVG 1.1//EN" "http://www.w3.org/Graphics/SVG/1.1/DTD/svg11.dtd">
|
||||
<svg xmlns="http://www.w3.org/2000/svg" xmlns:xlink="http://www.w3.org/1999/xlink" version="1.1"
|
||||
width="100%" height="100%" viewBox="0 0 220 220" xml:space="preserve">
|
||||
<desc>Created with Fabric.js 5.3.0</desc>
|
||||
<defs>
|
||||
</defs>
|
||||
<g transform="matrix(0.9419630011 0 0 0.9419630011 110 110)" id="97_aBJ1JQMj7gfw9xgqJk" >
|
||||
<path style="stroke: rgb(0,0,0); stroke-width: 0; stroke-dasharray: none; stroke-linecap: butt; stroke-dashoffset: 0; stroke-linejoin: miter; stroke-miterlimit: 4; fill: rgb(220,119,52); fill-rule: nonzero; opacity: 1;" vector-effect="non-scaling-stroke" transform=" translate(0, 0)" d="M -116.77741 -67.23295 C -116.77741 -94.5956 -94.5956 -116.77741 -67.23295 -116.77741 L 67.23295 -116.77741 L 67.23295 -116.77741 C 94.5956 -116.77741 116.77741 -94.5956 116.77741 -67.23295 L 116.77741 67.23295 L 116.77741 67.23295 C 116.77741 94.5956 94.5956 116.77741 67.23295 116.77741 L -67.23295 116.77741 L -67.23295 116.77741 C -94.5956 116.77741 -116.77741 94.5956 -116.77741 67.23295 z" stroke-linecap="round" />
|
||||
</g>
|
||||
<g transform="matrix(4.0068 0 0 4.0068 110 110)" id="bajrpvpoPMPegFQ9fLbAW" >
|
||||
<path style="stroke: rgb(89,142,199); stroke-width: 0; stroke-dasharray: none; stroke-linecap: butt; stroke-dashoffset: 0; stroke-linejoin: miter; stroke-miterlimit: 4; fill: rgb(52,52,52); fill-rule: nonzero; opacity: 1;" vector-effect="non-scaling-stroke" transform=" translate(0, 0)" d="M 0 -22.46181 C 12.39892 -22.46181 22.46181 -12.39892 22.46181 0 C 22.46181 12.39892 12.39892 22.46181 0 22.46181 C -12.39892 22.46181 -22.46181 12.39892 -22.46181 0 C -22.46181 -12.39892 -12.39892 -22.46181 0 -22.46181 z" stroke-linecap="round" />
|
||||
</g>
|
||||
<g transform="matrix(-0.6562947252 0.6562947252 -0.6562947252 -0.6562947252 170 110)" id="uzP7ffSaxXnc8ieJ8GKAi" >
|
||||
<path style="stroke: rgb(255,255,255); stroke-width: 0; stroke-dasharray: none; stroke-linecap: butt; stroke-dashoffset: 0; stroke-linejoin: miter; stroke-miterlimit: 4; fill: rgb(17,17,17); fill-rule: nonzero; opacity: 1;" vector-effect="non-scaling-stroke" transform=" translate(-7.913e-7, 0.0000091739)" d="M -33.16071 25.30347 C -35.26675 24.713710000000003 -37.021860000000004 23.25476 -37.98653 21.29195 C -38.95121 19.32914 -39.0341 17.04834 -38.21447 15.020669999999999 L -38.21447 15.020669999999999 L -38.21447 15.020669999999999 C -28.42178 -9.205020000000001 -9.211359999999999 -28.41564 15.014230000000005 -38.20859 L 15.047580000000005 -38.22207 L 15.047580000000005 -38.22207 C 17.067020000000007 -39.03841 19.338600000000007 -38.95586 21.293460000000003 -37.995110000000004 C 23.248330000000003 -37.03435 24.701380000000004 -35.286350000000006 25.288750000000004 -33.188840000000006 L 37.998650000000005 12.198379999999993 L 37.998650000000005 12.198379999999993 C 40.03828000000001 19.481909999999992 37.990640000000006 27.299259999999993 32.64228000000001 32.64761999999999 C 27.293920000000007 37.99597999999999 19.476570000000006 40.04361999999999 12.193040000000007 38.00398999999999 z" stroke-linecap="round" />
|
||||
</g>
|
||||
<g transform="matrix(-0.6562947251 0.6562947251 -0.6562947251 -0.6562947251 158.4921266728 110.0839790702)" id="sLvjm8ckG9Tn4B020NjmX" >
|
||||
<path style="stroke: rgb(255,255,255); stroke-width: 0; stroke-dasharray: none; stroke-linecap: butt; stroke-dashoffset: 0; stroke-linejoin: miter; stroke-miterlimit: 4; fill: rgb(190,190,190); fill-rule: nonzero; opacity: 1;" vector-effect="non-scaling-stroke" transform=" translate(-0.0000037498, -3.945e-7)" d="M -29.98183 19.80196 L -29.17187 17.09468 L -29.17187 17.09468 C -22.390079999999998 -5.573499999999999 -4.466099999999997 -23.18579 18.31756 -29.568920000000002 L 19.88717 -30.008660000000003 L 29.21402 3.473359999999996 L 29.21402 3.473359999999996 C 31.243070000000003 10.757369999999996 29.183770000000003 18.569419999999994 23.82768 23.906659999999995 C 18.47159 29.243899999999996 10.652330000000001 31.275649999999995 3.375510000000002 29.220929999999996 z" stroke-linecap="round" />
|
||||
</g>
|
||||
<g transform="matrix(-0.2402205418 -0.8965152669 0.8965152669 -0.2402205418 81.095890411 162.7397260274)" id="itojFe0oOsJTunxHV6_ba" >
|
||||
<path style="stroke: rgb(255,255,255); stroke-width: 0; stroke-dasharray: none; stroke-linecap: butt; stroke-dashoffset: 0; stroke-linejoin: miter; stroke-miterlimit: 4; fill: rgb(17,17,17); fill-rule: nonzero; opacity: 1;" vector-effect="non-scaling-stroke" transform=" translate(-7.913e-7, 0.0000091739)" d="M -33.16071 25.30347 C -35.26675 24.713710000000003 -37.021860000000004 23.25476 -37.98653 21.29195 C -38.95121 19.32914 -39.0341 17.04834 -38.21447 15.020669999999999 L -38.21447 15.020669999999999 L -38.21447 15.020669999999999 C -28.42178 -9.205020000000001 -9.211359999999999 -28.41564 15.014230000000005 -38.20859 L 15.047580000000005 -38.22207 L 15.047580000000005 -38.22207 C 17.067020000000007 -39.03841 19.338600000000007 -38.95586 21.293460000000003 -37.995110000000004 C 23.248330000000003 -37.03435 24.701380000000004 -35.286350000000006 25.288750000000004 -33.188840000000006 L 37.998650000000005 12.198379999999993 L 37.998650000000005 12.198379999999993 C 40.03828000000001 19.481909999999992 37.990640000000006 27.299259999999993 32.64228000000001 32.64761999999999 C 27.293920000000007 37.99597999999999 19.476570000000006 40.04361999999999 12.193040000000007 38.00398999999999 z" stroke-linecap="round" />
|
||||
</g>
|
||||
<g transform="matrix(-0.2402205418 -0.8965152669 0.8965152669 -0.2402205418 86.7770990664 152.7316258474)" id="-SRJJg6dkRVX31Lo1Y4pF" >
|
||||
<path style="stroke: rgb(255,255,255); stroke-width: 0; stroke-dasharray: none; stroke-linecap: butt; stroke-dashoffset: 0; stroke-linejoin: miter; stroke-miterlimit: 4; fill: rgb(190,190,190); fill-rule: nonzero; opacity: 1;" vector-effect="non-scaling-stroke" transform=" translate(-0.0000037498, -3.945e-7)" d="M -29.98183 19.80196 L -29.17187 17.09468 L -29.17187 17.09468 C -22.390079999999998 -5.573499999999999 -4.466099999999997 -23.18579 18.31756 -29.568920000000002 L 19.88717 -30.008660000000003 L 29.21402 3.473359999999996 L 29.21402 3.473359999999996 C 31.243070000000003 10.757369999999996 29.183770000000003 18.569419999999994 23.82768 23.906659999999995 C 18.47159 29.243899999999996 10.652330000000001 31.275649999999995 3.375510000000002 29.220929999999996 z" stroke-linecap="round" />
|
||||
</g>
|
||||
<g transform="matrix(0.8965152669 0.2402205418 -0.2402205418 0.8965152669 80.6849315069 58.4840992287)" id="Okowo2lxooMVge1Zf9juM" >
|
||||
<path style="stroke: rgb(255,255,255); stroke-width: 0; stroke-dasharray: none; stroke-linecap: butt; stroke-dashoffset: 0; stroke-linejoin: miter; stroke-miterlimit: 4; fill: rgb(17,17,17); fill-rule: nonzero; opacity: 1;" vector-effect="non-scaling-stroke" transform=" translate(-7.913e-7, 0.0000091739)" d="M -33.16071 25.30347 C -35.26675 24.713710000000003 -37.021860000000004 23.25476 -37.98653 21.29195 C -38.95121 19.32914 -39.0341 17.04834 -38.21447 15.020669999999999 L -38.21447 15.020669999999999 L -38.21447 15.020669999999999 C -28.42178 -9.205020000000001 -9.211359999999999 -28.41564 15.014230000000005 -38.20859 L 15.047580000000005 -38.22207 L 15.047580000000005 -38.22207 C 17.067020000000007 -39.03841 19.338600000000007 -38.95586 21.293460000000003 -37.995110000000004 C 23.248330000000003 -37.03435 24.701380000000004 -35.286350000000006 25.288750000000004 -33.188840000000006 L 37.998650000000005 12.198379999999993 L 37.998650000000005 12.198379999999993 C 40.03828000000001 19.481909999999992 37.990640000000006 27.299259999999993 32.64228000000001 32.64761999999999 C 27.293920000000007 37.99597999999999 19.476570000000006 40.04361999999999 12.193040000000007 38.00398999999999 z" stroke-linecap="round" />
|
||||
</g>
|
||||
<g transform="matrix(0.8965152669 0.2402205418 -0.2402205418 0.8965152669 86.5115961787 68.4082203385)" id="9DKPKJNmrFA1_5WNxgrse" >
|
||||
<path style="stroke: rgb(255,255,255); stroke-width: 0; stroke-dasharray: none; stroke-linecap: butt; stroke-dashoffset: 0; stroke-linejoin: miter; stroke-miterlimit: 4; fill: rgb(190,190,190); fill-rule: nonzero; opacity: 1;" vector-effect="non-scaling-stroke" transform=" translate(-0.0000037498, -3.945e-7)" d="M -29.98183 19.80196 L -29.17187 17.09468 L -29.17187 17.09468 C -22.390079999999998 -5.573499999999999 -4.466099999999997 -23.18579 18.31756 -29.568920000000002 L 19.88717 -30.008660000000003 L 29.21402 3.473359999999996 L 29.21402 3.473359999999996 C 31.243070000000003 10.757369999999996 29.183770000000003 18.569419999999994 23.82768 23.906659999999995 C 18.47159 29.243899999999996 10.652330000000001 31.275649999999995 3.375510000000002 29.220929999999996 z" stroke-linecap="round" />
|
||||
</g>
|
||||
</svg>
|
||||
<svg xmlns="http://www.w3.org/2000/svg" xmlns:xlink="http://www.w3.org/1999/xlink" width="100%" height="100%" version="1.1" viewBox="0 0 220 220" xml:space="preserve"><desc>Created with Fabric.js 5.3.0</desc><g id="97_aBJ1JQMj7gfw9xgqJk"><path style="stroke:#000;stroke-width:0;stroke-dasharray:none;stroke-linecap:butt;stroke-dashoffset:0;stroke-linejoin:miter;stroke-miterlimit:4;fill:#dc7734;fill-rule:nonzero;opacity:1" stroke-linecap="round" d="M -116.77741 -67.23295 C -116.77741 -94.5956 -94.5956 -116.77741 -67.23295 -116.77741 L 67.23295 -116.77741 L 67.23295 -116.77741 C 94.5956 -116.77741 116.77741 -94.5956 116.77741 -67.23295 L 116.77741 67.23295 L 116.77741 67.23295 C 116.77741 94.5956 94.5956 116.77741 67.23295 116.77741 L -67.23295 116.77741 L -67.23295 116.77741 C -94.5956 116.77741 -116.77741 94.5956 -116.77741 67.23295 z" transform="matrix(0.9419630011 0 0 0.9419630011 110 110) translate(0, 0)" vector-effect="non-scaling-stroke"/></g><g id="bajrpvpoPMPegFQ9fLbAW"><path style="stroke:#598ec7;stroke-width:0;stroke-dasharray:none;stroke-linecap:butt;stroke-dashoffset:0;stroke-linejoin:miter;stroke-miterlimit:4;fill:#343434;fill-rule:nonzero;opacity:1" stroke-linecap="round" d="M 0 -22.46181 C 12.39892 -22.46181 22.46181 -12.39892 22.46181 0 C 22.46181 12.39892 12.39892 22.46181 0 22.46181 C -12.39892 22.46181 -22.46181 12.39892 -22.46181 0 C -22.46181 -12.39892 -12.39892 -22.46181 0 -22.46181 z" transform="matrix(4.0068 0 0 4.0068 110 110) translate(0, 0)" vector-effect="non-scaling-stroke"/></g><g id="uzP7ffSaxXnc8ieJ8GKAi"><path style="stroke:#fff;stroke-width:0;stroke-dasharray:none;stroke-linecap:butt;stroke-dashoffset:0;stroke-linejoin:miter;stroke-miterlimit:4;fill:#111;fill-rule:nonzero;opacity:1" stroke-linecap="round" d="M -33.16071 25.30347 C -35.26675 24.713710000000003 -37.021860000000004 23.25476 -37.98653 21.29195 C -38.95121 19.32914 -39.0341 17.04834 -38.21447 15.020669999999999 L -38.21447 15.020669999999999 L -38.21447 15.020669999999999 C -28.42178 -9.205020000000001 -9.211359999999999 -28.41564 15.014230000000005 -38.20859 L 15.047580000000005 -38.22207 L 15.047580000000005 -38.22207 C 17.067020000000007 -39.03841 19.338600000000007 -38.95586 21.293460000000003 -37.995110000000004 C 23.248330000000003 -37.03435 24.701380000000004 -35.286350000000006 25.288750000000004 -33.188840000000006 L 37.998650000000005 12.198379999999993 L 37.998650000000005 12.198379999999993 C 40.03828000000001 19.481909999999992 37.990640000000006 27.299259999999993 32.64228000000001 32.64761999999999 C 27.293920000000007 37.99597999999999 19.476570000000006 40.04361999999999 12.193040000000007 38.00398999999999 z" transform="matrix(-0.6562947252 0.6562947252 -0.6562947252 -0.6562947252 170 110) translate(-7.913e-7, 0.0000091739)" vector-effect="non-scaling-stroke"/></g><g id="sLvjm8ckG9Tn4B020NjmX"><path style="stroke:#fff;stroke-width:0;stroke-dasharray:none;stroke-linecap:butt;stroke-dashoffset:0;stroke-linejoin:miter;stroke-miterlimit:4;fill:#bebebe;fill-rule:nonzero;opacity:1" stroke-linecap="round" d="M -29.98183 19.80196 L -29.17187 17.09468 L -29.17187 17.09468 C -22.390079999999998 -5.573499999999999 -4.466099999999997 -23.18579 18.31756 -29.568920000000002 L 19.88717 -30.008660000000003 L 29.21402 3.473359999999996 L 29.21402 3.473359999999996 C 31.243070000000003 10.757369999999996 29.183770000000003 18.569419999999994 23.82768 23.906659999999995 C 18.47159 29.243899999999996 10.652330000000001 31.275649999999995 3.375510000000002 29.220929999999996 z" transform="matrix(-0.6562947251 0.6562947251 -0.6562947251 -0.6562947251 158.4921266728 110.0839790702) translate(-0.0000037498, -3.945e-7)" vector-effect="non-scaling-stroke"/></g><g id="itojFe0oOsJTunxHV6_ba"><path style="stroke:#fff;stroke-width:0;stroke-dasharray:none;stroke-linecap:butt;stroke-dashoffset:0;stroke-linejoin:miter;stroke-miterlimit:4;fill:#111;fill-rule:nonzero;opacity:1" stroke-linecap="round" d="M -33.16071 25.30347 C -35.26675 24.713710000000003 -37.021860000000004 23.25476 -37.98653 21.29195 C -38.95121 19.32914 -39.0341 17.04834 -38.21447 15.020669999999999 L -38.21447 15.020669999999999 L -38.21447 15.020669999999999 C -28.42178 -9.205020000000001 -9.211359999999999 -28.41564 15.014230000000005 -38.20859 L 15.047580000000005 -38.22207 L 15.047580000000005 -38.22207 C 17.067020000000007 -39.03841 19.338600000000007 -38.95586 21.293460000000003 -37.995110000000004 C 23.248330000000003 -37.03435 24.701380000000004 -35.286350000000006 25.288750000000004 -33.188840000000006 L 37.998650000000005 12.198379999999993 L 37.998650000000005 12.198379999999993 C 40.03828000000001 19.481909999999992 37.990640000000006 27.299259999999993 32.64228000000001 32.64761999999999 C 27.293920000000007 37.99597999999999 19.476570000000006 40.04361999999999 12.193040000000007 38.00398999999999 z" transform="matrix(-0.2402205418 -0.8965152669 0.8965152669 -0.2402205418 81.095890411 162.7397260274) translate(-7.913e-7, 0.0000091739)" vector-effeLine truncated
|
||||
|
Before Width: | Height: | Size: 8.6 KiB After Width: | Height: | Size: 7.9 KiB |
|
Before Width: | Height: | Size: 20 KiB |
|
Before Width: | Height: | Size: 31 KiB |
|
Before Width: | Height: | Size: 2.9 KiB |
@@ -12,13 +12,13 @@
|
||||
"logout": "Odhlášení",
|
||||
"delete": "Smazat",
|
||||
"edit": "Upravit",
|
||||
"cancel": "Storno",
|
||||
"confirm": "Jste si jistý?",
|
||||
"cancel": "Zrušit",
|
||||
"confirm": "Jste si jisti?",
|
||||
"filter": "Filtr",
|
||||
"clear": "Přehled",
|
||||
"refresh": "Obnovit",
|
||||
"clear": "Vymazat",
|
||||
"refresh": "Znovu načíst",
|
||||
"show": "Zobrazit",
|
||||
"undo": "Zpět",
|
||||
"undo": "Vrátit zpět",
|
||||
"import": "Import",
|
||||
"clone": "Duplikovat",
|
||||
"archive": "Archivovat",
|
||||
@@ -27,13 +27,14 @@
|
||||
"showArchived": "Zobrazit archivované",
|
||||
"notAccessTitle": "Nemáte oprávnění k přístupu",
|
||||
"hideColumns": "Skrýt sloupce",
|
||||
"clearFilters": "Zrušit filtry",
|
||||
"saveAndAdd": "Uložit a přidat"
|
||||
"clearFilters": "Vypnout filtry",
|
||||
"saveAndAdd": "Uložit a přidat",
|
||||
"continue": "Pokračovat"
|
||||
},
|
||||
"warnWhenUnsavedChanges": "Jste si jisti, že chcete odejít? Máte neuložené změny.",
|
||||
"notifications": {
|
||||
"success": "Úspěšné",
|
||||
"error": "Chyba (status code: {{statusCode}})",
|
||||
"error": "Chyba (kód chyby: {{statusCode}})",
|
||||
"undoable": "Máte {{seconds}} sekund na zrušení.",
|
||||
"createSuccess": "Úspěšně vytvořeno {{resource}}",
|
||||
"createError": "Při vytváření došlo k chybě {{resource}} (status code: {{statusCode}})",
|
||||
@@ -41,7 +42,9 @@
|
||||
"deleteError": "Chyba při odstranění {{resource}} (status code: {{statusCode}})",
|
||||
"editSuccess": "Úspěšně upraveno {{resource}}",
|
||||
"editError": "Chyba při úpravě {{resource}} (status code: {{statusCode}})",
|
||||
"importProgress": "Importování: {{processed}}/{{total}}"
|
||||
"importProgress": "Importování: {{processed}}/{{total}}",
|
||||
"saveSuccessful": "Úspěšně uloženo!",
|
||||
"validationError": "Chyba ověření: {{error}}"
|
||||
},
|
||||
"loading": "Načítání",
|
||||
"version": "Verze",
|
||||
@@ -56,9 +59,9 @@
|
||||
},
|
||||
"printing": {
|
||||
"generic": {
|
||||
"title": "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ě. 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.",
|
||||
"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é 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",
|
||||
@@ -85,35 +88,63 @@
|
||||
"none": "Žádný",
|
||||
"border": "Ohraničení",
|
||||
"grid": "Mřížka"
|
||||
}
|
||||
},
|
||||
"itemCopies": "Kopie položky",
|
||||
"defaultSettings": "Výchozí",
|
||||
"addSettings": "Přidat novou předvolbu",
|
||||
"newSetting": "Nový",
|
||||
"deleteSettings": "Smazat aktuální předvolbu",
|
||||
"settingsName": "Název předvolby",
|
||||
"settings": "Předvolby",
|
||||
"deleteSettingsConfirm": "Opravdu chcete tuto předvolbu smazat?",
|
||||
"duplicateSettings": "Duplikát",
|
||||
"saveSetting": "Uložit předvolby",
|
||||
"saveAsImage": "Uložit jako obrázek"
|
||||
},
|
||||
"qrcode": {
|
||||
"button": "Tisk QR kódů",
|
||||
"title": "Tisk QR kódů",
|
||||
"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 obsahu",
|
||||
"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",
|
||||
"showSpoolComment": "Poznámka k cívce",
|
||||
"showFilamentComment": "Poznámka k filamentu",
|
||||
"showVendorComment": "Poznámka k výrobci"
|
||||
"showVendorComment": "Poznámka k výrobci",
|
||||
"useHTTPUrl": {
|
||||
"label": "Odkaz na QR kód",
|
||||
"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.",
|
||||
"options": {
|
||||
"default": "Výchozí",
|
||||
"url": "URL"
|
||||
},
|
||||
"preview": "Náhled:"
|
||||
},
|
||||
"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": {
|
||||
"no": "Ne",
|
||||
"simple": "Jednoduchý",
|
||||
"withIcon": "S ikonou"
|
||||
}
|
||||
},
|
||||
"spoolSelect": {
|
||||
"title": "Vybrat cívky",
|
||||
"description": "Vyberte cívky pro tisk QR kódů.",
|
||||
"description": "Vyberte cívky, pro které chcete tisknout etikety.",
|
||||
"showArchived": "Zobrazit archivované",
|
||||
"noSpoolsSelected": "Nevybrali jste žádné cívky.",
|
||||
"selectAll": "Vybrat/odebrat vše",
|
||||
"selectedTotal_one": "{{count}} vybraná cívka",
|
||||
"selectedTotal_few": "{{count}} vybraných cívek",
|
||||
"selectedTotal_other": "{{count}} vybrané cívky"
|
||||
"selectedTotal_few": "{{count}} vybrané cívky",
|
||||
"selectedTotal_other": "{{count}} vybraných cívek"
|
||||
}
|
||||
},
|
||||
"scanner": {
|
||||
@@ -142,13 +173,17 @@
|
||||
"used_length": "Použitá délka",
|
||||
"remaining_length": "Zbývající délka",
|
||||
"location": "Umístění",
|
||||
"lot_nr": "Číslo umístění",
|
||||
"lot_nr": "Číslo šarže",
|
||||
"first_used": "První použití",
|
||||
"last_used": "Naposledy použitá",
|
||||
"registered": "Registrováno",
|
||||
"comment": "Komentář",
|
||||
"archived": "Archivováno",
|
||||
"price": ""
|
||||
"price": "Cena",
|
||||
"spool_weight": "Prázdná hmotnost",
|
||||
"initial_weight": "Výchozí hmotnost",
|
||||
"filament_internal": "Interní",
|
||||
"filament_external": "Externí"
|
||||
},
|
||||
"fields_help": {
|
||||
"weight_to_use": "Vyberte, jakou hodnotu hmotnosti chcete zadat. Naměřená hmotnost je k dispozici pouze v případě, že je pro vybraný filament nastavena hmotnost cívky.",
|
||||
@@ -157,7 +192,10 @@
|
||||
"measured_weight": "Jaká je hmotnost filamentu a cívky.",
|
||||
"location": "Kde se cívka nachází, pokud máte více míst, kde cívky skladujete.",
|
||||
"lot_nr": "Číslo šarže výrobce. Lze použít k zajištění jednotné barvy tisku v případě použití více cívek.",
|
||||
"price": ""
|
||||
"price": "Cena celé cívky. Pokud není nastavena, předpokládá se cena filamentu.",
|
||||
"spool_weight": "Hmotnost prázdné cívky. Nechte prázdné, chcete-li použít hodnotu z filamentu nebo od výrobce.",
|
||||
"initial_weight": "Počáteční hmotnost vlákna na cívce (čistá hmotnost). Pokud není nastavena, použije se hmotnost z objektu filament.",
|
||||
"external_filament": "Vybrali jste filament z externí databáze. Objekt filamentu (a případně i objekt výrobce) se vytvoří automaticky při vytvoření této cívky. Tím se mohou vytvořit duplicitní objekty filamentů, pokud jste již objekt filamentu pro toto vlákno vytvořili."
|
||||
},
|
||||
"titles": {
|
||||
"create": "Vytvořit cívku",
|
||||
@@ -166,14 +204,25 @@
|
||||
"list": "Cívky",
|
||||
"show": "Zobrazit cívku",
|
||||
"archive": "Archivní cívka",
|
||||
"show_title": "[Cívka #{{id}}] {{name}}"
|
||||
"show_title": "[Cívka #{{id}}] {{name}}",
|
||||
"adjust": "Nastavení cívky filamentu"
|
||||
},
|
||||
"messages": {
|
||||
"archive": "Opravdu chcete tuto cívku archivovat?"
|
||||
},
|
||||
"form": {
|
||||
"new_location_prompt": "Zadejte nové umístění",
|
||||
"spool_updated": "Od otevření této stránky byla tato cívka někým/něčím aktualizována. Uložením se tyto změny přepíší!"
|
||||
"spool_updated": "Od otevření této stránky byla tato cívka někým/něčím aktualizována. Uložením se tyto změny přepíší!",
|
||||
"measurement_type": {
|
||||
"length": "Délka",
|
||||
"weight": "Hmotnost"
|
||||
},
|
||||
"measurement_type_label": "Typ měření",
|
||||
"adjust_filament_help": "Zde můžete přímo přidávat nebo odebírat filament z cívky. Kladná hodnota filament odebere, záporná hodnota ho přidá.",
|
||||
"adjust_filament_value": "Spotřebované množství"
|
||||
},
|
||||
"formats": {
|
||||
"last_used": "Naposledy použitý {{date}}"
|
||||
}
|
||||
},
|
||||
"filament": {
|
||||
@@ -195,15 +244,21 @@
|
||||
"settings_extruder_temp": "Teplota extruderu",
|
||||
"settings_bed_temp": "Teplota podložky",
|
||||
"color_hex": "Barva",
|
||||
"spools": "Zobrazit cívky"
|
||||
"spools": "Zobrazit cívky",
|
||||
"external_id": "Externí ID",
|
||||
"single_color": "Jediný",
|
||||
"coaxial": "Koextrudovaný",
|
||||
"longitudinal": "Podélná",
|
||||
"multi_color": "Více"
|
||||
},
|
||||
"fields_help": {
|
||||
"name": "Název filamentu, aby se tento typ filamentu odlišil od ostatních filamentů od stejného dodavatele. Měl by obsahovat například barvu.",
|
||||
"name": "Název filamentu, aby se tento typ vlákna odlišil od ostatních filamentů od stejného výrobce. Měl by obsahovat například barvu.",
|
||||
"material": "Např. PLA, ABS, ASA, PETG, atd.",
|
||||
"price": "Cena celé cívky v měně nastavené v systému.",
|
||||
"price": "Cena celé cívky.",
|
||||
"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.",
|
||||
"spool_weight": "Hmotnost prázdné cívky. Slouží k určení naměřené hmotnosti cívky.",
|
||||
"article_number": "Např. EAN, UPC, atd."
|
||||
"article_number": "Např. EAN, UPC, atd.",
|
||||
"multi_color_direction": "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."
|
||||
},
|
||||
"titles": {
|
||||
"create": "Vytvořit filament",
|
||||
@@ -214,7 +269,12 @@
|
||||
"show_title": "[Filament #{{id}}] {{name}}"
|
||||
},
|
||||
"form": {
|
||||
"filament_updated": "Toto vlákno bylo od doby, kdy jste otevřeli tuto stránku, někým/něčím aktualizováno. Uložením se tyto změny přepíší!"
|
||||
"filament_updated": "Toto vlákno bylo od doby, kdy jste otevřeli tuto stránku, někým/něčím aktualizováno. Uložením se tyto změny přepíší!",
|
||||
"import_external": "Import z externího zdroje",
|
||||
"import_external_description": "Výběrem filamentu v seznamu se automaticky vyplní jeho údaje ve formuláři pro vytvoření filamentu. Tím se přepíší všechny údaje, které jste do formuláře zadali.<br><br>Po kliknutí na tlačítko OK se v případě potřeby automaticky vytvoří objekt Výrobce."
|
||||
},
|
||||
"buttons": {
|
||||
"add_spool": "Přidat cívku"
|
||||
}
|
||||
},
|
||||
"vendor": {
|
||||
@@ -223,7 +283,9 @@
|
||||
"id": "Id",
|
||||
"name": "Název",
|
||||
"registered": "Registrováno",
|
||||
"comment": "Komentář"
|
||||
"comment": "Komentář",
|
||||
"empty_spool_weight": "Hmotnost prázdné cívky",
|
||||
"external_id": "Externí ID"
|
||||
},
|
||||
"titles": {
|
||||
"create": "Vytvořit výrobce",
|
||||
@@ -235,6 +297,9 @@
|
||||
},
|
||||
"form": {
|
||||
"vendor_updated": "Od otevření této stránky byl tento prodejce někým/něčím aktualizován. Uložením se tyto změny přepíší!"
|
||||
},
|
||||
"fields_help": {
|
||||
"empty_spool_weight": "Hmotnost prázdné cívky od tohoto výrobce."
|
||||
}
|
||||
},
|
||||
"table": {
|
||||
@@ -269,6 +334,9 @@
|
||||
},
|
||||
"help": {
|
||||
"list": "Nápověda | Spoolman"
|
||||
},
|
||||
"locations": {
|
||||
"list": "Umístění | Spoolman"
|
||||
}
|
||||
},
|
||||
"help": {
|
||||
@@ -277,11 +345,75 @@
|
||||
"filament": "Značky vláken. Mají vlastnosti, jako je název, materiál, barva, průměr a další.",
|
||||
"spool": "Jednotlivé fyzické cívky určitého vlákna."
|
||||
},
|
||||
"description": "<title>Nápověda</title><p>Zde je několik tipů, které vám pomohou začít.</p><p>Spoolman uchovává 3 různé typy dat:</p><itemsHelp/><p>Chcete-li do databáze přidat novou cívku, začněte vytvořením položky <filamentCreateLink>Filament</filamentCreateLink> objekt. Jakmile to uděláte, vytvořte položku<spoolCreateLink>Cívka</spoolCreateLink> objekt pro danou cívku. Pokud později získáte další cívky stejného filamenzu, jednoduše vygenerujte další objekty Cívky a znovu použijte stejný objekt Filament.</p><p>Volitelně můžete také vygenerovat <vendorCreateLink>Výrobce</vendorCreateLink> objekt společnosti vyrábějící vlákno, pokud si přejete tyto informace sledovat.</p><p>Máte možnost propojit se Spoolmanem další služby 3D tiskárny, například Moonraker, který může automaticky sledovat využití filamentu a aktualizovat objekty Cívek za vás. Pokyny k nastavení najdete v <readmeLink>Spoolman README</readmeLink>.</p>",
|
||||
"description": "<title>Nápověda</title><p>Zde je několik tipů, které vám pomohou začít.</p><p>Spoolman ukládá 3 různé typy dat:</p><itemsHelp/><p>Chcete-li do databáze přidat novou cívku, začněte vytvořením položky <filamentCreateLink>Filament</filamentCreateLink> . Jakmile to uděláte, vytvořte položku <spoolCreateLink>Cívka</spoolCreateLink> s popisem pro danou cívku. Pokud později získáte další cívky stejného filamentu, jednoduše vygenerujte další Cívku a použijte opět stejný Filament.</p><p>Volitelně můžete také vygenerovat <vendorCreateLink>Výrobce</vendorCreateLink> název společnosti vyrábějící filamenty, pokud si přejete tyto informace sledovat.</p><p>Máte možnost propojit se Spoolmanem další služby 3D tiskárny, například Moonraker, který může automaticky sledovat využití filamentu a aktualizovat dané Cívky za vás. Pokyny k nastavení najdete v <readmeLink>Spoolman README</readmeLink>.</p>",
|
||||
"help": "Nápověda"
|
||||
},
|
||||
"kofi": "Příspěvek na Ko-fi",
|
||||
"kofi": "Příspěvek autorovi na Ko-fi",
|
||||
"home": {
|
||||
"home": "Domů"
|
||||
"home": "Domů",
|
||||
"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": {
|
||||
"extra_fields": {
|
||||
"tab": "Další pole",
|
||||
"params": {
|
||||
"key": "Klíč",
|
||||
"name": "Název",
|
||||
"field_type": "Typ",
|
||||
"order": "Objednávka",
|
||||
"default_value": "Výchozí hodnota",
|
||||
"multi_choice": "Výběr z více možností",
|
||||
"unit": "Jednotka",
|
||||
"choices": "Volby"
|
||||
},
|
||||
"field_type": {
|
||||
"text": "Text",
|
||||
"integer": "Celé číslo",
|
||||
"integer_range": "Rozsah celých čísel",
|
||||
"float": "Plovoucí",
|
||||
"datetime": "Datumčas",
|
||||
"choice": "Volba",
|
||||
"float_range": "Plovoucí rozsah",
|
||||
"boolean": "Logická hodnota"
|
||||
},
|
||||
"boolean_true": "Ano",
|
||||
"boolean_false": "Ne",
|
||||
"choices_missing_error": "Volby nelze odstranit. Chybí následující volby: {{choices}}",
|
||||
"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, 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": {
|
||||
"tab": "Obecné",
|
||||
"currency": {
|
||||
"label": "Měna"
|
||||
},
|
||||
"base_url": {
|
||||
"label": "Základní URL",
|
||||
"tooltip": "Základní adresa URL, která se má použít při generování funkcí, jako jsou QR kódy."
|
||||
},
|
||||
"round_prices": {
|
||||
"label": "Zaokrouhlené ceny",
|
||||
"tooltip": "Zaokrouhlete ceny na nejbližší celé číslo."
|
||||
}
|
||||
},
|
||||
"settings": "Nastavení"
|
||||
},
|
||||
"locations": {
|
||||
"locations": "Umístění",
|
||||
"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,20 +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"
|
||||
"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",
|
||||
@@ -34,39 +51,50 @@
|
||||
"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",
|
||||
"showBorder": "Vis ramme",
|
||||
"printerMarginLeft": "Safe-Zone venstre",
|
||||
"dimensions": "Dimensioner",
|
||||
"print": "Udskriv"
|
||||
"print": "Udskriv",
|
||||
"settings": "Forudindstillinger",
|
||||
"defaultSettings": "Standard",
|
||||
"addSettings": "Tilføj ny forudindstilling",
|
||||
"newSetting": "Ny",
|
||||
"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": {
|
||||
"vendor": {
|
||||
"create": "Opret sælger | Spoolman",
|
||||
"clone": "#{{id}} Klon sælger | Spoolman",
|
||||
"edit": "#{{id}} Redigér sælger | Spoolman",
|
||||
"list": "Sælgere | Spoolman",
|
||||
"show": "#{{id}} Vis sælger | Spoolman"
|
||||
"create": "Opret producent | Spoolman",
|
||||
"clone": "#{{id}} Klon producent | Spoolman",
|
||||
"edit": "#{{id}} Redigér producent | Spoolman",
|
||||
"list": "Producenter | Spoolman",
|
||||
"show": "#{{id}} Vis producent | Spoolman"
|
||||
},
|
||||
"default": "Spoolman",
|
||||
"spool": {
|
||||
@@ -89,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",
|
||||
@@ -106,11 +137,15 @@
|
||||
"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",
|
||||
"price": ""
|
||||
"price": "Pris",
|
||||
"initial_weight": "Startvægt",
|
||||
"spool_weight": "Tom vægt",
|
||||
"filament_internal": "Intern",
|
||||
"filament_external": "Ekstern"
|
||||
},
|
||||
"titles": {
|
||||
"archive": "Arkivér spole",
|
||||
@@ -119,31 +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": ""
|
||||
"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",
|
||||
@@ -158,51 +207,63 @@
|
||||
"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 i systemets valutaenhed.",
|
||||
"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."
|
||||
"price": "Pris for en ny spole.",
|
||||
"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": "Sælger",
|
||||
"settings_extruder_temp": "Extruder temperatur",
|
||||
"vendor_name": "Producent",
|
||||
"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",
|
||||
"vendor": "Sælger",
|
||||
"settings_bed_temp": "Printpladetemperatur",
|
||||
"vendor": "Producent",
|
||||
"density": "Massefylde",
|
||||
"id": "ID",
|
||||
"color_hex": "Farve",
|
||||
"article_number": "Produkt nummer",
|
||||
"spools": "Vis spoler"
|
||||
"article_number": "Produktnummer",
|
||||
"spools": "Vis spoler",
|
||||
"external_id": "Eksternt ID",
|
||||
"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",
|
||||
"list": "Filamenter"
|
||||
},
|
||||
"form": {
|
||||
"filament_updated": "Dette filament er blevet redigeret af nogen/noget andet siden du åbnede denne side. Hvis du gemmer overskrives disse ændringer!"
|
||||
"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 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"
|
||||
"filament": "Filamenter",
|
||||
"buttons": {
|
||||
"add_spool": "Tilføj spole"
|
||||
}
|
||||
},
|
||||
"actions": {
|
||||
"create": "Opret",
|
||||
@@ -213,47 +274,54 @@
|
||||
},
|
||||
"vendor": {
|
||||
"titles": {
|
||||
"show_title": "[Sælger #{{id}}] {{name}}",
|
||||
"show": "Vis sælger",
|
||||
"edit": "Redigér sælger",
|
||||
"clone": "Klon sælger",
|
||||
"create": "Opret sælger",
|
||||
"list": "Sælgere"
|
||||
"show_title": "[Producent #{{id}}] {{name}}",
|
||||
"show": "Vis producent",
|
||||
"edit": "Redigér producent",
|
||||
"clone": "Klon producent",
|
||||
"create": "Opret producent",
|
||||
"list": "Producenter"
|
||||
},
|
||||
"form": {
|
||||
"vendor_updated": "Denne sælger er blevet redigeret af nogen/noget andet siden du åbnede denne side. Hvis du gemmer overskrives disse ændringer!"
|
||||
"vendor_updated": "Denne producent er blevet redigeret af nogen/noget andet siden du åbnede denne side. Hvis du gemmer overskrives disse ændringer!"
|
||||
},
|
||||
"fields": {
|
||||
"registered": "Registreret",
|
||||
"comment": "Kommentar",
|
||||
"name": "Navn",
|
||||
"id": "ID"
|
||||
"id": "ID",
|
||||
"external_id": "Eksternt ID",
|
||||
"empty_spool_weight": "Tom Spolevægt"
|
||||
},
|
||||
"vendor": "Sælgere"
|
||||
"vendor": "Producenter",
|
||||
"fields_help": {
|
||||
"empty_spool_weight": "Vægten af en tom spole fra denne producent."
|
||||
}
|
||||
},
|
||||
"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}}"
|
||||
},
|
||||
"no": "Nej",
|
||||
"unknown": "Ukendt",
|
||||
@@ -262,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"
|
||||
@@ -272,15 +340,72 @@
|
||||
},
|
||||
"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>Forhandler</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",
|
||||
"general": {
|
||||
"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": {
|
||||
"params": {
|
||||
"key": "Nøgle",
|
||||
"name": "Navn",
|
||||
"field_type": "Type",
|
||||
"unit": "Enhed",
|
||||
"order": "Sortering",
|
||||
"default_value": "Standardværdi",
|
||||
"multi_choice": "Multi-valg",
|
||||
"choices": "Valgmuligheder"
|
||||
},
|
||||
"field_type": {
|
||||
"integer_range": "Heltalspænd",
|
||||
"float": "Decimaltal",
|
||||
"float_range": "Decimaltalspænd",
|
||||
"datetime": "Dato-tid",
|
||||
"boolean": "Boolean (Ja/Nej)",
|
||||
"choice": "Valg",
|
||||
"text": "Tekst",
|
||||
"integer": "Heltal"
|
||||
},
|
||||
"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 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.",
|
||||
"key_not_changed": "Ændr venligst nøglen til noget andet.",
|
||||
"delete_confirm": "Slet felt: {{name}}?",
|
||||
"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!"
|
||||
}
|
||||
}
|
||||
@@ -13,37 +13,40 @@
|
||||
"delete": "Löschen",
|
||||
"edit": "Bearbeiten",
|
||||
"cancel": "Abbrechen",
|
||||
"confirm": "Sicher?",
|
||||
"confirm": "bist du sicher?",
|
||||
"filter": "Filter",
|
||||
"clear": "Löschen",
|
||||
"clear": "Bereinigen",
|
||||
"refresh": "Aktualisieren",
|
||||
"show": "Anzeigen",
|
||||
"undo": "Rückgängig",
|
||||
"import": "Importieren",
|
||||
"clone": "Duplizieren",
|
||||
"notAccessTitle": "Keine Berechtigung, um hierauf zuzugreifen",
|
||||
"hideColumns": "Spalten anpassen",
|
||||
"clearFilters": "Filter leeren",
|
||||
"notAccessTitle": "Du hast keine Zugriffsberechtigung",
|
||||
"hideColumns": "Spalten ausblenden",
|
||||
"clearFilters": "Filter bereinigen",
|
||||
"showArchived": "Archivierte anzeigen",
|
||||
"archive": "Archivieren",
|
||||
"archive": "Archiv",
|
||||
"hideArchived": "Archivierte verstecken",
|
||||
"unArchive": "Archivieren rückgängig",
|
||||
"saveAndAdd": "Speichern und hinzufügen"
|
||||
"unArchive": "Archivieren rückgängig machen",
|
||||
"saveAndAdd": "Speichern und hinzufügen",
|
||||
"continue": "Weiter"
|
||||
},
|
||||
"warnWhenUnsavedChanges": "Sicher? Nicht gespeicherte Änderungen gehen verloren.",
|
||||
"warnWhenUnsavedChanges": "Sicher? Es sind nicht gespeicherte Änderungen vorhanden.",
|
||||
"notifications": {
|
||||
"success": "Erfolg",
|
||||
"success": "Erfolgreich",
|
||||
"error": "Fehler (status code: {{statusCode}})",
|
||||
"undoable": "Noch {{seconds}} Sekunden um die Aktion rückgängig zu machen.",
|
||||
"createSuccess": "{{resource}} erfolgreich erstellt",
|
||||
"createError": "Fehler beim Erstellen {{resource}} (status code: {{statusCode}})",
|
||||
"createError": "Fehler beim erstellen von {{resource}} (status code: {{statusCode}})",
|
||||
"deleteSuccess": "{{resource}} erfolgreich gelöscht",
|
||||
"deleteError": "Fehler beim Löschen {{resource}} (status code: {{statusCode}})",
|
||||
"deleteError": "Fehler beim löschen von {{resource}} (status code: {{statusCode}})",
|
||||
"editSuccess": "{{resource}} erfolgreich bearbeitet",
|
||||
"editError": "Fehler beim Bearbeiten {{resource}} (status code: {{statusCode}})",
|
||||
"importProgress": "{{processed}}/{{total}} importiert"
|
||||
"editError": "Fehler beim bearbeiten von {{resource}} (status code: {{statusCode}})",
|
||||
"importProgress": "{{processed}}/{{total}} importiert",
|
||||
"saveSuccessful": "Erfolgreich gespeichert!",
|
||||
"validationError": "Validierungsfehler: {{error}}"
|
||||
},
|
||||
"loading": "Laden",
|
||||
"loading": "Läd",
|
||||
"version": "Version",
|
||||
"unknown": "Unbekannt",
|
||||
"yes": "Ja",
|
||||
@@ -56,19 +59,19 @@
|
||||
},
|
||||
"printing": {
|
||||
"generic": {
|
||||
"title": "Drucken",
|
||||
"description": "Einstellungen unten anpassen, um das gewünschte Drucklayout zu erstellen. Der Drucker oder das Betriebssystem fügen möglichweise eigene Abstände und Skalierungen hinzu. Eventuell muss ein wenig experimentiert werden, bevor alles korrekt funktioniert. Auf normalem Papier testen, bevor auf Label-Papier gedruckt wird.",
|
||||
"helpMargin": "Abstände sollten so konfiguriert werden, dass sie zum Papier und Drucker passen. Änderungen beeinflussen die Größe des gesamten Gitters.",
|
||||
"helpPrinterMargin": "Der Sicherheitsabstand sollte so eingestellt werden, wie dicht der Drucker am Rand des Papiers drucken kann. Änderungen beeinflussen nicht die Größe des Gitters.",
|
||||
"title": "Drucke",
|
||||
"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.",
|
||||
"helpMargin": "Abstände sollten so konfiguriert werden, dass sie zum Papier und Drucker passen. Änderungen beeinflussen die Abmessungen des gesamten Gitters.",
|
||||
"helpPrinterMargin": "Der Sicherheitsabstand sollte so eingestellt werden, wie dicht der Drucker am Rand des Papiers drucken kann. Änderungen beeinflussen nicht die Abmessungen des Gitters.",
|
||||
"print": "Drucken",
|
||||
"columns": "Spalten",
|
||||
"rows": "Reihen",
|
||||
"rows": "Zeilen",
|
||||
"paperSize": "Papiergröße",
|
||||
"customSize": "Benutzerdefiniert",
|
||||
"dimensions": "Dimensionen",
|
||||
"showBorder": "Rahmen anzeigen",
|
||||
"showBorder": "Ränder anzeigen",
|
||||
"previewScale": "Vorschau-Skalierung",
|
||||
"skipItems": "Elemente überspringen",
|
||||
"skipItems": "Objekt überspringen",
|
||||
"contentSettings": "Einstellungen: Inhalt",
|
||||
"layoutSettings": "Einstellungen: Layout",
|
||||
"horizontalSpacing": "Horizontaler Abstand",
|
||||
@@ -83,17 +86,28 @@
|
||||
"printerMarginBottom": "Sicherheitsabstand Unten",
|
||||
"borders": {
|
||||
"none": "Keine",
|
||||
"border": "Rahmen",
|
||||
"border": "Ränder",
|
||||
"grid": "Gitter"
|
||||
}
|
||||
},
|
||||
"saveAsImage": "Als Bild speichern",
|
||||
"settings": "Vorlage",
|
||||
"defaultSettings": "Standard",
|
||||
"addSettings": "Neue Vorlage hinzufügen",
|
||||
"newSetting": "Neu",
|
||||
"deleteSettings": "Aktuelle Vorlage löschen",
|
||||
"deleteSettingsConfirm": "Bist du dir sicher, dass du diese Vorlage löschen willst?",
|
||||
"settingsName": "Vorlagenname",
|
||||
"itemCopies": "Anzahl der Kopien",
|
||||
"duplicateSettings": "Kopie erstellen",
|
||||
"saveSetting": "Vorlage speichern"
|
||||
},
|
||||
"qrcode": {
|
||||
"button": "QR-Codes drucken",
|
||||
"title": "QR Codes Drucken",
|
||||
"button": "Beschriftung drucken",
|
||||
"title": "Beschriftung drucken",
|
||||
"spoolWeight": "Gewicht Spule: {{weight}}",
|
||||
"lotNr": "Ch. Nr: {{lot}}",
|
||||
"lotNr": "Lot. Nr: {{lot}}",
|
||||
"bedTemp": "BT: {{temp}}",
|
||||
"extruderTemp": "DT: {{temp}}",
|
||||
"extruderTemp": "ET: {{temp}}",
|
||||
"textSize": "Textgröße Label",
|
||||
"showSpoolmanIcon": "Spoolman Icon anzeigen",
|
||||
"showVendor": "Hersteller",
|
||||
@@ -103,13 +117,30 @@
|
||||
"showTemperatures": "Temperaturen",
|
||||
"showSpoolComment": "Kommentar: Spule",
|
||||
"showFilamentComment": "Kommentar: Filament",
|
||||
"showVendorComment": "Kommentar: Hersteller"
|
||||
"showVendorComment": "Kommentar: Hersteller",
|
||||
"showQRCodeMode": {
|
||||
"no": "Nein",
|
||||
"simple": "Einfach",
|
||||
"withIcon": "Mit Icon"
|
||||
},
|
||||
"template": "Beschriftung Vorlagen",
|
||||
"templateHelp": "Benutze {} um Texte der Spule dynamisch zu übernehmen. Zum Beispiel wird {id} durch die ID der Spule ersetzt, {filament.material} wird durch das Material der Spule ersetzt. Wenn ein Wert fehlt, wird er mit \"?\" ersetzt. Ein zweiter Satz von {} kann genutzt werden, um dieses zu umgehen. Zusätzlich wird jeglicher Text zwischen einem Satz von {} entfernt, wenn der Wert fehlt. Beispielsweise zeigt {Charge: {lot_nr}} nur das Label an, wenn eine Spule eine Charge definiert hat. Texte zwischen zwei Sternen ** werden fett dargestellt. Drücke auf den Knopf um alle verfügbaren Variablen zu sehen.",
|
||||
"showQRCode": "Drucke QR Code",
|
||||
"useHTTPUrl": {
|
||||
"label": "QR Code Link",
|
||||
"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.",
|
||||
"options": {
|
||||
"default": "Standard",
|
||||
"url": "URL"
|
||||
},
|
||||
"preview": "Vorschau:"
|
||||
}
|
||||
},
|
||||
"spoolSelect": {
|
||||
"title": "Spulenauswahl",
|
||||
"description": "Spulen auswählen, für die ein QR-Code gedruckt werden soll.",
|
||||
"description": "Spulen auswählen, für die ein Label gedruckt werden soll.",
|
||||
"showArchived": "Archivierte anzeigen",
|
||||
"noSpoolsSelected": "Keine Spulen ausgewählt.",
|
||||
"noSpoolsSelected": "Du hast keine Spulen ausgewählt.",
|
||||
"selectAll": "Alle aus-/abwählen",
|
||||
"selectedTotal_one": "{{count}} Spule ausgewählt",
|
||||
"selectedTotal_other": "{{count}} Spulen ausgewählt"
|
||||
@@ -117,7 +148,7 @@
|
||||
},
|
||||
"scanner": {
|
||||
"title": "QR-Code Scanner",
|
||||
"description": "Spoolman QR-Code scannen, um Details zur Spule anzuzeigen.",
|
||||
"description": "Spoolman QR-Code scannen, um Details der Spule anzuzeigen.",
|
||||
"error": {
|
||||
"notAllowed": "Zugriff auf Kamera wurde nicht erlaubt.",
|
||||
"insecureContext": "Die Seite wird nicht über HTTPS bereitgestellt.",
|
||||
@@ -147,16 +178,23 @@
|
||||
"registered": "Registriert",
|
||||
"comment": "Kommentar",
|
||||
"archived": "Archiviert",
|
||||
"price": ""
|
||||
"price": "Preis",
|
||||
"initial_weight": "Anfangsgewicht",
|
||||
"spool_weight": "Leergewicht",
|
||||
"filament_internal": "Intern",
|
||||
"filament_external": "Extern"
|
||||
},
|
||||
"fields_help": {
|
||||
"weight_to_use": "Auswählen welches Gewicht verwendet werden soll. \"Gemessenes Gewicht\" ist nur verfügbar, wenn das Gewicht der Spule für das Filament hinterlegt ist.",
|
||||
"weight_to_use": "Auswählen, welches Gewicht verwendet werden soll. Das gemessene Gewicht ist nur verfügbar, wenn das Gewicht der Spule für das Filament hinterlegt ist.",
|
||||
"used_weight": "Wie viel Gewicht bereits verbraucht wurde z.B. 0g für eine neue Spule.",
|
||||
"remaining_weight": "Wie viel Filament noch auf der Spule ist. Entspricht dem auf der Spule angegeben Nettogewicht, wenn die Spule neu ist.",
|
||||
"measured_weight": "Gesamtgewicht von Spule und Filament.",
|
||||
"location": "Ort, an dem die Spule gelagert wird.",
|
||||
"lot_nr": "Chargennummer des Herstellers. Kann verwendet werden um gleichmäßige Farben zu garantieren, wenn mehrere Spulen verwendet werden.",
|
||||
"price": ""
|
||||
"price": "Preis einer vollen Spule. Falls nicht ausgewählt, wird der Preis des Filaments geschätzt.",
|
||||
"initial_weight": "Das Anfangsgewicht des Filaments (Nettogewicht) auf der Spule. Wenn nicht gesetzt, dann wird der Wert aus dem Filament Objekt genutzt.",
|
||||
"spool_weight": "Das Gewicht der leeren Spule. Leer lassen um das Gewicht vom Hersteller zu nutzen.",
|
||||
"external_filament": "Sie haben ein Filament aus der externen Datenbank ausgewählt. Ein Filamentobjekt (und möglicherweise ein Herstellerobjekt) wird automatisch erstellt, wenn Sie diese Spule erstellen. Dadurch können doppelte Filamentobjekte entstehen, wenn Sie bereits ein Filamentobjekt für dieses Filament erstellt haben."
|
||||
},
|
||||
"titles": {
|
||||
"create": "Spule erstellen",
|
||||
@@ -165,14 +203,25 @@
|
||||
"list": "Spulen",
|
||||
"show": "Spule anzeigen",
|
||||
"archive": "Spule archivieren",
|
||||
"show_title": "[Spule #{{id}}] {{name}}"
|
||||
"show_title": "[Spule #{{id}}] {{name}}",
|
||||
"adjust": "Filamentspulen Anpassung"
|
||||
},
|
||||
"messages": {
|
||||
"archive": "Sicher das die Spule archiviert werden soll?"
|
||||
},
|
||||
"form": {
|
||||
"spool_updated": "Diese Spule wurde, seit dem die Seite geöffnet wurde, von jemand anderem/etwas anderem bearbeitet. Speichern wird diese Änderungen überschreiben!",
|
||||
"new_location_prompt": "Neue Position eingeben"
|
||||
"new_location_prompt": "Neue Position eingeben",
|
||||
"adjust_filament_help": "Hier kannst du direkt Filament von der Spule hinzufügen oder entfernen. Eine positive Eingabe wird Filament als verbraucht markieren, eine negative wird es der Spule hinzufügen.",
|
||||
"measurement_type": {
|
||||
"length": "Länge",
|
||||
"weight": "Gewicht"
|
||||
},
|
||||
"adjust_filament_value": "Verbrauchte Menge",
|
||||
"measurement_type_label": "Messungstyp"
|
||||
},
|
||||
"formats": {
|
||||
"last_used": "Zuletzt genutzt {{date}}"
|
||||
}
|
||||
},
|
||||
"filament": {
|
||||
@@ -194,7 +243,12 @@
|
||||
"settings_extruder_temp": "Düsentemperatur",
|
||||
"settings_bed_temp": "Betttemperatur",
|
||||
"color_hex": "Farbe",
|
||||
"spools": "Zeige Spulen"
|
||||
"spools": "Zeige Spulen",
|
||||
"external_id": "Externe ID",
|
||||
"single_color": "Einfarbig",
|
||||
"multi_color": "Mehrfarbig",
|
||||
"coaxial": "Coextrudiert",
|
||||
"longitudinal": "Längs"
|
||||
},
|
||||
"fields_help": {
|
||||
"name": "Name des Filaments um es von anderen Typen des gleichen Herstellers zu unterscheiden. Sollte z.B. die Farbe enthalten.",
|
||||
@@ -202,7 +256,8 @@
|
||||
"price": "Preis einer vollen Spule in der im System konfigurierten Währung.",
|
||||
"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.",
|
||||
"spool_weight": "Das Gewicht der leeren Spule. Wird verwendet, um das gemessene Gewicht der Spule zu berechnen.",
|
||||
"article_number": "z.B. EAN, UPC o.Ä."
|
||||
"article_number": "z.B. EAN, UPC o.Ä.",
|
||||
"multi_color_direction": "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, die die Farben entlang der Spule verschieben."
|
||||
},
|
||||
"titles": {
|
||||
"create": "Filament erstellen",
|
||||
@@ -213,7 +268,12 @@
|
||||
"show_title": "[Filament #{{id}}] {{name}}"
|
||||
},
|
||||
"form": {
|
||||
"filament_updated": "Dieses Filament wurde, seit dem die Seite geöffnet wurde, von jemand anderem/etwas anderem bearbeitet. Speichern wird diese Änderungen überschreiben!"
|
||||
"filament_updated": "Dieses Filament wurde, seit dem die Seite geöffnet wurde, von jemand anderem/etwas anderem bearbeitet. Speichern wird diese Änderungen überschreiben!",
|
||||
"import_external": "Importieren von extern",
|
||||
"import_external_description": "Wählen Sie ein Filament in der Liste aus, um dessen Details automatisch in das Formular zur Filamenterstellung einzutragen. Dadurch werden alle Daten, die Sie in das Formular eingegeben haben, überschrieben.<br><br>Wenn Sie auf Ok klicken, wird automatisch ein Herstellerobjekt erstellt, falls erforderlich."
|
||||
},
|
||||
"buttons": {
|
||||
"add_spool": "Spule hinzufügen"
|
||||
}
|
||||
},
|
||||
"vendor": {
|
||||
@@ -222,18 +282,23 @@
|
||||
"id": "ID",
|
||||
"name": "Name",
|
||||
"registered": "Registriert",
|
||||
"comment": "Kommentar"
|
||||
"comment": "Kommentar",
|
||||
"empty_spool_weight": "Gewicht der leeren Spule",
|
||||
"external_id": "Externe ID"
|
||||
},
|
||||
"titles": {
|
||||
"create": "Hersteller erstellen",
|
||||
"clone": "Hersteller duplizieren",
|
||||
"edit": "Hersteller bearbeiten",
|
||||
"list": "Hersteller",
|
||||
"list": "Herstellerliste",
|
||||
"show": "Hersteller anzeigen",
|
||||
"show_title": "[Marke #{{id}}] {{name}}"
|
||||
"show_title": "[Hersteller #{{id}}] {{name}}"
|
||||
},
|
||||
"form": {
|
||||
"vendor_updated": "Diese Marke wurde, seit dem die Seite geöffnet wurde, von jemand anderem/etwas anderem bearbeitet. Speichern wird diese Änderungen überschreiben!"
|
||||
"vendor_updated": "Dieser Hersteller wurde, seit dem die Seite geöffnet wurde, von jemand anderem/etwas anderem bearbeitet. Speichern wird diese Änderungen überschreiben!"
|
||||
},
|
||||
"fields_help": {
|
||||
"empty_spool_weight": "Das Gewicht einer leeren Spule von diesem Hersteller."
|
||||
}
|
||||
},
|
||||
"table": {
|
||||
@@ -257,7 +322,7 @@
|
||||
"clone": "#{{id}} Spule duplizieren | Spoolman"
|
||||
},
|
||||
"vendor": {
|
||||
"list": "Hersteler | Spoolman",
|
||||
"list": "Hersteller | Spoolman",
|
||||
"show": "#{{id}} Hersteller anzeigen | Spoolman",
|
||||
"edit": "#{{id}} Hersteller bearbeiten | Spoolman",
|
||||
"create": "Herstellen erstellen | Spoolman",
|
||||
@@ -268,6 +333,9 @@
|
||||
},
|
||||
"help": {
|
||||
"list": "Hilfe | Spoolman"
|
||||
},
|
||||
"locations": {
|
||||
"list": "Orte | Spoolman"
|
||||
}
|
||||
},
|
||||
"help": {
|
||||
@@ -281,6 +349,64 @@
|
||||
},
|
||||
"kofi": "Schick mir ein Trinkgeld über Ko-fi",
|
||||
"home": {
|
||||
"home": "Home"
|
||||
}
|
||||
"home": "Home",
|
||||
"welcome": "Willkommen auf deiner Spoolman Instanz!",
|
||||
"description": "Es sieht so aus, als hättest du noch keine Spulen hinzugefügt. Schau auf unsere <helpPageLink>Hilfeseite</helpPageLink>, falls du Hilfe beim Start benötigst."
|
||||
},
|
||||
"settings": {
|
||||
"header": "Einstellungen",
|
||||
"general": {
|
||||
"tab": "Allgemein",
|
||||
"currency": {
|
||||
"label": "Währung"
|
||||
},
|
||||
"base_url": {
|
||||
"label": "Basis URL",
|
||||
"tooltip": "Die basis URL für die Generierung von Funktionen wie QR Codes."
|
||||
},
|
||||
"round_prices": {
|
||||
"label": "Gerundeter Preis",
|
||||
"tooltip": "Rundet die Preise auf die nächsthöhere ganze Zahl."
|
||||
}
|
||||
},
|
||||
"extra_fields": {
|
||||
"tab": "Extra Felder",
|
||||
"params": {
|
||||
"name": "Name",
|
||||
"field_type": "Typ",
|
||||
"unit": "Einheit",
|
||||
"default_value": "Standardwert",
|
||||
"order": "Reihenfolge",
|
||||
"multi_choice": "Mehrfachauswahl",
|
||||
"key": "Schlüssel",
|
||||
"choices": "Auswahlmöglichkeiten"
|
||||
},
|
||||
"field_type": {
|
||||
"text": "Text",
|
||||
"float": "Dezimalzahl",
|
||||
"integer": "Ganze Zahl",
|
||||
"choice": "Auswahl",
|
||||
"integer_range": "Ganzzahlbereich",
|
||||
"boolean": "Wahr/Falsch",
|
||||
"float_range": "Float-Bereich",
|
||||
"datetime": "Datum und Uhrzeit"
|
||||
},
|
||||
"boolean_true": "Ja",
|
||||
"boolean_false": "Nein",
|
||||
"delete_confirm": "Feld {{name}} entfernen?",
|
||||
"description": "<p>Hier können Sie zusätzliche benutzerdefinierte Felder zu Ihren Elementen hinzufügen.</p><p>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.</p><p>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.</p><p>Zusätzliche Felder können in den Tabellenansichten nicht sortiert oder gefiltert werden.</p>",
|
||||
"choices_missing_error": "Du kannst die Auswahl nicht entfernen. Folgende Auswahlmöglichkeiten fehlen: {{choices}}",
|
||||
"key_not_changed": "Bitte ändere den Schlüssel auf einen anderen Wert.",
|
||||
"delete_confirm_description": "Dieses Feld und alle damit verbundenen Einträge werden gelöscht.",
|
||||
"non_unique_key_error": "Der Schlüssel muss einzigartig sein."
|
||||
},
|
||||
"settings": "Einstellungen"
|
||||
},
|
||||
"locations": {
|
||||
"no_location": "Kein Ort",
|
||||
"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": {
|
||||
@@ -110,7 +141,11 @@
|
||||
"used_weight": "Χρησιμοποιημένο Βάρος",
|
||||
"id": "Α/Α",
|
||||
"remaining_weight": "Υπολειπόμενο Βάρος",
|
||||
"price": ""
|
||||
"price": "Τιμή",
|
||||
"spool_weight": "Βάρος Κενού Καρουλιού",
|
||||
"initial_weight": "Αρχικό Βάρος",
|
||||
"filament_internal": "",
|
||||
"filament_external": ""
|
||||
},
|
||||
"titles": {
|
||||
"archive": "Αρχειοθέτηση Καρουλιού",
|
||||
@@ -119,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.",
|
||||
@@ -132,11 +175,17 @@
|
||||
"lot_nr": "Αριθμός παρτίδας κατασκευαστή. Μπορεί να χρησιμοποιηθεί για να διασφαλιστεί ότι μια εκτύπωση έχει σταθερό χρώμα εάν χρησιμοποιούνται πολλαπλά καρούλια.",
|
||||
"remaining_weight": "Πόσο νήμα έχει απομείνει στο καρούλι. Για ένα καινούργιο καρούλι αυτό πρέπει να συμπίπτει με το βάρος του καρουλιού.",
|
||||
"location": "Που βρίσκεται το καρούλι, εάν υπάρχουν πολλαπλά σημεία αποθήκευσης για τα καρούλια.",
|
||||
"price": ""
|
||||
"price": "Τιμή πλήρους καρουλιού. Εάν δεν οριστεί, η τιμή του νήματος θα θεωρηθεί αντ' αυτού.",
|
||||
"external_filament": "",
|
||||
"spool_weight": "",
|
||||
"initial_weight": ""
|
||||
},
|
||||
"spool": "Καρούλια",
|
||||
"messages": {
|
||||
"archive": "Είστε σίγουρος ότι θέλετε να αρχειοθετήσετε αυτό το καρούλι;"
|
||||
},
|
||||
"formats": {
|
||||
"last_used": ""
|
||||
}
|
||||
},
|
||||
"buttons": {
|
||||
@@ -161,16 +210,18 @@
|
||||
"unArchive": "Επαναφορά Αρχειοθετημένου",
|
||||
"clone": "Αντιγραφή",
|
||||
"clear": "Εκκαθάριση",
|
||||
"saveAndAdd": "Αποθήκευση και Προσθήκη"
|
||||
"saveAndAdd": "Αποθήκευση και Προσθήκη",
|
||||
"continue": ""
|
||||
},
|
||||
"filament": {
|
||||
"fields_help": {
|
||||
"name": "Όνομα νήματος, για να διακρίνει αυτόν τον τύπο νήματος μεταξύ άλλων από τον ίδιο προμηθευτή. Θα πρέπει να περιέχει το χρώμα για παράδειγμα.",
|
||||
"article_number": "Π.χ. EAN, UPC, κλπ.",
|
||||
"spool_weight": "Το βάρος ενός άδειου καρουλιού. Χρησιμοποιείται για τον προσδιορισμό του μετρημένου βάρους ενός καρουλιού.",
|
||||
"price": "Τιμή ενός πλήρους καρουλιού στο νόμισμα που έχει διαμορφωθεί από το σύστημα.",
|
||||
"price": "Τιμή ενός πλήρους καρουλιού.",
|
||||
"weight": "Το βάρος του νήματος ενός πλήρους καρουλιού (καθαρό βάρος). Αυτό δεν πρέπει να περιλαμβάνει το βάρος του ίδιου του καρουλιού, μόνο το βάρος του νήματος. Είναι αυτό που συνήθως αναγράφεται στη συσκευασία.",
|
||||
"material": "Π.χ. PLA, ABS, PETG, κλπ."
|
||||
"material": "Π.χ. PLA, ABS, PETG, κλπ.",
|
||||
"multi_color_direction": ""
|
||||
},
|
||||
"fields": {
|
||||
"material": "Υλικό",
|
||||
@@ -189,7 +240,12 @@
|
||||
"id": "Α/Α",
|
||||
"color_hex": "Χρώμα",
|
||||
"article_number": "Κωδικός Προϊόντος",
|
||||
"spools": "Προβολή Καρουλιών"
|
||||
"spools": "Προβολή Καρουλιών",
|
||||
"multi_color": "",
|
||||
"external_id": "",
|
||||
"single_color": "",
|
||||
"longitudinal": "",
|
||||
"coaxial": ""
|
||||
},
|
||||
"titles": {
|
||||
"clone": "Αντιγραφή Νήματος",
|
||||
@@ -200,9 +256,14 @@
|
||||
"list": "Νήματα"
|
||||
},
|
||||
"form": {
|
||||
"filament_updated": "Αυτό το νήμα έχει ενημερωθεί από κάποιον/κάτι άλλο από τότε που ανοίξατε αυτήν τη σελίδα. Η αποθήκευση θα αντικαταστήσει αυτές τις αλλαγές!"
|
||||
"filament_updated": "Αυτό το νήμα έχει ενημερωθεί από κάποιον/κάτι άλλο από τότε που ανοίξατε αυτήν τη σελίδα. Η αποθήκευση θα αντικαταστήσει αυτές τις αλλαγές!",
|
||||
"import_external": "",
|
||||
"import_external_description": ""
|
||||
},
|
||||
"filament": "Νήματα"
|
||||
"filament": "Νήματα",
|
||||
"buttons": {
|
||||
"add_spool": "Προσθήκη Καρουλιού"
|
||||
}
|
||||
},
|
||||
"actions": {
|
||||
"create": "Δημιουργία",
|
||||
@@ -227,9 +288,14 @@
|
||||
"registered": "Ημερομηνία Εγγραφής",
|
||||
"comment": "Σχόλια",
|
||||
"name": "Όνομα",
|
||||
"id": "Α/Α"
|
||||
"id": "Α/Α",
|
||||
"external_id": "",
|
||||
"empty_spool_weight": ""
|
||||
},
|
||||
"vendor": "Προμηθευτές"
|
||||
"vendor": "Προμηθευτές",
|
||||
"fields_help": {
|
||||
"empty_spool_weight": ""
|
||||
}
|
||||
},
|
||||
"scanner": {
|
||||
"title": "Αναγνώστης κωδικού QR",
|
||||
@@ -253,7 +319,9 @@
|
||||
"success": "Επιτυχής",
|
||||
"editSuccess": "Επιτυχής τροποποίηση του {{resource}}",
|
||||
"deleteError": "Σφάλμα κατά τη διαγραφή του {{resource}} (status code: {{statusCode}})",
|
||||
"createSuccess": "Δημιουργήθηκε επιτυχώς {{resource}}"
|
||||
"createSuccess": "Δημιουργήθηκε επιτυχώς {{resource}}",
|
||||
"saveSuccessful": "Επιτυχής Αποθήκευση!",
|
||||
"validationError": "Κείμενο σφάλματος που εμφανίζεται εάν η φόρμα είχε προβλήματα κατά την υποβολή {{error}}"
|
||||
},
|
||||
"no": "Όχι",
|
||||
"unknown": "Άγνωστος",
|
||||
@@ -281,6 +349,63 @@
|
||||
},
|
||||
"kofi": "Φιλοδώρημα στο Ko-fi",
|
||||
"home": {
|
||||
"home": "Αρχική"
|
||||
"home": "Αρχική",
|
||||
"welcome": "",
|
||||
"description": ""
|
||||
},
|
||||
"settings": {
|
||||
"extra_fields": {
|
||||
"params": {
|
||||
"default_value": "Προεπιλεγμένη τιμή",
|
||||
"name": "Όνομα",
|
||||
"field_type": "Τύπος",
|
||||
"choices": "Επιλογές",
|
||||
"multi_choice": "Πολλαπλή επιλογή",
|
||||
"unit": "Μονάδα",
|
||||
"order": "Σειρά",
|
||||
"key": "Κλειδί"
|
||||
},
|
||||
"field_type": {
|
||||
"float_range": "\"Float Range\" πληκτρολογήστε επιπλέον πεδίο, ένα εύρος δύο αριθμών με δεκαδικούς αριθμούς",
|
||||
"choice": "\"Choice\" πληκτρολογήστε επιπλέον πεδίο, οι χρήστες μπορούν να επιλέξουν από μια λίστα τιμών",
|
||||
"text": "Πληκτρολογήστε επιπλέον πεδίο \"Text\".",
|
||||
"datetime": "Πληκτρολογήστε επιπλέον πεδίο \"Date+Time\"",
|
||||
"boolean": "Πρόσθετο πεδίο τύπου \"Boolean\", Ναι/Όχι",
|
||||
"integer": "\"Integer\" πληκτρολογήστε επιπλέον πεδίο, ακέραιο αριθμό χωρίς δεκαδικούς αριθμούς",
|
||||
"float": "\"Float\" πληκτρολογήστε επιπλέον πεδίο, έναν αριθμό με δεκαδικούς αριθμούς",
|
||||
"integer_range": "\"Integer Range\" πληκτρολογήστε επιπλέον πεδίο, ένα εύρος δύο ακέραιων αριθμών χωρίς δεκαδικoύς αριθμούς"
|
||||
},
|
||||
"non_unique_key_error": "Το κλειδί πρέπει να είναι μοναδικό.",
|
||||
"key_not_changed": "Παρακαλώ αλλάξτε το κλειδί σε κάποιο άλλο.",
|
||||
"delete_confirm": "Διαγραφή πεδίου {{name}};",
|
||||
"tab": "Επιπλέον Πεδία",
|
||||
"boolean_true": "Τιμή για ένα πρόσθετο πεδίο boolean Αληθές",
|
||||
"boolean_false": "Τιμή για ένα πρόσθετο πεδίο boolean Λανθασμένο",
|
||||
"choices_missing_error": "Δεν μπορείτε να αφαιρέσετε επιλογές. Λείπουν οι ακόλουθες επιλογές: {{choices}}",
|
||||
"description": "<p>Εδώ μπορείτε να προσθέσετε επιπλέον προσαρμοσμένα πεδία στις οντότητες σας.</p><p>Μόλις προστεθεί ένα πεδίο, δεν μπορείτε να αλλάξετε το κλειδί ή τον τύπο του και για στα πεδία τύπου επιλογής δεν μπορείτε να αφαιρέσετε επιλογές ή να αλλάξετε την κατάσταση πολλαπλών επιλογών. Εάν καταργήσετε ένα πεδίο, τα συσχετισμένα δεδομένα για όλες τις οντότητες θα διαγραφούν.</p><p>Το κλειδί είναι πώς τα άλλα προγράμματα διαβάζουν/εγγράφουν τα δεδομένα, οπότε αν το προσαρμοσμένο πεδίο σας υποτίθεται ότι ενσωματώνεται με ένα πρόγραμμα τρίτου κατασκευαστή, φροντίστε να το ρυθμίσετε σωστά. Η προεπιλεγμένη τιμή εφαρμόζεται μόνο σε νέα στοιχεία.</p><p>Τα πρόσθετα πεδία δεν μπορούν να ταξινομηθούν ή να φιλτραριστούν στις προβολές πίνακα.</p>",
|
||||
"delete_confirm_description": "Με αυτόν τον τρόπο θα διαγραφεί το πεδίο και όλα τα σχετικά δεδομένα για όλες τις οντότητες."
|
||||
},
|
||||
"general": {
|
||||
"tab": "Γενικές",
|
||||
"currency": {
|
||||
"label": "Ετικέτα για τη ρύθμιση του νομίσματος"
|
||||
},
|
||||
"base_url": {
|
||||
"tooltip": "",
|
||||
"label": ""
|
||||
},
|
||||
"round_prices": {
|
||||
"label": "",
|
||||
"tooltip": ""
|
||||
}
|
||||
},
|
||||
"header": "Ρυθμίσεις",
|
||||
"settings": "Ρυθμίσεις"
|
||||
},
|
||||
"locations": {
|
||||
"new_location": "",
|
||||
"no_location": "",
|
||||
"locations": "",
|
||||
"no_locations_help": ""
|
||||
}
|
||||
}
|
||||
@@ -15,6 +15,7 @@
|
||||
"edit": "Edit",
|
||||
"cancel": "Cancel",
|
||||
"confirm": "Are you sure?",
|
||||
"continue": "Continue",
|
||||
"filter": "Filter",
|
||||
"clear": "Clear",
|
||||
"refresh": "Refresh",
|
||||
@@ -41,14 +42,22 @@
|
||||
"deleteError": "Error when deleting {{resource}} (status code: {{statusCode}})",
|
||||
"editSuccess": "Successfully edited {{resource}}",
|
||||
"editError": "Error when editing {{resource}} (status code: {{statusCode}})",
|
||||
"importProgress": "Importing: {{processed}}/{{total}}"
|
||||
"importProgress": "Importing: {{processed}}/{{total}}",
|
||||
"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"
|
||||
},
|
||||
@@ -70,6 +79,7 @@
|
||||
"showBorder": "Show Border",
|
||||
"previewScale": "Preview Scale",
|
||||
"skipItems": "Skip Items",
|
||||
"itemCopies": "Item Copies",
|
||||
"contentSettings": "Content Settings",
|
||||
"layoutSettings": "Layout Settings",
|
||||
"horizontalSpacing": "Horizontal Spacing",
|
||||
@@ -86,29 +96,44 @@
|
||||
"none": "None",
|
||||
"border": "Border",
|
||||
"grid": "Grid"
|
||||
}
|
||||
},
|
||||
"settings": "Presets",
|
||||
"defaultSettings": "Default",
|
||||
"addSettings": "Add New Preset",
|
||||
"newSetting": "New",
|
||||
"duplicateSettings": "Duplicate",
|
||||
"deleteSettings": "Delete Current Preset",
|
||||
"deleteSettingsConfirm": "Are you sure you want to delete this preset?",
|
||||
"settingsName": "Preset Name",
|
||||
"saveSetting": "Save Presets",
|
||||
"saveAsImage": "Save as Image"
|
||||
},
|
||||
"qrcode": {
|
||||
"button": "Print QR Codes",
|
||||
"title": "QR Code Printing",
|
||||
"spoolWeight": "Spool Weight: {{weight}}",
|
||||
"lotNr": "Lot Nr: {{lot}}",
|
||||
"bedTemp": "BT: {{temp}}",
|
||||
"extruderTemp": "ET: {{temp}}",
|
||||
"textSize": "Content Text Size",
|
||||
"showSpoolmanIcon": "Show Spoolman Icon",
|
||||
"showVendor": "Vendor",
|
||||
"button": "Print Labels",
|
||||
"title": "Label Printing",
|
||||
"template": "Label Template",
|
||||
"templateHelp": "Use {} to insert values of the spool object as text. For example, {id} will be replaced with the spool id, or {filament.material} will be replaced with the material of the spool. if a value is missing it will be replaced with \"?\". A second set of {} can be used to remove this. In addition, any text between the sets of {} will be removed if the value is missing. For example, {Lot Nr: {lot_nr}} will only show the label if the spool has a lot number. Enclose text with double asterix ** to make it bold. Click the button to view a list of all available tags.",
|
||||
"textSize": "Label Text Size",
|
||||
"showContent": "Print Label",
|
||||
"showLotNr": "Lot Nr",
|
||||
"showSpoolWeight": "Spool Weight",
|
||||
"showTemperatures": "Temperatures",
|
||||
"showSpoolComment": "Spool Comment",
|
||||
"showFilamentComment": "Filament Comment",
|
||||
"showVendorComment": "Vendor Comment"
|
||||
"useHTTPUrl": {
|
||||
"label": "QR code link",
|
||||
"tooltip": "Will use proprietary link that will work only if scanned from Spoolman's scanning feature (default). URL uses either the base URL specified in settings, or the current page URL if not set.",
|
||||
"options": {
|
||||
"default": "Default",
|
||||
"url": "URL"
|
||||
},
|
||||
"preview": "Preview:"
|
||||
},
|
||||
"showQRCode": "Print QR Code",
|
||||
"showQRCodeMode": {
|
||||
"no": "No",
|
||||
"simple": "Simple",
|
||||
"withIcon": "With Icon"
|
||||
}
|
||||
},
|
||||
"spoolSelect": {
|
||||
"title": "Select Spools",
|
||||
"description": "Select spools to print QR codes for.",
|
||||
"description": "Select spools to print labels for.",
|
||||
"showArchived": "Show Archived",
|
||||
"noSpoolsSelected": "You have not selected any spools.",
|
||||
"selectAll": "Select/Unselect All",
|
||||
@@ -134,6 +159,8 @@
|
||||
"id": "ID",
|
||||
"filament_name": "Filament",
|
||||
"filament": "Filament",
|
||||
"filament_internal": "Internal",
|
||||
"filament_external": "External",
|
||||
"price": "Price",
|
||||
"material": "Material",
|
||||
"weight_to_use": "Weight",
|
||||
@@ -142,6 +169,8 @@
|
||||
"measured_weight": "Measured Weight",
|
||||
"used_length": "Used Length",
|
||||
"remaining_length": "Remaining Length",
|
||||
"initial_weight": "Initial Weight",
|
||||
"spool_weight": "Empty Weight",
|
||||
"location": "Location",
|
||||
"lot_nr": "Lot Nr",
|
||||
"first_used": "First Used",
|
||||
@@ -151,13 +180,16 @@
|
||||
"archived": "Archived"
|
||||
},
|
||||
"fields_help": {
|
||||
"price": "Price of a full spool in the system configured currency. If not set, the price of the filament will be assumed instead.",
|
||||
"price": "Price of a full spool. If not set, the price of the filament will be assumed instead.",
|
||||
"weight_to_use": "Select what weight value to enter. Measured weight is only available if the spool weight is set for the selected filament.",
|
||||
"used_weight": "How much filament has been used from the spool. A new spool should have 0g used.",
|
||||
"remaining_weight": "How much filament is left on the spool. For a new spool this should match the spool weight.",
|
||||
"measured_weight": "How much the filament and spool weigh.",
|
||||
"initial_weight": "The initial weight of filament on the spool (net weight). Will use the weight from the filament object if not set.",
|
||||
"spool_weight": "The weight of the spool when it is empty. Leave empty to use the value from the filament or the manufacturer.",
|
||||
"location": "Where the spool is located if you have multiple locations where you store your spools.",
|
||||
"lot_nr": "Manufacturer's lot number. Can be used to ensure a print has consistent color if multiple spools are used."
|
||||
"lot_nr": "Manufacturer's lot number. Can be used to ensure a print has consistent color if multiple spools are used.",
|
||||
"external_filament": "You have selected a filament from the external database. A filament object (and possibly a manufacturer object) will be created automatically when you create this spool. This can create duplicate filament objects if you have already created a filament object for this filament."
|
||||
},
|
||||
"titles": {
|
||||
"create": "Create Spool",
|
||||
@@ -166,22 +198,33 @@
|
||||
"list": "Spools",
|
||||
"show": "Show Spool",
|
||||
"show_title": "[Spool #{{id}}] {{name}}",
|
||||
"archive": "Archive Spool"
|
||||
"archive": "Archive Spool",
|
||||
"adjust": "Adjust Spool Filament"
|
||||
},
|
||||
"form": {
|
||||
"measurement_type": {
|
||||
"length": "Length",
|
||||
"weight": "Weight"
|
||||
},
|
||||
"measurement_type_label": "Measurement Type",
|
||||
"adjust_filament_help": "Here you can directly add or subtract filament from the spool. A positive value will consume filament, a negative value will add it.",
|
||||
"adjust_filament_value": "Consume Amount",
|
||||
"new_location_prompt": "Enter a new location",
|
||||
"spool_updated": "This spool has been updated by someone/something else since you opened this page. Saving will overwrite those changes!"
|
||||
},
|
||||
"messages": {
|
||||
"archive": "Are you sure you want to archive this spool?"
|
||||
},
|
||||
"formats": {
|
||||
"last_used": "Last used {{date}}"
|
||||
}
|
||||
},
|
||||
"filament": {
|
||||
"filament": "Filaments",
|
||||
"fields": {
|
||||
"id": "ID",
|
||||
"vendor_name": "Vendor",
|
||||
"vendor": "Vendor",
|
||||
"vendor_name": "Manufacturer",
|
||||
"vendor": "Manufacturer",
|
||||
"name": "Name",
|
||||
"material": "Material",
|
||||
"price": "Price",
|
||||
@@ -195,15 +238,21 @@
|
||||
"settings_extruder_temp": "Extruder Temp",
|
||||
"settings_bed_temp": "Bed Temp",
|
||||
"color_hex": "Color",
|
||||
"single_color": "Single",
|
||||
"multi_color": "Multi",
|
||||
"coaxial": "Coextruded",
|
||||
"longitudinal": "Longitudinal",
|
||||
"external_id": "External ID",
|
||||
"spools": "Show Spools"
|
||||
},
|
||||
"fields_help": {
|
||||
"name": "Filament name, to distinguish this filament type among others from the same vendor. Should contain the color for example.",
|
||||
"name": "Filament name, to distinguish this filament type among others from the same manufacturer. Should contain the color for example.",
|
||||
"material": "E.g. PLA, ABS, PETG, etc.",
|
||||
"price": "Price of a full spool in the system configured currency.",
|
||||
"price": "Price of a full spool.",
|
||||
"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.",
|
||||
"spool_weight": "The weight of an empty spool. Used to determine measured weight of a spool.",
|
||||
"article_number": "E.g. EAN, UPC, etc."
|
||||
"article_number": "E.g. EAN, UPC, etc.",
|
||||
"multi_color_direction": "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."
|
||||
},
|
||||
"titles": {
|
||||
"create": "Create Filament",
|
||||
@@ -214,31 +263,43 @@
|
||||
"show_title": "[Filament #{{id}}] {{name}}"
|
||||
},
|
||||
"form": {
|
||||
"filament_updated": "This filament has been updated by someone/something else since you opened this page. Saving will overwrite those changes!"
|
||||
"filament_updated": "This filament has been updated by someone/something else since you opened this page. Saving will overwrite those changes!",
|
||||
"import_external": "Import from External",
|
||||
"import_external_description": "Select a filament in the list to automatically populate its details in the filament creation form. This will overwrite any data you have entered in the form.<br><br>A Manufacturer object will be created automatically when you click Ok, if necessary."
|
||||
},
|
||||
"buttons": {
|
||||
"add_spool": "Add Spool"
|
||||
}
|
||||
},
|
||||
"vendor": {
|
||||
"vendor": "Vendors",
|
||||
"vendor": "Manufacturers",
|
||||
"fields": {
|
||||
"id": "ID",
|
||||
"name": "Name",
|
||||
"empty_spool_weight": "Empty Spool Weight",
|
||||
"external_id": "External ID",
|
||||
"registered": "Registered",
|
||||
"comment": "Comment"
|
||||
},
|
||||
"fields_help": {
|
||||
"empty_spool_weight": "The weight of an empty spool from this manufacturer."
|
||||
},
|
||||
"titles": {
|
||||
"create": "Create Vendor",
|
||||
"clone": "Clone Vendor",
|
||||
"edit": "Edit Vendor",
|
||||
"list": "Vendors",
|
||||
"show": "Show Vendor",
|
||||
"show_title": "[Vendor #{{id}}] {{name}}"
|
||||
"create": "Create Manufacturer",
|
||||
"clone": "Clone Manufacturer",
|
||||
"edit": "Edit Manufacturer",
|
||||
"list": "Manufacturers",
|
||||
"show": "Show Manufacturer",
|
||||
"show_title": "[Manufacturer #{{id}}] {{name}}"
|
||||
},
|
||||
"form": {
|
||||
"vendor_updated": "This vendor has been updated by someone/something else since you opened this page. Saving will overwrite those changes!"
|
||||
"vendor_updated": "This manufacturer has been updated by someone/something else since you opened this page. Saving will overwrite those changes!"
|
||||
}
|
||||
},
|
||||
"home": {
|
||||
"home": "Home"
|
||||
"home": "Home",
|
||||
"welcome": "Welcome to your Spoolman instance!",
|
||||
"description": "It looks like you haven't added any spools yet. See the <helpPageLink>Help page</helpPageLink> for help getting started."
|
||||
},
|
||||
"help": {
|
||||
"help": "Help",
|
||||
@@ -247,11 +308,61 @@
|
||||
"spool": "Individual physical spools of a specific filament.",
|
||||
"vendor": "The companies that make the filament."
|
||||
},
|
||||
"description": "<title>Help</title><p>Here are some tips to get you started.</p><p>Spoolman holds 3 different types of data:</p><itemsHelp/><p>To add a new spool to the database, start by creating a <filamentCreateLink>Filament</filamentCreateLink> object. Once that's done, proceed to create a <spoolCreateLink>Spool</spoolCreateLink> object for that specific spool. If you acquire additional spools of the same filament later on, simply generate additional Spool objects and reuse the same Filament object.</p><p>Optionally, you can also generate a <vendorCreateLink>Vendor</vendorCreateLink> object for the company manufacturing the filament if you wish to track that information.</p><p>You have the option to link other 3D printer services to Spoolman, like Moonraker, which can automatically monitor filament usage and update the Spool objects for you. Refer to the <readmeLink>Spoolman README</readmeLink> for guidance on how to set that up.</p>"
|
||||
"description": "<title>Help</title><p>Here are some tips to get you started.</p><p>Spoolman holds 3 different types of data:</p><itemsHelp/><p>To add a new spool to the database, start by creating a <filamentCreateLink>Filament</filamentCreateLink> object. Once that's done, proceed to create a <spoolCreateLink>Spool</spoolCreateLink> object for that specific spool. If you acquire additional spools of the same filament later on, simply generate additional Spool objects and reuse the same Filament object.</p><p>Optionally, you can also generate a <vendorCreateLink>Manufacturer</vendorCreateLink> object for the company manufacturing the filament if you wish to track that information.</p><p>You have the option to link other 3D printer services to Spoolman, like Moonraker, which can automatically monitor filament usage and update the Spool objects for you. Refer to the <readmeLink>Spoolman README</readmeLink> for guidance on how to set that up.</p>"
|
||||
},
|
||||
"table": {
|
||||
"actions": "Actions"
|
||||
},
|
||||
"settings": {
|
||||
"settings": "Settings",
|
||||
"header": "Settings",
|
||||
"general": {
|
||||
"tab": "General",
|
||||
"currency": {
|
||||
"label": "Currency"
|
||||
},
|
||||
"base_url": {
|
||||
"label": "Base URL",
|
||||
"tooltip": "The base URL to use when generating features such as QR codes."
|
||||
},
|
||||
"round_prices": {
|
||||
"label": "Round prices",
|
||||
"tooltip": "Round prices to the nearest whole number."
|
||||
}
|
||||
},
|
||||
"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 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",
|
||||
"field_type": "Type",
|
||||
"unit": "Unit",
|
||||
"order": "Order",
|
||||
"default_value": "Default Value",
|
||||
"choices": "Choices",
|
||||
"multi_choice": "Multi Choice"
|
||||
},
|
||||
"field_type": {
|
||||
"text": "Text",
|
||||
"integer": "Integer",
|
||||
"integer_range": "Integer Range",
|
||||
"float": "Float",
|
||||
"float_range": "Float Range",
|
||||
"datetime": "Datetime",
|
||||
"boolean": "Boolean",
|
||||
"choice": "Choice"
|
||||
},
|
||||
"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}}?",
|
||||
"delete_confirm_description": "This will delete the field and all associated data for all entities."
|
||||
}
|
||||
},
|
||||
"documentTitle": {
|
||||
"default": "Spoolman",
|
||||
"suffix": " | Spoolman",
|
||||
@@ -261,6 +372,9 @@
|
||||
"help": {
|
||||
"list": "Help | Spoolman"
|
||||
},
|
||||
"locations": {
|
||||
"list": "Locations | Spoolman"
|
||||
},
|
||||
"filament": {
|
||||
"list": "Filaments | Spoolman",
|
||||
"show": "#{{id}} Show Filament | Spoolman",
|
||||
@@ -276,11 +390,17 @@
|
||||
"clone": "#{{id}} Clone Spool | Spoolman"
|
||||
},
|
||||
"vendor": {
|
||||
"list": "Vendors | Spoolman",
|
||||
"show": "#{{id}} Show Vendor | Spoolman",
|
||||
"edit": "#{{id}} Edit Vendor | Spoolman",
|
||||
"create": "Create Vendor | Spoolman",
|
||||
"clone": "#{{id}} Clone Vendor | Spoolman"
|
||||
"list": "Manufacturers | Spoolman",
|
||||
"show": "#{{id}} Show Manufacturer | Spoolman",
|
||||
"edit": "#{{id}} Edit Manufacturer | Spoolman",
|
||||
"create": "Create Manufacturer | Spoolman",
|
||||
"clone": "#{{id}} Clone Manufacturer | Spoolman"
|
||||
}
|
||||
},
|
||||
"locations": {
|
||||
"locations": "Locations",
|
||||
"new_location": "New Location",
|
||||
"no_location": "No Location",
|
||||
"no_locations_help": "This page lets you organize your spools in locations, add some spools to get started!"
|
||||
}
|
||||
}
|
||||
@@ -4,7 +4,7 @@
|
||||
"create": "Crear",
|
||||
"edit": "Editar",
|
||||
"show": "Mostrar",
|
||||
"clone": "Duplicar"
|
||||
"clone": "Clonar"
|
||||
},
|
||||
"buttons": {
|
||||
"create": "Crear",
|
||||
@@ -13,14 +13,14 @@
|
||||
"delete": "Borrar",
|
||||
"edit": "Editar",
|
||||
"cancel": "Cancelar",
|
||||
"confirm": "Seguro?",
|
||||
"confirm": "¿Estás seguro?",
|
||||
"filter": "Filtrar",
|
||||
"clear": "Limpiar",
|
||||
"refresh": "Renovar",
|
||||
"refresh": "Actualizar",
|
||||
"show": "Mostrar",
|
||||
"undo": "Deshacer",
|
||||
"import": "Importar",
|
||||
"clone": "Duplicar",
|
||||
"clone": "Clonar",
|
||||
"archive": "Archivar",
|
||||
"unArchive": "Desarchivar",
|
||||
"hideArchived": "Ocultar Archivados",
|
||||
@@ -28,9 +28,10 @@
|
||||
"notAccessTitle": "No tienes permiso de acceso",
|
||||
"hideColumns": "Ocultar Columnas",
|
||||
"clearFilters": "Borrar filtros",
|
||||
"saveAndAdd": "Guardar y añadir"
|
||||
"saveAndAdd": "Guardar y añadir",
|
||||
"continue": "Continuar"
|
||||
},
|
||||
"warnWhenUnsavedChanges": "Seguro que quieres salir?. Hay cambios sin guardar.",
|
||||
"warnWhenUnsavedChanges": "¿Estás seguro que quieres salir? Hay cambios sin guardar.",
|
||||
"notifications": {
|
||||
"success": "Éxito",
|
||||
"error": "Error (status code: {{statusCode}})",
|
||||
@@ -41,7 +42,9 @@
|
||||
"deleteError": "Error al borrar {{resource}} (status code: {{statusCode}})",
|
||||
"editSuccess": "Has editado {{resource}} con éxito",
|
||||
"editError": "Error al editar {{resource}} (status code: {{statusCode}})",
|
||||
"importProgress": "Importando: {{processed}}/{{total}}"
|
||||
"importProgress": "Importando: {{processed}}/{{total}}",
|
||||
"saveSuccessful": "¡Se guardo correctamente!",
|
||||
"validationError": "Error de validación: {{error}}"
|
||||
},
|
||||
"loading": "Cargando",
|
||||
"version": "Versión",
|
||||
@@ -49,13 +52,13 @@
|
||||
"yes": "Si",
|
||||
"no": "No",
|
||||
"tags": {
|
||||
"clone": "Duplicar"
|
||||
"clone": "Clonar"
|
||||
},
|
||||
"dashboard": {
|
||||
"title": "Panel"
|
||||
"title": "Dashboard"
|
||||
},
|
||||
"spool": {
|
||||
"spool": "Carretes",
|
||||
"spool": "Bobinas",
|
||||
"fields": {
|
||||
"id": "ID",
|
||||
"filament_name": "Filamento",
|
||||
@@ -63,9 +66,9 @@
|
||||
"material": "Material",
|
||||
"used_weight": "Peso Usado",
|
||||
"remaining_weight": "Peso Restante",
|
||||
"used_length": "Largo Usado",
|
||||
"remaining_length": "Largo Restante",
|
||||
"location": "Locación",
|
||||
"used_length": "Longitud usada",
|
||||
"remaining_length": "Longitud restante",
|
||||
"location": "Ubicación",
|
||||
"lot_nr": "No. Lote",
|
||||
"first_used": "Fecha de Primer Uso",
|
||||
"last_used": "Ultimo Uso",
|
||||
@@ -74,62 +77,86 @@
|
||||
"archived": "Archivado",
|
||||
"measured_weight": "Peso Medido",
|
||||
"weight_to_use": "Peso",
|
||||
"price": ""
|
||||
"price": "Precio",
|
||||
"initial_weight": "Peso inicial",
|
||||
"spool_weight": "Peso vacio",
|
||||
"filament_internal": "Interno",
|
||||
"filament_external": "Externo"
|
||||
},
|
||||
"fields_help": {
|
||||
"used_weight": "Cuanto filamento ha sido usado en el carrete. Un carrete nuevo debería tener 0g usados.",
|
||||
"location": "Donde esta el carrete si se guardan los carretes en lugares distintos.",
|
||||
"lot_nr": "Numero de lote de manufactura. Puede ser usado si el modelo a imprimir necesita color homogéneo y varios carretes son necesarios.",
|
||||
"weight_to_use": "Elegir el peso a usar. El peso medido solo esta disponible si existe el valor de peso del carrete seleccionado.",
|
||||
"measured_weight": "Cuanto pesa el filamento y el carrete.",
|
||||
"remaining_weight": "Cuanto filamento resta en el carrete. Para un carrete nuevo el peso debe ser igual al peso indicado de fabrica.",
|
||||
"price": ""
|
||||
"used_weight": "Cuanto filamento ha sido usado de la bobina. Una bobina nueva debería tener 0g usados.",
|
||||
"location": "Dónde se encuentra el carrete si tiene varias ubicaciones donde almacena sus carretes.",
|
||||
"lot_nr": "Número de lote del fabricante. Puede ser usado si el modelo a imprimir necesita color homogéneo y varias bobinas son necesarias.",
|
||||
"weight_to_use": "Elegir el peso a usar. El peso medido solo está disponible si existe el valor de peso del carrete seleccionado.",
|
||||
"measured_weight": "Cuanto pesa el filamento y la bobina.",
|
||||
"remaining_weight": "Cuanto filamento resta en la bobina. Para una bobina nueva el peso debe ser igual al peso indicado de fábrica.",
|
||||
"price": "Precio de una bobina completa. Si no se establece, se asumirá en su lugar el precio del filamento.",
|
||||
"initial_weight": "El peso inicial del filamento en el carrete (peso neto). Utilizará el peso del objeto de filamento si no está configurado.",
|
||||
"spool_weight": "El peso de la bobina cuando está vacía. Dejar vacío para usar el valor del filamento o del fabricante.",
|
||||
"external_filament": "Has elegido un filamento desde la base de datos externa. Un objeto filamento (y posiblemente un objeto fabricante) será creado automáticamente cuando crees este carrete. Esto puede crear objetos filamento duplicados si ya has creado un objeto filamento para este filamento."
|
||||
},
|
||||
"titles": {
|
||||
"create": "Crear Carrete",
|
||||
"clone": "Duplicar Carrete",
|
||||
"edit": "Editar Carrete",
|
||||
"list": "Carretes",
|
||||
"show": "Mostrar Carrete",
|
||||
"archive": "Archivar Carrete",
|
||||
"show_title": "[Carrete #{{id}}] {{name}}"
|
||||
"create": "Crear Bobina",
|
||||
"clone": "Duplicar Bobina",
|
||||
"edit": "Editar Bobina",
|
||||
"list": "Bobinas",
|
||||
"show": "Mostrar Bobina",
|
||||
"archive": "Archivar Bobina",
|
||||
"show_title": "[Bobina #{{id}}] {{name}}",
|
||||
"adjust": "Ajustar la bobina del filamento"
|
||||
},
|
||||
"messages": {
|
||||
"archive": "Esta seguro que quiere archivar este carrete?"
|
||||
"archive": "¿Esta seguro que quiere archivar esta bobina?"
|
||||
},
|
||||
"form": {
|
||||
"new_location_prompt": "Introduce una nueva ubicación",
|
||||
"spool_updated": "Este spool ha sido actualizado por alguien/algo más desde que abriste esta página. ¡Al guardar, se sobrescribirán los cambios!"
|
||||
"spool_updated": "Esta bobina ha sido actualizada por alguien/algo desde que abriste esta página. ¡Al guardar, se sobrescribirán los cambios!",
|
||||
"measurement_type": {
|
||||
"length": "Longitud",
|
||||
"weight": "Peso"
|
||||
},
|
||||
"measurement_type_label": "Tipo de medición",
|
||||
"adjust_filament_value": "Cantidad consumida",
|
||||
"adjust_filament_help": "Aquí puedes añadir o restar directamente filamento de la bobina. Un valor positivo consumirá filamento, un valor negativo lo añadirá."
|
||||
},
|
||||
"formats": {
|
||||
"last_used": "Utilizado por última vez {{date}}"
|
||||
}
|
||||
},
|
||||
"filament": {
|
||||
"filament": "Filamentos",
|
||||
"fields": {
|
||||
"id": "ID",
|
||||
"vendor_name": "Marca",
|
||||
"vendor": "Marca",
|
||||
"vendor_name": "Fabricante",
|
||||
"vendor": "Fabricante",
|
||||
"name": "Nombre",
|
||||
"material": "Material",
|
||||
"price": "Precio",
|
||||
"density": "Densidad",
|
||||
"diameter": "Diámetro",
|
||||
"weight": "Peso",
|
||||
"spool_weight": "Peso del Carrete",
|
||||
"spool_weight": "Peso de la Bobina",
|
||||
"article_number": "Numero de Articulo",
|
||||
"registered": "Registrado",
|
||||
"comment": "Comentarios",
|
||||
"settings_extruder_temp": "Temp. de Extrusor",
|
||||
"settings_extruder_temp": "Temp. del Extrusor",
|
||||
"settings_bed_temp": "Temp. de Cama",
|
||||
"color_hex": "Color",
|
||||
"spools": "Mostrar los carretes"
|
||||
"spools": "Mostrar las Bobinas",
|
||||
"external_id": "ID Externo",
|
||||
"coaxial": "coextruido",
|
||||
"single_color": "Único",
|
||||
"longitudinal": "Longitudinal",
|
||||
"multi_color": "Multiple"
|
||||
},
|
||||
"fields_help": {
|
||||
"name": "Nombre del filamento, para distinguirlo de otros de la misma marca. Por ejemplo, debería contener el nombre del color.",
|
||||
"name": "Nombre del filamento, para distinguir este tipo de filamento entre otros del mismo fabricante. Debe contener por ejemplo: el color.",
|
||||
"material": "ej. PLA, ABS, PETG, etc.",
|
||||
"price": "Precio del carrete completo en la divisa configurada en el sistema.",
|
||||
"weight": "El peso de un carrete entero (peso neto). Esta cifra no debe incluir el peso del carrete vacío, solo el filamento. Es, usualmente, el peso escrito en la etiqueta del carrete.",
|
||||
"spool_weight": "El peso de un carrete vacío. Se utiliza para determinar el peso medido de un carrete.",
|
||||
"article_number": "ej. EAN, UPC, etc."
|
||||
"price": "Precio de una bobina completa.",
|
||||
"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.",
|
||||
"spool_weight": "El peso de una bobina vacía. Se utiliza para determinar el peso medido de una bobina.",
|
||||
"article_number": "ej. EAN, UPC, etc.",
|
||||
"multi_color_direction": "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."
|
||||
},
|
||||
"titles": {
|
||||
"create": "Crear Filamento",
|
||||
@@ -140,27 +167,37 @@
|
||||
"show_title": "[Filamento #{{id}}] {{name}}"
|
||||
},
|
||||
"form": {
|
||||
"filament_updated": "Este filamento ha sido actualizado por alguien/algo más desde que abrió esta página. ¡Al guardar, se sobrescribirán los cambios!"
|
||||
"filament_updated": "Este filamento ha sido actualizado por alguien/algo más desde que abrió esta página. ¡Al guardar, se sobrescribirán los cambios!",
|
||||
"import_external": "Importado desde un externo",
|
||||
"import_external_description": "Seleccione un filamento en la lista para rellenar sus detalles de manera automática en el formulario de creación del filamento. Esto sobrescribirá cualquier información que hayas escrito en el formulario.<br><br>Un objeto fabricante será creado automáticamente cuando presiones Ok, si es necesario."
|
||||
},
|
||||
"buttons": {
|
||||
"add_spool": "Añadir bobina"
|
||||
}
|
||||
},
|
||||
"vendor": {
|
||||
"vendor": "Marcas",
|
||||
"vendor": "Fabricantes",
|
||||
"fields": {
|
||||
"id": "ID",
|
||||
"name": "Nombre",
|
||||
"registered": "Registrado",
|
||||
"comment": "Comentarios"
|
||||
"comment": "Comentarios",
|
||||
"empty_spool_weight": "Peso de bobina vacía",
|
||||
"external_id": "ID Externa"
|
||||
},
|
||||
"titles": {
|
||||
"create": "Crear Marca",
|
||||
"clone": "Duplicar Marca",
|
||||
"edit": "Editar Marca",
|
||||
"list": "Marcas",
|
||||
"show": "Mostrar Marcas",
|
||||
"show_title": "[Proveedor #{{id}}] {{name}}"
|
||||
"create": "Crear un fabricante",
|
||||
"clone": "Duplicar un fabricante",
|
||||
"edit": "Editar un fabricante",
|
||||
"list": "Fabricantes",
|
||||
"show": "Mostrar Fabricante",
|
||||
"show_title": "[Fabricante #{{id}}] {{name}}"
|
||||
},
|
||||
"form": {
|
||||
"vendor_updated": "Este vendedor ha sido actualizado por alguien/algo más desde que abrió esta página. ¡Al guardar, se sobrescribirán los cambios!"
|
||||
"vendor_updated": "Este fabricante ha sido actualizado por alguien/algo desde que abrió esta página. ¡Al guardar, se sobrescribirán los cambios!"
|
||||
},
|
||||
"fields_help": {
|
||||
"empty_spool_weight": "El peso de una bobina vacía de este fabricante."
|
||||
}
|
||||
},
|
||||
"table": {
|
||||
@@ -177,44 +214,64 @@
|
||||
"clone": "#{{id}} Duplicar Filamento | Spoolman"
|
||||
},
|
||||
"spool": {
|
||||
"list": "Carretes | Spoolman",
|
||||
"show": "#{{id}} Mostrar Carrete | Spoolman",
|
||||
"edit": "#{{id}} Editar Carrete | Spoolman",
|
||||
"create": "Crear Carrete | Spoolman",
|
||||
"clone": "#{{id}} Duplicar Carrete | Spoolman"
|
||||
"list": "Bobinas | Spoolman",
|
||||
"show": "#{{id}} Mostrar Bobina | Spoolman",
|
||||
"edit": "#{{id}} Editar Bobina | Spoolman",
|
||||
"create": "Crear Bobina | Spoolman",
|
||||
"clone": "#{{id}} Duplicar Bobina | Spoolman"
|
||||
},
|
||||
"vendor": {
|
||||
"list": "Marcas | Spoolman",
|
||||
"show": "#{{id}} Mostrar Marca | Spoolman",
|
||||
"edit": "#{{id}} Editar Marca | Spoolman",
|
||||
"create": "Crear Marca | Spoolman",
|
||||
"clone": "#{{id}} Duplicar Marca | Spoolman"
|
||||
"list": "Fabricantes | Spoolman",
|
||||
"show": "#{{id}} Mostrar el fabricante | Spoolman",
|
||||
"edit": "#{{id}} Editar el fabricante | Spoolman",
|
||||
"create": "Crear un fabricante | Spoolman",
|
||||
"clone": "#{{id}} Duplicar un fabricante | Spoolman"
|
||||
},
|
||||
"home": {
|
||||
"list": "Inicio | Spoolman"
|
||||
},
|
||||
"help": {
|
||||
"list": "Ayuda | Spoolman"
|
||||
},
|
||||
"locations": {
|
||||
"list": "Ubicaciones | Spoolman"
|
||||
}
|
||||
},
|
||||
"printing": {
|
||||
"qrcode": {
|
||||
"extruderTemp": "TE:{{temp}}",
|
||||
"showSpoolWeight": "Peso Carrete",
|
||||
"showSpoolWeight": "Peso de la Bobina",
|
||||
"showContent": "Imprimir Etiqueta",
|
||||
"showVendorComment": "Comentarios de Marca",
|
||||
"spoolWeight": "Peso de Carrete: {{weight}}",
|
||||
"showVendorComment": "Comentarios del Fabricante",
|
||||
"spoolWeight": "Peso de la Bobina: {{weight}}",
|
||||
"showTemperatures": "Temperaturas",
|
||||
"showVendor": "Marca",
|
||||
"showSpoolComment": "Comentario de Carrete",
|
||||
"textSize": "Tamaño Letras de Contenido",
|
||||
"title": "Impresión de Códigos QR",
|
||||
"showVendor": "Fabricante",
|
||||
"showSpoolComment": "Comentario de la Bobina",
|
||||
"textSize": "Tamaño del texto para la etiqueta",
|
||||
"title": "Imprimiendo las etiquetas",
|
||||
"showSpoolmanIcon": "Mostrar Icono de Spoolman",
|
||||
"showLotNr": "No. Lote",
|
||||
"bedTemp": "TC:{{temp}}",
|
||||
"lotNr": "No. Lote:{{lot}}",
|
||||
"showFilamentComment": "Comentario de Filamento",
|
||||
"button": "Imprimir Códigos QR"
|
||||
"button": "Imprimir las etiquetas",
|
||||
"template": "Plantilla para la etiqueta",
|
||||
"templateHelp": "Utiliza {} para insertar valores del objeto spool como texto. Por ejemplo, {id} se sustituirá por el id del carrete, o {filament.material} se sustituirá por el material del carrete. si falta un valor, se sustituirá por \"?\". Se puede utilizar un segundo conjunto de {} para eliminarlo. Además, cualquier texto entre los {} se eliminará si falta el valor. Por ejemplo, {Lot Nr: {lot_nr}} solo mostrará la etiqueta si la bobina tiene un número de lote. Encierra el texto con doble asterisco ** para ponerlo en negrita. Haz clic en el botón para ver una lista de todas las etiquetas disponibles.",
|
||||
"showQRCode": "Imprimir un código qr",
|
||||
"showQRCodeMode": {
|
||||
"no": "No",
|
||||
"simple": "Sencilla",
|
||||
"withIcon": "Con un icono"
|
||||
},
|
||||
"useHTTPUrl": {
|
||||
"label": "Enlace al código QR",
|
||||
"options": {
|
||||
"default": "Por defecto",
|
||||
"url": "URL"
|
||||
},
|
||||
"preview": "Vista previa:",
|
||||
"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."
|
||||
}
|
||||
},
|
||||
"generic": {
|
||||
"printerMarginBottom": "Zona Segura Inferior",
|
||||
@@ -226,50 +283,61 @@
|
||||
"border": "Borde"
|
||||
},
|
||||
"printerMarginTop": "Zona Segura Superior",
|
||||
"customSize": "Tamaño Personal",
|
||||
"customSize": "Personalizar",
|
||||
"title": "Imprimiendo",
|
||||
"contentSettings": "Ajustes de Contenido",
|
||||
"marginRight": "Margen Derecho",
|
||||
"printerMarginRight": "Zona Segura Derecha",
|
||||
"helpPrinterMargin": "La Zona de Seguridad debe ajustarse lo mas cercano posible al borde que tu impresora es capaz de imprimir. Cambiar estos valores no afectaran todas las etiquetas.",
|
||||
"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.",
|
||||
"previewScale": "Previsualizar Escala",
|
||||
"helpMargin": "Márgenes deben ser configurados a ser los mismos que tu papel e impresora. Cambiar los mismos afectaran todas las etiquetas.",
|
||||
"helpMargin": "Los márgenes deben ser configurados a ser los mismos que tu papel e impresora. Cambiar los mismos afectaran todas las etiquetas.",
|
||||
"marginTop": "Margen Superior",
|
||||
"skipItems": "Saltar Elementos",
|
||||
"layoutSettings": "Ajustes de Diseño",
|
||||
"paperSize": "Tamaño de Papel",
|
||||
"columns": "Columnas",
|
||||
"description": "Ajustar los parámetros debajo para adquirir el diseño 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.",
|
||||
"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.",
|
||||
"marginBottom": "Margen Inferior",
|
||||
"horizontalSpacing": "Espacio Horizontal",
|
||||
"marginLeft": "Margen Izquierdo",
|
||||
"showBorder": "Mostrar Borde",
|
||||
"printerMarginLeft": "Zona Segura Izquierda",
|
||||
"dimensions": "Dimensiones",
|
||||
"print": "Imprimir"
|
||||
"print": "Imprimir",
|
||||
"itemCopies": "Copias del artículo",
|
||||
"settings": "Ajustes preestablecidos",
|
||||
"defaultSettings": "Por defecto",
|
||||
"addSettings": "Añadir un nuevo ajustes preestablecidos",
|
||||
"newSetting": "Nuevo",
|
||||
"deleteSettings": "Eliminar ajustes preestablecidos",
|
||||
"deleteSettingsConfirm": "¿Estás seguro de que deseas eliminar este ajuste preestablecido?",
|
||||
"settingsName": "Nombre preestablecido",
|
||||
"duplicateSettings": "Duplicar",
|
||||
"saveSetting": "Guardar ajustes preestablecidos",
|
||||
"saveAsImage": "Guardar como una imagen"
|
||||
},
|
||||
"spoolSelect": {
|
||||
"selectedTotal_one": "{{count}} carrete seleccionado",
|
||||
"selectedTotal_many": "{{count}} carretes seleccionados",
|
||||
"selectedTotal_other": "{{count}} carretes seleccionados",
|
||||
"description": "Seleccionar Carretes para imprimir códigos de QR.",
|
||||
"showArchived": "Mostrar Archivados",
|
||||
"title": "Selección de Carretes",
|
||||
"selectedTotal_one": "{{count}} bobina seleccionada",
|
||||
"selectedTotal_many": "{{count}} bobinas seleccionadas",
|
||||
"selectedTotal_other": "{{count}} bobinas seleccionadas",
|
||||
"description": "Selecciona los carretes para los que deseas imprimir las etiquetas.",
|
||||
"showArchived": "Mostrar archivados",
|
||||
"title": "Selección de Bobinas",
|
||||
"selectAll": "Seleccionar/Deseleccionar Todos",
|
||||
"noSpoolsSelected": "No has seleccionado ningún carrete."
|
||||
"noSpoolsSelected": "No has seleccionado ninguna bobina."
|
||||
}
|
||||
},
|
||||
"scanner": {
|
||||
"title": "Escaner de Código QR",
|
||||
"title": "Escáner de Código QR",
|
||||
"error": {
|
||||
"insecureContext": "La página no se sirve a través de HTTPS.",
|
||||
"notReadable": "La camara no ha sido leída.",
|
||||
"insecureContext": "La página no se muestra a través de HTTPS.",
|
||||
"notReadable": "La cámara no es legible.",
|
||||
"notAllowed": "No has dado permiso de acceso a la cámara.",
|
||||
"unknown": "Un error desconocido ocurrió. ({{error}})",
|
||||
"notFound": "La cámara no ha sido detectada.",
|
||||
"streamApiNotSupported": "El navegador no es compatible con la API MediaStream."
|
||||
},
|
||||
"description": "Escanear códigos QR a Spoolman para ver detalles del carrete."
|
||||
"description": "Escanea un código QR de Spoolman para ver detalles de la bobina."
|
||||
},
|
||||
"help": {
|
||||
"resources": {
|
||||
@@ -277,11 +345,68 @@
|
||||
"filament": "Marcas de filamentos. Tienen propiedades como nombre, material, color, diámetro y más.",
|
||||
"spool": "Bobinas físicas individuales de un filamento específico."
|
||||
},
|
||||
"description": "<title>Ayuda</title><p>Aquí tiene algunos consejos para empezar.</p><p>Spoolman contiene 3 tipos diferentes de datos:</p><itemsHelp/><p>Para añadir un nuevo spool a la base de datos, empiece creando un objeto <filamentCreateLink>Filament</filamentCreateLink>. Una vez hecho esto, proceda a crear un objeto <spoolCreateLink>Spool</spoolCreateLink> para ese spool específico. Si más adelante adquiere carretes adicionales del mismo filamento, simplemente genere objetos Spool adicionales y reutilice el mismo objeto Filament.</p><p>Opcionalmente, también puede generar un objeto <vendorCreateLink>Vendor</vendorCreateLink> para la empresa que fabrica el filamento si desea realizar un seguimiento de esa información.</p><p>Tiene la opción de vincular otros servicios de impresoras 3D a Spoolman, como Moonraker, que puede supervisar automáticamente el uso del filamento y actualizar los objetos Spool por usted. Consulte el <readmeLink>LÉEME de Spoolman</readmeLink> para obtener orientación sobre cómo configurarlo.</p> <p>Spoolman es un servicio de impresión 3D",
|
||||
"description": "<title> Ayuda </title> <p> A continuación se ofrecen algunos consejos para empezar. </p> <p> Spoolman contiene 3 tipos diferentes de datos: </p> <itemsHelp/> <p> Para agregar una nueva bobina a la base de datos, comience creando un objeto <filamentCreateLink> Filamento </filamentCreateLink> . Una vez hecho esto, proceda a crear un objeto <spoolCreateLink> Bobina</spoolCreateLink> para esa bobina específica. Si adquiere bobinas adicionales del mismo filamento más adelante, simplemente genere objetos Bonina adicionales y reutilice el mismo objeto Filamento. </p> <p> Opcionalmente, también puede generar un objeto <vendorCreateLink> Fabricante</vendorCreateLink> para la empresa que fabrica el filamento si desea realizar un seguimiento de esa información. </p> <p> Tiene la opción de vincular otros servicios de impresora 3D a Spoolman, como Moonraker, que puede monitorear automáticamente el uso del filamento y actualizar los objetos de Bobina por usted. Consulte el <readmeLink> Spoolman README </readmeLink> para obtener orientación sobre cómo configurarlo. </p>",
|
||||
"help": "Ayuda"
|
||||
},
|
||||
"kofi": "Donar en Ko-fi",
|
||||
"home": {
|
||||
"home": "Inicio"
|
||||
"home": "Inicio",
|
||||
"welcome": "¡Bienvenido a tu instancia de Spoolman!",
|
||||
"description": "Parece que aún no has añadido ninguna bobina aún. Visita la <helpPageLink>página de ayuda</helpPageLink> para comenzar."
|
||||
},
|
||||
"settings": {
|
||||
"header": "Ajustes",
|
||||
"general": {
|
||||
"tab": "General",
|
||||
"currency": {
|
||||
"label": "Moneda"
|
||||
},
|
||||
"base_url": {
|
||||
"label": "URL base",
|
||||
"tooltip": "La URL base que se utilizará al generar funciones como códigos QR."
|
||||
},
|
||||
"round_prices": {
|
||||
"label": "Redondear precios",
|
||||
"tooltip": "Redondear precios al número entero más cercano."
|
||||
}
|
||||
},
|
||||
"extra_fields": {
|
||||
"tab": "Campos adicionales",
|
||||
"params": {
|
||||
"key": "Clave",
|
||||
"name": "Nombre",
|
||||
"field_type": "Tipo",
|
||||
"unit": "Unidad",
|
||||
"order": "Orden",
|
||||
"default_value": "Valor predeterminado",
|
||||
"choices": "Opciones",
|
||||
"multi_choice": "Múltiples opciones"
|
||||
},
|
||||
"field_type": {
|
||||
"text": "Texto",
|
||||
"integer": "Entero",
|
||||
"integer_range": "Rango de enteros",
|
||||
"float": "Decimal",
|
||||
"float_range": "Rango Decimal",
|
||||
"datetime": "Fecha y hora",
|
||||
"boolean": "Booleano",
|
||||
"choice": "Opción"
|
||||
},
|
||||
"boolean_true": "Sí",
|
||||
"boolean_false": "No",
|
||||
"choices_missing_error": "No se pueden eliminar opciones. Faltan las siguientes opciones: {{choices}}",
|
||||
"non_unique_key_error": "La clave debe ser única.",
|
||||
"key_not_changed": "Por favor, cambie la clave por otra.",
|
||||
"delete_confirm": "¿Borrar campo {{name}}?",
|
||||
"delete_confirm_description": "Esto eliminará el campo y todos los datos asociados para todas las entidades.",
|
||||
"description": "<p> Aquí puede agregar más campos personalizados a los asuntos.</p><p> 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.</p><p> 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.</p><p> Los campos de salida no se pueden ordenar ni filtrar en las vistas de tabla.</p>"
|
||||
},
|
||||
"settings": "Ajustes"
|
||||
},
|
||||
"locations": {
|
||||
"locations": "Ubicaciones",
|
||||
"new_location": "Nueva ubicación",
|
||||
"no_location": "Sin ubicación",
|
||||
"no_locations_help": "Esta página te permite organizar tus carretes en ubicaciones, ¡añade algunos carretes para empezar!"
|
||||
}
|
||||
}
|
||||
@@ -0,0 +1,399 @@
|
||||
{
|
||||
"actions": {
|
||||
"list": "Kuva",
|
||||
"create": "Loo",
|
||||
"edit": "Muuda",
|
||||
"show": "Näita",
|
||||
"clone": "Klooni"
|
||||
},
|
||||
"buttons": {
|
||||
"create": "Loo",
|
||||
"save": "Salvesta",
|
||||
"confirm": "Oled kindel?",
|
||||
"clear": "Tühjenda",
|
||||
"refresh": "Uuenda",
|
||||
"show": "Näita",
|
||||
"hideColumns": "Peida tulbad",
|
||||
"clearFilters": "Tühjenda filtrid",
|
||||
"edit": "Muuda",
|
||||
"undo": "Võta tagasi",
|
||||
"clone": "Klooni",
|
||||
"archive": "Arhiveeri",
|
||||
"notAccessTitle": "Sul pole õigusi sisenemiseks",
|
||||
"saveAndAdd": "Salvesta ja Lisa",
|
||||
"logout": "Logi välja",
|
||||
"delete": "Kustuta",
|
||||
"cancel": "Tühista",
|
||||
"import": "Impordi",
|
||||
"filter": "Filtreeri",
|
||||
"unArchive": "Võta arhiivist tagasi",
|
||||
"hideArchived": "Peida arhiveeritud",
|
||||
"showArchived": "Näita arhiveeritud",
|
||||
"continue": "Jätka"
|
||||
},
|
||||
"notifications": {
|
||||
"error": "Viga (kood: {{statusCode}})",
|
||||
"undoable": "Sul on {{seconds}} sekundit, et muudatus tagasi võtta.",
|
||||
"success": "Õnnestunud",
|
||||
"createSuccess": "Loodi {{resource}}",
|
||||
"createError": "Tekkis viga {{resource}} loomisel. (staatuse kood: {{statusCode}})",
|
||||
"deleteSuccess": "Edukalt kustutatud {{resource}}",
|
||||
"deleteError": "Viga {{resource}} kustutamisel. (staatuse kood: {{statusCode}})",
|
||||
"editSuccess": "Edukalt muudetud {{resource}}",
|
||||
"editError": "Viga {{resource}} muutmisel (staatuse kood: {{statusCode}})",
|
||||
"importProgress": "Importimine: {{processed}}/{{total}}",
|
||||
"saveSuccessful": "Salvesta edukalt!",
|
||||
"validationError": "Viga validerimisel: {{error}}"
|
||||
},
|
||||
"warnWhenUnsavedChanges": "Oled sa kindel, et soovid lahkuda? Sul on salvestamata muudatusi.",
|
||||
"kofi": "Anna mulle tippi Ko-fi's",
|
||||
"loading": "Laadimine",
|
||||
"version": "Versioon",
|
||||
"unknown": "Tundmatu",
|
||||
"yes": "Jah",
|
||||
"no": "Ei",
|
||||
"tags": {
|
||||
"clone": "Klooni"
|
||||
},
|
||||
"dashboard": {
|
||||
"title": "Juhtpaneel"
|
||||
},
|
||||
"printing": {
|
||||
"generic": {
|
||||
"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": ""
|
||||
}
|
||||
}
|
||||
@@ -0,0 +1,399 @@
|
||||
{
|
||||
"actions": {
|
||||
"show": "نمایش",
|
||||
"clone": "تکثیر",
|
||||
"create": "اضافه کردن",
|
||||
"list": "لیست",
|
||||
"edit": "ویرایش"
|
||||
},
|
||||
"buttons": {
|
||||
"save": "ذخیره",
|
||||
"saveAndAdd": "ذخیره و اضافه کردن",
|
||||
"cancel": "انصراف",
|
||||
"refresh": "تازه سازی",
|
||||
"show": "نمایش",
|
||||
"showArchived": "نمایش آرشیو",
|
||||
"notAccessTitle": "شما مجوز های لازم برای انجام این کار را ندارید",
|
||||
"hideColumns": "مخفی کردن ستون",
|
||||
"create": "اضافه کردن",
|
||||
"logout": "خروج",
|
||||
"edit": "ویرایش",
|
||||
"delete": "حذف",
|
||||
"confirm": "آیا از انجام این عمل اطمینان دارید؟",
|
||||
"filter": "فیلتر",
|
||||
"continue": "ادامه",
|
||||
"clear": "پاک کردن",
|
||||
"undo": "بازگشت به حالت قبلی",
|
||||
"clone": "تکثیر",
|
||||
"import": "وارد کردن",
|
||||
"archive": "آرشیو کردن",
|
||||
"unArchive": "درآوردن از آرشیو",
|
||||
"hideArchived": "آرشیو مخفی",
|
||||
"clearFilters": "حذف فیلتر ها"
|
||||
},
|
||||
"notifications": {
|
||||
"success": "ثبت موفق",
|
||||
"error": "خطای {{statusCode}} رخ داد",
|
||||
"createSuccess": "{{resource}} با موفقیت ایجاد شد",
|
||||
"deleteSuccess": "{{resource}} حذف شد",
|
||||
"editError": "در زمان ویرایش {{resource}} خطای {{statusCode}} رخ داد",
|
||||
"validationError": "خطای تایید اطلاعات {{error}}",
|
||||
"undoable": "برای برگشت به حالت قبل {{seconds}} ثانیه فرصت دارید...",
|
||||
"createError": "در زمان ساخت {{resource}} مشکل {{statusCode}} رخ داد",
|
||||
"deleteError": "حذف {{resource}} با خطای {{statusCode}} مواجه شد",
|
||||
"editSuccess": "{{resource}} با موفقیت ویرایش شد",
|
||||
"importProgress": "در حال وارد کردن {{processed}} از مجموع {{total}}",
|
||||
"saveSuccessful": "با موفقیت ثبت شد!"
|
||||
},
|
||||
"warnWhenUnsavedChanges": "از خارج شدن خود مطمئن هستید؟ موارد ذخیره نشده نادیده گرفته خواهند شد.",
|
||||
"kofi": "حمایت از سازنده این برنامه",
|
||||
"loading": "در حال بارگذاری",
|
||||
"version": "ورژن",
|
||||
"unknown": "نامشخص",
|
||||
"yes": "بله",
|
||||
"no": "خیر",
|
||||
"tags": {
|
||||
"clone": "تکثیر"
|
||||
},
|
||||
"dashboard": {
|
||||
"title": "داشبورد"
|
||||
},
|
||||
"printing": {
|
||||
"generic": {
|
||||
"title": "در حال پرینت",
|
||||
"description": "تنظیمات زیر را جوری تنظیم کنید که چیدمان پرینت لیبل مد نظرتان بدست بیاید. توجه کنید پرینتر و سیستم عامل شما ممکن است تنظیمات خودشان را لحاظ کنند، لذا ممکن است کمی آزمون و خطا نیاز باشد تا نتیجه مطلوب بدست بیاید. قبل اینکه لیبل نهایی را پرینت کنید ابتدا روی یک تکه کاغذ معمولی پرینت بگیرید و تست کنید.",
|
||||
"helpMargin": "حاشیهها باید با کاغذ برچسب و چاپگر شما هماهنگ شوند، تغییر دادن این تنظیمات بر اندازه کل شبکه تأثیر میگذارد.",
|
||||
"print": "پرینت",
|
||||
"columns": "ستون",
|
||||
"rows": "سطر",
|
||||
"paperSize": "اندازه کاغذ",
|
||||
"customSize": "کاستوم",
|
||||
"dimensions": "ابعاد",
|
||||
"showBorder": "نمایش کناره ها",
|
||||
"previewScale": "پیش نمایش اندازه",
|
||||
"skipItems": "نادیده گرفتن یک آیتم",
|
||||
"itemCopies": "تعداد کپی هر آیتم",
|
||||
"contentSettings": "تنظیمات محتوی",
|
||||
"layoutSettings": "تنظیمات چیدمان",
|
||||
"horizontalSpacing": "فاصله افقی",
|
||||
"verticalSpacing": "فاصله عمودی",
|
||||
"marginLeft": "فاصله از چپ",
|
||||
"marginRight": "فاصله از راست",
|
||||
"printerMarginLeft": "منطقه ایمن از چپ",
|
||||
"printerMarginRight": "منطقه ایمن از راست",
|
||||
"printerMarginTop": "منطقه ایمن از بالا",
|
||||
"printerMarginBottom": "منطقه ایمن از پایین",
|
||||
"borders": {
|
||||
"none": "هیچ کدام",
|
||||
"border": "حاشیه",
|
||||
"grid": "شبکه"
|
||||
},
|
||||
"settings": "تنظیمات پیشفرض",
|
||||
"defaultSettings": "پیشفرض",
|
||||
"addSettings": "اضافه کردن پیشفرض جدید",
|
||||
"newSetting": "جدید",
|
||||
"duplicateSettings": "تکثیر کردن",
|
||||
"deleteSettings": "حذف پیشفرض فعلی",
|
||||
"deleteSettingsConfirm": "از حذف این پیشفرض مطمئن هستید؟",
|
||||
"settingsName": "اسم پیشفرض",
|
||||
"saveSetting": "ذخیره کردن پیش فرض",
|
||||
"saveAsImage": "ذخیره به عنوان عکس",
|
||||
"helpPrinterMargin": "ناحیه امن باید بر اساس نزدیکترین فاصلهای که چاپگر شما میتواند تا لبه کاغذ چاپ کند تنظیم شود. تغییر این تنظیمات بر کل شبکه تأثیری نخواهد داشت.",
|
||||
"marginTop": "فاصله از بالا",
|
||||
"marginBottom": "فاصله از پایین"
|
||||
},
|
||||
"qrcode": {
|
||||
"button": "پرینت لیبل",
|
||||
"title": "در حال پرینت لیبل",
|
||||
"template": "قالب لیبل",
|
||||
"textSize": "اندازه متن لیبل",
|
||||
"useHTTPUrl": {
|
||||
"label": "لینک بارکد QR",
|
||||
"options": {
|
||||
"default": "پیشفرض",
|
||||
"url": "لینک"
|
||||
},
|
||||
"preview": "پیش نمایش:",
|
||||
"tooltip": "از لینک اختصاصی استفاده خواهد شد که فقط در صورتی کار میکند که از ویژگی اسکن Spoolman اسکن شود (پیشفرض). آدرس URL یا از آدرس پایهای که در تنظیمات مشخص شده استفاده میکند، یا در صورت عدم تنظیم، از آدرس صفحه فعلی."
|
||||
},
|
||||
"showContent": "پرینت کردن لیبل",
|
||||
"showQRCode": "پرینت بارکد QR",
|
||||
"showQRCodeMode": {
|
||||
"no": "خیر",
|
||||
"simple": "ساده",
|
||||
"withIcon": "با آیکون"
|
||||
},
|
||||
"templateHelp": "از {} برای وارد کردن مقادیر مربوط به شیء spool بهعنوان متن استفاده کنید. بهعنوان مثال، {id} با شناسه spool جایگزین میشود، یا {filament.material} با جنس فیلامنت spool جایگزین خواهد شد. اگر مقداری وجود نداشته باشد، با \"?\" جایگزین میشود. میتوانید از یک مجموعه دوم {} استفاده کنید تا این مورد حذف شود. همچنین، هر متنی که بین این دو مجموعه {} قرار گرفته باشد، اگر مقدار وجود نداشته باشد، حذف خواهد شد. بهعنوان مثال، {Lot Nr: {lot_nr}} فقط زمانی نمایش داده میشود که spool دارای شماره lot باشد. برای برجستهکردن متن از دو علامت ** استفاده کنید. برای مشاهده لیست کامل برچسبها روی دکمه کلیک کنید."
|
||||
},
|
||||
"spoolSelect": {
|
||||
"title": "انتخاب رول فیلامنت",
|
||||
"description": "انتخاب رول فیلامنتی که لیبل پرینت میکنید.",
|
||||
"showArchived": "نمایش آرشیو",
|
||||
"noSpoolsSelected": "هیچ رول فیلامنتی را انتخاب نکردید.",
|
||||
"selectAll": "انتخاب/عدم انتخاب همه",
|
||||
"selectedTotal_one": "{{count}} رول فیلامنت انتخاب شد",
|
||||
"selectedTotal_other": "تعدا د {{count}} رول فیلامنت انتخاب شد"
|
||||
}
|
||||
},
|
||||
"scanner": {
|
||||
"title": "اسکنر بارکد QR",
|
||||
"description": "یک بارکد QR از Spoolman را اسکن کنید تا جزئیات مربوط به spool را مشاهده کنید.",
|
||||
"error": {
|
||||
"notAllowed": "شما اجازه دسترسی به دوربین را ندادهاید.",
|
||||
"insecureContext": "این صفحه از طریق HTTPS ارائه نمیشود.",
|
||||
"streamApiNotSupported": "مرورگر از API رسانهای (MediaStream API) پشتیبانی نمیکند.",
|
||||
"notReadable": "دوربین قابل خواندن نیست.",
|
||||
"notFound": "دوربینی پیدا نشد.",
|
||||
"unknown": "خطای نامشخص {{error}} رخ داد"
|
||||
}
|
||||
},
|
||||
"spool": {
|
||||
"spool": "رول های فیلامنت",
|
||||
"fields": {
|
||||
"id": "شماره",
|
||||
"filament_name": "فیلامنت",
|
||||
"filament": "فیلامنت",
|
||||
"filament_internal": "داخلی",
|
||||
"filament_external": "خارجی",
|
||||
"price": "قیمت",
|
||||
"material": "متریال",
|
||||
"weight_to_use": "وزن",
|
||||
"used_weight": "مقدار استفاده شده",
|
||||
"remaining_weight": "مقدار باقی مانده",
|
||||
"measured_weight": "مقدار اندازه گیری شده",
|
||||
"used_length": "طول مصرف شده",
|
||||
"remaining_length": "طول باقی مانده",
|
||||
"location": "محل نگهداری",
|
||||
"lot_nr": "شماره تولید",
|
||||
"initial_weight": "وزن خالص رول کامل",
|
||||
"spool_weight": "وزن قرقره خالی",
|
||||
"first_used": "زمان اولین استفاده",
|
||||
"last_used": "زمان آخرین استفاده",
|
||||
"registered": "ثبت شده",
|
||||
"comment": "توضیحات",
|
||||
"archived": "آرشیو شده"
|
||||
},
|
||||
"fields_help": {
|
||||
"price": "قیمت یک قرقره کامل. در صورت عدم تنظیم، قیمت فیلامنت در نظر گرفته میشود.",
|
||||
"used_weight": "چقدر فیلامنت از قرقره استفاده شده است. یک قرقره جدید باید 0 گرم استفاده شده داشته باشد.",
|
||||
"remaining_weight": "چقدر فیلامنت در قرقره باقی مانده است. برای یک قرقره جدید، این باید با وزن قرقره مطابقت داشته باشد.",
|
||||
"measured_weight": "وزن فیلامنت و قرقره چقدر است.",
|
||||
"location": "مکانی که قرقره در آن قرار دارد اگر چندین مکان برای ذخیره قرقرهها دارید.",
|
||||
"lot_nr": "شماره بچ تولیدکننده. میتواند برای اطمینان از اینکه چاپ رنگ ثابتی دارد در صورتی که از چندین قرقره استفاده شود، استفاده شود.",
|
||||
"weight_to_use": "وزن مورد نظر برای ورود را انتخاب کنید. وزن اندازهگیریشده فقط در صورتی در دسترس است که وزن قرقره برای فیلامنت انتخاب شده تنظیم شده باشد.",
|
||||
"initial_weight": "وزن اولیه فیلامنت روی قرقره (وزن خالص). اگر تنظیم نشده باشد، از وزن شیء فیلامنت استفاده خواهد شد.",
|
||||
"external_filament": "شما یک فیلامنت از پایگاه داده خارجی انتخاب کردهاید. یک شیء فیلامنت (و احتمالاً یک شیء تولیدکننده) بهطور خودکار زمانی که این قرقره را ایجاد میکنید، ایجاد خواهد شد. این ممکن است منجر به ایجاد اشیاء فیلامنت تکراری شود اگر قبلاً یک شیء فیلامنت برای این فیلامنت ایجاد کرده باشید.",
|
||||
"spool_weight": "وزن قرقره زمانی که خالی است. برای استفاده از مقدار فیلامنت یا تولیدکننده، این قسمت را خالی بگذارید."
|
||||
},
|
||||
"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": ""
|
||||
}
|
||||
},
|
||||
"filament": {
|
||||
"filament": "فیلامنت ها",
|
||||
"fields": {
|
||||
"id": "شماره",
|
||||
"vendor_name": "تولید کننده",
|
||||
"vendor": "تولید کننده",
|
||||
"name": "عنوان",
|
||||
"material": "متریال",
|
||||
"price": "قیمت",
|
||||
"density": "چگالی (Density)",
|
||||
"weight": "وزن",
|
||||
"diameter": "ضخامت",
|
||||
"article_number": "شماره انحصاری تولید",
|
||||
"spool_weight": "وزن قرقره فیلامنت",
|
||||
"registered": "ثبت شده",
|
||||
"comment": "توضیحات",
|
||||
"settings_extruder_temp": "دمای اکسترودر",
|
||||
"settings_bed_temp": "دمای هیت بد",
|
||||
"single_color": "تک رنگ",
|
||||
"multi_color": "تغییر رنگ",
|
||||
"coaxial": "کوپلیمری",
|
||||
"longitudinal": "طولی",
|
||||
"external_id": "آیدی خارجی",
|
||||
"spools": "نمایش رول فیلامنت ها",
|
||||
"color_hex": "رنگ"
|
||||
},
|
||||
"fields_help": {
|
||||
"material": "برای مثال PLA، ABS، PETG یا ...",
|
||||
"price": "قیمت یک رول کامل.",
|
||||
"spool_weight": "وزن یک قرقره خالی. برای تعیین وزن اندازهگیریشده یک قرقره استفاده میشود.",
|
||||
"article_number": "برای مثال EAN/UPC یا ...",
|
||||
"name": "نام فیلامنت، برای تمایز این نوع فیلامنت از سایرین از همان تولیدکننده. باید شامل رنگ نیز باشد.",
|
||||
"weight": "وزن فیلامنت یک قرقره کامل (وزن خالص). این باید شامل وزن خود قرقره نباشد و فقط فیلامنت را شامل شود. معمولاً روی بستهبندی نوشته شده است.",
|
||||
"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": "شماره",
|
||||
"name": "اسم",
|
||||
"external_id": "شماره خارجی",
|
||||
"registered": "ثبت شده",
|
||||
"comment": "توضیحات",
|
||||
"empty_spool_weight": "وزن قرقره فیلامنت خالی"
|
||||
},
|
||||
"fields_help": {
|
||||
"empty_spool_weight": "وزن یک قرقره خالی فیلامنت ارائه شده از تولید کننده."
|
||||
},
|
||||
"titles": {
|
||||
"create": "تعریف تولید کننده جدید",
|
||||
"clone": "تکثیر تولید کننده",
|
||||
"edit": "ویرایش تولید کننده",
|
||||
"list": "تولید کننده ها",
|
||||
"show": "نمایش تولید کننده",
|
||||
"show_title": "[تولید کننده شماره {{id}}] {{name}}"
|
||||
},
|
||||
"form": {
|
||||
"vendor_updated": "این تولیدکننده توسط شخص یا چیزی دیگر از زمانی که این صفحه را باز کردهاید، بهروز شده است. ذخیرهسازی تغییرات شما، آن تغییرات را نادیده میگیرد!"
|
||||
}
|
||||
},
|
||||
"home": {
|
||||
"home": "صفحه اصلی",
|
||||
"welcome": "",
|
||||
"description": ""
|
||||
},
|
||||
"help": {
|
||||
"help": "راهنما",
|
||||
"resources": {
|
||||
"filament": "برندهای فیلامنت. آنها دارای ویژگیهایی مانند نام، جنس، رنگ، قطر و موارد دیگر هستند.",
|
||||
"spool": "قرقرههای فیزیکی جداگانه از یک فیلامنت خاص.",
|
||||
"vendor": "شرکتهایی که فیلامنت تولید میکنند."
|
||||
},
|
||||
"description": "<title>راهنما</title><p>در اینجا چند نکته برای شروع کارتان آورده شده است.</p><p>Spoolman سه نوع مختلف داده را نگهداری میکند:</p><itemsHelp/><p>برای اضافه کردن یک قرقره جدید به پایگاه داده، ابتدا یک <filamentCreateLink>شیء فیلامنت</filamentCreateLink> ایجاد کنید. پس از انجام این کار، به ایجاد یک <spoolCreateLink>شیء قرقره</spoolCreateLink> برای آن قرقره خاص ادامه دهید. اگر بعداً قرقرههای اضافی از همان فیلامنت به دست آوردید، به سادگی اشیاء قرقره اضافی را ایجاد کرده و از همان شیء فیلامنت استفاده کنید.</p><p>بهصورت اختیاری، میتوانید یک <vendorCreateLink>شیء تولیدکننده</vendorCreateLink> برای شرکتی که فیلامنت را تولید میکند ایجاد کنید، اگر بخواهید این اطلاعات را دنبال کنید.</p><p>شما این امکان را دارید که سایر خدمات چاپ سهبعدی را به Spoolman پیوند دهید، مانند Moonraker، که میتواند بهطور خودکار استفاده از فیلامنت را نظارت کرده و اشیاء قرقره را برای شما بهروزرسانی کند. برای راهنمایی در مورد نحوه تنظیم این موارد به <readmeLink>راهنمای Spoolman</readmeLink> مراجعه کنید.</p>"
|
||||
},
|
||||
"table": {
|
||||
"actions": "اعمال قابل انجام"
|
||||
},
|
||||
"settings": {
|
||||
"settings": "تنظیمات",
|
||||
"header": "تنظیمات",
|
||||
"general": {
|
||||
"tab": "تنظیمات کلی",
|
||||
"currency": {
|
||||
"label": "ارز مورد استفاده"
|
||||
},
|
||||
"base_url": {
|
||||
"tooltip": "آدرس پایگاه داده Spoolman که باید هنگام ایجاد ویژگیهایی مانند کدهای QR استفاده شود.",
|
||||
"label": "لینک Spoolman"
|
||||
},
|
||||
"round_prices": {
|
||||
"label": "",
|
||||
"tooltip": ""
|
||||
}
|
||||
},
|
||||
"extra_fields": {
|
||||
"tab": "فیلد های اضافه",
|
||||
"params": {
|
||||
"key": "شاخصه کلیدی",
|
||||
"name": "عنوان",
|
||||
"unit": "واحد",
|
||||
"field_type": "نوع",
|
||||
"order": "ترتیب",
|
||||
"default_value": "مقدار پیشفرض",
|
||||
"choices": "آپشن های قابل استفاده",
|
||||
"multi_choice": "قابلیت انتخاب چند آپشن همزمان"
|
||||
},
|
||||
"field_type": {
|
||||
"text": "متن",
|
||||
"integer": "عدد بدون اعشار",
|
||||
"integer_range": "رنج عددی بدون اعشار",
|
||||
"float": "عدد اعشاری",
|
||||
"float_range": "رنج عددی اعشاری",
|
||||
"datetime": "زمان و تاریخ",
|
||||
"boolean": "Boolean",
|
||||
"choice": "انتخاب"
|
||||
},
|
||||
"boolean_true": "بله",
|
||||
"boolean_false": "خیر",
|
||||
"choices_missing_error": "شما نمیتوانید گزینهها را حذف کنید. گزینههای زیر موجود نیستند: {{choices}}",
|
||||
"non_unique_key_error": "شاخصه کلیدی باید منحصر به فرد باشد.",
|
||||
"key_not_changed": "لطفاً شاخصه کلیدی را به چیز دیگری تغییر دهید.",
|
||||
"delete_confirm": "آیا میخواهید {{name}} را حذف کنید؟",
|
||||
"delete_confirm_description": "این کار فیلد و تمام دادههای مرتبط با آن را برای همه موجودیها حذف خواهد کرد.",
|
||||
"description": "<p>در اینجا میتوانید فیلدهای سفارشی اضافی را به موجودیهای خود اضافه کنید.</p><p>پس از افزودن یک فیلد، نمیتوانید کلید یا نوع آن را تغییر دهید و برای فیلدهای نوع انتخاب، نمیتوانید گزینهها را حذف یا وضعیت چندانتخابی را تغییر دهید. اگر یک فیلد را حذف کنید، دادههای مرتبط با تمام موجودیها حذف خواهد شد.</p><p>کلید، اطلاعاتی است که برنامههای دیگر آن را میخوانند یا مینویسند، بنابراین اگر فیلد سفارشی شما قرار است با یک برنامه شخص ثالث ادغام شود، اطمینان حاصل کنید که به درستی تنظیم شده باشد. مقدار پیشفرض فقط بر روی اقلام جدید اعمال میشود.</p><p>فیلدهای اضافی نمیتوانند در نماهای جدول مرتب یا فیلتر شوند.</p>"
|
||||
}
|
||||
},
|
||||
"documentTitle": {
|
||||
"default": "اسپول من",
|
||||
"suffix": " | اسپول من",
|
||||
"home": {
|
||||
"list": "صفحه اصلی | اسپول من"
|
||||
},
|
||||
"help": {
|
||||
"list": "راهنما | اسپول من"
|
||||
},
|
||||
"filament": {
|
||||
"list": "فیلامنت ها | اسپول من",
|
||||
"show": "نمایش فیلامنت شماره {{id}} | اسپول من",
|
||||
"edit": "ویرایش فیلامنت شماره {{id}} | اسپول من",
|
||||
"create": "ساخت فیلامنت جدید | اسپول من",
|
||||
"clone": "تکثیر فیلامنت شماره {{id}} | اسپول من"
|
||||
},
|
||||
"spool": {
|
||||
"list": "رول های فیلامنت | اسپول من",
|
||||
"show": "نمایش رول فیلامنت شماره {{id}} | اسپول من",
|
||||
"edit": "ویرایش رول فیلامنت شماره {{id}} | اسپول من",
|
||||
"create": "ساخت رول فیلامنت جدید | اسپول من",
|
||||
"clone": "تکثیر رول فیلامنت شماره {{id}} | اسپول من"
|
||||
},
|
||||
"vendor": {
|
||||
"list": "تولید کنندگان فیلامنت | اسپول من",
|
||||
"edit": "ویرایش تولید کننده فیلامنت شماره {{id}} | اسپول من",
|
||||
"show": "نمایش تولید کننده فیلامنت شماره {{id}} | اسپول من",
|
||||
"create": "تعریف کردن تولید کننده فیلامنت جدید | اسپول من",
|
||||
"clone": "تکثیر تولید کننده فیلامنت شماره {{id}} | اسپول من"
|
||||
},
|
||||
"locations": {
|
||||
"list": ""
|
||||
}
|
||||
},
|
||||
"locations": {
|
||||
"new_location": "",
|
||||
"no_location": "",
|
||||
"locations": "",
|
||||
"no_locations_help": ""
|
||||
}
|
||||
}
|
||||
@@ -4,26 +4,43 @@
|
||||
"extruderTemp": "ET : {{temp}}",
|
||||
"showSpoolWeight": "Poids de la bobine",
|
||||
"showContent": "Imprimer l'étiquette",
|
||||
"showVendorComment": "Commentaire sur le vendeur",
|
||||
"showVendorComment": "Commentaire sur le fabricant",
|
||||
"spoolWeight": "Poids de la bobine : {{weight}}",
|
||||
"showTemperatures": "Températures",
|
||||
"showVendor": "Vendeur",
|
||||
"showVendor": "Fabricant",
|
||||
"showSpoolComment": "Commentaire sur la bobine",
|
||||
"textSize": "Contenu Taille du texte",
|
||||
"title": "Impression de codes QR",
|
||||
"textSize": "Taille du texte de l'étiquette",
|
||||
"title": "Impression d'étiquettes",
|
||||
"showSpoolmanIcon": "Montrer l'icône Spoolman",
|
||||
"showLotNr": "N° de Lot",
|
||||
"bedTemp": "BT : {{temp}}",
|
||||
"lotNr": "N° de Lot : {{lot}}",
|
||||
"showFilamentComment": "Commentaire sur le filament",
|
||||
"button": "Imprimer des codes QR"
|
||||
"button": "Imprimer des étiquettes",
|
||||
"showQRCode": "Imprimer le QR Code",
|
||||
"templateHelp": "Utilisez {} pour insérer les valeurs de l'objet bobine sous forme de texte. Par exemple, {id} sera remplacé par l'identifiant de la bobine ou {filament.material} sera remplacé par le matériau de la bobine. Si une variable n'existe pas elle sera remplacée par \"?\". Un deuxième jeu d'accolade peut empêcher cet affichage. De plus si une accolade est utilisée dans une autre tout le texte présenta dans la première accolade sera retiré si la variable est manquante. Par exemple {N° lot : {lot_nr}} sera affiché uniquement si la bobine a un numéro de lot. Entourez le texte d'un double astérisque ** pour le mettre en gras. Cliquez sur le bouton pour afficher une liste de toutes les balises disponibles.",
|
||||
"template": "Modèle d'étiquette",
|
||||
"showQRCodeMode": {
|
||||
"no": "Non",
|
||||
"simple": "Simple",
|
||||
"withIcon": "Avec icône"
|
||||
},
|
||||
"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.",
|
||||
"options": {
|
||||
"default": "Défaut",
|
||||
"url": "URL"
|
||||
},
|
||||
"preview": "Prévisualisation :",
|
||||
"label": "Lien du QR code"
|
||||
}
|
||||
},
|
||||
"generic": {
|
||||
"printerMarginBottom": "Zone de sécurité en bas",
|
||||
"verticalSpacing": "Espacement vertical",
|
||||
"rows": "Rangs",
|
||||
"rows": "Lignes",
|
||||
"borders": {
|
||||
"none": "Aucun",
|
||||
"none": "Aucune",
|
||||
"grid": "Grille",
|
||||
"border": "Bordure"
|
||||
},
|
||||
@@ -35,26 +52,37 @@
|
||||
"printerMarginRight": "Zone de sécurité à droite",
|
||||
"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.",
|
||||
"previewScale": "Échelle de prévisualisation",
|
||||
"helpMargin": "Les marges doivent être configurées en fonction de votre papier à étiquettes et de votre imprimante, car leur modification aura une incidence sur la taille de l'ensemble de la grille.",
|
||||
"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.",
|
||||
"marginTop": "Marge supérieure",
|
||||
"skipItems": "Passer les articles",
|
||||
"skipItems": "Articles ignorés",
|
||||
"layoutSettings": "Paramètres de mise en page",
|
||||
"paperSize": "Format du papier",
|
||||
"columns": "Colonnes",
|
||||
"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 et erreurs avant que tout soit correct. Testez-le sur une feuille de papier ordinaire avant d'imprimer les étiquettes proprement dites.",
|
||||
"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.",
|
||||
"marginBottom": "Marge inférieure",
|
||||
"horizontalSpacing": "Espacement horizontal",
|
||||
"marginLeft": "Marge gauche",
|
||||
"showBorder": "Afficher les bords",
|
||||
"printerMarginLeft": "Zone de sécurité à gauche",
|
||||
"dimensions": "Dimensions",
|
||||
"print": "Imprimer"
|
||||
"print": "Imprimer",
|
||||
"settings": "Préréglages",
|
||||
"defaultSettings": "Défaut",
|
||||
"addSettings": "Ajouter un nouveau préréglage",
|
||||
"newSetting": "Nouveau",
|
||||
"deleteSettings": "Supprimer le préréglage actuel",
|
||||
"deleteSettingsConfirm": "Êtes-vous sûr de vouloir supprimer ce préréglage ?",
|
||||
"settingsName": "Nom du préréglage",
|
||||
"saveAsImage": "Enregistrer comme image",
|
||||
"itemCopies": "Nombre d'articles",
|
||||
"duplicateSettings": "Dupliquer",
|
||||
"saveSetting": "Enregistrer les préréglages"
|
||||
},
|
||||
"spoolSelect": {
|
||||
"selectedTotal_one": "{{count}} bobine sélectionnée",
|
||||
"selectedTotal_many": "{{count}} bobines sélectionnées",
|
||||
"selectedTotal_other": "{{count}} bobines sélectionnées",
|
||||
"description": "Sélectionnez les bobines pour lesquelles vous souhaitez imprimer des codes QR.",
|
||||
"description": "Sélectionnez les bobines pour lesquelles imprimer des étiquettes.",
|
||||
"showArchived": "Afficher les archives",
|
||||
"title": "Sélectionner les bobines",
|
||||
"selectAll": "Sélectionner/Désélectionner tout",
|
||||
@@ -63,11 +91,11 @@
|
||||
},
|
||||
"documentTitle": {
|
||||
"vendor": {
|
||||
"create": "Créer le Vendeur | Spoolman",
|
||||
"clone": "#{{id}} Cloner le Vendeur | Spoolman",
|
||||
"edit": "#{{id}} Editer le Vendeur | Spoolman",
|
||||
"list": "Vendeurs | Spoolman",
|
||||
"show": "#{{id}} Afficher le vendeur | Spoolman"
|
||||
"create": "Créer le fabricant | Spoolman",
|
||||
"clone": "#{{id}} Cloner le fabricant | Spoolman",
|
||||
"edit": "#{{id}} Éditer le fabricant| Spoolman",
|
||||
"list": "Fabricants | Spoolman",
|
||||
"show": "#{{id}} Afficher le fabricant | Spoolman"
|
||||
},
|
||||
"default": "Spoolman",
|
||||
"spool": {
|
||||
@@ -90,6 +118,9 @@
|
||||
},
|
||||
"help": {
|
||||
"list": "Aide | Spoolman"
|
||||
},
|
||||
"locations": {
|
||||
"list": "Emplacements | Spoolman"
|
||||
}
|
||||
},
|
||||
"spool": {
|
||||
@@ -109,9 +140,13 @@
|
||||
"registered": "Enregistré",
|
||||
"first_used": "Première utilisation",
|
||||
"used_weight": "Poids utilisé",
|
||||
"id": "ID",
|
||||
"id": "Identifiant",
|
||||
"remaining_weight": "Poids restant",
|
||||
"price": ""
|
||||
"price": "Prix",
|
||||
"initial_weight": "Poids initial",
|
||||
"spool_weight": "Poids à vide",
|
||||
"filament_internal": "Interne",
|
||||
"filament_external": "Externe"
|
||||
},
|
||||
"titles": {
|
||||
"archive": "Archiver la bobine",
|
||||
@@ -120,7 +155,8 @@
|
||||
"create": "Créer une bobine",
|
||||
"clone": "Cloner une bobine",
|
||||
"list": "Bobines",
|
||||
"show_title": "[Bobine #{{id}}] {{name}}"
|
||||
"show_title": "[Bobine #{{id}}] {{name}}",
|
||||
"adjust": "Ajuster la bobine de filament"
|
||||
},
|
||||
"fields_help": {
|
||||
"used_weight": "Combien de filament a été utilisé à partir de la bobine. Une bobine neuve devrait avoir 0g utilisé.",
|
||||
@@ -129,7 +165,10 @@
|
||||
"lot_nr": "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.",
|
||||
"remaining_weight": "La quantité de filament restant sur la bobine. Pour une nouvelle bobine, cela devrait correspondre au poids de la bobine.",
|
||||
"location": "L'emplacement de la bobine si vous stockez vos bobines à plusieurs endroits.",
|
||||
"price": ""
|
||||
"price": "Prix d'une bobine complète. S'il n'est pas défini, le prix du filament sera pris en compte.",
|
||||
"initial_weight": "Le poids initial du filament sur la bobine (poids net). Utilisera le poids de l'objet filament s'il n'est pas défini.",
|
||||
"spool_weight": "Le poids de la bobine lorsqu'elle est vide. Laissez vide pour utiliser la valeur du filament ou du fabricant.",
|
||||
"external_filament": "Vous avez sélectionné un filament dans la base de données externe. Un objet filament (et éventuellement un objet fabricant) sera créé automatiquement lorsque vous créerez cette bobine. Cela peut créer des objets filament en double si vous avez déjà créé un objet filament pour ce filament."
|
||||
},
|
||||
"spool": "Bobines",
|
||||
"messages": {
|
||||
@@ -137,7 +176,17 @@
|
||||
},
|
||||
"form": {
|
||||
"spool_updated": "Cette bobine a été mise à jour par quelqu'un/quelque chose depuis la dernière ouverture de la page. Enregistrer écrasera ces changements !",
|
||||
"new_location_prompt": "Entrer une nouvelle localisation"
|
||||
"new_location_prompt": "Entrer une nouvelle localisation",
|
||||
"measurement_type": {
|
||||
"length": "Longueur",
|
||||
"weight": "Poids"
|
||||
},
|
||||
"measurement_type_label": "Type de mesure",
|
||||
"adjust_filament_help": "Ici, vous pouvez directement ajouter ou soustraire du filament à la bobine. Une valeur positive consommera du filament, une valeur négative en ajoutera.",
|
||||
"adjust_filament_value": "Quantité consommée"
|
||||
},
|
||||
"formats": {
|
||||
"last_used": "Dernière utilisation {{date}}"
|
||||
}
|
||||
},
|
||||
"buttons": {
|
||||
@@ -147,35 +196,37 @@
|
||||
"filter": "Filtre",
|
||||
"cancel": "Abandonner",
|
||||
"edit": "Editer",
|
||||
"showArchived": "Voir les archives",
|
||||
"showArchived": "Afficher les archives",
|
||||
"archive": "Archiver",
|
||||
"hideColumns": "Masquer les colonnes",
|
||||
"confirm": "êtes-vous sur ?",
|
||||
"confirm": "Êtes-vous sur ?",
|
||||
"delete": "Supprimer",
|
||||
"undo": "Annuler",
|
||||
"import": "Importer",
|
||||
"logout": "Déconnexion",
|
||||
"refresh": "Rafraichir",
|
||||
"notAccessTitle": "Vous n'avez pas l'autorisation d'accéder",
|
||||
"hideArchived": "Cacher les archives",
|
||||
"notAccessTitle": "Vous n'avez pas l'autorisation d'accès",
|
||||
"hideArchived": "Masquer les archives",
|
||||
"clearFilters": "Effacer les filtres",
|
||||
"unArchive": "Désarchiver",
|
||||
"clone": "Cloner",
|
||||
"clear": "Effacer",
|
||||
"saveAndAdd": "Sauvegarder et ajouter"
|
||||
"saveAndAdd": "Sauvegarder et ajouter",
|
||||
"continue": "Continuer"
|
||||
},
|
||||
"filament": {
|
||||
"fields_help": {
|
||||
"name": "Nom du filament, pour distinguer ce type de filament parmi d'autres du même fournisseur. Il doit contenir la couleur, par exemple.",
|
||||
"name": "Nom du filament, pour distinguer ce type de filament parmi d'autres du même fabricant. Devrait contenir la couleur par exemple.",
|
||||
"article_number": "Exemple EAN, UPC, etc.",
|
||||
"spool_weight": "Le poids d'une bobine vide. Utilisé pour déterminer le poids d'une bobine.",
|
||||
"price": "Prix d'une bobine complète dans la devise configurée par le système.",
|
||||
"price": "Prix d'une bobine complète.",
|
||||
"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.",
|
||||
"material": "Exemple PLA, ABS, PETG, etc."
|
||||
"material": "Exemple PLA, ABS, PETG, etc.",
|
||||
"multi_color_direction": "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."
|
||||
},
|
||||
"fields": {
|
||||
"material": "Matériau",
|
||||
"vendor_name": "Vendeur",
|
||||
"vendor_name": "Fabricant",
|
||||
"settings_extruder_temp": "Température de l'extrudeuse",
|
||||
"comment": "Commentaire",
|
||||
"diameter": "Diamètre",
|
||||
@@ -185,12 +236,17 @@
|
||||
"name": "Nom",
|
||||
"price": "Prix",
|
||||
"settings_bed_temp": "Température du lit",
|
||||
"vendor": "Vendeur",
|
||||
"vendor": "Fabricant",
|
||||
"density": "Densité",
|
||||
"id": "ID",
|
||||
"id": "Identifiant",
|
||||
"color_hex": "Couleur",
|
||||
"article_number": "Numéro d'article",
|
||||
"spools": "Afficher les bobines"
|
||||
"spools": "Afficher les bobines",
|
||||
"external_id": "ID externe",
|
||||
"single_color": "Unique",
|
||||
"multi_color": "Multi",
|
||||
"longitudinal": "Longitudinale",
|
||||
"coaxial": "Coextrudée"
|
||||
},
|
||||
"titles": {
|
||||
"clone": "Cloner un filament",
|
||||
@@ -202,7 +258,12 @@
|
||||
},
|
||||
"filament": "Filaments",
|
||||
"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 !"
|
||||
"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."
|
||||
},
|
||||
"buttons": {
|
||||
"add_spool": "Ajouter une bobine"
|
||||
}
|
||||
},
|
||||
"actions": {
|
||||
@@ -230,32 +291,39 @@
|
||||
"editError": "Erreur lors de l'édition {{resource}} (status code : {{statusCode}})",
|
||||
"undoable": "Vous avez {{seconds}} secondes pour annuler.",
|
||||
"importProgress": "Importation : {{processed}}/{{total}}",
|
||||
"createError": "Une erreur s'est produite lors de la création de {{resource}}(status code : {{statusCode}})",
|
||||
"createError": "Une erreur s'est produite lors de la création de {{resource}} (status code : {{statusCode}})",
|
||||
"success": "Réussite",
|
||||
"editSuccess": "Édité avec succès {{resource}}",
|
||||
"deleteError": "Erreur lors de la suppression de {{resource}} (status code : {{statusCode}})",
|
||||
"createSuccess": "Création réussie de {{resource}}"
|
||||
"createSuccess": "Création réussie de {{resource}}",
|
||||
"saveSuccessful": "Sauvegarde réussie !",
|
||||
"validationError": "Erreur de validation : {{error}}"
|
||||
},
|
||||
"no": "Non",
|
||||
"unknown": "Inconnu",
|
||||
"vendor": {
|
||||
"titles": {
|
||||
"show": "Afficher le vendeur",
|
||||
"edit": "Editer un Vendeur",
|
||||
"clone": "Cloner un Vendeur",
|
||||
"create": "Créer un Vendeur",
|
||||
"list": "Vendeurs",
|
||||
"show_title": "[Vendeur #{{id}}] {{name}}"
|
||||
"show": "Afficher le fabricant",
|
||||
"edit": "Éditer un fabricant",
|
||||
"clone": "Cloner un fabricant",
|
||||
"create": "Créer un fabricant",
|
||||
"list": "Fabricants",
|
||||
"show_title": "[#{{id}} fabricant] {{name}}"
|
||||
},
|
||||
"fields": {
|
||||
"registered": "Enregistré",
|
||||
"comment": "Commentaire",
|
||||
"name": "Nom",
|
||||
"id": "ID"
|
||||
"id": "Identifiant",
|
||||
"empty_spool_weight": "Poids de la bobine vide",
|
||||
"external_id": "ID externe"
|
||||
},
|
||||
"vendor": "Vendeurs",
|
||||
"vendor": "Fabricants",
|
||||
"form": {
|
||||
"vendor_updated": "Ce vendeur a été mis à jours par quelqu'un/quelque chose depuis que vous avez ouvert cette page. Enregistrer écrasera ces changements !"
|
||||
"vendor_updated": "Ce fabricant a été mis à jours par quelqu'un/quelque chose depuis que vous avez ouvert cette page. Enregistrer écrasera ces changements !"
|
||||
},
|
||||
"fields_help": {
|
||||
"empty_spool_weight": "Le poids d'une bobine vide de ce fabricant."
|
||||
}
|
||||
},
|
||||
"yes": "Oui",
|
||||
@@ -263,7 +331,7 @@
|
||||
"table": {
|
||||
"actions": "Actions"
|
||||
},
|
||||
"warnWhenUnsavedChanges": "Êtes-vous sûr de vouloir quitter ? Vous avez des changements non sauvés.",
|
||||
"warnWhenUnsavedChanges": "Êtes-vous sûr de vouloir quitter ? Vous avez des changements non sauvegardés.",
|
||||
"loading": "Chargement",
|
||||
"dashboard": {
|
||||
"title": "Tableau de bord"
|
||||
@@ -273,15 +341,80 @@
|
||||
},
|
||||
"help": {
|
||||
"resources": {
|
||||
"vendor": "Les compagnies qui fabriquent le filament.",
|
||||
"vendor": "Les sociétés qui fabriquent le filament.",
|
||||
"filament": "Marques de filament. Contient les propriétés comme le nom, le matériau, la couleur, le diamètre, etc.",
|
||||
"spool": "Les bobines physique pour un filament spécifique."
|
||||
"spool": "Les bobines physiques pour un filament spécifique."
|
||||
},
|
||||
"description": "<title>Aide</title><p>Voici quelques informations pour commencer.</p><p>Spoolman garde 3 types d'informations différentes :</p><itemsHelp/><p>Pour ajouter une nouvelle bobine dans la base de donnée, commencer par créer un objet <filamentCreateLink>Filament</filamentCreateLink>. Une fois cela fait, créez un objet <spoolCreateLink>bobine</spoolCreateLink> pour cette bobine spécifique. Si vous achetez plus tard des bobines supplémentaire du même filament, créez simplement un objet bobine supplémentaire et réutilisez le même objet Filament.</p><p>En option, vous pouvez créer un <vendorCreateLink>Vendeur</vendorCreateLink> pour la compagnie qui fabrique le filament si vous voulez garder une trace de cette information.</p><p>Vous avez l'option de connecter d'autres service d'impression 3D à Spoolman, comme Moonraker, pour qu'ils puissent suivre automatiquement votre utilisation de filament et mettre automatiquement à jour l'objet Bobine pour vous. Voir le <readmeLink>README Spoolman</readmeLink> pour avoir la marche à suivre pour le mettre en place.</p>",
|
||||
"description": "<title>Aide</title><p>Voici quelques informations pour commencer.</p><p>Spoolman garde 3 types d'informations différentes :</p><itemsHelp/><p>Pour ajouter une nouvelle bobine dans la base de données, commencez par créer un objet <filamentCreateLink>Filament</filamentCreateLink>. Une fois cela fait, créez un objet <spoolCreateLink>bobine</spoolCreateLink> pour cette bobine spécifique. Si vous achetez plus tard des bobines supplémentaires du même filament, créez simplement un objet bobine supplémentaire et réutilisez le même objet Filament.</p><p>En option, vous pouvez créer un <vendorCreateLink>Fabricant</vendorCreateLink> pour la société qui fabrique le filament si vous voulez garder une trace de cette information.</p><p>Vous avez l'option de connecter d'autres service d'impression 3D à Spoolman, comme Moonraker, pour qu'ils puissent suivre automatiquement votre utilisation de filament et mettre automatiquement à jour l'objet Bobine pour vous. Voir le <readmeLink>README Spoolman</readmeLink> pour avoir la marche à suivre pour le mettre en place.</p>",
|
||||
"help": "Aide"
|
||||
},
|
||||
"kofi": "Me donner un pourboire sur Ko-fi",
|
||||
"home": {
|
||||
"home": "Accueil"
|
||||
}
|
||||
"home": "Accueil",
|
||||
"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",
|
||||
"extra_fields": {
|
||||
"params": {
|
||||
"choices": "Choix",
|
||||
"multi_choice": "Choix multiple",
|
||||
"default_value": "Valeur par défaut",
|
||||
"key": "Clé",
|
||||
"name": "Nom",
|
||||
"field_type": "Type",
|
||||
"unit": "Unité",
|
||||
"order": "Ordre"
|
||||
},
|
||||
"field_type": {
|
||||
"text": "Texte",
|
||||
"choice": "Choix",
|
||||
"integer": "Entier",
|
||||
"float_range": "Plage décimal",
|
||||
"datetime": "Date et heure",
|
||||
"boolean": "Booléen",
|
||||
"integer_range": "Plage d'entier",
|
||||
"float": "Décimal"
|
||||
},
|
||||
"tab": "Champs additionnel",
|
||||
"boolean_true": "Oui",
|
||||
"boolean_false": "Non",
|
||||
"non_unique_key_error": "La clé doit être unique.",
|
||||
"delete_confirm_description": "Ceci supprimera le champ ainsi que toutes les données associées pour toutes les entités.",
|
||||
"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 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": {
|
||||
"currency": {
|
||||
"label": "Devise"
|
||||
},
|
||||
"tab": "Général",
|
||||
"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."
|
||||
}
|
||||
}
|
||||
},
|
||||
"locations": {
|
||||
"locations": "Emplacements",
|
||||
"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"
|
||||
}
|
||||
@@ -0,0 +1,399 @@
|
||||
{
|
||||
"actions": {
|
||||
"list": "Suchi",
|
||||
"create": "Banaye",
|
||||
"edit": "Sampadan Karen",
|
||||
"show": "Dikhayen",
|
||||
"clone": "Clone"
|
||||
},
|
||||
"buttons": {
|
||||
"create": "Banaye",
|
||||
"save": "Sahejen",
|
||||
"edit": "Sampadan Karen",
|
||||
"confirm": "Kya aapko pakka hai?",
|
||||
"continue": "Aage badhen",
|
||||
"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."
|
||||
}
|
||||
},
|
||||
@@ -85,16 +113,19 @@
|
||||
},
|
||||
"suffix": " | Spoolman",
|
||||
"home": {
|
||||
"list": ""
|
||||
"list": "Kezdőlap | Spoolman"
|
||||
},
|
||||
"help": {
|
||||
"list": ""
|
||||
"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": ""
|
||||
"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": ""
|
||||
"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,16 +210,18 @@
|
||||
"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": {
|
||||
"name": "Filament neve, hogy megkülönböztesd ezt a filament típust másoktól ugyanattól a gyártótól. Tartalmazhatja például a színét.",
|
||||
"article_number": "Például. EAN, UPC stb.",
|
||||
"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 a konfigurált pénznemben a rendszerben.",
|
||||
"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,14 @@
|
||||
"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"
|
||||
}
|
||||
},
|
||||
"actions": {
|
||||
@@ -224,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": {
|
||||
@@ -236,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."
|
||||
@@ -253,7 +319,9 @@
|
||||
"success": "Sikeres",
|
||||
"editSuccess": "Sikeresen módosítva {{resource}}",
|
||||
"deleteError": "Hiba a(z) {{resource}} törlésekor (hibakód: {{statusCode}})",
|
||||
"createSuccess": "Sikeresen létrehozva {{resource}}"
|
||||
"createSuccess": "Sikeresen létrehozva {{resource}}",
|
||||
"saveSuccessful": "Sikeres mentés!",
|
||||
"validationError": "Validációs hiba:{{error}}"
|
||||
},
|
||||
"no": "Nem",
|
||||
"unknown": "Ismeretlen",
|
||||
@@ -270,17 +338,74 @@
|
||||
"tags": {
|
||||
"clone": "Másolás"
|
||||
},
|
||||
"kofi": "",
|
||||
"kofi": "Tipp a Ko-fi-ra",
|
||||
"home": {
|
||||
"home": ""
|
||||
"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": {
|
||||
"spool": "",
|
||||
"vendor": "",
|
||||
"filament": ""
|
||||
"spool": "Egyedi fizikai tekercs egy adott filamentből.",
|
||||
"vendor": "Azok a cégek, amelyek gyártják a filamentet.",
|
||||
"filament": "Filament márkája. Olyan tulajdonságokkal rendelkeznek, mint a név, az anyag, a szín, az átmérő stb."
|
||||
},
|
||||
"help": "",
|
||||
"description": ""
|
||||
"help": "Segítség",
|
||||
"description": "<title>Segítség</title><p>Íme néhány tipp a kezdéshez.</p><p>A Spoolman 3 különböző adattípust tartalmaz:</p><itemsHelp/><p>Ha új tekercs szeretne hozzáadni az adatbázishoz, kezdje azzal, hogy létrehoz egy <filamentCreateLink>Filament</filamentCreateLink> objektumot. Amikor ezzel megvan, folytassa azzal, hogy létrehoz egy <spoolCreateLink>Tekercs</spoolCreateLink> objektumot az adott tekercs. Ha később további tekercsket szerez ugyanabból a filamentből, egyszerűen generáljon további Tekercs objektumokat, és újra használja ugyanazt a Filament objektumot.</p><p>Opcionálisan létrehozhat egy <vendorCreateLink>Gyártó</vendorCreateLink> objektumot is a filamentet gyártó vállalathoz, ha szeretné követni ezt az információt.</p><p>A Spoolmanhez más 3D-nyomtató szolgáltatásokat is csatlakoztathat, például a Moonrakert, amely automatikusan figyelemmel kíséri a filamenthasználatot, és frissíti az Tekercs objektumokat. Olvassa el a <readmeLink>Spoolman README</readmeLink> fájlt a beállításokkal kapcsolatos útmutatásért.</p>"
|
||||
},
|
||||
"settings": {
|
||||
"settings": "Beállítások",
|
||||
"extra_fields": {
|
||||
"params": {
|
||||
"choices": "Választás",
|
||||
"multi_choice": "Több kiválasztása",
|
||||
"key": "Kulcs",
|
||||
"name": "Név",
|
||||
"field_type": "Típus",
|
||||
"unit": "Egység",
|
||||
"order": "Rendezés",
|
||||
"default_value": "Alapértelmezet érték"
|
||||
},
|
||||
"field_type": {
|
||||
"text": "Szöveg",
|
||||
"integer": "Egész szám",
|
||||
"datetime": "Dátum és idő",
|
||||
"float": "Lebegőpontos szám",
|
||||
"integer_range": "Egész szám tartománya",
|
||||
"float_range": "Lebegőpontos szám tartomány",
|
||||
"choice": "Választás",
|
||||
"boolean": "Logikai"
|
||||
},
|
||||
"key_not_changed": "Kérlek változtasd meg a kulcsot valami másra.",
|
||||
"boolean_false": "Nem",
|
||||
"tab": "Extra mezők",
|
||||
"boolean_true": "Igen",
|
||||
"choices_missing_error": "Nem tudod eltávolítani a választásokat. A következő választások hiányoznak: {{choices}}",
|
||||
"non_unique_key_error": "A kulcsnak egyedinek kell lennie.",
|
||||
"delete_confirm": "Töröli a következő mezőt: {{name}}?",
|
||||
"delete_confirm_description": "Ez a mező törlése és az összes entitáshoz tartozó adat törlése.",
|
||||
"description": "<p>Itt hozzáadhatsz további egyedi mezőket az entitásokhoz.</p><p>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.</p><p>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.</p><p>Az extra mezőket nem lehet rendezni vagy szűrni a táblázatnézetekben.</p>"
|
||||
},
|
||||
"header": "Beállítások",
|
||||
"general": {
|
||||
"currency": {
|
||||
"label": "Pénznem"
|
||||
},
|
||||
"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!"
|
||||
}
|
||||
}
|
||||
@@ -9,14 +9,31 @@
|
||||
"showTemperatures": "Temperature",
|
||||
"showVendor": "Produttore",
|
||||
"showSpoolComment": "Note aggiuntive Bobina",
|
||||
"textSize": "Dimensioni testo del contenuto",
|
||||
"title": "Stampando QR-Codes",
|
||||
"textSize": "Dimensioni testo dell'etichetta",
|
||||
"title": "Stampando etichetta",
|
||||
"showSpoolmanIcon": "Mostra Icona Spoolman",
|
||||
"showLotNr": "Lotto Nr",
|
||||
"bedTemp": "BT: {{temp}}",
|
||||
"lotNr": "Lotto Nr: {{lot}}",
|
||||
"showFilamentComment": "Note Aggiuntive Filamento",
|
||||
"button": "Stampa QR-Codes"
|
||||
"button": "Stampa etichette",
|
||||
"template": "Modello di etichetta",
|
||||
"templateHelp": "Utilizza {} per inserire i valori della bobina nel testo. Ad esempio, {id} verrà sostituito con l'id della bobina, oppure {filament.material} verrà sostituito con il materiale della bobina. Racchiudi il testo con un doppio asterisco ** per renderlo in grassetto. Fai clic sul pulsante per visualizzare un elenco di tutte le etichette disponibili.",
|
||||
"showQRCodeMode": {
|
||||
"no": "No",
|
||||
"simple": "Semplice",
|
||||
"withIcon": "Con icona"
|
||||
},
|
||||
"showQRCode": "Stampa QR Code",
|
||||
"useHTTPUrl": {
|
||||
"label": "Link codice QR",
|
||||
"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.",
|
||||
"options": {
|
||||
"default": "Preimpostato",
|
||||
"url": "URL"
|
||||
},
|
||||
"preview": "Anteprima:"
|
||||
}
|
||||
},
|
||||
"generic": {
|
||||
"printerMarginBottom": "Safe-Zone Inferiore",
|
||||
@@ -48,13 +65,24 @@
|
||||
"showBorder": "Mostra Bordi",
|
||||
"printerMarginLeft": "Safe-Zone Sinistra",
|
||||
"dimensions": "Dimensioni",
|
||||
"print": "Stampa"
|
||||
"print": "Stampa",
|
||||
"settings": "Impostazioni",
|
||||
"defaultSettings": "Predefinito",
|
||||
"addSettings": "Aggiungi nuova impostazione",
|
||||
"newSetting": "Nuovo",
|
||||
"deleteSettings": "Elimina impostazione corrente",
|
||||
"deleteSettingsConfirm": "Sei sicuro di voler eliminare questa impostazione?",
|
||||
"settingsName": "Nome impostazione",
|
||||
"itemCopies": "Copie dell'elemento",
|
||||
"saveAsImage": "Salva come immagine",
|
||||
"duplicateSettings": "Duplica",
|
||||
"saveSetting": "Salva impostazione"
|
||||
},
|
||||
"spoolSelect": {
|
||||
"selectedTotal_one": "{{count}} bobina selezionata",
|
||||
"selectedTotal_many": "{{count}} bobine selezionate",
|
||||
"selectedTotal_other": "{{count}} bobine selezionate",
|
||||
"description": "Seleziona le bobine per le quali stampare i QR-Codes.",
|
||||
"description": "Seleziona le bobine per le quali stampare le etichette.",
|
||||
"showArchived": "Mostra Archiviati",
|
||||
"title": "Seleziona Bobina",
|
||||
"selectAll": "Seleziona/Deseleziona Tutti",
|
||||
@@ -64,9 +92,9 @@
|
||||
"documentTitle": {
|
||||
"vendor": {
|
||||
"create": "Crea Produttore | Spoolman",
|
||||
"clone": "#{{id}} Clona Produttore | Spoolman",
|
||||
"clone": "#{{id}} Duplica Produttore | Spoolman",
|
||||
"edit": "#{{id}} Modifica Produttore | Spoolman",
|
||||
"list": "Produttore | Spoolman",
|
||||
"list": "Produttori | Spoolman",
|
||||
"show": "#{{id}} Mostra Produttore | Spoolman"
|
||||
},
|
||||
"default": "Spoolman",
|
||||
@@ -86,10 +114,13 @@
|
||||
},
|
||||
"suffix": " | Spoolman",
|
||||
"home": {
|
||||
"list": ""
|
||||
"list": "Home | Spoolman"
|
||||
},
|
||||
"help": {
|
||||
"list": ""
|
||||
"list": "Aiuto | Spoolman"
|
||||
},
|
||||
"locations": {
|
||||
"list": "Posizione | Spoolman"
|
||||
}
|
||||
},
|
||||
"spool": {
|
||||
@@ -111,7 +142,11 @@
|
||||
"used_weight": "Peso Utilizzato",
|
||||
"id": "ID",
|
||||
"remaining_weight": "Peso Rimanente",
|
||||
"price": ""
|
||||
"price": "Prezzo",
|
||||
"filament_external": "Esterno",
|
||||
"filament_internal": "Interno",
|
||||
"spool_weight": "Peso a vuoto/tara",
|
||||
"initial_weight": "Peso iniziale"
|
||||
},
|
||||
"titles": {
|
||||
"archive": "Archivia Bobina",
|
||||
@@ -120,7 +155,8 @@
|
||||
"create": "Crea Bobina",
|
||||
"clone": "Clona Bobina",
|
||||
"show_title": "[Bobina #{{id}}] {{name}}",
|
||||
"list": "Bobine"
|
||||
"list": "Bobine",
|
||||
"adjust": "Regola il filamento della bobina"
|
||||
},
|
||||
"fields_help": {
|
||||
"used_weight": "Quanto filamento è stato utilizzato dalla bobina. Una nuova bobina dovrebbe avere 0 gr utilizzati.",
|
||||
@@ -129,15 +165,28 @@
|
||||
"lot_nr": "Numero di lotto del produttore. Può essere utilizzato per garantire che la stampa abbia colori uniformi se vengono utilizzate più bobine.",
|
||||
"remaining_weight": "Quanto filamento è rimasto sulla bobina. Per una nuova bobina questo dovrebbe corrispondere al peso della bobina.",
|
||||
"location": "Dove si trova la bobina se disponi di più posizioni in cui conservare le bobine.",
|
||||
"price": ""
|
||||
"price": "Prezzo di una bobina completa. Se non viene impostato, verrà utilizzato il prezzo del filamento.",
|
||||
"spool_weight": "Il peso della bobina vuota (tara). Lasciare vuoto per usare il valore dal profilo filamento o dal profilo produttore.",
|
||||
"external_filament": "Hai selezionato un filamento da un database esterno. Un profilo filamento (e possibilmente anche un profilo produttore) verrà creato automaticamente quando crei questa bobina. Ciò potrebbe creare un profilo filamento duplicato se hai già creato un profilo per questo filamento.",
|
||||
"initial_weight": "Peso iniziale del filamento sulla bobina (peso netto). Se non impostato, viene utilizzato il peso dal profilo del filamento."
|
||||
},
|
||||
"form": {
|
||||
"new_location_prompt": "Inserisci nuova posizione",
|
||||
"spool_updated": "Ci sono stati degli aggiornamenti per questa bobina da quando è stata aperta questa pagina. Il salvataggio sovrascriverà le modifiche!"
|
||||
"spool_updated": "Ci sono stati degli aggiornamenti per questa bobina da quando è stata aperta questa pagina. Il salvataggio sovrascriverà le modifiche!",
|
||||
"measurement_type": {
|
||||
"length": "Lunghezza",
|
||||
"weight": "Peso"
|
||||
},
|
||||
"adjust_filament_value": "Quantità di consumo",
|
||||
"measurement_type_label": "Tipo di misurazione",
|
||||
"adjust_filament_help": "Qui puoi aggiungere o sottrarre direttamente filamento dalla bobina. Un valore positivo consumerà filamento, un valore negativo lo aggiungerà."
|
||||
},
|
||||
"spool": "Bobine",
|
||||
"messages": {
|
||||
"archive": "Sei sicuro di voler archiviare questa bobina?"
|
||||
},
|
||||
"formats": {
|
||||
"last_used": "Ultimo utilizzo {{date}}"
|
||||
}
|
||||
},
|
||||
"buttons": {
|
||||
@@ -162,16 +211,18 @@
|
||||
"unArchive": "Ripristina",
|
||||
"clone": "Clona",
|
||||
"clear": "Pulisci",
|
||||
"saveAndAdd": "Salva e aggiungi"
|
||||
"saveAndAdd": "Salva e aggiungi",
|
||||
"continue": "Continua"
|
||||
},
|
||||
"filament": {
|
||||
"fields_help": {
|
||||
"name": "Nome del filamento, per distinguere questo tipo di filamento dagli altri dello stesso produttore. Dovrebbe contenere il colore, ad esempio.",
|
||||
"article_number": "Es.: EAN, UPC, etc.",
|
||||
"spool_weight": "Il peso di una bobina vuota. Utilizzato per determinare il peso misurato di una bobina.",
|
||||
"price": "Prezzo di una bobina intera nella valuta configurata dal sistema.",
|
||||
"price": "Prezzo di una bobina piena.",
|
||||
"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.",
|
||||
"material": "Es.: PLA, ABS, PETG, etc."
|
||||
"material": "Es.: PLA, ABS, PETG, etc.",
|
||||
"multi_color_direction": "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."
|
||||
},
|
||||
"fields": {
|
||||
"material": "Materiale",
|
||||
@@ -184,13 +235,18 @@
|
||||
"registered": "Registrato",
|
||||
"name": "Nome",
|
||||
"price": "Prezzo",
|
||||
"settings_bed_temp": "Temperatura Bed",
|
||||
"settings_bed_temp": "Temperatura Piatto",
|
||||
"vendor": "Produttore",
|
||||
"density": "Densità",
|
||||
"id": "ID",
|
||||
"color_hex": "Colore",
|
||||
"article_number": "Numero Articolo",
|
||||
"spools": "Mostra bobine"
|
||||
"spools": "Mostra bobine",
|
||||
"external_id": "ID esterno",
|
||||
"single_color": "Unico",
|
||||
"multi_color": "Multiplo",
|
||||
"coaxial": "Coestruso",
|
||||
"longitudinal": "Longitudinale"
|
||||
},
|
||||
"titles": {
|
||||
"clone": "Clona Filamento",
|
||||
@@ -202,7 +258,12 @@
|
||||
},
|
||||
"filament": "Filamenti",
|
||||
"form": {
|
||||
"filament_updated": "Ci sono stati degli aggiornamenti per questo filamento da quando è stata aperta questa pagina. Il salvataggio sovrascriverà le modifiche!"
|
||||
"filament_updated": "Ci sono stati degli aggiornamenti per questo filamento da quando è stata aperta questa pagina. Il salvataggio sovrascriverà le modifiche!",
|
||||
"import_external": "Importa da Esterno",
|
||||
"import_external_description": "Seleziona un filamento dalla lista per compilare automaticamente i dettagli del modulo creazione filamento. Ciò sovrascriverà qualsiasi informazione hai precedentemente inserito nel modulo. <rb><br> Se necessario, verrà creato automaticamente un profilo Produttore quando clicchi Ok."
|
||||
},
|
||||
"buttons": {
|
||||
"add_spool": "Aggiungi Bobina"
|
||||
}
|
||||
},
|
||||
"actions": {
|
||||
@@ -217,7 +278,7 @@
|
||||
"show_title": "[Produttore #{{id}}] {{name}}",
|
||||
"show": "Mostra Produttori",
|
||||
"edit": "Modifica Produttore",
|
||||
"clone": "Clona Produttore",
|
||||
"clone": "Duplica Produttore",
|
||||
"create": "Crea Produttore",
|
||||
"list": "Produttori"
|
||||
},
|
||||
@@ -225,11 +286,16 @@
|
||||
"registered": "Registrato",
|
||||
"comment": "Note",
|
||||
"name": "Nome",
|
||||
"id": "ID"
|
||||
"id": "ID",
|
||||
"external_id": "ID Esterno",
|
||||
"empty_spool_weight": "Peso a vuoto della bobina/tara"
|
||||
},
|
||||
"vendor": "Produttori",
|
||||
"form": {
|
||||
"vendor_updated": "Ci sono stati degli aggiornamenti per questo produttore da quando è stata aperta questa pagina. Il salvataggio sovrascriverà le modifiche!"
|
||||
"vendor_updated": "Ci sono stati degli aggiornamenti per questo produttore da quando hai aperto questa pagina. Il salvataggio sovrascriverà le modifiche!"
|
||||
},
|
||||
"fields_help": {
|
||||
"empty_spool_weight": "Il peso di una bobina vuota di questo produttore."
|
||||
}
|
||||
},
|
||||
"scanner": {
|
||||
@@ -254,7 +320,9 @@
|
||||
"success": "Riuscito",
|
||||
"editSuccess": "{{resource}} modificata con successo",
|
||||
"deleteError": "Error nella cancellazione di {{resource}} (status code: {{statusCode}})",
|
||||
"createSuccess": "{{resource}} creata correttamente"
|
||||
"createSuccess": "{{resource}} creata correttamente",
|
||||
"saveSuccessful": "Salvataggio completato!",
|
||||
"validationError": "Errore di convalida: {{error}}"
|
||||
},
|
||||
"no": "No",
|
||||
"unknown": "Sconosciuto",
|
||||
@@ -272,16 +340,73 @@
|
||||
"clone": "Clona"
|
||||
},
|
||||
"help": {
|
||||
"description": "",
|
||||
"description": "<title>Aiuto</title><p>Ecco alcuni suggerimenti per iniziare.</p><p>Spoolman può contenere 3 diversi tipi di dati:</p><itemsHelp/><p>Per aggiungere una nuova bobina al database, inizia creando una sezione <filamentCreateLink>filamento</filamentCreateLink>. Fatto ciò, procedi con la creazione di una sezione <spoolCreateLink>bobina</spoolCreateLink> per la questa specifica bobina. Se in seguito si acquisiscono altre bobine dello stesso filamento, sarà sufficiente generare altre sezioni bobina e riutilizzare la stessa sezione filamento.</p><p>Opzionalmente, si può anche creare una sezione <vendorCreateLink>produttore</vendorCreateLink> per l'azienda produttrice del filamento, se si desidera tenere traccia di tali informazioni.</p><p>È possibile collegare a Spoolman altri servizi per stampanti 3D, come Moonraker, che può monitorare l'utilizzo del filamento e aggiornare le sezioni Spool automaticamente. Fare riferimento al <readmeLink>README di Spoolman</readmeLink> per maggiori informazioni sulla configurazione.</p>",
|
||||
"resources": {
|
||||
"spool": "",
|
||||
"filament": "",
|
||||
"vendor": ""
|
||||
"spool": "Bobine fisiche individuali di uno specifico filamento.",
|
||||
"filament": "Marche di filamento. Hanno proprietà come nome, materiale, colore, diametro e altro.",
|
||||
"vendor": "Le aziende che producono il filamento."
|
||||
},
|
||||
"help": ""
|
||||
"help": "Aiuto"
|
||||
},
|
||||
"kofi": "",
|
||||
"kofi": "Donazione su Ko-fi",
|
||||
"home": {
|
||||
"home": ""
|
||||
"home": "Home",
|
||||
"welcome": "Benvenuto nella tua istanza Spoolman!",
|
||||
"description": "Sembra che tu non abbia ancora aggiunto alcuna bobina. Vai su <helpPageLink>Help page</helpPageLink> per ricevere assistenza su come iniziare."
|
||||
},
|
||||
"settings": {
|
||||
"settings": "Configurazione",
|
||||
"extra_fields": {
|
||||
"params": {
|
||||
"order": "Ordine",
|
||||
"default_value": "Valore di Default",
|
||||
"key": "Chiave",
|
||||
"name": "Nome",
|
||||
"field_type": "Tipo",
|
||||
"choices": "Scelte",
|
||||
"multi_choice": "Scelta multipla",
|
||||
"unit": "Unità"
|
||||
},
|
||||
"field_type": {
|
||||
"text": "\"Testo\" per tipo campo extra",
|
||||
"datetime": "Data e ora",
|
||||
"choice": "Scelta",
|
||||
"float": "Decimali",
|
||||
"integer_range": "Intervallo di numeri interi",
|
||||
"float_range": "Intervallo decimali",
|
||||
"boolean": "Booleano",
|
||||
"integer": "\"Intero\" per tipo campo extra, numero intero senza decimali"
|
||||
},
|
||||
"choices_missing_error": "Non è possibile rimuovere le scelte. Mancano i seguenti elementi: {{choices}}",
|
||||
"non_unique_key_error": "La chiave deve essere univoca.",
|
||||
"key_not_changed": "Si prega di utilizzare una chiave diversa.",
|
||||
"boolean_true": "Si",
|
||||
"boolean_false": "No",
|
||||
"delete_confirm": "Cancellare il campo {{name}}?",
|
||||
"delete_confirm_description": "Questo eliminerà il campo e tutti i dati associati di tutte le selezioni.",
|
||||
"tab": "Campi extra",
|
||||
"description": "<p>Qui è possibile aggiungere campi personalizzati.</p><p>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.</p><p>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.</p><p>I campi extra non possono essere ordinati o filtrati nelle viste tabella.</p>"
|
||||
},
|
||||
"header": "Configurazione",
|
||||
"general": {
|
||||
"tab": "Generale",
|
||||
"currency": {
|
||||
"label": "Valuta"
|
||||
},
|
||||
"base_url": {
|
||||
"label": "URL di base",
|
||||
"tooltip": "L'URL di base da utilizzare quando si generano funzioni come i codici QR."
|
||||
},
|
||||
"round_prices": {
|
||||
"label": "Prezzi arrotondati",
|
||||
"tooltip": "Prezzi arrotondati al numero intero più vicino."
|
||||
}
|
||||
}
|
||||
},
|
||||
"locations": {
|
||||
"locations": "Posizioni",
|
||||
"new_location": "Nuova Posizione",
|
||||
"no_location": "Nessuna Posizione",
|
||||
"no_locations_help": "Questa pagina ti consente di organizzare le bobine in base alla posizione. Aggiungi alcune bobine per iniziare!"
|
||||
}
|
||||
}
|
||||
@@ -0,0 +1,398 @@
|
||||
{
|
||||
"notifications": {
|
||||
"undoable": "取り消しまで残り{{seconds}}秒",
|
||||
"editSuccess": "{{resource}}の編集が完了",
|
||||
"success": "完了",
|
||||
"error": "エラー (status code: {{statusCode}})",
|
||||
"createSuccess": "{{resource}}の作成が完了",
|
||||
"deleteSuccess": "{{resource}}の削除が完了",
|
||||
"editError": "{{resource}}の編集中にエラーが発生しました (status code: {{statusCode}})",
|
||||
"importProgress": "インポート中: {{processed}}/{{total}}",
|
||||
"saveSuccessful": "保存完了!",
|
||||
"createError": "{{resource}}を作成中にエラーが発生しました。 (status code: {{statusCode}})",
|
||||
"validationError": "検証エラー: {{error}}",
|
||||
"deleteError": "{{resource}}を削除中にエラーが発生しました (status code: {{statusCode}})"
|
||||
},
|
||||
"actions": {
|
||||
"create": "作成",
|
||||
"edit": "編集",
|
||||
"clone": "複製",
|
||||
"list": "リスト",
|
||||
"show": "表示"
|
||||
},
|
||||
"buttons": {
|
||||
"archive": "アーカイブ",
|
||||
"saveAndAdd": "保存して追加",
|
||||
"create": "作成",
|
||||
"edit": "編集",
|
||||
"cancel": "キャンセル",
|
||||
"confirm": "本当によろしいですか?",
|
||||
"continue": "続ける",
|
||||
"filter": "フィルター",
|
||||
"clear": "クリア",
|
||||
"refresh": "再読込",
|
||||
"show": "表示",
|
||||
"undo": "元に戻す",
|
||||
"hideArchived": "アーカイブを隠す",
|
||||
"showArchived": "アーカイブを表示",
|
||||
"unArchive": "非アーカイブ",
|
||||
"hideColumns": "コラムを隠す",
|
||||
"notAccessTitle": "アクセス権限がありません",
|
||||
"save": "保存",
|
||||
"logout": "ログアウト",
|
||||
"delete": "削除",
|
||||
"clone": "複製",
|
||||
"clearFilters": "フィルタをクリア",
|
||||
"import": "インポート"
|
||||
},
|
||||
"printing": {
|
||||
"generic": {
|
||||
"verticalSpacing": "垂直方向の余白",
|
||||
"printerMarginTop": "上側のセーフゾーン",
|
||||
"deleteSettings": "現在のプリセットを削除",
|
||||
"itemCopies": "複製",
|
||||
"print": "印刷",
|
||||
"paperSize": "用紙サイズ",
|
||||
"customSize": "カスタム",
|
||||
"showBorder": "線を表示",
|
||||
"previewScale": "スケールを表示",
|
||||
"skipItems": "スキップ",
|
||||
"horizontalSpacing": "水平方向の余白",
|
||||
"marginLeft": "左側の余白",
|
||||
"marginBottom": "下側の余白",
|
||||
"printerMarginBottom": "下側のセーフゾーン",
|
||||
"borders": {
|
||||
"none": "なし",
|
||||
"grid": "グリッド",
|
||||
"border": "線"
|
||||
},
|
||||
"settingsName": "プリセット名",
|
||||
"saveSetting": "プリセットを保存",
|
||||
"saveAsImage": "画像として保存",
|
||||
"columns": "列",
|
||||
"marginRight": "右側の余白",
|
||||
"defaultSettings": "デフォルト",
|
||||
"title": "プリント中",
|
||||
"description": "以下の設定を調整して、希望する印刷レイアウトを得てください。プリンターやOSが独自のマージンや拡大縮小を適用する場合があるため、すべてが正確になるまでには試行錯誤が必要かもしれません。実際のラベルに印刷する前に、普通の紙でテストしてください。",
|
||||
"helpMargin": "マージンはラベル用紙とプリンターに合わせて設定する必要があります。これらを変更すると、グリッド全体のサイズに影響します。",
|
||||
"settings": "プリセット",
|
||||
"helpPrinterMargin": "セーフゾーンは、プリンターが用紙の端にどれだけ近づけて印刷できるかの設定です。これらを変更しても、グリッド全体には影響しません。",
|
||||
"dimensions": "寸法",
|
||||
"duplicateSettings": "複製",
|
||||
"contentSettings": "コンテンツ設定",
|
||||
"marginTop": "上側の余白",
|
||||
"printerMarginRight": "右側のセーフゾーン",
|
||||
"layoutSettings": "レイアウト設定",
|
||||
"addSettings": "新しいプリセットを追加",
|
||||
"deleteSettingsConfirm": "本当にこのプリセットを削除しますか?",
|
||||
"newSetting": "新規",
|
||||
"rows": "行",
|
||||
"printerMarginLeft": "左側のセーフゾーン"
|
||||
},
|
||||
"qrcode": {
|
||||
"button": "ラベルを印刷",
|
||||
"title": "ラベル印刷",
|
||||
"template": "ラベルテンプレート",
|
||||
"textSize": "ラベルのテキストサイズ",
|
||||
"useHTTPUrl": {
|
||||
"options": {
|
||||
"default": "デフォルト",
|
||||
"url": "URL"
|
||||
},
|
||||
"preview": "プレビュー:",
|
||||
"label": "QRコードリンク",
|
||||
"tooltip": "Spoolmanのスキャン機能からスキャンした場合にのみ機能する独自リンクを使用します(デフォルト)。URLは設定で指定されたベースURLを使用するか、設定されていない場合は現在のページURLを使用します。"
|
||||
},
|
||||
"showQRCode": "QRコード印刷",
|
||||
"showContent": "ラベル印刷",
|
||||
"templateHelp": "値をテキストとして挿入するには{}を使用します。例えば、{id}はスプールIDに置き換えられ、{filament.material}はスプールの材質に置き換えられます。値が欠けている場合は「?」に置き換えられます。二重の{}を使用して、この置換を削除することができます。{}のセット間のテキストは、値が欠けている場合に削除されます。例えば、{Lot Nr: {lot_nr}}は、スプールにロット番号がある場合にのみラベルを表示します。テキストを太字にするには、二重のアスタリスク**で囲みます。利用可能なすべてのタグのリストを表示するには、ボタンをクリックしてください。",
|
||||
"showQRCodeMode": {
|
||||
"no": "いいえ",
|
||||
"withIcon": "アイコン付き",
|
||||
"simple": "シンプル"
|
||||
}
|
||||
},
|
||||
"spoolSelect": {
|
||||
"description": "スプールのラベル印刷対象を選択してください。",
|
||||
"showArchived": "アーカイブを表示",
|
||||
"selectAll": "すべてを選択 / 選択解除",
|
||||
"title": "スプールを選択",
|
||||
"selectedTotal_other": "{{count}}本のスプールを選択",
|
||||
"noSpoolsSelected": "スプールが選択されていません。"
|
||||
}
|
||||
},
|
||||
"warnWhenUnsavedChanges": "本当に離れますか? 編集が保存されていません。",
|
||||
"kofi": "Ko-fiでチップをください",
|
||||
"unknown": "未知",
|
||||
"version": "バージョン",
|
||||
"loading": "読み込み中",
|
||||
"no": "いいえ",
|
||||
"dashboard": {
|
||||
"title": "ダッシュボード"
|
||||
},
|
||||
"yes": "はい",
|
||||
"tags": {
|
||||
"clone": "複製"
|
||||
},
|
||||
"scanner": {
|
||||
"description": "スプールの詳細を表示するには、SpoolmanのQRコードをスキャンしてください。",
|
||||
"error": {
|
||||
"notReadable": "カメラを読み込むことができません。",
|
||||
"notFound": "カメラが見つかりません。",
|
||||
"unknown": "未知のエラーが発生しました。({{error}})",
|
||||
"insecureContext": "このページはHTTPSで接続されていません。",
|
||||
"streamApiNotSupported": "ブラウザがMediaStream APIに対応していません。",
|
||||
"notAllowed": "カメラへのアクセスが許可されていません。"
|
||||
},
|
||||
"title": "QRコードスキャナ"
|
||||
},
|
||||
"spool": {
|
||||
"fields": {
|
||||
"filament_internal": "内部",
|
||||
"filament_external": "外部",
|
||||
"price": "価格",
|
||||
"remaining_weight": "残りの重さ",
|
||||
"measured_weight": "計測した重さ",
|
||||
"lot_nr": "ロットナンバー",
|
||||
"first_used": "最初の使用",
|
||||
"last_used": "最後の使用",
|
||||
"comment": "コメント",
|
||||
"material": "マテリアル",
|
||||
"weight_to_use": "重さ",
|
||||
"registered": "登録",
|
||||
"archived": "アーカイブ",
|
||||
"used_length": "使用した長さ",
|
||||
"initial_weight": "最初の重さ",
|
||||
"spool_weight": "空の重さ",
|
||||
"location": "場所",
|
||||
"filament": "フィラメント",
|
||||
"used_weight": "使用した重さ",
|
||||
"remaining_length": "残りの長さ",
|
||||
"id": "ID",
|
||||
"filament_name": "フィラメント"
|
||||
},
|
||||
"fields_help": {
|
||||
"price": "スプール全体の価格。設定されていない場合は、フィラメントの価格が代わりに使用されます。",
|
||||
"measured_weight": "フィラメントとスプールの重量。",
|
||||
"location": "スプールを複数の場所に保管している場合、そのスプールの保管場所。",
|
||||
"used_weight": "スプールからどれだけのフィラメントが使用されたか。新しいスプールは0gとなるはずです。",
|
||||
"weight_to_use": "入力する重さを選択してください。測定重量は、選択したフィラメントにスプール重量が設定されている場合のみ利用可能です。",
|
||||
"remaining_weight": "スプールに残っているフィラメントの量。新しいスプールの場合、これはスプールの重量と一致するはずです。",
|
||||
"initial_weight": "スプール上のフィラメントの初期重量(正味重量)。設定されていない場合は、フィラメントオブジェクトからの重量が使用されます。",
|
||||
"lot_nr": "メーカーのロット番号。複数のスプールを使用する場合、印刷の色が一定であることを確認するために使用できます。",
|
||||
"external_filament": "外部データベースからフィラメントを選択しました。このスプールを作成する際に、フィラメントオブジェクト(場合によってはメーカーオブジェクトも)が自動的に作成されます。すでにこのフィラメントのフィラメントオブジェクトを作成している場合、重複したフィラメントオブジェクトが作成される可能性があります。",
|
||||
"spool_weight": "空の時のスプールの重量。フィラメントまたはメーカーの値を使用する場合は空のままにしてください。"
|
||||
},
|
||||
"titles": {
|
||||
"create": "スプールを作成",
|
||||
"clone": "スプールを複製",
|
||||
"show_title": "[スプール #{{id}}] {{name}}",
|
||||
"adjust": "スプールフィラメントの調整",
|
||||
"edit": "スプールを編集",
|
||||
"archive": "アーカイブしたスプール",
|
||||
"list": "スプール",
|
||||
"show": "スプールを表示"
|
||||
},
|
||||
"form": {
|
||||
"measurement_type_label": "計測タイプ",
|
||||
"new_location_prompt": "新しい場所を入力",
|
||||
"measurement_type": {
|
||||
"length": "長さ",
|
||||
"weight": "重さ"
|
||||
},
|
||||
"adjust_filament_help": "ここではスプールに直接フィラメントを追加したり差し引いたりすることができます。正の値はフィラメントを消費し、負の値はフィラメントを追加します。",
|
||||
"spool_updated": "このスプールは、このページを開いてから他の誰か/何かによって更新されています。保存すると、それらの変更が上書きされます!",
|
||||
"adjust_filament_value": "消費量"
|
||||
},
|
||||
"messages": {
|
||||
"archive": "本当にこのスプールをアーカイブしますか?"
|
||||
},
|
||||
"formats": {
|
||||
"last_used": "最終使用日: {{date}}"
|
||||
},
|
||||
"spool": "スプール"
|
||||
},
|
||||
"filament": {
|
||||
"fields": {
|
||||
"id": "ID",
|
||||
"name": "名称",
|
||||
"material": "マテリアル",
|
||||
"price": "価格",
|
||||
"density": "密度",
|
||||
"spool_weight": "スプールの重さ",
|
||||
"registered": "登録",
|
||||
"comment": "コメント",
|
||||
"color_hex": "色",
|
||||
"single_color": "単色",
|
||||
"multi_color": "複数色",
|
||||
"longitudinal": "縦方向",
|
||||
"article_number": "製品番号",
|
||||
"coaxial": "断面",
|
||||
"external_id": "外部ID",
|
||||
"vendor": "製造者",
|
||||
"diameter": "直径",
|
||||
"settings_extruder_temp": "エクストルーダー温度",
|
||||
"settings_bed_temp": "ベッド温度",
|
||||
"weight": "重さ",
|
||||
"vendor_name": "製造者",
|
||||
"spools": "スプールを表示"
|
||||
},
|
||||
"filament": "フィラメント",
|
||||
"fields_help": {
|
||||
"name": "フィラメント名: 同じメーカーの他のフィラメントと区別するための名称です。例えば色を含めると良いでしょう。",
|
||||
"article_number": "例: EAN, UPC, etc.",
|
||||
"spool_weight": "空のスプールの重量。スプールの測定重量を決定するために使用されます。",
|
||||
"material": "例: PLA, ABS, PETG, etc.",
|
||||
"multi_color_direction": "フィラメントは2つの方法で複数の色を持つことができます。断面: 押出し時に円の断面に複数色を持つ二色フィラメントのような形態です。縦方向: 長手方向の色変化によるもので、スプールに沿って色が変化するグラデーションフィラメントのような形態です。",
|
||||
"price": "スプール全体の価格。",
|
||||
"weight": "フィラメントの正味重量(フルスプール時)。スプール自体の重量は含まず、フィラメントのみの重量です。通常、パッケージに記載されている重量です。"
|
||||
},
|
||||
"titles": {
|
||||
"create": "フィラメントを作成",
|
||||
"clone": "フィラメントを複製",
|
||||
"list": "フィラメント",
|
||||
"edit": "フィラメントを編集",
|
||||
"show_title": "[フィラメント #{{id}}] {{name}}",
|
||||
"show": "フィラメントを表示"
|
||||
},
|
||||
"form": {
|
||||
"filament_updated": "このフィラメントは、このページを開いてから他の誰か/何かによって更新されています。保存すると、それらの変更が上書きされます!",
|
||||
"import_external": "外部からインポート",
|
||||
"import_external_description": "リストからフィラメントを選択すると、フィラメント作成フォームに詳細情報が自動的に入力されます。これにより、フォームに入力したデータは上書きされます。<br><br>「OK」をクリックすると、メーカーオブジェクトが自動的に作成されます。"
|
||||
},
|
||||
"buttons": {
|
||||
"add_spool": "スプールを追加"
|
||||
}
|
||||
},
|
||||
"vendor": {
|
||||
"fields": {
|
||||
"id": "ID",
|
||||
"registered": "登録",
|
||||
"external_id": "外部ID",
|
||||
"name": "名称",
|
||||
"empty_spool_weight": "空スプールの重さ",
|
||||
"comment": "コメント"
|
||||
},
|
||||
"fields_help": {
|
||||
"empty_spool_weight": "この製造者の空スプールの重量。"
|
||||
},
|
||||
"titles": {
|
||||
"create": "製造者を作成",
|
||||
"list": "製造者",
|
||||
"show": "製造者を表示",
|
||||
"clone": "製造者を複製",
|
||||
"edit": "製造者を編集",
|
||||
"show_title": "[製造者 #{{id}}] {{name}}"
|
||||
},
|
||||
"form": {
|
||||
"vendor_updated": "この製造者は、このページを開いてから他の誰か/何かによって更新されています。保存すると、それらの変更が上書きされます!"
|
||||
},
|
||||
"vendor": "製造者"
|
||||
},
|
||||
"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": "追加項目",
|
||||
"params": {
|
||||
"unit": "単位",
|
||||
"order": "数量",
|
||||
"default_value": "デフォルト値",
|
||||
"choices": "選択肢",
|
||||
"multi_choice": "複数選択",
|
||||
"name": "名称",
|
||||
"key": "キー",
|
||||
"field_type": "タイプ"
|
||||
},
|
||||
"field_type": {
|
||||
"float": "小数点型",
|
||||
"float_range": "小数点型の範囲",
|
||||
"datetime": "日時",
|
||||
"boolean": "真偽値",
|
||||
"choice": "選択肢",
|
||||
"integer_range": "数値範囲",
|
||||
"text": "テキスト",
|
||||
"integer": "整数"
|
||||
},
|
||||
"boolean_true": "はい",
|
||||
"key_not_changed": "別のキーに変更してください。",
|
||||
"boolean_false": "いいえ",
|
||||
"delete_confirm": "{{name}}のフィールドを削除しますか?",
|
||||
"delete_confirm_description": "フィールドとすべてのエンティティの関連データがすべて削除されます。",
|
||||
"description": "<p>ここで追加のカスタムフィールドを追加できます。</p><p>フィールドを追加すると、そのキーやタイプを変更することはできません。また、選択肢タイプのフィールドでは、選択肢の削除や複数選択の状態を変更することはできません。フィールドを削除すると、すべてのエンティティの関連データが削除されます。</p><p>キーは他のプログラムがデータを読み書きする際に使用するものなので、カスタムフィールドがサードパーティのプログラムと連携する予定がある場合は、正しく設定してください。デフォルト値は新しいアイテムにのみ適用されます。</p><p>追加フィールドはテーブルビューで並べ替えやフィルタリングすることはできません。</p>",
|
||||
"choices_missing_error": "選択肢を削除できません。下記の選択肢がありません: {{choices}}",
|
||||
"non_unique_key_error": "キーは一意の値である必要があります。"
|
||||
}
|
||||
},
|
||||
"documentTitle": {
|
||||
"home": {
|
||||
"list": "ホーム | Spoolman"
|
||||
},
|
||||
"help": {
|
||||
"list": "ヘルプ | Spoolman"
|
||||
},
|
||||
"default": "Spoolman",
|
||||
"suffix": " | Spoolman",
|
||||
"filament": {
|
||||
"edit": "フィラメントの編集 #{{id}} | Spoolman",
|
||||
"clone": "フィラメントの複製 #{{id}} | Spoolman",
|
||||
"show": "フィラメント #{{id}} | Spoolman",
|
||||
"create": "フィラメントの作成 | Spoolman",
|
||||
"list": "フィラメント | Spoolman"
|
||||
},
|
||||
"spool": {
|
||||
"list": "スプール | Spoolman",
|
||||
"show": "スプール #{{id}} | Spoolman",
|
||||
"create": "スプールの作成 | Spoolman",
|
||||
"edit": "スプールの編集 #{{id}} | Spoolman",
|
||||
"clone": "スプールの複製 #{{id}} | Spoolman"
|
||||
},
|
||||
"vendor": {
|
||||
"edit": "製造者の編集 #{{id}} | Spoolman",
|
||||
"clone": "製造者の複製 #{{id}} | Spoolman",
|
||||
"show": "製造者 #{{id}} | Spoolman",
|
||||
"create": "製造者の作成 | Spoolman",
|
||||
"list": "製造者 | Spoolman"
|
||||
},
|
||||
"locations": {
|
||||
"list": "場所 | Spoolman"
|
||||
}
|
||||
},
|
||||
"locations": {
|
||||
"locations": "場所",
|
||||
"new_location": "新しい場所",
|
||||
"no_location": "場所なし",
|
||||
"no_locations_help": "このページでは、スプールを場所ごとに整理することができます!"
|
||||
},
|
||||
"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": "다크"
|
||||
}
|
||||
}
|
||||
@@ -0,0 +1,406 @@
|
||||
{
|
||||
"actions": {
|
||||
"list": "Sąrašas",
|
||||
"create": "Sukurti",
|
||||
"edit": "Redaguoti",
|
||||
"show": "Rodyti",
|
||||
"clone": "Klonuoti"
|
||||
},
|
||||
"buttons": {
|
||||
"create": "Sukurti",
|
||||
"save": "Išsaugoti",
|
||||
"saveAndAdd": "Išsaugoti ir pridėti",
|
||||
"logout": "Atsijungti",
|
||||
"delete": "Šalinti",
|
||||
"edit": "Redaguoti",
|
||||
"cancel": "Atšaukti",
|
||||
"confirm": "Ar tikrai?",
|
||||
"continue": "Tęsti",
|
||||
"filter": "Filtras",
|
||||
"clear": "Išvalyti",
|
||||
"refresh": "Atnaujinti",
|
||||
"show": "Rodyti",
|
||||
"undo": "Gražinti",
|
||||
"import": "Importuoti",
|
||||
"clone": "Klonuoti",
|
||||
"archive": "Archyvas",
|
||||
"unArchive": "Išarchyvuoti",
|
||||
"hideArchived": "Paslėpti archyvuotus",
|
||||
"showArchived": "Rodyti archyvuotus",
|
||||
"notAccessTitle": "Nepakanka teisių",
|
||||
"hideColumns": "Slėpti stulpelius",
|
||||
"clearFilters": "Valyti filtrus"
|
||||
},
|
||||
"warnWhenUnsavedChanges": "Ar tikrai norite išeiti? Yra neišsaugotų pakeitimų.",
|
||||
"notifications": {
|
||||
"success": "Sėkmingai",
|
||||
"error": "Klaida (kodas: {{statusCode}})",
|
||||
"undoable": "Jūs turite {{seconds}} sekundes, kad atšauktumėte.",
|
||||
"createSuccess": "Sėkmingai sukurta {{resource}}",
|
||||
"createError": "Kūrimo klaida {{resource}} (kodas: {{statusCode}})",
|
||||
"deleteSuccess": "Sėkmingai ištrinta {{resource}}",
|
||||
"deleteError": "Tkaida trinant {{resource}} (kodas: {{statusCode}})",
|
||||
"editSuccess": "Sėkmingai redaguota {{resource}}",
|
||||
"editError": "Redagavimo klaida {{resource}} (kodas: {{statusCode}})",
|
||||
"importProgress": "Importuojama: {{processed}}/{{total}}",
|
||||
"saveSuccessful": "Įrašytaa sėkmingai!",
|
||||
"validationError": "Tikrinimo klaida: {{error}}"
|
||||
},
|
||||
"kofi": "Paremk mane Ko-fi",
|
||||
"loading": "Kraunasi",
|
||||
"version": "Versija",
|
||||
"unknown": "Nežinoma",
|
||||
"yes": "Taip",
|
||||
"no": "Ne",
|
||||
"tags": {
|
||||
"clone": "Klonuoti"
|
||||
},
|
||||
"dashboard": {
|
||||
"title": "Darbastalis"
|
||||
},
|
||||
"printing": {
|
||||
"generic": {
|
||||
"title": "Spausdinama",
|
||||
"description": "Norėdami gauti norimą spausdinimo maketą, pakoreguokite toliau pateiktus nustatymus. Atminkite, kad spausdintuvai ir jūsų operacinė sistema gali taikyti savo paraštes ir mastelį, todėl gali tekti atlikti bandymus ir klaidas, kol viskas bus teisinga. Prieš spausdindami ant etikečių, išbandykite ant įprasto popieriaus lapo.",
|
||||
"helpMargin": "Paraštės turėtų būti sukonfigūruotos taip, kad atitiktų jūsų etikečių popierių ir spausdintuvą, nes jų keitimas turės įtakos viso tinklelio dydžiui.",
|
||||
"helpPrinterMargin": "Saugios zonos nustatymas turėtų atitikti spausdinimo atstumą nuo popieriaus krašto. Šios zonos keitimas neturės įtakos visam tinkleliui.",
|
||||
"print": "Spausdinti",
|
||||
"columns": "Stulpeliai",
|
||||
"rows": "Eilutės",
|
||||
"paperSize": "Popieriaus dydis",
|
||||
"customSize": "Tinkintas",
|
||||
"dimensions": "Matmenys",
|
||||
"showBorder": "Rodyti paraštes",
|
||||
"previewScale": "Peržiūros mastelis",
|
||||
"skipItems": "Praleisti elementus",
|
||||
"itemCopies": "Elemento kopijos",
|
||||
"contentSettings": "Turinio nustatymai",
|
||||
"layoutSettings": "Išdėstymo nustatymai",
|
||||
"horizontalSpacing": "Horizontalūs tarpai",
|
||||
"verticalSpacing": "Vertikalūs tarpai",
|
||||
"marginLeft": "Kairioji paraštė",
|
||||
"marginRight": "Dešinioji paraštė",
|
||||
"marginTop": "Viršutinė paraštė",
|
||||
"marginBottom": "Apatinė paraštė",
|
||||
"printerMarginLeft": "Saugi zona kairėje",
|
||||
"printerMarginRight": "Saugi zona dešinėje",
|
||||
"printerMarginTop": "Saugi zona viršuje",
|
||||
"printerMarginBottom": "Saugi zona apačioje",
|
||||
"borders": {
|
||||
"none": "Nėra",
|
||||
"border": "Paraštė",
|
||||
"grid": "Tinklelis"
|
||||
},
|
||||
"settings": "Išankstiniai nustatymai",
|
||||
"defaultSettings": "Numatytasis",
|
||||
"addSettings": "Pridėti naują išankstinį nustatymą",
|
||||
"newSetting": "Naujas",
|
||||
"duplicateSettings": "Kopija",
|
||||
"deleteSettings": "Ištrinti dabartinį išankstinį nustatymą",
|
||||
"deleteSettingsConfirm": "Ar tikrai norite ištrinti šį išankstinį nustatymą?",
|
||||
"settingsName": "Iš anksto nustatytas pavadinimas",
|
||||
"saveSetting": "Išsaugoti išankstinius nustatymus",
|
||||
"saveAsImage": "Įrašyti kaip paveikslėlį"
|
||||
},
|
||||
"qrcode": {
|
||||
"button": "Spausdinti etiketes",
|
||||
"title": "Etikečių spausdinimas",
|
||||
"template": "Etiketės šablonas",
|
||||
"templateHelp": "Norėdami įterpti ritės objekto reikšmes kaip tekstą, naudokite {}. Pavyzdžiui, {id} bus pakeistas ritės ID arba {filament.material} bus pakeistas ritės medžiaga. Jei reikšmės trūksta, ji bus pakeista simboliu „?“. Norėdami tai pašalinti, galima naudoti antrą {} rinkinį. Be to, bet koks tekstas tarp {} rinkinių bus pašalintas, jei reikšmės trūksta. Pavyzdžiui, {Lot Nr: {lot_nr}} rodys žymą tik tuo atveju, jei ritė turi partijos numerį. Apsukite tekstą dviguba žvaigždute **, kad jis būtų paryškintas. Spustelėkite mygtuką, kad peržiūrėtumėte visų galimų žymų sąrašą.",
|
||||
"textSize": "Etiketės teksto dydis",
|
||||
"showContent": "Spausdinti etiketę",
|
||||
"useHTTPUrl": {
|
||||
"label": "QR kodo nuoroda",
|
||||
"tooltip": "Bus naudojama patentuota nuoroda, kuri veiks tik nuskaityta naudojant „Spoolman“ nuskaitymo funkciją (numatytasis nustatymas). URL naudoja arba nustatymuose nurodytą bazinį URL, arba dabartinio puslapio URL, jei nenustatytas.",
|
||||
"options": {
|
||||
"default": "Numatytasis",
|
||||
"url": "URL"
|
||||
},
|
||||
"preview": "Peržiūra:"
|
||||
},
|
||||
"showQRCode": "Spausdinti QR kodą",
|
||||
"showQRCodeMode": {
|
||||
"no": "Ne",
|
||||
"simple": "Paprasta",
|
||||
"withIcon": "Su piktograma"
|
||||
}
|
||||
},
|
||||
"spoolSelect": {
|
||||
"title": "Pasirinkite ritę",
|
||||
"description": "Pasirinkite rites, kurioms norite spausdinti etiketes.",
|
||||
"showArchived": "Rodyti archyvuotus",
|
||||
"noSpoolsSelected": "Nepasirinkote jokių ričių.",
|
||||
"selectAll": "Pasirinkti/Atšaukti visų pasirinkimą",
|
||||
"selectedTotal_one": "{{count}} ritė pasirinkta",
|
||||
"selectedTotal_few": "{{count}} ritės pasirinktos",
|
||||
"selectedTotal_other": "{{count}} ričių pasirinkta"
|
||||
}
|
||||
},
|
||||
"scanner": {
|
||||
"title": "QR kodo skaitytuvas",
|
||||
"description": "Nuskaitykite Spoolman QR kodą, kad peržiūrėtumėte išsamią informaciją apie ritę.",
|
||||
"error": {
|
||||
"notAllowed": "Jūs nesuteikėte leidimo pasiekti kameros.",
|
||||
"insecureContext": "Puslapis neperduodamas per HTTPS.",
|
||||
"streamApiNotSupported": "Naršyklė nepalaiko „MediaStream“ API.",
|
||||
"notReadable": "Kameros rodmenys neįskaitomi.",
|
||||
"notFound": "Nerasta jokios kameros.",
|
||||
"unknown": "Įvyko nežinoma klaida. ({{error}})"
|
||||
}
|
||||
},
|
||||
"spool": {
|
||||
"spool": "Ritės",
|
||||
"fields": {
|
||||
"id": "ID",
|
||||
"filament_name": "Gija",
|
||||
"filament": "Gija",
|
||||
"filament_internal": "Vidinis",
|
||||
"filament_external": "Išorinis",
|
||||
"price": "Kaina",
|
||||
"material": "Medžiaga",
|
||||
"weight_to_use": "Svoris",
|
||||
"used_weight": "Naudotas svoris",
|
||||
"remaining_weight": "Likęs svoris",
|
||||
"measured_weight": "Išmatuotas svoris",
|
||||
"used_length": "Panaudotas ilgis",
|
||||
"remaining_length": "Likęs ilgis",
|
||||
"initial_weight": "Pradinis svoris",
|
||||
"spool_weight": "Tuščas svoris",
|
||||
"location": "Vieta",
|
||||
"lot_nr": "Lot Nr",
|
||||
"first_used": "Pirmą kartą panaudota",
|
||||
"last_used": "Paskutinį kartą panaudota",
|
||||
"registered": "Registruota",
|
||||
"comment": "Komentaras",
|
||||
"archived": "Archyvuota"
|
||||
},
|
||||
"fields_help": {
|
||||
"price": "Pilnos ritės kaina. Jei nenustatyta, bus laikoma, kad kaina yra pačios gijos kaina.",
|
||||
"weight_to_use": "Pasirinkite, kokią svorio vertę įvesti. Išmatuotas svoris galimas tik tuo atveju, jei pasirinktai kaitinimo medžiagai nustatytas ritės svoris.",
|
||||
"used_weight": "Kiek plastiko buvo sunaudota iš ritės. Naujoje ritėje turėtų būti sunaudota 0 g.",
|
||||
"remaining_weight": "Kiek gijos liko ant ritės. Naujos ritės svoris turėtų atitikti ritės svorį.",
|
||||
"measured_weight": "Kiek sveria gija ir ritė.",
|
||||
"initial_weight": "Pradinis gijos svoris ant ritės (grynasis svoris). Jei nenustatytas, bus naudojamas gijos objekto svoris.",
|
||||
"spool_weight": "Tuščios ritės svoris. Palikite tuščią, jei norite naudoti vertę, nurodytą ant gijos arba gamintojo.",
|
||||
"location": "Kur yra ritė, jei rites laikote keliose vietose.",
|
||||
"lot_nr": "Gamintojo partijos numeris. Gali būti naudojamas siekiant užtikrinti, kad spaudinio spalva būtų vienoda, jei naudojamos kelios ritės.",
|
||||
"external_filament": "Pasirinkote gijąiš išorinės duomenų bazės. Kuriant šią ritę, bus automatiškai sukurtas gijos objektas (ir galbūt gamintojo objektas). Tai gali sukurti pasikartojančius gijų objektus, jei jau sukūrėte šios gijos objektą."
|
||||
},
|
||||
"titles": {
|
||||
"create": "Sukurti ritę",
|
||||
"clone": "Klonuoti ritę",
|
||||
"edit": "Redaguoti ritę",
|
||||
"list": "Ritės",
|
||||
"show": "Rodyti ritę",
|
||||
"show_title": "[Ritė #{{id}}] {{name}}",
|
||||
"archive": "Archyvuoti ritę",
|
||||
"adjust": "Reguliuoti ritės giją"
|
||||
},
|
||||
"form": {
|
||||
"measurement_type": {
|
||||
"length": "Ilgis",
|
||||
"weight": "Svoris"
|
||||
},
|
||||
"measurement_type_label": "Matavimo tipas",
|
||||
"adjust_filament_help": "Čia galite tiesiogiai pridėti arba atimti giją iš ritės. Teigiama vertė sunaudos giją, neigiama – jį pridės.",
|
||||
"adjust_filament_value": "Suvartoti kiekį",
|
||||
"new_location_prompt": "Įveskite naują vietą",
|
||||
"spool_updated": "Šią ritę kažkas kitas atnaujino nuo tada, kai atidarėte šį puslapį. Išsaugojus šie pakeitimai bus perrašyti!"
|
||||
},
|
||||
"messages": {
|
||||
"archive": "Ar tikrai norite archyvuoti šią ritę?"
|
||||
},
|
||||
"formats": {
|
||||
"last_used": "Paskutinį kartą naudota {{date}}"
|
||||
}
|
||||
},
|
||||
"filament": {
|
||||
"filament": "Gijos",
|
||||
"fields": {
|
||||
"id": "ID",
|
||||
"vendor_name": "Gamintojas",
|
||||
"vendor": "Gamintojas",
|
||||
"name": "Pavadinimas",
|
||||
"material": "Medžiaga",
|
||||
"price": "Kaina",
|
||||
"density": "Tankis",
|
||||
"diameter": "Skersmuo",
|
||||
"weight": "Svoris",
|
||||
"spool_weight": "Ritės svoris",
|
||||
"article_number": "Gaminio numeris",
|
||||
"registered": "Registruota",
|
||||
"comment": "Komentaras",
|
||||
"settings_extruder_temp": "Ekstruderio temperatūra",
|
||||
"settings_bed_temp": "Pado temperatūra",
|
||||
"color_hex": "Spalva",
|
||||
"single_color": "Viena",
|
||||
"multi_color": "Daugiaspalvis",
|
||||
"coaxial": "Koekstruduotas",
|
||||
"longitudinal": "Išilginis",
|
||||
"external_id": "Išorinis ID",
|
||||
"spools": "Rodyti rites"
|
||||
},
|
||||
"fields_help": {
|
||||
"name": "Gijos pavadinimas, kad būtų galima atskirti šį gijos tipą nuo kitų to paties gamintojo gijų. Pavyzdžiui, turėtų būti nurodyta spalva.",
|
||||
"material": "Pvz. PLA, ABS, PETG, ir tt.",
|
||||
"price": "Pilnos ritės kaina.",
|
||||
"weight": "Pilnos ritės gijos svoris (grynasis svoris). Į šį skaičių neturėtų būti įtrauktas pačios ritės svoris, tik gijos svoris. Tai paprastai nurodoma ant pakuotės.",
|
||||
"spool_weight": "Tuščios ritės svoris. Naudojamas išmatuotam ritės svoriui nustatyti.",
|
||||
"article_number": "Pvz. EAN, UPC, ir tt.",
|
||||
"multi_color_direction": "Gijos turėti kelias spalvas dviem būdais: arba dėl koekstruzijos, kaip dviejų spalvų gijos su nuosekliomis daugiaspalvėmis spalvomis, arba dėl išilginių spalvų pokyčių, kaip gradientinės gijos, kurios keičia spalvas išilgai ritės."
|
||||
},
|
||||
"titles": {
|
||||
"create": "Kirti giją",
|
||||
"clone": "Klonuoti giją",
|
||||
"edit": "Redaguoti giją",
|
||||
"list": "Gijos",
|
||||
"show": "Rodyti gijas",
|
||||
"show_title": "[Gija #{{id}}] {{name}}"
|
||||
},
|
||||
"form": {
|
||||
"filament_updated": "Šią giją kažkas kitas atnaujino nuo tada, kai atidarėte šį puslapį. Išsaugojus šie pakeitimai bus perrašyti!",
|
||||
"import_external": "Importuoti iš išorės",
|
||||
"import_external_description": "Pasirinkite giją sąraše, kad jos informacija būtų automatiškai užpildyta gijos kūrimo formoje. Tai perrašys visus formoje įvestus duomenis.<br><br>Jei reikia, gamintojo objektas bus sukurtas automatiškai, kai spustelėsite „Gerai“."
|
||||
},
|
||||
"buttons": {
|
||||
"add_spool": "Pridėti ritę"
|
||||
}
|
||||
},
|
||||
"vendor": {
|
||||
"vendor": "Gamintojai",
|
||||
"fields": {
|
||||
"id": "ID",
|
||||
"name": "Pavadinimas",
|
||||
"empty_spool_weight": "Tuščios ritės svoris",
|
||||
"external_id": "Išorinis ID",
|
||||
"registered": "Registruota",
|
||||
"comment": "Komentaras"
|
||||
},
|
||||
"fields_help": {
|
||||
"empty_spool_weight": "Tuščios šio gamintojo ritės svoris."
|
||||
},
|
||||
"titles": {
|
||||
"create": "Sukurti gamintoją",
|
||||
"clone": "Klonuoti gamintoją",
|
||||
"edit": "Redaguoti gamintoją",
|
||||
"list": "Gamintojai",
|
||||
"show": "Rodyti gamintojus",
|
||||
"show_title": "[Gamintojas #{{id}}] {{name}}"
|
||||
},
|
||||
"form": {
|
||||
"vendor_updated": "Šio gamintojo duomenis atnaujino kažkas kitas nuo tada, kai atidarėte šį puslapį. Išsaugojus šiuos pakeitimus bus perrašyti!"
|
||||
}
|
||||
},
|
||||
"home": {
|
||||
"home": "Pradžia",
|
||||
"welcome": "Sveiki atvykę į savo Spoolman!",
|
||||
"description": "Panašu, kad dar nepridėjote jokių ričių. Norėdami gauti pagalbos, kaip pradėti, žr. <helpPageLink>pagalbos puslapį</helpPageLink>."
|
||||
},
|
||||
"help": {
|
||||
"help": "Pagalba",
|
||||
"resources": {
|
||||
"filament": "Gijų prekės ženklai. Jie turi tokias savybes kaip pavadinimas, medžiaga, spalva, skersmuo ir kita.",
|
||||
"spool": "Atskiros fizinės konkrečios gijos ritės.",
|
||||
"vendor": "Įmonės, gaminančios giją."
|
||||
},
|
||||
"description": "<title>Pagalba</title><p>Štai keli patarimai, padėsiantys jums pradėti.</p><p>Spoolman saugo 3 skirtingų tipų duomenis:</p><itemsHelp/><p>Norėdami į duomenų bazę įtraukti naują ritę, pirmiausia sukurkite objektą <filamentCreateLink>Filament</filamentCreateLink>. Tai padarę, sukurkite objektą <spoolCreateLink>Ritė</spoolCreateLink> tai konkrečiai ritei. Jei vėliau įsigysite papildomų to paties siūlo ričių, tiesiog sugeneruokite papildomus „Ritės“ objektus ir pakartotinai naudokite tą patį „Gija“ objektą.</p><p>Pasirinktinai taip pat galite sugeneruoti objektą <vendorCreateLink>Gamintojo</vendorCreateLink> įmonei, gaminančiai giją, jei norite sekti šią informaciją.</p><p>Galite susieti su Spoolman kitas 3D spausdinimo paslaugas, pvz., „Moonraker“, kuri gali automatiškai stebėti siūlo naudojimą ir atnaujinti „Ritė“ objektus. Kaip tai nustatyti, žr. <readmeLink>„Spoolman README“</readmeLink>.</p>"
|
||||
},
|
||||
"table": {
|
||||
"actions": "Veiksmai"
|
||||
},
|
||||
"settings": {
|
||||
"settings": "Nustatymai",
|
||||
"header": "Nustatymai",
|
||||
"general": {
|
||||
"tab": "Pagrindiniai",
|
||||
"currency": {
|
||||
"label": "Valiuta"
|
||||
},
|
||||
"base_url": {
|
||||
"label": "Bazinis URL",
|
||||
"tooltip": "Bazinis URL, naudojamas generuojant tokias funkcijas kaip QR kodai."
|
||||
},
|
||||
"round_prices": {
|
||||
"label": "Apvalinti kainas",
|
||||
"tooltip": "Apvalinkite kainas iki artimiausio sveikojo skaičiaus."
|
||||
}
|
||||
},
|
||||
"extra_fields": {
|
||||
"tab": "Papildomi laukai",
|
||||
"description": "<p>Čia galite pridėti papildomų pasirinktinių laukų prie savo objektų.</p><p>Pridėjus lauką, negalite keisti jo rakto ar tipo, o pasirinkimų tipo laukų negalite pašalinti pasirinkimų ar pakeisti kelių pasirinkimų būsenos. Jei pašalinsite lauką, bus ištrinti su visais objektais susiję duomenys.</p><p>Raktas yra tai, kaip kitos programos skaito / rašo duomenis, todėl jei jūsų pasirinktinis laukas turėtų būti integruotas su trečiosios šalies programa, įsitikinkite, kad jis nustatytas teisingai. Numatytoji reikšmė taikoma tik naujiems elementams.</p><p>Papildomų laukų negalima rūšiuoti ar filtruoti lentelės rodiniuose.</p>",
|
||||
"params": {
|
||||
"key": "Raktas",
|
||||
"name": "Pavadinimas",
|
||||
"field_type": "Tipas",
|
||||
"unit": "Vienetas",
|
||||
"order": "Tvarka",
|
||||
"default_value": "Numatytoji reikšmė",
|
||||
"choices": "Pasirinkimai",
|
||||
"multi_choice": "Keli pasirinkimai"
|
||||
},
|
||||
"field_type": {
|
||||
"text": "Tekstas",
|
||||
"integer": "Skaičius",
|
||||
"integer_range": "Sveiki skaičiai",
|
||||
"float": "Realus skaičius",
|
||||
"float_range": "Realūs skaičiai",
|
||||
"datetime": "Data Laikas",
|
||||
"boolean": "Loginis",
|
||||
"choice": "Pasirinkimas"
|
||||
},
|
||||
"boolean_true": "Taip",
|
||||
"boolean_false": "Ne",
|
||||
"choices_missing_error": "Negalite pašalinti pasirinkimų. Trūksta šių pasirinkimų: {{choices}}",
|
||||
"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.",
|
||||
"choices_reorder_hint": "Temkite arba naudokite rodyklių klavišus, kad pakeistumėte eilės tvarką."
|
||||
}
|
||||
},
|
||||
"documentTitle": {
|
||||
"default": "Spoolman",
|
||||
"suffix": " | Spoolman",
|
||||
"home": {
|
||||
"list": "Pradžia | Spoolman"
|
||||
},
|
||||
"help": {
|
||||
"list": "Pagalba | Spoolman"
|
||||
},
|
||||
"locations": {
|
||||
"list": "Vieta | Spoolman"
|
||||
},
|
||||
"filament": {
|
||||
"list": "Gijos | Spoolman",
|
||||
"show": "#{{id}} Rodyti gijas | Spoolman",
|
||||
"edit": "#{{id}} Redaguoti gijas | Spoolman",
|
||||
"create": "Kurti giją | Spoolman",
|
||||
"clone": "#{{id}} Klonuoti giją | Spoolman"
|
||||
},
|
||||
"spool": {
|
||||
"list": "Ritės | Spoolman",
|
||||
"show": "#{{id}} Rodyti rites| Spoolman",
|
||||
"edit": "#{{id}} Redaguoti rites | Spoolman",
|
||||
"create": "Kurti ritę | Spoolman",
|
||||
"clone": "#{{id}} Klonuoti ritę | Spoolman"
|
||||
},
|
||||
"vendor": {
|
||||
"list": "Gamintojai | Spoolman",
|
||||
"show": "#{{id}} Rodyti gamintojus | Spoolman",
|
||||
"edit": "#{{id}} Redaguoti gamintojus | Spoolman",
|
||||
"create": "Kurti gamintoją | Spoolman",
|
||||
"clone": "#{{id}} Klonuoti gamintoją | Spoolman"
|
||||
}
|
||||
},
|
||||
"locations": {
|
||||
"locations": "Vietos",
|
||||
"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": ""
|
||||
}
|
||||
}
|
||||
@@ -21,7 +21,8 @@
|
||||
"filter": "Filtrer",
|
||||
"refresh": "Gjenoppfrisk",
|
||||
"notAccessTitle": "Du har ikke rettighet til å få tilgang",
|
||||
"saveAndAdd": "Lagre og legg til"
|
||||
"saveAndAdd": "Lagre og legg til",
|
||||
"continue": "Fortsett"
|
||||
},
|
||||
"filament": {
|
||||
"fields": {
|
||||
@@ -41,7 +42,12 @@
|
||||
"vendor": "Leverandør",
|
||||
"settings_bed_temp": "Printplate temp",
|
||||
"density": "Tetthet",
|
||||
"spools": "Vis ruller"
|
||||
"spools": "Vis ruller",
|
||||
"single_color": "Ensfarget",
|
||||
"multi_color": "Flerfarget",
|
||||
"coaxial": "Koaksial",
|
||||
"longitudinal": "Langsgående",
|
||||
"external_id": "Ekstern ID"
|
||||
},
|
||||
"fields_help": {
|
||||
"name": "Filamentnavn, for å skille denne filamenttypen blant andre fra samme leverandør. Bør inneholde fargen f.eks.",
|
||||
@@ -49,7 +55,8 @@
|
||||
"spool_weight": "Vekten av en tom spole. Brukes til å bestemme målt vekt på en spole.",
|
||||
"price": "Pris på en full spole i den system- valutaen.",
|
||||
"weight": "Filamentvekten til en full spole (nettovekt). Bør ikke inkludere vekten av selve spolen, kun filamentet. Det er det som vanligvis står på emballasjen.",
|
||||
"material": "F.eks PLA,ABS,PETG, osv."
|
||||
"material": "F.eks PLA,ABS,PETG, osv.",
|
||||
"multi_color_direction": "Retning av fargeovergang for flerfarget filament."
|
||||
},
|
||||
"titles": {
|
||||
"clone": "Kopier Filament",
|
||||
@@ -61,7 +68,12 @@
|
||||
},
|
||||
"filament": "Filamenter",
|
||||
"form": {
|
||||
"filament_updated": "Dette filamentet har blitt oppdatert av noen/noe siden du åpnet denne siden. Lagring nå vil overskrive disse endringene!"
|
||||
"filament_updated": "Dette filamentet har blitt oppdatert av noen/noe siden du åpnet denne siden. Lagring nå vil overskrive disse endringene!",
|
||||
"import_external": "Importer fra ekstern database",
|
||||
"import_external_description": "Hent filamentdata automatisk fra en ekstern kilde."
|
||||
},
|
||||
"buttons": {
|
||||
"add_spool": "Legg til spole"
|
||||
}
|
||||
},
|
||||
"printing": {
|
||||
@@ -95,25 +107,53 @@
|
||||
"description": "Still inn innstillingene nedenfor for å få ønsket utskriftsoppsett. Husk at skrivere og operativsystemet ditt kan bruke sine egne marger og skalering, så det kan hende du må prøve og feile før alt er riktig. Test det på et stykke vanlig papir før du skriver ut på selve etikettene.",
|
||||
"horizontalSpacing": "Horisontal avstand",
|
||||
"marginLeft": "Venstre marg",
|
||||
"showBorder": "Vis side"
|
||||
"showBorder": "Vis side",
|
||||
"defaultSettings": "Standard",
|
||||
"newSetting": "Ny",
|
||||
"addSettings": "Legg til ny mal",
|
||||
"duplicateSettings": "Dupliser",
|
||||
"deleteSettings": "Slett gjeldende mal",
|
||||
"deleteSettingsConfirm": "Er du sikker på at du vil slette denne malen?",
|
||||
"settingsName": "Navn på mal",
|
||||
"saveSetting": "Lagre mal",
|
||||
"settings": "Maler",
|
||||
"saveAsImage": "Lagre som bilde",
|
||||
"itemCopies": "Antall kopier"
|
||||
},
|
||||
"qrcode": {
|
||||
"showTemperatures": "Temperaturer",
|
||||
"button": "Skriv ut QR-koder",
|
||||
"button": "Skriv ut etiketter",
|
||||
"showVendorComment": "Leverandørkommentar",
|
||||
"spoolWeight": "Spolevekt: {{weight}}",
|
||||
"showVendor": "Leverandør",
|
||||
"showSpoolComment": "Spolekommentar",
|
||||
"title": "QR-kodeutskrift",
|
||||
"title": "Etikettprinting",
|
||||
"extruderTemp": "ET: {{temp}}",
|
||||
"showSpoolWeight": "Spolevekt",
|
||||
"showContent": "Skriv ut etikett",
|
||||
"textSize": "Tekststørrelse på innhold",
|
||||
"textSize": "Tekststørrelse på etikett",
|
||||
"showSpoolmanIcon": "Vis Spoolman ikon",
|
||||
"showLotNr": "Batch Nr",
|
||||
"bedTemp": "BT: {{temp}}",
|
||||
"lotNr": "Batch Nr: {{lot}}",
|
||||
"showFilamentComment": "Filament kommentar"
|
||||
"showFilamentComment": "Filament kommentar",
|
||||
"template": "Etikett mal",
|
||||
"showQRCodeMode": {
|
||||
"simple": "Simpel",
|
||||
"no": "Nei",
|
||||
"withIcon": "Med ikon"
|
||||
},
|
||||
"showQRCode": "Print QR-kode",
|
||||
"useHTTPUrl": {
|
||||
"label": "QR-kodelenke",
|
||||
"options": {
|
||||
"default": "Standard",
|
||||
"url": "URL"
|
||||
},
|
||||
"preview": "Forhåndsvisning:",
|
||||
"tooltip": "Velg om QR-koden skal bruke HTTP- eller intern URL."
|
||||
},
|
||||
"templateHelp": "Velg hvilken etikettemplate du ønsker å bruke."
|
||||
},
|
||||
"spoolSelect": {
|
||||
"showArchived": "Vis arkiverte",
|
||||
@@ -121,7 +161,7 @@
|
||||
"noSpoolsSelected": "Du har ikke valgt noen spoler.",
|
||||
"selectedTotal_one": "{{count}} spole valgt",
|
||||
"selectedTotal_other": "{{count}} spoler valgt",
|
||||
"description": "Velg spoler å printe ut QR-koder for.",
|
||||
"description": "Velg spoler å printe ut etiketter for.",
|
||||
"selectAll": "Velg/fjern merking av alle"
|
||||
}
|
||||
},
|
||||
@@ -146,7 +186,11 @@
|
||||
"filament_name": "Filament",
|
||||
"filament": "Filament",
|
||||
"location": "Lokasjon",
|
||||
"price": ""
|
||||
"price": "Pris",
|
||||
"filament_internal": "Internt",
|
||||
"filament_external": "Eksternt",
|
||||
"initial_weight": "Startvekt",
|
||||
"spool_weight": "Tom vekt"
|
||||
},
|
||||
"titles": {
|
||||
"archive": "Arkiver spole",
|
||||
@@ -155,7 +199,8 @@
|
||||
"create": "Opprett spole",
|
||||
"clone": "Klon spole",
|
||||
"show_title": "[Spole #{{id}}] {{name}}",
|
||||
"list": "Spoler"
|
||||
"list": "Spoler",
|
||||
"adjust": "Juster spolefilament"
|
||||
},
|
||||
"spool": "Spoler",
|
||||
"messages": {
|
||||
@@ -168,11 +213,24 @@
|
||||
"lot_nr": "Produsentens batch nummer. Kan bli benyttet or å verifiserer at print har en konsistent farge dersom flere spoler benyttes.",
|
||||
"remaining_weight": "Hvor mye filament gjenstår på spolen. Ved en ny spole burde dette stemme med spolevekt.",
|
||||
"location": "Hvor spolen er plassert hvis du har flere lokasjoner hvor du oppbevarer spoler.",
|
||||
"price": ""
|
||||
"price": "Pris på en full spole. Hvis ikke satt, vil prisen på filamentet bli antatt i stedet.",
|
||||
"spool_weight": "Vekten av spolen når den er tom. La stå tomt for å bruke verdien fra filamentet eller produsenten.",
|
||||
"initial_weight": "Startvekten av filament på spolen (nettovekt). Vil bruke vekten fra filament hvis ikke satt.",
|
||||
"external_filament": "Du har valgt et filament fra den eksterne databasen. Et filamentobjekt (og muligens et produsentobjekt) opprettes automatisk når du oppretter denne spolen. Dette kan lage dupliserte filamentobjekter hvis du allerede har opprettet et filamentobjekt for denne filamentet."
|
||||
},
|
||||
"form": {
|
||||
"new_location_prompt": "Skriv inn en ny lokasjon",
|
||||
"spool_updated": "Denne rullen har blitt oppdatert av noen/noe siden du åpnet denne siden. Lagre nå vil overskrive disse endringene!"
|
||||
"spool_updated": "Denne rullen har blitt oppdatert av noen/noe siden du åpnet denne siden. Lagre nå vil overskrive disse endringene!",
|
||||
"measurement_type": {
|
||||
"length": "Lengde",
|
||||
"weight": "Vekt"
|
||||
},
|
||||
"measurement_type_label": "Måleenhet",
|
||||
"adjust_filament_help": "Justér verdien hvis målt filamentmengde avviker fra forventet.",
|
||||
"adjust_filament_value": "Juster mengde"
|
||||
},
|
||||
"formats": {
|
||||
"last_used": "Sist brukt {{date}}"
|
||||
}
|
||||
},
|
||||
"yes": "Ja",
|
||||
@@ -182,7 +240,9 @@
|
||||
"registered": "Registrert",
|
||||
"name": "Navn",
|
||||
"id": "ID",
|
||||
"comment": "Kommentar"
|
||||
"comment": "Kommentar",
|
||||
"empty_spool_weight": "Tom spolevekt",
|
||||
"external_id": "Ekstern ID"
|
||||
},
|
||||
"titles": {
|
||||
"show_title": "[Leverandør #{{id}}] {{name}}",
|
||||
@@ -195,6 +255,9 @@
|
||||
"vendor": "Leverandører",
|
||||
"form": {
|
||||
"vendor_updated": "Denne leverandøren har blitt oppdatert av noen/noe siden du åpnet denne siden. Lagring nå vil overskrive disse endringene!"
|
||||
},
|
||||
"fields_help": {
|
||||
"empty_spool_weight": "Vekten av en tom spole for denne leverandøren."
|
||||
}
|
||||
},
|
||||
"actions": {
|
||||
@@ -229,7 +292,9 @@
|
||||
"createError": "Kunne ikke opprette {{resource}} (statuskode: {{statusCode}})",
|
||||
"editSuccess": "{{resource}} redigert",
|
||||
"deleteError": "Kunne ikke slette {{resource}} (statuskode: {{statusCode}})",
|
||||
"createSuccess": "Opprettet {{resource}}"
|
||||
"createSuccess": "Opprettet {{resource}}",
|
||||
"saveSuccessful": "Lagring vellykket!",
|
||||
"validationError": "Valideringsfeil: {{error}}"
|
||||
},
|
||||
"loading": "Laster",
|
||||
"documentTitle": {
|
||||
@@ -257,30 +322,90 @@
|
||||
"edit": "#{{id}} Endre Filament | Spoolman"
|
||||
},
|
||||
"home": {
|
||||
"list": ""
|
||||
"list": "Hjem | Spoolman"
|
||||
},
|
||||
"help": {
|
||||
"list": ""
|
||||
"list": "Hjelp | Spoolman"
|
||||
},
|
||||
"locations": {
|
||||
"list": "Lokasjoner | Spoolman"
|
||||
}
|
||||
},
|
||||
"table": {
|
||||
"actions": "Handliger"
|
||||
"actions": "Handlinger"
|
||||
},
|
||||
"warnWhenUnsavedChanges": "Er du sikker på at du vil forlate? Du har ulagrede endringer.",
|
||||
"dashboard": {
|
||||
"title": "Oversikt"
|
||||
},
|
||||
"kofi": "",
|
||||
"kofi": "Gi meg tips på Ko-fi",
|
||||
"home": {
|
||||
"home": ""
|
||||
"home": "Hjem",
|
||||
"welcome": "Velkommen til Spoolman!",
|
||||
"description": "Det ser ut som du ikke har lagt til noen spoler ennå. Se <helpPageLink>hjelpesiden</helpPageLink> for hjelp til å komme i gang."
|
||||
},
|
||||
"help": {
|
||||
"help": "",
|
||||
"help": "Hjelp",
|
||||
"resources": {
|
||||
"filament": "",
|
||||
"spool": "",
|
||||
"vendor": ""
|
||||
"filament": "Filament leverandører. De har egenskaper som navn, materiale, farge, diameter og mer.",
|
||||
"spool": "Individuelle fysiske ruller med spesifikt filament.",
|
||||
"vendor": "Produsent av filament."
|
||||
},
|
||||
"description": ""
|
||||
"description": "<title>Hjelp</title><p>Her er noen tips for å komme i gang.</p><p>Spoolman inneholder tre forskjellige typer data:</p><itemsHelp/><p>For å legge til en ny spole i databasen, start med å opprette et <filamentCreateLink>Filament</filamentCreateLink>-objekt. Når det er gjort, fortsett med å opprette et <spoolCreateLink>Spool</spoolCreateLink>-objekt for den spesifikke spolen. Hvis du anskaffer flere spoler av samme filament senere, genererer du ganske enkelt flere spoleobjekter og bruker det samme filamentobjektet på nytt.</p><p>Alternativt kan du også generere et <vendorCreateLink>Manufacturer</vendorCreateLink>-objekt for selskapet som produserer filamentet hvis du ønsker å spore denne informasjonen.</p><p>Du har muligheten til å koble andre 3D-printertjenester til Spoolman, som Moonraker, som automatisk kan overvåke filamentbruk og oppdatere spoleobjektene for deg. Se <readmeLink>Spoolman README</readmeLink> for veiledning om hvordan du konfigurerer dette.</p>"
|
||||
},
|
||||
"locations": {
|
||||
"locations": "Lokasjoner",
|
||||
"new_location": "Ny lokasjon",
|
||||
"no_location": "Ingen lokasjon",
|
||||
"no_locations_help": "Denne siden mar deg organisere rullene med filament i lokasjoner. Legg til noen ruller for å starte!"
|
||||
},
|
||||
"settings": {
|
||||
"settings": "Innstillinger",
|
||||
"header": "Innstillinger",
|
||||
"general": {
|
||||
"tab": "Generelt",
|
||||
"currency": {
|
||||
"label": "Valuta"
|
||||
},
|
||||
"base_url": {
|
||||
"label": "Base-URL",
|
||||
"tooltip": "URL som brukes ved generering av QR-koder og eksterne lenker."
|
||||
},
|
||||
"round_prices": {
|
||||
"label": "Avrund priser",
|
||||
"tooltip": "Runder priser til nærmeste hele verdi."
|
||||
}
|
||||
},
|
||||
"extra_fields": {
|
||||
"tab": "Ekstra felt",
|
||||
"description": "<p>Her kan du legge til ekstra tilpassede felt til enhetene dine.</p><p>Når et felt er lagt til, kan du ikke endre nøkkelen eller typen, og for valgtypefelt kan du ikke fjerne valg eller endre flervalgsstatusen. Hvis du fjerner et felt, slettes de tilknyttede dataene for alle enheter.</p><p>Nøkkelen er det andre programmer leser/skriver dataene som, så hvis det tilpassede feltet ditt skal integreres med et tredjepartsprogram, må du sørge for å angi det riktig. Standardverdien brukes bare på nye elementer.</p><p>Ekstra felt kan ikke sorteres eller filtreres i tabellvisningene.</p>",
|
||||
"params": {
|
||||
"key": "Nøkkel",
|
||||
"name": "Navn",
|
||||
"field_type": "Felttype",
|
||||
"unit": "Enhet",
|
||||
"order": "Rekkefølge",
|
||||
"default_value": "Standardverdi",
|
||||
"choices": "Valg",
|
||||
"multi_choice": "Flervalg"
|
||||
},
|
||||
"field_type": {
|
||||
"text": "Tekst",
|
||||
"integer": "Heltall",
|
||||
"integer_range": "Heltallsområde",
|
||||
"float": "Desimaltall",
|
||||
"float_range": "Desimalområde",
|
||||
"datetime": "Dato/Tid",
|
||||
"boolean": "Ja/Nei",
|
||||
"choice": "Valg"
|
||||
},
|
||||
"boolean_true": "Ja",
|
||||
"boolean_false": "Nei",
|
||||
"choices_missing_error": "Du kan ikke fjerne valg. Følgende valg mangler: {{choices}}",
|
||||
"non_unique_key_error": "Nøkkelen må være unik.",
|
||||
"key_not_changed": "Nøkkelen kan ikke endres.",
|
||||
"delete_confirm": "Slette felt {{name}}?",
|
||||
"delete_confirm_description": "Dette vil fjerne feltet permanent fra systemet."
|
||||
}
|
||||
}
|
||||
}
|
||||
@@ -9,19 +9,20 @@
|
||||
"showArchived": "Gearchiveerd tonen",
|
||||
"archive": "Archiveren",
|
||||
"hideColumns": "Kolommen verbergen",
|
||||
"confirm": "Weet je het zeker?",
|
||||
"confirm": "Weet u het zeker?",
|
||||
"delete": "Verwijderen",
|
||||
"undo": "Ongedaan maken",
|
||||
"import": "Importeren",
|
||||
"logout": "Uitloggen",
|
||||
"refresh": "Vernieuwen",
|
||||
"notAccessTitle": "Je hebt geen toegang tot",
|
||||
"notAccessTitle": "U heeft geen toegang tot",
|
||||
"hideArchived": "Gearchiveerd verbergen",
|
||||
"clearFilters": "Filters leegmaken",
|
||||
"unArchive": "Dearchiveren",
|
||||
"unArchive": "Terugzetten",
|
||||
"clone": "Klonen",
|
||||
"clear": "Wissen",
|
||||
"saveAndAdd": "Opslaan en Toevoegen"
|
||||
"saveAndAdd": "Opslaan en Toevoegen",
|
||||
"continue": "Doorgaan"
|
||||
},
|
||||
"actions": {
|
||||
"create": "Aanmaken",
|
||||
@@ -39,10 +40,10 @@
|
||||
"helpPrinterMargin": "Safe-Zone moet worden ingesteld op hoe dicht bij de papierrand uw printer kan afdrukken. Als u deze wijzigt, heeft dit geen invloed op het hele raster.",
|
||||
"previewScale": "Voorbeeldschaal",
|
||||
"helpMargin": "Marges moeten worden geconfigureerd zodat ze overeenkomen met je labelpapier en printer. Als u deze wijzigt, heeft dit invloed op de grootte van het hele raster.",
|
||||
"skipItems": "Items overlaan",
|
||||
"skipItems": "Items overslaan",
|
||||
"paperSize": "Papierformaat",
|
||||
"columns": "Kolommen",
|
||||
"description": "Stem de onderstaande instellingen af om de gewenste printlay-out te krijgen. Houd er rekening mee dat printers en je besturingssysteem hun eigen marges en schaling kunnen toepassen, dus het kan zijn dat je met wat instellingen moet spelen voordat alles correct is. Test het op een stuk gewoon papier voordat u op de daadwerkelijke etiketten afdrukt.",
|
||||
"description": "Stem de onderstaande instellingen af om de gewenste print lay-out te krijgen. Houd er rekening mee dat printers en je besturingssysteem hun eigen marges en schaling kunnen toepassen, dus het kan zijn dat je met wat instellingen moet spelen voordat alles correct is. Test het op een stuk gewoon papier voordat u op de daadwerkelijke etiketten afdrukt.",
|
||||
"showBorder": "Rand tonen",
|
||||
"dimensions": "Afmetingen",
|
||||
"print": "Printen",
|
||||
@@ -61,7 +62,18 @@
|
||||
"marginBottom": "Onderste marge",
|
||||
"horizontalSpacing": "Horizontale afstand",
|
||||
"marginLeft": "Linker marge",
|
||||
"printerMarginLeft": "Linker Safe-Zone"
|
||||
"printerMarginLeft": "Linker Safe-Zone",
|
||||
"settings": "Voorinstellingen",
|
||||
"defaultSettings": "Standaard",
|
||||
"addSettings": "Nieuwe voorinstelling toevoegen",
|
||||
"newSetting": "Nieuw",
|
||||
"deleteSettings": "Huidige voorinstelling wissen",
|
||||
"deleteSettingsConfirm": "Weet je zeker dat je deze voorinstelling wilt verwijderen?",
|
||||
"settingsName": "Voorinstellingsnaam",
|
||||
"itemCopies": "Itemkopieën",
|
||||
"duplicateSettings": "Dupliceren",
|
||||
"saveSetting": "Voorinstelling opslaan",
|
||||
"saveAsImage": "Opslaan als afbeelding"
|
||||
},
|
||||
"qrcode": {
|
||||
"extruderTemp": "ET: {{temp}}",
|
||||
@@ -72,42 +84,61 @@
|
||||
"showTemperatures": "Temperaturen",
|
||||
"showVendor": "Fabrikant",
|
||||
"showSpoolComment": "Opmerking spoel",
|
||||
"textSize": "Inhoud tekstgrootte",
|
||||
"title": "QR-Code afdrukken",
|
||||
"textSize": "Label tekstgrootte",
|
||||
"title": "Label afdrukken",
|
||||
"showSpoolmanIcon": "Spoolman icoon tonen",
|
||||
"showLotNr": "Lotnr",
|
||||
"showLotNr": "Lotnummer",
|
||||
"bedTemp": "BT: {{temp}}",
|
||||
"lotNr": "Lotnr: {{lot}}",
|
||||
"lotNr": "Lotnummer: {{lot}}",
|
||||
"showFilamentComment": "Opmerking filament",
|
||||
"button": "QR-Codes afdrukken"
|
||||
"button": "Labels afdrukken",
|
||||
"template": "Label Sjabloon",
|
||||
"templateHelp": "Gebruik {} om waarden van het spool-object als tekst in te voegen. Bijvoorbeeld, {id} wordt vervangen door de spool-id, of {filament.material} wordt vervangen door het materiaal van de spool. Als een waarde ontbreekt, wordt deze vervangen door \"?\". Een tweede set {} kan worden gebruikt om dit te verwijderen. Bovendien wordt alle tekst tussen de sets {} verwijderd als de waarde ontbreekt. Bijvoorbeeld, {Lot Nr: {lot_nr}} toont alleen het label als de spool een lotnummer heeft. Sluit tekst in met dubbele asterisk ** om deze vet te maken. Klik op de knop om een lijst met alle beschikbare tags te bekijken.",
|
||||
"showQRCodeMode": {
|
||||
"no": "Nee",
|
||||
"simple": "Simpel",
|
||||
"withIcon": "Met Icoon"
|
||||
},
|
||||
"showQRCode": "Print QR-Code",
|
||||
"useHTTPUrl": {
|
||||
"options": {
|
||||
"url": "URL",
|
||||
"default": "Standaard"
|
||||
},
|
||||
"label": "QR-codelink",
|
||||
"tooltip": "Er wordt een speciale link gebruikt die alleen werkt als deze wordt gescand via de scanfunctie van Spoolman (standaard). De URL gebruikt de basis-URL die is opgegeven in de instellingen of de URL van de huidige pagina als deze niet is ingesteld.",
|
||||
"preview": "Voorbeeld:"
|
||||
}
|
||||
},
|
||||
"spoolSelect": {
|
||||
"selectedTotal_one": "{{count}} spoel geselecteerd",
|
||||
"selectedTotal_other": "{{count}} spoelen geselecteerd",
|
||||
"description": "Selecteer spoelen waarvoor je QR-codes wilt afdrukken.",
|
||||
"description": "Selecteer spoelen waarvoor je labels wilt afdrukken.",
|
||||
"showArchived": "Gearchiveerde tonen",
|
||||
"title": "Spoelen selecteren",
|
||||
"selectAll": "Alles selecteren/deselecteren",
|
||||
"noSpoolsSelected": "Je hebt geen spoelen geselecteerd."
|
||||
"selectAll": "Alles (de)selecteren",
|
||||
"noSpoolsSelected": "U heeft geen spoelen geselecteerd."
|
||||
}
|
||||
},
|
||||
"notifications": {
|
||||
"deleteSuccess": "{{resource}} succesvol verwijderd",
|
||||
"error": "Fout (fout code {{statusCode}})",
|
||||
"editError": "Fout opgetreden bij het bewerken van {{resource}} (status code {{statusCode}})",
|
||||
"undoable": "Je hebt {{seconds}} seconden om ongedaan te maken.",
|
||||
"undoable": "U heeft {{seconds}} seconden om ongedaan te maken.",
|
||||
"importProgress": "Importeren: {{processed}}/{{total}}",
|
||||
"createError": "Er is een fout opgetreden bij het aanmaken van {{resource}} (status code {{statusCode}})",
|
||||
"success": "Succesvol",
|
||||
"editSuccess": "{{resource}} succesvol bewerkt",
|
||||
"deleteError": "Fout opgetreden bij het verwijderen van {{resource}} (status code {{statusCode}})",
|
||||
"createSuccess": "{{resource}} succesvol aangemaakt"
|
||||
"createSuccess": "{{resource}} succesvol aangemaakt",
|
||||
"saveSuccessful": "Succesvol opgeslagen!",
|
||||
"validationError": "Validatie error: {{error}}"
|
||||
},
|
||||
"no": "Nee",
|
||||
"unknown": "Onbekend",
|
||||
"yes": "Ja",
|
||||
"version": "Versie",
|
||||
"warnWhenUnsavedChanges": "Weet je zeker dat je wil vertrekken? Er zijn niet-opgeslagen wijzigingen.",
|
||||
"warnWhenUnsavedChanges": "Weet u zeker dat u deze pagina wilt verlaten? Er zijn niet-opgeslagen wijzigingen.",
|
||||
"loading": "Laden",
|
||||
"dashboard": {
|
||||
"title": "Dashboard"
|
||||
@@ -118,7 +149,7 @@
|
||||
"documentTitle": {
|
||||
"vendor": {
|
||||
"create": "Fabrikant maken | Spoolman",
|
||||
"clone": "#{{id}} Leverancier klonen | Spoolman",
|
||||
"clone": "#{{id}} Fabrikant klonen | Spoolman",
|
||||
"edit": "#{{id}} Fabrikant bewerken | Spoolman",
|
||||
"list": "Fabrikanten | Spoolman",
|
||||
"show": "#{{id}} Fabrikant tonen | Spoolman"
|
||||
@@ -144,6 +175,9 @@
|
||||
},
|
||||
"help": {
|
||||
"list": "Help | Spoolman"
|
||||
},
|
||||
"locations": {
|
||||
"list": "Locaties | Spoolman"
|
||||
}
|
||||
},
|
||||
"spool": {
|
||||
@@ -152,7 +186,7 @@
|
||||
"last_used": "Laatst gebruikt",
|
||||
"material": "Materiaal",
|
||||
"weight_to_use": "Gewicht",
|
||||
"lot_nr": "Lotnr",
|
||||
"lot_nr": "Lotnummer",
|
||||
"filament_name": "Filament",
|
||||
"comment": "Opmerking",
|
||||
"filament": "Filament",
|
||||
@@ -165,7 +199,11 @@
|
||||
"used_weight": "Gebruikt gewicht",
|
||||
"id": "ID",
|
||||
"remaining_weight": "Overgebleven gewicht",
|
||||
"price": ""
|
||||
"price": "Prijs",
|
||||
"initial_weight": "Initieel gewicht",
|
||||
"spool_weight": "Leeg gewicht",
|
||||
"filament_internal": "Intern",
|
||||
"filament_external": "Extern"
|
||||
},
|
||||
"titles": {
|
||||
"archive": "Spoel archiveren",
|
||||
@@ -174,34 +212,49 @@
|
||||
"create": "Spoel maken",
|
||||
"clone": "Spoel klonen",
|
||||
"list": "Spoelen",
|
||||
"show_title": "[Spoel #{{id}}] {{name}}"
|
||||
"show_title": "[Spoel #{{id}}] {{name}}",
|
||||
"adjust": "Spoel Filament aanpassen"
|
||||
},
|
||||
"fields_help": {
|
||||
"used_weight": "Hoeveel filament er van de spoel is gebruikt. Op een nieuwe spoel zal 0g gebruikt zijn.",
|
||||
"weight_to_use": "Selecteer welke gewichtswaarde je wilt invoeren. Het gemeten gewicht is alleen beschikbaar als het spoelgewicht is ingesteld voor het geselecteerde filament.",
|
||||
"weight_to_use": "Selecteer welke gewichtswaarde u wilt invoeren. Het gemeten gewicht is alleen beschikbaar als het spoelgewicht is ingesteld voor het geselecteerde filament.",
|
||||
"measured_weight": "Hoeveel het filament en de spoel wegen.",
|
||||
"lot_nr": "Lotnummer van de fabrikant. Kan worden gebruikt om ervoor te zorgen dat een afdruk een consistente kleur heeft als er meerdere spoelen worden gebruikt.",
|
||||
"remaining_weight": "Hoeveel filament zit er nog op de spoel. Bij een nieuwe spoel zal dit overeenkomen met het spoelgewicht.",
|
||||
"location": "Waar de spoel zich bevindt als je meerdere locaties hebt waar je jouw spoelen opslaat.",
|
||||
"price": ""
|
||||
"location": "Waar de spoel zich bevindt, wanneer er meerdere opslag locaties zijn.",
|
||||
"price": "Prijs van een volledige spoel. Als dit niet wordt ingevuld, wordt in plaats daarvan uitgegaan van de prijs van het filament.",
|
||||
"initial_weight": "Het initiële gewicht van het filament op de spoel (nettogewicht). Als dit niet is opgegeven, wordt het gewicht van het filament-object gebruikt.",
|
||||
"spool_weight": "Het gewicht van de spoel als deze leeg is. Laat dit leeg om de waarde van het filament of de fabrikant te gebruiken.",
|
||||
"external_filament": "U heeft een filament uit de externe database geselecteerd. Er wordt automatisch een filament-object (en mogelijk een fabrikant-object) gemaakt wanneer u deze spoel maakt. Hierdoor kunnen dubbele filament-objecten ontstaan als u al een filament-object voor dit filament hebt gemaakt."
|
||||
},
|
||||
"spool": "Spoelen",
|
||||
"messages": {
|
||||
"archive": "Weet je zeker dat je deze spoel wil archiveren?"
|
||||
"archive": "Weet u zeker dat u deze spoel wil archiveren?"
|
||||
},
|
||||
"form": {
|
||||
"new_location_prompt": "Voer een nieuwe locatie in",
|
||||
"spool_updated": "Deze spoel is bijgewerkt door iemand/iets anders sinds je deze pagina hebt geopend. Opslaan zal die wijzigingen overschrijven!"
|
||||
"spool_updated": "Deze spoel is bijgewerkt door iemand/iets anders sinds je deze pagina hebt geopend. Opslaan zal die wijzigingen overschrijven!",
|
||||
"adjust_filament_help": "Hier kunt u direct filament toevoegen of verwijderen van de spoel. Een positieve waarde zal filament verbruiken, een negatieve waarde zal het toevoegen.",
|
||||
"measurement_type": {
|
||||
"length": "Lengte",
|
||||
"weight": "Gewicht"
|
||||
},
|
||||
"measurement_type_label": "Meettype",
|
||||
"adjust_filament_value": "Verbruikte hoeveelheid"
|
||||
},
|
||||
"formats": {
|
||||
"last_used": "Laatst gebruikt {{date}}"
|
||||
}
|
||||
},
|
||||
"filament": {
|
||||
"fields_help": {
|
||||
"name": "Filamentnaam, om dit filamenttype onder andere van dezelfde fabrikant te onderscheiden. Kan bijvoorbeeld de kleur bevatten.",
|
||||
"name": "Filamentnaam, om dit filamenttype onder andere van dezelfde fabrikant te onderscheiden. Moet bijvoorbeeld de kleur bevatten.",
|
||||
"article_number": "Bv. EAN. UPC, enz.",
|
||||
"spool_weight": "Het gewicht van een lege spoel. Wordt gebruikt om het gemeten gewicht van een spoel te bepalen.",
|
||||
"price": "Prijs van een volledige spoel in de door het systeem geconfigureerde valuta.",
|
||||
"price": "Prijs van een volledige spoel.",
|
||||
"weight": "Het filamentgewicht van een volle spoel (nettogewicht). Dit mag niet het gewicht van de spoel zelf omvatten, alleen het filament. Dit staat meestal op de verpakking.",
|
||||
"material": "Bv. PLA, ABS, PETG, enz."
|
||||
"material": "Bv. PLA, ABS, PETG, enz.",
|
||||
"multi_color_direction": "Filamenten kunnen op twee manieren meerdere kleuren hebben: door coëxtrusie, zoals tweekleurige filamenten met consistente meerkleuren, of door kleurveranderingen in de lengterichting, zoals verloopfilamenten die van kleur veranderen langs de spoel."
|
||||
},
|
||||
"fields": {
|
||||
"material": "Materiaal",
|
||||
@@ -219,20 +272,30 @@
|
||||
"density": "Dichtheid",
|
||||
"id": "ID",
|
||||
"color_hex": "Kleur",
|
||||
"article_number": "Artiekelnummer",
|
||||
"spools": "Spoelen tonen"
|
||||
"article_number": "Artikel nummer",
|
||||
"spools": "Spoelen tonen",
|
||||
"external_id": "Extern ID",
|
||||
"single_color": "Enkel",
|
||||
"multi_color": "Meervoudig",
|
||||
"coaxial": "Gecoëxtrudeerd",
|
||||
"longitudinal": "Longitudinaal"
|
||||
},
|
||||
"titles": {
|
||||
"clone": "Flimanent klonen",
|
||||
"clone": "Filament klonen",
|
||||
"show": "Filament tonen",
|
||||
"create": "Flimament maken",
|
||||
"create": "Filament maken",
|
||||
"edit": "Filament bewerken",
|
||||
"list": "Filamenten",
|
||||
"show_title": "[Filament #{{id}}] {{name}}"
|
||||
},
|
||||
"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!"
|
||||
"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 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"
|
||||
}
|
||||
},
|
||||
"scanner": {
|
||||
@@ -251,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}}"
|
||||
},
|
||||
@@ -260,15 +323,20 @@
|
||||
"registered": "Geregistreerd",
|
||||
"comment": "Opmerking",
|
||||
"name": "Naam",
|
||||
"id": "ID"
|
||||
"id": "ID",
|
||||
"empty_spool_weight": "Gewicht Lege Spoel",
|
||||
"external_id": "Externe ID"
|
||||
},
|
||||
"vendor": "Fabrikanten",
|
||||
"form": {
|
||||
"vendor_updated": "Deze leverancier is bijgewerkt dor iemand/iets anders sinds je deze pagina geopend hebt. De veranderingen worden overschreven als je opslaat!"
|
||||
"vendor_updated": "Deze fabrikant is bijgewerkt door iemand/iets anders sinds je deze pagina geopend hebt. De veranderingen worden overschreven als je opslaat!"
|
||||
},
|
||||
"fields_help": {
|
||||
"empty_spool_weight": "Het gewicht van een lege spoel van deze fabrikant."
|
||||
}
|
||||
},
|
||||
"table": {
|
||||
"actions": "Akties"
|
||||
"actions": "Acties"
|
||||
},
|
||||
"help": {
|
||||
"resources": {
|
||||
@@ -276,11 +344,76 @@
|
||||
"filament": "Merken filament. Ze hebben eigenschappen zoals naam, materiaal, kleur, diameter en meer.",
|
||||
"spool": "Individuele fysieke spoelen van een specifiek filament."
|
||||
},
|
||||
"description": "<title>Help</title><p>Hier zijn enkele tips om u op weg te helpen.</p><p>Spoolman bewaart 3 verschillende soorten gegevens:</p><itemsHelp/><p>Om een nieuwe toe spoel toe te voegen in de database, begin dan met het maken van een <filamentCreateLink>Filament</filamentCreateLink> object. Zodra dat is gebeurd, gaat u verder met het maken van een <spoolCreateLink>Spoel</spoolCreateLink>-object voor die specifieke spoel. Als u later extra spoelen van hetzelfde filament aanschaft, genereert u eenvoudigweg extra Spoel-objecten en hergebruikt u hetzelfde Filament-object.</p><p>Optioneel kunt u ook een <vendorCreateLink>Vendor</vendorCreateLink>-object voor het bedrijf genereren als u die informatie wilt bijhouden.</p><p>U heeft de mogelijkheid om andere 3D-printerservices aan Spoolman te koppelen, zoals Moonraker, die automatisch het filament gebruik kan monitoren en de Spoel-objecten voor u kan bijwerken. Raadpleeg de <readmeLink>Spoolman README</readmeLink> voor richtlijnen over hoe u dat kunt instellen.</p>",
|
||||
"description": "<title>Help</title><p>Hier zijn enkele tips om u op weg te helpen.</p><p>Spoolman bewaart 3 verschillende soorten gegevens:</p><itemsHelp/><p>Om een nieuwe toe spoel toe te voegen in de database, begin dan met het maken van een <filamentCreateLink>Filament</filamentCreateLink> object. Zodra dat is gebeurd, gaat u verder met het maken van een <spoolCreateLink>Spoel</spoolCreateLink>-object voor die specifieke spoel. Als u later extra spoelen van hetzelfde filament aanschaft, genereert u eenvoudigweg extra Spoel-objecten en hergebruikt u hetzelfde Filament-object.</p><p>Optioneel kunt u ook een <vendorCreateLink>Fabrikant</vendorCreateLink>-object voor het bedrijf genereren als u die informatie wilt bijhouden.</p><p>U heeft de mogelijkheid om andere 3D-printerservices aan Spoolman te koppelen, zoals Moonraker, die automatisch het filament gebruik kan monitoren en de Spoel-objecten voor u kan bijwerken. Raadpleeg de <readmeLink>Spoolman README</readmeLink> voor richtlijnen over hoe u dat kunt instellen.</p>",
|
||||
"help": "Help"
|
||||
},
|
||||
"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",
|
||||
"general": {
|
||||
"tab": "Algemeen",
|
||||
"currency": {
|
||||
"label": "Valuta"
|
||||
},
|
||||
"base_url": {
|
||||
"label": "Basis-URL",
|
||||
"tooltip": "De basis-URL die moet worden gebruikt bij het genereren van functies zoals QR-codes."
|
||||
},
|
||||
"round_prices": {
|
||||
"label": "Afgeronde prijzen",
|
||||
"tooltip": "Rond prijzen af op het dichtstbijzijnde gehele getal."
|
||||
}
|
||||
},
|
||||
"extra_fields": {
|
||||
"tab": "Extra velden",
|
||||
"params": {
|
||||
"name": "Naam",
|
||||
"key": "Sleutel",
|
||||
"field_type": "Type",
|
||||
"unit": "Eenheid",
|
||||
"order": "Volgorde",
|
||||
"default_value": "Standaardwaarde",
|
||||
"choices": "Keuzes",
|
||||
"multi_choice": "Meerkeuze"
|
||||
},
|
||||
"field_type": {
|
||||
"text": "Tekst",
|
||||
"integer": "Gehele getallen",
|
||||
"integer_range": "Bereik van gehele getallen",
|
||||
"float": "Kommagetal",
|
||||
"float_range": "Bereik van kommagetallen",
|
||||
"datetime": "Datum/tijd",
|
||||
"boolean": "Booleaanse waarde",
|
||||
"choice": "Keuze"
|
||||
},
|
||||
"boolean_true": "Ja",
|
||||
"boolean_false": "Nee",
|
||||
"choices_missing_error": "U kunt geen keuzes verwijderen. De volgende keuzes ontbreken: {{choices}}",
|
||||
"non_unique_key_error": "De key moet uniek zijn.",
|
||||
"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 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"
|
||||
},
|
||||
"locations": {
|
||||
"no_location": "Geen locatie",
|
||||
"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",
|
||||
@@ -28,7 +28,8 @@
|
||||
"notAccessTitle": "Nie masz zezwolenia na dostęp",
|
||||
"hideColumns": "Edytuj kolumny",
|
||||
"clearFilters": "Wyczyść filtry",
|
||||
"saveAndAdd": "Zapisz i dodaj"
|
||||
"saveAndAdd": "Zapisz i dodaj",
|
||||
"continue": "Kontynuuj"
|
||||
},
|
||||
"spool": {
|
||||
"titles": {
|
||||
@@ -38,7 +39,8 @@
|
||||
"create": "Tworzenie szpuli",
|
||||
"clone": "Klonowanie szpuli",
|
||||
"archive": "Zarchiwizuj szpulę",
|
||||
"show_title": "[Szpula #{{id}}] {{name}}"
|
||||
"show_title": "[Szpula #{{id}}] {{name}}",
|
||||
"adjust": "Dostosuj szpulę filamentu"
|
||||
},
|
||||
"spool": "Szpule",
|
||||
"fields": {
|
||||
@@ -47,19 +49,23 @@
|
||||
"filament": "Filament",
|
||||
"material": "Materiał",
|
||||
"remaining_weight": "Pozostała waga",
|
||||
"used_length": "Użyta długość",
|
||||
"used_length": "Zużyta długość",
|
||||
"remaining_length": "Pozostała długość",
|
||||
"location": "Lokalizacja",
|
||||
"lot_nr": "Numer partii (LOT)",
|
||||
"first_used": "Pierwsze użycie",
|
||||
"last_used": "Ostatnie użycie",
|
||||
"comment": "Komentarz",
|
||||
"archived": "Zarchiwizowano",
|
||||
"used_weight": "Użyta waga",
|
||||
"archived": "Zarchiwizowana",
|
||||
"used_weight": "Zużyta waga",
|
||||
"registered": "Zarejestrowano",
|
||||
"measured_weight": "Zmierzona waga",
|
||||
"weight_to_use": "Waga",
|
||||
"price": ""
|
||||
"price": "Cena",
|
||||
"initial_weight": "Waga początkowa",
|
||||
"spool_weight": "Waga pusta",
|
||||
"filament_internal": "Wewnętrzne",
|
||||
"filament_external": "Zewnętrzne"
|
||||
},
|
||||
"fields_help": {
|
||||
"location": "Wpisz gdzie znajduje się szpula, jeśli masz wiele lokalizacji, w których przechowujesz szpule.",
|
||||
@@ -68,14 +74,27 @@
|
||||
"remaining_weight": "Ile filamentu pozostało na szpuli. W przypadku nowej szpuli powinno to odpowiadać wadze szpuli.",
|
||||
"measured_weight": "Waga filamentu i szpuli.",
|
||||
"weight_to_use": "Wybierz jaką wagę wprowadzić. Zmierzona waga jest dostępna tylko wtedy, gdy waga szpuli jest ustawiona dla wybranego filamentu.",
|
||||
"price": ""
|
||||
"price": "Cena pełnej szpuli. Jeśli nie ustawiona, cena filamentu będzie domyślna.",
|
||||
"initial_weight": "Masa początkowa filamentu(netto). Może być podana przez producenta, ale możesz ustawić dla każdej szpuli, aby uwzględnić ewentualne niedokładności.",
|
||||
"spool_weight": "Waga pustej szpuli. Pozostaw puste, aby użyć wartości z filamentu lub od producenta.",
|
||||
"external_filament": "Wybrałeś filament z zewnętrznej bazy. Element filamentu (możliwe też że element producenta) zostanie stworzony automatycznie gdy stworzysz szpulę. Może to spowodować utworzenie się duplikatów elementów filamentu jeżeli już stworzyłeś element filamentu dla tego filamentu."
|
||||
},
|
||||
"messages": {
|
||||
"archive": "Czy na pewno chcesz zarchiwizować tę szpulę?"
|
||||
},
|
||||
"form": {
|
||||
"new_location_prompt": "Wprowadź nową lokalizację",
|
||||
"spool_updated": "Szpula została zaktualizowana od czasu otwarcia tej strony. Zapisanie nadpisze te zmiany!"
|
||||
"spool_updated": "Szpula została zaktualizowana od czasu otwarcia tej strony. Zapisanie nadpisze te zmiany!",
|
||||
"measurement_type": {
|
||||
"length": "Długość",
|
||||
"weight": "Waga"
|
||||
},
|
||||
"measurement_type_label": "Typ pomiaru",
|
||||
"adjust_filament_help": "Tutaj możesz bezpośrednio dodać lub usunąć filament z szpuli. Dodatnia wartość spowoduje odjęcie filamentu, ujemna wartość spowoduje jego dodanie.",
|
||||
"adjust_filament_value": "Ilość zużycia"
|
||||
},
|
||||
"formats": {
|
||||
"last_used": "Ostatnio użyty {{date}}"
|
||||
}
|
||||
},
|
||||
"dashboard": {
|
||||
@@ -91,7 +110,9 @@
|
||||
"editError": "Błąd podczas edycji {{resource}} (kod statusu: {{statusCode}})",
|
||||
"importProgress": "Importowanie: {{processed}}/{{total}}",
|
||||
"error": "Błąd (kod statusu: {{statusCode}})",
|
||||
"createError": "Wystąpił błąd podczas tworzenia {{resource}} (kod statusu: {{statusCode}})"
|
||||
"createError": "Wystąpił błąd podczas tworzenia {{resource}} (kod statusu: {{statusCode}})",
|
||||
"saveSuccessful": "Zapisano pomyślnie!",
|
||||
"validationError": "Błąd walidacji: {{error}}"
|
||||
},
|
||||
"loading": "Wczytywanie",
|
||||
"version": "Wersja",
|
||||
@@ -104,42 +125,53 @@
|
||||
"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 u 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 u 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": "Kopie pozycji",
|
||||
"settings": "Presety",
|
||||
"saveAsImage": "Zapisz jako obraz",
|
||||
"duplicateSettings": "Zduplikuj",
|
||||
"deleteSettingsConfirm": "Czy jesteś pewny, że chcesz usunąć to ustawienie?",
|
||||
"addSettings": "Dodaj nowe ustawienia",
|
||||
"deleteSettings": "Usuń aktualne ustawienie",
|
||||
"settingsName": "Nazwa ustawienia",
|
||||
"saveSetting": "Zapisz ustawienie"
|
||||
},
|
||||
"qrcode": {
|
||||
"button": "Drukuj kody QR",
|
||||
"title": "Drukowanie kodów QR",
|
||||
"button": "Drukuj etykiety",
|
||||
"title": "Drukowanie etykiety",
|
||||
"bedTemp": "TS: {{temp}}",
|
||||
"extruderTemp": "TE: {{temp}}",
|
||||
"textSize": "Rozmiar tekstu",
|
||||
"textSize": "Rozmiar tekstu etykiety",
|
||||
"showSpoolmanIcon": "Pokaż ikonę Spoolman",
|
||||
"showVendor": "Producent",
|
||||
"showContent": "Etykieta",
|
||||
@@ -150,11 +182,28 @@
|
||||
"showVendorComment": "Komentarz producenta",
|
||||
"spoolWeight": "Waga szpuli: {{weight}}",
|
||||
"lotNr": "LOT: {{lot}}",
|
||||
"showSpoolComment": "Komentarz szpuli"
|
||||
"showSpoolComment": "Komentarz szpuli",
|
||||
"template": "Wzór etykiety",
|
||||
"useHTTPUrl": {
|
||||
"preview": "Podgląd:",
|
||||
"label": "Link w kodzie QR",
|
||||
"options": {
|
||||
"default": "Domyślny",
|
||||
"url": "URL"
|
||||
},
|
||||
"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": {
|
||||
"no": "Nie",
|
||||
"withIcon": "Z ikoną",
|
||||
"simple": "Proste"
|
||||
},
|
||||
"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",
|
||||
"description": "Wybierz szpule dla których mają być drukowane kody QR.",
|
||||
"description": "Wybierz szpule dla których mają być drukowane etykiety.",
|
||||
"showArchived": "Pokaż zarchiwizowane",
|
||||
"selectAll": "Wybierz/Odznacz wszystko",
|
||||
"selectedTotal_one": "Wybrano {{count}} szpulę",
|
||||
@@ -167,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",
|
||||
@@ -194,15 +243,21 @@
|
||||
"settings_bed_temp": "Temperatura stołu",
|
||||
"color_hex": "Kolor",
|
||||
"article_number": "Numer artykułu",
|
||||
"spools": "Zobacz szpule"
|
||||
"spools": "Zobacz szpule",
|
||||
"external_id": "Zewnętrzne ID",
|
||||
"single_color": "Pojedynczy",
|
||||
"multi_color": "Wielo",
|
||||
"longitudinal": "Wzdłużny",
|
||||
"coaxial": "Współwytłaczany"
|
||||
},
|
||||
"fields_help": {
|
||||
"material": "Np. PLA, ABS, PETG itp.",
|
||||
"price": "Cena pełnej szpuli w walucie skonfigurowanej przez system.",
|
||||
"price": "Cena pełnej szpuli.",
|
||||
"spool_weight": "Waga pustej szpuli. Używana do określenia ciężaru szpuli.",
|
||||
"article_number": "Np. EAN, UPC itp.",
|
||||
"name": "Nazwa filamentu, aby odróżnić ten typ filamentu od innych pochodzących od tego samego producenta. Powinna zawierać np. kolor.",
|
||||
"weight": "Waga filamentu na pełnej szpuli (waga netto). Nie powinno to obejmować wagi samej szpuli, a jedynie filamentu. Jest to zwykle napisane na opakowaniu."
|
||||
"weight": "Waga filamentu na pełnej szpuli (waga netto). Nie powinno to obejmować wagi samej szpuli, a jedynie filamentu. Jest to zwykle napisane na opakowaniu.",
|
||||
"multi_color_direction": "Filamenty mogą mieć wiele kolorów na dwa sposoby: Kolory mogą się ciągnąć równolegle na całej długości filamentu lub kolory filamentu mogą się zmieniać na długości filamentu."
|
||||
},
|
||||
"titles": {
|
||||
"create": "Tworzenie filamentu",
|
||||
@@ -213,7 +268,12 @@
|
||||
"show_title": "[Filament #{{id}}] {{name}}"
|
||||
},
|
||||
"form": {
|
||||
"filament_updated": "Ten filament został zaktualizowany przez kogoś/coś innego od czasu otwarcia tej strony. Zapisanie nadpisze te zmiany!"
|
||||
"filament_updated": "Ten filament został zaktualizowany przez kogoś/coś innego od czasu otwarcia tej strony. Zapisanie nadpisze te zmiany!",
|
||||
"import_external": "Importuj z zewnątrz",
|
||||
"import_external_description": "Wybierz filament z listy by automatycznie zpopulować jego informacje w formularzu tworzenia filamentu. Spowoduje to nadpisanie danych które wpisałeś już w formularzu. Producent zostanie automatycznie stworzony jeżeli klikniesz Ok, jeżeli będzie to wymagane."
|
||||
},
|
||||
"buttons": {
|
||||
"add_spool": "Dodaj Szpulę"
|
||||
}
|
||||
},
|
||||
"vendor": {
|
||||
@@ -222,18 +282,23 @@
|
||||
"id": "ID",
|
||||
"name": "Nazwa",
|
||||
"registered": "Zarejestrowano",
|
||||
"comment": "Komentarz"
|
||||
"comment": "Komentarz",
|
||||
"empty_spool_weight": "Waga pustej szpuli",
|
||||
"external_id": "Zewnętrzne ID"
|
||||
},
|
||||
"titles": {
|
||||
"create": "Tworzenie producenta",
|
||||
"clone": "Klonowanie producenta",
|
||||
"edit": "Edycja producenta",
|
||||
"create": "Stwórz producenta",
|
||||
"clone": "Sklonuj producenta",
|
||||
"edit": "Edytuj producenta",
|
||||
"list": "Producenci",
|
||||
"show": "Pokaż producenta",
|
||||
"show_title": "[Producent #{{id}}] {{name}}"
|
||||
},
|
||||
"form": {
|
||||
"vendor_updated": "Ten producent został zaktualizowany przez kogoś/coś innego od czasu otwarcia tej strony. Zapisanie spowoduje nadpisanie tych zmian!"
|
||||
},
|
||||
"fields_help": {
|
||||
"empty_spool_weight": "Waga pustej szpuli od tego producenta."
|
||||
}
|
||||
},
|
||||
"table": {
|
||||
@@ -244,7 +309,7 @@
|
||||
"suffix": " | Spoolman",
|
||||
"filament": {
|
||||
"list": "Filamenty | Spoolman",
|
||||
"edit": "#{{id}} Edycja filamentu | Spoolman",
|
||||
"edit": "#{{id}} Edytuj filament | Spoolman",
|
||||
"create": "Tworzenie filamentu | Spoolman",
|
||||
"clone": "#{{id}} Klonowanie filamentu | Spoolman",
|
||||
"show": "#{{id}} Filament | Spoolman"
|
||||
@@ -252,22 +317,25 @@
|
||||
"spool": {
|
||||
"list": "Szpule | Spoolman",
|
||||
"show": "#{{id}} Szpula | Spoolman",
|
||||
"edit": "#{{id}} Edycja szpuli | Spoolman",
|
||||
"edit": "#{{id}} Edytuj szpulę | Spoolman",
|
||||
"create": "Tworzenie szpuli | Spoolman",
|
||||
"clone": "#{{id}} Klonowanie szpuli | Spoolman"
|
||||
},
|
||||
"vendor": {
|
||||
"show": "#{{id}} Producent | Spoolman",
|
||||
"show": "#{{id}} Pokaż producenta | Spoolman",
|
||||
"list": "Producenci | Spoolman",
|
||||
"edit": "#{{id}} Edycja producenta | Spoolman",
|
||||
"create": "Tworzenie producenta | Spoolman",
|
||||
"clone": "#{{id}} Klonowanie producenta | Spoolman"
|
||||
"edit": "#{{id}} Edytuj producenta | Spoolman",
|
||||
"create": "Stwórz producenta | Spoolman",
|
||||
"clone": "#{{id}} Sklonuj producenta | Spoolman"
|
||||
},
|
||||
"home": {
|
||||
"list": "Strona główna | Spoolman"
|
||||
},
|
||||
"help": {
|
||||
"list": "Pomoc | Spoolman"
|
||||
},
|
||||
"locations": {
|
||||
"list": "Lokalizacje | Spoolman"
|
||||
}
|
||||
},
|
||||
"warnWhenUnsavedChanges": "Czy na pewno chcesz wyjść? Masz niezapisane zmiany.",
|
||||
@@ -277,10 +345,76 @@
|
||||
"filament": "Producenci filamentów. Mają takie właściwości, jak nazwa, materiał, kolor, średnica i inne.",
|
||||
"spool": "Indywidualne fizyczne szpule określonego filamentu."
|
||||
},
|
||||
"help": "Pomoc"
|
||||
"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"
|
||||
}
|
||||
"home": "Strona główna",
|
||||
"welcome": "Witaj w instancji Spoolman!",
|
||||
"description": "Wygląda na to, że nie dodano jeszcze żadnych szpul. Zobacz <helpPageLink>stronę pomocy</helpPageLink>, aby dowiedzieć się jak rozpocząć."
|
||||
},
|
||||
"settings": {
|
||||
"settings": "Ustawienia",
|
||||
"general": {
|
||||
"currency": {
|
||||
"label": "Waluta"
|
||||
},
|
||||
"tab": "Ogólne",
|
||||
"base_url": {
|
||||
"tooltip": "Bazowy URL zostanie użyty podczas generowania QR code oraz w innych funkcjonalnościach.",
|
||||
"label": "Bazowy URL"
|
||||
},
|
||||
"round_prices": {
|
||||
"tooltip": "Zaokrąglij ceny do najbliższej liczby całkowitej.",
|
||||
"label": "Zaokrąglone ceny"
|
||||
}
|
||||
},
|
||||
"extra_fields": {
|
||||
"tab": "Dodatkowe parametry",
|
||||
"boolean_true": "Tak",
|
||||
"boolean_false": "Nie",
|
||||
"params": {
|
||||
"name": "Nazwa",
|
||||
"field_type": "Typ",
|
||||
"unit": "Jednostka",
|
||||
"order": "Kolejność",
|
||||
"default_value": "Domyślna wartość",
|
||||
"key": "Klucz",
|
||||
"choices": "Wybory",
|
||||
"multi_choice": "Wielokrotny wybór"
|
||||
},
|
||||
"field_type": {
|
||||
"integer": "Liczba całkowita",
|
||||
"integer_range": "Zakres liczb",
|
||||
"float": "Liczba zmiennoprzecinkowa",
|
||||
"choice": "Wybór",
|
||||
"text": "Tekst",
|
||||
"float_range": "Zakres",
|
||||
"datetime": "Data i Czas",
|
||||
"boolean": "Wartość logiczna"
|
||||
},
|
||||
"non_unique_key_error": "Klucz musi być unikalny.",
|
||||
"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.",
|
||||
"choices_reorder_hint": "Przeciągnij lub użyj klawiszy strzałek, aby zmienić kolejność tej opcji."
|
||||
},
|
||||
"header": "Ustawienia"
|
||||
},
|
||||
"locations": {
|
||||
"locations": "Lokalizacje",
|
||||
"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"
|
||||
}
|
||||
@@ -0,0 +1,407 @@
|
||||
{
|
||||
"actions": {
|
||||
"list": "Listar",
|
||||
"create": "Criar",
|
||||
"edit": "Editar",
|
||||
"show": "Mostrar",
|
||||
"clone": "Clonar"
|
||||
},
|
||||
"buttons": {
|
||||
"create": "Criar",
|
||||
"save": "Salvar",
|
||||
"saveAndAdd": "Salvar e Adicionar",
|
||||
"logout": "Sair",
|
||||
"delete": "Excluir",
|
||||
"edit": "Editar",
|
||||
"cancel": "Cancelar",
|
||||
"confirm": "Você tem certeza?",
|
||||
"continue": "Continuar",
|
||||
"filter": "Filtrar",
|
||||
"clear": "Limpar",
|
||||
"refresh": "Atualizar",
|
||||
"show": "Mostrar",
|
||||
"undo": "Desfazer",
|
||||
"import": "Importar",
|
||||
"clone": "Clonar",
|
||||
"archive": "Arquivar",
|
||||
"unArchive": "Desarquivar",
|
||||
"hideArchived": "Ocultar Arquivados",
|
||||
"showArchived": "Mostrar Arquivados",
|
||||
"notAccessTitle": "Você não tem permissão para acessar",
|
||||
"hideColumns": "Ocultar Colunas",
|
||||
"clearFilters": "Limpar Filtros"
|
||||
},
|
||||
"warnWhenUnsavedChanges": "Você tem certeza que deseja sair? Você tem alterações não salvas.",
|
||||
"notifications": {
|
||||
"success": "Sucesso",
|
||||
"error": "Erro (código de status: {{statusCode}})",
|
||||
"undoable": "Você tem {{seconds}} segundos para desfazer.",
|
||||
"createSuccess": "{{resource}} criado com sucesso",
|
||||
"createError": "Ocorreu um erro ao criar {{resource}} (código de status: {{statusCode}})",
|
||||
"deleteSuccess": "{{resource}} excluído com sucesso",
|
||||
"deleteError": "Erro ao excluir {{resource}} (código de status: {{statusCode}})",
|
||||
"editSuccess": "{{resource}} editado com sucesso",
|
||||
"editError": "Erro ao editar {{resource}} (código de status: {{statusCode}})",
|
||||
"importProgress": "Importando: {{processed}}/{{total}}",
|
||||
"saveSuccessful": "Salvo com sucesso!",
|
||||
"validationError": "Erro de validação: {{error}}"
|
||||
},
|
||||
"kofi": "Doe pelo Ko-fi",
|
||||
"loading": "Carregando",
|
||||
"version": "Versão",
|
||||
"unknown": "Desconhecido",
|
||||
"yes": "Sim",
|
||||
"no": "Não",
|
||||
"tags": {
|
||||
"clone": "Clonar"
|
||||
},
|
||||
"dashboard": {
|
||||
"title": "Painel"
|
||||
},
|
||||
"printing": {
|
||||
"generic": {
|
||||
"title": "Imprimindo",
|
||||
"description": "Ajuste as configurações abaixo para obter o layout de impressão desejado. Tenha em mente que as impressoras e o seu sistema operacional podem aplicar suas próprias margens e dimensionamento, portanto, pode ser necessário realizar algumas tentativas e erros antes que tudo esteja correto. Teste em um papel comum antes de imprimir nas etiquetas reais.",
|
||||
"helpMargin": "As margens devem ser configuradas para corresponder às suas etiquetas e impressora. Alterá-las afetará o tamanho de toda a grade.",
|
||||
"helpPrinterMargin": "A Zona de Segurança deve ser definida para o quão próximo da borda do papel sua impressora pode imprimir. Alterá-la não afetará toda a grade.",
|
||||
"print": "Imprimir",
|
||||
"columns": "Colunas",
|
||||
"rows": "Linhas",
|
||||
"paperSize": "Tamanho do Papel",
|
||||
"customSize": "Personalizado",
|
||||
"dimensions": "Dimensões",
|
||||
"showBorder": "Mostrar Borda",
|
||||
"previewScale": "Escala da Pré-visualização",
|
||||
"skipItems": "Pular Itens",
|
||||
"itemCopies": "Cópias do Item",
|
||||
"contentSettings": "Configurações de Conteúdo",
|
||||
"layoutSettings": "Configurações de Layout",
|
||||
"horizontalSpacing": "Espaçamento Horizontal",
|
||||
"verticalSpacing": "Espaçamento Vertical",
|
||||
"marginLeft": "Margem Esquerda",
|
||||
"marginRight": "Margem Direita",
|
||||
"marginTop": "Margem Superior",
|
||||
"marginBottom": "Margem Inferior",
|
||||
"printerMarginLeft": "Zona de Segurança Esquerda",
|
||||
"printerMarginRight": "Zona de Segurança Direita",
|
||||
"printerMarginTop": "Zona de Segurança Superior",
|
||||
"printerMarginBottom": "Zona de Segurança Inferior",
|
||||
"borders": {
|
||||
"none": "Nenhuma",
|
||||
"border": "Borda",
|
||||
"grid": "Grade"
|
||||
},
|
||||
"settings": "Predefinições",
|
||||
"defaultSettings": "Padrão",
|
||||
"addSettings": "Adicionar Nova Predefinição",
|
||||
"newSetting": "Novo",
|
||||
"duplicateSettings": "Duplicar",
|
||||
"deleteSettings": "Excluir Predefinição Atual",
|
||||
"deleteSettingsConfirm": "Tem certeza de que deseja excluir esta predefinição?",
|
||||
"settingsName": "Nome da Predefinição",
|
||||
"saveSetting": "Salvar Predefinições",
|
||||
"saveAsImage": "Salvar como Imagem"
|
||||
},
|
||||
"qrcode": {
|
||||
"button": "Imprimir Etiquetas",
|
||||
"title": "Impressão de Etiquetas",
|
||||
"template": "Modelo de Etiqueta",
|
||||
"templateHelp": "Use \"{tag}\" para inserir valores do objeto carretel como texto. Por exemplo, {id} será substituído pelo valor do \"id\" do carretel ou {filament.material} será substituído pelo material do carretel. Se um valor estiver faltando, ele será substituído por \"?\". Um segundo conjunto de chaves, exemplo \"{{tag}}\", pode ser usado para remover isso. Além disso, qualquer texto entre os conjuntos de chaves será removido se o valor não existir. Por exemplo, {Lote Nº: {lot_nr}} só mostrará o rótulo se o carretel tiver um número de lote. Coloque o texto com asterisco duplo ** para colocar em negrito. Clique no botão ao lado para ver uma lista de todas as tags disponíveis.",
|
||||
"textSize": "Tamanho do Texto da Etiqueta",
|
||||
"showContent": "Imprimir Etiqueta",
|
||||
"useHTTPUrl": {
|
||||
"label": "Endereço do código QR",
|
||||
"tooltip": "Usará um endereço proprietário que funcionará somente se digitalizado a partir do recurso de digitalização do Spoolman (padrão). O URL usa o URL Base, especificada nas Configurações, ou o URL da página atual se nenhuma estiver definida.",
|
||||
"options": {
|
||||
"default": "Padrão",
|
||||
"url": "URL"
|
||||
},
|
||||
"preview": "Pré-visualização:"
|
||||
},
|
||||
"showQRCode": "Imprimir Código QR",
|
||||
"showQRCodeMode": {
|
||||
"no": "Não",
|
||||
"simple": "Simples",
|
||||
"withIcon": "Com Ícone"
|
||||
}
|
||||
},
|
||||
"spoolSelect": {
|
||||
"title": "Selecionar Carretéis",
|
||||
"description": "Selecione os carretéis para imprimir suas etiquetas.",
|
||||
"showArchived": "Mostrar Arquivado",
|
||||
"noSpoolsSelected": "Você não selecionou algum dos carretéis.",
|
||||
"selectAll": "Selecionar/Desselecionar Tudo",
|
||||
"selectedTotal_one": "{{count}} carretel selecionado",
|
||||
"selectedTotal_many": "{{count}} carretéis selecionados",
|
||||
"selectedTotal_other": "{{count}} carretéis selecionados"
|
||||
}
|
||||
},
|
||||
"scanner": {
|
||||
"title": "Leitor de Código QR",
|
||||
"description": "Escaneie um código QR do Spoolman para ver detalhes sobre o carretel.",
|
||||
"error": {
|
||||
"notAllowed": "Você não deu permissão de acesso à câmera.",
|
||||
"insecureContext": "A página não é servida por HTTPS.",
|
||||
"streamApiNotSupported": "O navegador não oferece suporte à API MediaStream.",
|
||||
"notReadable": "A câmera não está legível.",
|
||||
"notFound": "Nenhuma câmera foi encontrada.",
|
||||
"unknown": "Ocorreu um erro desconhecido. ({{error}})"
|
||||
}
|
||||
},
|
||||
"spool": {
|
||||
"spool": "Carretéis",
|
||||
"fields": {
|
||||
"id": "ID",
|
||||
"filament_name": "Filamento",
|
||||
"filament": "Filamento",
|
||||
"filament_internal": "Interno",
|
||||
"filament_external": "Externo",
|
||||
"price": "Preço",
|
||||
"material": "Material",
|
||||
"weight_to_use": "Peso",
|
||||
"used_weight": "Peso Utilizado",
|
||||
"remaining_weight": "Peso Restante",
|
||||
"measured_weight": "Peso Medido",
|
||||
"used_length": "Comprimento Usado",
|
||||
"remaining_length": "Comprimento Restante",
|
||||
"initial_weight": "Peso Inicial",
|
||||
"spool_weight": "Peso sem Filamento",
|
||||
"location": "Localização",
|
||||
"lot_nr": "Número do Lote",
|
||||
"first_used": "Primeiro Uso",
|
||||
"last_used": "Último Uso",
|
||||
"registered": "Registrado",
|
||||
"comment": "Comentário",
|
||||
"archived": "Arquivado"
|
||||
},
|
||||
"fields_help": {
|
||||
"price": "Preço de um carretel cheio. Se não for definido, o preço do filamento será assumido.",
|
||||
"weight_to_use": "Selecione que tipo de valor de peso inserir. O \"Peso Medido\" só estará disponível se o peso do carretel estiver definido para o filamento selecionado.",
|
||||
"used_weight": "Quanto filamento foi usado do carretel. Um novo carretel deve ter 0g usado.",
|
||||
"remaining_weight": "Quanto filamento resta no carretel. Para um carretel novo, isso deve corresponder ao peso do carretel.",
|
||||
"measured_weight": "Quanto pesa o filamento e o carretel.",
|
||||
"initial_weight": "O peso inicial do filamento no carretel (peso líquido). Caso não seja especificado, será usado o peso da definição do filamento.",
|
||||
"spool_weight": "O peso do carretel vazio. Deixe em branco para utilizar o valor do filamento ou do fabricante.",
|
||||
"location": "Onde o carretel está localizado se você tiver vários locais onde armazena seus carretéis.",
|
||||
"lot_nr": "Número de lote do fabricante. Pode ser usado para garantir que uma impressão tenha cores consistentes se vários carretéis forem usados.",
|
||||
"external_filament": "Você selecionou um filamento do banco de dados externo. Um objeto de filamento (e possivelmente um objeto de fabricante) será criado automaticamente quando você criar este carretel. Isso pode criar objetos de filamento duplicados se você já tiver criado um objeto de filamento para esse filamento."
|
||||
},
|
||||
"titles": {
|
||||
"create": "Criar Carretel",
|
||||
"clone": "Clonar Carretel",
|
||||
"edit": "Editar Carretel",
|
||||
"list": "Carretéis",
|
||||
"show": "Mostrar Carretel",
|
||||
"show_title": "[Carretel #{{id}}] {{name}}",
|
||||
"archive": "Arquivar Carretel",
|
||||
"adjust": "Ajustar Filamento no Carretel"
|
||||
},
|
||||
"form": {
|
||||
"measurement_type": {
|
||||
"length": "Comprimento",
|
||||
"weight": "Peso"
|
||||
},
|
||||
"measurement_type_label": "Tipo de Medida",
|
||||
"adjust_filament_help": "Aqui você pode adicionar ou subtrair filamento diretamente do carretel. Um valor positivo consumirá filamento, um valor negativo adicionará filamento.",
|
||||
"adjust_filament_value": "Quantidade Consumida",
|
||||
"new_location_prompt": "Insira um novo local",
|
||||
"spool_updated": "Este carretel foi atualizado por alguém/outra coisa desde que você abriu esta página. Salvar irá sobrescrever essas alterações!"
|
||||
},
|
||||
"messages": {
|
||||
"archive": "Tem certeza de que deseja arquivar este carretel?"
|
||||
},
|
||||
"formats": {
|
||||
"last_used": "Última utilização em {{date}}"
|
||||
}
|
||||
},
|
||||
"filament": {
|
||||
"filament": "Filamentos",
|
||||
"fields": {
|
||||
"id": "ID",
|
||||
"vendor_name": "Fabricante",
|
||||
"vendor": "Fabricante",
|
||||
"name": "Nome",
|
||||
"material": "Material",
|
||||
"price": "Preço",
|
||||
"density": "Densidade",
|
||||
"diameter": "Diâmetro",
|
||||
"weight": "Peso",
|
||||
"spool_weight": "Peso do Carretel",
|
||||
"article_number": "Número do Artigo",
|
||||
"registered": "Registrado",
|
||||
"comment": "Comentário",
|
||||
"settings_extruder_temp": "Temperatura da Extrusora",
|
||||
"settings_bed_temp": "Temperatura da Mesa",
|
||||
"color_hex": "Cor",
|
||||
"single_color": "Única",
|
||||
"multi_color": "Múltiplas",
|
||||
"coaxial": "Coextrusada",
|
||||
"longitudinal": "Longitudinal",
|
||||
"external_id": "ID Externo",
|
||||
"spools": "Mostrar Carretéis"
|
||||
},
|
||||
"fields_help": {
|
||||
"name": "Nome do filamento, para distinguir este tipo de filamento entre outros do mesmo fabricante. Deve conter a cor, por exemplo.",
|
||||
"material": "Por exemplo: PLA, ABS, PETG, etc.",
|
||||
"price": "Preço de um carretel cheio.",
|
||||
"weight": "O peso do filamento de um carretel cheio (peso líquido). Isso não deve incluir o peso do carretel em si, apenas o filamento. É o que normalmente está escrito na embalagem.",
|
||||
"spool_weight": "O peso de um carretel vazio. Usado para determinar o peso medido de um carretel.",
|
||||
"article_number": "Por exemplo: EAN, UPC, etc.",
|
||||
"multi_color_direction": "Os filamentos podem ter múltiplas cores de duas maneiras: por meio de coextrusão, como os filamentos bicolores com as cores consistentes ao longo do carretel, ou por meio de mudanças longitudinais de cor, como os filamentos gradientes que mudam as cores ao longo do carretel."
|
||||
},
|
||||
"titles": {
|
||||
"create": "Criar Filamento",
|
||||
"clone": "Clonar Filamento",
|
||||
"edit": "Editar Filamento",
|
||||
"list": "Filamentos",
|
||||
"show": "Mostrar Filamento",
|
||||
"show_title": "[Filamento #{{id}}] {{name}}"
|
||||
},
|
||||
"form": {
|
||||
"filament_updated": "Este filamento foi atualizado por alguém/outra coisa desde que você abriu esta página. Salvar irá sobrescrever essas alterações!",
|
||||
"import_external": "Importar do Exterior",
|
||||
"import_external_description": "Selecione um filamento na lista para preencher automaticamente seus detalhes no formulário de criação de filamento. Isso substituirá quaisquer dados que você inseriu no formulário.<br><br>Um objeto Fabricante será criado automaticamente quando você clicar em OK, se necessário."
|
||||
},
|
||||
"buttons": {
|
||||
"add_spool": "Adicionar Carretel"
|
||||
}
|
||||
},
|
||||
"vendor": {
|
||||
"vendor": "Fabricantes",
|
||||
"fields": {
|
||||
"id": "ID",
|
||||
"name": "Nome",
|
||||
"empty_spool_weight": "Peso do Carretel Vazio",
|
||||
"external_id": "ID Externo",
|
||||
"registered": "Registrado",
|
||||
"comment": "Comentário"
|
||||
},
|
||||
"fields_help": {
|
||||
"empty_spool_weight": "O peso de um carretel vazio deste fabricante."
|
||||
},
|
||||
"titles": {
|
||||
"create": "Criar Fabricante",
|
||||
"clone": "Clonar Fabricante",
|
||||
"edit": "Editar Fabricante",
|
||||
"list": "Fabricantes",
|
||||
"show": "Mostrar Fabricante",
|
||||
"show_title": "[Fabricante #{{id}}] {{name}}"
|
||||
},
|
||||
"form": {
|
||||
"vendor_updated": "Este fabricante foi atualizado por alguém/alguma coisa desde que você abriu esta página. Salvar sobrescreverá essas alterações!"
|
||||
}
|
||||
},
|
||||
"home": {
|
||||
"home": "Início",
|
||||
"welcome": "Bem-vindo à sua instância do Spoolman!",
|
||||
"description": "Parece que você ainda não adicionou nenhum carretel. Veja a <helpPageLink>Página de Ajuda</helpPageLink> para obter ajuda sobre como começar."
|
||||
},
|
||||
"help": {
|
||||
"help": "Ajuda",
|
||||
"resources": {
|
||||
"filament": "Marcas de filamento. Elas têm propriedades como nome, material, cor, diâmetro e mais.",
|
||||
"spool": "Carretéis físicos individuais de um filamento específico.",
|
||||
"vendor": "As empresas que fabricam o filamento."
|
||||
},
|
||||
"description": "<title>Ajuda</title><p>Aqui estão algumas dicas para você começar.</p><p>O Spoolman contém três tipos diferentes de dados:</p><itemsHelp/><p>Para adicionar um novo carretel para o banco de dados, comece criando um objeto <filamentCreateLink>Filamento</filamentCreateLink>. Feito isso, prossiga para criar um objeto <spoolCreateLink>Carretel</spoolCreateLink> para esse carretel específico. Se você adquirir carretéis adicionais do mesmo filamento posteriormente, simplesmente crie carretéis adicionais e reutilize o mesmo objeto Filamento.</p><p>Opcionalmente, você também pode gerar um objeto <vendorCreateLink>Fabricante</vendorCreateLink> para a empresa que fabrica o filamento, se você desejar rastrear essas informações.</p><p>Você tem a opção de vincular outros serviços de impressora 3D ao Spoolman, como o Moonraker, o qual pode automaticamente monitorar o uso do filamento e atualizar os carretéis para você. Consulte o <readmeLink>LEIA-ME do Spoolman</readmeLink> para obter orientação sobre como configurar isso.</p>"
|
||||
},
|
||||
"table": {
|
||||
"actions": "Ações"
|
||||
},
|
||||
"settings": {
|
||||
"settings": "Configurações",
|
||||
"header": "Configurações",
|
||||
"general": {
|
||||
"tab": "Geral",
|
||||
"currency": {
|
||||
"label": "Moeda"
|
||||
},
|
||||
"base_url": {
|
||||
"label": "URL Base",
|
||||
"tooltip": "A URL base a ser usada ao gerar recursos como códigos QR."
|
||||
},
|
||||
"round_prices": {
|
||||
"label": "Arredondar preços",
|
||||
"tooltip": "Arredonda os preços para o número inteiro mais próximo."
|
||||
}
|
||||
},
|
||||
"extra_fields": {
|
||||
"tab": "Campos Extras",
|
||||
"description": "<p>Aqui você pode adicionar campos personalizados extras às suas entidades.</p><p>Depois que um campo é adicionado, você não pode alterar sua chave ou tipo, e para campos do tipo \"escolha\" você não pode remover as opções ou alterar o estado de \"múltipla de escolha\". Se você remover um campo, os dados associados a ele em todas as entidades serão excluídos.</p><p>A chave é como outros programas leem/gravam os dados, portanto, se o seu campo personalizado for para uma integração com um programa de terceiros, certifique-se de configurá-lo corretamente. O valor padrão é aplicado somente a novos itens.</p><p>Campos extras não podem ser ordenados ou filtrados nas visualizações de tabela.</p>",
|
||||
"params": {
|
||||
"key": "Chave",
|
||||
"name": "Nome",
|
||||
"field_type": "Tipo",
|
||||
"unit": "Unidade",
|
||||
"order": "Ordem",
|
||||
"default_value": "Valor Padrão",
|
||||
"choices": "Opções",
|
||||
"multi_choice": "Múltipla Escolha"
|
||||
},
|
||||
"field_type": {
|
||||
"text": "Texto",
|
||||
"integer": "Inteiro",
|
||||
"integer_range": "Intervalo de Inteiros",
|
||||
"float": "Decimal",
|
||||
"float_range": "Intervalo Decimal",
|
||||
"datetime": "Data e Hora",
|
||||
"boolean": "Booleano",
|
||||
"choice": "Opção"
|
||||
},
|
||||
"boolean_true": "Sim",
|
||||
"boolean_false": "Não",
|
||||
"choices_missing_error": "Você não pode remover as opções. As seguintes opções estão faltando: {{choices}}",
|
||||
"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.",
|
||||
"choices_reorder_hint": "Arraste, ou use as setas direcionais, para reordenar essa opção."
|
||||
}
|
||||
},
|
||||
"documentTitle": {
|
||||
"default": "Spoolman",
|
||||
"suffix": " | Spoolman",
|
||||
"home": {
|
||||
"list": "Início | Spoolman"
|
||||
},
|
||||
"help": {
|
||||
"list": "Ajuda | Spoolman"
|
||||
},
|
||||
"locations": {
|
||||
"list": "Locais | Spoolman"
|
||||
},
|
||||
"filament": {
|
||||
"list": "Filamentos | Spoolman",
|
||||
"show": "Mostrar Filamento #{{id}} | Spoolman",
|
||||
"edit": "Editar Filamento #{{id}} | Spoolman",
|
||||
"create": "Criar Filamento | Spoolman",
|
||||
"clone": "Clonar Filamento #{{id}} | Spoolman"
|
||||
},
|
||||
"spool": {
|
||||
"list": "Carretéis | Spoolman",
|
||||
"show": "Mostrar Carretel #{{id}} | Spoolman",
|
||||
"edit": "Editar Carretel #{{id}} | Spoolman",
|
||||
"create": "Criar Carretel | Spoolman",
|
||||
"clone": "Clonar Carretel #{{id}} | Spoolman"
|
||||
},
|
||||
"vendor": {
|
||||
"list": "Fabricantes | Spoolman",
|
||||
"show": "Mostrar Fabricante #{{id}} | Spoolman",
|
||||
"edit": "Editar Fabricante #{{id}} | Spoolman",
|
||||
"create": "Criar Fabricante | Spoolman",
|
||||
"clone": "Clonar Fabricante #{{id}} | Spoolman"
|
||||
}
|
||||
},
|
||||
"locations": {
|
||||
"locations": "Locais",
|
||||
"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"
|
||||
}
|
||||
}
|
||||
@@ -7,12 +7,12 @@
|
||||
"edit": "Editar"
|
||||
},
|
||||
"buttons": {
|
||||
"save": "Salvar",
|
||||
"save": "Guardar",
|
||||
"logout": "Sair",
|
||||
"delete": "Excluir",
|
||||
"edit": "Editar",
|
||||
"cancel": "Cancelar",
|
||||
"confirm": "Tem certeza?",
|
||||
"confirm": "Tem a certeza?",
|
||||
"filter": "Filtrar",
|
||||
"clear": "Limpar",
|
||||
"refresh": "Atualizar",
|
||||
@@ -22,26 +22,29 @@
|
||||
"clone": "Clonar",
|
||||
"archive": "Arquivar",
|
||||
"unArchive": "Desarquivar",
|
||||
"hideArchived": "Ocultar arquivados",
|
||||
"showArchived": "Mostrar arquivado",
|
||||
"notAccessTitle": "Você não tem permissão para acessar",
|
||||
"hideColumns": "Ocultar colunas",
|
||||
"clearFilters": "Limpar filtros",
|
||||
"hideArchived": "Ocultar Arquivados",
|
||||
"showArchived": "Mostrar Arquivados",
|
||||
"notAccessTitle": "Não tem permissão para aceder",
|
||||
"hideColumns": "Ocultar Colunas",
|
||||
"clearFilters": "Limpar Filtros",
|
||||
"create": "Criar",
|
||||
"saveAndAdd": "Salvar e adicionar"
|
||||
"saveAndAdd": "Guardar e Adicionar",
|
||||
"continue": "Continuar"
|
||||
},
|
||||
"warnWhenUnsavedChanges": "Você tem certeza de que quer sair? Você tem alterações não salvas.",
|
||||
"warnWhenUnsavedChanges": "Tem certeza de que quer sair? Tem alterações não guardadas.",
|
||||
"notifications": {
|
||||
"success": "Sucesso",
|
||||
"error": "Erro (código de status: {{statusCode}})",
|
||||
"undoable": "Você tem {{seconds}} segundos para desfazer.",
|
||||
"undoable": "Tem {{seconds}} segundos para desfazer.",
|
||||
"createSuccess": "{{resource}} criado com sucesso",
|
||||
"createError": "Ocorreu um erro ao criar {{resource}} (código de status: {{statusCode}})",
|
||||
"deleteSuccess": "{{resource}} excluído com sucesso",
|
||||
"deleteError": "Erro ao excluir {{resource}} (código de status: {{statusCode}})",
|
||||
"editSuccess": "{{resource}} editado com sucesso",
|
||||
"editError": "Erro ao editar {{resource}} (código de status: {{statusCode}})",
|
||||
"importProgress": "Importando: {{processed}}/{{total}}"
|
||||
"importProgress": "Importando: {{processed}}/{{total}}",
|
||||
"saveSuccessful": "Guardado com sucesso!",
|
||||
"validationError": "Erro de validação: {{error}}"
|
||||
},
|
||||
"kofi": "Doe no Ko-fi",
|
||||
"loading": "Carregando",
|
||||
@@ -52,195 +55,259 @@
|
||||
"clone": "Clonar"
|
||||
},
|
||||
"dashboard": {
|
||||
"title": "Dashboard"
|
||||
"title": "Painel"
|
||||
},
|
||||
"printing": {
|
||||
"generic": {
|
||||
"title": "Imprimindo",
|
||||
"helpMargin": "As margens devem ser configuradas para corresponder ao papel de etiqueta e à impressora. Alterá-las afetará o tamanho de toda a grade.",
|
||||
"helpMargin": "As margens devem ser configuradas para corresponder à sua etiqueta de papel e à impressora. Alterá-las afetará o tamanho de toda a grade.",
|
||||
"helpPrinterMargin": "A zona segura deve ser definida para o quão próximo da borda do papel sua impressora pode imprimir, alterá-la não afetará toda a grade.",
|
||||
"previewScale": "Visualizar escala",
|
||||
"skipItems": "Pular itens",
|
||||
"horizontalSpacing": "Espaçamento horizontal",
|
||||
"marginRight": "Margem direita",
|
||||
"marginTop": "Margem superior",
|
||||
"description": "Ajuste as configurações abaixo para o layout de impressão desejado. Tenha em mente que as impressoras e o seu SO podem aplicar suas próprias margens e dimensionamento, portanto, pode ser necessário realizar algumas tentativas e erros antes que tudo esteja correto. Teste em um pedaço de papel comum antes de imprimir nas etiquetas reais.",
|
||||
"previewScale": "Visualizar Escala",
|
||||
"skipItems": "Pular Itens",
|
||||
"horizontalSpacing": "Espaçamento Horizontal",
|
||||
"marginRight": "Margem Direita",
|
||||
"marginTop": "Margem Superior",
|
||||
"description": "Ajuste as configurações abaixo para obter o layout de impressão desejado. Tenha em mente que impressoras e sistemas operacionais podem aplicar suas próprias margens e escalonamento, portanto, pode ser necessário fazer algumas tentativas antes que tudo estaja correto. Teste em uma folha de papel comum antes de imprimir nas etiquetas reais.",
|
||||
"print": "Imprimir",
|
||||
"columns": "Colunas",
|
||||
"dimensions": "Dimensões",
|
||||
"contentSettings": "Configurações de conteúdo",
|
||||
"layoutSettings": "Configurações de layout",
|
||||
"contentSettings": "Configurações de Conteúdo",
|
||||
"layoutSettings": "Configurações de Layout",
|
||||
"rows": "Linhas",
|
||||
"paperSize": "Tamanho do papel",
|
||||
"paperSize": "Tamanho do Papel",
|
||||
"customSize": "Personalizado",
|
||||
"showBorder": "Mostrar borda",
|
||||
"verticalSpacing": "Espaçamento vertical",
|
||||
"marginLeft": "Margem esquerda",
|
||||
"marginBottom": "Margem inferior",
|
||||
"printerMarginBottom": "Zona segura inferior",
|
||||
"printerMarginLeft": "Zona segura esquerda",
|
||||
"printerMarginRight": "Zona segura direita",
|
||||
"showBorder": "Mostrar Borda",
|
||||
"verticalSpacing": "Espaçamento Vertical",
|
||||
"marginLeft": "Margem Esquerda",
|
||||
"marginBottom": "Margem Inferior",
|
||||
"printerMarginBottom": "Área Segura Inferior",
|
||||
"printerMarginLeft": "Área Segura Esquerda",
|
||||
"printerMarginRight": "Área Segura Direita",
|
||||
"borders": {
|
||||
"none": "Nenhuma",
|
||||
"border": "Borda",
|
||||
"grid": "Grade"
|
||||
},
|
||||
"printerMarginTop": "Zona segura superior"
|
||||
"printerMarginTop": "Área Segura Superior",
|
||||
"settings": "Pré-definições",
|
||||
"defaultSettings": "Por omissão",
|
||||
"addSettings": "Adicionar Pré-Definição",
|
||||
"newSetting": "Novo",
|
||||
"deleteSettings": "Remover Pré-definição Actual",
|
||||
"deleteSettingsConfirm": "Tem a certeza que pretender remover esta pré-definição?",
|
||||
"settingsName": "Nome da Pré-definição",
|
||||
"itemCopies": "Cópias do Artigo",
|
||||
"duplicateSettings": "Duplicar",
|
||||
"saveSetting": "Guardar Pré-definições",
|
||||
"saveAsImage": "Guardar como Imagem"
|
||||
},
|
||||
"spoolSelect": {
|
||||
"selectedTotal_one": "{{count}} carretel selecionado",
|
||||
"selectedTotal_many": "{{count}} carretéis selecionados",
|
||||
"selectedTotal_other": "{{count}} carretéis selecionados",
|
||||
"noSpoolsSelected": "Você não selecionou nenhum carretel.",
|
||||
"title": "Selecionar carretéis",
|
||||
"description": "Selecione carretéis para imprimir códigos QR.",
|
||||
"showArchived": "Mostrar arquivado",
|
||||
"selectAll": "Selecionar/desmarcar tudo"
|
||||
"selectedTotal_one": "{{count}} bobine selecionado",
|
||||
"selectedTotal_many": "{{count}} bobines selecionados",
|
||||
"selectedTotal_other": "{{count}} bobines selecionados",
|
||||
"noSpoolsSelected": "Não selecionou nenhuma bobine.",
|
||||
"title": "Selecionar Bobines",
|
||||
"description": "Selecione as bobines para imprimir as etiquetas.",
|
||||
"showArchived": "Mostrar Arquivado",
|
||||
"selectAll": "Selecionar/Desmarcar Tudo"
|
||||
},
|
||||
"qrcode": {
|
||||
"title": "Imprimindo códigos QR",
|
||||
"button": "Imprimir códigos QR",
|
||||
"spoolWeight": "Peso do carretel: {{weight}}",
|
||||
"lotNr": "Número do lote: {{lot}}",
|
||||
"bedTemp": "Temperatura da mesa: {{temp}}",
|
||||
"extruderTemp": "Temperatura do bico: {{temp}}",
|
||||
"textSize": "Tamanho do texto do conteúdo",
|
||||
"title": "Impressão de Etiqueta",
|
||||
"button": "Imprimir Etiquetas",
|
||||
"spoolWeight": "Peso do Carretel: {{weight}}",
|
||||
"lotNr": "Número do Lote: {{lot}}",
|
||||
"bedTemp": "Temperatura da Mesa: {{temp}}",
|
||||
"extruderTemp": "Temperatura do Bico: {{temp}}",
|
||||
"textSize": "Tamanho do Texto da Etiqueta",
|
||||
"showSpoolmanIcon": "Mostrar ícone do Spoolman",
|
||||
"showVendor": "Fornecedor",
|
||||
"showContent": "Etiqueta de impressão",
|
||||
"showLotNr": "Número do lote",
|
||||
"showSpoolWeight": "Peso do carretel",
|
||||
"showVendor": "Fabricante",
|
||||
"showContent": "Imprimir Etiqueta",
|
||||
"showLotNr": "Número do Lote",
|
||||
"showSpoolWeight": "Peso do Carretel",
|
||||
"showTemperatures": "Temperaturas",
|
||||
"showSpoolComment": "Comentário do carretel",
|
||||
"showFilamentComment": "Comentário de filamento",
|
||||
"showVendorComment": "Comentário do fornecedor"
|
||||
"showSpoolComment": "Comentário sobre o Carretel",
|
||||
"showFilamentComment": "Comentário sobre o Filamento",
|
||||
"showVendorComment": "Comentário sobre o Fabricante",
|
||||
"template": "Modelo de Etiqueta",
|
||||
"templateHelp": "Use {} para incluir valores da bobine como texto. Por exemplo {id} será substituído pelo ID da bobine, ou {filament.material} será substituído pelo material da bobine. Coloque texto entre duplos asteriscos ** para colocar a negrito. Pressione o botão para ver a lista de etiquetas disponíveis.",
|
||||
"showQRCode": "Imprimir Código QR",
|
||||
"showQRCodeMode": {
|
||||
"no": "Não",
|
||||
"simple": "Simples",
|
||||
"withIcon": "Com Ícone"
|
||||
},
|
||||
"useHTTPUrl": {
|
||||
"label": "Endereço do Código QR",
|
||||
"options": {
|
||||
"url": "Endereço",
|
||||
"default": "Por omissão"
|
||||
},
|
||||
"preview": "Pré-visualização:",
|
||||
"tooltip": "Irá usar um endereço proprietário que funcionará apenas se for lido pela funcionalidade do Spoolman. O endereço usará o endereço base definido nas configurações ou, caso não esteja definido, o endereço da página actual."
|
||||
}
|
||||
}
|
||||
},
|
||||
"spool": {
|
||||
"fields": {
|
||||
"material": "Material",
|
||||
"weight_to_use": "Peso",
|
||||
"used_weight": "Peso usado",
|
||||
"remaining_weight": "Peso restante",
|
||||
"measured_weight": "Peso medido",
|
||||
"used_length": "Comprimento usado",
|
||||
"remaining_length": "Comprimento restante",
|
||||
"used_weight": "Peso Utilizado",
|
||||
"remaining_weight": "Peso Restante",
|
||||
"measured_weight": "Peso Medido",
|
||||
"used_length": "Comprimento Usado",
|
||||
"remaining_length": "Comprimento Restante",
|
||||
"location": "Localização",
|
||||
"lot_nr": "Número do lote",
|
||||
"first_used": "Usado pela primeira vez",
|
||||
"last_used": "Usado por último",
|
||||
"lot_nr": "Número do Lote",
|
||||
"first_used": "Primeiro Uso",
|
||||
"last_used": "Último Uso",
|
||||
"registered": "Registrado",
|
||||
"comment": "Comentário",
|
||||
"archived": "Arquivado",
|
||||
"id": "ID",
|
||||
"filament_name": "Filamento",
|
||||
"filament": "Filamento",
|
||||
"price": ""
|
||||
"price": "Preço",
|
||||
"initial_weight": "Peso Inicial",
|
||||
"spool_weight": "Peso sem Filamento",
|
||||
"filament_internal": "Interno",
|
||||
"filament_external": "Externo"
|
||||
},
|
||||
"fields_help": {
|
||||
"weight_to_use": "Selecione qual valor de peso inserir. O peso medido só estará disponível se o peso do carretel estiver definido para o filamento selecionado.",
|
||||
"lot_nr": "Número de lote do fabricante. Pode ser usado para garantir que uma impressão tenha cores consistentes se vários carretéis forem usados.",
|
||||
"used_weight": "Quanto filamento foi usado no carretel. Um novo carretel deve ter 0g usado.",
|
||||
"remaining_weight": "Quanto filamento resta no carretel. Para um carretel novo, isso deve corresponder ao peso do carretel.",
|
||||
"measured_weight": "Quanto pesa o filamento e o carretel.",
|
||||
"location": "Onde o carretel está localizado se você tiver vários locais onde armazena seus carretéis.",
|
||||
"price": ""
|
||||
"weight_to_use": "Selecione qual o valor de peso a inserir. O peso medido só estará disponível se o peso da bobine estiver definido para o filamento selecionado.",
|
||||
"lot_nr": "Número de lote do fabricante. Pode ser usado para garantir que uma impressão tenha cores consistentes se várias bobines forem usadas.",
|
||||
"used_weight": "Quanto filamento foi usado da bobine. Uma nova bobine deve ter usado 0g.",
|
||||
"remaining_weight": "Quanto filamento resta na bobine. Para uma bobine nova, deve corresponder ao peso da bobine.",
|
||||
"measured_weight": "Quanto pesa o filamento e a bobine.",
|
||||
"location": "Onde a bobine está localizado se tiver vários locais onde armazena as suas bobines.",
|
||||
"price": "Preço de uma bobine completa na moeda definida no sistema. Se não for definido, o preço do filamento será presumido.",
|
||||
"initial_weight": "O peso inicial do filamento sem o peso da bobine (peso liquido). Se nada for indicado, será usado o peso da definição do filamento.",
|
||||
"spool_weight": "O peso da bobine vazia. Deixe em branco para usar o valor do filamento ou do fabricante.",
|
||||
"external_filament": "Escolheu um filamento de uma base de dados externa. O filamento (e possivelmente o fabricante) será criado automaticamente quando for criada a bobine. Isto poderá criar filamentos duplicados caso já tenha criado um filamento para este filamento específico."
|
||||
},
|
||||
"titles": {
|
||||
"create": "Criar carretel",
|
||||
"clone": "Clonar carretel",
|
||||
"edit": "Editar carretel",
|
||||
"list": "Carretéis",
|
||||
"show": "Mostrar carretel",
|
||||
"show_title": "[Carretel #{{id}}] {{name}}",
|
||||
"archive": "Arquivar carretel"
|
||||
"create": "Criar Bobine",
|
||||
"clone": "Clonar Bobine",
|
||||
"edit": "Editar Bobine",
|
||||
"list": "Bobines",
|
||||
"show": "Mostrar Bobine",
|
||||
"show_title": "[Bobine #{{id}}] {{name}}",
|
||||
"archive": "Arquivar Bobine",
|
||||
"adjust": "Ajustar Filamento"
|
||||
},
|
||||
"form": {
|
||||
"new_location_prompt": "Insira um novo local",
|
||||
"spool_updated": "Este spool foi atualizado por alguém/alguma coisa desde que você abriu esta página. Salvar substituirá essas alterações!"
|
||||
"spool_updated": "Esta bobine foi atualizada por alguém desde que abriu esta página. Guardar substituirá essas alterações!",
|
||||
"measurement_type": {
|
||||
"length": "Comprimento",
|
||||
"weight": "Peso"
|
||||
},
|
||||
"measurement_type_label": "Tipo de Medida",
|
||||
"adjust_filament_help": "Aqui pode adicionar ou subtrair filamento da bobine. Um valor positivo consome filamento, um valor negativo adiciona filamento.",
|
||||
"adjust_filament_value": "Consumir Montante"
|
||||
},
|
||||
"messages": {
|
||||
"archive": "Tem certeza de que deseja arquivar este carretel?"
|
||||
"archive": "Tem certeza de que deseja arquivar esta bobine?"
|
||||
},
|
||||
"spool": "Carretéis"
|
||||
"spool": "Bobines",
|
||||
"formats": {
|
||||
"last_used": "Última utilização {{date}}"
|
||||
}
|
||||
},
|
||||
"filament": {
|
||||
"filament": "Filamentos",
|
||||
"fields": {
|
||||
"id": "ID",
|
||||
"vendor_name": "Fornecedor",
|
||||
"vendor_name": "Fabricante",
|
||||
"name": "Nome",
|
||||
"price": "Preço",
|
||||
"diameter": "Diâmetro",
|
||||
"weight": "Peso",
|
||||
"spool_weight": "Peso do carretel",
|
||||
"article_number": "Número do artigo",
|
||||
"spool_weight": "Peso da Bobine",
|
||||
"article_number": "Número do Artigo",
|
||||
"registered": "Registrado",
|
||||
"vendor": "Fornecedor",
|
||||
"vendor": "Fabricante",
|
||||
"material": "Material",
|
||||
"density": "Densidade",
|
||||
"comment": "Comentário",
|
||||
"settings_extruder_temp": "Temperatura do bico",
|
||||
"settings_bed_temp": "Temperatura da mesa",
|
||||
"settings_extruder_temp": "Temperatura do Bico",
|
||||
"settings_bed_temp": "Temperatura da Mesa",
|
||||
"color_hex": "Cor",
|
||||
"spools": "Mostrar carretéis"
|
||||
"spools": "Mostrar Bobines",
|
||||
"external_id": "ID Externo",
|
||||
"single_color": "Único",
|
||||
"multi_color": "Múltiplo",
|
||||
"coaxial": "Coextrusado",
|
||||
"longitudinal": "Longitudinal"
|
||||
},
|
||||
"fields_help": {
|
||||
"article_number": "Por exemplo EAN, UPC, etc.",
|
||||
"price": "Preço de um spool completo na moeda configurada pelo sistema.",
|
||||
"name": "Nome do filamento, para distinguir este tipo de filamento entre outros do mesmo fornecedor. Deve conter a cor, por exemplo.",
|
||||
"price": "Preço de uma bobine completa.",
|
||||
"name": "Nome do filamento, para distinguir este tipo de filamento entre outros do mesmo fabricante. Deve conter a cor, por exemplo.",
|
||||
"material": "Por exemplo PLA, ABS, PETG, etc.",
|
||||
"weight": "O peso do filamento de uma carretel cheio (peso líquido). Isso não deve incluir o peso do carretel em si, apenas o filamento. É o que normalmente está escrito na embalagem.",
|
||||
"spool_weight": "O peso de um carretel vazio. Usado para determinar o peso medido de um carretel."
|
||||
"weight": "O peso do filamento de uma bobine cheia (peso líquido). Isso não deve incluir o peso da bobine em si, apenas o filamento. É o que normalmente está escrito na embalagem.",
|
||||
"spool_weight": "O peso de uma bobine vazia. Usado para determinar o peso medido de uma bobine.",
|
||||
"multi_color_direction": "Os filamentos podem ter múltiplas cores de duas formas: por coextrusão, como os filamentos de duas cores com estas consistentes ao longo do filamento, ou através de mudança de cor longitudinal, como os filamentos que contêm gradientes de cores que vão mudando ao longo da bobine."
|
||||
},
|
||||
"titles": {
|
||||
"create": "Criar filamento",
|
||||
"clone": "Clonar filamento",
|
||||
"edit": "Editar filamento",
|
||||
"create": "Criar Filamento",
|
||||
"clone": "Clonar Filamento",
|
||||
"edit": "Editar Filamento",
|
||||
"list": "Filamentos",
|
||||
"show": "Mostrar filamento",
|
||||
"show": "Mostrar Filamento",
|
||||
"show_title": "[Filamento #{{id}}] {{name}}"
|
||||
},
|
||||
"form": {
|
||||
"filament_updated": "Este filamento foi atualizado por alguém/alguma coisa desde que você abriu esta página. Salvar substituirá essas alterações!"
|
||||
"filament_updated": "Este filamento foi atualizado por alguém desde que abriu esta página. Guardar substituirá essas alterações!",
|
||||
"import_external": "Importar do Exterior",
|
||||
"import_external_description": "Escolha um filamento da lista para preencher automaticamente os detalhes do filamento no formulário de criação. Isto irá substituir quaisquer dados que já tenha introduzido no formulário.<br><br>Será criado o fabricante automaticamente caso seja necessário."
|
||||
},
|
||||
"buttons": {
|
||||
"add_spool": "Adicionar Bobine"
|
||||
}
|
||||
},
|
||||
"vendor": {
|
||||
"vendor": "Fornecedores",
|
||||
"vendor": "Fabricantes",
|
||||
"fields": {
|
||||
"id": "ID",
|
||||
"name": "Nome",
|
||||
"registered": "Registrado",
|
||||
"comment": "Comentário"
|
||||
"comment": "Comentário",
|
||||
"empty_spool_weight": "Peso da Bobine Vazia",
|
||||
"external_id": "ID Externo"
|
||||
},
|
||||
"titles": {
|
||||
"create": "Criar fornecedor",
|
||||
"clone": "Clonar fornecedor",
|
||||
"edit": "Editar fornecedor",
|
||||
"list": "Fornecedores",
|
||||
"show": "Mostrar fornecedor",
|
||||
"show_title": "[Fornecedor nº{{id}}] {{name}}"
|
||||
"create": "Criar Fabricante",
|
||||
"clone": "Clonar Fabricante",
|
||||
"edit": "Editar Fabricante",
|
||||
"list": "Fabricantes",
|
||||
"show": "Mostrar Fabricante",
|
||||
"show_title": "[Fabricante #{{id}}] {{name}}"
|
||||
},
|
||||
"form": {
|
||||
"vendor_updated": "Este fornecedor foi atualizado por alguém/alguma coisa desde que você abriu esta página. Salvar substituirá essas alterações!"
|
||||
"vendor_updated": "Este fabricante foi atualizado por alguém desde que abriu esta página. Guardar substituirá essas alterações!"
|
||||
},
|
||||
"fields_help": {
|
||||
"empty_spool_weight": "O peso da bobine vazia do fabricante."
|
||||
}
|
||||
},
|
||||
"home": {
|
||||
"home": "Home"
|
||||
"home": "Início",
|
||||
"welcome": "Bem vindo à sua instância do Spoolman!",
|
||||
"description": "Parece que ainda não adicionou nenhuma bobine. Veja a <helpPageLink>Página de Ajuda</helpPageLink> para obter ajuda a começar."
|
||||
},
|
||||
"help": {
|
||||
"help": "Ajuda",
|
||||
"resources": {
|
||||
"filament": "Marcas de filamento. Eles têm propriedades como nome, material, cor, diâmetro e muito mais.",
|
||||
"spool": "Carretéis físicos individuais de um filamento específico.",
|
||||
"spool": "Bobines físicas individuais de um filamento específico.",
|
||||
"vendor": "As empresas que fabricam o filamento."
|
||||
},
|
||||
"description": "<title>Ajuda</title><p>Aqui estão algumas dicas para você começar.</p><p>O Spoolman contém três tipos diferentes de dados:</p><itemsHelp/><p>Para adicionar um novo carretel para o banco de dados, comece criando um objeto <filamentCreateLink>Filamento</filamentCreateLink>. Feito isso, prossiga para criar um objeto <spoolCreateLink>Carretel </spoolCreateLink> para esse carretel específico. Se você adquirir carretéis adicionais do mesmo filamento posteriormente, simplesmente gere objetos Spool adicionais e reutilize o mesmo objeto filamento.</p><p>Opcionalmente, você também pode gerar um objeto <vendorCreateLink>Fornecedor</vendorCreateLink> para a empresa fabricar o filamento se desejar rastrear essas informações.</p><p>Você tem a opção de vincular outros serviços de impressora 3D ao Spoolman, como o Moonraker, que pode monitorar automaticamente o uso do filamento e atualizar os objetos carretel para você. Consulte o <readmeLink>README do Spoolman</readmeLink> para obter orientação sobre como configurar isso.</p>"
|
||||
"description": "<title>Ajuda</title><p>Aqui estão algumas dicas para começar.</p><p>O Spoolman contém três tipos diferentes de dados:</p><itemsHelp/><p>Para adicionar uma nova bobine para a base de dados, comece por criar um <filamentCreateLink>Filamento</filamentCreateLink>. Feito isso, prossiga para criar uma <spoolCreateLink>Bobine</spoolCreateLink> para esse filamento específico. Se posteriormente adquirir bobines adicionais do mesmo filamento, simplesmente gere Bobines adicionais e reutilize o mesmo objeto Filamento.</p><p>Opcionalmente, também pode criar um <vendorCreateLink>Fabricante</vendorCreateLink> para a empresa que fabrica o filamento, se desejar rastrear essas informações.</p><p>Tem a opção de vincular outros serviços de impressora 3D ao Spoolman, como o Moonraker, que pode monitorizar automaticamente o uso do filamento e atualizar as bobines. Consulte o <readmeLink>README do Spoolman</readmeLink> para obter orientação sobre como configurar.</p>"
|
||||
},
|
||||
"documentTitle": {
|
||||
"suffix": " | Spoolman",
|
||||
"home": {
|
||||
"list": "Home | Spoolman"
|
||||
"list": "Início | Spoolman"
|
||||
},
|
||||
"help": {
|
||||
"list": "Ajuda | Spoolman"
|
||||
@@ -248,40 +315,105 @@
|
||||
"filament": {
|
||||
"list": "Filamentos | Spoolman",
|
||||
"show": "#{{id}} Mostrar filamento | Spoolman",
|
||||
"edit": "#{{id}} Editar filamento | Spoolman",
|
||||
"edit": "#{{id}} Editar Filamento | Spoolman",
|
||||
"create": "Criar filamento | Spoolman",
|
||||
"clone": "#{{id}} Clonar filamento | Spoolman"
|
||||
},
|
||||
"spool": {
|
||||
"list": "Carretéis | Spoolman",
|
||||
"show": "#{{id}} Mostrar carretel | Spoolman",
|
||||
"edit": "#{{id}} Editar carretel | Spoolman",
|
||||
"create": "Criar carretel | Spoolman",
|
||||
"clone": "#{{id}} Clonar carretel | Spoolman"
|
||||
"list": "Bobines | Spoolman",
|
||||
"show": "#{{id}} Mostrar Bobine | Spoolman",
|
||||
"edit": "#{{id}} Editar Bobine | Spoolman",
|
||||
"create": "Criar Bobine | Spoolman",
|
||||
"clone": "#{{id}} Clonar Bobine | Spoolman"
|
||||
},
|
||||
"vendor": {
|
||||
"show": "#{{id}} Mostrar fornecedor | Spoolman",
|
||||
"list": "Fornecedores | Spoolman",
|
||||
"create": "Criar fornecedor | Spoolman",
|
||||
"edit": "#{{id}} Editar fornecedor | Spoolman",
|
||||
"clone": "#{{id}} Clonar fornecedor | Spoolman"
|
||||
"show": "#{{id}} Mostrar Fabricante | Spoolman",
|
||||
"list": "Fabricantes | Spoolman",
|
||||
"create": "Criar Fabricante | Spoolman",
|
||||
"edit": "#{{id}} Editar Fabricante | Spoolman",
|
||||
"clone": "#{{id}} Clonar Fabricante | Spoolman"
|
||||
},
|
||||
"default": "Spoolman"
|
||||
"default": "Spoolman",
|
||||
"locations": {
|
||||
"list": "Locais | Spoolman"
|
||||
}
|
||||
},
|
||||
"no": "Não",
|
||||
"scanner": {
|
||||
"title": "Leitor de código QR",
|
||||
"description": "Digitalize um código QR do Spoolman para ver detalhes sobre o carretel.",
|
||||
"title": "Leitor de Código QR",
|
||||
"description": "Digitalize um código QR do Spoolman para ver detalhes sobre a bobine.",
|
||||
"error": {
|
||||
"notAllowed": "Você não permitiu acesso à câmera.",
|
||||
"insecureContext": "A página não é veiculada por HTTPS.",
|
||||
"notAllowed": "Não deu permissão de acesso à câmara.",
|
||||
"insecureContext": "A página não é protegida por HTTPS.",
|
||||
"streamApiNotSupported": "O navegador não oferece suporte à API MediaStream.",
|
||||
"unknown": "Ocorreu um erro desconhecido. ({{error}})",
|
||||
"notReadable": "A câmera não é legível.",
|
||||
"notFound": "Nenhuma câmera foi encontrada."
|
||||
"notReadable": "A câmara não está acessível.",
|
||||
"notFound": "Nenhuma câmara foi encontrada."
|
||||
}
|
||||
},
|
||||
"table": {
|
||||
"actions": "Ações"
|
||||
},
|
||||
"settings": {
|
||||
"extra_fields": {
|
||||
"params": {
|
||||
"multi_choice": "Múltiplas Opções",
|
||||
"key": "Chave",
|
||||
"name": "Nome",
|
||||
"field_type": "Tipo",
|
||||
"unit": "Unidade",
|
||||
"order": "Ordem",
|
||||
"default_value": "Valor Padrão",
|
||||
"choices": "Opções"
|
||||
},
|
||||
"field_type": {
|
||||
"datetime": "Date e Hora",
|
||||
"text": "Texto",
|
||||
"integer": "Inteiro",
|
||||
"float": "Decimal",
|
||||
"float_range": "Intervalo Decimal",
|
||||
"integer_range": "Intervalo Inteiro",
|
||||
"boolean": "Booleano",
|
||||
"choice": "Opção"
|
||||
},
|
||||
"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 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.",
|
||||
"choices_reorder_hint": "Arraste ou use as setas para reordenar esta escolha."
|
||||
},
|
||||
"settings": "Configurações",
|
||||
"header": "Configurações",
|
||||
"general": {
|
||||
"tab": "Geral",
|
||||
"currency": {
|
||||
"label": "Moeda"
|
||||
},
|
||||
"base_url": {
|
||||
"label": "Endereço Base",
|
||||
"tooltip": "O endereço base a utilizar em funcionalidades tais como os códigos QR."
|
||||
},
|
||||
"round_prices": {
|
||||
"tooltip": "Arredonda os preços para o número inteiro mais próximo.",
|
||||
"label": "Arredondar preços"
|
||||
}
|
||||
}
|
||||
},
|
||||
"locations": {
|
||||
"locations": "Locais",
|
||||
"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"
|
||||
}
|
||||
}
|
||||
@@ -1,47 +1,50 @@
|
||||
{
|
||||
"buttons": {
|
||||
"create": "creeaza",
|
||||
"create": "creaza",
|
||||
"save": "salveaza",
|
||||
"show": "arata",
|
||||
"filter": "filtreaza",
|
||||
"cancel": "anuleaza",
|
||||
"edit": "editeaza",
|
||||
"confirm": "esti sigur?",
|
||||
"delete": "sterge",
|
||||
"confirm": "Ești sigur?",
|
||||
"delete": "Șterge",
|
||||
"undo": "inapoi",
|
||||
"import": "importa",
|
||||
"logout": "logout",
|
||||
"logout": "Iesire",
|
||||
"saveAndAdd": "salveazaSiAdauga",
|
||||
"clear": "sterge",
|
||||
"clear": "Șterge",
|
||||
"refresh": "actualizeaza",
|
||||
"clone": "cloneaza",
|
||||
"archive": "arhiveaza",
|
||||
"unArchive": "dezarhiveaza",
|
||||
"hideArchived": "ascunde arhivate",
|
||||
"showArchived": "arata arhivate",
|
||||
"hideArchived": "ascundeArhivate",
|
||||
"showArchived": "Arata arhivate",
|
||||
"notAccessTitle": "nu ai permisiune de acces",
|
||||
"hideColumns": "ascunde coloane",
|
||||
"clearFilters": "reseteaza filtre"
|
||||
"clearFilters": "reseteaza filtre",
|
||||
"continue": "Continua"
|
||||
},
|
||||
"actions": {
|
||||
"create": "creeaza",
|
||||
"create": "creaza",
|
||||
"clone": "cloneaza",
|
||||
"list": "listeaza",
|
||||
"list": "Listeaza",
|
||||
"show": "arata",
|
||||
"edit": "editeaza"
|
||||
},
|
||||
"warnWhenUnsavedChanges": "Esti sigur? Modificarile ne-salvate vor fi pierdurte",
|
||||
"warnWhenUnsavedChanges": "Esti sigur? Modificarile ne-salvate vor fi pierdute.",
|
||||
"notifications": {
|
||||
"success": "succes",
|
||||
"error": "eroare",
|
||||
"undoable": "Ai inca {{seconds}} secunde sa corectezi",
|
||||
"error": "Eroare (Cod: {{statusCode}})",
|
||||
"undoable": "Ai inca {{seconds}} secunde sa corectezi.",
|
||||
"createSuccess": "{{resource}} creata cu succes",
|
||||
"createError": "Eroare la crearea {{resource}} (status code: {{statusCode}})",
|
||||
"createError": "Eroare la crearea {{resource}} (status code: {{statusCode}})",
|
||||
"deleteSuccess": "{{resource}} stearsa cu succes",
|
||||
"deleteError": "Eroare la stergerea {{resource}} (status code: {{statusCode}})",
|
||||
"deleteError": "Eroare la stergerea {{resource}} (status code: {{statusCode}})",
|
||||
"editSuccess": "{{resource}} editata cu succes",
|
||||
"editError": "eroare la editarea {{resource}} (status code: {{statusCode}})",
|
||||
"importProgress": "Importare: {{processed}}/{{total}}"
|
||||
"editError": "eroare la editarea {{resource}} (status code: {{statusCode}})",
|
||||
"importProgress": "Importare: {{processed}}/{{total}}",
|
||||
"saveSuccessful": "Salvare reusita!",
|
||||
"validationError": "Eroare de validare: {{error}}"
|
||||
},
|
||||
"kofi": "Doneaza pe Ko-fi",
|
||||
"loading": "Incarca",
|
||||
@@ -54,234 +57,356 @@
|
||||
},
|
||||
"printing": {
|
||||
"generic": {
|
||||
"verticalSpacing": "",
|
||||
"verticalSpacing": "Spațiere verticală",
|
||||
"borders": {
|
||||
"grid": "",
|
||||
"none": "",
|
||||
"border": ""
|
||||
"grid": "Rețea",
|
||||
"none": "Nici unul",
|
||||
"border": "Frontieră"
|
||||
},
|
||||
"previewScale": "",
|
||||
"contentSettings": "",
|
||||
"helpMargin": "",
|
||||
"description": "",
|
||||
"marginRight": "",
|
||||
"rows": "",
|
||||
"marginBottom": "",
|
||||
"marginTop": "",
|
||||
"print": "",
|
||||
"printerMarginRight": "",
|
||||
"columns": "",
|
||||
"helpPrinterMargin": "",
|
||||
"layoutSettings": "",
|
||||
"dimensions": "",
|
||||
"skipItems": "",
|
||||
"paperSize": "",
|
||||
"printerMarginTop": "",
|
||||
"horizontalSpacing": "",
|
||||
"customSize": "",
|
||||
"marginLeft": "",
|
||||
"printerMarginLeft": "",
|
||||
"showBorder": "",
|
||||
"printerMarginBottom": "",
|
||||
"title": ""
|
||||
"previewScale": "Scala de previzualizare",
|
||||
"contentSettings": "Setări de conținut",
|
||||
"helpMargin": "Marginile trebuie configurate pentru a se potrivi cu hârtia de etichetă și imprimanta dvs., modificarea acestora va afecta dimensiunea întregii grile.",
|
||||
"description": "Modificati setările de mai jos pentru a obține aspectul dorit al etichetelor. Rețineți că imprimantele și sistemul dvs. de operare pot aplica propriile setări, așa că poate fi necesar să incercati mai multe opțiuni înainte ca totul să fie corect. Testați-l pe o bucată de hârtie obișnuită înainte de a imprima pe etichetele reale.",
|
||||
"marginRight": "Marja dreaptă",
|
||||
"rows": "Rânduri",
|
||||
"marginBottom": "Marja de jos",
|
||||
"marginTop": "Marja superioară",
|
||||
"print": "Imprimare",
|
||||
"printerMarginRight": "Safe-Zone dreapta",
|
||||
"columns": "Coloane",
|
||||
"helpPrinterMargin": "Safe-Zone ar trebui să fie setată la cât de aproape de marginea hârtiei poate imprima imprimanta dvs., modificarea acestora nu va afecta întreaga grilă.",
|
||||
"layoutSettings": "Setări Layout",
|
||||
"dimensions": "Dimensiuni",
|
||||
"skipItems": "Treci peste articole",
|
||||
"paperSize": "Dimensiunea hârtiei",
|
||||
"printerMarginTop": "Safe-Zone sus",
|
||||
"horizontalSpacing": "Spațiere orizontală",
|
||||
"customSize": "Personalizat",
|
||||
"marginLeft": "Margine stângă",
|
||||
"printerMarginLeft": "Safe-Zone stanga",
|
||||
"showBorder": "Arată marginea",
|
||||
"printerMarginBottom": "Safe-Zone jos",
|
||||
"title": "Imprimare",
|
||||
"itemCopies": "Copii ale obiectelor",
|
||||
"settings": "Prestabilite",
|
||||
"defaultSettings": "Implicit",
|
||||
"addSettings": "Adăugarea de noi prestabilite",
|
||||
"newSetting": "Nou",
|
||||
"duplicateSettings": "Duplicat",
|
||||
"deleteSettings": "Ștergerea presetării curente",
|
||||
"deleteSettingsConfirm": "Ești sigur că vrei să ștergi această prestabilită?",
|
||||
"settingsName": "Numele valorii prestabilite",
|
||||
"saveSetting": "Salvare prestabilite",
|
||||
"saveAsImage": "Salvare ca imagine"
|
||||
},
|
||||
"spoolSelect": {
|
||||
"showArchived": "",
|
||||
"title": "",
|
||||
"description": "",
|
||||
"selectedTotal_one": "",
|
||||
"selectedTotal_few": "",
|
||||
"selectedTotal_other": "",
|
||||
"selectAll": "",
|
||||
"noSpoolsSelected": ""
|
||||
"showArchived": "Arata arhivate",
|
||||
"title": "Selectați bobine",
|
||||
"description": "Selectați rolele pentru care trebuie printate etichete.",
|
||||
"selectedTotal_one": "{{count}} bobina selectata",
|
||||
"selectedTotal_few": "{{count}} bobine selectate",
|
||||
"selectedTotal_other": "{{count}} bobine selectate",
|
||||
"selectAll": "Selecteaza/deselecteaza tot",
|
||||
"noSpoolsSelected": "Nu ati selectat nicio bobina."
|
||||
},
|
||||
"qrcode": {
|
||||
"bedTemp": "",
|
||||
"title": "",
|
||||
"button": "",
|
||||
"showTemperatures": "",
|
||||
"spoolWeight": "",
|
||||
"showFilamentComment": "",
|
||||
"showLotNr": "",
|
||||
"showContent": "",
|
||||
"showSpoolWeight": "",
|
||||
"textSize": "",
|
||||
"showVendorComment": "",
|
||||
"showSpoolmanIcon": "",
|
||||
"showSpoolComment": "",
|
||||
"extruderTemp": "",
|
||||
"showVendor": "",
|
||||
"lotNr": ""
|
||||
"bedTemp": "BT: {{temp}}",
|
||||
"title": "Printarea codurilor QR",
|
||||
"button": "Imprimați codurile QR",
|
||||
"showTemperatures": "Temperaturi",
|
||||
"spoolWeight": "Greutatea rolei de filament: {{weight}}",
|
||||
"showFilamentComment": "Filament Comentariu",
|
||||
"showLotNr": "Lot Nr",
|
||||
"showContent": "Imprimă eticheta",
|
||||
"showSpoolWeight": "Greutate bobină",
|
||||
"textSize": "Mărimea textului",
|
||||
"showVendorComment": "Comentariul furnizorului",
|
||||
"showSpoolmanIcon": "Arata iconul Spoolman",
|
||||
"showSpoolComment": "Bobină Comentariu",
|
||||
"extruderTemp": "ET: {{temp}}",
|
||||
"showVendor": "Furnizor",
|
||||
"lotNr": "Lot Nr: {{lot}}",
|
||||
"template": "Șablon etichetă",
|
||||
"useHTTPUrl": {
|
||||
"label": "Link către codul QR",
|
||||
"tooltip": "Se va folosi un link proprietar care va funcționa doar dacă este scanat din funcția de scanare a Spoolman (implicit). URL-ul folosește fie URL-ul de bază specificat în setări, fie URL-ul paginii curente dacă nu este setat.",
|
||||
"options": {
|
||||
"default": "Implicit",
|
||||
"url": "URL"
|
||||
},
|
||||
"preview": "Previzualizare:"
|
||||
},
|
||||
"showQRCode": "Printarea codului QR",
|
||||
"showQRCodeMode": {
|
||||
"no": "Nu",
|
||||
"simple": "Simplu",
|
||||
"withIcon": "Cu imagine"
|
||||
},
|
||||
"templateHelp": "Utilizați {} pentru a insera valorile obiectului filament ca text. De exemplu, {id} va fi înlocuit cu id-ul filamentului, sau {filament.material} va fi înlocuit cu materialul filamentului. Dacă o valoare lipsește, aceasta va fi înlocuită cu \"?\". Un al doilea set de {} poate fi folosit pentru a elimina acesta. În plus, orice text între seturile de {} va fi eliminat dacă valoarea lipsește. De exemplu, {Lot Nr: {lot_nr}} va afișa doar eticheta dacă filamentul are un număr de lot. Încadrați textul cu asteriscuri duble ** pentru a-l face îngroșat. Faceți clic pe buton pentru a vizualiza o listă cu toate etichetele disponibile."
|
||||
}
|
||||
},
|
||||
"documentTitle": {
|
||||
"vendor": {
|
||||
"show": "",
|
||||
"list": "",
|
||||
"edit": "",
|
||||
"create": "",
|
||||
"clone": ""
|
||||
"show": "#{{id}} Afișare producători | Spoolman",
|
||||
"list": "Producători | Spoolman",
|
||||
"edit": "#{{id}} Editare producător | Spoolman",
|
||||
"create": "Adăugare producător | Spoolman",
|
||||
"clone": "#{{id}} Duplicare producător | Spoolman"
|
||||
},
|
||||
"spool": {
|
||||
"create": "",
|
||||
"clone": "",
|
||||
"list": "",
|
||||
"edit": "",
|
||||
"show": ""
|
||||
"create": "Creare rolă| Spoolman",
|
||||
"clone": "#{{id}} Clonare rolă | Spoolman",
|
||||
"list": "Role | Spoolman",
|
||||
"edit": "#{{id}} Editare rolă | Spoolman",
|
||||
"show": "#{{id}} Afișare role | Spoolman"
|
||||
},
|
||||
"filament": {
|
||||
"show": "",
|
||||
"list": "",
|
||||
"clone": "",
|
||||
"edit": "",
|
||||
"create": ""
|
||||
"show": "#{{id}} Afișare filamente | Spoolman",
|
||||
"list": "Filamente | Spoolman",
|
||||
"clone": "#{{id}} Clonare filament | Spoolman",
|
||||
"edit": "#{{id}} Editare filamente | Spoolman",
|
||||
"create": "Creare filament| Spoolman"
|
||||
},
|
||||
"home": {
|
||||
"list": ""
|
||||
"list": "Acasă | Spoolman"
|
||||
},
|
||||
"suffix": "",
|
||||
"default": "",
|
||||
"suffix": " | Spoolman",
|
||||
"default": "Spoolman",
|
||||
"help": {
|
||||
"list": ""
|
||||
"list": "Ajutor | Spoolman"
|
||||
},
|
||||
"locations": {
|
||||
"list": "Zone | Spoolman"
|
||||
}
|
||||
},
|
||||
"help": {
|
||||
"description": "",
|
||||
"description": "<title>Ajutor</title><p>Iată câteva sfaturi pentru a te ajuta să începi.</p><p>Spoolman are 3 tipuri diferite de date:</p><itemsHelp/><p>Pentru a adăuga o nouă rolă în baza de date, începe prin a crea un obiect <filamentCreateLink>Filament</filamentCreateLink>. Odată ce ai terminat, continuă prin a crea un obiect <spoolCreateLink>Spool</spoolCreateLink> pentru aca rolă. Dacă mai achiziționezi role suplimentare din același filament mai târziu, pur și simplu generează obiecte Rolă suplimentare și reutilizează același obiect Filament.</p><p>Opțional, poți genera și un obiect <vendorCreateLink>Producător</vendorCreateLink> pentru compania care produce filamentul, dacă dorești să urmărești această informație.</p><p>Ai opțiunea de a lega alte servicii pentru imprimante 3D de Spoolman, cum ar fi Moonraker, care poate monitoriza automat utilizarea filamentului și actualiza obiectele Rolă pentru tine. Consultă <readmeLink>README-ul Spoolman</readmeLink> pentru orientări despre cum să configurezi acest lucru.</p>",
|
||||
"resources": {
|
||||
"spool": "",
|
||||
"filament": "",
|
||||
"vendor": ""
|
||||
"spool": "Role de filament individuale ale unui filament specific.",
|
||||
"filament": "Brand-uri de filament. Au proprietăți precum nume, material, culoare, diametru și altele.",
|
||||
"vendor": "Companiile care produc filamentul."
|
||||
},
|
||||
"help": ""
|
||||
"help": "Ajutor"
|
||||
},
|
||||
"spool": {
|
||||
"fields": {
|
||||
"weight_to_use": "",
|
||||
"registered": "",
|
||||
"used_weight": "",
|
||||
"first_used": "",
|
||||
"location": "",
|
||||
"material": "",
|
||||
"last_used": "",
|
||||
"archived": "",
|
||||
"price": "",
|
||||
"used_length": "",
|
||||
"measured_weight": "",
|
||||
"lot_nr": "",
|
||||
"comment": "",
|
||||
"id": "",
|
||||
"filament": "",
|
||||
"filament_name": "",
|
||||
"remaining_length": "",
|
||||
"remaining_weight": ""
|
||||
"weight_to_use": "Greutate",
|
||||
"registered": "Înregistrat",
|
||||
"used_weight": "Greutate folosita",
|
||||
"first_used": "Prima utilizare",
|
||||
"location": "Locație",
|
||||
"material": "Material",
|
||||
"last_used": "Ultima utilizare",
|
||||
"archived": "Arhivat",
|
||||
"price": "Preț",
|
||||
"used_length": "Lungime folosita",
|
||||
"measured_weight": "Greutate masurata",
|
||||
"lot_nr": "Lot Nr",
|
||||
"comment": "Comentariu",
|
||||
"id": "ID",
|
||||
"filament": "Filament",
|
||||
"filament_name": "Filament",
|
||||
"remaining_length": "Lungime ramasa",
|
||||
"remaining_weight": "Greutate ramasa",
|
||||
"filament_internal": "Intern",
|
||||
"filament_external": "Extern",
|
||||
"initial_weight": "Greutatea inițială",
|
||||
"spool_weight": "Greutatea rolei"
|
||||
},
|
||||
"fields_help": {
|
||||
"location": "",
|
||||
"weight_to_use": "",
|
||||
"used_weight": "",
|
||||
"price": "",
|
||||
"lot_nr": "",
|
||||
"remaining_weight": "",
|
||||
"measured_weight": ""
|
||||
"location": "Locatia in care bobina este stocata.",
|
||||
"weight_to_use": "Selectati greutatea care trebuie folosita. Greutatea masurata e disponibila numai daca greutatea bobinei goale este setata pentru filamentul respectiv.",
|
||||
"used_weight": "Cat filament a fost folosit de pe bobina respectiva. O bobina noua ar trebui sa aiba 0 grame folosite.",
|
||||
"price": "Pretul unei bobine. Daca nu e definit, pretul filamentului va fi folosit.",
|
||||
"lot_nr": "Numarul de productie al lotului. Poate fi folosit pentru a garanta consistenta culorii, in caz ca mai multe bobine sunt folosite la acelasi print.",
|
||||
"remaining_weight": "Cat filament a ramas pe bobina. Aceasta valoare reprezinta greutatea filamentului de pe bobina respectiva.",
|
||||
"measured_weight": "Greutatea totala a bobinei si filamentului.",
|
||||
"initial_weight": "Greutatea inițială a filamentului de pe rolă (greutate netă). Se va folosi greutatea din obiectul filament dacă nu este setată.",
|
||||
"spool_weight": "Greutatea rolei atunci când este goală. Lăsați necompletat pentru a folosi valoarea de la filament sau de la producător.",
|
||||
"external_filament": "Ai selectat un filament din baza de date externă. Un obiect filament (și posibil un obiect de la fabricant) va fi creat automat atunci când creați această rolă. Aceasta poate crea obiecte filament duplicate dacă ați creat deja un obiect filament pentru acest filament."
|
||||
},
|
||||
"titles": {
|
||||
"list": "",
|
||||
"archive": "",
|
||||
"show_title": "",
|
||||
"create": "",
|
||||
"show": "",
|
||||
"edit": "",
|
||||
"clone": ""
|
||||
"list": "Bobine",
|
||||
"archive": "Archiveaza bobina",
|
||||
"show_title": "[Bobina #{{id}}] {{name}}",
|
||||
"create": "Creați bobină",
|
||||
"show": "Arata bobina",
|
||||
"edit": "Editeaza bobina",
|
||||
"clone": "Cloneaza bobina",
|
||||
"adjust": "Ajustarea rolei de filament"
|
||||
},
|
||||
"messages": {
|
||||
"archive": ""
|
||||
"archive": "Esti sigur ca vrei sa arhivezi aceasta bobina?"
|
||||
},
|
||||
"form": {
|
||||
"spool_updated": "",
|
||||
"new_location_prompt": ""
|
||||
"spool_updated": "Aceasta bobina a fost modificata de altcineva in timpul scurs de la deschiderea acestei pagini, Salvarea va suprascrie aceste schimbari!",
|
||||
"new_location_prompt": "Introduceti o locatie noua",
|
||||
"measurement_type": {
|
||||
"length": "Lungime",
|
||||
"weight": "Greutate"
|
||||
},
|
||||
"measurement_type_label": "Tipul măsurării",
|
||||
"adjust_filament_help": "Aici poți adăuga sau elimina direct filament din rolă. O valoare pozitivă va consuma filament, iar o valoare negativă îl va adăuga.",
|
||||
"adjust_filament_value": "Cantitatea consumată"
|
||||
},
|
||||
"spool": ""
|
||||
"spool": "Bobine",
|
||||
"formats": {
|
||||
"last_used": "Ultima utilizare {{date}}"
|
||||
}
|
||||
},
|
||||
"filament": {
|
||||
"fields": {
|
||||
"registered": "",
|
||||
"article_number": "",
|
||||
"id": "",
|
||||
"vendor": "",
|
||||
"settings_bed_temp": "",
|
||||
"material": "",
|
||||
"price": "",
|
||||
"name": "",
|
||||
"color_hex": "",
|
||||
"settings_extruder_temp": "",
|
||||
"vendor_name": "",
|
||||
"diameter": "",
|
||||
"density": "",
|
||||
"weight": "",
|
||||
"spools": "",
|
||||
"comment": "",
|
||||
"spool_weight": ""
|
||||
"registered": "Înregistrat",
|
||||
"article_number": "Numarul articolului",
|
||||
"id": "ID",
|
||||
"vendor": "Producător",
|
||||
"settings_bed_temp": "Temperatura patului",
|
||||
"material": "Material",
|
||||
"price": "Preț",
|
||||
"name": "Nume",
|
||||
"color_hex": "Culoare",
|
||||
"settings_extruder_temp": "Temperatura extruderului",
|
||||
"vendor_name": "Producător",
|
||||
"diameter": "Diametru",
|
||||
"density": "Densitate",
|
||||
"weight": "Greutate",
|
||||
"spools": "Arata bobinele",
|
||||
"comment": "Comentariu",
|
||||
"spool_weight": "Greutatea bobinei",
|
||||
"single_color": "Unică",
|
||||
"multi_color": "Multi",
|
||||
"coaxial": "Co-extrudat",
|
||||
"longitudinal": "Longitudinal",
|
||||
"external_id": "ID extern"
|
||||
},
|
||||
"fields_help": {
|
||||
"price": "",
|
||||
"material": "",
|
||||
"name": "",
|
||||
"spool_weight": "",
|
||||
"article_number": "",
|
||||
"weight": ""
|
||||
"price": "Pretului unei bobine noi.",
|
||||
"material": "Ex. PLA, ABS, PETG, etc.",
|
||||
"name": "Numele filamentului, pentru a-l putea distinge de altele ale aceluiași producător. Trebuie să conțină culoarea de exemplu.",
|
||||
"spool_weight": "Greutatea unei bobine goale (fara filament). Este folosita pentru a calcula greutatea unei bobine cu filament.",
|
||||
"article_number": "Ex. EAN, UPC etc.",
|
||||
"weight": "Greutatea neta a filamentului de pe o bobina. Nu trebuie sa includa greutatea bobinei, ci doar cea a filamentului. De obicei greutatea filementului este cea inscrisa pe ambalaj.",
|
||||
"multi_color_direction": "Filamentele pot avea multiple culori în două moduri: fie prin co-extrudare, cum ar fi filamentele de două culori cu culori multiple consistente, fie prin schimbări de culoare longitudinale, cum ar fi filamentele gradient care își schimbă culorile pe parcursul rolei."
|
||||
},
|
||||
"titles": {
|
||||
"edit": "",
|
||||
"show_title": "",
|
||||
"create": "",
|
||||
"show": "",
|
||||
"list": "",
|
||||
"clone": ""
|
||||
"edit": "Modifica del filamento",
|
||||
"show_title": "[Filament #{{id}}] {{name}}",
|
||||
"create": "Creați filament",
|
||||
"show": "Arată filamentul",
|
||||
"list": "Filamente",
|
||||
"clone": "Clonarea filamentului"
|
||||
},
|
||||
"form": {
|
||||
"filament_updated": ""
|
||||
"filament_updated": "Acest filament a fost actualizat de cineva/altceva de când ai deschis această pagină. Salvarea va suprascrie aceste modificări!",
|
||||
"import_external": "Importare din exterior",
|
||||
"import_external_description": "Selectați un filament din listă pentru a completa automat detaliile sale în formularul de creare a filamentului. Acest lucru va suprascrie orice date pe care le-ați introdus în formular.<br><br>Un obiect Producător va fi creat automat când faceți clic pe Ok, dacă este necesar."
|
||||
},
|
||||
"filament": ""
|
||||
"filament": "Filamente",
|
||||
"buttons": {
|
||||
"add_spool": "Adăugare rolă"
|
||||
}
|
||||
},
|
||||
"vendor": {
|
||||
"vendor": "",
|
||||
"vendor": "Producători",
|
||||
"fields": {
|
||||
"registered": "",
|
||||
"comment": "",
|
||||
"name": "",
|
||||
"id": ""
|
||||
"registered": "Înregistrat",
|
||||
"comment": "Comentariu",
|
||||
"name": "Nume",
|
||||
"id": "ID",
|
||||
"empty_spool_weight": "Greutatea rolei goale",
|
||||
"external_id": "ID extern"
|
||||
},
|
||||
"titles": {
|
||||
"clone": "",
|
||||
"show": "",
|
||||
"list": "",
|
||||
"create": "",
|
||||
"show_title": "",
|
||||
"edit": ""
|
||||
"clone": "Duplicarea producătorului",
|
||||
"show": "Afișarea producătorilor",
|
||||
"list": "Producători",
|
||||
"create": "Adăugarea unui producător",
|
||||
"show_title": "[Producător #{{id}}] {{name}}",
|
||||
"edit": "Editarea producătorului"
|
||||
},
|
||||
"form": {
|
||||
"vendor_updated": ""
|
||||
"vendor_updated": "Acest producător a fost actualizat de cineva/altceva de când ai deschis această pagină. Salvarea va suprascrie acele modificări!"
|
||||
},
|
||||
"fields_help": {
|
||||
"empty_spool_weight": "Greutatea unei role goale de la acest producător."
|
||||
}
|
||||
},
|
||||
"dashboard": {
|
||||
"title": ""
|
||||
"title": "Tablou de bord"
|
||||
},
|
||||
"home": {
|
||||
"home": ""
|
||||
"home": "Acasă",
|
||||
"welcome": "Bine ai venit în instanța ta Spoolman!",
|
||||
"description": "Se pare că nu ați adăugat încă nici o rolă. Consultați pagina <helpPageLink>Ajutor</helpPageLink> pentru a începe."
|
||||
},
|
||||
"scanner": {
|
||||
"error": {
|
||||
"notFound": "",
|
||||
"unknown": "",
|
||||
"notAllowed": "",
|
||||
"streamApiNotSupported": "",
|
||||
"insecureContext": "",
|
||||
"notReadable": ""
|
||||
"notFound": "Nicio camera nu a fost gasita.",
|
||||
"unknown": "Eroare necunoscuta. ({{error}})",
|
||||
"notAllowed": "Accesul la camera nu a fost permis.",
|
||||
"streamApiNotSupported": "Browserul nu suporta MediaStream API.",
|
||||
"insecureContext": "Aceasta pagina nu este servita peste HTTPS.",
|
||||
"notReadable": "Accesul la camera nu este posibil."
|
||||
},
|
||||
"title": "",
|
||||
"description": ""
|
||||
"title": "Scanner QR code",
|
||||
"description": "Scanati QR code-ul Spoolman pentru detalii."
|
||||
},
|
||||
"table": {
|
||||
"actions": ""
|
||||
"actions": "Acțiuni"
|
||||
},
|
||||
"settings": {
|
||||
"settings": "Setări",
|
||||
"header": "Setări",
|
||||
"general": {
|
||||
"tab": "General",
|
||||
"currency": {
|
||||
"label": "Valută"
|
||||
},
|
||||
"base_url": {
|
||||
"label": "URL de bază",
|
||||
"tooltip": "URL-ul de bază care trebuie utilizat atunci când generați caracteristici, cum ar fi codurile QR."
|
||||
},
|
||||
"round_prices": {
|
||||
"label": "Prețurile estimative",
|
||||
"tooltip": "Prețurile estimative la cel mai apropiat întreg."
|
||||
}
|
||||
},
|
||||
"extra_fields": {
|
||||
"tab": "Câmpuri extra",
|
||||
"description": "<p>Aici poți adăuga câmpuri suplimentare personalizate entităților tale.</p><p>Odată ce un câmp este adăugat, nu poți schimba cheia sau tipul acestuia, iar pentru câmpurile de tip alegere nu poți elimina opțiunile sau schimba starea de alegere multiplă. Dacă elimini un câmp, datele asociate pentru toate entitățile vor fi șterse.</p><p>Cheia este ceea ce alte programe folosesc pentru a citi/scrie date, așa că, dacă câmpul tău personalizat ar trebui să se integreze cu un program de terță parte, asigură-te că îl setezi corect. Valoarea implicită se aplică doar articolelor noi.</p><p>Câmpurile suplimentare nu pot fi sortate sau filtrate în tabele.</p>",
|
||||
"params": {
|
||||
"key": "Cheie",
|
||||
"name": "Nume",
|
||||
"field_type": "Tip",
|
||||
"unit": "Unitate",
|
||||
"order": "Stoc",
|
||||
"default_value": "Valoarea implicită",
|
||||
"choices": "Selecții",
|
||||
"multi_choice": "Selecție multiplă"
|
||||
},
|
||||
"field_type": {
|
||||
"text": "Text",
|
||||
"integer": "Întreg",
|
||||
"integer_range": "Interval întreg",
|
||||
"float": "Număr zecimal",
|
||||
"float_range": "Interval de numere zecimale",
|
||||
"datetime": "Dată/timp",
|
||||
"boolean": "Boolean",
|
||||
"choice": "Selecție"
|
||||
},
|
||||
"boolean_true": "Da",
|
||||
"boolean_false": "Nu",
|
||||
"choices_missing_error": "Nu poți înlătura selecții. Următoarele selecții lipsesc: {{choices}}",
|
||||
"non_unique_key_error": "Cheia trebuie să fie unică.",
|
||||
"key_not_changed": "Te rog să schimbi cheia.",
|
||||
"delete_confirm": "Ștergi câmpul{{name}}?",
|
||||
"delete_confirm_description": "Ștergerea câmpului și a tuturor datelor asociate pentru toate entitățile."
|
||||
}
|
||||
},
|
||||
"locations": {
|
||||
"locations": "Zone",
|
||||
"new_location": "Zonă nouă",
|
||||
"no_location": "Fără zonă",
|
||||
"no_locations_help": "Această pagină îți permite să îți organizezi rolele în zone, adaugă câteva role pentru a începe!"
|
||||
}
|
||||
}
|
||||
@@ -28,7 +28,8 @@
|
||||
"notAccessTitle": "У вас нет разрешения на доступ",
|
||||
"hideColumns": "Скрыть столбцы",
|
||||
"clearFilters": "Очистить фильтр",
|
||||
"saveAndAdd": "Сохранить и добавить"
|
||||
"saveAndAdd": "Сохранить и добавить",
|
||||
"continue": "Продолжить"
|
||||
},
|
||||
"warnWhenUnsavedChanges": "Вы уверены, что хотите выйти? У вас есть несохраненные изменения.",
|
||||
"notifications": {
|
||||
@@ -41,7 +42,9 @@
|
||||
"deleteError": "Ошибка при удалении {{resource}} (status code: {{statusCode}})",
|
||||
"editSuccess": "Успешно отредактировано {{resource}}",
|
||||
"editError": "Ошибка при редактировании {{resource}} (status code: {{statusCode}})",
|
||||
"importProgress": "Импорт: {{processed}}/{{total}}"
|
||||
"importProgress": "Импорт: {{processed}}/{{total}}",
|
||||
"saveSuccessful": "Успешное сохранение!",
|
||||
"validationError": "Ошибка проверки:{{error}}"
|
||||
},
|
||||
"loading": "Загрузка",
|
||||
"version": "Версия",
|
||||
@@ -85,16 +88,27 @@
|
||||
"none": "Без рамки",
|
||||
"border": "Общая",
|
||||
"grid": "Сетка"
|
||||
}
|
||||
},
|
||||
"addSettings": "Добавить новый пресет",
|
||||
"newSetting": "Новый",
|
||||
"deleteSettings": "Удалить текущий пресет",
|
||||
"deleteSettingsConfirm": "Вы уверены, что хотите удалить этот пресет?",
|
||||
"settings": "Пресеты",
|
||||
"defaultSettings": "По умолчанию",
|
||||
"settingsName": "Имя пресета",
|
||||
"itemCopies": "Копии элементов",
|
||||
"saveAsImage": "Сохранить как изображение",
|
||||
"duplicateSettings": "Дублировать",
|
||||
"saveSetting": "Сохранить Пресеты"
|
||||
},
|
||||
"qrcode": {
|
||||
"button": "Распечатать QR-коды",
|
||||
"title": "Печать QR-кода",
|
||||
"button": "Печать этикеток",
|
||||
"title": "Печать этикетки",
|
||||
"spoolWeight": "Вес катушки: {{weight}}",
|
||||
"lotNr": "№ партии: {{lot}}",
|
||||
"bedTemp": "ТС: {{temp}}",
|
||||
"extruderTemp": "ТЕ: {{temp}}",
|
||||
"textSize": "Размер текста",
|
||||
"textSize": "Размер Текста Надписи",
|
||||
"showSpoolmanIcon": "Показать иконку Spoolman",
|
||||
"showVendor": "Производитель",
|
||||
"showContent": "Печать информации",
|
||||
@@ -103,11 +117,28 @@
|
||||
"showTemperatures": "Температура",
|
||||
"showSpoolComment": "Комментарий к катушке",
|
||||
"showFilamentComment": "Комментарий к филаменту",
|
||||
"showVendorComment": "Комментарий к продавцу"
|
||||
"showVendorComment": "Комментарий к продавцу",
|
||||
"template": "Шаблон этикетки",
|
||||
"templateHelp": "Используйте {} для вставки значений объекта катушки в виде текста. Например, {id} будет заменен на идентификатор катушки, или {filament.material} будет заменен на материал катушки. если значение отсутствует, оно будет заменено на \"?\". Для удаления этого можно использовать второй набор {}. Кроме того, любой текст между наборами {} будет удален, если значение отсутствует. Например, {Номер партии: {lot_nr}} будет отображаться только в том случае, если на катушке указан номер партии. Для выделения текста жирным шрифтом выделите его двойной звездочкой **. Нажмите кнопку, чтобы просмотреть список всех доступных тегов.",
|
||||
"useHTTPUrl": {
|
||||
"tooltip": "Будет использоваться проприетарная ссылка, которая будет работать только при сканировании через функцию сканирования Spoolman (по умолчанию). URL использует либо базовый URL, указанный в настройках, либо URL текущей страницы, если он не задан.",
|
||||
"label": "Ссылка на QR-код",
|
||||
"options": {
|
||||
"default": "По умолчанию",
|
||||
"url": "URL"
|
||||
},
|
||||
"preview": "Предварительный просмотр:"
|
||||
},
|
||||
"showQRCodeMode": {
|
||||
"no": "Нет",
|
||||
"simple": "Простой",
|
||||
"withIcon": "Со значком"
|
||||
},
|
||||
"showQRCode": "Печать QR-кода"
|
||||
},
|
||||
"spoolSelect": {
|
||||
"title": "Выберите катушки",
|
||||
"description": "Выберите катушки для печати QR-кодов.",
|
||||
"description": "Выберите катушки для печати этикеток.",
|
||||
"showArchived": "Показать архивные",
|
||||
"noSpoolsSelected": "Вы не выбрали ни одной катушки.",
|
||||
"selectAll": "Выбрать/отменить выбор всего",
|
||||
@@ -134,7 +165,7 @@
|
||||
"id": "ID",
|
||||
"filament_name": "Филамент",
|
||||
"filament": "Филамент",
|
||||
"material": "Тип",
|
||||
"material": "Материал",
|
||||
"used_weight": "Использованный вес",
|
||||
"remaining_weight": "Оставшийся вес",
|
||||
"used_length": "Использованная длина",
|
||||
@@ -148,16 +179,23 @@
|
||||
"archived": "В архиве",
|
||||
"measured_weight": "Измеренный вес",
|
||||
"weight_to_use": "Масса",
|
||||
"price": ""
|
||||
"price": "Цена",
|
||||
"initial_weight": "Начальный вес",
|
||||
"spool_weight": "Пустой вес",
|
||||
"filament_internal": "Внутренний",
|
||||
"filament_external": "Внешний"
|
||||
},
|
||||
"fields_help": {
|
||||
"used_weight": "Сколько филамента было использовано с катушки. На новой катушке должно быть использовано 0 г.",
|
||||
"location": "Где находится катушка, если у вас есть несколько мест хранения катушек.",
|
||||
"lot_nr": "Номер партии производителя. Может использоваться для обеспечения однородного цвета отпечатка при использовании нескольких катушек.",
|
||||
"lot_nr": "Номер партии производителя. Может использоваться для обеспечения однородного цвета печати при использовании нескольких катушек.",
|
||||
"weight_to_use": "Выберите, какое значение веса ввести. Измеренный вес доступен только в том случае, если вес катушки установлен для выбранной филамента.",
|
||||
"measured_weight": "Сколько весит филамент и катушка.",
|
||||
"remaining_weight": "Сколько филамента осталось на катушке. Для новой катушки этот вес должен соответствовать весу катушки.",
|
||||
"price": ""
|
||||
"price": "Цена полной катушки. Если не указано, будет использоваться цена филамента.",
|
||||
"initial_weight": "Исходный вес филамента на катушке (вес нетто). Если не задан, будет использоваться вес объекта, на котором находится филамент.",
|
||||
"spool_weight": "Вес пустой катушки. Оставьте значение \"пусто\", чтобы использовать значение, указанное в описании филамента или у производителя.",
|
||||
"external_filament": "Вы выбрали филамент из внешней базы данных. Объект филамент (и, возможно, объект производителя) будет создан автоматически при создании этой катушки. При этом могут возникнуть повторяющиеся объекты филамента, если вы уже создали объект филамент для этой нити накала."
|
||||
},
|
||||
"titles": {
|
||||
"create": "Создать Катушку",
|
||||
@@ -166,14 +204,25 @@
|
||||
"list": "Катушки",
|
||||
"show": "Показать Катушку",
|
||||
"archive": "Архивировать Катушку",
|
||||
"show_title": "[Катушка #{{id}}] {{name}}"
|
||||
"show_title": "[Катушка #{{id}}] {{name}}",
|
||||
"adjust": "Отрегулируйте филамент катушки"
|
||||
},
|
||||
"messages": {
|
||||
"archive": "Вы уверены, что хотите добавить в архив эту катушку?"
|
||||
},
|
||||
"form": {
|
||||
"spool_updated": "Эта катушка была обновлена кем-то/чем-то другим с тех пор, как вы открыли эту страницу. При сохранении эти изменения перезапишутся!",
|
||||
"new_location_prompt": "Введите новое местоположение"
|
||||
"new_location_prompt": "Введите новое местоположение",
|
||||
"measurement_type": {
|
||||
"weight": "Вес",
|
||||
"length": "Длина"
|
||||
},
|
||||
"adjust_filament_help": "Здесь вы можете напрямую добавлять или вычитать филамент из катушки. При положительном значении филамент будет израсходован, при отрицательном - добавлен.",
|
||||
"measurement_type_label": "Тип измерения",
|
||||
"adjust_filament_value": "Потребляемое количество"
|
||||
},
|
||||
"formats": {
|
||||
"last_used": "Последнее использование {{date}}"
|
||||
}
|
||||
},
|
||||
"filament": {
|
||||
@@ -183,7 +232,7 @@
|
||||
"vendor_name": "Производитель",
|
||||
"vendor": "Производитель",
|
||||
"name": "Имя",
|
||||
"material": "Тип",
|
||||
"material": "Материал",
|
||||
"price": "Цена",
|
||||
"density": "Плотность",
|
||||
"diameter": "Диаметр",
|
||||
@@ -195,15 +244,21 @@
|
||||
"settings_extruder_temp": "Температура экструдера",
|
||||
"settings_bed_temp": "Температура стола",
|
||||
"color_hex": "Цвет",
|
||||
"spools": "Показать катушки"
|
||||
"spools": "Показать катушки",
|
||||
"coaxial": "Коэкструдированный",
|
||||
"longitudinal": "Продольный",
|
||||
"single_color": "Одноцветный",
|
||||
"multi_color": "Многоцветный",
|
||||
"external_id": "Внешний ID"
|
||||
},
|
||||
"fields_help": {
|
||||
"name": "Название филамента, чтобы отличить этот тип филамента от друго филамента того же производителя. Например, должен содержать цвет.",
|
||||
"name": "Название филамента, чтобы отличить этот тип филамента от других того же производителя. Например, должно содержать цвет.",
|
||||
"material": "Например: PLA, ABS, PETG и т.д.",
|
||||
"price": "Цена полной катушки в валюте, настроенной системой.",
|
||||
"price": "Цена полной катушки.",
|
||||
"weight": "Вес филамента на полной катушке (вес нетто). Сюда не следует включать вес самой катушки, а только филамента. Это то, что обычно пишут на упаковке.",
|
||||
"spool_weight": "Вес пустой катушки. Используется для определения измеренного веса катушки.",
|
||||
"article_number": "Например: EAN, UPC, и т.д."
|
||||
"article_number": "Например: EAN, UPC, и т.д.",
|
||||
"multi_color_direction": "Филаменты могут иметь несколько цветов двумя способами: либо через коэкструзию, как двойные цветные филаменты с постоянными разноцветными участками, либо через продольные изменения цвета, как градиентные филаменты, которые меняют цвет по всей длине катушки."
|
||||
},
|
||||
"titles": {
|
||||
"create": "Создать филамент",
|
||||
@@ -214,7 +269,12 @@
|
||||
"show_title": "[Филамент #{{id}}] {{name}}"
|
||||
},
|
||||
"form": {
|
||||
"filament_updated": "Этот филамент был обновлен кем-то/чем-то другим с тех пор, как вы открыли эту страницу. При сохранении эти изменения перезапишутся!"
|
||||
"filament_updated": "Этот филамент был обновлен кем-то/чем-то другим с тех пор, как вы открыли эту страницу. При сохранении эти изменения перезапишутся!",
|
||||
"import_external": "Импорт из внешнего источника",
|
||||
"import_external_description": "Выберите филамент из списка, чтобы автоматически заполнить его данные в форме создания филамента. Это перезапишет все данные, которые вы ввели в форму.<br><br>Объект \"Производитель\" будет создан автоматически, если это необходимо, когда вы нажмете \"Ок\"."
|
||||
},
|
||||
"buttons": {
|
||||
"add_spool": "Добавить катушку"
|
||||
}
|
||||
},
|
||||
"vendor": {
|
||||
@@ -223,7 +283,9 @@
|
||||
"id": "ID",
|
||||
"name": "Имя",
|
||||
"registered": "Зарегистрирован",
|
||||
"comment": "Комментарий"
|
||||
"comment": "Комментарий",
|
||||
"empty_spool_weight": "Вес пустой катушки",
|
||||
"external_id": "Внешний ID"
|
||||
},
|
||||
"titles": {
|
||||
"create": "Создать производителя",
|
||||
@@ -235,6 +297,9 @@
|
||||
},
|
||||
"form": {
|
||||
"vendor_updated": "Этот производитель был обновлен кем-то/чем-то другим с тех пор, как вы открыли эту страницу. При сохранении эти изменения перезапишутся!"
|
||||
},
|
||||
"fields_help": {
|
||||
"empty_spool_weight": "Вес пустой катушки от этого производителя."
|
||||
}
|
||||
},
|
||||
"table": {
|
||||
@@ -269,6 +334,9 @@
|
||||
},
|
||||
"home": {
|
||||
"list": "Главная | Spoolman"
|
||||
},
|
||||
"locations": {
|
||||
"list": "Местоположения | Spoolman"
|
||||
}
|
||||
},
|
||||
"help": {
|
||||
@@ -277,11 +345,76 @@
|
||||
"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",
|
||||
"home": {
|
||||
"home": "Главная"
|
||||
}
|
||||
"home": "Главная",
|
||||
"welcome": "Добро пожаловать в ваш личный Spoolman!",
|
||||
"description": "Похоже, что вы ещё не добавили ни одной катушки. Посетите <helpPageLink>Страницу помощи</helpPageLink>, для комфортного начала."
|
||||
},
|
||||
"settings": {
|
||||
"extra_fields": {
|
||||
"description": "<p>Здесь вы можете добавить дополнительные пользовательские поля к сущностям.</p><p>После добавления поля нельзя изменить его ключ или тип, а для полей выбора нельзя удалять варианты или изменять состояние множественного выбора. Если вы удалите поле, связанные данные для всех сущностей будут удалены.</p><p>Ключ используется другими программами для чтения и записи данных, поэтому если ваше пользовательское поле должно интегрироваться со сторонней программой, убедитесь, что задали его правильно. Значение по умолчанию применяется только к новым элементам.</p><p>Дополнительные поля можно отображать и сортировать в табличных представлениях. Поля выбора и логические поля также предоставляют там параметры фильтрации, а все типы дополнительных полей поддерживают фильтрацию по пустым значениям.</p>",
|
||||
"tab": "Дополнительные поля",
|
||||
"params": {
|
||||
"key": "Ключ",
|
||||
"name": "Имя",
|
||||
"field_type": "Тип",
|
||||
"unit": "Единица измерения",
|
||||
"order": "Заказ",
|
||||
"choices": "Выбор",
|
||||
"default_value": "Значение по умолчанию",
|
||||
"multi_choice": "Множественный выбор"
|
||||
},
|
||||
"field_type": {
|
||||
"float": "Дробное",
|
||||
"float_range": "Дробный диапазон",
|
||||
"datetime": "Дата и время",
|
||||
"boolean": "Логический",
|
||||
"choice": "Выбор",
|
||||
"text": "Текст",
|
||||
"integer": "Целое число",
|
||||
"integer_range": "Целочисленный диапазон"
|
||||
},
|
||||
"non_unique_key_error": "Ключ должен быть уникальным.",
|
||||
"key_not_changed": "Пожалуйста, замените ключ на что-нибудь другое.",
|
||||
"delete_confirm": "Удалить поле {{name}}?",
|
||||
"delete_confirm_description": "Это приведет к удалению поля и всех связанных с ним данных для всех объектов.",
|
||||
"boolean_true": "Да",
|
||||
"boolean_false": "Нет",
|
||||
"choices_missing_error": "Вы не можете удалить варианты. Отсутствуют следующие варианты: {{choices}}",
|
||||
"choices_reorder_hint": "Перетащите или используйте стрелки."
|
||||
},
|
||||
"header": "Настройки",
|
||||
"general": {
|
||||
"tab": "Общие",
|
||||
"currency": {
|
||||
"label": "Валюта"
|
||||
},
|
||||
"base_url": {
|
||||
"label": "Базовый URL-адрес",
|
||||
"tooltip": "Базовый URL-адрес, используемый при создании таких функций, как QR-коды."
|
||||
},
|
||||
"round_prices": {
|
||||
"tooltip": "Округлять цены до ближайшего целого числа.",
|
||||
"label": "Округлять цены"
|
||||
}
|
||||
},
|
||||
"settings": "Настройки"
|
||||
},
|
||||
"locations": {
|
||||
"no_locations_help": "Эта страница позволяет организовать катушки по местоположениям. Добавьте несколько катушек, чтобы начать!",
|
||||
"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"
|
||||
}
|
||||
}
|
||||
@@ -28,7 +28,8 @@
|
||||
"notAccessTitle": "Du har inte tillgång till denna sida",
|
||||
"hideColumns": "Dölj kolumner",
|
||||
"clearFilters": "Rensa filter",
|
||||
"saveAndAdd": "Spara och Lägg till"
|
||||
"saveAndAdd": "Spara och Lägg till",
|
||||
"continue": "Fortsätt"
|
||||
},
|
||||
"warnWhenUnsavedChanges": "Är du säker på att du vill lämna sidan? Du har osparade ändringar.",
|
||||
"notifications": {
|
||||
@@ -41,7 +42,9 @@
|
||||
"deleteError": "Det gick inte att ta bort {{resource}} (statuskod: {{statusCode}})",
|
||||
"editSuccess": "Lyckades ändra {{resource}}",
|
||||
"editError": "Det gick inte att ändra {{resource}} (statuskod: {{statusCode}})",
|
||||
"importProgress": "Importerar: {{processed}}/{{total}}"
|
||||
"importProgress": "Importerar: {{processed}}/{{total}}",
|
||||
"saveSuccessful": "Sparning lyckades!",
|
||||
"validationError": "Valideringsfel: {{error}}"
|
||||
},
|
||||
"loading": "Laddar",
|
||||
"version": "Version",
|
||||
@@ -85,29 +88,57 @@
|
||||
"none": "Ingen",
|
||||
"border": "Ram",
|
||||
"grid": "Rutnät"
|
||||
}
|
||||
},
|
||||
"defaultSettings": "Standard",
|
||||
"newSetting": "Ny",
|
||||
"settingsName": "Inställningsnamn",
|
||||
"deleteSettingsConfirm": "Är du säker på att du vill radera den nuvarande inställningen?",
|
||||
"itemCopies": "Kopior",
|
||||
"settings": "Inställningar",
|
||||
"addSettings": "Skapa inställning",
|
||||
"saveSetting": "Spara inställningar",
|
||||
"duplicateSettings": "Duplicera",
|
||||
"deleteSettings": "Radera nuvarande inställning",
|
||||
"saveAsImage": "Spara som bild"
|
||||
},
|
||||
"qrcode": {
|
||||
"button": "Skriv ut QR-koder",
|
||||
"title": "QR-kod utskrift",
|
||||
"button": "Skriv ut etiketter",
|
||||
"title": "Etikettutskrift",
|
||||
"spoolWeight": "Spolvikt: {{weight}}",
|
||||
"lotNr": "Batch: {{lot}}",
|
||||
"bedTemp": "BT: {{temp}}",
|
||||
"extruderTemp": "ET: {{temp}}",
|
||||
"textSize": "Textstorlek",
|
||||
"showSpoolmanIcon": "Visa Spoolman-ikon",
|
||||
"showContent": "Etikett",
|
||||
"showVendor": "Leverantör",
|
||||
"showContent": "Visa text",
|
||||
"showVendor": "Tillverkare",
|
||||
"showLotNr": "Batchnummer",
|
||||
"showSpoolWeight": "Spolvikt",
|
||||
"showTemperatures": "Temperaturer",
|
||||
"showSpoolComment": "Spolkommentar",
|
||||
"showFilamentComment": "Filamentkommentar",
|
||||
"showVendorComment": "Leverantörskommentar"
|
||||
"showVendorComment": "Tillverkarkommentar",
|
||||
"template": "Textmall",
|
||||
"templateHelp": "Använd {} för att infoga värden från spolobjektet som text. Till exempel kommer {id} att ersättas med spolens id, eller {filament.material} att ersättas med filamentets material. Omslut text med dubbla asterisker ** för att göra den fetstilad. Klicka på knappen för att visa en lista över alla tillgängliga taggar.",
|
||||
"showQRCode": "Visa QR-kod",
|
||||
"showQRCodeMode": {
|
||||
"no": "Nej",
|
||||
"simple": "Enkel",
|
||||
"withIcon": "Med logga"
|
||||
},
|
||||
"useHTTPUrl": {
|
||||
"options": {
|
||||
"default": "",
|
||||
"url": ""
|
||||
},
|
||||
"preview": "",
|
||||
"tooltip": "",
|
||||
"label": ""
|
||||
}
|
||||
},
|
||||
"spoolSelect": {
|
||||
"title": "Välj spolar",
|
||||
"description": "Välj spolar att skriva ut QR-koder för.",
|
||||
"description": "Välj spolar att skriva ut etiketter för.",
|
||||
"showArchived": "Tillåt arkiverade",
|
||||
"noSpoolsSelected": "Du har inte valt några spolar.",
|
||||
"selectAll": "Markera/avmarkera alla",
|
||||
@@ -146,7 +177,12 @@
|
||||
"comment": "Kommentar",
|
||||
"archived": "Arkiverad",
|
||||
"measured_weight": "Uppmätt vikt",
|
||||
"weight_to_use": "Vikt"
|
||||
"weight_to_use": "Vikt",
|
||||
"price": "Pris",
|
||||
"initial_weight": "Initial Vikt",
|
||||
"spool_weight": "Tom Vikt",
|
||||
"filament_internal": "Interna",
|
||||
"filament_external": "Externa"
|
||||
},
|
||||
"fields_help": {
|
||||
"used_weight": "Hur mycket filament som använts på spolen. En ny spole har värdet 0g.",
|
||||
@@ -154,7 +190,11 @@
|
||||
"lot_nr": "Tillverkarens batchnummer. Kan användas för att se till att en utskrift har jämn färg ifall flera spolar används.",
|
||||
"weight_to_use": "Välj vilken typ av vikt du vill fylla i. Uppmätt vikt är endast tillgänglig om det valda filamentet har en spolvikt satt.",
|
||||
"measured_weight": "Hur mycket filamentet och spolen väger tillsammans.",
|
||||
"remaining_weight": "Hur mycket filament som finns kvar på spolen. För en ny spole så är detta det värdet som står på etiketten."
|
||||
"remaining_weight": "Hur mycket filament som finns kvar på spolen. För en ny spole så är detta det värdet som står på etiketten.",
|
||||
"price": "Pris för en hel rulle. Om det inte är inställt kommer priset för filamentet istället att antas.",
|
||||
"initial_weight": "Ursprungsvikt av filament på spolen (nettovikt). Om du inte sätter detta så tas vikten från filamentobjektet.",
|
||||
"spool_weight": "Vikten på en tom spole. Lämna tom för att ta värdet från filament- eller tillverkarobjektet.",
|
||||
"external_filament": "Du har valt ett filament från den externa databasen. Ett filamentobjekt (och eventuellt ett tillverkarobjekt) kommer att skapas automatiskt när du skapar denna spole. Detta kan skapa duplicerade filamentobjekt om du redan har skapat ett filamentobjekt för denna filament."
|
||||
},
|
||||
"titles": {
|
||||
"create": "Skapa spole",
|
||||
@@ -163,22 +203,33 @@
|
||||
"list": "Spolar",
|
||||
"show": "Visa spole",
|
||||
"archive": "Arkivera spole",
|
||||
"show_title": "[Spole #{{id}}] {{name}}"
|
||||
"show_title": "[Spole #{{id}}] {{name}}",
|
||||
"adjust": "Justera Spolmängd"
|
||||
},
|
||||
"messages": {
|
||||
"archive": "Är du säker på att du vill arkivera denna spole?"
|
||||
},
|
||||
"form": {
|
||||
"new_location_prompt": "Fyll i en ny plats",
|
||||
"spool_updated": "Den här spolen har uppdaterats av något eller någon sedan du öppnade den här sidan. Om du sparar så skriver du över ändringarna!"
|
||||
"spool_updated": "Den här spolen har uppdaterats av något eller någon sedan du öppnade den här sidan. Om du sparar så skriver du över ändringarna!",
|
||||
"measurement_type": {
|
||||
"length": "Längd",
|
||||
"weight": "Vikt"
|
||||
},
|
||||
"measurement_type_label": "Mättyp",
|
||||
"adjust_filament_value": "Mängd att konsumera",
|
||||
"adjust_filament_help": "Här kan du direkt lägga till eller subtrahera filament från spolen. Ett positivt värde kommer att konsumera filament, ett negativt värde kommer att lägga till det."
|
||||
},
|
||||
"formats": {
|
||||
"last_used": "Senast använd {{date}}"
|
||||
}
|
||||
},
|
||||
"filament": {
|
||||
"filament": "Filament",
|
||||
"fields": {
|
||||
"id": "ID",
|
||||
"vendor_name": "Leverantör",
|
||||
"vendor": "Leverantör",
|
||||
"vendor_name": "Tillverkare",
|
||||
"vendor": "Tillverkare",
|
||||
"name": "Namn",
|
||||
"material": "Material",
|
||||
"price": "Pris",
|
||||
@@ -192,15 +243,21 @@
|
||||
"settings_extruder_temp": "Extrudertemp",
|
||||
"settings_bed_temp": "Bäddtemp",
|
||||
"color_hex": "Färg",
|
||||
"spools": "Visa spolar"
|
||||
"spools": "Visa spolar",
|
||||
"single_color": "Enkel",
|
||||
"multi_color": "Flerfärgad",
|
||||
"coaxial": "Coextruderad",
|
||||
"longitudinal": "Longitudinell",
|
||||
"external_id": "Externt ID"
|
||||
},
|
||||
"fields_help": {
|
||||
"name": "Filamentets namn, för att skilja detta filament från andra från samma leverantör. Bör innehålla färgen till exempel.",
|
||||
"name": "Filamentets namn, för att skilja detta filament från andra från samma tillverkare. Bör innehålla färgen till exempel.",
|
||||
"material": "T.ex. PLA, ABS, PETG, etc.",
|
||||
"price": "Pris för en full spole i systemets valuta.",
|
||||
"price": "Pris för en full spole.",
|
||||
"weight": "Vikten på en full spole (nettovikt). Detta ska inte inkludera vikten på spolen själv, bara filamentet. Det är vad som vanligtvis står på förpackningen.",
|
||||
"spool_weight": "Vikten på en tom spole. Används för att beräkna filamentvikten från en vägning.",
|
||||
"article_number": "T.ex. EAN, UPC, etc."
|
||||
"article_number": "T.ex. EAN, UPC, etc.",
|
||||
"multi_color_direction": "Filament kan ha flera färger på två sätt: antingen genom coextrudering, så som två-färgs filament med konsekventa multifärger, eller genom longitudinella färgförändringar, så som gradientfilament som skiftar färger längs spolen."
|
||||
},
|
||||
"titles": {
|
||||
"create": "Skapa filament",
|
||||
@@ -211,35 +268,96 @@
|
||||
"show_title": "[Filament #{{id}}] {{name}}"
|
||||
},
|
||||
"form": {
|
||||
"filament_updated": "Det här filamentet har uppdaterats av något eller någon sedan du öppnade den här sidan. Om du sparar så skriver du över ändringarna!"
|
||||
"filament_updated": "Det här filamentet har uppdaterats av något eller någon sedan du öppnade den här sidan. Om du sparar så skriver du över ändringarna!",
|
||||
"import_external": "Importera från externt",
|
||||
"import_external_description": "Välj ett filament i listan för att automatiskt fylla dess detaljer i formuläret. Detta kommer att skriva över alla data som du har angett i formuläret.<br><br>Ett tillverkarobjekt skapas automatiskt när du klickar på Ok, om det behövs."
|
||||
},
|
||||
"buttons": {
|
||||
"add_spool": "Skapa Spole"
|
||||
}
|
||||
},
|
||||
"vendor": {
|
||||
"vendor": "Leverantörer",
|
||||
"vendor": "Tillverkare",
|
||||
"fields": {
|
||||
"id": "ID",
|
||||
"name": "Namn",
|
||||
"registered": "Registrerad",
|
||||
"comment": "Kommentar"
|
||||
"comment": "Kommentar",
|
||||
"empty_spool_weight": "Tom spolvikt",
|
||||
"external_id": "Externt ID"
|
||||
},
|
||||
"titles": {
|
||||
"create": "Skapa leverantör",
|
||||
"clone": "Klona leverantör",
|
||||
"edit": "Ändra leverantör",
|
||||
"list": "Leverantörer",
|
||||
"show": "Visa leverantör",
|
||||
"show_title": "[Leverantör #{{id}}] {{name}}"
|
||||
"create": "Skapa tillverkare",
|
||||
"clone": "Klona tillverkare",
|
||||
"edit": "Ändra tillverkare",
|
||||
"list": "Tillverkare",
|
||||
"show": "Visa tillverkare",
|
||||
"show_title": "[Tillverkare #{{id}}] {{name}}"
|
||||
},
|
||||
"form": {
|
||||
"vendor_updated": "Den här leverantören har uppdaterats av något eller någon sedan du öppnade den här sidan. Om du sparar så skriver du över ändringarna!"
|
||||
"vendor_updated": "Den här tillverkaren har uppdaterats av något eller någon sedan du öppnade den här sidan. Om du sparar så skriver du över ändringarna!"
|
||||
},
|
||||
"fields_help": {
|
||||
"empty_spool_weight": "Vikten av en tom spool från denna tillverkare."
|
||||
}
|
||||
},
|
||||
"home": {
|
||||
"home": "Hem"
|
||||
"home": "Hem",
|
||||
"welcome": "",
|
||||
"description": ""
|
||||
},
|
||||
"table": {
|
||||
"actions": "Åtgärder"
|
||||
},
|
||||
"settings": {
|
||||
"settings": "Inställningar",
|
||||
"header": "Inställningar",
|
||||
"general": {
|
||||
"tab": "Allmänt",
|
||||
"currency": {
|
||||
"label": "Valuta"
|
||||
},
|
||||
"base_url": {
|
||||
"tooltip": "",
|
||||
"label": ""
|
||||
},
|
||||
"round_prices": {
|
||||
"label": "",
|
||||
"tooltip": ""
|
||||
}
|
||||
},
|
||||
"extra_fields": {
|
||||
"tab": "Extra Fält",
|
||||
"description": "<p>Här kan du lägga till extra anpassade fält för dina objekt.</p><p>När ett fält har lagts till kan du inte ändra dess nyckel eller typ, och för fält av typen \"val\" kan du inte ta bort val eller ändra flervalsläget. Om du tar bort ett fält kommer den associerade datan för alla enheter att raderas.</p><p>Nyckeln är vad andra program läser/skriver datan som, så om ditt anpassade fält ska integreras med ett tredjepartsprogram, se till att ställa in det korrekt. Standardvärdet tillämpas endast på nya objekt.</p><p>Extra fält kan inte sorteras eller filtreras i tabellvyn.</p>",
|
||||
"params": {
|
||||
"unit": "Enhet",
|
||||
"default_value": "Standardvärde",
|
||||
"key": "Nyckel",
|
||||
"field_type": "Typ",
|
||||
"name": "Namn",
|
||||
"choices": "Val",
|
||||
"order": "Ordning",
|
||||
"multi_choice": "Flerval"
|
||||
},
|
||||
"field_type": {
|
||||
"integer_range": "Heltalsintervall",
|
||||
"float": "Decimaltal",
|
||||
"float_range": "Decimaltalsintervall",
|
||||
"datetime": "Datum och tid",
|
||||
"boolean": "Booleansk",
|
||||
"choice": "Val",
|
||||
"text": "Text",
|
||||
"integer": "Heltal"
|
||||
},
|
||||
"boolean_true": "Ja",
|
||||
"boolean_false": "Nej",
|
||||
"choices_missing_error": "Du kan inte ta bort val. Följande val saknas: {{choices}}",
|
||||
"delete_confirm_description": "Detta kommer att radera fältet och all tillhörande data för alla objekt.",
|
||||
"delete_confirm": "Ta bort fältet {{name}}?",
|
||||
"non_unique_key_error": "Nyckeln måste vara unik.",
|
||||
"key_not_changed": "Vänligen ändra nyckeln till något annat."
|
||||
}
|
||||
},
|
||||
"documentTitle": {
|
||||
"default": "Spoolman",
|
||||
"suffix": " | Spoolman",
|
||||
@@ -261,14 +379,17 @@
|
||||
"clone": "#{{id}} Klona spole | Spoolman"
|
||||
},
|
||||
"vendor": {
|
||||
"list": "Leverantörer | Spoolman",
|
||||
"show": "#{{id}} Visa leverantör | Spoolman",
|
||||
"edit": "#{{id}} Redigera leverantör | Spoolman",
|
||||
"create": "Skapa leverantör | Spoolman",
|
||||
"clone": "#{{id}} Klona leverantör | Spoolman"
|
||||
"list": "Tillverkare | Spoolman",
|
||||
"show": "#{{id}} Visa tillverkare | Spoolman",
|
||||
"edit": "#{{id}} Redigera tillverkare | Spoolman",
|
||||
"create": "Skapa tillverkare | Spoolman",
|
||||
"clone": "#{{id}} Klona tillverkare | Spoolman"
|
||||
},
|
||||
"help": {
|
||||
"list": "Hjälp | Spoolman"
|
||||
},
|
||||
"locations": {
|
||||
"list": ""
|
||||
}
|
||||
},
|
||||
"help": {
|
||||
@@ -277,8 +398,14 @@
|
||||
"filament": "Märken av filament. De har egenskaper som namn, material, färg, diameter och mer.",
|
||||
"spool": "Individuella fysiska spolar av ett specifikt filament."
|
||||
},
|
||||
"description": "<title>Hjälp</title><p>Här är några tips för att komma igång.</p><p>Spoolman innehåller 3 olika typer av data:</p><itemsHelp/><p>För att lägga till en ny spole i databasen måste du först skapa ett <filamentCreateLink>Filament</filamentCreateLink>-objekt för den. När det är klart kan du sedan skapa ett <spoolCreateLink>Spol</spoolCreateLink>-objekt för den individuella spolen. Om du sedan köper ytterligare spolar av samma filament kan du bara skapa ytterligare Spol-objekt och återanvända samma Filament-objekt.</p><p>Du kan valfritt också skapa ett <vendorCreateLink>Leverantörs</vendorCreateLink>-objekt för företaget som tillverkar filamentet om du vill spåra den informationen.</p><p>Du kan koppla andra 3D-skrivartjänster till Spoolman, som Moonraker, som sedan automatiskt kan spåra filamentanvändning och uppdatera Spol-objekten åt dig. Se <readmeLink>Spoolman README</readmeLink> för hur du gör det.</p>",
|
||||
"description": "<title>Hjälp</title><p>Här är några tips för att komma igång.</p><p>Spoolman innehåller 3 olika typer av data:</p><itemsHelp/><p>För att lägga till en ny spole i databasen måste du först skapa ett <filamentCreateLink>Filament</filamentCreateLink>-objekt för den. När det är klart kan du sedan skapa ett <spoolCreateLink>Spol</spoolCreateLink>-objekt för den individuella spolen. Om du sedan köper ytterligare spolar av samma filament kan du bara skapa ytterligare Spol-objekt och återanvända samma Filament-objekt.</p><p>Du kan valfritt också skapa ett <vendorCreateLink>Tillverkar</vendorCreateLink>-objekt för företaget som tillverkar filamentet om du vill spåra den informationen.</p><p>Du kan koppla andra 3D-skrivartjänster till Spoolman, som Moonraker, som sedan automatiskt kan spåra filamentanvändning och uppdatera Spol-objekten åt dig. Se <readmeLink>Spoolman README</readmeLink> för hur du gör det.</p>",
|
||||
"help": "Hjälp"
|
||||
},
|
||||
"kofi": "Dricksa mig på Ko-fi"
|
||||
"kofi": "Dricksa mig på Ko-fi",
|
||||
"locations": {
|
||||
"new_location": "Ny plats",
|
||||
"no_location": "Ingen plats",
|
||||
"locations": "",
|
||||
"no_locations_help": ""
|
||||
}
|
||||
}
|
||||
@@ -0,0 +1,399 @@
|
||||
{
|
||||
"buttons": {
|
||||
"hideArchived": "காப்பகப்படுத்தப்பட்டதை மறைக்கவும்",
|
||||
"create": "உருவாக்கு",
|
||||
"save": "சேமி",
|
||||
"saveAndAdd": "சேமித்து சேர்க்கவும்",
|
||||
"logout": "விடுபதிகை",
|
||||
"delete": "நீக்கு",
|
||||
"edit": "தொகு",
|
||||
"cancel": "ரத்துசெய்",
|
||||
"confirm": "நீங்கள் உறுதியாக இருக்கிறீர்களா?",
|
||||
"continue": "தொடரவும்",
|
||||
"filter": "வடிப்பி",
|
||||
"clear": "தெளிவான",
|
||||
"refresh": "புதுப்பிப்பு",
|
||||
"show": "காட்டு",
|
||||
"undo": "செயல்தவிர்",
|
||||
"import": "இறக்குமதி",
|
||||
"clone": "நகலி",
|
||||
"archive": "காப்பகம்",
|
||||
"unArchive": "அன்கான்",
|
||||
"showArchived": "காப்பகப்படுத்தப்பட்டதைக் காட்டு",
|
||||
"notAccessTitle": "அணுக உங்களுக்கு இசைவு இல்லை",
|
||||
"hideColumns": "நெடுவரிசைகளை மறைக்கவும்",
|
||||
"clearFilters": "தெளிவான வடிப்பான்கள்"
|
||||
},
|
||||
"printing": {
|
||||
"generic": {
|
||||
"itemCopies": "உருப்படி நகல்கள்",
|
||||
"title": "அச்சிடுதல்",
|
||||
"description": "விரும்பிய அச்சு தளவமைப்பைப் பெற கீழேயுள்ள அமைப்புகளில் டியூன் செய்யுங்கள். அச்சுப்பொறிகளும் உங்கள் ஓஎச்வும் அதன் சொந்த ஓரங்கள் மற்றும் அளவிடுதலைப் பயன்படுத்தலாம் என்பதை நினைவில் கொள்ளுங்கள், எனவே இவை அனைத்தும் சரியானதாக இருப்பதற்கு முன்பு நீங்கள் சில சோதனை மற்றும் பிழை செய்ய வேண்டியிருக்கும். உண்மையான லேபிள்களில் அச்சிடுவதற்கு முன் வழக்கமான காகிதத்தில் அதை சோதிக்கவும்.",
|
||||
"helpMargin": "உங்கள் சிட்டை காகிதம் மற்றும் அச்சுப்பொறியுடன் பொருந்தக்கூடிய வகையில் விளிம்புகள் கட்டமைக்கப்பட வேண்டும், இவற்றை மாற்றுவது முழு கட்டத்தின் அளவையும் பாதிக்கும்.",
|
||||
"helpPrinterMargin": "உங்கள் அச்சுப்பொறி எவ்வளவு நெருக்கமாக அச்சிட முடியும் என்பதற்கு பாதுகாப்பான-மண்டலத்தை அமைக்க வேண்டும், இவற்றை மாற்றுவது முழு கட்டத்தையும் பாதிக்காது.",
|
||||
"print": "அச்சிடுக",
|
||||
"columns": "நெடுவரிசைகள்",
|
||||
"rows": "வரிசைகள்",
|
||||
"paperSize": "காகித அளவு",
|
||||
"customSize": "தனிப்பயன்",
|
||||
"dimensions": "பரிமாணங்கள்",
|
||||
"showBorder": "எல்லையைக் காட்டு",
|
||||
"previewScale": "முன்னோட்டம் அளவு",
|
||||
"skipItems": "உருப்படிகளைத் தவிர்க்கவும்",
|
||||
"contentSettings": "உள்ளடக்க அமைப்புகள்",
|
||||
"layoutSettings": "தளவமைப்பு அமைப்புகள்",
|
||||
"horizontalSpacing": "கிடைமட்ட இடைவெளி",
|
||||
"verticalSpacing": "செங்குத்து இடைவெளி",
|
||||
"marginLeft": "இடது விளிம்பு",
|
||||
"marginRight": "வலது விளிம்பு",
|
||||
"marginTop": "மேல் விளிம்பு",
|
||||
"marginBottom": "கீழ் விளிம்பு",
|
||||
"printerMarginLeft": "பாதுகாப்பான மண்டலம் இடது",
|
||||
"printerMarginRight": "பாதுகாப்பான-மண்டல உரிமை",
|
||||
"printerMarginTop": "பாதுகாப்பான-மண்டல மேல்",
|
||||
"printerMarginBottom": "பாதுகாப்பான-மண்டல கீழே",
|
||||
"borders": {
|
||||
"none": "எதுவுமில்லை",
|
||||
"border": "எல்லை",
|
||||
"grid": "வலைவாய்"
|
||||
},
|
||||
"settings": "முன்னமைவுகள்",
|
||||
"defaultSettings": "இயல்புநிலை",
|
||||
"addSettings": "புதிய முன்னமைவைச் சேர்க்கவும்",
|
||||
"newSetting": "புதிய",
|
||||
"duplicateSettings": "நகல்",
|
||||
"deleteSettings": "தற்போதைய முன்னமைவை நீக்கு",
|
||||
"deleteSettingsConfirm": "இந்த முன்னமைவை நீக்க விரும்புகிறீர்களா?",
|
||||
"settingsName": "முன்னமைக்கப்பட்ட பெயர்",
|
||||
"saveAsImage": "படமாக சேமிக்கவும்",
|
||||
"saveSetting": "முன்னமைவுகளை சேமிக்கவும்"
|
||||
},
|
||||
"qrcode": {
|
||||
"button": "லேபிள்களை அச்சிடுக",
|
||||
"title": "சிட்டை அச்சிடுதல்",
|
||||
"template": "சிட்டை வார்ப்புரு",
|
||||
"templateHelp": "ச்பூல் பொருளின் மதிப்புகளை உரையாக செருக {} ஐப் பயன்படுத்தவும். எடுத்துக்காட்டாக, {id} ச்பூல் ஐடியுடன் மாற்றப்படும், அல்லது {filament.material} ச்பூலின் பொருள் மூலம் மாற்றப்படும். ஒரு மதிப்பு காணவில்லை என்றால் அது \"?\" இதை அகற்ற {of இன் இரண்டாவது தொகுப்பு பயன்படுத்தப்படலாம். கூடுதலாக, மதிப்பு காணவில்லை எனில் {of இன் தொகுப்புகளுக்கு இடையில் எந்த உரையும் அகற்றப்படும். எடுத்துக்காட்டாக, {lot nr: {lot_nr} எச்பி ச்பூலில் நிறைய எண் இருந்தால் மட்டுமே லேபிளைக் காண்பிக்கும். தைரியமாக மாற்ற இரட்டை ஆச்டெரிக்ச் ** உடன் உரையை இணைக்கவும். கிடைக்கக்கூடிய அனைத்து குறிச்சொற்களின் பட்டியலையும் காண பொத்தானைக் சொடுக்கு செய்க.",
|
||||
"textSize": "உரை அளவு சிட்டை",
|
||||
"showContent": "சிட்டை அச்சு",
|
||||
"useHTTPUrl": {
|
||||
"label": "QR குறியீடு இணைப்பு",
|
||||
"tooltip": "ச்பூல்மேனின் ச்கேனிங் அம்சத்திலிருந்து (இயல்புநிலை) ச்கேன் செய்யப்பட்டால் மட்டுமே செயல்படும் தனியுரிம இணைப்பைப் பயன்படுத்தும். அமைப்புகளில் குறிப்பிடப்பட்டுள்ள அடிப்படை முகவரி அல்லது தற்போதைய பக்க முகவரி ஐ அமைக்கவில்லை என்றால் முகவரி பயன்படுத்துகிறது.",
|
||||
"options": {
|
||||
"default": "இயல்புநிலை",
|
||||
"url": "முகவரி"
|
||||
},
|
||||
"preview": "முன்னோட்டம்:"
|
||||
},
|
||||
"showQRCode": "QR குறியீட்டை அச்சிடுக",
|
||||
"showQRCodeMode": {
|
||||
"no": "இல்லை",
|
||||
"simple": "எளிய",
|
||||
"withIcon": "ஐகானுடன்"
|
||||
}
|
||||
},
|
||||
"spoolSelect": {
|
||||
"title": "ச்பூல்களைத் தேர்ந்தெடுக்கவும்",
|
||||
"description": "லேபிள்களை அச்சிட ச்பூல்களைத் தேர்ந்தெடுக்கவும்.",
|
||||
"showArchived": "காப்பகப்படுத்தப்பட்டதைக் காட்டு",
|
||||
"noSpoolsSelected": "நீங்கள் எந்த ச்பூல்களையும் தேர்வு செய்யவில்லை.",
|
||||
"selectAll": "அனைத்தையும் தேர்ந்தெடு/தேர்வுநீக்கு",
|
||||
"selectedTotal_one": "{{count}} ச்பூல் தேர்ந்தெடுக்கப்பட்டது",
|
||||
"selectedTotal_other": "{{count}} spools தேர்ந்தெடுக்கப்பட்டவை"
|
||||
}
|
||||
},
|
||||
"spool": {
|
||||
"titles": {
|
||||
"create": "ச்பூலை உருவாக்கவும்",
|
||||
"clone": "நகலி ச்பூல்",
|
||||
"edit": "திருத்து ச்பூல்",
|
||||
"list": "ச்பூல்கள்",
|
||||
"show": "ச்பூல் காட்டு",
|
||||
"show_title": "[ச்பூல் #{{id}}] {{name}}",
|
||||
"archive": "காப்பக ச்பூல்",
|
||||
"adjust": "ச்பூல் இழை சரிசெய்யவும்"
|
||||
},
|
||||
"messages": {
|
||||
"archive": "இந்த ச்பூலை காப்பகப்படுத்த விரும்புகிறீர்களா?"
|
||||
},
|
||||
"spool": "ச்பூல்கள்",
|
||||
"fields": {
|
||||
"id": "ஐடி",
|
||||
"filament_name": "தாள்",
|
||||
"filament": "தாள்",
|
||||
"remaining_weight": "மீதமுள்ள எடை",
|
||||
"filament_internal": "உள்",
|
||||
"filament_external": "வெளிப்புறம்",
|
||||
"price": "விலை",
|
||||
"material": "பொருள்",
|
||||
"weight_to_use": "எடை",
|
||||
"used_weight": "பயன்படுத்தப்பட்ட எடை",
|
||||
"measured_weight": "அளவிடப்பட்ட எடை",
|
||||
"used_length": "பயன்படுத்தப்பட்ட நீளம்",
|
||||
"remaining_length": "மீதமுள்ள நீளம்",
|
||||
"initial_weight": "தொடக்க எடை",
|
||||
"spool_weight": "வெற்று எடை",
|
||||
"location": "இடம்",
|
||||
"lot_nr": "நிறைய இல்லை",
|
||||
"first_used": "முதலில் பயன்படுத்தப்பட்டது",
|
||||
"last_used": "கடைசியாக பயன்படுத்தப்பட்டது",
|
||||
"registered": "பதிவுசெய்யப்பட்டது",
|
||||
"comment": "கருத்து",
|
||||
"archived": "காப்பகப்படுத்தப்பட்டது"
|
||||
},
|
||||
"fields_help": {
|
||||
"price": "ஒரு முழு ச்பூலின் விலை. அமைக்கப்படாவிட்டால், அதற்கு பதிலாக இழைகளின் விலை ஏற்றுக்கொள்ளப்படும்.",
|
||||
"weight_to_use": "என்ன எடை மதிப்பை உள்ளிட வேண்டும் என்பதைத் தேர்ந்தெடுக்கவும். தேர்ந்தெடுக்கப்பட்ட இழைக்கு ச்பூல் எடை அமைக்கப்பட்டால் மட்டுமே அளவிடப்பட்ட எடை கிடைக்கும்.",
|
||||
"remaining_weight": "ச்பூலில் எவ்வளவு இழை விடப்பட்டுள்ளது. ஒரு புதிய ச்பூலுக்கு இது ச்பூல் எடையுடன் பொருந்த வேண்டும்.",
|
||||
"used_weight": "ச்பூலில் இருந்து எவ்வளவு இழை பயன்படுத்தப்பட்டுள்ளது. ஒரு புதிய ச்பூல் 0 ஐயா பயன்படுத்தப்பட வேண்டும்.",
|
||||
"measured_weight": "இழை மற்றும் ச்பூல் எவ்வளவு எடை கொண்டது.",
|
||||
"initial_weight": "ச்பூலில் (நிகர எடை) இழைகளின் ஆரம்ப எடை. அமைக்காவிட்டால் இழை பொருளிலிருந்து எடையைப் பயன்படுத்தும்.",
|
||||
"spool_weight": "ச்பூலின் காலியாக இருக்கும்போது அது எடை. இழை அல்லது உற்பத்தியாளரிடமிருந்து மதிப்பைப் பயன்படுத்த காலியாக விடவும்.",
|
||||
"location": "உங்கள் ச்பூல்களை சேமிக்கும் பல இடங்கள் இருந்தால் ச்பூல் அமைந்துள்ள இடத்தில்.",
|
||||
"lot_nr": "உற்பத்தியாளரின் நிறைய எண். பல ச்பூல்கள் பயன்படுத்தப்பட்டால் அச்சுக்கு நிலையான வண்ணம் இருப்பதை உறுதிப்படுத்த பயன்படுத்தலாம்.",
|
||||
"external_filament": "வெளிப்புற தரவுத்தளத்திலிருந்து ஒரு இழை தேர்வு செய்துள்ளீர்கள். இந்த ச்பூலை நீங்கள் உருவாக்கும்போது ஒரு இழை பொருள் (மற்றும் ஒரு உற்பத்தியாளர் பொருள்) தானாக உருவாக்கப்படும். இந்த இழைக்கு நீங்கள் ஏற்கனவே ஒரு இழை பொருளை உருவாக்கியிருந்தால் இது நகல் இழை பொருள்களை உருவாக்க முடியும்."
|
||||
},
|
||||
"form": {
|
||||
"measurement_type": {
|
||||
"length": "நீளம்",
|
||||
"weight": "எடை"
|
||||
},
|
||||
"measurement_type_label": "அளவீட்டு வகை",
|
||||
"adjust_filament_help": "இங்கே நீங்கள் நேரடியாக ச்பூலில் இருந்து இழைகளைச் சேர்க்கலாம் அல்லது கழிக்கலாம். நேர்மறையான மதிப்பு இழையை நுகரும், எதிர்மறை மதிப்பு அதைச் சேர்க்கும்.",
|
||||
"adjust_filament_value": "தொகையை உட்கொள்ளுங்கள்",
|
||||
"new_location_prompt": "புதிய இடத்தை உள்ளிடவும்",
|
||||
"spool_updated": "இந்த பக்கத்தைத் திறந்ததிலிருந்து இந்த ச்பூல் யாரோ/வேறு ஏதாவது புதுப்பிக்கப்பட்டுள்ளது. சேமிப்பது அந்த மாற்றங்களை மேலெழுதும்!"
|
||||
},
|
||||
"formats": {
|
||||
"last_used": "கடைசியாக பயன்படுத்தப்பட்ட {{date}}"
|
||||
}
|
||||
},
|
||||
"filament": {
|
||||
"fields": {
|
||||
"coaxial": "இணை",
|
||||
"longitudinal": "நீளமான",
|
||||
"external_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": "பல",
|
||||
"spools": "ச்பூல்களைக் காட்டு"
|
||||
},
|
||||
"fields_help": {
|
||||
"article_number": "எ.கா. EAN, UPC, முதலியன.",
|
||||
"material": "எ.கா. பி.எல்.ஏ, ஏபிஎச், பெட்சி, முதலியன.",
|
||||
"name": "இழை பெயர், இந்த இழை வகையை ஒரே உற்பத்தியாளரிடமிருந்து வேறுபடுத்துவதற்கு. உதாரணமாக வண்ணம் இருக்க வேண்டும்.",
|
||||
"price": "ஒரு முழு ச்பூலின் விலை.",
|
||||
"weight": "ஒரு முழு ச்பூலின் இழை எடை (நிகர எடை). இதில் ச்பூலின் எடையை சேர்க்கக்கூடாது, இழை மட்டுமே. இது பொதுவாக பேக்கேசிங்கில் எழுதப்படுகிறது.",
|
||||
"spool_weight": "வெற்று ச்பூலின் எடை. ஒரு ச்பூலின் அளவிடப்பட்ட எடையை தீர்மானிக்கப் பயன்படுகிறது.",
|
||||
"multi_color_direction": "இழைகள் இரண்டு வழிகளில் பல வண்ணங்களைக் கொண்டிருக்கலாம்: சகாக்களின் மூலம், நிலையான பல வண்ணங்களுடன் இரட்டை-வண்ண இழைகள் போன்றவை, அல்லது ச்பூலில் வண்ணங்களை மாற்றும் சாய்வு இழைகள் போன்ற நீளமான வண்ண மாற்றங்கள் மூலம்."
|
||||
},
|
||||
"titles": {
|
||||
"list": "இழைகள்",
|
||||
"show": "இழை காட்டு",
|
||||
"create": "இழை உருவாக்கு",
|
||||
"clone": "நகலி இழை",
|
||||
"edit": "இழை திருத்து",
|
||||
"show_title": "[இழை #{{id}}] {{name}}"
|
||||
},
|
||||
"filament": "இழைகள்",
|
||||
"form": {
|
||||
"filament_updated": "இந்த பக்கத்தைத் திறந்ததிலிருந்து இந்த இழை யாரோ/வேறு ஏதாவது புதுப்பிக்கப்பட்டுள்ளது. சேமிப்பது அந்த மாற்றங்களை மேலெழுதும்!",
|
||||
"import_external": "வெளிப்புறத்திலிருந்து இறக்குமதி",
|
||||
"import_external_description": "அதன் விவரங்களை இழை உருவாக்கும் வடிவத்தில் தானாக விரிவுபடுத்தப் பட்டியலில் ஒரு இழை தேர்ந்தெடுக்கவும். இது நீங்கள் படிவத்தில் உள்ளிட்ட எந்தத் தரவையும் மேலெழுதும். <br><br> தேவைப்பட்டால், சரி என்பதைக் சொடுக்கு செய்யும்போது ஒரு உற்பத்தியாளர் பொருள் தானாக உருவாக்கப்படும்."
|
||||
},
|
||||
"buttons": {
|
||||
"add_spool": "ச்பூல் சேர்க்கவும்"
|
||||
}
|
||||
},
|
||||
"vendor": {
|
||||
"fields": {
|
||||
"name": "பெயர்",
|
||||
"empty_spool_weight": "வெற்று ச்பூல் எடை",
|
||||
"id": "ஐடி",
|
||||
"external_id": "வெளிப்புற ஐடி",
|
||||
"registered": "பதிவுசெய்யப்பட்டது",
|
||||
"comment": "கருத்து"
|
||||
},
|
||||
"vendor": "உற்பத்தியாளர்கள்",
|
||||
"fields_help": {
|
||||
"empty_spool_weight": "இந்த உற்பத்தியாளரிடமிருந்து வெற்று ச்பூலின் எடை."
|
||||
},
|
||||
"titles": {
|
||||
"create": "உற்பத்தியாளரை உருவாக்கவும்",
|
||||
"clone": "நகலி உற்பத்தியாளர்",
|
||||
"edit": "உற்பத்தியாளரைத் திருத்து",
|
||||
"list": "உற்பத்தியாளர்கள்",
|
||||
"show": "உற்பத்தியாளரைக் காட்டு",
|
||||
"show_title": "[உற்பத்தியாளர் #{{id}}] {{name}}"
|
||||
},
|
||||
"form": {
|
||||
"vendor_updated": "இந்த பக்கத்தைத் திறந்ததிலிருந்து இந்த உற்பத்தியாளர் யாரோ/வேறு ஏதாவது புதுப்பிக்கப்பட்டார். சேமிப்பது அந்த மாற்றங்களை மேலெழுதும்!"
|
||||
}
|
||||
},
|
||||
"help": {
|
||||
"resources": {
|
||||
"vendor": "இழை செய்யும் நிறுவனங்கள்.",
|
||||
"filament": "இழைகளின் பிராண்டுகள். அவற்றில் பெயர், பொருள், நிறம், விட்டம் மற்றும் பல போன்ற பண்புகள் உள்ளன.",
|
||||
"spool": "ஒரு குறிப்பிட்ட இழைகளின் தனிப்பட்ட உடல் ச்பூல்கள்."
|
||||
},
|
||||
"help": "உதவி",
|
||||
"description": "<title> உதவி </title> <p> நீங்கள் தொடங்குவதற்கான சில குறிப்புகள் இங்கே. </p> <p> ச்பூல்மேன் 3 வெவ்வேறு வகையான தரவுகளை வைத்திருக்கிறார்: </p> <itemsHelp/> <p> தரவுத்தளத்தில் ஒரு புதிய ச்பூலைச் சேர்க்க, <filamentCreateLink>இழை</filamentCreateLink> பொருளை உருவாக்குவதன் மூலம் தொடங்கவும். அது முடிந்ததும், அந்தக் குறிப்பிட்ட ச்பூலுக்கான<spoolCreateLink> ச்பூல்</spoolCreateLink> பொருளை உருவாக்கத் தொடரவும்.</p><p> அதே இழைகளின் கூடுதல் ச்பூல்களைப் பின்னர் நீங்கள் பெற்றால், கூடுதல் ச்பூல் பொருள்களை <vendorCreateLink>உருவாக்கி</vendorCreateLink>அதே இழை பொருளை மீண்டும் பயன்படுத்தினால்.</p><p>இழை பயன்பாட்டைத் தானாகக் கண்காணித்து, உங்களுக்கான ச்பூல் பொருள்களைப் புதுப்பிக்கவும். அதை எவ்வாறு அமைப்பது என்பதற்கான வழிகாட்டுதலுக்கு குறித்த வழிகாட்டுதலுக்கு<readmeLink>ச்பூல்மேன் ரீட்மே</readmeLink> ஐப் பார்க்கவும். </p>"
|
||||
},
|
||||
"documentTitle": {
|
||||
"vendor": {
|
||||
"clone": "#{{id}} நகலி உற்பத்தியாளர் | ச்பூல்மேன்",
|
||||
"list": "உற்பத்தியாளர்கள் | ச்பூல்மேன்",
|
||||
"show": "#{{id}} உற்பத்தியாளரைக் காட்டு | ச்பூல்மேன்",
|
||||
"edit": "#{{id}} உற்பத்தியாளரைத் திருத்து | ச்பூல்மேன்",
|
||||
"create": "உற்பத்தியாளரை உருவாக்கு | ச்பூல்மேன்"
|
||||
},
|
||||
"default": "ச்பூல்மேன்",
|
||||
"suffix": " | ச்பூல்மேன்",
|
||||
"home": {
|
||||
"list": "முகப்பு | ச்பூல்மேன்"
|
||||
},
|
||||
"help": {
|
||||
"list": "உதவி | ச்பூல்மேன்"
|
||||
},
|
||||
"locations": {
|
||||
"list": "இடங்கள் | ச்பூல்மேன்"
|
||||
},
|
||||
"filament": {
|
||||
"list": "இழைகள் | ச்பூல்மேன்",
|
||||
"show": "#{{id}} ஃபிலிமென்ட் காட்டு | ச்பூல்மேன்",
|
||||
"edit": "#{{id}} Filuctient தாள் | ச்பூல்மேன்",
|
||||
"create": "இழை உருவாக்கு | ச்பூல்மேன்",
|
||||
"clone": "#{{id}} நகலி இழை | ச்பூல்மேன்"
|
||||
},
|
||||
"spool": {
|
||||
"list": "ச்பூல்கள் | ச்பூல்மேன்",
|
||||
"show": "#{{id}} காட்டு ச்பூல் | ச்பூல்மேன்",
|
||||
"edit": "#{{id}} திருத்து ச்பூல் | ச்பூல்மேன்",
|
||||
"create": "ச்பூலை உருவாக்கு | ச்பூல்மேன்",
|
||||
"clone": "#{{id}} நகலி ச்பூல் | ச்பூல்மேன்"
|
||||
}
|
||||
},
|
||||
"locations": {
|
||||
"locations": "இருப்பிடங்கள்",
|
||||
"new_location": "புதிய இடம்",
|
||||
"no_location": "இடம் இல்லை",
|
||||
"no_locations_help": "இந்த பக்கம் உங்கள் ச்பூல்களை இருப்பிடங்களில் ஒழுங்கமைக்க அனுமதிக்கிறது, தொடங்குவதற்கு சில ச்பூல்களைச் சேர்க்கவும்!"
|
||||
},
|
||||
"actions": {
|
||||
"list": "பட்டியல்",
|
||||
"create": "உருவாக்கு",
|
||||
"edit": "தொகு",
|
||||
"show": "காட்டு",
|
||||
"clone": "நகலி"
|
||||
},
|
||||
"warnWhenUnsavedChanges": "நீங்கள் நிச்சயமாக வெளியேற விரும்புகிறீர்களா? நீங்கள் சேமிக்கப்படாத மாற்றங்கள் உள்ளன.",
|
||||
"notifications": {
|
||||
"success": "செய்",
|
||||
"error": "பிழை (நிலை குறியீடு: {{statusCode}})",
|
||||
"undoable": "நீங்கள் செயல்தவிர்க்க {{seconds}} வினாடிகள் உள்ளன.",
|
||||
"createSuccess": "வெற்றிகரமாக உருவாக்கப்பட்டது {{resource}}",
|
||||
"createError": "{{resource}} (நிலைக் குறியீடு: {{statusCode}}) உருவாக்கும் பிழை இருந்தது",
|
||||
"deleteSuccess": "வெற்றிகரமாக நீக்கப்பட்டது {{resource}}",
|
||||
"deleteError": "{{resource}} நீக்கும்போது பிழை (நிலைக் குறியீடு: {{statusCode}})",
|
||||
"editSuccess": "வெற்றிகரமாக திருத்தப்பட்டது {{resource}}",
|
||||
"editError": "{{resource}} திருத்தும்போது பிழை (நிலை குறியீடு: {{statusCode}})",
|
||||
"importProgress": "இறக்குமதி: {{processed}}/{{total}}}",
|
||||
"saveSuccessful": "வெற்றிகரமாக சேமிக்கவும்!",
|
||||
"validationError": "சரிபார்ப்பு பிழை: {{error}}"
|
||||
},
|
||||
"kofi": "உதவிக்குறிப்பு மற்றும் ஆன்-ஃபை",
|
||||
"loading": "ஏற்றுகிறது",
|
||||
"version": "பதிப்பு",
|
||||
"unknown": "தெரியவில்லை",
|
||||
"yes": "ஆம்",
|
||||
"no": "இல்லை",
|
||||
"tags": {
|
||||
"clone": "நகலி"
|
||||
},
|
||||
"dashboard": {
|
||||
"title": "முகப்புப்பெட்டி"
|
||||
},
|
||||
"scanner": {
|
||||
"title": "QR குறியீடு ச்கேனர்",
|
||||
"description": "ச்பூல் பற்றிய விவரங்களைக் காண ஒரு ச்பூல்மேன் கியூஆர் குறியீட்டை ச்கேன் செய்யுங்கள்.",
|
||||
"error": {
|
||||
"notAllowed": "கேமராவை அணுக நீங்கள் அனுமதிக்கவில்லை.",
|
||||
"insecureContext": "பக்கம் HTTPS க்கு மேல் வழங்கப்படவில்லை.",
|
||||
"streamApiNotSupported": "உலாவி மீடியாச்ட்ரீம் பநிஇ ஆதரிக்காது.",
|
||||
"notReadable": "கேமரா படிக்க முடியாது.",
|
||||
"notFound": "கேமரா எதுவும் கண்டுபிடிக்கப்படவில்லை.",
|
||||
"unknown": "அறியப்படாத பிழை ஏற்பட்டது. ({{error}})"
|
||||
}
|
||||
},
|
||||
"home": {
|
||||
"home": "வீடு",
|
||||
"welcome": "உங்கள் ச்பூல்மேன் உதாரணத்திற்கு வருக!",
|
||||
"description": "நீங்கள் இதுவரை எந்த ச்பூல்களையும் சேர்க்கவில்லை என்று தெரிகிறது. தொடங்குவதற்கு <helpPageLink>உதவி பக்கம்</helpPageLink> ஐப் பார்க்கவும்."
|
||||
},
|
||||
"table": {
|
||||
"actions": "செயல்கள்"
|
||||
},
|
||||
"settings": {
|
||||
"settings": "அமைப்புகள்",
|
||||
"header": "அமைப்புகள்",
|
||||
"general": {
|
||||
"tab": "பொது",
|
||||
"currency": {
|
||||
"label": "நாணயம்"
|
||||
},
|
||||
"base_url": {
|
||||
"label": "அடிப்படை முகவரி",
|
||||
"tooltip": "QR குறியீடுகள் போன்ற அம்சங்களை உருவாக்கும்போது பயன்படுத்த வேண்டிய அடிப்படை முகவரி."
|
||||
},
|
||||
"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": "இது அனைத்து நிறுவனங்களுக்கும் புலம் மற்றும் தொடர்புடைய அனைத்து தரவையும் நீக்கிவிடும்."
|
||||
}
|
||||
}
|
||||
}
|
||||
@@ -0,0 +1,405 @@
|
||||
{
|
||||
"spool": {
|
||||
"fields": {
|
||||
"registered": "ลงทะเบียน",
|
||||
"remaining_length": "ความยาวคงเหลือ",
|
||||
"lot_nr": "เลขล็อต",
|
||||
"archived": "เก็บถาวร",
|
||||
"remaining_weight": "น้ำหนักคงเหลือ",
|
||||
"material": "วัสดุ",
|
||||
"spool_weight": "น้ำหนักม้วนพลาสติกเปล่า",
|
||||
"id": "ID",
|
||||
"initial_weight": "น้ำหนักเริ่มต้น",
|
||||
"measured_weight": "น้ำหนักที่วัดได้",
|
||||
"used_weight": "น้ำหนักที่ใช้ไป",
|
||||
"filament_external": "ภายนอก",
|
||||
"price": "ราคา",
|
||||
"last_used": "ใช้ครั้งล่าสุด",
|
||||
"filament_internal": "ภายใน",
|
||||
"used_length": "ความยาวที่ใช้",
|
||||
"comment": "หมายเหตุ",
|
||||
"filament_name": "เส้นพลาสติก",
|
||||
"first_used": "ใช้ครั้งแรก",
|
||||
"filament": "เส้นพลาสติก",
|
||||
"weight_to_use": "น้ำหนัก",
|
||||
"location": "สถานที่จัดเก็บ"
|
||||
},
|
||||
"titles": {
|
||||
"show_title": "[ม้วนพลาสติก #{{id}}] {{name}}",
|
||||
"archive": "เก็บถาวรม้วนพลาสติก",
|
||||
"clone": "ทำซ้ำม้วนพลาสติก",
|
||||
"create": "สร้างม้วนพลาสติก",
|
||||
"adjust": "ปรับการใช้ม้วนพลาสติก",
|
||||
"edit": "แก้ไขม้วนพลาสติก",
|
||||
"list": "ม้วนพลาสติก",
|
||||
"show": "แสดงม้วนพลาสติก"
|
||||
},
|
||||
"form": {
|
||||
"adjust_filament_value": "ปริมาณที่ใช้",
|
||||
"measurement_type": {
|
||||
"length": "ความยาว",
|
||||
"weight": "น้ำหนัก"
|
||||
},
|
||||
"new_location_prompt": "กรอกชื่อสถานที่เก็บใหม่",
|
||||
"measurement_type_label": "ประเภทการวัด",
|
||||
"spool_updated": "ม้วนพลาสติกนี้ได้รับการอัปเดตโดยผู้อื่นหลังจากที่คุณเปิดหน้านี้ การบันทึกจะเขียนทับการเปลี่ยนแปลง!",
|
||||
"adjust_filament_help": "คุณสามารถเพิ่มหรือลดปริมาณเส้นพลาสติกจากม้วนพลาสติกได้ที่นี่ ค่าบวกจะเป็นการใช้เส้นพลาสติก ค่าลบจะเป็นการเติมกลับ"
|
||||
},
|
||||
"fields_help": {
|
||||
"measured_weight": "น้ำหนักรวมของเส้นพลาสติกและม้วนพลาสติก",
|
||||
"spool_weight": "น้ำหนักของม้วนพลาสติกเมื่อเปล่า หากเว้นว่างไว้จะใช้ค่าจากเส้นพลาสติกหรือจากผู้ผลิต",
|
||||
"location": "ตำแหน่งที่เก็บม้วนพลาสติก หากคุณมีหลายที่เก็บ นี่คือที่ที่คุณจัดเก็บม้วนพลาสติก",
|
||||
"initial_weight": "น้ำหนักเส้นพลาสติกในม้วนพลาสติก (สุทธิ) หากไม่ได้ตั้งค่า จะใช้น้ำหนักจากอ็อบเจ็กต์เส้นพลาสติก",
|
||||
"used_weight": "ปริมาณเส้นพลาสติกที่ถูกใช้ไปจากม้วนพลาสติก ม้วนพลาสติกใหม่ควรเริ่มต้นที่ 0 กรัม",
|
||||
"price": "ราคาของม้วนพลาสติกเต็ม หากไม่ได้ตั้งค่า จะใช้ราคาของเส้นพลาสติกแทน",
|
||||
"remaining_weight": "ปริมาณเส้นพลาสติกที่เหลืออยู่ในม้วนพลาสติก สำหรับม้วนพลาสติกใหม่ควรมีค่าเท่ากับน้ำหนักของม้วนพลาสติกเต็ม",
|
||||
"weight_to_use": "เลือกค่าน้ำหนักที่คุณต้องการระบุ น้ำหนักวัดได้จะใช้ได้เฉพาะเมื่อมีการตั้งค่าน้ำหนักม้วนพลาสติกเปล่าสำหรับเส้นพลาสติกที่เลือก",
|
||||
"lot_nr": "เลขล็อตของผู้ผลิต ใช้เพื่อให้มั่นใจว่า การพิมพ์จะมีสีสม่ำเสมอ หากต้องใช้พลาสติกหลายม้วน",
|
||||
"external_filament": "คุณได้เลือกเส้นพลาสติกจากฐานข้อมูลภายนอก อ็อบเจ็กต์เส้นพลาสติก (และอาจมีอ็อบเจ็กต์ผู้ผลิต) จะถูกสร้างโดยอัตโนมัติเมื่อคุณสร้างม้วนพลาสติก อาจทำให้เกิดเส้นพลาสติกซ้ำกัน ถ้าคุณได้สร้างเส้นพลาสติกนั้นไว้อยู่แล้ว"
|
||||
},
|
||||
"formats": {
|
||||
"last_used": "ใช้ครั้งล่าสุด {{date}}"
|
||||
},
|
||||
"spool": "ม้วนพลาสติก",
|
||||
"messages": {
|
||||
"archive": "คุณแน่ใจหรือไม่ว่าต้องการเก็บถาวรม้วนพลาสติกนี้?"
|
||||
}
|
||||
},
|
||||
"buttons": {
|
||||
"hideArchived": "ซ่อนที่เก็บถาวร",
|
||||
"saveAndAdd": "บันทึกและเพิ่ม",
|
||||
"clearFilters": "ล้างตัวกรอง",
|
||||
"delete": "ลบ",
|
||||
"logout": "ออกจากระบบ",
|
||||
"continue": "ดำเนินการต่อ",
|
||||
"filter": "กรอง",
|
||||
"clear": "ล้าง",
|
||||
"refresh": "รีเฟรช",
|
||||
"show": "แสดง",
|
||||
"import": "นำเข้า",
|
||||
"clone": "ทำซ้ำ",
|
||||
"save": "บันทึก",
|
||||
"confirm": "คุณแน่ใจหรือไม่?",
|
||||
"unArchive": "ยกเลิกเก็บถาวร",
|
||||
"notAccessTitle": "คุณไม่มีสิทธิ์เข้าถึง",
|
||||
"create": "สร้าง",
|
||||
"undo": "ย้อนกลับ",
|
||||
"cancel": "ยกเลิก",
|
||||
"hideColumns": "ซ่อนคอลัมน์",
|
||||
"showArchived": "แสดงที่เก็บถาวร",
|
||||
"edit": "แก้ไข",
|
||||
"archive": "เก็บถาวร"
|
||||
},
|
||||
"actions": {
|
||||
"clone": "ทำซ้ำ",
|
||||
"show": "แสดง",
|
||||
"edit": "แก้ไข",
|
||||
"list": "รายการ",
|
||||
"create": "สร้าง"
|
||||
},
|
||||
"printing": {
|
||||
"generic": {
|
||||
"columns": "คอลัมน์",
|
||||
"printerMarginBottom": "Safe-Zone ล่าง",
|
||||
"printerMarginLeft": "Safe-Zone ซ้าย",
|
||||
"showBorder": "แสดงเส้นขอบ",
|
||||
"newSetting": "ใหม่",
|
||||
"deleteSettings": "ลบพรีเซ็ตปัจจุบัน",
|
||||
"customSize": "กำหนดเอง",
|
||||
"skipItems": "ข้ามรายการ",
|
||||
"print": "พิมพ์",
|
||||
"dimensions": "ขนาด",
|
||||
"marginLeft": "ระยะขอบซ้าย",
|
||||
"verticalSpacing": "ระยะห่างแนวตั้ง",
|
||||
"marginTop": "ระยะขอบบน",
|
||||
"layoutSettings": "การตั้งค่าเค้าโครง",
|
||||
"marginRight": "ระยะขอบขวา",
|
||||
"helpMargin": "การตั้งค่าขอบกระดาษควรกำหนดให้ตรงกับขนาดกระดาษและเครื่องพิมพ์ของคุณ การเปลี่ยนค่านี้จะมีผลต่อขนาดตารางทั้งหมด",
|
||||
"helpPrinterMargin": "Safe-Zone ควรกำหนดเป็นค่าระยะห่างจากขอบกระดาษที่เครื่องพิมพ์สามารถพิมพ์ได้ การเปลี่ยนค่านี้จะไม่กระทบต่อขนาดตารางทั้งหมด",
|
||||
"previewScale": "สเกลตัวอย่าง",
|
||||
"itemCopies": "สำเนาต่อรายการ",
|
||||
"borders": {
|
||||
"grid": "ตาราง",
|
||||
"none": "ไม่แสดง",
|
||||
"border": "เส้นขอบ"
|
||||
},
|
||||
"settingsName": "ชื่อพรีเซ็ต",
|
||||
"contentSettings": "การตั้งค่าข้อมูล",
|
||||
"printerMarginRight": "Safe-Zone ขวา",
|
||||
"saveAsImage": "บันทึกเป็นรูปภาพ",
|
||||
"settings": "พรีเซ็ต",
|
||||
"defaultSettings": "ค่าเริ่มต้น",
|
||||
"duplicateSettings": "คัดลอกพรีเซ็ต",
|
||||
"saveSetting": "บันทึกพรีเซ็ต",
|
||||
"deleteSettingsConfirm": "คุณแน่ใจหรือไม่ว่าต้องการลบพรีเซ็ตนี้?",
|
||||
"addSettings": "เพิ่มพรีเซ็ตใหม่",
|
||||
"rows": "แถว",
|
||||
"title": "การพิมพ์",
|
||||
"horizontalSpacing": "ระยะห่างแนวนอน",
|
||||
"printerMarginTop": "Safe-Zone บน",
|
||||
"paperSize": "ขนาดกระดาษ",
|
||||
"marginBottom": "ระยะขอบล่าง",
|
||||
"description": "ปรับการตั้งค่าด้านล่างเพื่อให้ได้รูปแบบการพิมพ์ที่ต้องการ โปรดทราบว่าเครื่องพิมพ์และระบบปฏิบัติการของคุณอาจมีการตั้งค่าขอบกระดาษและการปรับขนาดของตัวเอง ดังนั้นคุณอาจต้องลองผิดลองถูกเล็กน้อยก่อนที่จะได้ผลลัพธ์ที่ถูกต้อง แนะนำให้ทดสอบบนกระดาษธรรมดาก่อนที่จะพิมพ์บนกระดาษสติกเกอร์จริง"
|
||||
},
|
||||
"qrcode": {
|
||||
"textSize": "ขนาดข้อความฉลาก",
|
||||
"useHTTPUrl": {
|
||||
"options": {
|
||||
"default": "ค่าเริ่มต้น",
|
||||
"url": "URL"
|
||||
},
|
||||
"label": "ลิงก์ QR code",
|
||||
"preview": "ตัวอย่าง:",
|
||||
"tooltip": "จะใช้ลิงก์ภายในที่จะทำงานได้เฉพาะเมื่อสแกนจากฟีเจอร์สแกนของ Spoolman (ค่าเริ่มต้น) URL จะใช้จาก base URL ที่กำหนดไว้ใน settings หรือใช้ URL ของหน้าปัจจุบันหากไม่ได้ตั้งค่า"
|
||||
},
|
||||
"showQRCodeMode": {
|
||||
"withIcon": "พร้อมไอคอน",
|
||||
"no": "ไม่",
|
||||
"simple": "ธรรมดา"
|
||||
},
|
||||
"template": "เทมเพลตฉลาก",
|
||||
"button": "พิมพ์ฉลาก",
|
||||
"title": "การพิมพ์ฉลาก",
|
||||
"showQRCode": "พิมพ์ QR Code",
|
||||
"showContent": "พิมพ์ฉลาก",
|
||||
"templateHelp": "ใช้ {} เพื่อใส่ค่าจากอ็อบเจ็กต์ spool เป็นข้อความ ตัวอย่างเช่น {id} จะถูกแทนที่ด้วย id ของ spool หรือ {filament.material} จะถูกแทนที่ด้วยวัสดุของ spool หากไม่มีค่าจะแสดงเป็น \"?\" สามารถใช้ชุดเครื่องหมาย {} แบบซ้อนเพื่อลบได้ด้วย นอกจากนี้ยังสามารถลบข้อความหากค่านั้นหายไป ตัวอย่าง {Lot Nr: {lot_nr}} จะแสดงฉลากต่อเมื่อ spool มี lot number ใช้เครื่องหมาย ** ครอบข้อความเพื่อทำให้เป็นตัวหนา คลิกปุ่มเพื่อดูรายการแท็กทั้งหมดที่ใช้ได้"
|
||||
},
|
||||
"spoolSelect": {
|
||||
"selectAll": "เลือก/ยกเลิกทั้งหมด",
|
||||
"title": "เลือกม้วนพลาสติก",
|
||||
"noSpoolsSelected": "คุณยังไม่ได้เลือกม้วนพลาสติก",
|
||||
"selectedTotal_other": "เลือก {{count}} ม้วนพลาสติก",
|
||||
"showArchived": "แสดงที่เก็บถาวร",
|
||||
"description": "เลือกม้วนพลาสติกสำหรับพิมพ์ฉลาก"
|
||||
}
|
||||
},
|
||||
"filament": {
|
||||
"fields_help": {
|
||||
"spool_weight": "น้ำหนักของม้วนพลาสติกเปล่า ใช้เพื่อคำนวณน้ำหนักที่วัดได้ของม้วนพลาสติก",
|
||||
"material": "ตัวอย่างเช่น PLA, ABS, PETG, TPU, ASA, PC, PA เป็นต้น",
|
||||
"article_number": "เช่น EAN, UPC, เป็นต้น",
|
||||
"price": "ราคาของม้วนพลาสติกเต็ม",
|
||||
"weight": "น้ำหนักของเส้นพลาสติกในม้วนพลาสติก (สุทธิ) ไม่รวมม้วนพลาสติกเปล่า เป็นค่าน้ำหนักที่มักระบุบนบรรจุภัณฑ์",
|
||||
"name": "ชื่อเส้นพลาสติก เพื่อแยกความต่างระหว่างเส้นพลาสติกแบบเดียวกันจากผู้ผลิตเดียวกัน โดยทั่วไปควรระบุสีในชื่อด้วย",
|
||||
"multi_color_direction": "เส้นพลาสติกหลายสีสามารถมีหลายสีได้ 2 รูปแบบ: แบบ coextrusion (เช่น เส้นพลาสติกสองสีพร้อมกัน) หรือแบบไล่สีตามความยาว (เช่น เส้นพลาสติกเปลี่ยนสีไปเรื่อยๆ)"
|
||||
},
|
||||
"fields": {
|
||||
"comment": "หมายเหตุ",
|
||||
"density": "ความหนาแน่น",
|
||||
"weight": "น้ำหนัก",
|
||||
"vendor": "ผู้ผลิต",
|
||||
"settings_extruder_temp": "อุณหภูมิหัวพิมพ์",
|
||||
"longitudinal": "ไล่สีตามความยาว",
|
||||
"material": "วัสดุ",
|
||||
"id": "ID",
|
||||
"settings_bed_temp": "อุณหภูมิฐานพิมพ์",
|
||||
"vendor_name": "ผู้ผลิต",
|
||||
"diameter": "เส้นผ่านศูนย์กลาง",
|
||||
"article_number": "รหัสสินค้า",
|
||||
"multi_color": "หลายสี",
|
||||
"external_id": "รหัสภายนอก",
|
||||
"color_hex": "สี",
|
||||
"price": "ราคา",
|
||||
"spool_weight": "น้ำหนักม้วนพลาสติกเปล่า",
|
||||
"coaxial": "เส้นประกบหลายสี",
|
||||
"name": "ชื่อ",
|
||||
"spools": "แสดงม้วนพลาสติก",
|
||||
"registered": "ลงทะเบียน",
|
||||
"single_color": "สีเดียว"
|
||||
},
|
||||
"titles": {
|
||||
"edit": "แก้ไขเส้นพลาสติก",
|
||||
"list": "เส้นพลาสติก",
|
||||
"show": "แสดงเส้นพลาสติก",
|
||||
"clone": "ทำซ้ำเส้นพลาสติก",
|
||||
"show_title": "[เส้นพลาสติก #{{id}}] {{name}}",
|
||||
"create": "สร้างเส้นพลาสติก"
|
||||
},
|
||||
"form": {
|
||||
"filament_updated": "เส้นพลาสติกนี้ได้รับการอัปเดตโดยผู้อื่นหลังจากที่คุณเปิดหน้านี้ การบันทึกจะเขียนทับการเปลี่ยนแปลง!",
|
||||
"import_external": "นำเข้าจากภายนอก",
|
||||
"import_external_description": "เลือกเส้นพลาสติกในรายการเพื่อกรอกข้อมูลอัตโนมัติในฟอร์มนี้ การดำเนินการนี้จะเขียนทับข้อมูลที่คุณกรอกไว้<br><br>อ็อบเจ็กต์ผู้ผลิตจะถูกสร้างขึ้นโดยอัตโนมัติเมื่อคุณคลิกตกลง หากจำเป็น"
|
||||
},
|
||||
"buttons": {
|
||||
"add_spool": "เพิ่มม้วนพลาสติก"
|
||||
},
|
||||
"filament": "เส้นพลาสติก"
|
||||
},
|
||||
"kofi": "สนับสนุนเราได้ที่ Ko-fi",
|
||||
"scanner": {
|
||||
"error": {
|
||||
"notReadable": "ไม่สามารถอ่านข้อมูลจากกล้องได้",
|
||||
"insecureContext": "หน้านี้ไม่ได้ถูกให้บริการผ่าน HTTPS",
|
||||
"notAllowed": "คุณไม่ได้อนุญาตให้เข้าถึงกล้อง",
|
||||
"streamApiNotSupported": "เบราว์เซอร์ไม่รองรับ MediaStream API",
|
||||
"unknown": "เกิดข้อผิดพลาดที่ไม่ทราบสาเหตุ ({{error}})",
|
||||
"notFound": "ไม่พบกล้อง"
|
||||
},
|
||||
"description": "สแกน Spoolman QR code เพื่อดูข้อมูลเกี่ยวกับม้วนพลาสติก",
|
||||
"title": "เครื่องสแกน QR Code"
|
||||
},
|
||||
"documentTitle": {
|
||||
"filament": {
|
||||
"clone": "#{{id}} ทำซ้ำเส้นพลาสติก | Spoolman",
|
||||
"edit": "#{{id}} แก้ไขเส้นพลาสติก | Spoolman",
|
||||
"show": "#{{id}} แสดงเส้นพลาสติก | Spoolman",
|
||||
"create": "สร้างเส้นพลาสติก | Spoolman",
|
||||
"list": "เส้นพลาสติก | Spoolman"
|
||||
},
|
||||
"home": {
|
||||
"list": "หน้าแรก | Spoolman"
|
||||
},
|
||||
"spool": {
|
||||
"show": "#{{id}} แสดงม้วนพลาสติก | Spoolman",
|
||||
"clone": "#{{id}} ทำซ้ำม้วนพลาสติก | Spoolman",
|
||||
"create": "สร้างม้วนพลาสติก | Spoolman",
|
||||
"list": "ม้วนพลาสติก | Spoolman",
|
||||
"edit": "#{{id}} แก้ไขม้วนพลาสติก | Spoolman"
|
||||
},
|
||||
"vendor": {
|
||||
"list": "ผู้ผลิต | Spoolman",
|
||||
"show": "#{{id}} แสดงผู้ผลิต | Spoolman",
|
||||
"edit": "#{{id}} แก้ไขผู้ผลิต | Spoolman",
|
||||
"create": "สร้างผู้ผลิต | Spoolman",
|
||||
"clone": "#{{id}} ทำซ้ำผู้ผลิต | Spoolman"
|
||||
},
|
||||
"help": {
|
||||
"list": "วิธีใช้ | Spoolman"
|
||||
},
|
||||
"suffix": " | Spoolman",
|
||||
"locations": {
|
||||
"list": "สถานที่เก็บ | Spoolman"
|
||||
},
|
||||
"default": "Spoolman"
|
||||
},
|
||||
"notifications": {
|
||||
"error": "เกิดข้อผิดพลาด (รหัสสถานะ: {{statusCode}})",
|
||||
"undoable": "คุณเหลือเวลา {{seconds}} วินาทีในการย้อนกลับ",
|
||||
"deleteSuccess": "ลบ {{resource}} สำเร็จ",
|
||||
"editSuccess": "แก้ไข {{resource}} สำเร็จ",
|
||||
"validationError": "เกิดข้อผิดพลาดในการตรวจสอบ: {{error}}",
|
||||
"deleteError": "เกิดข้อผิดพลาดในการลบ {{resource}} (รหัสสถานะ: {{statusCode}})",
|
||||
"success": "สำเร็จ",
|
||||
"createSuccess": "สร้าง {{resource}} สำเร็จ",
|
||||
"saveSuccessful": "บันทึกสำเร็จ!",
|
||||
"editError": "เกิดข้อผิดพลาดในการแก้ไข {{resource}} (รหัสสถานะ: {{statusCode}})",
|
||||
"createError": "เกิดข้อผิดพลาดในการสร้าง {{resource}} (รหัสสถานะ: {{statusCode}})",
|
||||
"importProgress": "กำลังนำเข้า: {{processed}}/{{total}}"
|
||||
},
|
||||
"loading": "กำลังโหลด",
|
||||
"version": "เวอร์ชัน",
|
||||
"unknown": "ไม่ทราบ",
|
||||
"yes": "ใช่",
|
||||
"no": "ไม่",
|
||||
"tags": {
|
||||
"clone": "ทำซ้ำ"
|
||||
},
|
||||
"vendor": {
|
||||
"titles": {
|
||||
"create": "สร้างผู้ผลิต",
|
||||
"list": "ผู้ผลิต",
|
||||
"clone": "ทำซ้ำผู้ผลิต",
|
||||
"show_title": "[ผู้ผลิต #{{id}}] {{name}}",
|
||||
"edit": "แก้ไขผู้ผลิต",
|
||||
"show": "แสดงผู้ผลิต"
|
||||
},
|
||||
"fields": {
|
||||
"empty_spool_weight": "น้ำหนักม้วนพลาสติกเปล่า",
|
||||
"id": "ID",
|
||||
"comment": "หมายเหตุ",
|
||||
"external_id": "รหัสภายนอก",
|
||||
"registered": "ลงทะเบียน",
|
||||
"name": "ชื่อ"
|
||||
},
|
||||
"fields_help": {
|
||||
"empty_spool_weight": "น้ำหนักของม้วนพลาสติกเปล่าจากผู้ผลิตนี้"
|
||||
},
|
||||
"form": {
|
||||
"vendor_updated": "ผู้ผลิตนี้ได้รับการอัปเดตโดยผู้อื่นหลังจากที่คุณเปิดหน้านี้ การบันทึกจะเขียนทับการเปลี่ยนแปลง!"
|
||||
},
|
||||
"vendor": "ผู้ผลิต"
|
||||
},
|
||||
"help": {
|
||||
"resources": {
|
||||
"vendor": "บริษัทที่เป็นผู้ผลิตเส้นพลาสติก",
|
||||
"spool": "ม้วนพลาสติกจริงของเส้นพลาสติกเฉพาะแต่ละม้วน",
|
||||
"filament": "แบรนด์ของเส้นพลาสติก ซึ่งมีคุณสมบัติต่างๆ เช่น ชื่อ วัสดุ สี เส้นผ่านศูนย์กลาง และอื่นๆ"
|
||||
},
|
||||
"help": "วิธีใช้",
|
||||
"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": "แดชบอร์ด"
|
||||
},
|
||||
"settings": {
|
||||
"settings": "การตั้งค่า",
|
||||
"header": "การตั้งค่า",
|
||||
"general": {
|
||||
"tab": "ทั่วไป",
|
||||
"currency": {
|
||||
"label": "สกุลเงิน"
|
||||
},
|
||||
"base_url": {
|
||||
"label": "URL พื้นฐาน",
|
||||
"tooltip": "URL พื้นฐานที่ใช้สำหรับสร้างฟีเจอร์ต่างๆ เช่น QR code"
|
||||
},
|
||||
"round_prices": {
|
||||
"label": "ปัดเศษราคา",
|
||||
"tooltip": "ปัดเศษราคาเป็นจำนวนเต็มที่ใกล้ที่สุด"
|
||||
}
|
||||
},
|
||||
"extra_fields": {
|
||||
"params": {
|
||||
"multi_choice": "เลือกได้หลายรายการ",
|
||||
"key": "คีย์",
|
||||
"name": "ชื่อ",
|
||||
"field_type": "ประเภท",
|
||||
"unit": "หน่วย",
|
||||
"order": "ลำดับ",
|
||||
"default_value": "ค่าเริ่มต้น",
|
||||
"choices": "ตัวเลือก"
|
||||
},
|
||||
"delete_confirm_description": "สิ่งนี้จะลบฟิลด์และข้อมูลที่เกี่ยวข้องทั้งหมดของทุกเอนทิตี",
|
||||
"field_type": {
|
||||
"text": "ข้อความ",
|
||||
"integer": "จำนวนเต็ม",
|
||||
"integer_range": "ช่วงจำนวนเต็ม",
|
||||
"float": "ทศนิยม",
|
||||
"float_range": "ช่วงทศนิยม",
|
||||
"datetime": "วันเวลา",
|
||||
"boolean": "บูลีน",
|
||||
"choice": "ตัวเลือก"
|
||||
},
|
||||
"tab": "ฟิลด์เพิ่มเติม",
|
||||
"boolean_true": "ใช่",
|
||||
"boolean_false": "ไม่",
|
||||
"choices_missing_error": "คุณไม่สามารถลบตัวเลือกได้ ตัวเลือกต่อไปนี้หายไป: {{choices}}",
|
||||
"non_unique_key_error": "คีย์ต้องไม่ซ้ำ",
|
||||
"key_not_changed": "โปรดเปลี่ยนคีย์เป็นอย่างอื่น",
|
||||
"delete_confirm": "ลบฟิลด์ {{name}} หรือไม่?",
|
||||
"description": "<p>คุณสามารถเพิ่มฟิลด์ที่กำหนดเองเพิ่มเติมสำหรับเอนทิตีของคุณได้ที่นี่</p><p>เมื่อเพิ่มฟิลด์แล้ว คุณจะไม่สามารถเปลี่ยนคีย์หรือประเภทของฟิลด์ได้ และสำหรับฟิลด์ประเภทตัวเลือกคุณจะไม่สามารถลบตัวเลือกหรือเปลี่ยนสถานะตัวเลือกหลายรายการได้ หากคุณลบฟิลด์ ข้อมูลที่เกี่ยวข้องของทุกเอนทิตีจะถูกลบไปด้วย</p><p>คีย์คือสิ่งที่โปรแกรมอื่นจะใช้เพื่ออ่าน/เขียนข้อมูล ดังนั้นหากฟิลด์ที่คุณสร้างต้องการเชื่อมต่อกับโปรแกรมภายนอก กรุณาตั้งค่าให้ถูกต้อง ค่าเริ่มต้นจะถูกนำไปใช้เฉพาะกับรายการใหม่เท่านั้น</p><p>ฟิลด์เพิ่มเติมสามารถแสดงและจัดเรียงในมุมมองตารางได้ ฟิลด์ประเภทตัวเลือกและบูลีนยังมีตัวเลือกการกรองที่นั่นด้วย และฟิลด์เพิ่มเติมทุกประเภทรองรับการกรองหาค่าว่าง</p>",
|
||||
"choices_reorder_hint": "ลาก หรือใช้ปุ่มลูกศร เพื่อจัดเรียงตัวเลือกนี้"
|
||||
}
|
||||
},
|
||||
"locations": {
|
||||
"new_location": "สถานที่เก็บใหม่",
|
||||
"no_location": "ไม่มีสถานที่เก็บ",
|
||||
"locations": "สถานที่เก็บ",
|
||||
"no_locations_help": "หน้านี้ให้คุณจัดการม้วนพลาสติกตามสถานที่เก็บ เพิ่มม้วนพลาสติกเพื่อเริ่มต้น!"
|
||||
},
|
||||
"home": {
|
||||
"home": "หน้าแรก",
|
||||
"welcome": "ยินดีต้อนรับสู่ Spoolman ของคุณ!",
|
||||
"description": "ดูเหมือนว่าคุณยังไม่ได้เพิ่มม้วนพลาสติกใดๆ ดูคำแนะนำการเริ่มต้นใช้งานได้ที่ <helpPageLink>หน้าวิธีใช้</helpPageLink>"
|
||||
},
|
||||
"warnWhenUnsavedChanges": "คุณแน่ใจหรือไม่ว่าต้องการออก? คุณมีการเปลี่ยนแปลงที่ยังไม่ได้บันทึก",
|
||||
"table": {
|
||||
"actions": "การดำเนินการ"
|
||||
},
|
||||
"theme": {
|
||||
"label": "ธีม",
|
||||
"system": "ตามระบบ",
|
||||
"light": "โหมดสว่าง",
|
||||
"dark": "โหมดมืด"
|
||||
}
|
||||
}
|
||||
@@ -0,0 +1,399 @@
|
||||
{
|
||||
"actions": {
|
||||
"list": "Liste",
|
||||
"create": "Oluştur",
|
||||
"edit": "Düzenle",
|
||||
"show": "Göster",
|
||||
"clone": "Kopyala"
|
||||
},
|
||||
"buttons": {
|
||||
"create": "Oluştur",
|
||||
"save": "Kaydet",
|
||||
"saveAndAdd": "Kaydet ve Ekle",
|
||||
"logout": "Çıkış yap",
|
||||
"delete": "Sil",
|
||||
"edit": "Düzenle",
|
||||
"cancel": "İptal et",
|
||||
"confirm": "Emin misiniz?",
|
||||
"continue": "Devam et",
|
||||
"filter": "Filtrele",
|
||||
"clear": "Temizle",
|
||||
"refresh": "Yenile",
|
||||
"show": "Göster",
|
||||
"undo": "Geri al",
|
||||
"import": "İçe aktar",
|
||||
"clone": "Kopyala",
|
||||
"archive": "Arşivle",
|
||||
"unArchive": "Arşivden çıkar",
|
||||
"hideArchived": "Arşivlenenleri gizle",
|
||||
"showArchived": "Arşivlenenleri göster",
|
||||
"notAccessTitle": "Erişim için yetkiniz bulunmamakta",
|
||||
"hideColumns": "Sütunları gizle",
|
||||
"clearFilters": "Filtreleri temizle"
|
||||
},
|
||||
"warnWhenUnsavedChanges": "Çıkmak istediğinizden emin misiniz? Kaydedilmemiş değişiklikleriniz bulunmakta.",
|
||||
"notifications": {
|
||||
"success": "Başarılı",
|
||||
"error": "Hata (durum kodu: {{statusCode}})",
|
||||
"undoable": "Geri almak için {{seconds}} saniyeniz var.",
|
||||
"createSuccess": "{{resource}} başarıyla oluşturuldu",
|
||||
"createError": "{{resource}} oluşturulurken bir hata ile karşılaşıldı (durum kodu :{{statusCode}})",
|
||||
"deleteSuccess": "{{resource}} başarılı şekilde silindi",
|
||||
"deleteError": "{{resource}} silinirken hata ile karşılaşıldı(durum kodu:{{statusCode}})",
|
||||
"editSuccess": "{{resource}} başarılı şekilde düzenlendi",
|
||||
"editError": "{{resource}} düzenlenirken hata ile karşılaşıldı(durum kodu:{{statusCode}})",
|
||||
"importProgress": "İçe aktarılıyor: {{processed}}/{{total}}",
|
||||
"saveSuccessful": "Kayıt başarılı!",
|
||||
"validationError": "Form kontrol hatası: {{error}}"
|
||||
},
|
||||
"kofi": "Ko-fi'den bana birşeyler ateşle",
|
||||
"loading": "Yükleniyor",
|
||||
"version": "Versiyon",
|
||||
"unknown": "Bilinmeyen",
|
||||
"yes": "Evet",
|
||||
"no": "Hayır",
|
||||
"tags": {
|
||||
"clone": "Kopyala"
|
||||
},
|
||||
"dashboard": {
|
||||
"title": "Gösterge paneli"
|
||||
},
|
||||
"printing": {
|
||||
"generic": {
|
||||
"title": "Yazdırılıyor",
|
||||
"description": "İstenilen yazıcı düzenine sahip olmak için aşağıdaki ayarları düzenleyiniz. İşletim sisteminizin ve yazıcınızın kendi boşluk ve boyutlandırma ayarlarını uygulayabileceği nedeniyle doğru sonuca ulaşana kadar birkaç kez deneme yanılma gerçekleştirmeniz gerekebilir. Gerçek etikete basmadan önce normal kağıtta deneyiniz.",
|
||||
"helpMargin": "Boşluklar seçtiğiniz etikete ve yazıcınıza bağlı olarak ayarlanmalıdır, bunlarda yapacağınız herhangi bir değişiklik tüm dizgeyi değiştirecektir.",
|
||||
"helpPrinterMargin": "Güvenli-Bölge yazıcınızın sayfa kenarına ne kadar yakınlıkta yazabileceğine göre ayarlanmalıdır, bunu değiştirmek dizge üstünden değişikliğe neden olmayacaktır.",
|
||||
"print": "Yazdır",
|
||||
"columns": "Sütunlar",
|
||||
"rows": "Satırlar",
|
||||
"paperSize": "Sayfa Boyutu",
|
||||
"customSize": "Özel",
|
||||
"dimensions": "Boyutlar",
|
||||
"showBorder": "Kenarlık Göster",
|
||||
"previewScale": "Ölçeklendirmeyi Önizle",
|
||||
"skipItems": "Öğeleri Atla",
|
||||
"itemCopies": "Öğe Kopyası",
|
||||
"contentSettings": "İçerik Ayarları",
|
||||
"layoutSettings": "Düzen Ayarları",
|
||||
"horizontalSpacing": "Yatay Boşluk",
|
||||
"verticalSpacing": "Dikey Boşluk",
|
||||
"marginLeft": "Sol Kenar Boşluğu",
|
||||
"marginRight": "Sağ Kenar Boşluğu",
|
||||
"marginTop": "Üst Kenar Boşluğu",
|
||||
"marginBottom": "Alt Kenar Boşluğu",
|
||||
"printerMarginLeft": "Sol Güvenli-Bölge",
|
||||
"printerMarginRight": "Sağ Güvenli-Bölge",
|
||||
"printerMarginTop": "Üst Güvenli-Bölge",
|
||||
"printerMarginBottom": "Alt Güvenli-Bölge",
|
||||
"borders": {
|
||||
"none": "Kenarlık Yok",
|
||||
"border": "Kenarlıklı",
|
||||
"grid": "Izgara Görünümü"
|
||||
},
|
||||
"settings": "Kayıtlı Etiketler",
|
||||
"defaultSettings": "Varsayılan",
|
||||
"addSettings": "Yeni Kayıtlı Etiket Ekle",
|
||||
"newSetting": "Yeni",
|
||||
"duplicateSettings": "Mükerrer",
|
||||
"deleteSettings": "Mevcut Kayıtlı Etiketi Sil",
|
||||
"deleteSettingsConfirm": "Mevcut kayıtlı etiketi silmek istediğinizden emin misiniz?",
|
||||
"settingsName": "Kayıtlı Etiket Adı",
|
||||
"saveSetting": "Kaydet",
|
||||
"saveAsImage": "Resim olarak kaydet"
|
||||
},
|
||||
"qrcode": {
|
||||
"button": "Etiketleri Yazdır",
|
||||
"title": "Etiket Yazdırılıyor",
|
||||
"template": "Etiket Şablonu",
|
||||
"templateHelp": "Makara nesnesinin değerlerini metin olarak eklemek için {} işaretini kullanın. Örneğin, {id} makaraya ait kimlik numarasıyla, {filament.material} ise makaradaki malzeme türüyle değiştirilecektir. Eğer bir değer eksikse, yerine \"?\" ibaresi konur. İkinci bir {} çifti kullanılarak bu durum önlenebilir. Ayrıca, iki {} çifti arasındaki herhangi bir metin, değer eksikse tamamen kaldırılır. Örneğin, {Lot Nr: {lot_nr}} ifadesi yalnızca makarada lot numarası varsa etiket olarak gösterilecektir. Metni kalın yapmak için çift yıldız işareti ** ile metni çevreleyin. Tüm kullanılabilir etiketlerin listesini görmek için butona tıklayın.",
|
||||
"textSize": "Etiket Metin Boyutu",
|
||||
"showContent": "Etiket Yazdır",
|
||||
"useHTTPUrl": {
|
||||
"label": "QR kod bağlantısı",
|
||||
"tooltip": "Yalnızca Spoolman'ın tarama özelliği (varsayılan) ile tarandığında çalışacak özel bir bağlantı kullanılacaktır. URL, ayarlarda belirtilen temel URL'yi veya ayarlanmadıysa mevcut sayfanın URL'sini kullanır.",
|
||||
"options": {
|
||||
"default": "Varsayılan",
|
||||
"url": "URL"
|
||||
},
|
||||
"preview": "Öngörünüm:"
|
||||
},
|
||||
"showQRCode": "QR kodu yazdır",
|
||||
"showQRCodeMode": {
|
||||
"no": "Hayır",
|
||||
"simple": "Basit",
|
||||
"withIcon": "Simge ile"
|
||||
}
|
||||
},
|
||||
"spoolSelect": {
|
||||
"title": "Makaraları Seçin",
|
||||
"description": "Etiket yazdırılacak makaraları seçin.",
|
||||
"showArchived": "Arşivlenmişleri göster",
|
||||
"noSpoolsSelected": "Hiçbir makara seçimi yapmadınız.",
|
||||
"selectAll": "Tümünü Seçin/Kaldırın",
|
||||
"selectedTotal_one": "{{count}} makara seçildi",
|
||||
"selectedTotal_other": "{{count}} makara seçildi"
|
||||
}
|
||||
},
|
||||
"scanner": {
|
||||
"title": "QR Kod Tarayıcı",
|
||||
"description": "Makara hakkında bilgi almak için Spoolman QR kodunu taratınız.",
|
||||
"error": {
|
||||
"notAllowed": "Kameraya erişim yetkisi vermediniz.",
|
||||
"insecureContext": "Bu sayfa HTTPS üstünden güvenli olarak gösterilmemektedir.",
|
||||
"streamApiNotSupported": "Bu tarayıcı MediaStream API'sini desteklememektedir.",
|
||||
"notReadable": "Kamera okunabilir değil.",
|
||||
"notFound": "Kamera bulunamadı.",
|
||||
"unknown": "Bilinmeyen hata oluştu.({{error}})"
|
||||
}
|
||||
},
|
||||
"spool": {
|
||||
"spool": "Makaralar",
|
||||
"fields": {
|
||||
"id": "ID",
|
||||
"filament_name": "Filament",
|
||||
"filament": "Filament",
|
||||
"filament_internal": "Dahili",
|
||||
"filament_external": "Harici",
|
||||
"price": "Fiyat",
|
||||
"material": "Malzeme",
|
||||
"weight_to_use": "Ağırlık",
|
||||
"used_weight": "Kullanılmış Ağırlık",
|
||||
"remaining_weight": "Kalan Ağırlık",
|
||||
"measured_weight": "Tartılmış Ağırlık",
|
||||
"used_length": "Kullanılmış Uzunluk",
|
||||
"remaining_length": "Kalan Uzunluk",
|
||||
"initial_weight": "Başlangıç Ağırlığı",
|
||||
"spool_weight": "Boş Makara Ağırlığı",
|
||||
"location": "Konum",
|
||||
"lot_nr": "Lot No",
|
||||
"first_used": "İlk Kullanım Tarihi",
|
||||
"last_used": "Son Kullanım Tarihi",
|
||||
"registered": "Kayıtlı",
|
||||
"comment": "Yorum",
|
||||
"archived": "Arşivlendi"
|
||||
},
|
||||
"fields_help": {
|
||||
"price": "Makaranın fiyatı eğer makara fiyatı belirlenmemişse filament fiyatı devralınacaktır.",
|
||||
"weight_to_use": "Hangi ağırlık değerinin girileceğini seçin. Ölçülen ağırlık, yalnızca seçilen filamente ait makara ağırlığı ayarlanmışsa kullanılabilir.",
|
||||
"used_weight": "Makaradan ne kadar filament kullanıldığını gösterir. Yeni bir makaranın kullanılmamış olması gerekir ve 0g kullanım göstermelidir.",
|
||||
"remaining_weight": "Makara üzerinde ne kadar filament kaldığını gösterir. Yeni bir makara için bu değer, makara ağırlığıyla eşlit olmalıdır.",
|
||||
"measured_weight": "Filament ve makaranın toplam ağırlığını gösterir.",
|
||||
"initial_weight": "Makara üzerindeki filamentin ilk (net) ağırlığıdır. Ayarlanmadıysa, filament nesnesindeki ağırlık değeri kullanılır.",
|
||||
"spool_weight": "Makaranın boş ağırlığıdır. Bu alan boş bırakılırsa, filamentten veya üreticiden gelen değer kullanılır.",
|
||||
"location": "Makaralarınızı birden fazla konumda saklamanız durumunda makaranın bulunduğu yer bilgisidir.",
|
||||
"lot_nr": "Üretici lot numarası. Birden fazla makara kullanımı durumunda tutarlı renk alınmasını sağlamak için kullanılabilir.",
|
||||
"external_filament": "Dış veritabanından bir filament seçtiniz. Bu makarayı oluşturduğunuzda otomatik olarak bir filament nesnesi (ve muhtemelen bir üretici nesnesi) oluşturulacaktır. Eğer bu filament için zaten bir filament nesnesi oluşturduysanız, bu işlem tekrarlanan (çift) filament nesneleri yaratabilir."
|
||||
},
|
||||
"titles": {
|
||||
"create": "Makara Oluştur",
|
||||
"clone": "Makara Kopyala",
|
||||
"edit": "Makara Düzenle",
|
||||
"list": "Makaralar",
|
||||
"show": "Makarayı Göster",
|
||||
"show_title": "[Makara #{{id}}] {{name}}",
|
||||
"archive": "Makarayı Arşivle",
|
||||
"adjust": "Makara filamentini ayarla"
|
||||
},
|
||||
"form": {
|
||||
"measurement_type": {
|
||||
"length": "Uzunluk",
|
||||
"weight": "Ağırlık"
|
||||
},
|
||||
"measurement_type_label": "Ölçüm Şekli",
|
||||
"adjust_filament_help": "Burada makaradan filament doğrudan ekleyebilir veya çıkarabilirsiniz. Pozitif bir değer filamentin tüketildiğini, negatif bir değer ise filamentin eklendiğini gösterir.",
|
||||
"adjust_filament_value": "Tüketim Miktarı",
|
||||
"new_location_prompt": "Yeni konumu girin",
|
||||
"spool_updated": "Bu makara, siz bu sayfayı açtığınızdan beri başka biri veya bir şey tarafından güncellendi. Kaydetme işlemi bu değişikliklerin üzerine yazacaktır!"
|
||||
},
|
||||
"messages": {
|
||||
"archive": "Bu makarayı arşivlemek istediğinizden emin misiniz?"
|
||||
},
|
||||
"formats": {
|
||||
"last_used": "Son kullanım tarihi {{date}}"
|
||||
}
|
||||
},
|
||||
"filament": {
|
||||
"filament": "Filamentler",
|
||||
"fields": {
|
||||
"id": "ID",
|
||||
"vendor_name": "Üretici",
|
||||
"vendor": "Üretici",
|
||||
"name": "Ad",
|
||||
"material": "Malzeme",
|
||||
"price": "Fiyat",
|
||||
"density": "Yoğunluk",
|
||||
"diameter": "Çap",
|
||||
"weight": "Ağırlık",
|
||||
"spool_weight": "Makara Ağırlığı",
|
||||
"article_number": "Artikel Numarası",
|
||||
"registered": "Kayıtlı",
|
||||
"comment": "Yorum",
|
||||
"settings_extruder_temp": "Extruder Sıcaklığı",
|
||||
"settings_bed_temp": "Tabla Sıcaklığı",
|
||||
"color_hex": "Renk",
|
||||
"single_color": "Tek Renk",
|
||||
"multi_color": "Çok Renk",
|
||||
"coaxial": "Koekstrüde edilmiş",
|
||||
"longitudinal": "Boylamsal",
|
||||
"external_id": "Harici ID",
|
||||
"spools": "Makaraları Göster"
|
||||
},
|
||||
"fields_help": {
|
||||
"name": "Filament adı, aynı üreticinin diğer filament türlerinden ayırt edilebilmesi için kullanılır. Örneğin, renk bilgisini içermelidir.",
|
||||
"material": "Örn.PLA, ABS, PETG, gibi.",
|
||||
"price": "Tam dolu makaranın fiyatı.",
|
||||
"weight": "Dolu bir makaradaki filamentin ağırlığıdır (net ağırlık). Bu değer yalnızca filamentin ağırlığını içermelidir, makaranın kendisinin ağırlığı dahil edilmemelidir. Genellikle ambalaj üzerinde yazan değerdir.",
|
||||
"spool_weight": "Boş bir makaranın ağırlığıdır. Makaradaki ölçülen ağırlığın hesaplanmasında kullanılır.",
|
||||
"article_number": "Örn. EAN, UPC, gibi.",
|
||||
"multi_color_direction": "Filamentler iki farklı şekilde birden fazla renge sahip olabilir: Birincisi, çift renkli filamentlerde olduğu gibi, koekstrüzyon yoluyla sabit çoklu renklerle üretilen filamentlerdir. İkincisi ise, makara boyunca renk geçişleri olan gradyan filamentlerde görülen boyuna (uzunlamasına) renk değişiklikleridir."
|
||||
},
|
||||
"titles": {
|
||||
"create": "Filament Oluştur",
|
||||
"clone": "Filament Kopyala",
|
||||
"edit": "Filament Düzenle",
|
||||
"list": "Filamentler",
|
||||
"show": "Filament Göster",
|
||||
"show_title": "[Filament #{{id}}] {{name}}"
|
||||
},
|
||||
"form": {
|
||||
"filament_updated": "Bu filament, siz bu sayfayı açtıktan sonra başka biri veya bir şey tarafından güncellendi. Kaydetme işlemi bu değişikliklerin üzerine yazacaktır!",
|
||||
"import_external": "Harici Kaynaktan İçeriye Aktar",
|
||||
"import_external_description": "Listeden bir filament seçerek, filament oluşturma formunun detaylarının otomatik olarak doldurulmasını sağlayabilirsiniz. Bu işlem, formda daha önce girdiğiniz tüm verilerin üzerine yazacaktır.<br><br>Gerekirse, \"Tamam\" butonuna tıkladığınızda otomatik olarak bir Üretici nesnesi oluşturulacaktır."
|
||||
},
|
||||
"buttons": {
|
||||
"add_spool": "Makara Ekle"
|
||||
}
|
||||
},
|
||||
"vendor": {
|
||||
"vendor": "Üreticiler",
|
||||
"fields": {
|
||||
"id": "ID",
|
||||
"name": "İsim",
|
||||
"empty_spool_weight": "Boş Makara Ağırlığı",
|
||||
"external_id": "Harici ID",
|
||||
"registered": "Kayıtlı",
|
||||
"comment": "Yorum"
|
||||
},
|
||||
"fields_help": {
|
||||
"empty_spool_weight": "Bu üreticiden boş bir makaranın ağırlığı."
|
||||
},
|
||||
"titles": {
|
||||
"create": "Üretici Oluştur",
|
||||
"clone": "Üretici Kopyala",
|
||||
"edit": "Üretici Düzenle",
|
||||
"list": "Üreticiler",
|
||||
"show": "Üretici Göster",
|
||||
"show_title": "[Üretici#{{id}}] {{name}}"
|
||||
},
|
||||
"form": {
|
||||
"vendor_updated": "Bu üretici, siz bu sayfayı açtıktan sonra başka biri veya bir şey tarafından güncellendi. Kaydetme işlemi bu değişikliklerin üzerine yazacaktır!"
|
||||
}
|
||||
},
|
||||
"home": {
|
||||
"home": "Ana Sayfa",
|
||||
"welcome": "Spoolman sunucunuza hoşgeldiniz!",
|
||||
"description": "Görünüşe göre henüz hiç makara eklememişsiniz. Başlamak için yardım almak isterseniz <helpPageLink>Yardım sayfasına</helpPageLink> göz atabilirsiniz."
|
||||
},
|
||||
"help": {
|
||||
"help": "Yardım",
|
||||
"resources": {
|
||||
"filament": "Filament markalarıdır. İsim, malzeme, renk, çap gibi çeşitli özelliklere sahiptirler.",
|
||||
"spool": "Belirli bir filamente ait bireysel fiziksel makaralardır.",
|
||||
"vendor": "Filamenti üreten şirketlerdir."
|
||||
},
|
||||
"description": "<title>Yardım</title><p>Başlamak için bazı ipuçları:</p><p>Spoolman üç farklı veri türünü tutar:</p><itemsHelp/><p>Veritabanına yeni bir makara eklemek için önce bir <filamentCreateLink>Filament</filamentCreateLink> nesnesi oluşturun. Bu işlem tamamlandıktan sonra, ilgili makara için bir <spoolCreateLink>Makara</spoolCreateLink> nesnesi oluşturun. Daha sonra aynı filamentten ek makaralar edinirseniz, sadece yeni Makara nesneleri oluşturup mevcut Filament nesnesini kullanabilirsiniz.</p><p>İsterseniz, filamentin üreticisi olan firma için bir <vendorCreateLink>Üretici</vendorCreateLink> nesnesi oluşturarak bu bilgiyi de takip edebilirsiniz.</p><p>Ayrıca, filament kullanımını otomatik olarak takip edip Makara nesnelerini güncelleyebilen Moonraker gibi diğer 3D yazıcı servislerini Spoolman ile bağlama seçeneğiniz vardır. Kurulum için <readmeLink>Spoolman README</readmeLink> dokümanına bakabilirsiniz.</p>"
|
||||
},
|
||||
"table": {
|
||||
"actions": "İşlemler"
|
||||
},
|
||||
"settings": {
|
||||
"settings": "Ayarlar",
|
||||
"header": "Ayarlar",
|
||||
"general": {
|
||||
"tab": "Genel",
|
||||
"currency": {
|
||||
"label": "Para Birimi"
|
||||
},
|
||||
"base_url": {
|
||||
"label": "Temel URL",
|
||||
"tooltip": "QR kodları gibi ek özellikler kullanılırken kullanılacak temel URL."
|
||||
},
|
||||
"round_prices": {
|
||||
"label": "Fiyatları Yuvarla",
|
||||
"tooltip": "Fiyatları en yakın tam sayıya yuvarla."
|
||||
}
|
||||
},
|
||||
"extra_fields": {
|
||||
"tab": "Ekstra Alanlar",
|
||||
"description": "<p>Burada varlıklarınıza ekstra özel alanlar ekleyebilirsiniz.</p><p>Bir alan eklendikten sonra, anahtarını (key) veya türünü değiştiremezsiniz; seçim türündeki alanlarda ise seçenekleri kaldıramaz veya çoklu seçim durumunu değiştiremezsiniz. Bir alanı silerseniz, o alana bağlı tüm varlıkların verileri silinir.</p><p>Anahtar, diğer programların veriyi okuduğu/yazdığı isimdir; bu nedenle, özel alanınız üçüncü taraf bir programla entegrasyon için kullanılacaksa doğru şekilde ayarlandığından emin olun. Varsayılan değer yalnızca yeni öğelere uygulanır.</p><p>Ekstra alanlar tablo görünümünde sıralanamaz veya filtrelenemez.</p>",
|
||||
"params": {
|
||||
"key": "Anahtar",
|
||||
"name": "İsim",
|
||||
"field_type": "Tür",
|
||||
"unit": "Birim",
|
||||
"order": "Sipariş",
|
||||
"default_value": "Varsayılan Değer",
|
||||
"choices": "Seçenekler",
|
||||
"multi_choice": "Çoklu Seçim"
|
||||
},
|
||||
"field_type": {
|
||||
"text": "Metin",
|
||||
"integer": "Tam Sayı",
|
||||
"integer_range": "Tam Sayı Aralık",
|
||||
"float": "Ondalıklı Sayı",
|
||||
"float_range": "Ondalıklı Sayı Aralığı",
|
||||
"datetime": "Tarih+Saat",
|
||||
"boolean": "İkili Değer",
|
||||
"choice": "Seçim Listesi"
|
||||
},
|
||||
"boolean_true": "Evet",
|
||||
"boolean_false": "Hayır",
|
||||
"choices_missing_error": "Seçenekleri kaldıramazsınız. Aşağıdaki seçenekler eksik: {{choices}}",
|
||||
"non_unique_key_error": "Anahtar benzersiz olmalıdır.",
|
||||
"key_not_changed": "Lütfen anahtarı başka bir şeyle değiştirin.",
|
||||
"delete_confirm": "{{name}} alanı silinsin mi?",
|
||||
"delete_confirm_description": "Bu işlem alanı ve ona bağlı tüm varlıkların verilerini silecektir."
|
||||
}
|
||||
},
|
||||
"documentTitle": {
|
||||
"default": "Spoolman",
|
||||
"suffix": " | Spoolman",
|
||||
"home": {
|
||||
"list": "Ana Sayfa | Spoolman"
|
||||
},
|
||||
"help": {
|
||||
"list": "Yardım | Spoolman"
|
||||
},
|
||||
"locations": {
|
||||
"list": "Konumlar | Spoolman"
|
||||
},
|
||||
"filament": {
|
||||
"list": "Filamentler | Spoolman",
|
||||
"show": "#{{id}} Filament Görüntüle | Spoolman",
|
||||
"edit": "#{{id}} Filament Düzenle | Spoolman",
|
||||
"create": "Filament Oluştur | Spoolman",
|
||||
"clone": "#{{id}} Filament Kopyala | Spoolman"
|
||||
},
|
||||
"spool": {
|
||||
"list": "Makaralar | Spoolman",
|
||||
"show": "#{{id}} Makara Göster | Spoolman",
|
||||
"edit": "#{{id}} Makara Düzenle | Spoolman",
|
||||
"create": "Makara Oluştur | Spoolman",
|
||||
"clone": "#{{id}}Makara Kopyala | Spoolman"
|
||||
},
|
||||
"vendor": {
|
||||
"list": "Üreticiler | Spoolman",
|
||||
"show": "#{{id}} Üretici Göster | Spoolman",
|
||||
"edit": "#{{id}} Üretici Düzenle | Spoolman",
|
||||
"create": "Üretici Oluştur | Spoolman",
|
||||
"clone": "#{{id}} Üretici Kopyala | Spoolman"
|
||||
}
|
||||
},
|
||||
"locations": {
|
||||
"locations": "Konumlar",
|
||||
"new_location": "Yeni Konum",
|
||||
"no_location": "Konum Yok",
|
||||
"no_locations_help": "Bu sayfa, makaralarınızı konumlara göre düzenlemenizi sağlar. Başlamak için birkaç makara ekleyin!"
|
||||
}
|
||||
}
|
||||
@@ -21,7 +21,8 @@
|
||||
"notAccessTitle": "У Вас бракує прав для доступу",
|
||||
"clone": "Клонувати",
|
||||
"unArchive": "Розархівувати",
|
||||
"saveAndAdd": "Зберегти та додати"
|
||||
"saveAndAdd": "Зберегти та додати",
|
||||
"continue": "Продовжити"
|
||||
},
|
||||
"spool": {
|
||||
"fields": {
|
||||
@@ -42,7 +43,11 @@
|
||||
"registered": "Додано",
|
||||
"first_used": "Вперше Використано",
|
||||
"remaining_weight": "Залишок Ваги",
|
||||
"price": ""
|
||||
"price": "Ціна",
|
||||
"filament_external": "Зовнішній",
|
||||
"filament_internal": "Внутрішній",
|
||||
"initial_weight": "Початкова вага",
|
||||
"spool_weight": "Порожня вага"
|
||||
},
|
||||
"spool": "Котушки",
|
||||
"titles": {
|
||||
@@ -52,11 +57,19 @@
|
||||
"archive": "Архівувати Котушку",
|
||||
"show": "Відобразити Котушку",
|
||||
"create": "Створити Котушку",
|
||||
"clone": "Клонувати Котушку"
|
||||
"clone": "Клонувати Котушку",
|
||||
"adjust": "Відрегулюйте філамент з котушки"
|
||||
},
|
||||
"form": {
|
||||
"spool_updated": "Ця котушка була оновлена кимось/чимось після відкриття цієї сторінки. Збереження перезапише ці зміни!",
|
||||
"new_location_prompt": "Введіть нове розташування"
|
||||
"new_location_prompt": "Введіть нове розташування",
|
||||
"adjust_filament_value": "Споживана кількість",
|
||||
"measurement_type": {
|
||||
"length": "Довжина",
|
||||
"weight": "Вага"
|
||||
},
|
||||
"measurement_type_label": "Вид вимірювання",
|
||||
"adjust_filament_help": ""
|
||||
},
|
||||
"fields_help": {
|
||||
"used_weight": "Скільки філаменту було використано з котушки. Для нової котушки слід використовувати 0g.",
|
||||
@@ -65,10 +78,16 @@
|
||||
"lot_nr": "Номер партії виробника. Може використовуватися для гарантування рівномірного кольору друку при використанні декількох котушок.",
|
||||
"remaining_weight": "Скільки філаменту залишилося на котушці. Для нової котушки це має відповідати вазі філаменту на котушці.",
|
||||
"location": "Де розташована котушка, якщо у вас є кілька місць для зберігання котушок.",
|
||||
"price": ""
|
||||
"price": "Ціна цілої котушки. Якщо не вказано, замість неї буде використано ціну філамента.",
|
||||
"spool_weight": "",
|
||||
"initial_weight": "",
|
||||
"external_filament": ""
|
||||
},
|
||||
"messages": {
|
||||
"archive": "Ви впевнені що хочете архівувати цю котушку?"
|
||||
},
|
||||
"formats": {
|
||||
"last_used": ""
|
||||
}
|
||||
},
|
||||
"actions": {
|
||||
@@ -109,14 +128,25 @@
|
||||
"printerMarginBottom": "Безпечна зона знизу",
|
||||
"printerMarginTop": "Безпечна зона зверху",
|
||||
"printerMarginRight": "Безпечна зона справа",
|
||||
"printerMarginLeft": "Безпечна зона зліва"
|
||||
"printerMarginLeft": "Безпечна зона зліва",
|
||||
"settings": "Передналаштування",
|
||||
"defaultSettings": "За замовчуванням",
|
||||
"addSettings": "Додати нове передналаштування",
|
||||
"newSetting": "Новий",
|
||||
"itemCopies": "Копії елементів",
|
||||
"deleteSettings": "Видалити поточне передналаштування",
|
||||
"duplicateSettings": "Дублікат",
|
||||
"deleteSettingsConfirm": "Ви впевнені, що бажаєте видалити це передналаштування?",
|
||||
"settingsName": "Назва передналаштування",
|
||||
"saveSetting": "Зберегти передналаштування",
|
||||
"saveAsImage": "Зберегти як зображення"
|
||||
},
|
||||
"spoolSelect": {
|
||||
"selectedTotal_one": "{{count}} обрана котушка",
|
||||
"selectedTotal_few": "{{count}} обрані котушки",
|
||||
"selectedTotal_many": "{{count}} обраних котушок",
|
||||
"showArchived": "Показати Архівні",
|
||||
"description": "Виберіть котушки для друку QR-кодів.",
|
||||
"description": "Виберіть котушки для друку етикеток",
|
||||
"title": "Виберіть котушки",
|
||||
"selectAll": "Вибрати/Відмінити Всі",
|
||||
"noSpoolsSelected": "Ви не вибрали жодної котушки."
|
||||
@@ -130,14 +160,31 @@
|
||||
"showContent": "Друк етикеток",
|
||||
"showVendorComment": "Примітка про виробника",
|
||||
"showSpoolComment": "Примітка про котушку",
|
||||
"textSize": "Розмір тексту",
|
||||
"title": "Друк QR-кодів",
|
||||
"textSize": "Розмір тексту етикетки",
|
||||
"title": "Друк етикеток",
|
||||
"showSpoolmanIcon": "Відобразити іконку Spoolman",
|
||||
"showLotNr": "Номер партії",
|
||||
"bedTemp": "ТС: {{temp}}",
|
||||
"lotNr": "Партія номер: {{lot}}",
|
||||
"showFilamentComment": "Примітка про філамент",
|
||||
"button": "Друкувати QR-коди"
|
||||
"button": "Друкувати етикетки",
|
||||
"useHTTPUrl": {
|
||||
"label": "Посилання на QR-код",
|
||||
"preview": "Попередній перегляд:",
|
||||
"options": {
|
||||
"default": "За замовчуванням",
|
||||
"url": "URL"
|
||||
},
|
||||
"tooltip": ""
|
||||
},
|
||||
"template": "Шаблон етикетки",
|
||||
"showQRCode": "Надрукувати QR-код",
|
||||
"showQRCodeMode": {
|
||||
"no": "Ні",
|
||||
"simple": "Простий",
|
||||
"withIcon": "З іконкою"
|
||||
},
|
||||
"templateHelp": "Використовуйте {} для вставки значень об'єкту котушки у вигляді тексту. Наприклад, {id} буде замінено ідентифікатором котушки, або {filament.material} буде замінено значенням матеріалу котушки. Відсутне значення буде замінено на \"?\". Щоб видалити його, можна використати ще одні {}. Крім того, будь-який текст між {} буде видалено, якщо значення відсутнє. Наприклад, {Lot Nr: {lot_nr}} покаже напис тільки якщо котушка має номер партії. Загорніть текст подвійними зірочками **, щоб зробити його жирним. Натисніть кнопку, щоб переглянути список усіх доступних тегів."
|
||||
}
|
||||
},
|
||||
"notifications": {
|
||||
@@ -150,7 +197,9 @@
|
||||
"importProgress": "Імпортування: {{processed}}/{{total}}",
|
||||
"createError": "Трапилась помилка при створенні {{resource}} (код помилки: {{statusCode}})",
|
||||
"editSuccess": "Успішно змінено {{resource}}",
|
||||
"deleteError": "Помилка при видаленні {{resource}} (код помилки: {{statusCode}})"
|
||||
"deleteError": "Помилка при видаленні {{resource}} (код помилки: {{statusCode}})",
|
||||
"saveSuccessful": "Успішно збережено!",
|
||||
"validationError": "Помилка перевірки: {{error}}"
|
||||
},
|
||||
"no": "Ні",
|
||||
"yes": "Так",
|
||||
@@ -186,7 +235,12 @@
|
||||
"article_number": "Артикул",
|
||||
"comment": "Коментар",
|
||||
"registered": "Додано",
|
||||
"spools": "Показати котушки"
|
||||
"spools": "Показати котушки",
|
||||
"single_color": "Одноколірний",
|
||||
"external_id": "Зовнішній ID",
|
||||
"multi_color": "Багатокольоровий",
|
||||
"coaxial": "Коекструдтваний",
|
||||
"longitudinal": ""
|
||||
},
|
||||
"titles": {
|
||||
"show_title": "[Філамент #{{id}}] {{name}}",
|
||||
@@ -197,16 +251,22 @@
|
||||
"create": "Створити Філамент"
|
||||
},
|
||||
"fields_help": {
|
||||
"price": "Ціна всієї котушки у валюті, встановленій в системі.",
|
||||
"price": "Ціна всієї котушки.",
|
||||
"material": "Наприклад PLA, ABS, PETG, тощо.",
|
||||
"name": "Назва філаменту, щоб відрізнити цей філамент поміж інших від того самого виробника. Вона повинна містити, наприклад, колір.",
|
||||
"article_number": "Напр. EAN, UPC тощо.",
|
||||
"spool_weight": "Вага порожньої котушки. Використовується для визначення виміряної ваги котушки.",
|
||||
"weight": "Вага повної котушки філаменту (нетто). Ця вага не повинна включати вагу самої котушки, а тільки філаменту. Зазвичай це вказується на упаковці."
|
||||
"weight": "Вага повної котушки філаменту (нетто). Ця вага не повинна включати вагу самої котушки, а тільки філаменту. Зазвичай це вказується на упаковці.",
|
||||
"multi_color_direction": ""
|
||||
},
|
||||
"filament": "Філаменти",
|
||||
"form": {
|
||||
"filament_updated": "Цей філамент хтось/щось оновив після того, як ви відкрили цю сторінку. Збереження перезапише ці зміни!"
|
||||
"filament_updated": "Цей філамент хтось/щось оновив після того, як ви відкрили цю сторінку. Збереження перезапише ці зміни!",
|
||||
"import_external": "Імпортувати з зовнішнього джерела",
|
||||
"import_external_description": ""
|
||||
},
|
||||
"buttons": {
|
||||
"add_spool": "Додати Котушку"
|
||||
}
|
||||
},
|
||||
"unknown": "Невідомий",
|
||||
@@ -230,11 +290,16 @@
|
||||
"comment": "Коментар",
|
||||
"name": "Назва",
|
||||
"registered": "Додано",
|
||||
"id": "ІД"
|
||||
"id": "ІД",
|
||||
"empty_spool_weight": "Вага пустої котушки",
|
||||
"external_id": "Зовнішній ID"
|
||||
},
|
||||
"vendor": "Виробники",
|
||||
"form": {
|
||||
"vendor_updated": "Цей виробник був оновлений кимось/чимось після відкриття цієї сторінки. Збереження перезапише ці зміни!"
|
||||
},
|
||||
"fields_help": {
|
||||
"empty_spool_weight": ""
|
||||
}
|
||||
},
|
||||
"documentTitle": {
|
||||
@@ -266,6 +331,9 @@
|
||||
},
|
||||
"help": {
|
||||
"list": "Довідка | Spoolman"
|
||||
},
|
||||
"locations": {
|
||||
"list": ""
|
||||
}
|
||||
},
|
||||
"table": {
|
||||
@@ -282,6 +350,63 @@
|
||||
},
|
||||
"kofi": "Задонатити на Ko-fi",
|
||||
"home": {
|
||||
"home": "Домашня"
|
||||
"home": "Домашня",
|
||||
"welcome": "",
|
||||
"description": ""
|
||||
},
|
||||
"settings": {
|
||||
"header": "Налаштування",
|
||||
"general": {
|
||||
"currency": {
|
||||
"label": "Валюта"
|
||||
},
|
||||
"tab": "Загальне",
|
||||
"base_url": {
|
||||
"label": "Базова URL-адреса",
|
||||
"tooltip": ""
|
||||
},
|
||||
"round_prices": {
|
||||
"label": "",
|
||||
"tooltip": ""
|
||||
}
|
||||
},
|
||||
"extra_fields": {
|
||||
"params": {
|
||||
"key": "Ключ",
|
||||
"name": "Ім'я",
|
||||
"field_type": "Тип",
|
||||
"default_value": "Стандартне значення",
|
||||
"choices": "Вибір",
|
||||
"multi_choice": "Вибрати кілька значень",
|
||||
"unit": "Одиниця",
|
||||
"order": "Замовлення"
|
||||
},
|
||||
"field_type": {
|
||||
"text": "Текст",
|
||||
"integer_range": "Цілочисловий діапазон",
|
||||
"float": "Число з рухомою комою",
|
||||
"float_range": "Діапазон чисел з рухомою комою",
|
||||
"boolean": "Логічний тип даних",
|
||||
"integer": "Ціле число",
|
||||
"datetime": "Дата та час",
|
||||
"choice": "Можливісь вибору"
|
||||
},
|
||||
"boolean_false": "Ні",
|
||||
"non_unique_key_error": "Ключ має бути унікальним.",
|
||||
"tab": "Додаткові поля",
|
||||
"boolean_true": "Так",
|
||||
"key_not_changed": "Змініть ключ на інший будь ласка.",
|
||||
"delete_confirm": "Видалити поле {{name}}?",
|
||||
"delete_confirm_description": "Це призведе до видалення поля та усіх пов'язаних з ним даних для усіх об'єктів.",
|
||||
"choices_missing_error": "Ви не можете видалити обрані варіанти. Наступні варіанти відсутні: {{choices}}",
|
||||
"description": "<p>Тут ви можете додати додаткові користувацькі поля до своїх об’єктів.</p><p>Після додавання поля ви не можете змінити його ключ або тип, а для полів типу вибору ви не можете видалити варіанти або змінити стан кількох варіантів. Якщо ви вилучите поле, пов’язані дані для всіх об’єктів буде видалено.</p><p>Ключ – це те, як інші програми читають/записують дані, тож якщо ваше спеціальне поле має інтегруватися зі сторонніми програми, переконайтеся, що ви правильно її налаштували. Значення за замовчуванням застосовується лише до нових елементів.</p><p>Додаткові поля не можна сортувати чи фільтрувати в режимі перегляду таблиці.</p>"
|
||||
},
|
||||
"settings": "Налаштування"
|
||||
},
|
||||
"locations": {
|
||||
"new_location": "",
|
||||
"no_location": "",
|
||||
"locations": "",
|
||||
"no_locations_help": ""
|
||||
}
|
||||
}
|
||||
@@ -0,0 +1,399 @@
|
||||
{
|
||||
"actions": {
|
||||
"clone": "複製",
|
||||
"show": "顯示",
|
||||
"list": "列表",
|
||||
"create": "建立",
|
||||
"edit": "編輯"
|
||||
},
|
||||
"buttons": {
|
||||
"create": "建立",
|
||||
"save": "儲存",
|
||||
"saveAndAdd": "儲存並新增",
|
||||
"logout": "登出",
|
||||
"delete": "刪除",
|
||||
"edit": "編輯",
|
||||
"cancel": "取消",
|
||||
"confirm": "您確定嗎?",
|
||||
"continue": "繼續",
|
||||
"filter": "篩選",
|
||||
"clear": "清除",
|
||||
"refresh": "重新整理",
|
||||
"show": "檢視",
|
||||
"undo": "復原",
|
||||
"import": "匯入",
|
||||
"clone": "複製",
|
||||
"archive": "封存",
|
||||
"unArchive": "取消封存",
|
||||
"hideArchived": "隱藏已封存",
|
||||
"showArchived": "檢視已封存",
|
||||
"notAccessTitle": "您沒有存取的權限",
|
||||
"hideColumns": "隱藏欄",
|
||||
"clearFilters": "清除篩選"
|
||||
},
|
||||
"warnWhenUnsavedChanges": "您確定要離開嗎?您尚有未儲存的變更。",
|
||||
"notifications": {
|
||||
"success": "成功",
|
||||
"error": "錯誤 ( 狀態碼:{{statusCode}} )",
|
||||
"undoable": "您有 {{seconds}} 秒可以還原。",
|
||||
"createSuccess": "成功建立 {{resource}}",
|
||||
"createError": "建立 {{resource}} 時發生錯誤(狀態碼:{{statusCode}})",
|
||||
"deleteSuccess": "成功刪除 {{resource}}",
|
||||
"deleteError": "刪除 {{resource}} 時發生錯誤(狀態碼:{{statusCode}})",
|
||||
"editSuccess": "成功編輯{{resource}}",
|
||||
"editError": "編輯 {{resource}} 時發生錯誤(狀態碼:{{statusCode}})",
|
||||
"importProgress": "匯入中:{{processed}}/{{total}}",
|
||||
"saveSuccessful": "儲存成功!",
|
||||
"validationError": "驗證錯誤: {{error}}"
|
||||
},
|
||||
"kofi": "在Ko-fi上打賞我",
|
||||
"loading": "讀取中",
|
||||
"version": "版本",
|
||||
"unknown": "未知",
|
||||
"yes": "是",
|
||||
"no": "否",
|
||||
"tags": {
|
||||
"clone": "複製"
|
||||
},
|
||||
"dashboard": {
|
||||
"title": "儀表板"
|
||||
},
|
||||
"printing": {
|
||||
"generic": {
|
||||
"title": "列印中",
|
||||
"description": "調整以下設定以取得所需的列印版面。請注意,印表機與作業系統可能會套用自己的邊距和縮放比例,因此可能需要多次測試。列印實際標籤前,請先使用一般紙張測試。",
|
||||
"helpMargin": "邊距應設定為與您的標籤紙和印表機相符,調整這些將影響整個網格的大小。",
|
||||
"rows": "列",
|
||||
"paperSize": "紙張大小",
|
||||
"customSize": "自訂",
|
||||
"dimensions": "尺寸",
|
||||
"showBorder": "顯示外框",
|
||||
"previewScale": "預覽縮放比例",
|
||||
"skipItems": "跳過項目",
|
||||
"itemCopies": "每項份數",
|
||||
"contentSettings": "內容設定",
|
||||
"layoutSettings": "佈局設定",
|
||||
"horizontalSpacing": "水平間距",
|
||||
"marginLeft": "左邊界",
|
||||
"marginRight": "右邊界",
|
||||
"marginBottom": "下邊界",
|
||||
"printerMarginLeft": "安全區域左側",
|
||||
"printerMarginRight": "安全區域右側",
|
||||
"printerMarginTop": "安全區域上側",
|
||||
"printerMarginBottom": "安全區域下側",
|
||||
"borders": {
|
||||
"border": "邊框",
|
||||
"grid": "格線",
|
||||
"none": "無"
|
||||
},
|
||||
"defaultSettings": "預設",
|
||||
"addSettings": "新增預設定",
|
||||
"newSetting": "新增",
|
||||
"settings": "預設集",
|
||||
"settingsName": "預設集名稱",
|
||||
"duplicateSettings": "複製",
|
||||
"deleteSettings": "刪除目前預設定",
|
||||
"deleteSettingsConfirm": "確定要刪除此預設集嗎?",
|
||||
"saveSetting": "儲存預設集",
|
||||
"saveAsImage": "另存為圖片",
|
||||
"print": "列印",
|
||||
"columns": "欄",
|
||||
"verticalSpacing": "垂直間距",
|
||||
"marginTop": "上邊界",
|
||||
"helpPrinterMargin": "安全區域應設定為印表機能列印的距離紙張的邊界,更改此選項不影響整個網格。"
|
||||
},
|
||||
"qrcode": {
|
||||
"title": "標籤列印中",
|
||||
"template": "標籤範本",
|
||||
"button": "列印標籤",
|
||||
"templateHelp": "使用 {} 插入線捲物件的數值。例如,{id} 會被替換為線捲 ID,而 {filament.material} 則會替換為該線捲的材質。若數值缺失,會以「?」代替。您可以使用第二組 {} 來移除此符號;此外,若數值缺失,兩組 {} 之間的任何文字也都會被一併移除。例如,{批號:{lot_nr}} 僅會在該線捲含有批號資訊時顯示標籤。使用雙星號 ** 包圍文字可設為粗體。點擊按鈕可查看所有可用標籤的清單。",
|
||||
"textSize": "標籤文字大小",
|
||||
"showContent": "列印標籤",
|
||||
"useHTTPUrl": {
|
||||
"label": "QR 碼連結",
|
||||
"preview": "預覽:",
|
||||
"options": {
|
||||
"default": "預設",
|
||||
"url": "URL"
|
||||
},
|
||||
"tooltip": "將使用專屬連結,僅在使用 Spoolman 的掃描功能掃描時有效(預設)。URL 使用設定中指定的基礎 URL,若未設置則使用目前頁面的 URL。"
|
||||
},
|
||||
"showQRCodeMode": {
|
||||
"no": "否",
|
||||
"withIcon": "包含圖示",
|
||||
"simple": "簡易"
|
||||
},
|
||||
"showQRCode": "列印QR碼"
|
||||
},
|
||||
"spoolSelect": {
|
||||
"title": "選擇料盤",
|
||||
"description": "選擇要列印標籤的料盤。",
|
||||
"showArchived": "檢視已封存",
|
||||
"noSpoolsSelected": "您尚未選擇任何料盤。",
|
||||
"selectAll": "選擇/取消全選",
|
||||
"selectedTotal_other": "已選擇 {{count}} 個線軸"
|
||||
}
|
||||
},
|
||||
"scanner": {
|
||||
"description": "掃描 Spoolman QR 碼以檢視線軸的詳細資料。",
|
||||
"error": {
|
||||
"notAllowed": "您未被允許存取攝影機。",
|
||||
"streamApiNotSupported": "瀏覽器不支援MediaStream API。",
|
||||
"notReadable": "攝影機不可讀取。",
|
||||
"notFound": "未找到攝影機。",
|
||||
"insecureContext": "此頁面未通過 HTTPS 提供服務。",
|
||||
"unknown": "發生未知的錯誤。({{error}})"
|
||||
},
|
||||
"title": "QR 碼掃描器"
|
||||
},
|
||||
"spool": {
|
||||
"spool": "線軸",
|
||||
"fields": {
|
||||
"id": "ID",
|
||||
"filament": "線材",
|
||||
"filament_internal": "內部",
|
||||
"used_weight": "已用重量",
|
||||
"remaining_weight": "剩餘重量",
|
||||
"measured_weight": "實測重量",
|
||||
"used_length": "已用長度",
|
||||
"remaining_length": "剩餘長度",
|
||||
"initial_weight": "初始重量",
|
||||
"spool_weight": "空料盤重量",
|
||||
"location": "位置",
|
||||
"lot_nr": "批號",
|
||||
"first_used": "首次使用",
|
||||
"last_used": "上次使用",
|
||||
"registered": "登記於",
|
||||
"filament_name": "線材",
|
||||
"filament_external": "外部",
|
||||
"price": "價格",
|
||||
"weight_to_use": "重量",
|
||||
"comment": "備註",
|
||||
"archived": "封存",
|
||||
"material": "材料"
|
||||
},
|
||||
"fields_help": {
|
||||
"price": "完整線盤的價格。如果未設定,則會假設為線材的價格。",
|
||||
"used_weight": "料盤所使用的線材重量。一個新料盤應該為0克。",
|
||||
"measured_weight": "線材和料盤的重量為多少。",
|
||||
"initial_weight": "料盤上線材的初始重量(淨重)。如果未設置,將使用線材物件中的重量。",
|
||||
"spool_weight": "線盤的空盤重量。留空時將使用線材或製造商提供的數值。",
|
||||
"location": "如果您的料盤存於多個位置,請填寫料盤所在位置。",
|
||||
"lot_nr": "製造商的批號。如果使用多個線盤,可用於確保列印的顏色一致。",
|
||||
"weight_to_use": "選擇要輸入的重量值。只有在選擇的線材設置了料盤重量時,才會顯示測量重量。",
|
||||
"remaining_weight": "料盤所剩餘的線材。對於新的料盤來說應等於料盤重量。",
|
||||
"external_filament": "您已從外部資料庫選擇了一種線材。在建立此線盤時,系統將自動建立一個線材(以及可能的製造商)。如果您之前已為該線材建立過資料,這可能會產生重複的線材。"
|
||||
},
|
||||
"titles": {
|
||||
"create": "建立線盤",
|
||||
"clone": "複製線盤",
|
||||
"edit": "編輯線盤",
|
||||
"list": "線盤",
|
||||
"show": "檢視線盤",
|
||||
"adjust": "調整料盤線材",
|
||||
"show_title": "[線盤 #{{id}}] {{name}}",
|
||||
"archive": "封存線盤"
|
||||
},
|
||||
"form": {
|
||||
"measurement_type_label": "測量類型",
|
||||
"adjust_filament_help": "此處您可直接增加或減少料盤上的線材,正數為減少線材數量,負數為增加線材數量。",
|
||||
"adjust_filament_value": "消耗量",
|
||||
"measurement_type": {
|
||||
"length": "長度",
|
||||
"weight": "重量"
|
||||
},
|
||||
"new_location_prompt": "輸入一個新位置",
|
||||
"spool_updated": "此線盤已被其他人/程式更新過。若儲存將覆蓋這些變更!"
|
||||
},
|
||||
"messages": {
|
||||
"archive": "您確定要封存此線盤嗎?"
|
||||
},
|
||||
"formats": {
|
||||
"last_used": "上次使用{{date}}"
|
||||
}
|
||||
},
|
||||
"filament": {
|
||||
"fields": {
|
||||
"vendor": "製造商",
|
||||
"name": "名稱",
|
||||
"material": "材料",
|
||||
"price": "價格",
|
||||
"density": "密度",
|
||||
"diameter": "線徑",
|
||||
"weight": "重量",
|
||||
"spool_weight": "料盤重量",
|
||||
"article_number": "產品編號",
|
||||
"comment": "備註",
|
||||
"color_hex": "顏色",
|
||||
"multi_color": "多色",
|
||||
"coaxial": "混色",
|
||||
"settings_extruder_temp": "擠出機溫度",
|
||||
"settings_bed_temp": "床台溫度",
|
||||
"external_id": "內部ID",
|
||||
"spools": "檢視料盤",
|
||||
"longitudinal": "縱向",
|
||||
"single_color": "單色",
|
||||
"id": "ID",
|
||||
"vendor_name": "製造商",
|
||||
"registered": "已登記"
|
||||
},
|
||||
"fields_help": {
|
||||
"material": "例如:PLA、ABS、PETG等。",
|
||||
"name": "線材名稱,用來區分相同製造商的不同線材類型。例如應該包含顏色資訊。",
|
||||
"article_number": "例如EAN、UPC等。",
|
||||
"price": "全新料盤價格。",
|
||||
"spool_weight": "空線盤的重量,用於計算整捲線的實際重量。",
|
||||
"multi_color_direction": "線材的顏色可通過兩種方式呈現多樣性:一種是共擠技術,例如雙色線材,具有穩定的多色效果;另一種是沿線材長度的顏色變化,例如漸變線材,顏色會隨著線材捲的長度逐漸轉變。",
|
||||
"weight": "整捲線材的重量(淨重)。此重量不應包含線盤本身的重量,僅限於線材的重量,通常會標示在包裝上。"
|
||||
},
|
||||
"titles": {
|
||||
"create": "建立線材",
|
||||
"clone": "複製線材",
|
||||
"edit": "編輯線材",
|
||||
"list": "線材",
|
||||
"show": "檢視線材",
|
||||
"show_title": "[線材 #{{id}}] {{name}}"
|
||||
},
|
||||
"form": {
|
||||
"import_external": "從外部匯入",
|
||||
"filament_updated": "自您開啟此頁面以後,此線材已被其他人/事物更新。儲存將覆蓋這些變更!",
|
||||
"import_external_description": "在列表中選擇一種線材,即可自動填入線材建立表單中的相關詳細資訊。此操作將覆蓋您已輸入的所有資料。<br><br>如果需要,當您點擊“確定”時,將自動建立一個製造商對象。"
|
||||
},
|
||||
"buttons": {
|
||||
"add_spool": "增加料盤"
|
||||
},
|
||||
"filament": "線材"
|
||||
},
|
||||
"vendor": {
|
||||
"vendor": "製造商",
|
||||
"fields": {
|
||||
"name": "名稱",
|
||||
"empty_spool_weight": "空料盤重量",
|
||||
"external_id": "外部ID",
|
||||
"comment": "備註",
|
||||
"id": "ID",
|
||||
"registered": "已登記"
|
||||
},
|
||||
"fields_help": {
|
||||
"empty_spool_weight": "此製造商空線盤的重量。"
|
||||
},
|
||||
"titles": {
|
||||
"create": "建立製造商",
|
||||
"edit": "編輯製造商",
|
||||
"show_title": "[製造商 #{{id}}] {{name}}",
|
||||
"show": "檢視製造商",
|
||||
"clone": "複製製造商",
|
||||
"list": "製造商"
|
||||
},
|
||||
"form": {
|
||||
"vendor_updated": "此製造商已被其他人/程式更新過。若儲存將覆蓋這些變更!"
|
||||
}
|
||||
},
|
||||
"documentTitle": {
|
||||
"vendor": {
|
||||
"create": "建立製造商 | Spoolman",
|
||||
"clone": "#{{id}} 複製製造商 | Spoolman",
|
||||
"list": "製造商 | Spoolman",
|
||||
"edit": "#{{id}} 編輯製造商 | Spoolman",
|
||||
"show": "#{{id}} 檢視製造商 | Spoolman"
|
||||
},
|
||||
"default": "Spoolman",
|
||||
"suffix": " | Spoolman",
|
||||
"home": {
|
||||
"list": "主頁 | Spoolman"
|
||||
},
|
||||
"help": {
|
||||
"list": "說明 | Spoolman"
|
||||
},
|
||||
"filament": {
|
||||
"list": "線材 | Spoolman",
|
||||
"edit": "#{{id}} 編輯線材 | Spoolman",
|
||||
"show": "#{{id}} 檢視線材 | Spoolman",
|
||||
"create": "建立線材 | Spoolman",
|
||||
"clone": "#{{id}} 複製線材 | Spoolman"
|
||||
},
|
||||
"spool": {
|
||||
"create": "建立線盤 | Spoolman",
|
||||
"clone": "#{{id}} 複製線盤 | Spoolman",
|
||||
"show": "#{{id}} 檢視線盤 | Spoolman",
|
||||
"edit": "#{{id}} 編輯線盤 | Spoolman",
|
||||
"list": "線盤 | Spoolman"
|
||||
},
|
||||
"locations": {
|
||||
"list": "位置| Spoolman"
|
||||
}
|
||||
},
|
||||
"home": {
|
||||
"home": "主頁",
|
||||
"welcome": "歡迎來到您的 Spoolman!",
|
||||
"description": "您似乎還沒新增任何線捲。請參閱 <helpPageLink>說明頁面</helpPageLink> 以了解如何開始使用。"
|
||||
},
|
||||
"help": {
|
||||
"help": "說明",
|
||||
"resources": {
|
||||
"filament": "線材的品牌。它們具有名稱、材料、顏色、線徑等屬性。",
|
||||
"spool": "特定線材的單個實體線盤。",
|
||||
"vendor": "製造線材的公司。"
|
||||
},
|
||||
"description": "<title>說明</title><p>這裡是一些入門提示。</p><p>Spoolman 儲存三種類型的資料:</p><itemsHelp/><p>要將新線材加入資料庫,首先需要建立一個 <filamentCreateLink>線材</filamentCreateLink> 物件。完成後,接著為該特定線材建立一個 <spoolCreateLink>線盤</spoolCreateLink> 物件。如果之後您再獲得相同線材的其他線盤,只需生成更多的線盤物件,並重複使用相同的線材物件。</p><p>如果您希望追蹤製造商資訊,也可以選擇建立一個 <vendorCreateLink>製造商</vendorCreateLink> 物件。</p><p>您還可以將其他3D列印服務與Spoolman連接,例如Moonraker,它可以自動監控線材使用情況並為您更新線盤物件。請參閱 <readmeLink>Spoolman README</readmeLink> 以獲取設置指南。</p>"
|
||||
},
|
||||
"table": {
|
||||
"actions": "操作"
|
||||
},
|
||||
"settings": {
|
||||
"settings": "設定",
|
||||
"header": "設定",
|
||||
"general": {
|
||||
"tab": "一般",
|
||||
"currency": {
|
||||
"label": "貨幣"
|
||||
},
|
||||
"base_url": {
|
||||
"tooltip": "生成 QR 碼等功能時使用的基本 URL。",
|
||||
"label": "基本URL"
|
||||
},
|
||||
"round_prices": {
|
||||
"label": "價格四捨五入",
|
||||
"tooltip": "將價格四捨五入至最接近的整數。"
|
||||
}
|
||||
},
|
||||
"extra_fields": {
|
||||
"tab": "額外欄位",
|
||||
"params": {
|
||||
"key": "鍵值",
|
||||
"name": "名稱",
|
||||
"field_type": "類型",
|
||||
"unit": "單位",
|
||||
"order": "順序",
|
||||
"default_value": "預設值",
|
||||
"multi_choice": "多選項",
|
||||
"choices": "選項"
|
||||
},
|
||||
"field_type": {
|
||||
"text": "文字",
|
||||
"float_range": "小數範圍",
|
||||
"datetime": "日期時間",
|
||||
"boolean": "布林",
|
||||
"choice": "選項",
|
||||
"float": "小數",
|
||||
"integer": "整數",
|
||||
"integer_range": "整數範圍"
|
||||
},
|
||||
"boolean_true": "是",
|
||||
"boolean_false": "否",
|
||||
"choices_missing_error": "您無法刪除選項。以下選項缺失:{{choices}}",
|
||||
"key_not_changed": "請將鍵值更改為其他名稱。",
|
||||
"delete_confirm": "刪除欄位 {{name}}?",
|
||||
"description": "<p>在此,您可以為您的實體加入額外的自訂欄位。</p><p>一旦加入欄位,您將無法更改其鍵值或類型,對於選擇類型欄位,您也無法刪除選項或更改多選狀態。如果刪除欄位,所有實體的相關資料將被刪除。</p><p>鍵值是其他程式讀取/寫入資料的方式,因此如果您的自訂欄位需要與第三方程式整合,請確保正確設置。預設值僅適用於新品項。</p><p>額外的欄位無法在表格視圖中排序或過濾。</p>",
|
||||
"non_unique_key_error": "鍵值必須為唯一。",
|
||||
"delete_confirm_description": "這將刪除該欄位及所有與之關聯的所有實體資料。"
|
||||
}
|
||||
},
|
||||
"locations": {
|
||||
"locations": "位置",
|
||||
"no_location": "未設定位置",
|
||||
"no_locations_help": "這個頁面讓您將料盤按位置進行整理,請從增加一些線盤來開始!",
|
||||
"new_location": "新增位置"
|
||||
},
|
||||
"sponsor": "在 GitHub 上贊助專案"
|
||||
}
|
||||
@@ -21,19 +21,20 @@
|
||||
"undo": "撤销",
|
||||
"import": "导入",
|
||||
"clone": "克隆",
|
||||
"archive": "存档",
|
||||
"unArchive": "取消存档",
|
||||
"archive": "归档",
|
||||
"unArchive": "解除归档",
|
||||
"hideArchived": "隐藏存档",
|
||||
"showArchived": "显示存档",
|
||||
"showArchived": "显示已归档项",
|
||||
"notAccessTitle": "您没有访问权限",
|
||||
"hideColumns": "隐藏列",
|
||||
"clearFilters": "清除筛选器",
|
||||
"saveAndAdd": "保存并添加"
|
||||
"saveAndAdd": "保存并添加",
|
||||
"continue": "继续"
|
||||
},
|
||||
"warnWhenUnsavedChanges": "您确定要离开吗?您有未保存的更改。",
|
||||
"notifications": {
|
||||
"success": "操作成功",
|
||||
"error": "出现错误 (状态码:{{statusCode}})",
|
||||
"error": "发生错误 (状态码:{{statusCode}})",
|
||||
"undoable": "您有 {{seconds}} 秒可以撤销。",
|
||||
"createSuccess": "成功创建 {{resource}}",
|
||||
"createError": "创建 {{resource}} 时出现错误 (状态码:{{statusCode}})",
|
||||
@@ -41,7 +42,9 @@
|
||||
"deleteError": "删除 {{resource}} 时出现错误 (状态码:{{statusCode}})",
|
||||
"editSuccess": "成功修改 {{resource}}",
|
||||
"editError": "修改 {{resource}} 时出现错误 (状态码:{{statusCode}})",
|
||||
"importProgress": "导入中: {{processed}}/{{total}}"
|
||||
"importProgress": "导入中: {{processed}}/{{total}}",
|
||||
"saveSuccessful": "保存成功!",
|
||||
"validationError": "校验错误:{{error}}"
|
||||
},
|
||||
"loading": "加载中",
|
||||
"version": "版本",
|
||||
@@ -57,96 +60,128 @@
|
||||
"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": "外边框",
|
||||
"grid": "格子"
|
||||
}
|
||||
},
|
||||
"defaultSettings": "默认",
|
||||
"settings": "预设",
|
||||
"saveSetting": "保存预设",
|
||||
"settingsName": "预设名称",
|
||||
"addSettings": "添加新预设",
|
||||
"deleteSettingsConfirm": "确定删除此预设吗?",
|
||||
"saveAsImage": "保存为图片",
|
||||
"newSetting": "新增",
|
||||
"itemCopies": "单个标签打印份数",
|
||||
"duplicateSettings": "复制",
|
||||
"deleteSettings": "删除当前预设"
|
||||
},
|
||||
"qrcode": {
|
||||
"button": "打印二维码",
|
||||
"title": "打印二维码",
|
||||
"button": "打印标签",
|
||||
"title": "打印标签",
|
||||
"spoolWeight": "料盘重量:{{weight}}",
|
||||
"lotNr": "批号:{{lot}}",
|
||||
"bedTemp": "热床温度:{{temp}}",
|
||||
"extruderTemp": "挤出温度:{{temp}}",
|
||||
"textSize": "内容文本大小",
|
||||
"textSize": "标签文本大小",
|
||||
"showSpoolmanIcon": "显示Spoolman图标",
|
||||
"showVendor": "供应商",
|
||||
"showVendor": "制造商",
|
||||
"showContent": "打印标签",
|
||||
"showLotNr": "批号",
|
||||
"showSpoolWeight": "料盘重量",
|
||||
"showTemperatures": "温度",
|
||||
"showSpoolComment": "料盘备注",
|
||||
"showFilamentComment": "耗材备注",
|
||||
"showVendorComment": "供应商备注"
|
||||
"showVendorComment": "制造商备注",
|
||||
"template": "标签模版",
|
||||
"showQRCode": "打印二维码",
|
||||
"showQRCodeMode": {
|
||||
"no": "否",
|
||||
"withIcon": "含图标",
|
||||
"simple": "简单"
|
||||
},
|
||||
"templateHelp": "使用 {} 将料盘的值插入为文本。例如,{id} 将被替换为料盘的ID,或者 {filament.material} 将被替换为料盘的材质。如果某个值缺失,将用 \"?\" 替代。可以使用第二组 {} 来删除缺失值相关的内容。此外,任意位于两组 {} 之间的文本,如果值缺失,将被一同删除。例如,{Lot Nr: {lot_nr}} 只有在料盘存在批号时才会显示标签内容。用双星号 ** 包裹文本可以将其加粗。点击按钮查看所有可用的标签列表。",
|
||||
"useHTTPUrl": {
|
||||
"tooltip": "将使用专有链接,该链接仅在通过 Spoolman 的内置扫描功能扫描时生效(默认)。URL 将使用设置中指定的基准 URL;若未设置,则使用当前页面的 URL。",
|
||||
"label": "二维码编码内容",
|
||||
"options": {
|
||||
"default": "默认(Spoolman 专属格式)",
|
||||
"url": "标准网页 URL"
|
||||
},
|
||||
"preview": "预览:"
|
||||
}
|
||||
},
|
||||
"spoolSelect": {
|
||||
"title": "选择料盘",
|
||||
"description": "选择要打印二维码的料盘。",
|
||||
"description": "选择要打印标签的料盘。",
|
||||
"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": "内部",
|
||||
"filament_external": "外部"
|
||||
},
|
||||
"fields_help": {
|
||||
"weight_to_use": "请选择要输入的重量值。净重只在所选的耗材设置了料盘重量时可用。",
|
||||
@@ -155,7 +190,10 @@
|
||||
"measured_weight": "耗材和料盘的重量分别是多少。",
|
||||
"location": "如果您有多个存放料盘的地方,请填写料盘所在的位置。",
|
||||
"lot_nr": "制造商的批号。如果使用多个料盘可以使用批号进行控制,以确保打印颜色一致。",
|
||||
"price": ""
|
||||
"price": "整卷料盘的价格。如果未设置,则默认使用该耗材的价格。",
|
||||
"spool_weight": "料盘没料时的重量。留空时使用耗材或者制造商的相关参数。",
|
||||
"external_filament": "您已从外部数据库中选择了一种耗材。在创建这个料盘时,将自动创建一个耗材对象(可能还包括一个制造商对象)。如果您已经为这种耗材创建了一个耗材对象,这可能会导致耗材对象重复。",
|
||||
"initial_weight": "料盘上耗材的初始重量(净重)。如果未设置将使用耗材的相关参数。"
|
||||
},
|
||||
"titles": {
|
||||
"create": "创建料盘",
|
||||
@@ -164,44 +202,61 @@
|
||||
"list": "料盘列表",
|
||||
"show": "查看料盘",
|
||||
"archive": "料盘存档",
|
||||
"show_title": "[料盘 #{{id}}] {{name}}"
|
||||
"show_title": "[料盘 #{{id}}] {{name}}",
|
||||
"adjust": "调整线盘耗材"
|
||||
},
|
||||
"messages": {
|
||||
"archive": "您确定要存档此料盘吗?"
|
||||
},
|
||||
"form": {
|
||||
"new_location_prompt": "输入一个新位置",
|
||||
"spool_updated": "自您打开此页面以来,此料盘已被其他人/事物更新。保存将覆盖这些更改!"
|
||||
"spool_updated": "自您打开此页面以来,此料盘已被其他人/事物更新。保存将覆盖这些更改!",
|
||||
"measurement_type": {
|
||||
"length": "长度",
|
||||
"weight": "重量"
|
||||
},
|
||||
"measurement_type_label": "测量类型",
|
||||
"adjust_filament_help": "在这里你可以直接增加或减少线盘中的耗材。正数是减少耗材数量,负数是增加耗材数量。",
|
||||
"adjust_filament_value": "消耗量"
|
||||
},
|
||||
"formats": {
|
||||
"last_used": "上次使用 {{date}}"
|
||||
}
|
||||
},
|
||||
"filament": {
|
||||
"filament": "耗材",
|
||||
"filament": "耗材规格",
|
||||
"fields": {
|
||||
"id": "编号",
|
||||
"vendor_name": "供应商",
|
||||
"vendor": "供应商",
|
||||
"id": "ID",
|
||||
"vendor_name": "制造商",
|
||||
"vendor": "厂商",
|
||||
"name": "名称",
|
||||
"material": "材料",
|
||||
"material": "材质",
|
||||
"price": "价格",
|
||||
"density": "密度",
|
||||
"diameter": "直径",
|
||||
"weight": "重量",
|
||||
"diameter": "线径",
|
||||
"weight": "耗材净重",
|
||||
"spool_weight": "料盘重量",
|
||||
"article_number": "产品编号",
|
||||
"registered": "登记时间",
|
||||
"registered": "录入时间",
|
||||
"comment": "备注",
|
||||
"settings_extruder_temp": "挤出头温度",
|
||||
"settings_bed_temp": "热床温度",
|
||||
"color_hex": "颜色",
|
||||
"spools": "显示料盘"
|
||||
"spools": "显示料盘",
|
||||
"external_id": "外部ID",
|
||||
"multi_color": "多色",
|
||||
"longitudinal": "纵向渐变",
|
||||
"coaxial": "双色共挤",
|
||||
"single_color": "单色"
|
||||
},
|
||||
"fields_help": {
|
||||
"name": "耗材名称,用于区分来自同一供应商的不同耗材类型。例如包含颜色信息。",
|
||||
"name": "耗材名称,用于区分来自同一制造商的不同耗材类型。例如在耗材名称中包含颜色信息。",
|
||||
"material": "例如PLA、ABS、PETG等。",
|
||||
"price": "一整卷耗材的价格。",
|
||||
"weight": "一整卷耗材的重量(净重)。不应包括料盘本身的重量,仅计算耗材的重量。通常在包装上注明。",
|
||||
"spool_weight": "空料盘的重量。使用它来计算耗材的重量。",
|
||||
"article_number": "例如EAN、UPC等。"
|
||||
"article_number": "例如EAN、UPC等。",
|
||||
"multi_color_direction": "耗材可以通过两种方式实现多种颜色:共挤出:例如双色耗材,具有稳定的多色组合。纵向颜色变化:例如渐变色耗材,颜色沿着料盘逐渐变化。"
|
||||
},
|
||||
"titles": {
|
||||
"create": "创建耗材",
|
||||
@@ -212,27 +267,37 @@
|
||||
"show_title": "[耗材 #{{id}}] {{name}}"
|
||||
},
|
||||
"form": {
|
||||
"filament_updated": "自您打开此页面以来,此耗材已被其他人/事物更新。保存将覆盖这些更改!"
|
||||
"filament_updated": "自您打开此页面以来,此耗材已被其他人/事物更新。保存将覆盖这些更改!",
|
||||
"import_external_description": "在列表中选择一种耗材以自动填充耗材创建表单中的详细信息。这将覆盖您在表单中输入的任何数据。<br><br>如果有必要,在您点击“确定”时将自动创建一个制造商对象。",
|
||||
"import_external": "从外部导入"
|
||||
},
|
||||
"buttons": {
|
||||
"add_spool": "添加料盘"
|
||||
}
|
||||
},
|
||||
"vendor": {
|
||||
"vendor": "供应商",
|
||||
"vendor": "制造商",
|
||||
"fields": {
|
||||
"id": "编号",
|
||||
"name": "名称",
|
||||
"registered": "登记时间",
|
||||
"comment": "备注"
|
||||
"id": "ID",
|
||||
"name": "厂商名称",
|
||||
"registered": "录入时间",
|
||||
"comment": "备注",
|
||||
"external_id": "外部ID",
|
||||
"empty_spool_weight": "空料盘重量"
|
||||
},
|
||||
"titles": {
|
||||
"create": "创建供应商",
|
||||
"clone": "克隆供应商",
|
||||
"edit": "编辑供应商",
|
||||
"list": "供应商列表",
|
||||
"show": "查看供应商",
|
||||
"show_title": "[供应商 #{{id}}] {{name}}"
|
||||
"create": "创建制造商",
|
||||
"clone": "克隆制造商",
|
||||
"edit": "编辑制造商",
|
||||
"list": "制造商列表",
|
||||
"show": "查看制造商",
|
||||
"show_title": "[制造商 #{{id}}] {{name}}"
|
||||
},
|
||||
"form": {
|
||||
"vendor_updated": "自您打开此页面以来,此供应商已被其他人/事物更新。保存将覆盖这些更改!"
|
||||
"vendor_updated": "自您打开此页面以来,此制造商已被其他人/事物更新。保存将覆盖这些更改!"
|
||||
},
|
||||
"fields_help": {
|
||||
"empty_spool_weight": "来自此制造商的空料盘重量。"
|
||||
}
|
||||
},
|
||||
"table": {
|
||||
@@ -256,30 +321,98 @@
|
||||
"clone": "#{{id}} 克隆料盘 | Spoolman"
|
||||
},
|
||||
"vendor": {
|
||||
"list": "供应商 | Spoolman",
|
||||
"show": "#{{id}} 查看供应商 | Spoolman",
|
||||
"edit": "#{{id}} 编辑供应商 | Spoolman",
|
||||
"create": "创建供应商 | Spoolman",
|
||||
"clone": "#{{id}} 克隆供应商 | Spoolman"
|
||||
"list": "制造商 | Spoolman",
|
||||
"show": "#{{id}} 查看制造商 | Spoolman",
|
||||
"edit": "#{{id}} 编辑制造商 | Spoolman",
|
||||
"create": "创建制造商 | Spoolman",
|
||||
"clone": "#{{id}} 克隆制造商 | Spoolman"
|
||||
},
|
||||
"home": {
|
||||
"list": ""
|
||||
"list": "主页 | Spoolman"
|
||||
},
|
||||
"help": {
|
||||
"list": ""
|
||||
"list": "帮助 | Spoolman"
|
||||
},
|
||||
"locations": {
|
||||
"list": "位置 | Spoolman"
|
||||
}
|
||||
},
|
||||
"kofi": "",
|
||||
"kofi": "在Ko-fi上给我打赏一点小费",
|
||||
"home": {
|
||||
"home": ""
|
||||
"home": "主页",
|
||||
"welcome": "欢迎使用您的 Spoolman 实例!",
|
||||
"description": "看来您尚未添加任何耗材。请参阅 <helpPageLink> 帮助页面 </helpPageLink> ,了解入门指南。"
|
||||
},
|
||||
"help": {
|
||||
"help": "",
|
||||
"help": "帮助",
|
||||
"resources": {
|
||||
"filament": "",
|
||||
"vendor": "",
|
||||
"spool": ""
|
||||
"filament": "耗材品种。它们具有名称、材料、颜色、直径等属性。",
|
||||
"vendor": "制造耗材的公司。",
|
||||
"spool": "特定耗材的单个物理卷轴。"
|
||||
},
|
||||
"description": ""
|
||||
"description": "<title>帮助</title><p>以下是一些入门提示。</p><p>Spoolman保存了3种不同类型的数据:</p><itemsHelp/><p>要向数据库添加新的料盘,请先创建一个 <filamentCreateLink>耗材</filamentCreateLink> 对象。完成后,继续为该特定耗材创建一个 <spoolCreateLink>料盘</spoolCreateLink> 对象。如果以后获取相同耗材的其他料盘,只需生成其他的料盘对象并重复使用同一个耗材对象。</p><p>同时,如果您希望跟踪该信息,还可以为制造耗材的公司生成一个 <vendorCreateLink>制造商</vendorCreateLink> 对象。</p><p>您可以选择将其他3D打印机服务链接到 Spoolman,例如 Moonraker,它可以自动监视耗材使用情况并为您更新料盘对象。请参阅 <readmeLink>Spoolman README</readmeLink> 获取有关如何设置的指导。</p>"
|
||||
},
|
||||
"settings": {
|
||||
"settings": "设置",
|
||||
"extra_fields": {
|
||||
"tab": "额外字段",
|
||||
"field_type": {
|
||||
"integer_range": "整数范围",
|
||||
"float": "浮点数",
|
||||
"float_range": "浮点数范围",
|
||||
"boolean": "布尔类型",
|
||||
"datetime": "日期时间",
|
||||
"text": "文本",
|
||||
"integer": "整数",
|
||||
"choice": "选项"
|
||||
},
|
||||
"delete_confirm_description": "这将删除该字段以及所有实体的关联数据。",
|
||||
"description": "<p>您可以在此处为不同的实体对象添加自定义扩展字段。</p><p>字段一旦添加,其键名 (Key) 和数据类型将无法修改;对于单选/多选字段,已有的选项将无法删除,也无法更改其多选状态。如果您删除某个字段,所有对应实体中存储的该字段数据都将被永久抹除。</p><p>键名 (Key) 是第三方程序读取/写入数据时使用的唯一标识。如果您需要将自定义字段与第三方程序集成,请务必设置正确的键名。默认值仅应用于新建的项目。</p><p>扩展字段可以显示在表格视图中并支持排序。单选框与布尔值字段还提供相应的筛选选项,且所有扩展字段类型均支持筛选空值。</p>",
|
||||
"params": {
|
||||
"name": "名称",
|
||||
"field_type": "类型",
|
||||
"order": "顺序",
|
||||
"default_value": "默认值",
|
||||
"multi_choice": "多选",
|
||||
"choices": "选择项",
|
||||
"key": "键",
|
||||
"unit": "单位"
|
||||
},
|
||||
"boolean_true": "是",
|
||||
"boolean_false": "否",
|
||||
"choices_missing_error": "您无法删除选择。以下选项丢失:{{choices}}",
|
||||
"non_unique_key_error": "键必须是唯一的。",
|
||||
"key_not_changed": "请将键改成其他的。",
|
||||
"delete_confirm": "删除字段 {{name}}?",
|
||||
"choices_reorder_hint": "拖动或使用方向键来重新排列此选项的顺序。"
|
||||
},
|
||||
"header": "系统设置",
|
||||
"general": {
|
||||
"tab": "常规设置",
|
||||
"currency": {
|
||||
"label": "货币单位"
|
||||
},
|
||||
"base_url": {
|
||||
"label": "基础URL",
|
||||
"tooltip": "生成功能(例如二维码)时使用的基础 URL。"
|
||||
},
|
||||
"round_prices": {
|
||||
"label": "取整",
|
||||
"tooltip": "将价格四舍五入到最接近的整数。"
|
||||
}
|
||||
}
|
||||
},
|
||||
"locations": {
|
||||
"no_locations_help": "此页面允许您在不同位置管理料盘,添加一些料盘即可开始!",
|
||||
"locations": "位置",
|
||||
"new_location": "新位置",
|
||||
"no_location": "没有位置"
|
||||
},
|
||||
"sponsor": "在 GitHub 上赞助项目",
|
||||
"theme": {
|
||||
"label": "主题",
|
||||
"system": "系统",
|
||||
"light": "明亮",
|
||||
"dark": "暗黑"
|
||||
}
|
||||
}
|
||||
@@ -1,22 +0,0 @@
|
||||
{
|
||||
"name": "Spoolman",
|
||||
"short_name": "Spoolman",
|
||||
"description": "Keep track of your inventory of 3D-printer filament spools.",
|
||||
"icons": [
|
||||
{
|
||||
"purpose": "maskable",
|
||||
"sizes": "512x512",
|
||||
"src": "icon512_maskable.png",
|
||||
"type": "image/png"
|
||||
},
|
||||
{
|
||||
"purpose": "any",
|
||||
"sizes": "512x512",
|
||||
"src": "icon512_rounded.png",
|
||||
"type": "image/png"
|
||||
}
|
||||
],
|
||||
"background_color": "#1F1F1F",
|
||||
"theme_color": "#DC7734",
|
||||
"display": "standalone"
|
||||
}
|
||||
|
After Width: | Height: | Size: 10 KiB |
|
After Width: | Height: | Size: 1.9 KiB |
|
After Width: | Height: | Size: 4.9 KiB |
|
After Width: | Height: | Size: 710 B |
@@ -0,0 +1,103 @@
|
||||
#!/usr/bin/env node
|
||||
|
||||
import { readdirSync, readFileSync, statSync } from "fs";
|
||||
import { dirname, join } from "path";
|
||||
import process from "process";
|
||||
import { fileURLToPath } from "url";
|
||||
|
||||
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;
|
||||
}
|
||||
|
||||
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, { throwIfNoEntry: false })?.isFile();
|
||||
});
|
||||
}
|
||||
|
||||
function getDeclaredLanguages() {
|
||||
const i18nContent = readFileSync(I18N_FILE, "utf8");
|
||||
const languageMatches = [...i18nContent.matchAll(/\["(.*?)"\]:/g)];
|
||||
return languageMatches.map((match) => match[1]);
|
||||
}
|
||||
|
||||
function main() {
|
||||
const reference = loadLocale(REFERENCE_LOCALE);
|
||||
const declaredLocales = new Set(getDeclaredLanguages());
|
||||
|
||||
// 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 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) {
|
||||
console.log(`["${locale}"]: {
|
||||
name: "",
|
||||
fullCode: "",
|
||||
djs: () => import("dayjs/locale/${locale.toLowerCase()}"),
|
||||
},`);
|
||||
}
|
||||
process.exit(1);
|
||||
}
|
||||
|
||||
console.log("✅ All sufficiently translated locales are declared in i18n.ts.");
|
||||
process.exit(0);
|
||||
}
|
||||
|
||||
main();
|
||||
@@ -5,20 +5,30 @@ import { ReactQueryDevtools } from "@tanstack/react-query-devtools";
|
||||
import { ErrorComponent } from "@refinedev/antd";
|
||||
import "@refinedev/antd/dist/reset.css";
|
||||
|
||||
import routerBindings, { DocumentTitleHandler, UnsavedChangesNotifier } from "@refinedev/react-router-v6";
|
||||
import dataProvider from "./components/dataProvider";
|
||||
import { useTranslation } from "react-i18next";
|
||||
import { BrowserRouter, Outlet, Route, Routes } from "react-router-dom";
|
||||
import { ColorModeContextProvider } from "./contexts/color-mode";
|
||||
import { FileOutlined, HighlightOutlined, HomeOutlined, QuestionOutlined, UserOutlined } from "@ant-design/icons";
|
||||
import { ConfigProvider } from "antd";
|
||||
import React from "react";
|
||||
import { Locale } from "antd/es/locale";
|
||||
import { languages } from "./i18n";
|
||||
import {
|
||||
FileOutlined,
|
||||
HighlightOutlined,
|
||||
HomeOutlined,
|
||||
QuestionOutlined,
|
||||
TableOutlined,
|
||||
ToolOutlined,
|
||||
UserOutlined,
|
||||
} from "@ant-design/icons";
|
||||
import loadable from "@loadable/component";
|
||||
import SpoolmanNotificationProvider from "./components/notificationProvider";
|
||||
import routerBindings, { DocumentTitleHandler, UnsavedChangesNotifier } from "@refinedev/react-router";
|
||||
import { ConfigProvider } from "antd";
|
||||
import { Locale } from "antd/es/locale";
|
||||
import { useEffect, useState } from "react";
|
||||
import { useTranslation } from "react-i18next";
|
||||
import { BrowserRouter, Outlet, Route, Routes } from "react-router";
|
||||
import dataProvider from "./components/dataProvider";
|
||||
import { Favicon } from "./components/favicon";
|
||||
import { SpoolmanLayout } from "./components/layout";
|
||||
import liveProvider from "./components/liveProvider";
|
||||
import SpoolmanNotificationProvider from "./components/notificationProvider";
|
||||
import { ColorModeContextProvider } from "./contexts/color-mode";
|
||||
import { languages } from "./i18n";
|
||||
import { getAPIURL, getBasePath } from "./utils/url";
|
||||
|
||||
interface ResourcePageProps {
|
||||
resource: "spools" | "filaments" | "vendors";
|
||||
@@ -31,7 +41,7 @@ const LoadableResourcePage = loadable(
|
||||
{
|
||||
fallback: <div>Page is Loading...</div>,
|
||||
cacheKey: (props: ResourcePageProps) => `${props.resource}-${props.page}-${props.mode ?? ""}`,
|
||||
}
|
||||
},
|
||||
);
|
||||
|
||||
interface LoadablePageProps {
|
||||
@@ -53,8 +63,8 @@ function App() {
|
||||
};
|
||||
|
||||
// Fetch the antd locale using dynamic imports
|
||||
const [antdLocale, setAntdLocale] = React.useState<Locale | undefined>();
|
||||
React.useEffect(() => {
|
||||
const [antdLocale, setAntdLocale] = useState<Locale | undefined>();
|
||||
useEffect(() => {
|
||||
const fetchLocale = async () => {
|
||||
const locale = await import(
|
||||
`./../node_modules/antd/es/locale/${languages[i18n.language].fullCode.replace("-", "_")}.js`
|
||||
@@ -77,23 +87,16 @@ function App() {
|
||||
}
|
||||
|
||||
return (
|
||||
<BrowserRouter>
|
||||
<BrowserRouter basename={getBasePath() + "/"}>
|
||||
<RefineKbarProvider>
|
||||
<ColorModeContextProvider>
|
||||
<ConfigProvider
|
||||
locale={antdLocale}
|
||||
theme={{
|
||||
token: {
|
||||
colorPrimary: "#dc7734",
|
||||
},
|
||||
}}
|
||||
>
|
||||
<ConfigProvider locale={antdLocale}>
|
||||
<Refine
|
||||
dataProvider={dataProvider(import.meta.env.VITE_APIURL)}
|
||||
dataProvider={dataProvider(getAPIURL())}
|
||||
notificationProvider={SpoolmanNotificationProvider}
|
||||
i18nProvider={i18nProvider}
|
||||
routerProvider={routerBindings}
|
||||
liveProvider={liveProvider(import.meta.env.VITE_APIURL)}
|
||||
liveProvider={liveProvider(getAPIURL())}
|
||||
resources={[
|
||||
{
|
||||
name: "home",
|
||||
@@ -139,6 +142,22 @@ function App() {
|
||||
icon: <UserOutlined />,
|
||||
},
|
||||
},
|
||||
{
|
||||
name: "locations",
|
||||
list: "/locations",
|
||||
meta: {
|
||||
canDelete: false,
|
||||
icon: <TableOutlined />,
|
||||
},
|
||||
},
|
||||
{
|
||||
name: "settings",
|
||||
list: "/settings",
|
||||
meta: {
|
||||
canDelete: false,
|
||||
icon: <ToolOutlined />,
|
||||
},
|
||||
},
|
||||
{
|
||||
name: "help",
|
||||
list: "/help",
|
||||
@@ -175,6 +194,7 @@ function App() {
|
||||
/>
|
||||
<Route path="edit/:id" element={<LoadableResourcePage resource="spools" page="edit" />} />
|
||||
<Route path="show/:id" element={<LoadableResourcePage resource="spools" page="show" />} />
|
||||
<Route path="print" element={<LoadablePage name="printing" />} />
|
||||
</Route>
|
||||
<Route path="/filament">
|
||||
<Route index element={<LoadableResourcePage resource="filaments" page="list" />} />
|
||||
@@ -202,7 +222,9 @@ function App() {
|
||||
<Route path="edit/:id" element={<LoadableResourcePage resource="vendors" page="edit" />} />
|
||||
<Route path="show/:id" element={<LoadableResourcePage resource="vendors" page="show" />} />
|
||||
</Route>
|
||||
<Route path="/settings/*" element={<LoadablePage name="settings" />} />
|
||||
<Route path="/help" element={<LoadablePage name="help" />} />
|
||||
<Route path="/locations" element={<LoadablePage name="locations" />} />
|
||||
<Route path="*" element={<ErrorComponent />} />
|
||||
</Route>
|
||||
</Routes>
|
||||
@@ -211,6 +233,7 @@ function App() {
|
||||
<UnsavedChangesNotifier />
|
||||
<DocumentTitleHandler />
|
||||
<ReactQueryDevtools />
|
||||
<Favicon url={getBasePath() + "/favicon.svg"} />
|
||||
</Refine>
|
||||
</ConfigProvider>
|
||||
</ColorModeContextProvider>
|
||||
|
||||
@@ -1,18 +1,18 @@
|
||||
import { Button, Col, Dropdown, Row, Space, Spin } from "antd";
|
||||
import { ColumnFilterItem, ColumnType } from "antd/es/table/interface";
|
||||
import { getFiltersForField, typeFilters } from "../utils/filtering";
|
||||
import { TableState } from "../utils/saveload";
|
||||
import { getSortOrderForField, typeSorters } from "../utils/sorting";
|
||||
import { NumberFieldUnit } from "./numberField";
|
||||
import { DateField, TextField } from "@refinedev/antd";
|
||||
import { UseQueryResult } from "@tanstack/react-query";
|
||||
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 { DateField, TextField } from "@refinedev/antd";
|
||||
import Icon from "@ant-design/icons";
|
||||
import SpoolIcon from "../icon_spool.svg?react";
|
||||
import { useTranslate } from "@refinedev/core";
|
||||
import { AlignType } from "rc-table/lib/interface";
|
||||
import { Link } from "react-router";
|
||||
import { getFiltersForField, typeFilters } from "../utils/filtering";
|
||||
import { enrichText } from "../utils/parsing";
|
||||
import { UseQueryResult } from "@tanstack/react-query";
|
||||
import { Link, useNavigate } from "react-router-dom";
|
||||
import { Field, FieldType } from "../utils/queryFields";
|
||||
import { TableState } from "../utils/saveload";
|
||||
import { getSortOrderForField, typeSorters } from "../utils/sorting";
|
||||
import { NumberFieldUnit, NumberFieldUnitRange } from "./numberField";
|
||||
import SpoolIcon from "./spoolIcon";
|
||||
|
||||
dayjs.extend(utc);
|
||||
|
||||
@@ -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;
|
||||
}
|
||||
@@ -39,14 +189,21 @@ export interface Action {
|
||||
}
|
||||
|
||||
interface BaseColumnProps<Obj extends Entity> {
|
||||
id: keyof Obj & string;
|
||||
dataId?: keyof Obj & string;
|
||||
id: string | string[];
|
||||
dataId?: (keyof Obj & string) | string; // Allow string values for custom fields
|
||||
i18ncat?: string;
|
||||
i18nkey?: string;
|
||||
title?: string;
|
||||
align?: AlignType;
|
||||
sorter?: boolean;
|
||||
t: (key: string) => string;
|
||||
navigate: (link: string) => void;
|
||||
dataSource: Obj[];
|
||||
tableState: TableState;
|
||||
width?: number;
|
||||
actions?: (record: Obj) => Action[];
|
||||
transform?: (value: unknown) => unknown;
|
||||
render?: (rawValue: string | undefined, record: Obj) => React.ReactNode;
|
||||
}
|
||||
|
||||
interface FilteredColumnProps {
|
||||
@@ -55,6 +212,7 @@ interface FilteredColumnProps {
|
||||
allowMultipleFilters?: boolean;
|
||||
onFilterDropdownOpen?: () => void;
|
||||
loadingFilters?: boolean;
|
||||
filterDropdown?: (props: FilterDropdownProps) => React.ReactNode;
|
||||
}
|
||||
|
||||
interface CustomColumnProps<Obj> {
|
||||
@@ -62,32 +220,39 @@ interface CustomColumnProps<Obj> {
|
||||
render?: (value: any, record: Obj, index: number) => React.ReactNode;
|
||||
onCell?: (
|
||||
data: Obj,
|
||||
index?: number
|
||||
index?: number,
|
||||
// eslint-disable-next-line @typescript-eslint/no-explicit-any
|
||||
) => React.HTMLAttributes<any> | React.TdHTMLAttributes<any>;
|
||||
}
|
||||
|
||||
function Column<Obj extends Entity>(
|
||||
props: BaseColumnProps<Obj> & FilteredColumnProps & CustomColumnProps<Obj>
|
||||
props: BaseColumnProps<Obj> & FilteredColumnProps & CustomColumnProps<Obj>,
|
||||
): ColumnType<Obj> | undefined {
|
||||
const t = useTranslate();
|
||||
const navigate = useNavigate();
|
||||
const t = props.t;
|
||||
const navigate = props.navigate;
|
||||
|
||||
// Hide if not in showColumns
|
||||
if (props.tableState.showColumns && !props.tableState.showColumns.includes(props.id)) {
|
||||
const id = Array.isArray(props.id) ? props.id.join(".") : props.id;
|
||||
if (props.tableState.showColumns && !props.tableState.showColumns.includes(id)) {
|
||||
return undefined;
|
||||
}
|
||||
|
||||
const columnProps: ColumnType<Obj> = {
|
||||
dataIndex: props.id,
|
||||
title: t(props.i18nkey ?? `${props.i18ncat}.fields.${props.id}`),
|
||||
sorter: true,
|
||||
sortOrder: getSortOrderForField(typeSorters<Obj>(props.tableState.sorters), props.dataId ?? props.id),
|
||||
align: props.align,
|
||||
title: props.title ?? t(props.i18nkey ?? `${props.i18ncat}.fields.${props.id}`),
|
||||
filterMultiple: props.allowMultipleFilters ?? true,
|
||||
width: props.width ?? undefined,
|
||||
onCell: props.onCell ?? undefined,
|
||||
};
|
||||
|
||||
// Sorting
|
||||
if (props.sorter) {
|
||||
columnProps.sorter = true;
|
||||
const sortField = props.dataId ?? (Array.isArray(props.id) ? props.id.join(".") : props.id);
|
||||
columnProps.sortOrder = getSortOrderForField(typeSorters<Obj>(props.tableState.sorters), sortField);
|
||||
}
|
||||
|
||||
// Filter
|
||||
if (props.filters && props.filteredValue) {
|
||||
columnProps.filters = props.filters;
|
||||
@@ -95,18 +260,32 @@ function Column<Obj extends Entity>(
|
||||
if (props.loadingFilters) {
|
||||
columnProps.filterDropdown = <FilterDropdownLoading />;
|
||||
}
|
||||
columnProps.onFilterDropdownOpenChange = (open) => {
|
||||
if (open && props.onFilterDropdownOpen) {
|
||||
props.onFilterDropdownOpen();
|
||||
}
|
||||
columnProps.filterDropdownProps = {
|
||||
onOpenChange: (open) => {
|
||||
if (open && props.onFilterDropdownOpen) {
|
||||
props.onFilterDropdownOpen();
|
||||
}
|
||||
},
|
||||
};
|
||||
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
|
||||
const render = props.render ?? ((value) => <>{value}</>);
|
||||
const render =
|
||||
props.render ??
|
||||
((rawValue) => {
|
||||
const value = props.transform ? props.transform(rawValue) : rawValue;
|
||||
return <>{value}</>;
|
||||
});
|
||||
columnProps.render = (value, record, index) => {
|
||||
if (!props.actions) {
|
||||
return render(value, record, index);
|
||||
@@ -144,20 +323,26 @@ function Column<Obj extends Entity>(
|
||||
}
|
||||
|
||||
export function SortedColumn<Obj extends Entity>(props: BaseColumnProps<Obj>) {
|
||||
return Column(props);
|
||||
}
|
||||
|
||||
export function RichColumn<Obj extends Entity>(props: BaseColumnProps<Obj>) {
|
||||
return Column({
|
||||
...props,
|
||||
render: (value: string | undefined) => {
|
||||
sorter: true,
|
||||
});
|
||||
}
|
||||
|
||||
export function RichColumn<Obj extends Entity>(
|
||||
props: Omit<BaseColumnProps<Obj>, "transform"> & FilteredColumnProps & { transform?: (value: unknown) => string },
|
||||
) {
|
||||
return Column({
|
||||
...props,
|
||||
render: (rawValue: string | undefined) => {
|
||||
const value = props.transform ? props.transform(rawValue) : rawValue;
|
||||
return enrichText(value);
|
||||
},
|
||||
});
|
||||
}
|
||||
|
||||
interface FilteredQueryColumnProps<Obj extends Entity> extends BaseColumnProps<Obj> {
|
||||
filterValueQuery: UseQueryResult<string[] | ColumnFilterItem[]>;
|
||||
filterValueQuery: UseQueryResult<string[] | ColumnFilterItem[], unknown>;
|
||||
allowMultipleFilters?: boolean;
|
||||
}
|
||||
|
||||
@@ -170,7 +355,7 @@ export function FilteredQueryColumn<Obj extends Entity>(props: FilteredQueryColu
|
||||
if (typeof item === "string") {
|
||||
return {
|
||||
text: item,
|
||||
value: item,
|
||||
value: '"' + item + '"',
|
||||
};
|
||||
}
|
||||
return item;
|
||||
@@ -178,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);
|
||||
const filterField = props.dataId ?? (Array.isArray(props.id) ? props.id.join(".") : props.id);
|
||||
const filteredValue = getFiltersForField(typedFilters, filterField);
|
||||
|
||||
const onFilterDropdownOpen = () => {
|
||||
query.refetch();
|
||||
@@ -191,16 +377,19 @@ 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;
|
||||
decimals?: number;
|
||||
maxDecimals?: number;
|
||||
minDecimals?: number;
|
||||
defaultText?: string;
|
||||
}
|
||||
|
||||
export function NumberColumn<Obj extends Entity>(props: NumberColumnProps<Obj>) {
|
||||
return Column({
|
||||
...props,
|
||||
render: (value) => {
|
||||
align: "right",
|
||||
render: (rawValue) => {
|
||||
const value = props.transform ? props.transform(rawValue) : rawValue;
|
||||
if (value === null || value === undefined) {
|
||||
return <TextField value={props.defaultText ?? ""} />;
|
||||
}
|
||||
@@ -209,8 +398,8 @@ export function NumberColumn<Obj extends Entity>(props: NumberColumnProps<Obj>)
|
||||
value={value}
|
||||
unit={props.unit}
|
||||
options={{
|
||||
maximumFractionDigits: props.decimals ?? 0,
|
||||
minimumFractionDigits: props.decimals ?? 0,
|
||||
maximumFractionDigits: props.maxDecimals ?? 0,
|
||||
minimumFractionDigits: props.minDecimals ?? props.maxDecimals ?? 0,
|
||||
}}
|
||||
/>
|
||||
);
|
||||
@@ -218,27 +407,29 @@ 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: (value) => {
|
||||
render: (rawValue) => {
|
||||
const value = props.transform ? props.transform(rawValue) : rawValue;
|
||||
return (
|
||||
<DateField
|
||||
hidden={!value}
|
||||
value={dayjs.utc(value).local()}
|
||||
title={dayjs.utc(value).local().format()}
|
||||
format="YYYY-MM-DD HH:mm:ss"
|
||||
format="YYYY-MM-DD HH:mm"
|
||||
/>
|
||||
);
|
||||
},
|
||||
});
|
||||
}
|
||||
|
||||
export function ActionsColumn<Obj extends Entity>(actionsFn: (record: Obj) => Action[]): ColumnType<Obj> | undefined {
|
||||
const t = useTranslate();
|
||||
|
||||
export function ActionsColumn<Obj extends Entity>(
|
||||
title: string,
|
||||
actionsFn: (record: Obj) => Action[],
|
||||
): ColumnType<Obj> | undefined {
|
||||
return {
|
||||
title: t("table.actions"),
|
||||
title,
|
||||
responsive: ["lg"],
|
||||
render: (_, record) => {
|
||||
const buttons = actionsFn(record).map((action) => {
|
||||
@@ -267,7 +458,7 @@ export function ActionsColumn<Obj extends Entity>(actionsFn: (record: Obj) => Ac
|
||||
}
|
||||
|
||||
interface SpoolIconColumnProps<Obj extends Entity> extends FilteredQueryColumnProps<Obj> {
|
||||
color: (record: Obj) => string | undefined;
|
||||
color: (record: Obj) => string | { colors: string[]; vertical: boolean } | undefined;
|
||||
}
|
||||
|
||||
export function SpoolIconColumn<Obj extends Entity>(props: SpoolIconColumnProps<Obj>) {
|
||||
@@ -279,7 +470,7 @@ export function SpoolIconColumn<Obj extends Entity>(props: SpoolIconColumnProps<
|
||||
if (typeof item === "string") {
|
||||
return {
|
||||
text: item,
|
||||
value: item,
|
||||
value: '"' + item + '"',
|
||||
};
|
||||
}
|
||||
return item;
|
||||
@@ -291,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);
|
||||
const filterField = props.dataId ?? (Array.isArray(props.id) ? props.id.join(".") : props.id);
|
||||
const filteredValue = getFiltersForField(typedFilters, filterField);
|
||||
|
||||
const onFilterDropdownOpen = () => {
|
||||
query.refetch();
|
||||
@@ -312,20 +504,14 @@ export function SpoolIconColumn<Obj extends Entity>(props: SpoolIconColumnProps<
|
||||
},
|
||||
};
|
||||
},
|
||||
render: (value, record: Obj) => {
|
||||
const colorStr = props.color(record);
|
||||
render: (rawValue, record: Obj) => {
|
||||
const value = props.transform ? props.transform(rawValue) : rawValue;
|
||||
const colorObj = props.color(record);
|
||||
return (
|
||||
<Row wrap={false} justify="space-around" align="middle">
|
||||
{colorStr && (
|
||||
{colorObj && (
|
||||
<Col flex="none">
|
||||
<Icon
|
||||
component={SpoolIcon}
|
||||
style={{
|
||||
color: "#" + colorStr,
|
||||
fontSize: 42,
|
||||
marginRight: 0,
|
||||
}}
|
||||
/>
|
||||
<SpoolIcon color={colorObj} />
|
||||
</Col>
|
||||
)}
|
||||
<Col flex="auto">{value}</Col>
|
||||
@@ -334,3 +520,172 @@ export function SpoolIconColumn<Obj extends Entity>(props: SpoolIconColumnProps<
|
||||
},
|
||||
});
|
||||
}
|
||||
|
||||
export function NumberRangeColumn<Obj extends Entity>(props: NumberColumnProps<Obj>) {
|
||||
return Column({
|
||||
...props,
|
||||
render: (rawValue) => {
|
||||
const value = props.transform ? props.transform(rawValue) : rawValue;
|
||||
if (value === null || value === undefined) {
|
||||
return <TextField value={props.defaultText ?? ""} />;
|
||||
}
|
||||
if (!Array.isArray(value) || value.length !== 2) {
|
||||
return <TextField value={props.defaultText ?? ""} />;
|
||||
}
|
||||
|
||||
return (
|
||||
<NumberFieldUnitRange
|
||||
value={value}
|
||||
unit={props.unit}
|
||||
options={{
|
||||
maximumFractionDigits: props.maxDecimals ?? 0,
|
||||
minimumFractionDigits: props.minDecimals ?? props.maxDecimals ?? 0,
|
||||
}}
|
||||
/>
|
||||
);
|
||||
},
|
||||
});
|
||||
}
|
||||
|
||||
// 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: true,
|
||||
dataId: fieldId,
|
||||
transform: (value: unknown) => {
|
||||
if (value === null || value === undefined) {
|
||||
return undefined;
|
||||
}
|
||||
return JSON.parse(value as string);
|
||||
},
|
||||
};
|
||||
|
||||
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,
|
||||
});
|
||||
} 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,
|
||||
});
|
||||
} 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;
|
||||
if (value === undefined || value === null) {
|
||||
text = "";
|
||||
} else if (value) {
|
||||
text = props.t("yes");
|
||||
} else {
|
||||
text = props.t("no");
|
||||
}
|
||||
return <TextField value={text} />;
|
||||
},
|
||||
});
|
||||
} 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} />;
|
||||
},
|
||||
});
|
||||
} 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(", ")} />;
|
||||
},
|
||||
});
|
||||
} else {
|
||||
return Column({
|
||||
...commonProps,
|
||||
render: (rawValue) => {
|
||||
const value = commonProps.transform ? commonProps.transform(rawValue) : rawValue;
|
||||
return <TextField value={value} />;
|
||||
},
|
||||
});
|
||||
}
|
||||
}
|
||||
@@ -1,14 +1,16 @@
|
||||
import { AxiosInstance } from "axios";
|
||||
import { stringify } from "query-string";
|
||||
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";
|
||||
|
||||
const dataProvider = (
|
||||
apiUrl: string,
|
||||
httpClient: AxiosInstance = axiosInstance
|
||||
httpClient: AxiosInstance = axiosInstance,
|
||||
): Omit<Required<DataProvider>, "createMany" | "updateMany" | "deleteMany"> => ({
|
||||
getList: async ({ resource, meta, pagination, sorters, filters }) => {
|
||||
const url = `${apiUrl}/${resource}`;
|
||||
@@ -19,26 +21,36 @@ const dataProvider = (
|
||||
|
||||
if (pagination && pagination.mode == "server") {
|
||||
const pageSize = pagination.pageSize ?? 10;
|
||||
const offset = ((pagination.current ?? 1) - 1) * pageSize;
|
||||
const offset = ((pagination.currentPage ?? 1) - 1) * pageSize;
|
||||
queryParams["limit"] = pageSize;
|
||||
queryParams["offset"] = offset;
|
||||
}
|
||||
|
||||
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}`, {
|
||||
@@ -61,8 +81,6 @@ const dataProvider = (
|
||||
params: queryParams,
|
||||
});
|
||||
|
||||
// console.log(url, requestMethod, queryParams, data, headers)
|
||||
|
||||
return {
|
||||
data,
|
||||
total: parseInt(headers["x-total-count"]) ?? 100,
|
||||
|
||||
@@ -0,0 +1,33 @@
|
||||
import { DatePicker } from "antd";
|
||||
import dayjs from "dayjs";
|
||||
import advancedFormat from "dayjs/plugin/advancedFormat";
|
||||
import timezone from "dayjs/plugin/timezone";
|
||||
import utc from "dayjs/plugin/utc";
|
||||
|
||||
dayjs.extend(utc);
|
||||
dayjs.extend(timezone);
|
||||
dayjs.extend(advancedFormat);
|
||||
|
||||
// Localized date time format with timezone
|
||||
const dateTimeFormat = "YYYY-MM-DD HH:mm:ss";
|
||||
|
||||
export function DateTimePicker<T extends string | dayjs.Dayjs>(props: { value?: T; onChange?: (value?: T) => void }) {
|
||||
return (
|
||||
<DatePicker
|
||||
showTime={{ use12Hours: false }}
|
||||
format={dateTimeFormat}
|
||||
value={props.value ? dayjs(props.value) : undefined}
|
||||
onChange={(value) => {
|
||||
if (value) {
|
||||
if (typeof props.value === "string") {
|
||||
props.onChange?.(value.toISOString() as T);
|
||||
} else {
|
||||
props.onChange?.(value as T);
|
||||
}
|
||||
} else {
|
||||
props.onChange?.(undefined);
|
||||
}
|
||||
}}
|
||||
/>
|
||||
);
|
||||
}
|
||||
@@ -0,0 +1,215 @@
|
||||
import { DateField, TextField } from "@refinedev/antd";
|
||||
import { Checkbox, Form, Input, InputNumber, Select, Typography } from "antd";
|
||||
import { FormItemProps, Rule } from "antd/es/form";
|
||||
import dayjs from "dayjs";
|
||||
import utc from "dayjs/plugin/utc";
|
||||
import { enrichText } from "../utils/parsing";
|
||||
import { Field, FieldType } from "../utils/queryFields";
|
||||
import { DateTimePicker } from "./dateTimePicker";
|
||||
import { InputNumberRange } from "./inputNumberRange";
|
||||
import { NumberFieldUnit, NumberFieldUnitRange } from "./numberField";
|
||||
|
||||
dayjs.extend(utc);
|
||||
|
||||
const { Title } = Typography;
|
||||
|
||||
/**
|
||||
* Title and value to display an extra field. Used for the show pages.
|
||||
* @param props
|
||||
* @returns
|
||||
*/
|
||||
export function ExtraFieldDisplay(props: { field: Field; value: string | undefined }) {
|
||||
const { field, value } = props;
|
||||
|
||||
let item;
|
||||
if (value !== undefined) {
|
||||
const parsedValue = JSON.parse(value);
|
||||
|
||||
if (field.field_type === FieldType.integer) {
|
||||
item = (
|
||||
<NumberFieldUnit
|
||||
value={parsedValue ?? ""}
|
||||
unit={field.unit ?? ""}
|
||||
options={{
|
||||
maximumFractionDigits: 0,
|
||||
minimumFractionDigits: 0,
|
||||
}}
|
||||
/>
|
||||
);
|
||||
} else if (field.field_type === FieldType.float) {
|
||||
item = (
|
||||
<NumberFieldUnit
|
||||
value={parsedValue ?? ""}
|
||||
unit={field.unit ?? ""}
|
||||
options={{
|
||||
maximumFractionDigits: 3,
|
||||
minimumFractionDigits: 0,
|
||||
}}
|
||||
/>
|
||||
);
|
||||
} else if (field.field_type === FieldType.integer_range || field.field_type === FieldType.float_range) {
|
||||
if (!Array.isArray(parsedValue) || parsedValue.length !== 2) {
|
||||
return <TextField value={parsedValue} />;
|
||||
}
|
||||
item = (
|
||||
<NumberFieldUnitRange
|
||||
value={parsedValue}
|
||||
unit={field.unit ?? ""}
|
||||
options={{
|
||||
maximumFractionDigits: field.field_type === FieldType.float_range ? 3 : 0,
|
||||
minimumFractionDigits: 0,
|
||||
}}
|
||||
/>
|
||||
);
|
||||
} else if (field.field_type === FieldType.text) {
|
||||
item = <TextField value={enrichText(parsedValue)} />;
|
||||
} else if (field.field_type === FieldType.datetime) {
|
||||
item = (
|
||||
<DateField
|
||||
value={dayjs.utc(parsedValue).local()}
|
||||
title={dayjs.utc(parsedValue).local().format()}
|
||||
format="YYYY-MM-DD HH:mm:ss"
|
||||
/>
|
||||
);
|
||||
} else if (field.field_type === FieldType.boolean) {
|
||||
item = <TextField value={parsedValue ? "Yes" : "No"} />;
|
||||
} else if (field.field_type === FieldType.choice && !field.multi_choice) {
|
||||
item = <TextField value={parsedValue} />;
|
||||
} else if (field.field_type === FieldType.choice && field.multi_choice) {
|
||||
item = <TextField value={parsedValue.join(", ")} />;
|
||||
} else {
|
||||
throw new Error(`Unknown field type: ${field.field_type}`);
|
||||
}
|
||||
} else {
|
||||
item = <></>;
|
||||
}
|
||||
|
||||
return (
|
||||
<>
|
||||
<Title level={5}>{field.name}</Title>
|
||||
{item}
|
||||
</>
|
||||
);
|
||||
}
|
||||
|
||||
/**
|
||||
* Form item for an extra field. Used for the edit pages.
|
||||
* @param props
|
||||
* @returns
|
||||
*/
|
||||
export function ExtraFieldFormItem(props: { field: Field; setDefaultValue?: boolean }) {
|
||||
const { field } = props;
|
||||
|
||||
let inputNode;
|
||||
const rules: Rule[] = [
|
||||
{
|
||||
required: false,
|
||||
},
|
||||
];
|
||||
const formItemProps: FormItemProps = {};
|
||||
if (field.field_type === FieldType.integer) {
|
||||
inputNode = <InputNumber addonAfter={field.unit} precision={0} />;
|
||||
rules.push({
|
||||
type: "integer",
|
||||
});
|
||||
} else if (field.field_type === FieldType.float) {
|
||||
inputNode = <InputNumber addonAfter={field.unit} precision={3} />;
|
||||
rules.push({
|
||||
type: "number",
|
||||
});
|
||||
} else if (field.field_type === FieldType.integer_range) {
|
||||
inputNode = <InputNumberRange unit={field.unit} precision={0} />;
|
||||
} else if (field.field_type === FieldType.float_range) {
|
||||
inputNode = <InputNumberRange unit={field.unit} precision={3} />;
|
||||
} else if (field.field_type === FieldType.text) {
|
||||
inputNode = <Input />;
|
||||
rules.push({
|
||||
type: "string",
|
||||
});
|
||||
} else if (field.field_type === FieldType.datetime) {
|
||||
inputNode = <DateTimePicker />;
|
||||
} else if (field.field_type === FieldType.boolean) {
|
||||
inputNode = <Checkbox />;
|
||||
formItemProps.valuePropName = "checked";
|
||||
rules.push({
|
||||
type: "boolean",
|
||||
});
|
||||
} else if (field.field_type === FieldType.choice) {
|
||||
inputNode = (
|
||||
<Select
|
||||
mode={field.multi_choice ? "multiple" : undefined}
|
||||
options={field.choices?.map((choice) => ({ label: choice, value: choice }))}
|
||||
/>
|
||||
);
|
||||
rules.push({
|
||||
type: field.multi_choice ? "array" : "string",
|
||||
});
|
||||
} else {
|
||||
throw new Error(`Unknown field type: ${field.field_type}`);
|
||||
}
|
||||
|
||||
if (props.setDefaultValue) {
|
||||
formItemProps.initialValue = field.default_value;
|
||||
}
|
||||
|
||||
return (
|
||||
<Form.Item label={field.name} name={["extra", field.key]} rules={rules} {...formItemProps}>
|
||||
{inputNode}
|
||||
</Form.Item>
|
||||
);
|
||||
}
|
||||
|
||||
/**
|
||||
* Convert the string-based value extra key-values of an entity to their JSON-parsed values.
|
||||
* @param obj
|
||||
* @returns
|
||||
*/
|
||||
export function ParsedExtras<T extends { extra?: { [key: string]: string } }>(
|
||||
obj: T,
|
||||
): Omit<T, "extra"> & { extra?: { [key: string]: unknown } } {
|
||||
if (obj.extra) {
|
||||
const newExtra: { [key: string]: unknown } = {};
|
||||
Object.entries(obj.extra).forEach(([key, value]) => {
|
||||
try {
|
||||
newExtra[key] = JSON.parse(value);
|
||||
} catch {
|
||||
newExtra[key] = value;
|
||||
}
|
||||
});
|
||||
return {
|
||||
...obj,
|
||||
extra: newExtra,
|
||||
};
|
||||
} else {
|
||||
return obj;
|
||||
}
|
||||
}
|
||||
|
||||
/**
|
||||
* 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 | null } } {
|
||||
if (obj.extra) {
|
||||
const newExtra: { [key: string]: string | null } = {};
|
||||
Object.entries(obj.extra).forEach(([key, value]) => {
|
||||
newExtra[key] = value === undefined ? null : JSON.stringify(value);
|
||||
});
|
||||
return {
|
||||
...obj,
|
||||
extra: newExtra,
|
||||
};
|
||||
} else {
|
||||
return {
|
||||
...obj,
|
||||
extra: undefined,
|
||||
};
|
||||
}
|
||||
}
|
||||
@@ -0,0 +1,20 @@
|
||||
import { useEffect } from "react";
|
||||
|
||||
/**
|
||||
* Renders a favicon element in the head of the HTML document with the specified URL.
|
||||
*
|
||||
* @param {string} props.url - The URL of the favicon image.
|
||||
* @return {JSX.Element} - An empty JSX element.
|
||||
*/
|
||||
export function Favicon(props: { url: string }) {
|
||||
useEffect(() => {
|
||||
let link = document.querySelector("link[rel~='icon']") as HTMLLinkElement;
|
||||
if (!link) {
|
||||
link = document.createElement("link") as HTMLLinkElement;
|
||||
link.rel = "icon";
|
||||
document.getElementsByTagName("head")[0].appendChild(link);
|
||||
}
|
||||
link.href = props.url;
|
||||
}, [props.url]);
|
||||
return <></>;
|
||||
}
|
||||
@@ -0,0 +1,72 @@
|
||||
import { useTranslate } from "@refinedev/core";
|
||||
import { Form, Modal, Select } from "antd";
|
||||
import { Trans } from "react-i18next";
|
||||
import { formatFilamentLabel } from "../pages/spools/functions";
|
||||
import { searchMatches } from "../utils/filtering";
|
||||
import { ExternalFilament, useGetExternalDBFilaments } from "../utils/queryExternalDB";
|
||||
|
||||
export function FilamentImportModal(props: {
|
||||
isOpen: boolean;
|
||||
onImport: (filament: ExternalFilament) => void;
|
||||
onClose: () => void;
|
||||
}) {
|
||||
const [form] = Form.useForm();
|
||||
const t = useTranslate();
|
||||
|
||||
const externalFilaments = useGetExternalDBFilaments();
|
||||
const filamentOptions =
|
||||
externalFilaments.data?.map((item) => {
|
||||
return {
|
||||
label: formatFilamentLabel(
|
||||
item.name,
|
||||
item.diameter,
|
||||
item.manufacturer,
|
||||
item.material,
|
||||
item.weight,
|
||||
item.spool_type,
|
||||
),
|
||||
value: item.id,
|
||||
item: item,
|
||||
};
|
||||
}) ?? [];
|
||||
filamentOptions.sort((a, b) => a.label.localeCompare(b.label, undefined, { sensitivity: "base" }));
|
||||
|
||||
return (
|
||||
<Modal
|
||||
title={t("filament.form.import_external")}
|
||||
open={props.isOpen}
|
||||
onOk={() => form.submit()}
|
||||
onCancel={() => props.onClose()}
|
||||
>
|
||||
<Form
|
||||
layout="vertical"
|
||||
form={form}
|
||||
onFinish={(values) => {
|
||||
const filament = filamentOptions.find((item) => item.value === values.filament)?.item;
|
||||
if (!filament) {
|
||||
throw new Error("Filament not found");
|
||||
}
|
||||
props.onImport(filament);
|
||||
props.onClose();
|
||||
form.resetFields();
|
||||
}}
|
||||
>
|
||||
<p>
|
||||
<Trans
|
||||
i18nKey={"filament.form.import_external_description"}
|
||||
components={{
|
||||
br: <br />,
|
||||
}}
|
||||
/>
|
||||
</p>
|
||||
<Form.Item name="filament" rules={[{ required: true }]}>
|
||||
<Select
|
||||
options={filamentOptions}
|
||||
showSearch
|
||||
filterOption={(input, option) => typeof option?.label === "string" && searchMatches(input, option?.label)}
|
||||
/>
|
||||
</Form.Item>
|
||||
</Form>
|
||||
</Modal>
|
||||
);
|
||||
}
|
||||
@@ -1,28 +1,33 @@
|
||||
import { DownOutlined } from "@ant-design/icons";
|
||||
import type { RefineThemedLayoutV2HeaderProps } from "@refinedev/antd";
|
||||
import { useGetLocale, useSetLocale } from "@refinedev/core";
|
||||
import { Button, Dropdown, Layout as AntdLayout, MenuProps, Space, Switch, theme } from "antd";
|
||||
import { DesktopOutlined, DownOutlined, MoonOutlined, SunOutlined } from "@ant-design/icons";
|
||||
import type { RefineThemedLayoutHeaderProps } from "@refinedev/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 "/node_modules/flag-icons/css/flag-icons.min.css";
|
||||
import { languages } from "../../i18n";
|
||||
import QRCodeScannerModal from "../qrCodeScanner";
|
||||
|
||||
const { useToken } = theme;
|
||||
|
||||
export const Header: React.FC<RefineThemedLayoutV2HeaderProps> = ({ sticky }) => {
|
||||
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),
|
||||
icon: <span className={"fi fi-" + languages[lang].countryCode} style={{ marginRight: 8 }} />,
|
||||
label: languages[lang].name,
|
||||
}));
|
||||
|
||||
@@ -52,17 +57,16 @@ export const Header: React.FC<RefineThemedLayoutV2HeaderProps> = ({ sticky }) =>
|
||||
>
|
||||
<Button type="text">
|
||||
<Space>
|
||||
<span className={"fi fi-" + languages[currentLocale ?? "en"].countryCode} />
|
||||
{languages[currentLocale ?? "en"].name}
|
||||
<DownOutlined />
|
||||
</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>
|
||||
|
||||
@@ -0,0 +1,57 @@
|
||||
import { InputNumber } from "antd";
|
||||
|
||||
function parseValue(value?: (number | null)[]): [number | null, number | null] {
|
||||
if (value === undefined) {
|
||||
return [null, null];
|
||||
}
|
||||
|
||||
if (!Array.isArray(value) || value.length !== 2) {
|
||||
return [null, null];
|
||||
}
|
||||
|
||||
const [min, max] = value;
|
||||
|
||||
return [min, max];
|
||||
}
|
||||
|
||||
/**
|
||||
* An Ant Design compatible form input for a number range.
|
||||
* @param props
|
||||
* @returns
|
||||
*/
|
||||
export function InputNumberRange(props: {
|
||||
/** Decimal precision */ precision?: number;
|
||||
/** Unit to display */ unit?: string;
|
||||
/** Value state */ value?: (number | null)[] | undefined;
|
||||
/** Called when input changes. Used to update value state. */ onChange?: (value: (number | null)[]) => void;
|
||||
}) {
|
||||
const [min, max] = parseValue(props.value);
|
||||
|
||||
return (
|
||||
<>
|
||||
<InputNumber
|
||||
value={min}
|
||||
precision={props.precision ?? 0}
|
||||
addonAfter={props.unit}
|
||||
style={{ maxWidth: 110 }}
|
||||
onChange={(value) => {
|
||||
if (props.onChange) {
|
||||
props.onChange([value, max]);
|
||||
}
|
||||
}}
|
||||
/>
|
||||
{" \u2013 "}
|
||||
<InputNumber
|
||||
value={max}
|
||||
precision={props.precision ?? 0}
|
||||
addonAfter={props.unit}
|
||||
style={{ maxWidth: 110 }}
|
||||
onChange={(value) => {
|
||||
if (props.onChange) {
|
||||
props.onChange([min, value]);
|
||||
}
|
||||
}}
|
||||
/>
|
||||
</>
|
||||
);
|
||||
}
|
||||
@@ -1,12 +1,18 @@
|
||||
import { ThemedLayoutV2, ThemedSiderV2, ThemedTitleV2 } from "@refinedev/antd";
|
||||
import { Header } from "./header";
|
||||
import { Footer } from "antd/es/layout/layout";
|
||||
import { Version } from "./version";
|
||||
import { Button } from "antd";
|
||||
import Logo from "../icon.svg?react";
|
||||
import { ThemedLayout, ThemedSider, ThemedTitle } from "@refinedev/antd";
|
||||
import { useTranslate } from "@refinedev/core";
|
||||
import { Button } from "antd";
|
||||
import { Footer } from "antd/es/layout/layout";
|
||||
import Logo from "../icon.svg?react";
|
||||
import { Header } from "./header";
|
||||
import { Version } from "./version";
|
||||
|
||||
const SpoolmanFooter: React.FC = () => {
|
||||
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();
|
||||
|
||||
return (
|
||||
@@ -25,19 +31,13 @@ const SpoolmanFooter: React.FC = () => {
|
||||
</div>
|
||||
<div>
|
||||
<Button
|
||||
icon={
|
||||
<img
|
||||
src="/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>
|
||||
@@ -45,21 +45,17 @@ const SpoolmanFooter: React.FC = () => {
|
||||
);
|
||||
};
|
||||
|
||||
interface SpoolmanLayoutProps {
|
||||
children: React.ReactNode;
|
||||
}
|
||||
|
||||
export const SpoolmanLayout: React.FC<SpoolmanLayoutProps> = ({ children }) => (
|
||||
<ThemedLayoutV2
|
||||
export const SpoolmanLayout = ({ children }: { children: React.ReactNode }) => (
|
||||
<ThemedLayout
|
||||
Header={() => <Header sticky />}
|
||||
Sider={() => (
|
||||
<ThemedSiderV2
|
||||
<ThemedSider
|
||||
fixed
|
||||
Title={({ collapsed }) => <ThemedTitleV2 collapsed={collapsed} text="Spoolman" icon={<Logo />} />}
|
||||
Title={({ collapsed }) => <ThemedTitle collapsed={collapsed} text="Spoolman" icon={<Logo />} />}
|
||||
/>
|
||||
)}
|
||||
Footer={() => <SpoolmanFooter />}
|
||||
>
|
||||
{children}
|
||||
</ThemedLayoutV2>
|
||||
</ThemedLayout>
|
||||
);
|
||||
@@ -59,7 +59,7 @@ function subscribeSingle(
|
||||
channel: string,
|
||||
resource: string,
|
||||
callback: (event: LiveEvent) => void,
|
||||
id?: BaseKey
|
||||
id?: BaseKey,
|
||||
) {
|
||||
// Verify that WebSockets are supported
|
||||
if (!("WebSocket" in window)) {
|
||||
|
||||
@@ -1,8 +1,9 @@
|
||||
import { LiveEvent } from "@refinedev/core";
|
||||
import React from "react";
|
||||
import { useEffect, useState } from "react";
|
||||
import { getAPIURL } from "../utils/url";
|
||||
import liveProvider from "./liveProvider";
|
||||
|
||||
const liveProviderInstance = liveProvider(import.meta.env.VITE_APIURL);
|
||||
const liveProviderInstance = liveProvider(getAPIURL());
|
||||
|
||||
/**
|
||||
* Hook that subscribes to live updates for the items in the dataSource
|
||||
@@ -13,31 +14,25 @@ export function useLiveify<Data extends { id: number }>(
|
||||
resource: string,
|
||||
dataSource: Data[],
|
||||
// eslint-disable-next-line @typescript-eslint/no-explicit-any
|
||||
transformPayload: (payload: any) => Data
|
||||
transformPayload: (payload: any) => Data,
|
||||
) {
|
||||
// TODO: The hooks in this function is quite janky, and should be refactored to be more efficient
|
||||
// New state that holds the dataSource with updated values from the live provider
|
||||
const [updatedDataSource, setUpdatedDataSource] = React.useState<Data[]>(dataSource);
|
||||
const [updatedDataSource, setUpdatedDataSource] = useState<Data[]>(dataSource);
|
||||
|
||||
// If the original dataSource changes, update the updatedDataSource
|
||||
React.useEffect(() => {
|
||||
useEffect(() => {
|
||||
setUpdatedDataSource(dataSource);
|
||||
}, [dataSource]);
|
||||
|
||||
// Create a constant reference to itemIds. This is to prevent the useEffect below from triggering extra times.
|
||||
const itemIds = dataSource.map((item) => item.id);
|
||||
const [prevItemIds, setPrevItemIds] = React.useState<number[]>(itemIds);
|
||||
if (JSON.stringify(itemIds) !== JSON.stringify(prevItemIds)) {
|
||||
setPrevItemIds(itemIds);
|
||||
}
|
||||
|
||||
// Subscribe to changes for all items in the dataSource
|
||||
React.useEffect(() => {
|
||||
useEffect(() => {
|
||||
const itemIds = dataSource.map((item) => item.id);
|
||||
|
||||
const subscription = liveProviderInstance?.subscribe({
|
||||
channel: `${resource}-list`,
|
||||
params: {
|
||||
resource: resource,
|
||||
ids: prevItemIds,
|
||||
ids: itemIds,
|
||||
subscriptionType: "useList",
|
||||
},
|
||||
types: ["update"],
|
||||
@@ -45,7 +40,7 @@ export function useLiveify<Data extends { id: number }>(
|
||||
setUpdatedDataSource((prev) =>
|
||||
prev.map((item) => {
|
||||
return item.id === event.payload.data.id ? transformPayload(event.payload.data) : item;
|
||||
})
|
||||
}),
|
||||
);
|
||||
},
|
||||
});
|
||||
@@ -56,7 +51,7 @@ export function useLiveify<Data extends { id: number }>(
|
||||
liveProviderInstance?.unsubscribe(subscription);
|
||||
}
|
||||
};
|
||||
}, [resource, prevItemIds, transformPayload]);
|
||||
}, [resource, dataSource, transformPayload]);
|
||||
|
||||
return updatedDataSource;
|
||||
}
|
||||
@@ -0,0 +1,83 @@
|
||||
import { CloseOutlined, PlusOutlined } from "@ant-design/icons";
|
||||
import { Badge, Button, ColorPicker, Space } from "antd";
|
||||
|
||||
function generateRandomColor() {
|
||||
return "000000".replace(/0/g, function () {
|
||||
return (~~(Math.random() * 16)).toString(16);
|
||||
});
|
||||
}
|
||||
|
||||
function generateInitialColors(num: number) {
|
||||
const colors = [];
|
||||
for (let i = 0; i < num; i++) {
|
||||
colors.push(generateRandomColor());
|
||||
}
|
||||
return colors;
|
||||
}
|
||||
|
||||
/**
|
||||
* An Ant Design compatible form input for multiple color pickers
|
||||
* The value is a comma separated list of hex values, without hashtags
|
||||
* @param props
|
||||
* @returns
|
||||
*/
|
||||
export function MultiColorPicker(props: {
|
||||
value?: string | null | undefined;
|
||||
onChange?: (value: string | null | undefined) => void;
|
||||
min?: number;
|
||||
max?: number;
|
||||
}) {
|
||||
const values = props.value ? props.value.split(",") : generateInitialColors(props.min ?? 0);
|
||||
if (!props.value && props.onChange) {
|
||||
// Update value immediately
|
||||
props.onChange(values.join(","));
|
||||
}
|
||||
const pickers = values.map((value, idx) => (
|
||||
<Badge
|
||||
key={idx}
|
||||
count={
|
||||
values.length > (props.min ?? 0) ? (
|
||||
<span className="ant-badge-count">
|
||||
<CloseOutlined
|
||||
onClick={() => {
|
||||
// Remove this picker
|
||||
if (props.onChange) {
|
||||
props.onChange(values.filter((v, i) => i !== idx).join(","));
|
||||
}
|
||||
}}
|
||||
/>
|
||||
</span>
|
||||
) : (
|
||||
<></>
|
||||
)
|
||||
}
|
||||
>
|
||||
<ColorPicker
|
||||
value={value}
|
||||
onChange={(clr) => {
|
||||
if (props.onChange) {
|
||||
props.onChange(values.map((v, i) => (i === idx ? clr.toHex() : v)).join(","));
|
||||
}
|
||||
}}
|
||||
/>
|
||||
</Badge>
|
||||
));
|
||||
|
||||
return (
|
||||
<>
|
||||
<Space direction="horizontal" size="middle" style={{ marginTop: "1em" }}>
|
||||
{pickers}
|
||||
{values.length < (props.max ?? Infinity) && (
|
||||
<Button
|
||||
icon={<PlusOutlined />}
|
||||
onClick={() => {
|
||||
if (props.onChange) {
|
||||
props.onChange(values.concat(generateRandomColor()).join(","));
|
||||
}
|
||||
}}
|
||||
/>
|
||||
)}
|
||||
</Space>
|
||||
</>
|
||||
);
|
||||
}
|
||||
@@ -1,7 +1,40 @@
|
||||
import { NotificationProvider } from "@refinedev/core";
|
||||
import { message } from "antd";
|
||||
import { UndoOutlined } from "@ant-design/icons";
|
||||
import { NotificationProvider, OpenNotificationParams } from "@refinedev/core";
|
||||
import { Button, Progress, message } from "antd";
|
||||
|
||||
import { UndoableNotification } from "@refinedev/antd/src/components/undoableNotification";
|
||||
type UndoableNotificationProps = {
|
||||
notificationKey: OpenNotificationParams["key"];
|
||||
message: OpenNotificationParams["message"];
|
||||
cancelMutation: OpenNotificationParams["cancelMutation"];
|
||||
undoableTimeout: OpenNotificationParams["undoableTimeout"];
|
||||
};
|
||||
|
||||
const UndoableNotification = ({ message, cancelMutation, undoableTimeout }: UndoableNotificationProps) => (
|
||||
<div
|
||||
style={{
|
||||
display: "flex",
|
||||
alignItems: "center",
|
||||
justifyContent: "space-between",
|
||||
marginTop: "-7px",
|
||||
}}
|
||||
>
|
||||
<Progress
|
||||
type="circle"
|
||||
percent={(undoableTimeout ?? 0) * 20}
|
||||
format={(time) => time && time / 20}
|
||||
size={50}
|
||||
strokeColor="#1890ff"
|
||||
status="normal"
|
||||
/>
|
||||
<span style={{ marginLeft: 8, width: "100%" }}>{message}</span>
|
||||
<Button
|
||||
style={{ flexShrink: 0 }}
|
||||
onClick={cancelMutation}
|
||||
disabled={undoableTimeout === 0}
|
||||
icon={<UndoOutlined />}
|
||||
></Button>
|
||||
</div>
|
||||
);
|
||||
|
||||
const SpoolmanNotificationProvider: NotificationProvider = {
|
||||
open: ({ key, message: content, type, cancelMutation, undoableTimeout }) => {
|
||||
|
||||
@@ -1,6 +1,5 @@
|
||||
import React from "react";
|
||||
import { Typography } from "antd";
|
||||
import { NumberFieldProps } from "@refinedev/antd/dist/components/fields/types";
|
||||
import { Typography } from "antd";
|
||||
|
||||
const { Text } = Typography;
|
||||
|
||||
@@ -17,12 +16,45 @@ type Props = NumberFieldProps & {
|
||||
*
|
||||
* @see {@link https://refine.dev/docs/ui-frameworks/antd/components/fields/number} for more details.
|
||||
*/
|
||||
export const NumberFieldUnit: React.FC<Props> = ({ value, locale, options, ...rest }) => {
|
||||
export const NumberFieldUnit = ({ value, locale, options, unit }: Props) => {
|
||||
const number = Number(value);
|
||||
|
||||
return (
|
||||
<Text {...rest}>
|
||||
{toLocaleStringSupportsOptions() ? number.toLocaleString(locale, options) : number} {rest.unit}
|
||||
<Text>
|
||||
{toLocaleStringSupportsOptions() ? number.toLocaleString(locale, options) : number} {unit}
|
||||
</Text>
|
||||
);
|
||||
};
|
||||
|
||||
/**
|
||||
* Like a {@link NumberFieldUnit} but for a range of numbers.
|
||||
* @param props
|
||||
* @returns
|
||||
*/
|
||||
export function NumberFieldUnitRange(props: {
|
||||
value: (number | null)[] | undefined;
|
||||
unit?: string;
|
||||
options?: Intl.NumberFormatOptions;
|
||||
}) {
|
||||
const { value, unit, options } = props;
|
||||
|
||||
if (value === undefined) {
|
||||
console.warn("NumberFieldUnitRange received undefined value");
|
||||
return <></>;
|
||||
}
|
||||
|
||||
if (!Array.isArray(value) || value.length !== 2) {
|
||||
console.warn("NumberFieldUnitRange received invalid value", value);
|
||||
return <></>;
|
||||
}
|
||||
|
||||
const [min, max] = value;
|
||||
|
||||
return (
|
||||
<>
|
||||
{min === null ? <></> : <NumberFieldUnit value={min} unit={unit ?? ""} options={options} />}
|
||||
{" \u2013 "}
|
||||
{max === null ? <></> : <NumberFieldUnit value={max} unit={unit ?? ""} options={options} />}
|
||||
</>
|
||||
);
|
||||
}
|
||||
@@ -1,15 +1,16 @@
|
||||
import { useQuery } from "@tanstack/react-query";
|
||||
import { Tooltip } from "antd";
|
||||
import { ColumnFilterItem } from "antd/es/table/interface";
|
||||
import { IFilament } from "../pages/filaments/model";
|
||||
import { IVendor } from "../pages/vendors/model";
|
||||
import { ColumnFilterItem } from "antd/es/table/interface";
|
||||
import { getAPIURL } from "../utils/url";
|
||||
|
||||
export function useSpoolmanFilamentFilter(enabled: boolean = false) {
|
||||
const apiEndpoint = import.meta.env.VITE_APIURL;
|
||||
return useQuery<IFilament[], unknown, ColumnFilterItem[]>({
|
||||
enabled: enabled,
|
||||
queryKey: ["filaments"],
|
||||
queryFn: async () => {
|
||||
const response = await fetch(apiEndpoint + "/filament");
|
||||
const response = await fetch(getAPIURL() + "/filament");
|
||||
if (!response.ok) {
|
||||
throw new Error("Network response was not ok");
|
||||
}
|
||||
@@ -30,27 +31,66 @@ export function useSpoolmanFilamentFilter(enabled: boolean = false) {
|
||||
} else {
|
||||
name = `${filament.name ?? "<unknown>"}`;
|
||||
}
|
||||
|
||||
const tooltipParts: React.ReactNode[] = [];
|
||||
if (filament.color_hex) {
|
||||
tooltipParts.push(
|
||||
<div
|
||||
key="color"
|
||||
style={{
|
||||
borderRadius: ".4em",
|
||||
width: "1.4em",
|
||||
height: "1.4em",
|
||||
backgroundColor: "#" + filament.color_hex,
|
||||
}}
|
||||
></div>,
|
||||
);
|
||||
}
|
||||
if (filament.material) {
|
||||
tooltipParts.push(<div key="material">{filament.material}</div>);
|
||||
}
|
||||
if (filament.weight) {
|
||||
tooltipParts.push(<div key="weight">{filament.weight}g</div>);
|
||||
}
|
||||
|
||||
return {
|
||||
text: name,
|
||||
text: (
|
||||
<Tooltip
|
||||
title={
|
||||
<div
|
||||
style={{
|
||||
display: "flex",
|
||||
flexDirection: "row",
|
||||
gap: ".5em",
|
||||
alignContent: "center",
|
||||
}}
|
||||
>
|
||||
{tooltipParts}
|
||||
</div>
|
||||
}
|
||||
>
|
||||
{name}
|
||||
</Tooltip>
|
||||
),
|
||||
value: filament.id,
|
||||
sortId: name,
|
||||
};
|
||||
})
|
||||
// Remove duplicates
|
||||
.filter((item, index, self) => self.findIndex((t) => t.value === item.value) === index)
|
||||
// Sort by name
|
||||
.sort((a, b) => a.text.localeCompare(b.text));
|
||||
.sort((a, b) => a.sortId.localeCompare(b.sortId));
|
||||
return names;
|
||||
},
|
||||
});
|
||||
}
|
||||
|
||||
export function useSpoolmanFilamentNames(enabled: boolean = false) {
|
||||
const apiEndpoint = import.meta.env.VITE_APIURL;
|
||||
return useQuery<IFilament[], unknown, string[]>({
|
||||
enabled: enabled,
|
||||
queryKey: ["filaments"],
|
||||
queryFn: async () => {
|
||||
const response = await fetch(apiEndpoint + "/filament");
|
||||
const response = await fetch(getAPIURL() + "/filament");
|
||||
if (!response.ok) {
|
||||
throw new Error("Network response was not ok");
|
||||
}
|
||||
@@ -74,12 +114,11 @@ export function useSpoolmanFilamentNames(enabled: boolean = false) {
|
||||
}
|
||||
|
||||
export function useSpoolmanVendors(enabled: boolean = false) {
|
||||
const apiEndpoint = import.meta.env.VITE_APIURL;
|
||||
return useQuery<IVendor[], unknown, string[]>({
|
||||
enabled: enabled,
|
||||
queryKey: ["vendors"],
|
||||
queryFn: async () => {
|
||||
const response = await fetch(apiEndpoint + "/vendor");
|
||||
const response = await fetch(getAPIURL() + "/vendor");
|
||||
if (!response.ok) {
|
||||
throw new Error("Network response was not ok");
|
||||
}
|
||||
@@ -96,12 +135,11 @@ export function useSpoolmanVendors(enabled: boolean = false) {
|
||||
}
|
||||
|
||||
export function useSpoolmanMaterials(enabled: boolean = false) {
|
||||
const apiEndpoint = import.meta.env.VITE_APIURL;
|
||||
return useQuery<string[]>({
|
||||
enabled: enabled,
|
||||
queryKey: ["materials"],
|
||||
queryFn: async () => {
|
||||
const response = await fetch(apiEndpoint + "/material");
|
||||
const response = await fetch(getAPIURL() + "/material");
|
||||
if (!response.ok) {
|
||||
throw new Error("Network response was not ok");
|
||||
}
|
||||
@@ -114,12 +152,11 @@ export function useSpoolmanMaterials(enabled: boolean = false) {
|
||||
}
|
||||
|
||||
export function useSpoolmanArticleNumbers(enabled: boolean = false) {
|
||||
const apiEndpoint = import.meta.env.VITE_APIURL;
|
||||
return useQuery<string[]>({
|
||||
enabled: enabled,
|
||||
queryKey: ["articleNumbers"],
|
||||
queryFn: async () => {
|
||||
const response = await fetch(apiEndpoint + "/article-number");
|
||||
const response = await fetch(getAPIURL() + "/article-number");
|
||||
if (!response.ok) {
|
||||
throw new Error("Network response was not ok");
|
||||
}
|
||||
@@ -132,12 +169,11 @@ export function useSpoolmanArticleNumbers(enabled: boolean = false) {
|
||||
}
|
||||
|
||||
export function useSpoolmanLotNumbers(enabled: boolean = false) {
|
||||
const apiEndpoint = import.meta.env.VITE_APIURL;
|
||||
return useQuery<string[]>({
|
||||
enabled: enabled,
|
||||
queryKey: ["lotNumbers"],
|
||||
queryFn: async () => {
|
||||
const response = await fetch(apiEndpoint + "/lot-number");
|
||||
const response = await fetch(getAPIURL() + "/lot-number");
|
||||
if (!response.ok) {
|
||||
throw new Error("Network response was not ok");
|
||||
}
|
||||
@@ -150,12 +186,11 @@ export function useSpoolmanLotNumbers(enabled: boolean = false) {
|
||||
}
|
||||
|
||||
export function useSpoolmanLocations(enabled: boolean = false) {
|
||||
const apiEndpoint = import.meta.env.VITE_APIURL;
|
||||
return useQuery<string[]>({
|
||||
enabled: enabled,
|
||||
queryKey: ["locations"],
|
||||
queryFn: async () => {
|
||||
const response = await fetch(apiEndpoint + "/location");
|
||||
const response = await fetch(getAPIURL() + "/location");
|
||||
if (!response.ok) {
|
||||
throw new Error("Network response was not ok");
|
||||
}
|
||||
|
||||
@@ -1,129 +0,0 @@
|
||||
import { Col, Form, InputNumber, QRCode, Row, Slider, Switch } from "antd";
|
||||
import { useSavedState } from "../../utils/saveload";
|
||||
import PrintingDialog from "./printingDialog";
|
||||
import { useTranslate } from "@refinedev/core";
|
||||
|
||||
interface QRCodeData {
|
||||
value: string;
|
||||
label?: JSX.Element;
|
||||
errorLevel?: "L" | "M" | "Q" | "H";
|
||||
}
|
||||
|
||||
interface QRCodePrintingDialogProps {
|
||||
visible: boolean;
|
||||
items: QRCodeData[];
|
||||
onCancel: () => void;
|
||||
extraSettings?: JSX.Element;
|
||||
}
|
||||
|
||||
const QRCodePrintingDialog: React.FC<QRCodePrintingDialogProps> = ({ visible, items, onCancel, extraSettings }) => {
|
||||
const t = useTranslate();
|
||||
|
||||
const [showContent, setShowContent] = useSavedState("print-showContent", true);
|
||||
const [textSize, setTextSize] = useSavedState("print-textSize", 3);
|
||||
const [showSpoolmanIcon, setShowSpoolmanIcon] = useSavedState("print-showSpoolmanIcon", true);
|
||||
|
||||
const elements = items.map((item) => {
|
||||
return (
|
||||
<div className="print-qrcode-item">
|
||||
<div className="print-qrcode-container">
|
||||
<QRCode
|
||||
className="print-qrcode"
|
||||
icon={showSpoolmanIcon ? "/favicon.svg" : undefined}
|
||||
value={item.value}
|
||||
errorLevel={item.errorLevel}
|
||||
type="svg"
|
||||
color="#000"
|
||||
/>
|
||||
</div>
|
||||
{showContent && <div className="print-qrcode-title">{item.label ?? item.value}</div>}
|
||||
</div>
|
||||
);
|
||||
});
|
||||
|
||||
return (
|
||||
<PrintingDialog
|
||||
visible={visible}
|
||||
title={t("printing.qrcode.title")}
|
||||
items={elements}
|
||||
extraSettings={
|
||||
<>
|
||||
<Form.Item label={t("printing.qrcode.showContent")}>
|
||||
<Switch checked={showContent} onChange={(checked) => setShowContent(checked)} />
|
||||
</Form.Item>
|
||||
<Form.Item label={t("printing.qrcode.textSize")}>
|
||||
<Row>
|
||||
<Col span={12}>
|
||||
<Slider
|
||||
disabled={!showContent}
|
||||
tooltip={{ formatter: (value) => `${value} mm` }}
|
||||
min={2}
|
||||
max={7}
|
||||
value={textSize}
|
||||
step={0.1}
|
||||
onChange={(value) => {
|
||||
setTextSize(value);
|
||||
}}
|
||||
/>
|
||||
</Col>
|
||||
<Col span={12}>
|
||||
<InputNumber
|
||||
disabled={!showContent}
|
||||
min={0.01}
|
||||
step={0.1}
|
||||
style={{ margin: "0 16px" }}
|
||||
value={textSize}
|
||||
addonAfter="mm"
|
||||
onChange={(value) => {
|
||||
setTextSize(value ?? 5);
|
||||
}}
|
||||
/>
|
||||
</Col>
|
||||
</Row>
|
||||
</Form.Item>
|
||||
<Form.Item label={t("printing.qrcode.showSpoolmanIcon")}>
|
||||
<Switch checked={showSpoolmanIcon} onChange={(checked) => setShowSpoolmanIcon(checked)} />
|
||||
</Form.Item>
|
||||
{extraSettings}
|
||||
</>
|
||||
}
|
||||
style={`
|
||||
.print-page .print-qrcode-item {
|
||||
display: flex;
|
||||
width: 100%;
|
||||
max-height: 100%;
|
||||
justify-content: center;
|
||||
}
|
||||
|
||||
.print-page .print-qrcode-container {
|
||||
max-width: ${showContent ? "50%" : "100%"};
|
||||
display: flex;
|
||||
}
|
||||
|
||||
.print-page .print-qrcode {
|
||||
width: auto !important;
|
||||
height: auto !important;
|
||||
}
|
||||
|
||||
.print-page .print-qrcode-title {
|
||||
flex: 1 1 auto;
|
||||
font-size: ${textSize}mm;
|
||||
color: #000;
|
||||
overflow: hidden;
|
||||
}
|
||||
|
||||
.print-page canvas, .print-page svg {
|
||||
/* display: block; */
|
||||
object-fit: contain;
|
||||
height: 100% !important;
|
||||
width: 100% !important;
|
||||
max-height: 100%;
|
||||
max-width: 100%;
|
||||
}
|
||||
`}
|
||||
onCancel={onCancel}
|
||||
/>
|
||||
);
|
||||
};
|
||||
|
||||
export default QRCodePrintingDialog;
|
||||
@@ -1,135 +0,0 @@
|
||||
import { Form, Switch } from "antd";
|
||||
import { IFilament } from "../../pages/filaments/model";
|
||||
import { ISpool } from "../../pages/spools/model";
|
||||
import QRCodePrintingDialog from "./qrCodePrintingDialog";
|
||||
import { useSavedState } from "../../utils/saveload";
|
||||
import { useTranslate } from "@refinedev/core";
|
||||
|
||||
interface SpoolQRCodePrintingDialog {
|
||||
visible: boolean;
|
||||
items: ISpool[];
|
||||
onCancel: () => void;
|
||||
}
|
||||
|
||||
const SpoolQRCodePrintingDialog: React.FC<SpoolQRCodePrintingDialog> = ({ visible, items, onCancel }) => {
|
||||
const t = useTranslate();
|
||||
|
||||
const [showVendor, setShowVendor] = useSavedState("print-showVendor", true);
|
||||
const [showLotNr, setShowLotNr] = useSavedState("print-showLotNr", true);
|
||||
const [showSpoolWeight, setShowSpoolWeight] = useSavedState("print-showSpoolWeight", true);
|
||||
const [showTemperatures, setShowTemperatures] = useSavedState("print-showTemperatures", true);
|
||||
const [showSpoolComment, setShowSpoolComment] = useSavedState("print-showSpoolComment", false);
|
||||
const [showFilamentComment, setShowFilamentComment] = useSavedState("print-showFilamentComment", false);
|
||||
const [showVendorComment, setShowVendorComment] = useSavedState("print-showVendorComment", false);
|
||||
|
||||
const formatFilament = (filament: IFilament) => {
|
||||
let vendorPrefix = "";
|
||||
if (showVendor && filament.vendor) {
|
||||
vendorPrefix = `${filament.vendor.name} - `;
|
||||
}
|
||||
let name = filament.name;
|
||||
if (!name) {
|
||||
name = `Filament #${filament.id}`;
|
||||
}
|
||||
return `${vendorPrefix}${name}`;
|
||||
};
|
||||
|
||||
return (
|
||||
<QRCodePrintingDialog
|
||||
visible={visible}
|
||||
onCancel={onCancel}
|
||||
items={items.map(function (spool) {
|
||||
const temps = [];
|
||||
if (spool.filament.settings_extruder_temp) {
|
||||
temps.push(t("printing.qrcode.extruderTemp", { temp: `${spool.filament.settings_extruder_temp} °C` }));
|
||||
}
|
||||
if (spool.filament.settings_bed_temp) {
|
||||
temps.push(t("printing.qrcode.bedTemp", { temp: `${spool.filament.settings_bed_temp} °C` }));
|
||||
}
|
||||
const tempLine = temps.join(" - ");
|
||||
|
||||
return {
|
||||
value: `web+spoolman:s-${spool.id}`,
|
||||
label: (
|
||||
<p
|
||||
style={{
|
||||
padding: "1mm 1mm 1mm 0",
|
||||
}}
|
||||
>
|
||||
<b>{formatFilament(spool.filament)}</b>
|
||||
<br />
|
||||
<b>
|
||||
#{spool.id}
|
||||
{spool.filament.material && <> - {spool.filament.material}</>}
|
||||
</b>
|
||||
{showSpoolWeight && (
|
||||
<>
|
||||
<br />
|
||||
{t("printing.qrcode.spoolWeight", { weight: `${spool.filament.spool_weight ?? "?"} g` })}
|
||||
</>
|
||||
)}
|
||||
{showTemperatures && tempLine && (
|
||||
<>
|
||||
<br />
|
||||
{tempLine}
|
||||
</>
|
||||
)}
|
||||
{showLotNr && (
|
||||
<>
|
||||
<br />
|
||||
{t("printing.qrcode.lotNr", { lot: spool.lot_nr ?? "?" })}
|
||||
</>
|
||||
)}
|
||||
{showSpoolComment && spool.comment && (
|
||||
<>
|
||||
<br />
|
||||
{spool.comment}
|
||||
</>
|
||||
)}
|
||||
{showFilamentComment && spool.filament.comment && (
|
||||
<>
|
||||
<br />
|
||||
{spool.filament.comment}
|
||||
</>
|
||||
)}
|
||||
{showVendorComment && spool.filament.vendor?.comment && (
|
||||
<>
|
||||
<br />
|
||||
{spool.filament.vendor.comment}
|
||||
</>
|
||||
)}
|
||||
</p>
|
||||
),
|
||||
errorLevel: "H",
|
||||
};
|
||||
})}
|
||||
extraSettings={
|
||||
<>
|
||||
<Form.Item label={t("printing.qrcode.showVendor")}>
|
||||
<Switch checked={showVendor} onChange={(checked) => setShowVendor(checked)} />
|
||||
</Form.Item>
|
||||
<Form.Item label={t("printing.qrcode.showSpoolWeight")}>
|
||||
<Switch checked={showSpoolWeight} onChange={(checked) => setShowSpoolWeight(checked)} />
|
||||
</Form.Item>
|
||||
<Form.Item label={t("printing.qrcode.showTemperatures")}>
|
||||
<Switch checked={showTemperatures} onChange={(checked) => setShowTemperatures(checked)} />
|
||||
</Form.Item>
|
||||
<Form.Item label={t("printing.qrcode.showLotNr")}>
|
||||
<Switch checked={showLotNr} onChange={(checked) => setShowLotNr(checked)} />
|
||||
</Form.Item>
|
||||
<Form.Item label={t("printing.qrcode.showSpoolComment")}>
|
||||
<Switch checked={showSpoolComment} onChange={(checked) => setShowSpoolComment(checked)} />
|
||||
</Form.Item>
|
||||
<Form.Item label={t("printing.qrcode.showFilamentComment")}>
|
||||
<Switch checked={showFilamentComment} onChange={(checked) => setShowFilamentComment(checked)} />
|
||||
</Form.Item>
|
||||
<Form.Item label={t("printing.qrcode.showVendorComment")}>
|
||||
<Switch checked={showVendorComment} onChange={(checked) => setShowVendorComment(checked)} />
|
||||
</Form.Item>
|
||||
</>
|
||||
}
|
||||
/>
|
||||
);
|
||||
};
|
||||
|
||||
export default SpoolQRCodePrintingDialog;
|
||||