mirror of
https://github.com/Donkie/Spoolman.git
synced 2026-10-21 01:29:47 -05:00
Compare commits
251
Commits
| Author | SHA1 | Date | |
|---|---|---|---|
|
|
3c1d8bfa6d | ||
|
|
a2cfe33cd3 | ||
|
|
f8db2a0f09 | ||
|
|
95230eaa73 | ||
|
|
2cdfcc1bae | ||
|
|
e175708b3e | ||
|
|
a5e4bc0bf3 | ||
|
|
cbc6458c5d | ||
|
|
13b7a9b62f | ||
|
|
7c29d5f54a | ||
|
|
6663a42ab5 | ||
|
|
b34b872140 | ||
|
|
dadc2ba760 | ||
|
|
35cc1c7d43 | ||
|
|
e08c930ef8 | ||
|
|
8318a5f970 | ||
|
|
c7b59fe322 | ||
|
|
c9c59b3d9e | ||
|
|
09c29703f0 | ||
|
|
a8da5e312b | ||
|
|
c8be881e03 | ||
|
|
7405ce77fd | ||
|
|
673ca1d2fb | ||
|
|
4e1e3c50c9 | ||
|
|
f369253c67 | ||
|
|
dd6b334a79 | ||
|
|
a8b3641a90 | ||
|
|
72daa29cd2 | ||
|
|
7e9533965a | ||
|
|
97524b1107 | ||
|
|
e3dbd3e609 | ||
|
|
388e87ec96 | ||
|
|
ff7170f0f7 | ||
|
|
3c414503d6 | ||
|
|
b00c1b875d | ||
|
|
0c03f8b404 | ||
|
|
67022e7c6d | ||
|
|
4ab99768ae | ||
|
|
c1d5c6b46e | ||
|
|
aad337234e | ||
|
|
9bdf4d1a5e | ||
|
|
24e6f7fd34 | ||
|
|
f4eba480d6 | ||
|
|
59672ecb30 | ||
|
|
c781869d09 | ||
|
|
a76c8ed3d9 | ||
|
|
7e353595c0 | ||
|
|
6ca753bca0 | ||
|
|
c9ae367dc0 | ||
|
|
b38468ffe2 | ||
|
|
d2cabd5d29 | ||
|
|
87a07a5560 | ||
|
|
ae3208a9c3 | ||
|
|
04d6ee72bd | ||
|
|
680f2a063b | ||
|
|
bf15e64fe5 | ||
|
|
814ddfcd92 | ||
|
|
aa47cd015a | ||
|
|
372554adbd | ||
|
|
c4be425dcc | ||
|
|
aa447dd05b | ||
|
|
21651216af | ||
|
|
bf3480cfba | ||
|
|
39f6ededfd | ||
|
+2 |
4219230aa1 | ||
|
|
17f8b9fee1 | ||
|
|
6af053b682 | ||
|
|
2befcfc389 | ||
|
|
8f7794e487 | ||
|
|
7ab45ca1ab | ||
|
|
e8b363c10b | ||
|
|
64e94bd97f | ||
|
|
89ffd3e4b1 | ||
|
|
2e396d6cda | ||
|
|
f08e27c6fd | ||
|
|
733dcf9209 | ||
|
|
1262eb664a | ||
|
|
9a93892a91 | ||
|
|
2924850317 | ||
|
|
b369cf049e | ||
|
|
d1ab338b91 | ||
|
|
a2e9e66153 | ||
|
|
5d812e269e | ||
|
|
7d683eb246 | ||
|
|
1b1dbbb78f | ||
|
|
404b03173b | ||
|
|
c33f65243c | ||
|
|
7d4728ae9b | ||
|
|
06ae678586 | ||
|
|
bf3896b1f2 | ||
|
|
1d5164b629 | ||
|
|
cd5ef6f8d6 | ||
|
|
f6827c0a69 | ||
|
|
18214ee0f8 | ||
|
|
386ec36d1f | ||
|
|
8a5cf7ec73 | ||
|
|
b7772ca743 | ||
|
|
2f9259227d | ||
|
|
e6e3be2773 | ||
|
|
eced411a51 | ||
|
|
7e309e36b9 | ||
|
|
054c59948e | ||
|
|
5222df98a3 | ||
|
|
5eb660f420 | ||
|
|
52b0580df9 | ||
|
|
01be7b7572 | ||
|
|
f69d098473 | ||
|
|
df2cd09bcc | ||
|
|
6e1065009c | ||
|
|
c2c6a8dd8f | ||
|
|
0076058280 | ||
|
|
54b67f53ef | ||
|
|
129650237a | ||
|
|
5c5e8b44e1 | ||
|
|
a0987e063e | ||
|
|
fc606ec8fc | ||
|
|
f7da164599 | ||
|
|
3d6888ec2c | ||
|
|
ca8dba9e54 | ||
|
|
3a2fc68e1e | ||
|
|
acb367262b | ||
|
|
9b79135c1c | ||
|
|
ecd43bd51a | ||
|
|
64d5f84bc3 | ||
|
|
6ade40517f | ||
|
|
990f16a8e9 | ||
|
|
9582962e37 | ||
|
|
a34d52a597 | ||
|
|
5b5e07e2c1 | ||
|
|
38397424ee | ||
|
|
128a0a4a34 | ||
|
|
4118ca5f2c | ||
|
|
2f25e76f5e | ||
|
|
a733366be9 | ||
|
|
505faf3b35 | ||
|
|
e2a08c0cfd | ||
|
|
d580924d13 | ||
|
|
4e4313204e | ||
|
|
c90cf9eb43 | ||
|
|
5bd4fa594d | ||
|
|
06eff55ccb | ||
|
|
43034dce50 | ||
|
|
5bfaf9c5b2 | ||
|
|
c72036f650 | ||
|
|
593b653841 | ||
|
|
3f3f872310 | ||
|
|
0e5573bc1f | ||
|
|
d194cf3483 | ||
|
|
57869fab88 | ||
|
|
29f0f362d4 | ||
|
|
638466bc70 | ||
|
|
913e9116fa | ||
|
|
6d2ba20023 | ||
|
|
5811353670 | ||
|
|
ed758a1171 | ||
|
|
f7103ec9e2 | ||
|
|
0c673f0403 | ||
|
|
8ae45c03c5 | ||
|
|
18b0a818bf | ||
|
|
28d840fc87 | ||
|
|
9b16121ed2 | ||
|
|
d7486d5d51 | ||
|
|
9f893fb289 | ||
|
|
7c188c113a | ||
|
|
f23f5611b2 | ||
|
|
c0142c9bcf | ||
|
|
2b592abd5f | ||
|
|
8ab2060b96 | ||
|
|
351a09ca63 | ||
|
|
871fbdb444 | ||
|
|
ab38eb73ad | ||
|
|
287d3010ac | ||
|
|
a1685f7428 | ||
|
|
bb2a21cb99 | ||
|
|
c30bbfea9d | ||
|
|
ebadc045aa | ||
|
|
a9d93520eb | ||
|
|
63c2ad5d7e | ||
|
|
35f35b8bd3 | ||
|
|
7642eaae27 | ||
|
|
cae436ee87 | ||
|
|
c9cf7a6a12 | ||
|
|
532ffc8ccd | ||
|
|
d2435871de | ||
|
|
d9c0a2a049 | ||
|
|
48650cff96 | ||
|
|
bcdcf6f476 | ||
|
|
30e2daf784 | ||
|
|
d65b50d5a2 | ||
|
|
9dcd6d56db | ||
|
|
7ea89dc347 | ||
|
|
4bdebbdded | ||
|
|
cf82d5b68f | ||
|
|
0f7cdc6faf | ||
|
|
99928b5469 | ||
|
|
46b69808a6 | ||
|
|
c82e3911e1 | ||
|
|
470d8f3bcc | ||
|
|
103e029434 | ||
|
|
92da7fd110 | ||
|
+1 |
991feb36bb | ||
|
|
e2ab72b5d0 | ||
|
|
8c262a640d | ||
|
|
4854e322dc | ||
|
|
ad79373dd0 | ||
|
|
5c8364fcea | ||
|
|
2c638da22a | ||
|
|
295265f60d | ||
|
|
4f6763716c | ||
|
|
48ad01b09b | ||
|
|
d9fd44eab9 | ||
|
|
da54ead06f | ||
|
|
9b6af119c6 | ||
|
|
3a3273d9a9 | ||
|
|
c81920d23c | ||
|
|
e3c5f3fc1d | ||
|
|
4e3c228b28 | ||
|
|
059ff94f4b | ||
|
|
9f30c16e4b | ||
|
|
14a30bc3c5 | ||
|
|
025f18f914 | ||
|
|
388082f27a | ||
|
|
7fae319b82 | ||
|
|
137558639a | ||
|
|
eafbc64937 | ||
|
|
1be0884729 | ||
|
|
e77bea1bc2 | ||
|
|
5dc26946cb | ||
|
|
34c09d3f55 | ||
|
|
7f14cbdaa9 | ||
|
|
115e29bdaf | ||
|
|
6d817d8c2b | ||
|
|
c033a3ffe6 | ||
|
|
1974d4b8d2 | ||
|
|
c3ef318cb0 | ||
|
|
bc442f5063 | ||
|
|
dd0476ced3 | ||
|
|
6f9dfd1be7 | ||
|
|
29aa9f8d54 | ||
|
|
251f7e2ede | ||
|
|
f137535c1e | ||
|
|
fb83220739 | ||
|
|
fdf317fc13 | ||
|
|
205a5c52fa | ||
|
|
f585c51b18 | ||
|
|
b393f822e8 | ||
|
|
7cc3bef46f | ||
|
|
c179a38f03 | ||
|
|
6e9f6e5af4 | ||
|
|
21f46427e5 | ||
|
|
967b9d5b31 |
No files matched your search
@@ -1,4 +1,5 @@
|
||||
client/node_modules
|
||||
client_v2/node_modules
|
||||
|
||||
*.egg-info
|
||||
*.egg/
|
||||
|
||||
+34
-7
@@ -60,6 +60,17 @@ SPOOLMAN_PORT=7912
|
||||
# Sync interval in seconds, set to 0 to disable automatic sync. It will only sync on start-up then.
|
||||
# Default: 3600
|
||||
#EXTERNAL_DB_SYNC_INTERVAL=3600
|
||||
# Display name for the external database, shown in the UI.
|
||||
# Set this to match your own catalog if you changed EXTERNAL_DB_URL above.
|
||||
# Default: SpoolmanDB
|
||||
#EXTERNAL_DB_NAME=SpoolmanDB
|
||||
|
||||
# Serve the previous (React) web client instead of the current one
|
||||
# Both clients ship in the image and talk to the same API, so this is a safe
|
||||
# rollback if the current client misbehaves on your setup. Your data is untouched
|
||||
# either way. Please report the problem so it can be fixed.
|
||||
# Default: FALSE
|
||||
#SPOOLMAN_LEGACY_CLIENT=TRUE
|
||||
|
||||
# Enable debug mode
|
||||
# If enabled, the client will accept requests from any host
|
||||
@@ -73,10 +84,26 @@ SPOOLMAN_PORT=7912
|
||||
#PUID=1000
|
||||
#PGID=1000
|
||||
|
||||
# Allows CORS ORIGIN.
|
||||
# Use the https://developer.mozilla.org/en-US/docs/Web/HTTP/Reference/Headers/Access-Control-Allow-Origin semantics
|
||||
# separated by commas
|
||||
# for example to allow request from source1.domain.com on port p1 and source2.domain.com on port p2
|
||||
# SPOOLMAN_CORS_ORIGIN=source1.domain.com:p1, source2.domain.com:p2
|
||||
# to allow from any
|
||||
# SPOOLMAN_CORS_ORIGIN=*
|
||||
# Extra browser origins allowed to talk to Spoolman, separated by commas.
|
||||
# Only needed for a web UI served from a different address than Spoolman, such as a Fluidd or
|
||||
# Mainsail instance on another host. Spoolman's own web UI does not need it, and neither does
|
||||
# Moonraker, OctoPrint, Home Assistant or anything else that is not a browser.
|
||||
# Each entry must include the scheme -- a bare "host:port" is not an origin and will never match.
|
||||
# See https://developer.mozilla.org/en-US/docs/Web/HTTP/Reference/Headers/Access-Control-Allow-Origin
|
||||
#SPOOLMAN_CORS_ORIGIN=https://fluidd.local,http://mainsail.local:8080
|
||||
# To allow every origin. WARNING: this turns the origin checks off entirely, so any website you
|
||||
# visit can read and modify your Spoolman data in the background. Only on a trusted network.
|
||||
#SPOOLMAN_CORS_ORIGIN=*
|
||||
|
||||
# Hostnames this Spoolman answers to, separated by commas. Off unless set.
|
||||
# Protects against DNS rebinding, where a domain an attacker owns is pointed at your Spoolman's
|
||||
# local address so that their web page can talk to it. Hostnames, not origins: no scheme, no port.
|
||||
# "*.mydomain.com" covers the domain and its subdomains.
|
||||
# IP addresses, single-word names, .local/.lan/.home/.home.arpa/.internal names and any hostname
|
||||
# already in SPOOLMAN_CORS_ORIGIN keep working without being listed.
|
||||
# If you reach Spoolman through a reverse proxy on a real domain, that domain must be listed here
|
||||
# once this is set, or every request is refused with a 400.
|
||||
#SPOOLMAN_ALLOWED_HOSTS=spoolman.mydomain.com
|
||||
|
||||
# See the Security page in the wiki for how these two fit together:
|
||||
# https://github.com/Donkie/Spoolman/wiki/Security
|
||||
Binary file not shown.
|
After Width: | Height: | Size: 312 KiB |
Binary file not shown.
|
After Width: | Height: | Size: 136 KiB |
Binary file not shown.
|
After Width: | Height: | Size: 162 KiB |
+319
-12
@@ -14,6 +14,13 @@ permissions:
|
||||
contents: read
|
||||
packages: read
|
||||
|
||||
# A new push to a PR makes the previous run's result irrelevant, so cancel it and
|
||||
# let the new one have the runners. Gated on the event: the push triggers are
|
||||
# master and v* tags, and a cancelled tag run is a half-published release.
|
||||
concurrency:
|
||||
group: ${{ github.workflow }}-${{ github.ref }}
|
||||
cancel-in-progress: ${{ github.event_name == 'pull_request' }}
|
||||
|
||||
env:
|
||||
GHCR_IMAGE: donkie/spoolman
|
||||
|
||||
@@ -30,7 +37,7 @@ jobs:
|
||||
- name: Install node
|
||||
uses: actions/setup-node@v4.0.3
|
||||
with:
|
||||
node-version: '20'
|
||||
node-version: '24'
|
||||
|
||||
- name: Install uv
|
||||
uses: astral-sh/setup-uv@v7
|
||||
@@ -50,6 +57,13 @@ jobs:
|
||||
cd client
|
||||
npm ci
|
||||
|
||||
# lefthook's `ci` hook lints/formats/type-checks client_v2 too, via
|
||||
# hardcoded ./node_modules/.bin/* paths, so its deps must be present.
|
||||
- name: Install client_v2 dependencies
|
||||
run: |
|
||||
cd client_v2
|
||||
npm ci
|
||||
|
||||
- name: Run pre-commit
|
||||
run: uv run lefthook run ci
|
||||
#
|
||||
@@ -65,7 +79,7 @@ jobs:
|
||||
- name: Install node
|
||||
uses: actions/setup-node@v4.0.3
|
||||
with:
|
||||
node-version: '20'
|
||||
node-version: '24'
|
||||
|
||||
- name: Install uv
|
||||
uses: astral-sh/setup-uv@v7
|
||||
@@ -88,31 +102,53 @@ jobs:
|
||||
rm -f .env && echo "VITE_APIURL=/api/v1" > .env.production
|
||||
npm run build
|
||||
|
||||
# Build the new Svelte client (client_v2), served by default at runtime.
|
||||
# No VITE_APIURL is set: the client resolves the API relative to its base path.
|
||||
- name: Install client_v2 dependencies
|
||||
run: |
|
||||
cd client_v2
|
||||
npm ci
|
||||
|
||||
- name: Build client_v2
|
||||
run: |
|
||||
cd client_v2
|
||||
npm run build
|
||||
|
||||
- name: Write build info
|
||||
run: |
|
||||
echo "GIT_COMMIT=$(git rev-parse --short HEAD)" > build.txt
|
||||
echo "BUILD_DATE=$(date -u +"%Y-%m-%dT%H:%M:%SZ")" >> build.txt
|
||||
|
||||
# Remove client source and keep only the built dist
|
||||
|
||||
# Remove client sources and keep only the built output for each client
|
||||
- name: Clean
|
||||
run: |
|
||||
mv client/dist dist
|
||||
rm -rf client
|
||||
mkdir client
|
||||
mv dist client/dist
|
||||
mv client_v2/build build_v2
|
||||
rm -rf client_v2
|
||||
mkdir client_v2
|
||||
mv build_v2 client_v2/build
|
||||
rm -rf .git
|
||||
rm -rf .venv
|
||||
|
||||
- name: Fix permissions
|
||||
run: |
|
||||
chmod +x scripts/*.sh
|
||||
|
||||
|
||||
- name: Upload client Spoolman artifact
|
||||
uses: actions/upload-artifact@v4.4.0
|
||||
with:
|
||||
name: client
|
||||
path: client/dist
|
||||
|
||||
- name: Upload client_v2 Spoolman artifact
|
||||
uses: actions/upload-artifact@v4.4.0
|
||||
with:
|
||||
name: client_v2
|
||||
path: client_v2/build
|
||||
|
||||
- name: Upload full Spoolman artifact
|
||||
uses: actions/upload-artifact@v4.4.0
|
||||
with:
|
||||
@@ -137,6 +173,12 @@ jobs:
|
||||
name: client
|
||||
path: client/dist
|
||||
|
||||
- name: Download client_v2
|
||||
uses: actions/download-artifact@v4.1.7
|
||||
with:
|
||||
name: client_v2
|
||||
path: client_v2/build
|
||||
|
||||
- name: Set up Docker Buildx
|
||||
uses: docker/setup-buildx-action@v3.6.1
|
||||
|
||||
@@ -249,12 +291,118 @@ jobs:
|
||||
up-flags: "--abort-on-container-exit"
|
||||
down-flags: "--volumes"
|
||||
#
|
||||
# Perform frontend (browser) integration tests against the real image
|
||||
#
|
||||
test-frontend:
|
||||
needs: [build-amd64]
|
||||
runs-on: ubuntu-latest
|
||||
steps:
|
||||
- name: Checkout
|
||||
uses: actions/checkout@v6
|
||||
|
||||
- name: Download built image
|
||||
uses: actions/download-artifact@v4.1.7
|
||||
with:
|
||||
name: spoolman-image
|
||||
path: /tmp/spoolman-image
|
||||
|
||||
- name: Load built image
|
||||
run: docker load --input /tmp/spoolman-image/spoolman.tar
|
||||
|
||||
- name: Install node
|
||||
uses: actions/setup-node@v4.0.3
|
||||
with:
|
||||
node-version: '24'
|
||||
|
||||
- name: Install Playwright
|
||||
run: |
|
||||
cd tests_frontend
|
||||
npm ci
|
||||
npx playwright install --with-deps chromium
|
||||
|
||||
- name: Start Spoolman
|
||||
run: docker compose -f tests_frontend/docker-compose.yml up -d --wait
|
||||
|
||||
- name: Run frontend integration tests
|
||||
run: |
|
||||
cd tests_frontend
|
||||
npx playwright test
|
||||
|
||||
- name: Dump Spoolman logs on failure
|
||||
if: failure()
|
||||
run: docker compose -f tests_frontend/docker-compose.yml logs spoolman
|
||||
|
||||
- name: Upload Playwright report
|
||||
if: ${{ !cancelled() }}
|
||||
uses: actions/upload-artifact@v4.4.0
|
||||
with:
|
||||
name: playwright-report
|
||||
path: tests_frontend/playwright-report
|
||||
retention-days: 7
|
||||
|
||||
- name: Stop Spoolman
|
||||
if: always()
|
||||
run: docker compose -f tests_frontend/docker-compose.yml down -v
|
||||
#
|
||||
# Perform frontend (browser) integration tests for client_v2 against the real image
|
||||
#
|
||||
test-frontend-v2:
|
||||
needs: [build-amd64]
|
||||
runs-on: ubuntu-latest
|
||||
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
|
||||
|
||||
- name: Run client_v2 frontend integration tests
|
||||
run: |
|
||||
cd tests_frontend_v2
|
||||
npx playwright test
|
||||
|
||||
- name: Dump Spoolman logs on failure
|
||||
if: failure()
|
||||
run: docker compose -f tests_frontend_v2/docker-compose.yml logs spoolman
|
||||
|
||||
- name: Upload Playwright report
|
||||
if: ${{ !cancelled() }}
|
||||
uses: actions/upload-artifact@v4.4.0
|
||||
with:
|
||||
name: playwright-report-v2
|
||||
path: tests_frontend_v2/playwright-report
|
||||
retention-days: 7
|
||||
|
||||
- name: Stop Spoolman
|
||||
if: always()
|
||||
run: docker compose -f tests_frontend_v2/docker-compose.yml down -v
|
||||
#
|
||||
# Build arm64 image
|
||||
# Don't run this for pull requests
|
||||
# Only push to buildcache and let release job push to registry
|
||||
# Also exported to a tar so test-multiarch-smoke can boot it under QEMU.
|
||||
# On pull requests we can't push to buildcache (forks don't have registry
|
||||
# write access), so cache-to is skipped and we only read from it.
|
||||
#
|
||||
build-arm64:
|
||||
if: ${{ github.event_name != 'pull_request' }}
|
||||
needs: [build-client]
|
||||
runs-on: ubuntu-latest
|
||||
permissions:
|
||||
@@ -269,6 +417,12 @@ jobs:
|
||||
name: client
|
||||
path: client/dist
|
||||
|
||||
- name: Download client_v2
|
||||
uses: actions/download-artifact@v4.1.7
|
||||
with:
|
||||
name: client_v2
|
||||
path: client_v2/build
|
||||
|
||||
- name: Set up QEMU
|
||||
uses: docker/setup-qemu-action@v3.2.0
|
||||
|
||||
@@ -283,19 +437,39 @@ jobs:
|
||||
password: ${{ secrets.GITHUB_TOKEN }}
|
||||
|
||||
- name: Build and cache Docker image
|
||||
if: ${{ github.event_name != 'pull_request' }}
|
||||
uses: docker/build-push-action@v6.7.0
|
||||
with:
|
||||
context: .
|
||||
platforms: linux/arm64
|
||||
tags: ${{ env.GHCR_IMAGE }}:test-arm64
|
||||
outputs: type=docker,dest=/tmp/spoolman-arm64.tar
|
||||
cache-from: type=registry,ref=ghcr.io/${{ env.GHCR_IMAGE }}:buildcache-arm64
|
||||
cache-to: type=registry,ref=ghcr.io/${{ env.GHCR_IMAGE }}:buildcache-arm64,mode=max
|
||||
|
||||
# Separate build for pull requests since PRs dont have access to store cache
|
||||
- name: Build and cache Docker image (PR)
|
||||
if: ${{ github.event_name == 'pull_request' }}
|
||||
uses: docker/build-push-action@v6.7.0
|
||||
with:
|
||||
context: .
|
||||
platforms: linux/arm64
|
||||
tags: ${{ env.GHCR_IMAGE }}:test-arm64
|
||||
outputs: type=docker,dest=/tmp/spoolman-arm64.tar
|
||||
cache-from: type=registry,ref=ghcr.io/${{ env.GHCR_IMAGE }}:buildcache-arm64
|
||||
|
||||
- name: Upload arm64 image artifact
|
||||
uses: actions/upload-artifact@v4.4.0
|
||||
with:
|
||||
name: spoolman-image-arm64
|
||||
path: /tmp/spoolman-arm64.tar
|
||||
#
|
||||
# Build arm/v7 image
|
||||
# Don't run this for pull requests
|
||||
# Only push to buildcache and let release job push to registry
|
||||
# Also exported to a tar so test-multiarch-smoke can boot it under QEMU.
|
||||
# On pull requests we can't push to buildcache (forks don't have registry
|
||||
# write access), so cache-to is skipped and we only read from it.
|
||||
#
|
||||
build-armv7:
|
||||
if: ${{ github.event_name != 'pull_request' }}
|
||||
needs: [build-client]
|
||||
runs-on: ubuntu-latest
|
||||
permissions:
|
||||
@@ -310,6 +484,12 @@ jobs:
|
||||
name: client
|
||||
path: client/dist
|
||||
|
||||
- name: Download client_v2
|
||||
uses: actions/download-artifact@v4.1.7
|
||||
with:
|
||||
name: client_v2
|
||||
path: client_v2/build
|
||||
|
||||
- name: Set up QEMU
|
||||
uses: docker/setup-qemu-action@v3.2.0
|
||||
|
||||
@@ -324,22 +504,117 @@ jobs:
|
||||
password: ${{ secrets.GITHUB_TOKEN }}
|
||||
|
||||
- name: Build and cache Docker image
|
||||
if: ${{ github.event_name != 'pull_request' }}
|
||||
uses: docker/build-push-action@v6.7.0
|
||||
with:
|
||||
context: .
|
||||
platforms: linux/arm/v7
|
||||
tags: ${{ env.GHCR_IMAGE }}:test-armv7
|
||||
outputs: type=docker,dest=/tmp/spoolman-armv7.tar
|
||||
cache-from: type=registry,ref=ghcr.io/${{ env.GHCR_IMAGE }}:buildcache-armv7
|
||||
cache-to: type=registry,ref=ghcr.io/${{ env.GHCR_IMAGE }}:buildcache-armv7,mode=max
|
||||
|
||||
# Separate build for pull requests since PRs dont have access to store cache
|
||||
- name: Build and cache Docker image (PR)
|
||||
if: ${{ github.event_name == 'pull_request' }}
|
||||
uses: docker/build-push-action@v6.7.0
|
||||
with:
|
||||
context: .
|
||||
platforms: linux/arm/v7
|
||||
tags: ${{ env.GHCR_IMAGE }}:test-armv7
|
||||
outputs: type=docker,dest=/tmp/spoolman-armv7.tar
|
||||
cache-from: type=registry,ref=ghcr.io/${{ env.GHCR_IMAGE }}:buildcache-armv7
|
||||
|
||||
- name: Upload armv7 image artifact
|
||||
uses: actions/upload-artifact@v4.4.0
|
||||
with:
|
||||
name: spoolman-image-armv7
|
||||
path: /tmp/spoolman-armv7.tar
|
||||
#
|
||||
# Smoke test the arm64 and armv7 images under QEMU emulation: boot the
|
||||
# container with no config (defaults to SQLite, no external DB needed) and
|
||||
# confirm /api/v1/health comes up. Emulated boot (interpreter start +
|
||||
# alembic migrations) is slow, hence the generous retry budget.
|
||||
#
|
||||
test-multiarch-smoke:
|
||||
needs: [build-arm64, build-armv7]
|
||||
strategy:
|
||||
fail-fast: false
|
||||
matrix:
|
||||
include:
|
||||
- arch: arm64
|
||||
platform: linux/arm64
|
||||
artifact: spoolman-image-arm64
|
||||
tarball: spoolman-arm64.tar
|
||||
- arch: armv7
|
||||
platform: linux/arm/v7
|
||||
artifact: spoolman-image-armv7
|
||||
tarball: spoolman-armv7.tar
|
||||
runs-on: ubuntu-latest
|
||||
timeout-minutes: 15
|
||||
steps:
|
||||
- name: Set up QEMU
|
||||
uses: docker/setup-qemu-action@v3.2.0
|
||||
|
||||
- name: Download built image
|
||||
uses: actions/download-artifact@v4.1.7
|
||||
with:
|
||||
name: ${{ matrix.artifact }}
|
||||
path: /tmp/spoolman-image
|
||||
|
||||
- name: Load built image
|
||||
run: docker load --input /tmp/spoolman-image/${{ matrix.tarball }}
|
||||
|
||||
- name: Start Spoolman (${{ matrix.arch }}, emulated via QEMU)
|
||||
run: |
|
||||
docker run -d --name spoolman-smoke \
|
||||
--platform ${{ matrix.platform }} \
|
||||
-p 8000:8000 \
|
||||
${{ env.GHCR_IMAGE }}:test-${{ matrix.arch }}
|
||||
|
||||
- name: Wait for /health endpoint
|
||||
run: |
|
||||
for i in $(seq 1 90); do
|
||||
if curl -fsS http://localhost:8000/api/v1/health; then
|
||||
echo
|
||||
echo "Spoolman (${{ matrix.arch }}) is healthy"
|
||||
exit 0
|
||||
fi
|
||||
sleep 5
|
||||
done
|
||||
echo "Spoolman (${{ matrix.arch }}) did not become healthy in time" >&2
|
||||
exit 1
|
||||
|
||||
- name: Dump Spoolman logs on failure
|
||||
if: failure()
|
||||
run: docker logs spoolman-smoke
|
||||
|
||||
- name: Stop Spoolman
|
||||
if: always()
|
||||
run: docker rm -f spoolman-smoke
|
||||
#
|
||||
# Release images GHCR and Docker Hub if tests pass
|
||||
# Don't run this for pull requests
|
||||
#
|
||||
publish-images:
|
||||
if: ${{ github.event_name != 'pull_request' }}
|
||||
needs: [test, build-amd64, build-arm64, build-armv7, style, build-client]
|
||||
needs:
|
||||
[
|
||||
test,
|
||||
test-frontend,
|
||||
test-frontend-v2,
|
||||
test-multiarch-smoke,
|
||||
build-amd64,
|
||||
build-arm64,
|
||||
build-armv7,
|
||||
style,
|
||||
build-client,
|
||||
]
|
||||
runs-on: ubuntu-latest
|
||||
permissions:
|
||||
packages: write
|
||||
# Lets cosign fetch an OIDC token from Github and sign without a private key.
|
||||
id-token: write
|
||||
steps:
|
||||
- name: Checkout
|
||||
uses: actions/checkout@v6
|
||||
@@ -350,6 +625,12 @@ jobs:
|
||||
name: client
|
||||
path: client/dist
|
||||
|
||||
- name: Download client_v2
|
||||
uses: actions/download-artifact@v4.1.7
|
||||
with:
|
||||
name: client_v2
|
||||
path: client_v2/build
|
||||
|
||||
- name: Set up QEMU
|
||||
uses: docker/setup-qemu-action@v3.2.0
|
||||
|
||||
@@ -399,7 +680,15 @@ jobs:
|
||||
echo "GIT_COMMIT=$(git rev-parse --short HEAD)" >> "$GITHUB_ENV"
|
||||
echo "BUILD_DATE=$(date -u +"%Y-%m-%dT%H:%M:%SZ")" >> "$GITHUB_ENV"
|
||||
|
||||
- name: Install cosign
|
||||
uses: sigstore/cosign-installer@v4.1.2
|
||||
with:
|
||||
# Installer v4+ verifies cosign v3 downloads via the Sigstore bundle
|
||||
# format; pin an explicit, current cosign release for reproducibility.
|
||||
cosign-release: v3.1.1
|
||||
|
||||
- name: Build and push Docker images
|
||||
id: build
|
||||
uses: docker/build-push-action@v6.7.0
|
||||
with:
|
||||
context: .
|
||||
@@ -416,6 +705,24 @@ jobs:
|
||||
type=registry,ref=ghcr.io/${{ env.GHCR_IMAGE }}:buildcache-amd64
|
||||
type=registry,ref=ghcr.io/${{ env.GHCR_IMAGE }}:buildcache-arm64
|
||||
type=registry,ref=ghcr.io/${{ env.GHCR_IMAGE }}:buildcache-armv7
|
||||
|
||||
# Sign the manifest by digest rather than by tag: all the tags above point
|
||||
# at the same digest, and the same digest is valid in both registries, so
|
||||
# signing every tag would just repeat the same signature.
|
||||
- name: Sign the published images
|
||||
env:
|
||||
DIGEST: ${{ steps.build.outputs.digest }}
|
||||
TAGS: |
|
||||
${{ steps.meta-ghcr.outputs.tags }}
|
||||
${{ steps.meta-dh.outputs.tags }}
|
||||
run: |
|
||||
echo "${TAGS}" | while read -r tag; do
|
||||
[ -n "${tag}" ] || continue
|
||||
echo "${tag%:*}"
|
||||
done | sort --unique | while read -r repository; do
|
||||
echo "Signing ${repository}@${DIGEST}"
|
||||
cosign sign --yes "${repository}@${DIGEST}"
|
||||
done
|
||||
#
|
||||
# Create Github Release if CI was triggered by a tag
|
||||
#
|
||||
|
||||
@@ -0,0 +1,149 @@
|
||||
name: Guard Translations
|
||||
|
||||
# Translations are managed exclusively through Weblate (https://hosted.weblate.org/projects/spoolman/).
|
||||
# Only the "en" source locale is edited by hand in this repo; every other language is written back
|
||||
# by the Weblate bot. This workflow fails any PR (except Weblate's own) that hand-edits a non-English
|
||||
# translation file, so manual edits don't get overwritten and lost on the next Weblate sync.
|
||||
#
|
||||
# Two clients, two different rules:
|
||||
#
|
||||
# client_v2/locales/ — the ACTIVE translation target. Weblate translates this one.
|
||||
# MODIFY/DELETE of an existing non-English file is blocked; ADDING a
|
||||
# brand-new language file is allowed, because bootstrapping a language
|
||||
# also needs two hand-written code entries (see NEW_LANGUAGE_HOWTO
|
||||
# below) that only a human PR can add.
|
||||
#
|
||||
# client/public/locales/ — the LEGACY React client, CLOSED to translation work. Its Weblate
|
||||
# component is locked, so nothing new arrives from translators and
|
||||
# the files here are frozen at whatever shipped. Any change to a
|
||||
# non-English file is blocked, including adding a new language:
|
||||
# effort spent there is effort not spent on the client users get.
|
||||
|
||||
on:
|
||||
pull_request:
|
||||
types:
|
||||
- opened
|
||||
- synchronize
|
||||
- reopened
|
||||
|
||||
# NOTE: no `paths:` filter on purpose. If this check is marked "Required" in branch
|
||||
# protection, a paths filter would leave PRs that don't touch locales stuck "pending"
|
||||
# forever (the check would never post a status). Instead we always run and pass fast
|
||||
# when nothing offending changed.
|
||||
|
||||
permissions:
|
||||
contents: read
|
||||
|
||||
jobs:
|
||||
guard-translations:
|
||||
runs-on: ubuntu-latest
|
||||
# Skip the guard for Weblate's own translation-sync PRs.
|
||||
if: github.event.pull_request.user.login != 'weblate'
|
||||
steps:
|
||||
- name: Checkout
|
||||
uses: actions/checkout@v4
|
||||
with:
|
||||
fetch-depth: 0
|
||||
|
||||
- name: Check for manual non-English translation changes
|
||||
env:
|
||||
BASE_SHA: ${{ github.event.pull_request.base.sha }}
|
||||
HEAD_SHA: ${{ github.event.pull_request.head.sha }}
|
||||
run: |
|
||||
set -euo pipefail
|
||||
|
||||
# --no-renames turns any rename into a delete + add pair, so a "renamed" (i.e. rewritten)
|
||||
# existing file still trips the delete rule and can't be smuggled through as a fresh add.
|
||||
#
|
||||
# --diff-filter=MD keeps only Modified and Deleted paths: edits to files that ALREADY exist
|
||||
# on the base branch. Added (A) files are handled separately per client below.
|
||||
# Three dots, not two. `git diff A B` compares the two trees as they stand, so every
|
||||
# commit that landed on the base branch after this PR forked shows up as if the PR had
|
||||
# changed it -- a Weblate sync merging to master made unrelated PRs fail with
|
||||
# "client_v2/locales/sv/common.json" in the offending list. `git diff A...B` diffs from
|
||||
# the MERGE BASE instead, which is exactly "what this PR changed" and stays correct no
|
||||
# matter how far master has moved on.
|
||||
edited="$(git diff --no-renames --diff-filter=MD --name-only "$BASE_SHA...$HEAD_SHA" || true)"
|
||||
added="$(git diff --no-renames --diff-filter=A --name-only "$BASE_SHA...$HEAD_SHA" || true)"
|
||||
|
||||
# Active client: edits to existing non-English files are blocked, new languages are fine.
|
||||
offending_v2="$(printf '%s\n' "$edited" \
|
||||
| grep -E '^client_v2/locales/[^/]+/' \
|
||||
| grep -vE '^client_v2/locales/en/' \
|
||||
|| true)"
|
||||
|
||||
# Legacy client: every non-English change is blocked, adds included.
|
||||
offending_legacy="$(printf '%s\n' "$edited" "$added" \
|
||||
| grep -E '^client/public/locales/[^/]+/' \
|
||||
| grep -vE '^client/public/locales/en/' \
|
||||
|| true)"
|
||||
|
||||
if [ -z "$offending_v2" ] && [ -z "$offending_legacy" ]; then
|
||||
echo "No manual edits to non-English translation files detected. ✅"
|
||||
exit 0
|
||||
fi
|
||||
|
||||
echo "::error title=Manual translation edits are not allowed::This PR hand-edits non-English translation files. See the job summary for details."
|
||||
|
||||
{
|
||||
echo "## ❌ Manual translation edits detected"
|
||||
echo ""
|
||||
|
||||
if [ -n "$offending_v2" ]; then
|
||||
echo "### Existing translations edited by hand"
|
||||
echo ""
|
||||
echo "This PR modifies or deletes existing non-English translation files:"
|
||||
echo ""
|
||||
echo '```'
|
||||
echo "$offending_v2"
|
||||
echo '```'
|
||||
echo ""
|
||||
echo "Every language except the English source (\`client_v2/locales/en/common.json\`) is"
|
||||
echo "managed **exclusively through Weblate**. A manual edit here will be **silently"
|
||||
echo "overwritten and lost** the next time Weblate syncs — so we don't accept them."
|
||||
echo ""
|
||||
echo "**What to do instead:**"
|
||||
echo ""
|
||||
echo "- **To fix or improve a translation:** contribute it through Weblate at"
|
||||
echo " <https://hosted.weblate.org/projects/spoolman/>. It's free, requires no coding,"
|
||||
echo " and your change flows back into the repo automatically."
|
||||
echo "- **To add or change a user-facing string:** edit **only**"
|
||||
echo " \`client_v2/locales/en/common.json\`. Weblate picks up the new keys and exposes"
|
||||
echo " them to translators. Revert your changes to every other language and push again."
|
||||
echo "- **To add a brand-new language:** that IS allowed here — new files aren't blocked,"
|
||||
echo " only edits to existing ones. A new language needs two code entries as well:"
|
||||
echo " the locale code in \`client_v2/project.inlang/settings.json\` (so paraglide compiles"
|
||||
echo " it) and an endonym in \`client_v2/src/lib/i18n/languages.ts\` (so it appears in the"
|
||||
echo " language picker). Without both, the translation file is built but unreachable."
|
||||
echo ""
|
||||
fi
|
||||
|
||||
if [ -n "$offending_legacy" ]; then
|
||||
echo "### Legacy client translations are closed"
|
||||
echo ""
|
||||
echo "This PR changes non-English translation files of the **legacy React client**:"
|
||||
echo ""
|
||||
echo '```'
|
||||
echo "$offending_legacy"
|
||||
echo '```'
|
||||
echo ""
|
||||
echo "\`client/public/locales/\` belongs to the old client, which is only kept around for"
|
||||
echo "the \`SPOOLMAN_LEGACY_CLIENT\` fallback. Its Weblate component is **locked** and its"
|
||||
echo "translations are frozen — nothing here reaches the UI that users get by default."
|
||||
echo ""
|
||||
echo "**Translate \`client_v2\` instead:** the same strings, in the client everyone actually"
|
||||
echo "sees, at <https://hosted.weblate.org/projects/spoolman/>."
|
||||
echo ""
|
||||
fi
|
||||
|
||||
echo "> If you believe a file genuinely needs a manual change (e.g. a structural fix),"
|
||||
echo "> please explain it in a PR comment so a maintainer can review."
|
||||
} >> "$GITHUB_STEP_SUMMARY"
|
||||
|
||||
echo ""
|
||||
echo "Offending files:"
|
||||
# Plain `if` rather than `[ -n … ] && echo …`: under `set -e` a false test makes the
|
||||
# whole && list return non-zero and abort the step, which would skip the second echo.
|
||||
if [ -n "$offending_v2" ]; then echo "$offending_v2"; fi
|
||||
if [ -n "$offending_legacy" ]; then echo "$offending_legacy"; fi
|
||||
exit 1
|
||||
@@ -22,7 +22,7 @@ jobs:
|
||||
issue-manager:
|
||||
runs-on: ubuntu-latest
|
||||
steps:
|
||||
- uses: tiangolo/issue-manager@0.5.1
|
||||
- uses: tiangolo/issue-manager@0.8.1
|
||||
with:
|
||||
token: ${{ secrets.GITHUB_TOKEN }}
|
||||
config: >
|
||||
@@ -32,7 +32,7 @@ jobs:
|
||||
"message": "It seems the issue was answered, closing this now."
|
||||
},
|
||||
"waiting": {
|
||||
"delay": 60400,
|
||||
"delay": 604800,
|
||||
"message": "Closing after 7 days of waiting for the additional info requested."
|
||||
}
|
||||
}
|
||||
@@ -38,13 +38,13 @@ jobs:
|
||||
- name: Install node
|
||||
uses: actions/setup-node@v4.0.3
|
||||
with:
|
||||
node-version: '20'
|
||||
node-version: '24'
|
||||
|
||||
- name: Bump version
|
||||
run: |
|
||||
git config --global user.name "${GITHUB_ACTOR}"
|
||||
git config --global user.email "${GITHUB_ACTOR_ID}+${GITHUB_ACTOR}@users.noreply.github.com"
|
||||
uv run bump2version ${{ github.event.inputs.bump }}
|
||||
uv run poe bump ${{ github.event.inputs.bump }}
|
||||
|
||||
- name: Push
|
||||
run: |
|
||||
|
||||
@@ -0,0 +1,93 @@
|
||||
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 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:
|
||||
pull_request_target:
|
||||
types:
|
||||
- opened
|
||||
- reopened
|
||||
- synchronize
|
||||
|
||||
# contents+pull-requests write let the built-in GITHUB_TOKEN enable auto-merge and perform the squash
|
||||
# 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.
|
||||
# pull_request_target runs in the base-repo context (so GITHUB_TOKEN has write access even for
|
||||
# branch PRs), and this job is safe under it because it never checks out or executes PR code —
|
||||
# it only calls the GitHub API to enable auto-merge.
|
||||
if: github.event.pull_request.user.login == 'weblate'
|
||||
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 this step, 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, so pull_request_target is safe.
|
||||
#
|
||||
# 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 PR only changes locale JSON files
|
||||
env:
|
||||
GH_TOKEN: ${{ secrets.GITHUB_TOKEN }}
|
||||
REPO: ${{ github.repository }}
|
||||
PR_NUMBER: ${{ github.event.pull_request.number }}
|
||||
run: |
|
||||
set -euo pipefail
|
||||
|
||||
files="$(gh api --paginate "repos/${REPO}/pulls/${PR_NUMBER}/files" --jq '.[].filename')"
|
||||
|
||||
if [ -z "$files" ]; then
|
||||
echo "::error title=Empty diff::Weblate PR reports no changed files; refusing to auto-merge."
|
||||
exit 1
|
||||
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 touches files outside the locale trees; not auto-merging."
|
||||
{
|
||||
echo "## ❌ Auto-merge blocked: out-of-scope changes"
|
||||
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"
|
||||
exit 1
|
||||
fi
|
||||
|
||||
echo "All $(printf '%s\n' "$files" | wc -l) changed file(s) are locale JSON. Safe to auto-merge."
|
||||
|
||||
- name: Enable auto-merge
|
||||
env:
|
||||
GH_TOKEN: ${{ secrets.GITHUB_TOKEN }}
|
||||
PR_URL: ${{ github.event.pull_request.html_url }}
|
||||
# Squash is the only merge method the repo and the master ruleset allow.
|
||||
run: gh pr merge --auto --squash "$PR_URL"
|
||||
+8
-5
@@ -15,7 +15,6 @@ dist/
|
||||
downloads/
|
||||
eggs/
|
||||
.eggs/
|
||||
lib/
|
||||
lib64/
|
||||
parts/
|
||||
sdist/
|
||||
@@ -26,7 +25,8 @@ share/python-wheels/
|
||||
.installed.cfg
|
||||
*.egg
|
||||
MANIFEST
|
||||
requirements.txt
|
||||
# requirements.txt is committed (generated from uv on release) for bare-metal /
|
||||
# Moonraker update_manager consumers. See spoolman/bump.py.
|
||||
|
||||
# PyInstaller
|
||||
# Usually these files are written by a python script from a template
|
||||
@@ -201,7 +201,10 @@ $RECYCLE.BIN/
|
||||
|
||||
### VisualStudioCode ###
|
||||
.vscode/
|
||||
|
||||
data/
|
||||
devdata
|
||||
.pdm-python
|
||||
.history
|
||||
.history
|
||||
.claude
|
||||
|
||||
# playwright-cli debug artifacts
|
||||
.playwright-cli/
|
||||
+27
-16
@@ -1,11 +1,11 @@
|
||||
FROM ghcr.io/astral-sh/uv:python3.14-bookworm-slim AS python-builder
|
||||
FROM python:3.14-slim-bookworm AS python-builder
|
||||
|
||||
ENV UV_COMPILE_BYTECODE=1
|
||||
ENV UV_LINK_MODE=copy
|
||||
ENV UV_NO_DEV=1
|
||||
ENV UV_PYTHON_DOWNLOADS=0
|
||||
|
||||
# Install dependencies
|
||||
# Install system dependencies
|
||||
RUN apt-get update && apt-get install -y \
|
||||
g++ \
|
||||
python3-dev \
|
||||
@@ -14,12 +14,8 @@ RUN apt-get update && apt-get install -y \
|
||||
&& apt-get clean \
|
||||
&& rm -rf /var/lib/apt/lists/*
|
||||
|
||||
# Add local user so we don't run as root
|
||||
# RUN groupmod -g 1000 users \
|
||||
# && useradd -u 911 -U app \
|
||||
# && usermod -G users app
|
||||
|
||||
# ENV PATH="/home/app/.local/bin:${PATH}"
|
||||
# Install UV
|
||||
RUN pip install --no-cache-dir uv
|
||||
|
||||
# Install dependencies
|
||||
WORKDIR /home/app/spoolman
|
||||
@@ -28,13 +24,28 @@ RUN --mount=type=cache,target=/root/.cache/uv \
|
||||
--mount=type=bind,source=pyproject.toml,target=pyproject.toml \
|
||||
uv sync --locked --no-install-project
|
||||
|
||||
# Copy and install app
|
||||
COPY --chown=app:app migrations /home/app/spoolman/migrations
|
||||
COPY --chown=app:app spoolman /home/app/spoolman/spoolman
|
||||
COPY --chown=app:app alembic.ini README.md uv.lock pyproject.toml /home/app/spoolman/
|
||||
# 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
|
||||
|
||||
# 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.
|
||||
RUN if [ "$(uname -m)" = "armv7l" ]; then \
|
||||
apt-get update && apt-get install -y --no-install-recommends patchelf \
|
||||
&& patchelf --add-needed libstdc++.so.6 \
|
||||
"$(find /home/app/spoolman/.venv -name '_greenlet*.so')" \
|
||||
&& apt-get clean && rm -rf /var/lib/apt/lists/*; \
|
||||
fi
|
||||
|
||||
FROM python:3.14-slim-bookworm AS python-runner
|
||||
|
||||
LABEL org.opencontainers.image.source=https://github.com/Donkie/Spoolman
|
||||
@@ -48,14 +59,14 @@ RUN apt-get update && apt-get install -y \
|
||||
&& rm -rf /var/lib/apt/lists/*
|
||||
|
||||
# Add local user so we don't run as root
|
||||
RUN groupmod -g 1000 users \
|
||||
&& useradd -u 1000 -U app \
|
||||
&& usermod -G users app \
|
||||
RUN useradd -u 1000 -U app \
|
||||
&& mkdir -p /home/app/.local/share/spoolman \
|
||||
&& chown -R app:app /home/app/.local/share/spoolman
|
||||
|
||||
# Copy built client
|
||||
# Copy built clients. The new Svelte client (client_v2) is served by default; the
|
||||
# legacy React client (client/dist) is kept for the SPOOLMAN_LEGACY_CLIENT fallback.
|
||||
COPY --chown=app:app ./client/dist /home/app/spoolman/client/dist
|
||||
COPY --chown=app:app ./client_v2/build /home/app/spoolman/client_v2/build
|
||||
|
||||
# Copy built app
|
||||
COPY --chown=app:app --from=python-builder /home/app/spoolman /home/app/spoolman
|
||||
|
||||
@@ -20,8 +20,9 @@ Spoolman is a self-hosted web service designed to help you efficiently manage yo
|
||||
* **Central Filament Database**: A community-supported database of manufacturers and filaments simplify adding new spools to your inventory. Contribute by heading to [SpoolmanDB](https://github.com/Donkie/SpoolmanDB).
|
||||
* **Web-Based Client**: Spoolman includes a built-in web client that lets you manage data effortlessly:
|
||||
* View, create, edit, and delete filament data.
|
||||
* Search, group and filter your inventory by manufacturer, material, location and more.
|
||||
* Add custom fields to tailor information to your specific needs.
|
||||
* Print labels with QR codes for easy spool identification and tracking.
|
||||
* Design and print labels with QR codes for easy spool identification and tracking.
|
||||
* Contribute to its translation into 18 languages via [Weblate](https://hosted.weblate.org/projects/spoolman/).
|
||||
* **Database Support**: SQLite, PostgreSQL, MySQL, and CockroachDB.
|
||||
* **Multi-Printer Management**: Handles spool updates from several printers simultaneously.
|
||||
@@ -32,9 +33,26 @@ Spoolman is a self-hosted web service designed to help you efficiently manage yo
|
||||
* [OctoPrint](https://github.com/mdziekon/octoprint-spoolman)
|
||||
* [OctoEverywhere](https://octoeverywhere.com/spoolman?source=github_spoolman)
|
||||
* [Home Assistant](https://github.com/Disane87/spoolman-homeassistant)
|
||||
* [MCP Server](https://github.com/Disane87/spoolman-mcp) - Manage your filament inventory through AI assistants like Claude using the Model Context Protocol
|
||||
|
||||
**Web client preview:**
|
||||

|
||||

|
||||
|
||||
<table>
|
||||
<tr>
|
||||
<td width="50%"><img alt="The Spoolman dashboard, showing spools as draggable cards grouped by storage location" src=".github/media/dashboard-screenshot.png"></td>
|
||||
<td width="50%"><img alt="The Spoolman label designer, showing a 50 by 25 mm spool label with a QR code, filament name and colour swatch" src=".github/media/label-designer-screenshot.png"></td>
|
||||
</tr>
|
||||
<tr>
|
||||
<td align="center"><sub>Dashboard — spools as cards, grouped by location or any other field. Drag one to move it.</sub></td>
|
||||
<td align="center"><sub>Label designer — QR labels built from any spool, filament or vendor field.</sub></td>
|
||||
</tr>
|
||||
</table>
|
||||
|
||||
## Installation
|
||||
Please see the [Installation page on the Wiki](https://github.com/Donkie/Spoolman/wiki/Installation) for details how to install Spoolman.
|
||||
|
||||
If the new client misbehaves on your setup, set `SPOOLMAN_LEGACY_CLIENT=TRUE` to go back to
|
||||
the previous one. Both ship in every release and talk to the same API, so your data is
|
||||
untouched either way — but please [report the problem](https://github.com/Donkie/Spoolman/issues)
|
||||
so it can be fixed.
|
||||
@@ -18,6 +18,8 @@
|
||||
.env.development.local
|
||||
.env.test.local
|
||||
.env.production.local
|
||||
# Generated at build time (CI and tests_frontend/run.py) — never committed
|
||||
.env.production
|
||||
|
||||
npm-debug.log*
|
||||
yarn-debug.log*
|
||||
|
||||
Generated
+1858
-1686
File diff suppressed because it is too large.
Load diff
+8
-3
@@ -1,8 +1,8 @@
|
||||
{
|
||||
"name": "spoolman-ui",
|
||||
"version": "0.22.1",
|
||||
"version": "0.26.0",
|
||||
"engines": {
|
||||
"node": "20.x"
|
||||
"node": "^20.19 || ^22.12 || >=24"
|
||||
},
|
||||
"private": true,
|
||||
"type": "module",
|
||||
@@ -30,10 +30,15 @@
|
||||
"react-i18next": "^16.5.1",
|
||||
"react-router": "^7.11.0",
|
||||
"react-to-print": "^3.2.0",
|
||||
"uuid": "^13.0.0",
|
||||
"uuid": "^14.0.0",
|
||||
"vite-plugin-svgr": "^4.5.0",
|
||||
"zustand": "^5.0.9"
|
||||
},
|
||||
"overrides": {
|
||||
"@ant-design/pro-layout": {
|
||||
"path-to-regexp": "^8.4.0"
|
||||
}
|
||||
},
|
||||
"devDependencies": {
|
||||
"@eslint/js": "^9.39.2",
|
||||
"@refinedev/cli": "^2.16.50",
|
||||
|
||||
@@ -351,7 +351,7 @@
|
||||
"kofi": "Příspěvek autorovi na Ko-fi",
|
||||
"home": {
|
||||
"home": "Domů",
|
||||
"description": "Vypadá to, že jste ještě nepřidali žádné cívky. Úvodní nápovědu najdete na stránce <helpPageLink>Help page</helpPageLink> .",
|
||||
"description": "Vypadá to, že jste ještě nepřidali žádné cívky. Úvodní nápovědu najdete na stránce <helpPageLink>Nápověda</helpPageLink> .",
|
||||
"welcome": "Vítejte ve vaší instanci Spoolman!"
|
||||
},
|
||||
"settings": {
|
||||
|
||||
@@ -3,22 +3,37 @@
|
||||
"qrcode": {
|
||||
"extruderTemp": "ET: {{temp}}",
|
||||
"showSpoolWeight": "Spole vægt",
|
||||
"showContent": "Print label",
|
||||
"showContent": "Print etiket",
|
||||
"showVendorComment": "Sælger kommentarer",
|
||||
"spoolWeight": "Spole vægt: {{weight}}",
|
||||
"showTemperatures": "Temperaturer",
|
||||
"showVendor": "Sælger",
|
||||
"showSpoolComment": "Spole kommentarer",
|
||||
"textSize": "Indholdstekst størrelse",
|
||||
"title": "QR kode printer",
|
||||
"textSize": "Etikette tekststørrelse",
|
||||
"title": "Etiketprint",
|
||||
"showSpoolmanIcon": "Vis Spoolman logo",
|
||||
"showLotNr": "Gruppe nr",
|
||||
"bedTemp": "BT: {{temp}}",
|
||||
"lotNr": "Gruppe nr: {{lot}}",
|
||||
"showFilamentComment": "Filament kommentarer",
|
||||
"button": "Print QR koder",
|
||||
"template": "Skabelon",
|
||||
"templateHelp": "Brug {} til at indsætte værdier for spolen som tekst. For eksempen vil {id} blive erstattet med spolens id, eller {filament.material} vil blive erstattet med materialet på spolen. Omgiv teksten med dobbelte asterisk ** for at gøre teksten fed. Klik på knappen for at vise en liste med mulige tags."
|
||||
"button": "Print etiketter",
|
||||
"template": "Etiketskabelon",
|
||||
"templateHelp": "Brug {} til at indsætte værdier for spolen som tekst. For eksempel vil {id} blive erstattet med spolens id, eller {filament.material} vil blive erstattet med materialet på spolen. Hvis en værdi mangler, vil den blive erstattet med \"?\". Et andet set af {} kan bruges for at fjerne dette. Derudover vil al tekst mellem sættene af {} blive fjernet, hvis værdien mangler. For eksemel, {Lot Nr: {lot_nr}} vil kun vise etiketten, hvis spolen har et partinummer (Lot Nr). Omgiv teksten med dobbelte asterisk ** for at gøre teksten fed. Klik på knappen for at vise en liste med mulige tags.",
|
||||
"useHTTPUrl": {
|
||||
"options": {
|
||||
"default": "Standard",
|
||||
"url": "Webadresse"
|
||||
},
|
||||
"preview": "Forhåndsvisning:",
|
||||
"tooltip": "Vil bruge proprietært link, der kun vil virke, hvis skannet med Spoolmans skanningsfunktion (standard). Webadressen bruger enten den basis-webadresse, specificeret i indstillinger, eller den nuværende sides webadresse, hvis ikke indstillet.",
|
||||
"label": "QR-kode link"
|
||||
},
|
||||
"showQRCodeMode": {
|
||||
"withIcon": "Med ikon",
|
||||
"no": "Nej",
|
||||
"simple": "Simpel"
|
||||
},
|
||||
"showQRCode": "Print QR-kode"
|
||||
},
|
||||
"generic": {
|
||||
"printerMarginBottom": "Safe-Zone bund",
|
||||
@@ -36,14 +51,14 @@
|
||||
"marginRight": "Højre margen",
|
||||
"printerMarginRight": "Safe-Zone højre",
|
||||
"helpPrinterMargin": "\"Safe-Zone\" bør indstilles til hvor tæt på kanten af papiret din printer kan printe. Ændringer her vil IKKE have indflydelse på hele layoutet.",
|
||||
"previewScale": "Visnings størrelse",
|
||||
"helpMargin": "Margener bør indstilles til at matche din printer og dit papir. Ændringer her vil have indflydelse på hele layoutet.",
|
||||
"previewScale": "Visningsstørrelse",
|
||||
"helpMargin": "Margener bør indstilles til at matche din printer og papir. Ændringer her vil have indflydelse på hele layoutet.",
|
||||
"marginTop": "Top margen",
|
||||
"skipItems": "Spring over",
|
||||
"layoutSettings": "Layout indstillinger",
|
||||
"paperSize": "Papir størrelse",
|
||||
"layoutSettings": "Layoutindstillinger",
|
||||
"paperSize": "Papirstørrelse",
|
||||
"columns": "Kolonner",
|
||||
"description": "Redigér nedenstående indstillinger for at opnå det ønskede layout. Husk på at printere og OS kan tilføje dets egne margener og skalering, så det kan kræve et par forsøg før alt er korrekt. Test på et stykke almindeligt papir før du udskriver på labels.",
|
||||
"description": "Redigér nedenstående indstillinger for at opnå det ønskede layout. Husk på at printere og dit operativsystem kan tilføje deres egne margener og skalering, så det kan kræve et par forsøg, før alt er korrekt. Test på et stykke almindeligt papir, før du udskriver på etiketter.",
|
||||
"marginBottom": "Bund margen",
|
||||
"horizontalSpacing": "Horisontal afstand",
|
||||
"marginLeft": "Venstre margen",
|
||||
@@ -51,23 +66,26 @@
|
||||
"printerMarginLeft": "Safe-Zone venstre",
|
||||
"dimensions": "Dimensioner",
|
||||
"print": "Udskriv",
|
||||
"settings": "Indstillinger",
|
||||
"settings": "Forudindstillinger",
|
||||
"defaultSettings": "Standard",
|
||||
"addSettings": "Tilføj ny indstilling",
|
||||
"addSettings": "Tilføj ny forudindstilling",
|
||||
"newSetting": "Ny",
|
||||
"deleteSettings": "Slet nuværende indstilling",
|
||||
"deleteSettingsConfirm": "Er du sikker på du vil slette denne indstilling?",
|
||||
"settingsName": "Indstillingsnavn",
|
||||
"itemCopies": "Kopier"
|
||||
"deleteSettings": "Slet nuværende forudindstilling",
|
||||
"deleteSettingsConfirm": "Er du sikker på, at du vil slette denne forudindstilling?",
|
||||
"settingsName": "Forudindstillingsnavn",
|
||||
"itemCopies": "Kopier",
|
||||
"duplicateSettings": "Duplikér",
|
||||
"saveSetting": "Gem forudindstillinger",
|
||||
"saveAsImage": "Gem som Billede"
|
||||
},
|
||||
"spoolSelect": {
|
||||
"selectedTotal_one": "{{count}} spole valgt",
|
||||
"selectedTotal_other": "{{count}} spoler valgt",
|
||||
"description": "Vælg spoler der skal printes QR koder til.",
|
||||
"description": "Vælg spoler, der skal printes etiketter til.",
|
||||
"showArchived": "Vis arkiverede",
|
||||
"title": "Vælg spoler",
|
||||
"selectAll": "Vælg alle/ingen",
|
||||
"noSpoolsSelected": "Du har ikke valgt nogle spoler."
|
||||
"noSpoolsSelected": "Du har ikke valgt nogen spoler."
|
||||
}
|
||||
},
|
||||
"documentTitle": {
|
||||
@@ -99,15 +117,18 @@
|
||||
},
|
||||
"help": {
|
||||
"list": "Hjælp | Spoolman"
|
||||
},
|
||||
"locations": {
|
||||
"list": "Lokationer | Spoolman"
|
||||
}
|
||||
},
|
||||
"spool": {
|
||||
"fields": {
|
||||
"measured_weight": "Målt vægt",
|
||||
"last_used": "Sidst brugt",
|
||||
"last_used": "Sidst anvendt",
|
||||
"material": "Materiale",
|
||||
"weight_to_use": "Vægt",
|
||||
"lot_nr": "Gruppe nr",
|
||||
"lot_nr": "Partinummer",
|
||||
"filament_name": "Filament",
|
||||
"comment": "Kommentar",
|
||||
"filament": "Filament",
|
||||
@@ -116,7 +137,7 @@
|
||||
"archived": "Arkiveret",
|
||||
"remaining_length": "Resterende længde",
|
||||
"registered": "Registreret",
|
||||
"first_used": "Først brugt",
|
||||
"first_used": "Først anvendt",
|
||||
"used_weight": "Brugt vægt",
|
||||
"id": "ID",
|
||||
"remaining_weight": "Resterende vægt",
|
||||
@@ -133,34 +154,45 @@
|
||||
"create": "Opret spole",
|
||||
"clone": "Klon spole",
|
||||
"show_title": "[Spole #{{id}}] {{name}}",
|
||||
"list": "Spoler"
|
||||
"list": "Spoler",
|
||||
"adjust": "Tilpas spolefilament"
|
||||
},
|
||||
"form": {
|
||||
"spool_updated": "Denne spole er blevet redigeret af nogen/noget andet siden du åbnede denne side. Hvis du gemmer overskrives disse ændringer!",
|
||||
"new_location_prompt": "Indtast ny placering"
|
||||
"new_location_prompt": "Indtast ny placering",
|
||||
"measurement_type_label": "Måletype",
|
||||
"adjust_filament_value": "Fjern mængde",
|
||||
"measurement_type": {
|
||||
"weight": "Vægt",
|
||||
"length": "Længde"
|
||||
},
|
||||
"adjust_filament_help": "Her kan du direkte tilføje eller fjerne filament fra spolen. En positiv værdi vil fjerne filament, en negativ værdi vil tilføje det."
|
||||
},
|
||||
"fields_help": {
|
||||
"used_weight": "Hvor meget filament er der brugt fra spolen. En ny spole bør have 0g brugt.",
|
||||
"weight_to_use": "Vælg hvilken vægt der skal angives. Målt vægt er kun tilgængelig hvis der er indstillet en spole vægt for det valgte filament.",
|
||||
"measured_weight": "Hvor meget filament OG spole vejer.",
|
||||
"lot_nr": "Producentens \"batchnummer\". Kan bruges til at sikre ensartede farver ved brug af flere ruller.",
|
||||
"remaining_weight": "Hvor meget filament er der tilbage på spolen. For en ny spole bør dette matches spolens vægt.",
|
||||
"location": "Placering af spolen. Hvis du har flere lokationer.",
|
||||
"price": "Pris for en fuld spole. Hvis ikke indstillet, vil prisen bliver estimeret.",
|
||||
"external_filament": "Du har valgt et Filament fra den eksterne database, Et Filament (og muligvis en Producent) vil blive oprettet automatisk når du gemmer denne spole. Dette kan oprette duplikerede objekter, hvis du allerede har dette filament oprettet.",
|
||||
"initial_weight": "Startvægten af filament på spolen (nettovægt). Bruger filamentets standardvægt hvis ikke angivet.",
|
||||
"spool_weight": "Vægten af spolen når den er tom. Et tomt felt vil bruge værdien fra Filament eller Producent."
|
||||
"weight_to_use": "Vælg hvilken vægt der skal angives. Målt vægt er kun tilgængelig, hvis der er indstillet en spolevægt for det valgte filament.",
|
||||
"measured_weight": "Hvor meget filament og spole vejer.",
|
||||
"lot_nr": "Producentens \"batch/partinummer\". Kan bruges til at sikre ensartede farver ved brug af flere ruller.",
|
||||
"remaining_weight": "Hvor meget filament er der tilbage på spolen. For en ny spole bør dette matche spolens vægt.",
|
||||
"location": "Placering af spolen, hvis du opbevarer spoler flere steder.",
|
||||
"price": "Pris for en fuld spole. Hvis ikke indstillet, vil prisen i stedet blive antaget.",
|
||||
"external_filament": "Du har valgt et filament fra den eksterne database. Et filament (og muligvis en producent) vil blive oprettet automatisk, når du gemmer denne spole. Dette kan skabe duplikerede objekter, hvis du allerede har oprettet dette filament.",
|
||||
"initial_weight": "Startvægten af filament på spolen (nettovægt). Bruger filamentets standardvægt, hvis ikke angivet.",
|
||||
"spool_weight": "Vægten af spolen når den er tom. Et tomt felt vil bruge værdien fra filament eller producent."
|
||||
},
|
||||
"spool": "Spoler",
|
||||
"messages": {
|
||||
"archive": "Er du sikker på du vil arkivere denne spole?"
|
||||
},
|
||||
"formats": {
|
||||
"last_used": "Sidst anvendt {{date}}"
|
||||
}
|
||||
},
|
||||
"buttons": {
|
||||
"create": "Opret",
|
||||
"save": "Gem",
|
||||
"show": "Vis",
|
||||
"filter": "Filter",
|
||||
"filter": "Filtrér",
|
||||
"cancel": "Annuller",
|
||||
"edit": "Redigér",
|
||||
"showArchived": "Vis arkiverede",
|
||||
@@ -175,48 +207,49 @@
|
||||
"notAccessTitle": "Du har ikke tilladelse til at tilgå",
|
||||
"hideArchived": "Skjul arkiverede",
|
||||
"clearFilters": "Ryd filtre",
|
||||
"unArchive": "Fjern fra arkiv",
|
||||
"unArchive": "Gendan arkiv",
|
||||
"clone": "Klon",
|
||||
"clear": "Ryd",
|
||||
"saveAndAdd": "Gem og Tilføj"
|
||||
"saveAndAdd": "Gem og Tilføj",
|
||||
"continue": "Fortsæt"
|
||||
},
|
||||
"filament": {
|
||||
"fields_help": {
|
||||
"name": "Filament navn, for at adskille dette filament fra andre fra samme producent. Kan for eksempel indeholde farven.",
|
||||
"article_number": "f.eks. EAN, UPC osv.",
|
||||
"name": "Filamentnavn, for at adskille dette filament fra andre fra samme producent. Kan for eksempel indeholde farven.",
|
||||
"article_number": "F.eks. EAN, UPC, e.l.",
|
||||
"spool_weight": "Vægten af en tom spole. Bruges til at angive den målte vægt af en spole.",
|
||||
"price": "Pris for en ny spole.",
|
||||
"weight": "Filamentets vægt på en ny spole (Netto vægt). Dette bør ikke inkludere vægten af selve spolen, kun filamentet. Det er som regel den angivne vægt på pakken.",
|
||||
"material": "f.eks. PLA, ABS, PETG osv.",
|
||||
"multi_color_direction": "Filamenter kan have flere farver på to måder: Enten koaksialt, som 2- & 3-farvede filamenter med vedvarende flerfarvethed, eller gennem længdeværts ændringer, som regnbuefilamenter, hvor farven skifter undervejs på spolen."
|
||||
"weight": "Filamentets vægt på en ny spole (nettovægt). Dette bør ikke inkludere vægten af selve spolen, kun filamentet. Det er som regel den angivne vægt på pakken.",
|
||||
"material": "F.eks. PLA, ABS, PETG, m.m.",
|
||||
"multi_color_direction": "Filamenter kan have flere farver på to måder: Enten koaksialt, som 2- & 3-farvede filamenter med vedvarende flerfarvethed, eller gennem langsgående ændringer, som regnbuefilamenter, hvor farven skifter undervejs på spolen."
|
||||
},
|
||||
"fields": {
|
||||
"material": "Materiale",
|
||||
"vendor_name": "Producent",
|
||||
"settings_extruder_temp": "Extruder temperatur",
|
||||
"settings_extruder_temp": "Ekstrudertemperatur",
|
||||
"comment": "Kommentar",
|
||||
"diameter": "Diameter",
|
||||
"weight": "Vægt",
|
||||
"spool_weight": "Spole vægt",
|
||||
"spool_weight": "Spolevægt",
|
||||
"registered": "Registreret",
|
||||
"name": "Navn",
|
||||
"price": "Pris",
|
||||
"settings_bed_temp": "Bed temperatur",
|
||||
"settings_bed_temp": "Printpladetemperatur",
|
||||
"vendor": "Producent",
|
||||
"density": "Massefylde",
|
||||
"id": "ID",
|
||||
"color_hex": "Farve",
|
||||
"article_number": "Produkt nummer",
|
||||
"article_number": "Produktnummer",
|
||||
"spools": "Vis spoler",
|
||||
"external_id": "Eksternt ID",
|
||||
"longitudinal": "Længdeværts",
|
||||
"longitudinal": "Langsgående",
|
||||
"multi_color": "Flerfarvet",
|
||||
"coaxial": "Koaksialt",
|
||||
"single_color": "Enkeltfarvet"
|
||||
},
|
||||
"titles": {
|
||||
"clone": "Klon filament",
|
||||
"show_title": "[Filament # {{id}}] {{name}}",
|
||||
"show_title": "[Filament #{{id}}] {{name}}",
|
||||
"show": "Vis filament",
|
||||
"create": "Opret filament",
|
||||
"edit": "Redigér filament",
|
||||
@@ -224,8 +257,8 @@
|
||||
},
|
||||
"form": {
|
||||
"filament_updated": "Dette filament er blevet redigeret af nogen/noget andet siden du åbnede denne side. Hvis du gemmer overskrives disse ændringer!",
|
||||
"import_external": "Importér fra Eksternt",
|
||||
"import_external_description": "Vælg et filament på listen for automatisk at udfylde formularen. Dette vil overskrive alle data du allerede har indtastet i formularen. <br><br> En Producent vil blive oprettet automatisk hvis nødvendigt, når du klikker OK."
|
||||
"import_external": "Importér fra ekstern kilde",
|
||||
"import_external_description": "Vælg et filament på listen, for automatisk at udfylde detaljerne i formularen. Dette vil overskrive al data, du allerede har indtastet i formularen. <br><br> En producent vil blive oprettet automatisk, hvis nødvendigt, når du klikker OK."
|
||||
},
|
||||
"filament": "Filamenter",
|
||||
"buttons": {
|
||||
@@ -265,28 +298,28 @@
|
||||
}
|
||||
},
|
||||
"scanner": {
|
||||
"title": "QR kode skanner",
|
||||
"title": "QR-kode skanner",
|
||||
"error": {
|
||||
"insecureContext": "Denne side er ikke sikret med HTTPS.",
|
||||
"notReadable": "Kameraet kan ikke indlæses.",
|
||||
"notAllowed": "Du har ikke tilladt adgang til kameraet.",
|
||||
"notAllowed": "Du har ikke givet adgang til kameraet.",
|
||||
"unknown": "En ukendt fejl opstod. {{error}}",
|
||||
"notFound": "Intet kamera fundet.",
|
||||
"streamApiNotSupported": "Denne browser understøtter ikke MediaStream API'et."
|
||||
},
|
||||
"description": "Skan en Spoolman QR kode for at se detaljer om spolen."
|
||||
"description": "Skan en Spoolman QR-kode for at se detaljer om spolen."
|
||||
},
|
||||
"notifications": {
|
||||
"deleteSuccess": "Sletning af {{resource}} lykkedes",
|
||||
"error": "Fejl (status kode: {{statusCode}})",
|
||||
"editError": "Fejl ved redigering af {{resource}} (status kode:{{statusCode}}",
|
||||
"deleteSuccess": "Sletning af {{resource}} var succesfuld(t)",
|
||||
"error": "Fejl (statuskode: {{statusCode}})",
|
||||
"editError": "Fejl ved redigering af {{resource}} (statuskode:{{statusCode}}",
|
||||
"undoable": "Du har {{seconds}} sekunder til at fortryde.",
|
||||
"importProgress": "Importerer: {{processed}}/{{total}}",
|
||||
"createError": "Der var en fejl under oprettelse af {{resource}} (status kode: {{statusCode}})",
|
||||
"createError": "Der var en fejl under oprettelsen af {{resource}} (statuskode: {{statusCode}})",
|
||||
"success": "Succes",
|
||||
"editSuccess": "Redigering af {{resource}} lykkedes",
|
||||
"deleteError": "Fejl ved sletning af {{resource}} (status kode: {{statusCode}})",
|
||||
"createSuccess": "Oprettelse af {{resource}} lykkedes",
|
||||
"editSuccess": "Redigering af {{resource}} var succesfuld(t)",
|
||||
"deleteError": "Fejl ved sletning af {{resource}} (statuskode: {{statusCode}})",
|
||||
"createSuccess": "Oprettelse af {{resource}} var succesfuld(t)",
|
||||
"saveSuccessful": "Gemt!",
|
||||
"validationError": "Kunne ikke gennemføres: {{error}}"
|
||||
},
|
||||
@@ -297,7 +330,7 @@
|
||||
"table": {
|
||||
"actions": "Handlinger"
|
||||
},
|
||||
"warnWhenUnsavedChanges": "Er du sikker på du ønsker at forlade? Du har ændringer der ikke er gemt.",
|
||||
"warnWhenUnsavedChanges": "Er du sikker på du ønsker at gå? Du har ændringer der ikke er gemt.",
|
||||
"loading": "Indlæser",
|
||||
"dashboard": {
|
||||
"title": "Kontrolpanel"
|
||||
@@ -307,16 +340,18 @@
|
||||
},
|
||||
"help": {
|
||||
"resources": {
|
||||
"vendor": "Firmaerne der laver filamentet.",
|
||||
"filament": "Filament mærker. De har værdier såsom Navn, Materiale, Farve, Diameter m.fl.",
|
||||
"vendor": "Firmaerne, der laver filamentet.",
|
||||
"filament": "Filamentmærker. De har værdier, såsom Navn, Materiale, Farve, Diameter, m.m.",
|
||||
"spool": "Individuelle fysiske spoler af et specifikt filament."
|
||||
},
|
||||
"description": "<title>Hjælp</title><p>Her er nogle tips til at komme i gang.</p><p>Spoolman indeholder 3 forskellige typer data:</p><itemsHelp/><p>For at tilføje en ny spole til databasen, skal du starte med at oprette et <filamentCreateLink>Filament</filamentCreateLink> objekt. Når dette er gjort, fortsættes der ved at oprette et <spoolCreateLink>Spole</spoolCreateLink> objekt for den specifikke spole. Hvis du har flere spoler af samme filament, opretter du blot et nyt spole objekt og genbruger samme filament. </p><p> Du har også mulighed for at oprette et <vendorCreateLink>Producent</vendorCreateLink> objekt for firmaet der producerer filamentet, hvis du ønsker.</p><p>Du har mulighed for at linke andre 3D printer services til Spoolman, Som f.eks. Moonraker. Dette giver mulighed for automatisk at opdatere og overvåge forbruget af filament for hvert print. Læs <readmeLink>Spoolman README</readmeLink> for information om opsætning af dette.</p>",
|
||||
"description": "<title>Hjælp</title><p>Her er nogle tips til at komme i gang.</p><p>Spoolman indeholder 3 forskellige typer data:</p><itemsHelp/><p>For at tilføje en ny spole til databasen, skal du starte med at oprette et <filamentCreateLink>Filamentobjekt</filamentCreateLink>. Når dette er gjort, fortsættes der ved at oprette et <spoolCreateLink>Spoleobjekt</spoolCreateLink> for den specifikke spole. Hvis du har flere spoler af samme filament, opretter du blot et nyt spole objekt og genbruger samme filament. </p><p> Du har også mulighed for at oprette et <vendorCreateLink>Producentobjekt</vendorCreateLink> for firmaet, der producerer filamentet, hvis du ønsker at holde styr på den information.</p><p>Du har mulighed for at linke andre 3D-printertjenester til Spoolman, Som f.eks. Moonraker. Dette giver mulighed for automatisk at opdatere og overvåge forbruget af filament for hvert print. Læs <readmeLink>Spoolman README</readmeLink> for information om opsætning af dette.</p>",
|
||||
"help": "Hjælp"
|
||||
},
|
||||
"kofi": "Donér på Ko-fi",
|
||||
"home": {
|
||||
"home": "Hjem"
|
||||
"home": "Hjem",
|
||||
"welcome": "Velkommen til din nye Spoolman instans!",
|
||||
"description": "Det ser ud til, at du ikke har tilføjet nogen spoler endnu. Tjek <helpPageLink>her</helpPageLink> for hjælp med at komme i gang."
|
||||
},
|
||||
"settings": {
|
||||
"header": "Indstillinger",
|
||||
@@ -324,6 +359,14 @@
|
||||
"tab": "Generelt",
|
||||
"currency": {
|
||||
"label": "Valuta"
|
||||
},
|
||||
"base_url": {
|
||||
"tooltip": "Basis-webadressen til at benytte ved generering af funktioner, såsom QR-koder.",
|
||||
"label": "Basis-webadresse"
|
||||
},
|
||||
"round_prices": {
|
||||
"label": "Afrund priser",
|
||||
"tooltip": "Afrund priser til nærmeste heltal."
|
||||
}
|
||||
},
|
||||
"extra_fields": {
|
||||
@@ -333,23 +376,23 @@
|
||||
"field_type": "Type",
|
||||
"unit": "Enhed",
|
||||
"order": "Sortering",
|
||||
"default_value": "Standard-værdi",
|
||||
"default_value": "Standardværdi",
|
||||
"multi_choice": "Multi-valg",
|
||||
"choices": "Valgmuligheder"
|
||||
},
|
||||
"field_type": {
|
||||
"integer_range": "Heltals spænd",
|
||||
"integer_range": "Heltalspænd",
|
||||
"float": "Decimaltal",
|
||||
"float_range": "Decimaltal spænd",
|
||||
"float_range": "Decimaltalspænd",
|
||||
"datetime": "Dato-tid",
|
||||
"boolean": "Boolean (Ja/Nej)",
|
||||
"choice": "Valg",
|
||||
"text": "Tekst",
|
||||
"integer": "Heltal"
|
||||
},
|
||||
"choices_missing_error": "Du kan ikke fjerne valg. De følgende valg mangler: {{choices}}",
|
||||
"choices_missing_error": "Du kan ikke fjerne valgmuligheder. De følgende valgmuligheder mangler: {{choices}}",
|
||||
"tab": "Ekstra felter",
|
||||
"description": "<p>Her kan du tilføje ekstra felter til dine poster.</p><p>Når et felt er tilføjet kan du ikke redigere Nøgle og Type, og for visse felttyper kan du ikke fjerne valg, eller ændre multi-valgs status. Hvis du fjerner et felt, vil associerede data i alle poster blive slettet.</p><p>Nøglen er hvad andre programmer læser/skriver data som, så hvis dit felt skal integreres med en tredje parts program, skal du sørge for at indstille det korrekt. Standard-værdi bliver kun tilføjet til nye felter.</p><p>Ekstra felter kan ikke bruges til sortering eller filtrering i oversigterne.</p>",
|
||||
"description": "<p>Her kan du tilføje ekstra felter til dine poster.</p><p>Når et felt er tilføjet kan du ikke redigere dens Nøgle eller Type, og for visse felttyper kan du ikke fjerne valg, eller ændre multi-valgstatus. Hvis du fjerner et felt, vil associeret data i alle poster blive slettet.</p><p>Nøglen er hvad andre programmer læser/skriver data som, så hvis dit felt skal integreres med et tredjepartsprogram, skal du sørge for at indstille det korrekt. Standardværdi bliver kun tilføjet til nye felter.</p><p>Ekstra felter kan ikke sorteres eller filtreres i oversigterne.</p>",
|
||||
"boolean_true": "Ja",
|
||||
"boolean_false": "Nej",
|
||||
"non_unique_key_error": "Nøglen skal være Unik.",
|
||||
@@ -358,5 +401,11 @@
|
||||
"delete_confirm_description": "Dette vil slette feltet samt alle associerede data for alle poster."
|
||||
},
|
||||
"settings": "Indstillinger"
|
||||
},
|
||||
"locations": {
|
||||
"new_location": "Ny lokation",
|
||||
"no_location": "Ingen lokation",
|
||||
"locations": "Lokationer",
|
||||
"no_locations_help": "Denne side lader dig organisere dine spoler i lokationer, tilføj nogle spoler for at komme i gang!"
|
||||
}
|
||||
}
|
||||
@@ -16,7 +16,24 @@
|
||||
"bedTemp": "Θερμοκρασία κρεβατιού: {{temp}}",
|
||||
"lotNr": "Αριθμός παρτίδας: {{lot}}",
|
||||
"showFilamentComment": "Σχόλια Νήματος",
|
||||
"button": "Tύπωση Κωδικών QR"
|
||||
"button": "Tύπωση Κωδικών QR",
|
||||
"useHTTPUrl": {
|
||||
"options": {
|
||||
"default": "",
|
||||
"url": ""
|
||||
},
|
||||
"preview": "",
|
||||
"tooltip": "",
|
||||
"label": ""
|
||||
},
|
||||
"showQRCodeMode": {
|
||||
"withIcon": "",
|
||||
"no": "",
|
||||
"simple": ""
|
||||
},
|
||||
"templateHelp": "",
|
||||
"showQRCode": "",
|
||||
"template": ""
|
||||
},
|
||||
"generic": {
|
||||
"printerMarginBottom": "Ασφαλές Περιθώριο Κάτω",
|
||||
@@ -48,7 +65,18 @@
|
||||
"showBorder": "Εμφάνιση Περιθωρίου",
|
||||
"printerMarginLeft": "Ασφαλές Περιθώριο Αριστερά",
|
||||
"dimensions": "Διαστάσεις",
|
||||
"print": "Τύπωσε"
|
||||
"print": "Τύπωσε",
|
||||
"deleteSettingsConfirm": "",
|
||||
"deleteSettings": "",
|
||||
"itemCopies": "",
|
||||
"settingsName": "",
|
||||
"newSetting": "",
|
||||
"addSettings": "",
|
||||
"duplicateSettings": "",
|
||||
"settings": "",
|
||||
"saveSetting": "",
|
||||
"saveAsImage": "",
|
||||
"defaultSettings": ""
|
||||
},
|
||||
"spoolSelect": {
|
||||
"selectedTotal_one": "{{count}} καρούλι έχει επιλεγεί",
|
||||
@@ -89,6 +117,9 @@
|
||||
},
|
||||
"help": {
|
||||
"list": "Βοήθεια | Spoolman"
|
||||
},
|
||||
"locations": {
|
||||
"list": ""
|
||||
}
|
||||
},
|
||||
"spool": {
|
||||
@@ -112,7 +143,9 @@
|
||||
"remaining_weight": "Υπολειπόμενο Βάρος",
|
||||
"price": "Τιμή",
|
||||
"spool_weight": "Βάρος Κενού Καρουλιού",
|
||||
"initial_weight": "Αρχικό Βάρος"
|
||||
"initial_weight": "Αρχικό Βάρος",
|
||||
"filament_internal": "",
|
||||
"filament_external": ""
|
||||
},
|
||||
"titles": {
|
||||
"archive": "Αρχειοθέτηση Καρουλιού",
|
||||
@@ -121,11 +154,19 @@
|
||||
"create": "Δημιουργία Καρουλιού",
|
||||
"clone": "Αντιγραφή Καρουλιού",
|
||||
"show_title": "[Καρούλι #{{id}}] {{name}}",
|
||||
"list": "Καρούλια"
|
||||
"list": "Καρούλια",
|
||||
"adjust": ""
|
||||
},
|
||||
"form": {
|
||||
"spool_updated": "Αυτό το καρούλι έχει ενημερωθεί από κάποιον/κάτι άλλο από τότε που ανοίξατε αυτήν τη σελίδα. Η αποθήκευση θα αντικαταστήσει αυτές τις αλλαγές!",
|
||||
"new_location_prompt": "Προσθήκη νέας τοποθεσίας αποθήκευσης"
|
||||
"new_location_prompt": "Προσθήκη νέας τοποθεσίας αποθήκευσης",
|
||||
"measurement_type_label": "",
|
||||
"adjust_filament_value": "",
|
||||
"measurement_type": {
|
||||
"weight": "",
|
||||
"length": ""
|
||||
},
|
||||
"adjust_filament_help": ""
|
||||
},
|
||||
"fields_help": {
|
||||
"used_weight": "Πόσο νήμα έχει χρησιμοποιηθεί από το καρούλι. Σε ένα καινούργιο καρούλι θα πρέπει να έχουν χρησιμοποιηθεί 0g.",
|
||||
@@ -134,11 +175,17 @@
|
||||
"lot_nr": "Αριθμός παρτίδας κατασκευαστή. Μπορεί να χρησιμοποιηθεί για να διασφαλιστεί ότι μια εκτύπωση έχει σταθερό χρώμα εάν χρησιμοποιούνται πολλαπλά καρούλια.",
|
||||
"remaining_weight": "Πόσο νήμα έχει απομείνει στο καρούλι. Για ένα καινούργιο καρούλι αυτό πρέπει να συμπίπτει με το βάρος του καρουλιού.",
|
||||
"location": "Που βρίσκεται το καρούλι, εάν υπάρχουν πολλαπλά σημεία αποθήκευσης για τα καρούλια.",
|
||||
"price": "Τιμή πλήρους καρουλιού. Εάν δεν οριστεί, η τιμή του νήματος θα θεωρηθεί αντ' αυτού."
|
||||
"price": "Τιμή πλήρους καρουλιού. Εάν δεν οριστεί, η τιμή του νήματος θα θεωρηθεί αντ' αυτού.",
|
||||
"external_filament": "",
|
||||
"spool_weight": "",
|
||||
"initial_weight": ""
|
||||
},
|
||||
"spool": "Καρούλια",
|
||||
"messages": {
|
||||
"archive": "Είστε σίγουρος ότι θέλετε να αρχειοθετήσετε αυτό το καρούλι;"
|
||||
},
|
||||
"formats": {
|
||||
"last_used": ""
|
||||
}
|
||||
},
|
||||
"buttons": {
|
||||
@@ -163,7 +210,8 @@
|
||||
"unArchive": "Επαναφορά Αρχειοθετημένου",
|
||||
"clone": "Αντιγραφή",
|
||||
"clear": "Εκκαθάριση",
|
||||
"saveAndAdd": "Αποθήκευση και Προσθήκη"
|
||||
"saveAndAdd": "Αποθήκευση και Προσθήκη",
|
||||
"continue": ""
|
||||
},
|
||||
"filament": {
|
||||
"fields_help": {
|
||||
@@ -172,7 +220,8 @@
|
||||
"spool_weight": "Το βάρος ενός άδειου καρουλιού. Χρησιμοποιείται για τον προσδιορισμό του μετρημένου βάρους ενός καρουλιού.",
|
||||
"price": "Τιμή ενός πλήρους καρουλιού.",
|
||||
"weight": "Το βάρος του νήματος ενός πλήρους καρουλιού (καθαρό βάρος). Αυτό δεν πρέπει να περιλαμβάνει το βάρος του ίδιου του καρουλιού, μόνο το βάρος του νήματος. Είναι αυτό που συνήθως αναγράφεται στη συσκευασία.",
|
||||
"material": "Π.χ. PLA, ABS, PETG, κλπ."
|
||||
"material": "Π.χ. PLA, ABS, PETG, κλπ.",
|
||||
"multi_color_direction": ""
|
||||
},
|
||||
"fields": {
|
||||
"material": "Υλικό",
|
||||
@@ -191,7 +240,12 @@
|
||||
"id": "Α/Α",
|
||||
"color_hex": "Χρώμα",
|
||||
"article_number": "Κωδικός Προϊόντος",
|
||||
"spools": "Προβολή Καρουλιών"
|
||||
"spools": "Προβολή Καρουλιών",
|
||||
"multi_color": "",
|
||||
"external_id": "",
|
||||
"single_color": "",
|
||||
"longitudinal": "",
|
||||
"coaxial": ""
|
||||
},
|
||||
"titles": {
|
||||
"clone": "Αντιγραφή Νήματος",
|
||||
@@ -202,7 +256,9 @@
|
||||
"list": "Νήματα"
|
||||
},
|
||||
"form": {
|
||||
"filament_updated": "Αυτό το νήμα έχει ενημερωθεί από κάποιον/κάτι άλλο από τότε που ανοίξατε αυτήν τη σελίδα. Η αποθήκευση θα αντικαταστήσει αυτές τις αλλαγές!"
|
||||
"filament_updated": "Αυτό το νήμα έχει ενημερωθεί από κάποιον/κάτι άλλο από τότε που ανοίξατε αυτήν τη σελίδα. Η αποθήκευση θα αντικαταστήσει αυτές τις αλλαγές!",
|
||||
"import_external": "",
|
||||
"import_external_description": ""
|
||||
},
|
||||
"filament": "Νήματα",
|
||||
"buttons": {
|
||||
@@ -232,9 +288,14 @@
|
||||
"registered": "Ημερομηνία Εγγραφής",
|
||||
"comment": "Σχόλια",
|
||||
"name": "Όνομα",
|
||||
"id": "Α/Α"
|
||||
"id": "Α/Α",
|
||||
"external_id": "",
|
||||
"empty_spool_weight": ""
|
||||
},
|
||||
"vendor": "Προμηθευτές"
|
||||
"vendor": "Προμηθευτές",
|
||||
"fields_help": {
|
||||
"empty_spool_weight": ""
|
||||
}
|
||||
},
|
||||
"scanner": {
|
||||
"title": "Αναγνώστης κωδικού QR",
|
||||
@@ -288,7 +349,9 @@
|
||||
},
|
||||
"kofi": "Φιλοδώρημα στο Ko-fi",
|
||||
"home": {
|
||||
"home": "Αρχική"
|
||||
"home": "Αρχική",
|
||||
"welcome": "",
|
||||
"description": ""
|
||||
},
|
||||
"settings": {
|
||||
"extra_fields": {
|
||||
@@ -326,9 +389,23 @@
|
||||
"tab": "Γενικές",
|
||||
"currency": {
|
||||
"label": "Ετικέτα για τη ρύθμιση του νομίσματος"
|
||||
},
|
||||
"base_url": {
|
||||
"tooltip": "",
|
||||
"label": ""
|
||||
},
|
||||
"round_prices": {
|
||||
"label": "",
|
||||
"tooltip": ""
|
||||
}
|
||||
},
|
||||
"header": "Ρυθμίσεις",
|
||||
"settings": "Ρυθμίσεις"
|
||||
},
|
||||
"locations": {
|
||||
"new_location": "",
|
||||
"no_location": "",
|
||||
"locations": "",
|
||||
"no_locations_help": ""
|
||||
}
|
||||
}
|
||||
@@ -52,6 +52,12 @@
|
||||
"unknown": "Unknown",
|
||||
"yes": "Yes",
|
||||
"no": "No",
|
||||
"theme": {
|
||||
"label": "Theme",
|
||||
"system": "System",
|
||||
"light": "Light",
|
||||
"dark": "Dark"
|
||||
},
|
||||
"tags": {
|
||||
"clone": "Clone"
|
||||
},
|
||||
@@ -326,7 +332,7 @@
|
||||
},
|
||||
"extra_fields": {
|
||||
"tab": "Extra Fields",
|
||||
"description": "<p>Here you can add extra custom fields to your entities.</p><p>Once a field is added, you can not change its key or type, and for choice type fields you can not remove choices or change the multi choice state. If you remove a field, the associated data for all entities will be deleted.</p><p>The key is what other programs read/write the data as, so if your custom field is supposed to integrate with a third-party program, make sure to set it correctly. Default value is only applied to new items.</p><p>Extra fields can not be sorted or filtered in the table views.</p>",
|
||||
"description": "<p>Here you can add extra custom fields to your entities.</p><p>Once a field is added, you can not change its key or type, and for choice type fields you can not remove choices or change the multi choice state. If you remove a field, the associated data for all entities will be deleted.</p><p>The key is what other programs read/write the data as, so if your custom field is supposed to integrate with a third-party program, make sure to set it correctly. Default value is only applied to new items.</p><p>Extra fields can be shown and sorted in the table views. Choice and boolean fields expose filter options there as well, and all extra field types support filtering for empty values.</p>",
|
||||
"params": {
|
||||
"key": "Key",
|
||||
"name": "Name",
|
||||
|
||||
@@ -60,7 +60,340 @@
|
||||
},
|
||||
"printing": {
|
||||
"generic": {
|
||||
"title": "Trükkib"
|
||||
"title": "Trükkib",
|
||||
"printerMarginBottom": "",
|
||||
"verticalSpacing": "",
|
||||
"rows": "",
|
||||
"borders": {
|
||||
"none": "",
|
||||
"grid": "",
|
||||
"border": ""
|
||||
},
|
||||
"printerMarginTop": "",
|
||||
"deleteSettingsConfirm": "",
|
||||
"deleteSettings": "",
|
||||
"customSize": "",
|
||||
"contentSettings": "",
|
||||
"marginRight": "",
|
||||
"printerMarginRight": "",
|
||||
"itemCopies": "",
|
||||
"helpPrinterMargin": "",
|
||||
"settingsName": "",
|
||||
"previewScale": "",
|
||||
"helpMargin": "",
|
||||
"marginTop": "",
|
||||
"skipItems": "",
|
||||
"newSetting": "",
|
||||
"addSettings": "",
|
||||
"layoutSettings": "",
|
||||
"paperSize": "",
|
||||
"columns": "",
|
||||
"description": "",
|
||||
"marginBottom": "",
|
||||
"horizontalSpacing": "",
|
||||
"duplicateSettings": "",
|
||||
"settings": "",
|
||||
"saveSetting": "",
|
||||
"marginLeft": "",
|
||||
"showBorder": "",
|
||||
"saveAsImage": "",
|
||||
"printerMarginLeft": "",
|
||||
"dimensions": "",
|
||||
"defaultSettings": "",
|
||||
"print": ""
|
||||
},
|
||||
"qrcode": {
|
||||
"useHTTPUrl": {
|
||||
"options": {
|
||||
"default": "",
|
||||
"url": ""
|
||||
},
|
||||
"preview": "",
|
||||
"tooltip": "",
|
||||
"label": ""
|
||||
},
|
||||
"showContent": "",
|
||||
"showQRCodeMode": {
|
||||
"withIcon": "",
|
||||
"no": "",
|
||||
"simple": ""
|
||||
},
|
||||
"templateHelp": "",
|
||||
"textSize": "",
|
||||
"showQRCode": "",
|
||||
"template": "",
|
||||
"title": "",
|
||||
"button": ""
|
||||
},
|
||||
"spoolSelect": {
|
||||
"selectedTotal_one": "",
|
||||
"selectedTotal_other": "",
|
||||
"description": "",
|
||||
"showArchived": "",
|
||||
"title": "",
|
||||
"selectAll": "",
|
||||
"noSpoolsSelected": ""
|
||||
}
|
||||
},
|
||||
"vendor": {
|
||||
"fields": {
|
||||
"external_id": "",
|
||||
"registered": "",
|
||||
"comment": "",
|
||||
"name": "",
|
||||
"empty_spool_weight": "",
|
||||
"id": ""
|
||||
},
|
||||
"fields_help": {
|
||||
"empty_spool_weight": ""
|
||||
},
|
||||
"titles": {
|
||||
"show_title": "",
|
||||
"show": "",
|
||||
"edit": "",
|
||||
"clone": "",
|
||||
"create": "",
|
||||
"list": ""
|
||||
},
|
||||
"form": {
|
||||
"vendor_updated": ""
|
||||
},
|
||||
"vendor": ""
|
||||
},
|
||||
"documentTitle": {
|
||||
"vendor": {
|
||||
"create": "",
|
||||
"clone": "",
|
||||
"edit": "",
|
||||
"list": "",
|
||||
"show": ""
|
||||
},
|
||||
"default": "",
|
||||
"home": {
|
||||
"list": ""
|
||||
},
|
||||
"spool": {
|
||||
"edit": "",
|
||||
"list": "",
|
||||
"create": "",
|
||||
"show": "",
|
||||
"clone": ""
|
||||
},
|
||||
"filament": {
|
||||
"list": "",
|
||||
"show": "",
|
||||
"clone": "",
|
||||
"create": "",
|
||||
"edit": ""
|
||||
},
|
||||
"suffix": "",
|
||||
"locations": {
|
||||
"list": ""
|
||||
},
|
||||
"help": {
|
||||
"list": ""
|
||||
}
|
||||
},
|
||||
"spool": {
|
||||
"fields": {
|
||||
"measured_weight": "",
|
||||
"last_used": "",
|
||||
"filament_internal": "",
|
||||
"material": "",
|
||||
"spool_weight": "",
|
||||
"weight_to_use": "",
|
||||
"lot_nr": "",
|
||||
"filament_name": "",
|
||||
"price": "",
|
||||
"comment": "",
|
||||
"filament": "",
|
||||
"location": "",
|
||||
"used_length": "",
|
||||
"archived": "",
|
||||
"remaining_length": "",
|
||||
"registered": "",
|
||||
"first_used": "",
|
||||
"used_weight": "",
|
||||
"id": "",
|
||||
"remaining_weight": "",
|
||||
"initial_weight": "",
|
||||
"filament_external": ""
|
||||
},
|
||||
"titles": {
|
||||
"archive": "",
|
||||
"adjust": "",
|
||||
"show": "",
|
||||
"edit": "",
|
||||
"create": "",
|
||||
"clone": "",
|
||||
"show_title": "",
|
||||
"list": ""
|
||||
},
|
||||
"fields_help": {
|
||||
"external_filament": "",
|
||||
"used_weight": "",
|
||||
"weight_to_use": "",
|
||||
"measured_weight": "",
|
||||
"price": "",
|
||||
"spool_weight": "",
|
||||
"lot_nr": "",
|
||||
"remaining_weight": "",
|
||||
"location": "",
|
||||
"initial_weight": ""
|
||||
},
|
||||
"form": {
|
||||
"spool_updated": "",
|
||||
"measurement_type_label": "",
|
||||
"adjust_filament_value": "",
|
||||
"new_location_prompt": "",
|
||||
"measurement_type": {
|
||||
"weight": "",
|
||||
"length": ""
|
||||
},
|
||||
"adjust_filament_help": ""
|
||||
},
|
||||
"spool": "",
|
||||
"formats": {
|
||||
"last_used": ""
|
||||
},
|
||||
"messages": {
|
||||
"archive": ""
|
||||
}
|
||||
},
|
||||
"filament": {
|
||||
"form": {
|
||||
"import_external": "",
|
||||
"filament_updated": "",
|
||||
"import_external_description": ""
|
||||
},
|
||||
"fields_help": {
|
||||
"name": "",
|
||||
"article_number": "",
|
||||
"spool_weight": "",
|
||||
"price": "",
|
||||
"weight": "",
|
||||
"multi_color_direction": "",
|
||||
"material": ""
|
||||
},
|
||||
"fields": {
|
||||
"material": "",
|
||||
"vendor_name": "",
|
||||
"settings_extruder_temp": "",
|
||||
"comment": "",
|
||||
"multi_color": "",
|
||||
"diameter": "",
|
||||
"weight": "",
|
||||
"spool_weight": "",
|
||||
"external_id": "",
|
||||
"single_color": "",
|
||||
"registered": "",
|
||||
"spools": "",
|
||||
"name": "",
|
||||
"price": "",
|
||||
"settings_bed_temp": "",
|
||||
"vendor": "",
|
||||
"density": "",
|
||||
"longitudinal": "",
|
||||
"id": "",
|
||||
"color_hex": "",
|
||||
"article_number": "",
|
||||
"coaxial": ""
|
||||
},
|
||||
"titles": {
|
||||
"clone": "",
|
||||
"show_title": "",
|
||||
"show": "",
|
||||
"create": "",
|
||||
"edit": "",
|
||||
"list": ""
|
||||
},
|
||||
"buttons": {
|
||||
"add_spool": ""
|
||||
},
|
||||
"filament": ""
|
||||
},
|
||||
"settings": {
|
||||
"extra_fields": {
|
||||
"non_unique_key_error": "",
|
||||
"params": {
|
||||
"unit": "",
|
||||
"choices": "",
|
||||
"default_value": "",
|
||||
"field_type": "",
|
||||
"multi_choice": "",
|
||||
"order": "",
|
||||
"name": "",
|
||||
"key": ""
|
||||
},
|
||||
"boolean_true": "",
|
||||
"choices_missing_error": "",
|
||||
"boolean_false": "",
|
||||
"delete_confirm_description": "",
|
||||
"field_type": {
|
||||
"boolean": "",
|
||||
"float": "",
|
||||
"choice": "",
|
||||
"float_range": "",
|
||||
"datetime": "",
|
||||
"integer": "",
|
||||
"integer_range": "",
|
||||
"text": ""
|
||||
},
|
||||
"tab": "",
|
||||
"description": "",
|
||||
"delete_confirm": "",
|
||||
"key_not_changed": ""
|
||||
},
|
||||
"general": {
|
||||
"tab": "",
|
||||
"base_url": {
|
||||
"tooltip": "",
|
||||
"label": ""
|
||||
},
|
||||
"round_prices": {
|
||||
"label": "",
|
||||
"tooltip": ""
|
||||
},
|
||||
"currency": {
|
||||
"label": ""
|
||||
}
|
||||
},
|
||||
"header": "",
|
||||
"settings": ""
|
||||
},
|
||||
"home": {
|
||||
"welcome": "",
|
||||
"home": "",
|
||||
"description": ""
|
||||
},
|
||||
"scanner": {
|
||||
"title": "",
|
||||
"error": {
|
||||
"insecureContext": "",
|
||||
"notReadable": "",
|
||||
"notAllowed": "",
|
||||
"unknown": "",
|
||||
"notFound": "",
|
||||
"streamApiNotSupported": ""
|
||||
},
|
||||
"description": ""
|
||||
},
|
||||
"help": {
|
||||
"resources": {
|
||||
"vendor": "",
|
||||
"filament": "",
|
||||
"spool": ""
|
||||
},
|
||||
"description": "",
|
||||
"help": ""
|
||||
},
|
||||
"locations": {
|
||||
"new_location": "",
|
||||
"no_location": "",
|
||||
"locations": "",
|
||||
"no_locations_help": ""
|
||||
},
|
||||
"table": {
|
||||
"actions": ""
|
||||
}
|
||||
}
|
||||
@@ -208,6 +208,9 @@
|
||||
},
|
||||
"messages": {
|
||||
"archive": "آیا مطمئن هستید که میخواهید این قرقره را بایگانی کنید؟"
|
||||
},
|
||||
"formats": {
|
||||
"last_used": ""
|
||||
}
|
||||
},
|
||||
"filament": {
|
||||
@@ -288,7 +291,9 @@
|
||||
}
|
||||
},
|
||||
"home": {
|
||||
"home": "صفحه اصلی"
|
||||
"home": "صفحه اصلی",
|
||||
"welcome": "",
|
||||
"description": ""
|
||||
},
|
||||
"help": {
|
||||
"help": "راهنما",
|
||||
@@ -313,6 +318,10 @@
|
||||
"base_url": {
|
||||
"tooltip": "آدرس پایگاه داده Spoolman که باید هنگام ایجاد ویژگیهایی مانند کدهای QR استفاده شود.",
|
||||
"label": "لینک Spoolman"
|
||||
},
|
||||
"round_prices": {
|
||||
"label": "",
|
||||
"tooltip": ""
|
||||
}
|
||||
},
|
||||
"extra_fields": {
|
||||
@@ -376,6 +385,15 @@
|
||||
"show": "نمایش تولید کننده فیلامنت شماره {{id}} | اسپول من",
|
||||
"create": "تعریف کردن تولید کننده فیلامنت جدید | اسپول من",
|
||||
"clone": "تکثیر تولید کننده فیلامنت شماره {{id}} | اسپول من"
|
||||
},
|
||||
"locations": {
|
||||
"list": ""
|
||||
}
|
||||
},
|
||||
"locations": {
|
||||
"new_location": "",
|
||||
"no_location": "",
|
||||
"locations": "",
|
||||
"no_locations_help": ""
|
||||
}
|
||||
}
|
||||
@@ -351,7 +351,8 @@
|
||||
"kofi": "Me donner un pourboire sur Ko-fi",
|
||||
"home": {
|
||||
"home": "Accueil",
|
||||
"welcome": "Bienvenue sur votre instance Spoolman !"
|
||||
"welcome": "Bienvenue sur votre instance Spoolman !",
|
||||
"description": ""
|
||||
},
|
||||
"settings": {
|
||||
"settings": "Paramètres",
|
||||
@@ -395,6 +396,10 @@
|
||||
"base_url": {
|
||||
"label": "Base de l'URL",
|
||||
"tooltip": "La base de l'URL à utiliser lors de la génération de QR codes."
|
||||
},
|
||||
"round_prices": {
|
||||
"label": "",
|
||||
"tooltip": ""
|
||||
}
|
||||
}
|
||||
},
|
||||
|
||||
@@ -12,6 +12,388 @@
|
||||
"edit": "Sampadan Karen",
|
||||
"confirm": "Kya aapko pakka hai?",
|
||||
"continue": "Aage badhen",
|
||||
"show": "Dikhayen"
|
||||
"show": "Dikhayen",
|
||||
"filter": "",
|
||||
"cancel": "",
|
||||
"showArchived": "",
|
||||
"archive": "",
|
||||
"hideColumns": "",
|
||||
"delete": "",
|
||||
"undo": "",
|
||||
"import": "",
|
||||
"logout": "",
|
||||
"refresh": "",
|
||||
"notAccessTitle": "",
|
||||
"saveAndAdd": "",
|
||||
"hideArchived": "",
|
||||
"clearFilters": "",
|
||||
"unArchive": "",
|
||||
"clone": "",
|
||||
"clear": ""
|
||||
},
|
||||
"vendor": {
|
||||
"fields": {
|
||||
"external_id": "",
|
||||
"registered": "",
|
||||
"comment": "",
|
||||
"name": "",
|
||||
"empty_spool_weight": "",
|
||||
"id": ""
|
||||
},
|
||||
"fields_help": {
|
||||
"empty_spool_weight": ""
|
||||
},
|
||||
"titles": {
|
||||
"show_title": "",
|
||||
"show": "",
|
||||
"edit": "",
|
||||
"clone": "",
|
||||
"create": "",
|
||||
"list": ""
|
||||
},
|
||||
"form": {
|
||||
"vendor_updated": ""
|
||||
},
|
||||
"vendor": ""
|
||||
},
|
||||
"documentTitle": {
|
||||
"vendor": {
|
||||
"create": "",
|
||||
"clone": "",
|
||||
"edit": "",
|
||||
"list": "",
|
||||
"show": ""
|
||||
},
|
||||
"default": "",
|
||||
"home": {
|
||||
"list": ""
|
||||
},
|
||||
"spool": {
|
||||
"edit": "",
|
||||
"list": "",
|
||||
"create": "",
|
||||
"show": "",
|
||||
"clone": ""
|
||||
},
|
||||
"filament": {
|
||||
"list": "",
|
||||
"show": "",
|
||||
"clone": "",
|
||||
"create": "",
|
||||
"edit": ""
|
||||
},
|
||||
"suffix": "",
|
||||
"locations": {
|
||||
"list": ""
|
||||
},
|
||||
"help": {
|
||||
"list": ""
|
||||
}
|
||||
},
|
||||
"spool": {
|
||||
"fields": {
|
||||
"measured_weight": "",
|
||||
"last_used": "",
|
||||
"filament_internal": "",
|
||||
"material": "",
|
||||
"spool_weight": "",
|
||||
"weight_to_use": "",
|
||||
"lot_nr": "",
|
||||
"filament_name": "",
|
||||
"price": "",
|
||||
"comment": "",
|
||||
"filament": "",
|
||||
"location": "",
|
||||
"used_length": "",
|
||||
"archived": "",
|
||||
"remaining_length": "",
|
||||
"registered": "",
|
||||
"first_used": "",
|
||||
"used_weight": "",
|
||||
"id": "",
|
||||
"remaining_weight": "",
|
||||
"initial_weight": "",
|
||||
"filament_external": ""
|
||||
},
|
||||
"titles": {
|
||||
"archive": "",
|
||||
"adjust": "",
|
||||
"show": "",
|
||||
"edit": "",
|
||||
"create": "",
|
||||
"clone": "",
|
||||
"show_title": "",
|
||||
"list": ""
|
||||
},
|
||||
"fields_help": {
|
||||
"external_filament": "",
|
||||
"used_weight": "",
|
||||
"weight_to_use": "",
|
||||
"measured_weight": "",
|
||||
"price": "",
|
||||
"spool_weight": "",
|
||||
"lot_nr": "",
|
||||
"remaining_weight": "",
|
||||
"location": "",
|
||||
"initial_weight": ""
|
||||
},
|
||||
"form": {
|
||||
"spool_updated": "",
|
||||
"measurement_type_label": "",
|
||||
"adjust_filament_value": "",
|
||||
"new_location_prompt": "",
|
||||
"measurement_type": {
|
||||
"weight": "",
|
||||
"length": ""
|
||||
},
|
||||
"adjust_filament_help": ""
|
||||
},
|
||||
"spool": "",
|
||||
"formats": {
|
||||
"last_used": ""
|
||||
},
|
||||
"messages": {
|
||||
"archive": ""
|
||||
}
|
||||
},
|
||||
"filament": {
|
||||
"form": {
|
||||
"import_external": "",
|
||||
"filament_updated": "",
|
||||
"import_external_description": ""
|
||||
},
|
||||
"fields_help": {
|
||||
"name": "",
|
||||
"article_number": "",
|
||||
"spool_weight": "",
|
||||
"price": "",
|
||||
"weight": "",
|
||||
"multi_color_direction": "",
|
||||
"material": ""
|
||||
},
|
||||
"fields": {
|
||||
"material": "",
|
||||
"vendor_name": "",
|
||||
"settings_extruder_temp": "",
|
||||
"comment": "",
|
||||
"multi_color": "",
|
||||
"diameter": "",
|
||||
"weight": "",
|
||||
"spool_weight": "",
|
||||
"external_id": "",
|
||||
"single_color": "",
|
||||
"registered": "",
|
||||
"spools": "",
|
||||
"name": "",
|
||||
"price": "",
|
||||
"settings_bed_temp": "",
|
||||
"vendor": "",
|
||||
"density": "",
|
||||
"longitudinal": "",
|
||||
"id": "",
|
||||
"color_hex": "",
|
||||
"article_number": "",
|
||||
"coaxial": ""
|
||||
},
|
||||
"titles": {
|
||||
"clone": "",
|
||||
"show_title": "",
|
||||
"show": "",
|
||||
"create": "",
|
||||
"edit": "",
|
||||
"list": ""
|
||||
},
|
||||
"buttons": {
|
||||
"add_spool": ""
|
||||
},
|
||||
"filament": ""
|
||||
},
|
||||
"printing": {
|
||||
"generic": {
|
||||
"printerMarginBottom": "",
|
||||
"verticalSpacing": "",
|
||||
"rows": "",
|
||||
"borders": {
|
||||
"none": "",
|
||||
"grid": "",
|
||||
"border": ""
|
||||
},
|
||||
"printerMarginTop": "",
|
||||
"deleteSettingsConfirm": "",
|
||||
"deleteSettings": "",
|
||||
"customSize": "",
|
||||
"title": "",
|
||||
"contentSettings": "",
|
||||
"marginRight": "",
|
||||
"printerMarginRight": "",
|
||||
"itemCopies": "",
|
||||
"helpPrinterMargin": "",
|
||||
"settingsName": "",
|
||||
"previewScale": "",
|
||||
"helpMargin": "",
|
||||
"marginTop": "",
|
||||
"skipItems": "",
|
||||
"newSetting": "",
|
||||
"addSettings": "",
|
||||
"layoutSettings": "",
|
||||
"paperSize": "",
|
||||
"columns": "",
|
||||
"description": "",
|
||||
"marginBottom": "",
|
||||
"horizontalSpacing": "",
|
||||
"duplicateSettings": "",
|
||||
"settings": "",
|
||||
"saveSetting": "",
|
||||
"marginLeft": "",
|
||||
"showBorder": "",
|
||||
"saveAsImage": "",
|
||||
"printerMarginLeft": "",
|
||||
"dimensions": "",
|
||||
"defaultSettings": "",
|
||||
"print": ""
|
||||
},
|
||||
"qrcode": {
|
||||
"useHTTPUrl": {
|
||||
"options": {
|
||||
"default": "",
|
||||
"url": ""
|
||||
},
|
||||
"preview": "",
|
||||
"tooltip": "",
|
||||
"label": ""
|
||||
},
|
||||
"showContent": "",
|
||||
"showQRCodeMode": {
|
||||
"withIcon": "",
|
||||
"no": "",
|
||||
"simple": ""
|
||||
},
|
||||
"templateHelp": "",
|
||||
"textSize": "",
|
||||
"showQRCode": "",
|
||||
"template": "",
|
||||
"title": "",
|
||||
"button": ""
|
||||
},
|
||||
"spoolSelect": {
|
||||
"selectedTotal_one": "",
|
||||
"selectedTotal_other": "",
|
||||
"description": "",
|
||||
"showArchived": "",
|
||||
"title": "",
|
||||
"selectAll": "",
|
||||
"noSpoolsSelected": ""
|
||||
}
|
||||
},
|
||||
"settings": {
|
||||
"extra_fields": {
|
||||
"non_unique_key_error": "",
|
||||
"params": {
|
||||
"unit": "",
|
||||
"choices": "",
|
||||
"default_value": "",
|
||||
"field_type": "",
|
||||
"multi_choice": "",
|
||||
"order": "",
|
||||
"name": "",
|
||||
"key": ""
|
||||
},
|
||||
"boolean_true": "",
|
||||
"choices_missing_error": "",
|
||||
"boolean_false": "",
|
||||
"delete_confirm_description": "",
|
||||
"field_type": {
|
||||
"boolean": "",
|
||||
"float": "",
|
||||
"choice": "",
|
||||
"float_range": "",
|
||||
"datetime": "",
|
||||
"integer": "",
|
||||
"integer_range": "",
|
||||
"text": ""
|
||||
},
|
||||
"tab": "",
|
||||
"description": "",
|
||||
"delete_confirm": "",
|
||||
"key_not_changed": ""
|
||||
},
|
||||
"general": {
|
||||
"tab": "",
|
||||
"base_url": {
|
||||
"tooltip": "",
|
||||
"label": ""
|
||||
},
|
||||
"round_prices": {
|
||||
"label": "",
|
||||
"tooltip": ""
|
||||
},
|
||||
"currency": {
|
||||
"label": ""
|
||||
}
|
||||
},
|
||||
"header": "",
|
||||
"settings": ""
|
||||
},
|
||||
"home": {
|
||||
"welcome": "",
|
||||
"home": "",
|
||||
"description": ""
|
||||
},
|
||||
"scanner": {
|
||||
"title": "",
|
||||
"error": {
|
||||
"insecureContext": "",
|
||||
"notReadable": "",
|
||||
"notAllowed": "",
|
||||
"unknown": "",
|
||||
"notFound": "",
|
||||
"streamApiNotSupported": ""
|
||||
},
|
||||
"description": ""
|
||||
},
|
||||
"help": {
|
||||
"resources": {
|
||||
"vendor": "",
|
||||
"filament": "",
|
||||
"spool": ""
|
||||
},
|
||||
"description": "",
|
||||
"help": ""
|
||||
},
|
||||
"notifications": {
|
||||
"deleteSuccess": "",
|
||||
"error": "",
|
||||
"editError": "",
|
||||
"saveSuccessful": "",
|
||||
"undoable": "",
|
||||
"importProgress": "",
|
||||
"createError": "",
|
||||
"validationError": "",
|
||||
"success": "",
|
||||
"editSuccess": "",
|
||||
"deleteError": "",
|
||||
"createSuccess": ""
|
||||
},
|
||||
"no": "",
|
||||
"unknown": "",
|
||||
"yes": "",
|
||||
"locations": {
|
||||
"new_location": "",
|
||||
"no_location": "",
|
||||
"locations": "",
|
||||
"no_locations_help": ""
|
||||
},
|
||||
"version": "",
|
||||
"kofi": "",
|
||||
"table": {
|
||||
"actions": ""
|
||||
},
|
||||
"warnWhenUnsavedChanges": "",
|
||||
"loading": "",
|
||||
"dashboard": {
|
||||
"title": ""
|
||||
},
|
||||
"tags": {
|
||||
"clone": ""
|
||||
}
|
||||
}
|
||||
@@ -9,14 +9,31 @@
|
||||
"showTemperatures": "Hőmérséklet",
|
||||
"showVendor": "Gyártó",
|
||||
"showSpoolComment": "Orsó Megjegyzés",
|
||||
"textSize": "Tartalom szöveg mérete",
|
||||
"title": "QR kód nyomtatása",
|
||||
"textSize": "Cimke Szövegméret",
|
||||
"title": "Cimkenyomtatás",
|
||||
"showSpoolmanIcon": "Spoolman ikon megjelenítése",
|
||||
"showLotNr": "Tételszám",
|
||||
"bedTemp": "BT: {{temp}}",
|
||||
"lotNr": "Tételszám: {{lot}}",
|
||||
"showFilamentComment": "Filament Komment",
|
||||
"button": "QR kódok nyomtatása"
|
||||
"button": "Cimkék Nyomtatása",
|
||||
"useHTTPUrl": {
|
||||
"options": {
|
||||
"default": "Alapbeállítás",
|
||||
"url": "URL"
|
||||
},
|
||||
"preview": "Előnézet:",
|
||||
"tooltip": "",
|
||||
"label": "QR kód link"
|
||||
},
|
||||
"showQRCodeMode": {
|
||||
"withIcon": "Iconnal",
|
||||
"no": "Nem",
|
||||
"simple": "Egyszerű"
|
||||
},
|
||||
"templateHelp": "",
|
||||
"showQRCode": "QR kód nyomtatása",
|
||||
"template": "Cimke Sablon"
|
||||
},
|
||||
"generic": {
|
||||
"printerMarginBottom": "Biztonságos zóna alja",
|
||||
@@ -48,15 +65,26 @@
|
||||
"showBorder": "Szélek megjelenítése",
|
||||
"printerMarginLeft": "Biztonságos zóna balra",
|
||||
"dimensions": "Dimenziók",
|
||||
"print": "Nyomtat"
|
||||
"print": "Nyomtat",
|
||||
"deleteSettingsConfirm": "Biztos vagy benne, hogy törölni szeretnéd ezt a beállítást?",
|
||||
"deleteSettings": "Jelenlegi Beállítás Törlése",
|
||||
"itemCopies": "Termék másolatok",
|
||||
"settingsName": "Preset neve",
|
||||
"newSetting": "Új",
|
||||
"addSettings": "Új beállítás hozzáadása",
|
||||
"duplicateSettings": "Duplikáció",
|
||||
"settings": "Beállítások",
|
||||
"saveSetting": "Beállítás Mentése",
|
||||
"saveAsImage": "Mentés Képként",
|
||||
"defaultSettings": "Alapbeállítás"
|
||||
},
|
||||
"spoolSelect": {
|
||||
"selectedTotal_one": "{{count}} tekercs kiválasztva",
|
||||
"selectedTotal_other": "{{count}} db tekercs kiválasztva",
|
||||
"description": "Válassza ki a QR-kódok nyomtatásához szükséges tekercseket.",
|
||||
"description": "Válassza ki a tekercseket a cimkék nyomtatásához.",
|
||||
"showArchived": "Archivált megjelenítése",
|
||||
"title": "Tekercs kiválasztása",
|
||||
"selectAll": "Összes kijelölése/kijelölésének törlése",
|
||||
"selectAll": "Összes kijelölése/kijelölés törlése",
|
||||
"noSpoolsSelected": "Nem választotál ki egyetlen tekercset sem."
|
||||
}
|
||||
},
|
||||
@@ -89,12 +117,15 @@
|
||||
},
|
||||
"help": {
|
||||
"list": "Segítség | Spoolman"
|
||||
},
|
||||
"locations": {
|
||||
"list": "Tároló helyek | Spoolman"
|
||||
}
|
||||
},
|
||||
"spool": {
|
||||
"fields": {
|
||||
"measured_weight": "Mért súly",
|
||||
"last_used": "Utolsó használat",
|
||||
"last_used": "Utoljára használt",
|
||||
"material": "Anyag",
|
||||
"weight_to_use": "Súly",
|
||||
"lot_nr": "Tételszám",
|
||||
@@ -106,11 +137,15 @@
|
||||
"archived": "Arhivált",
|
||||
"remaining_length": "Fennmaradó hossz",
|
||||
"registered": "Nyilvántartott",
|
||||
"first_used": "Első használat",
|
||||
"first_used": "Először használt",
|
||||
"used_weight": "Felhasznált súly",
|
||||
"id": "ID",
|
||||
"remaining_weight": "Hátralévő súly",
|
||||
"price": "Ár"
|
||||
"remaining_weight": "Maradék súly",
|
||||
"price": "Ár",
|
||||
"filament_internal": "Belső",
|
||||
"spool_weight": "Üres súly",
|
||||
"initial_weight": "Kezdeti súly",
|
||||
"filament_external": "Külső"
|
||||
},
|
||||
"titles": {
|
||||
"archive": "Arhivált tekercs",
|
||||
@@ -119,7 +154,8 @@
|
||||
"create": "Tekercs létrehozása",
|
||||
"clone": "Tekercs másolása",
|
||||
"show_title": "[Tekercs #{{id}}] {{name}}",
|
||||
"list": "Tekercs"
|
||||
"list": "Tekercs",
|
||||
"adjust": "Tekercs Szál Módosítása"
|
||||
},
|
||||
"fields_help": {
|
||||
"used_weight": "Mennyi filament használódott el a tekercsről. Egy új tekercsnek 0 gramm használt mennyiséggel kell rendelkeznie.",
|
||||
@@ -128,15 +164,28 @@
|
||||
"lot_nr": "Gyártói tételszám. A szín egységesség ellenőrzésére használható, ha több tekercset használsz egy nyomtatáshoz.",
|
||||
"remaining_weight": "Mennyi filament van még a tekercsen. Egy új tekercsnél ez a tekercs súlyával kell megegyeznie.",
|
||||
"location": "Hol található a tekercs, ha több helyen tárolod a tekercseidet.",
|
||||
"price": "Egy teljes tekercs ára. Ha nincs beállítva, a rendszer az filament árát veszi fel helyette."
|
||||
"price": "Egy teljes tekercs ára. Ha nincs beállítva, a rendszer az filament árát veszi fel helyette.",
|
||||
"external_filament": "A kiválasztott tekercs egy külső adatbázisból származik. A szál elem(és valószínűleg a gyártó elem) automatikusan létrehozásra kerül amikor ezt a tekercset létrehozza. Ez okozhat szál duplikációt, ha ez a szál korábban már létre lett hozva.",
|
||||
"spool_weight": "Az üres tekercs súlya. Hagyja üresen a szál vagy a gyártó értékének a használatához.",
|
||||
"initial_weight": "A tekercsen lévő filament kezdeti súlya. Ha nincs beállítva, a filament rekord súlya lesz használva."
|
||||
},
|
||||
"form": {
|
||||
"new_location_prompt": "Add meg az új helyet",
|
||||
"spool_updated": "Ez a tekercs azóta frissült valaki/valami más által, mióta megnyitottad ezt az oldalt. A mentés felül fogja írni ezeket a változásokat!"
|
||||
"spool_updated": "Ezt a spoolot valaki / valami más frissítette, mivel megnyitotta ezt az oldalt. A megtakarítás felülírja ezeket a változásokat!",
|
||||
"measurement_type_label": "Mérési típus",
|
||||
"adjust_filament_value": "",
|
||||
"measurement_type": {
|
||||
"weight": "Súly",
|
||||
"length": "Hossz"
|
||||
},
|
||||
"adjust_filament_help": ""
|
||||
},
|
||||
"spool": "Tekercs",
|
||||
"spool": "Tekercsek",
|
||||
"messages": {
|
||||
"archive": "Biztosan archiválni szeretné ezt a tekercset?"
|
||||
},
|
||||
"formats": {
|
||||
"last_used": "Utolsó használat {{date}}"
|
||||
}
|
||||
},
|
||||
"buttons": {
|
||||
@@ -161,7 +210,8 @@
|
||||
"unArchive": "Arhiválás visszavonása",
|
||||
"clone": "Másolás",
|
||||
"clear": "Törlés",
|
||||
"saveAndAdd": "Mentés és hozzáadás"
|
||||
"saveAndAdd": "Mentés és hozzáadás",
|
||||
"continue": "Folytatás"
|
||||
},
|
||||
"filament": {
|
||||
"fields_help": {
|
||||
@@ -170,7 +220,8 @@
|
||||
"spool_weight": "Az üres tekercs súlya. Ezt használják a tekercs mért súlyának meghatározásához.",
|
||||
"price": "A teljes tekercs ára.",
|
||||
"weight": "A teljes tekercs súlya (nettó súly), amely nem tartalmazza a tekercs saját súlyát, csak a filament súlyát. Általában ez szerepel a csomagoláson.",
|
||||
"material": "Például. PLA, ABS, PETG stb."
|
||||
"material": "Például. PLA, ABS, PETG stb.",
|
||||
"multi_color_direction": ""
|
||||
},
|
||||
"fields": {
|
||||
"material": "Anyag",
|
||||
@@ -189,7 +240,12 @@
|
||||
"id": "ID",
|
||||
"color_hex": "Szín",
|
||||
"article_number": "Cikkszám",
|
||||
"spools": "Tekercsek megjelenítése"
|
||||
"spools": "Tekercsek megjelenítése",
|
||||
"multi_color": "",
|
||||
"external_id": "Külső ID",
|
||||
"single_color": "",
|
||||
"longitudinal": "",
|
||||
"coaxial": ""
|
||||
},
|
||||
"titles": {
|
||||
"clone": "Filament másolása",
|
||||
@@ -199,9 +255,11 @@
|
||||
"edit": "Filament szerkesztése",
|
||||
"list": "Filamentek"
|
||||
},
|
||||
"filament": "Filamentek",
|
||||
"filament": "Szálak",
|
||||
"form": {
|
||||
"filament_updated": "Ez a szál anyag azóta frissült valaki/valami más által, mióta megnyitottad ezt az oldalt. A mentés felül fogja írni ezeket a változásokat!"
|
||||
"filament_updated": "Ez a szál anyag azóta frissült valaki/valami más által, mióta megnyitottad ezt az oldalt. A mentés felül fogja írni ezeket a változásokat!",
|
||||
"import_external": "Importálás külső forrásból",
|
||||
"import_external_description": ""
|
||||
},
|
||||
"buttons": {
|
||||
"add_spool": "Tekercs hozzáadása"
|
||||
@@ -227,11 +285,16 @@
|
||||
"registered": "Nyilvántartott",
|
||||
"comment": "Megjegyzés",
|
||||
"name": "Név",
|
||||
"id": "ID"
|
||||
"id": "ID",
|
||||
"external_id": "Külső ID",
|
||||
"empty_spool_weight": "Üres tekercs súlya"
|
||||
},
|
||||
"vendor": "Gyártók",
|
||||
"form": {
|
||||
"vendor_updated": "Ez a szállító azóta frissült valaki/valami más által, mióta megnyitottad ezt az oldalt. A mentés felül fogja írni ezeket a változásokat!"
|
||||
"vendor_updated": "Ez a gyártó azóta frissült valaki/valami más által, mióta megnyitottad ezt az oldalt. A mentés felül fogja írni ezeket a változásokat!"
|
||||
},
|
||||
"fields_help": {
|
||||
"empty_spool_weight": "Ettől a gyártótól származó üres tekercs súlya."
|
||||
}
|
||||
},
|
||||
"scanner": {
|
||||
@@ -239,7 +302,7 @@
|
||||
"error": {
|
||||
"insecureContext": "Az oldal kiszolgálása nem HTTPS-en keresztül történik.",
|
||||
"notReadable": "A kamera nem használható.",
|
||||
"notAllowed": "Nincs jováhagyva a számodra a kamera használata.",
|
||||
"notAllowed": "Nem engedélyezte a kamerához való hozzáférést.",
|
||||
"unknown": "Ismeretlen hiba történt. ({{error}})",
|
||||
"notFound": "Nem található kamera.",
|
||||
"streamApiNotSupported": "A böngésző nem támogatja a MediaStream API-t."
|
||||
@@ -277,7 +340,9 @@
|
||||
},
|
||||
"kofi": "Tipp a Ko-fi-ra",
|
||||
"home": {
|
||||
"home": "Kezdő lap"
|
||||
"home": "Kezdő lap",
|
||||
"welcome": "Üdv a Spoolmanodban!",
|
||||
"description": "Úgy tűnik, még nem hoztál létre tekercset. Lásd a <helpPageLink>Help page </helpPageLink> a kezdeti lépésekhez."
|
||||
},
|
||||
"help": {
|
||||
"resources": {
|
||||
@@ -326,7 +391,21 @@
|
||||
"currency": {
|
||||
"label": "Pénznem"
|
||||
},
|
||||
"tab": "Általános"
|
||||
"tab": "Általános",
|
||||
"base_url": {
|
||||
"tooltip": "",
|
||||
"label": "Alap URL"
|
||||
},
|
||||
"round_prices": {
|
||||
"label": "Árak kerekítése",
|
||||
"tooltip": "Az árak legközelebbi egész számra való kerekítése."
|
||||
}
|
||||
}
|
||||
},
|
||||
"locations": {
|
||||
"new_location": "Új hely",
|
||||
"no_location": "Nincs hely megadva",
|
||||
"locations": "Helyek",
|
||||
"no_locations_help": "Ez az oldal lehetővé teszi, hogy rendszerezd a tekercseket helyek szerint, adj hozzá néhány tekercset a kezdéshez!"
|
||||
}
|
||||
}
|
||||
@@ -391,6 +391,8 @@
|
||||
"no_locations_help": "このページでは、スプールを場所ごとに整理することができます!"
|
||||
},
|
||||
"home": {
|
||||
"home": "ホーム"
|
||||
"home": "ホーム",
|
||||
"welcome": "",
|
||||
"description": ""
|
||||
}
|
||||
}
|
||||
@@ -0,0 +1,398 @@
|
||||
{
|
||||
"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": "스풀맨 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": "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": "제조업체 lot 번호. 여러 개의 스풀을 사용할 경우 인쇄물의 색상이 일관되도록 보장하는 데 사용할 수 있습니다.",
|
||||
"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": "스풀맨 인스턴스에 오신 것을 환영합니다!",
|
||||
"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",
|
||||
"float_range": "Float 범위",
|
||||
"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": "이 작업은 모든 엔티티에 대해 해당 필드와 관련된 모든 데이터를 삭제합니다."
|
||||
}
|
||||
},
|
||||
"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": "이 페이지에서는 스풀을 위치별로 정리할 수 있습니다. 시작하려면 스풀을 추가하세요!"
|
||||
}
|
||||
}
|
||||
@@ -0,0 +1,19 @@
|
||||
{
|
||||
"actions": {
|
||||
"create": "Izveidot",
|
||||
"edit": "Rediģēt",
|
||||
"clone": "Klonēt"
|
||||
},
|
||||
"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"
|
||||
}
|
||||
}
|
||||
@@ -349,7 +349,9 @@
|
||||
},
|
||||
"kofi": "Tip mij op Ko-fi",
|
||||
"home": {
|
||||
"home": "Thuis"
|
||||
"home": "Thuis",
|
||||
"welcome": "",
|
||||
"description": ""
|
||||
},
|
||||
"settings": {
|
||||
"header": "Instellingen",
|
||||
|
||||
@@ -345,7 +345,7 @@
|
||||
"filament": "Марка филамента. У них есть такие свойства, как имя, материал, цвет, диаметр и многое другое.",
|
||||
"vendor": "Компании, производящие филаменты."
|
||||
},
|
||||
"description": "<title>Помощь</title><p>Вот несколько советов, которые помогут вам начать</p><p>Spoolman хранит 3 различных типа данных:</p><itemsHelp/><p>Чтобы добавить новую катушку в базу данных, начните с создания объекта <filamentCreateLink>Филамент</filamentCreateLink>. Как только это будет сделано, приступайте к созданию объекта <spoolCreateLink>Катушка</spoolCreateLink> для этой конкретной катушки. Если позже вы приобретете дополнительные катушки того же филамента, просто создайте дополнительные объекты катушек и повторно используйте тот же объект Филамент.</p><p>При желании вы также можете создать объект <vendorCreateLink>Производитель</vendorCreateLink> для компании, производящий филамент, если хотите отслеживать эту информацию.</p><p>У вас есть возможность связать Spoolman с другими службами 3D-принтеров, например Moonraker, который может автоматически отслеживать использование филамента и обновлять объекты Катушек для вас. Обратитесь к <readmeLink>Spoolman README</readmeLink> для получения инструкций по настройке.</p>",
|
||||
"description": "<title>Помощь</title><p>Вот несколько советов, которые помогут вам начать.</p><p>Spoolman хранит 3 различных типа данных:</p><itemsHelp/><p>Чтобы добавить новую катушку в базу данных, начните с создания объекта <filamentCreateLink>филамент</filamentCreateLink>. Как только это будет сделано, приступайте к созданию объекта <spoolCreateLink>катушка</spoolCreateLink> для этой конкретной катушки. Если позже вы приобретете дополнительные катушки того же филамента, просто создайте дополнительные объекты катушек и повторно используйте тот же объект филамент.</p><p>При желании вы также можете создать объект <vendorCreateLink>производитель</vendorCreateLink> для компании, производящей филамент, если хотите отслеживать эту информацию.</p><p>У вас есть возможность связать Spoolman с другими службами 3D-принтеров, например Moonraker, который может автоматически отслеживать использование филамента и обновлять объекты катушек для вас. Обратитесь к <readmeLink>Spoolman README</readmeLink> для получения инструкций по настройке.</p>",
|
||||
"help": "Помощь"
|
||||
},
|
||||
"kofi": "Поддержите меня на Ko-fi",
|
||||
|
||||
@@ -0,0 +1,39 @@
|
||||
{
|
||||
"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"
|
||||
},
|
||||
"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}}"
|
||||
}
|
||||
}
|
||||
@@ -0,0 +1,401 @@
|
||||
{
|
||||
"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>Dodatna polja ni mogoče razvrstiti ali filtrirati v pogledih tabel.</p>",
|
||||
"choices_missing_error": "Možnosti ni mogoče odstraniti. Manjkajo naslednje možnosti: {{choices}}"
|
||||
}
|
||||
},
|
||||
"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."
|
||||
}
|
||||
}
|
||||
@@ -125,6 +125,15 @@
|
||||
"no": "Nej",
|
||||
"simple": "Enkel",
|
||||
"withIcon": "Med logga"
|
||||
},
|
||||
"useHTTPUrl": {
|
||||
"options": {
|
||||
"default": "",
|
||||
"url": ""
|
||||
},
|
||||
"preview": "",
|
||||
"tooltip": "",
|
||||
"label": ""
|
||||
}
|
||||
},
|
||||
"spoolSelect": {
|
||||
@@ -293,7 +302,9 @@
|
||||
}
|
||||
},
|
||||
"home": {
|
||||
"home": "Hem"
|
||||
"home": "Hem",
|
||||
"welcome": "",
|
||||
"description": ""
|
||||
},
|
||||
"table": {
|
||||
"actions": "Åtgärder"
|
||||
@@ -305,6 +316,14 @@
|
||||
"tab": "Allmänt",
|
||||
"currency": {
|
||||
"label": "Valuta"
|
||||
},
|
||||
"base_url": {
|
||||
"tooltip": "",
|
||||
"label": ""
|
||||
},
|
||||
"round_prices": {
|
||||
"label": "",
|
||||
"tooltip": ""
|
||||
}
|
||||
},
|
||||
"extra_fields": {
|
||||
@@ -368,6 +387,9 @@
|
||||
},
|
||||
"help": {
|
||||
"list": "Hjälp | Spoolman"
|
||||
},
|
||||
"locations": {
|
||||
"list": ""
|
||||
}
|
||||
},
|
||||
"help": {
|
||||
@@ -382,6 +404,8 @@
|
||||
"kofi": "Dricksa mig på Ko-fi",
|
||||
"locations": {
|
||||
"new_location": "Ny plats",
|
||||
"no_location": "Ingen plats"
|
||||
"no_location": "Ingen plats",
|
||||
"locations": "",
|
||||
"no_locations_help": ""
|
||||
}
|
||||
}
|
||||
@@ -342,6 +342,10 @@
|
||||
"base_url": {
|
||||
"label": "URLพื้นฐาน",
|
||||
"tooltip": "URLพื้นฐาน ที่ใช้สำหรับสร้างฟีเจอร์ต่างๆ เช่น QR code"
|
||||
},
|
||||
"round_prices": {
|
||||
"label": "",
|
||||
"tooltip": ""
|
||||
}
|
||||
},
|
||||
"extra_fields": {
|
||||
@@ -383,7 +387,9 @@
|
||||
"no_locations_help": "หน้านี้ให้คุณจัดการม้วนพลาสติกตามสถานที่เก็บ เพิ่มม้วนพลาสติกเพื่อเริ่มต้น!"
|
||||
},
|
||||
"home": {
|
||||
"home": "หน้าแรก"
|
||||
"home": "หน้าแรก",
|
||||
"welcome": "",
|
||||
"description": ""
|
||||
},
|
||||
"warnWhenUnsavedChanges": "คุณแน่ใจหรือไม่ว่าต้องการออก? คุณมีการเปลี่ยนแปลงที่ยังไม่ได้บันทึก",
|
||||
"table": {
|
||||
|
||||
@@ -68,7 +68,8 @@
|
||||
"length": "Довжина",
|
||||
"weight": "Вага"
|
||||
},
|
||||
"measurement_type_label": "Вид вимірювання"
|
||||
"measurement_type_label": "Вид вимірювання",
|
||||
"adjust_filament_help": ""
|
||||
},
|
||||
"fields_help": {
|
||||
"used_weight": "Скільки філаменту було використано з котушки. Для нової котушки слід використовувати 0g.",
|
||||
@@ -77,10 +78,16 @@
|
||||
"lot_nr": "Номер партії виробника. Може використовуватися для гарантування рівномірного кольору друку при використанні декількох котушок.",
|
||||
"remaining_weight": "Скільки філаменту залишилося на котушці. Для нової котушки це має відповідати вазі філаменту на котушці.",
|
||||
"location": "Де розташована котушка, якщо у вас є кілька місць для зберігання котушок.",
|
||||
"price": "Ціна цілої котушки. Якщо не вказано, замість неї буде використано ціну філамента."
|
||||
"price": "Ціна цілої котушки. Якщо не вказано, замість неї буде використано ціну філамента.",
|
||||
"spool_weight": "",
|
||||
"initial_weight": "",
|
||||
"external_filament": ""
|
||||
},
|
||||
"messages": {
|
||||
"archive": "Ви впевнені що хочете архівувати цю котушку?"
|
||||
},
|
||||
"formats": {
|
||||
"last_used": ""
|
||||
}
|
||||
},
|
||||
"actions": {
|
||||
@@ -167,7 +174,8 @@
|
||||
"options": {
|
||||
"default": "За замовчуванням",
|
||||
"url": "URL"
|
||||
}
|
||||
},
|
||||
"tooltip": ""
|
||||
},
|
||||
"template": "Шаблон етикетки",
|
||||
"showQRCode": "Надрукувати QR-код",
|
||||
@@ -231,7 +239,8 @@
|
||||
"single_color": "Одноколірний",
|
||||
"external_id": "Зовнішній ID",
|
||||
"multi_color": "Багатокольоровий",
|
||||
"coaxial": "Коекструдтваний"
|
||||
"coaxial": "Коекструдтваний",
|
||||
"longitudinal": ""
|
||||
},
|
||||
"titles": {
|
||||
"show_title": "[Філамент #{{id}}] {{name}}",
|
||||
@@ -247,12 +256,14 @@
|
||||
"name": "Назва філаменту, щоб відрізнити цей філамент поміж інших від того самого виробника. Вона повинна містити, наприклад, колір.",
|
||||
"article_number": "Напр. EAN, UPC тощо.",
|
||||
"spool_weight": "Вага порожньої котушки. Використовується для визначення виміряної ваги котушки.",
|
||||
"weight": "Вага повної котушки філаменту (нетто). Ця вага не повинна включати вагу самої котушки, а тільки філаменту. Зазвичай це вказується на упаковці."
|
||||
"weight": "Вага повної котушки філаменту (нетто). Ця вага не повинна включати вагу самої котушки, а тільки філаменту. Зазвичай це вказується на упаковці.",
|
||||
"multi_color_direction": ""
|
||||
},
|
||||
"filament": "Філаменти",
|
||||
"form": {
|
||||
"filament_updated": "Цей філамент хтось/щось оновив після того, як ви відкрили цю сторінку. Збереження перезапише ці зміни!",
|
||||
"import_external": "Імпортувати з зовнішнього джерела"
|
||||
"import_external": "Імпортувати з зовнішнього джерела",
|
||||
"import_external_description": ""
|
||||
},
|
||||
"buttons": {
|
||||
"add_spool": "Додати Котушку"
|
||||
@@ -286,6 +297,9 @@
|
||||
"vendor": "Виробники",
|
||||
"form": {
|
||||
"vendor_updated": "Цей виробник був оновлений кимось/чимось після відкриття цієї сторінки. Збереження перезапише ці зміни!"
|
||||
},
|
||||
"fields_help": {
|
||||
"empty_spool_weight": ""
|
||||
}
|
||||
},
|
||||
"documentTitle": {
|
||||
@@ -317,6 +331,9 @@
|
||||
},
|
||||
"help": {
|
||||
"list": "Довідка | Spoolman"
|
||||
},
|
||||
"locations": {
|
||||
"list": ""
|
||||
}
|
||||
},
|
||||
"table": {
|
||||
@@ -333,7 +350,9 @@
|
||||
},
|
||||
"kofi": "Задонатити на Ko-fi",
|
||||
"home": {
|
||||
"home": "Домашня"
|
||||
"home": "Домашня",
|
||||
"welcome": "",
|
||||
"description": ""
|
||||
},
|
||||
"settings": {
|
||||
"header": "Налаштування",
|
||||
@@ -343,7 +362,12 @@
|
||||
},
|
||||
"tab": "Загальне",
|
||||
"base_url": {
|
||||
"label": "Базова URL-адреса"
|
||||
"label": "Базова URL-адреса",
|
||||
"tooltip": ""
|
||||
},
|
||||
"round_prices": {
|
||||
"label": "",
|
||||
"tooltip": ""
|
||||
}
|
||||
},
|
||||
"extra_fields": {
|
||||
@@ -378,5 +402,11 @@
|
||||
"description": "<p>Тут ви можете додати додаткові користувацькі поля до своїх об’єктів.</p><p>Після додавання поля ви не можете змінити його ключ або тип, а для полів типу вибору ви не можете видалити варіанти або змінити стан кількох варіантів. Якщо ви вилучите поле, пов’язані дані для всіх об’єктів буде видалено.</p><p>Ключ – це те, як інші програми читають/записують дані, тож якщо ваше спеціальне поле має інтегруватися зі сторонніми програми, переконайтеся, що ви правильно її налаштували. Значення за замовчуванням застосовується лише до нових елементів.</p><p>Додаткові поля не можна сортувати чи фільтрувати в режимі перегляду таблиці.</p>"
|
||||
},
|
||||
"settings": "Налаштування"
|
||||
},
|
||||
"locations": {
|
||||
"new_location": "",
|
||||
"no_location": "",
|
||||
"locations": "",
|
||||
"no_locations_help": ""
|
||||
}
|
||||
}
|
||||
@@ -1,7 +1,7 @@
|
||||
{
|
||||
"actions": {
|
||||
"clone": "複製",
|
||||
"show": "檢視",
|
||||
"show": "顯示",
|
||||
"list": "列表",
|
||||
"create": "建立",
|
||||
"edit": "編輯"
|
||||
@@ -106,7 +106,7 @@
|
||||
"title": "標籤列印中",
|
||||
"template": "標籤範本",
|
||||
"button": "列印標籤",
|
||||
"templateHelp": "使用 {} 插入料盤物件的值作為內容。例如,{id} 會顯示料盤的 ID,或者 {filament.material} 會以該料盤的材料取代。如果缺少值,將以 \"?\" 代替。可以使用第二組 {} 來移除這個顯示。此外,任何夾在 {} 之間的文字若該值缺失也會被移除。例如,{Lot Nr: {lot_nr}} 僅在料盤有批號時顯示標籤。用雙星號 ** 圍繞文字使其加粗。點選此按鈕以查看所有可用標籤列表。",
|
||||
"templateHelp": "使用 {} 插入線捲物件的數值。例如,{id} 會被替換為線捲 ID,而 {filament.material} 則會替換為該線捲的材質。若數值缺失,會以「?」代替。您可以使用第二組 {} 來移除此符號;此外,若數值缺失,兩組 {} 之間的任何文字也都會被一併移除。例如,{批號:{lot_nr}} 僅會在該線捲含有批號資訊時顯示標籤。使用雙星號 ** 包圍文字可設為粗體。點擊按鈕可查看所有可用標籤的清單。",
|
||||
"textSize": "標籤文字大小",
|
||||
"showContent": "列印標籤",
|
||||
"useHTTPUrl": {
|
||||
@@ -324,7 +324,9 @@
|
||||
}
|
||||
},
|
||||
"home": {
|
||||
"home": "主頁"
|
||||
"home": "主頁",
|
||||
"welcome": "歡迎來到您的 Spoolman!",
|
||||
"description": "您似乎還沒新增任何線捲。請參閱 <helpPageLink>說明頁面</helpPageLink> 以了解如何開始使用。"
|
||||
},
|
||||
"help": {
|
||||
"help": "說明",
|
||||
@@ -349,6 +351,10 @@
|
||||
"base_url": {
|
||||
"tooltip": "生成 QR 碼等功能時使用的基本 URL。",
|
||||
"label": "基本URL"
|
||||
},
|
||||
"round_prices": {
|
||||
"label": "價格四捨五入",
|
||||
"tooltip": "將價格四捨五入至最接近的整數。"
|
||||
}
|
||||
},
|
||||
"extra_fields": {
|
||||
|
||||
@@ -339,7 +339,9 @@
|
||||
},
|
||||
"kofi": "在Ko-fi上给我打赏一点小费",
|
||||
"home": {
|
||||
"home": "主页"
|
||||
"home": "主页",
|
||||
"welcome": "",
|
||||
"description": ""
|
||||
},
|
||||
"help": {
|
||||
"help": "帮助",
|
||||
|
||||
@@ -9,17 +9,53 @@ const __dirname = dirname(fileURLToPath(import.meta.url));
|
||||
|
||||
const LOCALES_DIR = join(__dirname, "../public/locales");
|
||||
const I18N_FILE = join(__dirname, "../src/i18n.ts");
|
||||
const REFERENCE_LOCALE = "en";
|
||||
const MIN_TRANSLATED_RATIO = 0.5; // A locale must be at least 50% translated to be included
|
||||
|
||||
/**
|
||||
* Recursively collect all leaf values of a translation object, keyed by their
|
||||
* dotted path. Only string leaves are considered translatable.
|
||||
*/
|
||||
function collectLeaves(obj, prefix, out) {
|
||||
for (const [key, value] of Object.entries(obj)) {
|
||||
const path = prefix ? `${prefix}.${key}` : key;
|
||||
if (value && typeof value === "object") {
|
||||
collectLeaves(value, path, out);
|
||||
} else if (typeof value === "string") {
|
||||
out[path] = value;
|
||||
}
|
||||
}
|
||||
return out;
|
||||
}
|
||||
|
||||
function loadLocale(locale) {
|
||||
const commonFilePath = join(LOCALES_DIR, locale, "common.json");
|
||||
return collectLeaves(JSON.parse(readFileSync(commonFilePath, "utf8")), "", {});
|
||||
}
|
||||
|
||||
/**
|
||||
* Ratio of keys in `locale` that are present, non-empty, and different from the
|
||||
* English reference. Missing keys and untranslated (identical) strings count as
|
||||
* not translated.
|
||||
*/
|
||||
function translatedRatio(reference, locale) {
|
||||
const refKeys = Object.keys(reference);
|
||||
if (refKeys.length === 0) return 0;
|
||||
let translated = 0;
|
||||
for (const key of refKeys) {
|
||||
const value = locale[key];
|
||||
if (typeof value === "string" && value.trim() !== "" && value !== reference[key]) {
|
||||
translated++;
|
||||
}
|
||||
}
|
||||
return translated / refKeys.length;
|
||||
}
|
||||
|
||||
const minLocaleFileSize = 1024 * 10; // Minimum 10kB for a locale file to be considered
|
||||
function getLocaleFolders() {
|
||||
return readdirSync(LOCALES_DIR).filter((folder) => {
|
||||
const folderPath = join(LOCALES_DIR, folder);
|
||||
const commonFilePath = join(folderPath, "common.json");
|
||||
return (
|
||||
statSync(folderPath).isDirectory() &&
|
||||
statSync(commonFilePath).isFile() &&
|
||||
statSync(commonFilePath).size >= minLocaleFileSize
|
||||
);
|
||||
return statSync(folderPath).isDirectory() && statSync(commonFilePath, { throwIfNoEntry: false })?.isFile();
|
||||
});
|
||||
}
|
||||
|
||||
@@ -30,17 +66,27 @@ function getDeclaredLanguages() {
|
||||
}
|
||||
|
||||
function main() {
|
||||
const foundLocales = new Set(getLocaleFolders());
|
||||
const reference = loadLocale(REFERENCE_LOCALE);
|
||||
const declaredLocales = new Set(getDeclaredLanguages());
|
||||
|
||||
const missingLocales = [...foundLocales].filter((locale) => !declaredLocales.has(locale));
|
||||
// Locales that are sufficiently translated but not yet declared in i18n.ts
|
||||
const missingLocales = [];
|
||||
for (const locale of getLocaleFolders()) {
|
||||
if (locale === REFERENCE_LOCALE || declaredLocales.has(locale)) continue;
|
||||
const ratio = translatedRatio(reference, loadLocale(locale));
|
||||
if (ratio >= MIN_TRANSLATED_RATIO) {
|
||||
missingLocales.push({ locale, ratio });
|
||||
}
|
||||
}
|
||||
|
||||
if (missingLocales.length > 0) {
|
||||
console.error("❌ The following locales are missing from src/i18n.ts:");
|
||||
missingLocales.forEach((locale) => console.error(` - ${locale}`));
|
||||
console.error("❌ The following locales are at least 50% translated but missing from src/i18n.ts:");
|
||||
missingLocales.forEach(({ locale, ratio }) =>
|
||||
console.error(` - ${locale} (${Math.round(ratio * 100)}% translated)`),
|
||||
);
|
||||
console.error("⚠️ Please add them to the `languages` object in i18n.ts.");
|
||||
console.log("Template:");
|
||||
for (const locale of missingLocales) {
|
||||
for (const { locale } of missingLocales) {
|
||||
console.log(`["${locale}"]: {
|
||||
name: "",
|
||||
fullCode: "",
|
||||
@@ -50,7 +96,7 @@ function main() {
|
||||
process.exit(1);
|
||||
}
|
||||
|
||||
console.log("✅ All locales are properly declared in i18n.ts.");
|
||||
console.log("✅ All sufficiently translated locales are declared in i18n.ts.");
|
||||
process.exit(0);
|
||||
}
|
||||
|
||||
|
||||
@@ -1,7 +1,7 @@
|
||||
import { DateField, TextField } from "@refinedev/antd";
|
||||
import { UseQueryResult } from "@tanstack/react-query";
|
||||
import { Button, Col, Dropdown, Row, Space, Spin } from "antd";
|
||||
import { ColumnFilterItem, ColumnType } from "antd/es/table/interface";
|
||||
import { Button, Col, DatePicker, Dropdown, Input, InputNumber, Row, Space, Spin } from "antd";
|
||||
import { ColumnFilterItem, ColumnType, FilterDropdownProps } from "antd/es/table/interface";
|
||||
import dayjs from "dayjs";
|
||||
import utc from "dayjs/plugin/utc";
|
||||
import { AlignType } from "rc-table/lib/interface";
|
||||
@@ -27,6 +27,156 @@ const FilterDropdownLoading = () => {
|
||||
);
|
||||
};
|
||||
|
||||
function TextFilterDropdown({ setSelectedKeys, selectedKeys, confirm, clearFilters }: FilterDropdownProps) {
|
||||
const hasValue = selectedKeys.length > 0;
|
||||
return (
|
||||
<>
|
||||
<div style={{ padding: "8px" }}>
|
||||
<Input
|
||||
placeholder="Search..."
|
||||
value={selectedKeys[0] as string}
|
||||
onChange={(e) => setSelectedKeys(e.target.value ? [e.target.value] : [])}
|
||||
onPressEnter={() => confirm()}
|
||||
/>
|
||||
</div>
|
||||
<div className="ant-table-filter-dropdown-btns">
|
||||
<Button
|
||||
type="link"
|
||||
size="small"
|
||||
disabled={!hasValue}
|
||||
onClick={() => {
|
||||
clearFilters?.();
|
||||
confirm();
|
||||
}}
|
||||
>
|
||||
Reset
|
||||
</Button>
|
||||
<Button type="primary" size="small" onClick={() => confirm()}>
|
||||
OK
|
||||
</Button>
|
||||
</div>
|
||||
</>
|
||||
);
|
||||
}
|
||||
|
||||
function NumberRangeFilterDropdown({
|
||||
setSelectedKeys,
|
||||
selectedKeys,
|
||||
confirm,
|
||||
clearFilters,
|
||||
precision,
|
||||
}: FilterDropdownProps & { precision?: number }) {
|
||||
const current = selectedKeys[0] as string | undefined;
|
||||
let minVal: number | null = null;
|
||||
let maxVal: number | null = null;
|
||||
if (current && current.includes(":")) {
|
||||
const parts = current.split(":", 2);
|
||||
minVal = parts[0] ? Number(parts[0]) : null;
|
||||
maxVal = parts[1] ? Number(parts[1]) : null;
|
||||
}
|
||||
|
||||
const updateKeys = (min: number | null, max: number | null) => {
|
||||
if (min === null && max === null) {
|
||||
setSelectedKeys([]);
|
||||
} else {
|
||||
setSelectedKeys([`${min !== null ? min : ""}:${max !== null ? max : ""}`]);
|
||||
}
|
||||
};
|
||||
|
||||
const hasValue = selectedKeys.length > 0;
|
||||
return (
|
||||
<>
|
||||
<div style={{ padding: "8px", display: "flex", flexDirection: "column", gap: 4 }}>
|
||||
<InputNumber
|
||||
placeholder="Min..."
|
||||
value={minVal}
|
||||
precision={precision ?? 0}
|
||||
onChange={(value) => updateKeys(value, maxVal)}
|
||||
/>
|
||||
<InputNumber
|
||||
placeholder="Max..."
|
||||
value={maxVal}
|
||||
precision={precision ?? 0}
|
||||
onChange={(value) => updateKeys(minVal, value)}
|
||||
/>
|
||||
</div>
|
||||
<div className="ant-table-filter-dropdown-btns">
|
||||
<Button
|
||||
type="link"
|
||||
size="small"
|
||||
disabled={!hasValue}
|
||||
onClick={() => {
|
||||
clearFilters?.();
|
||||
confirm();
|
||||
}}
|
||||
>
|
||||
Reset
|
||||
</Button>
|
||||
<Button type="primary" size="small" onClick={() => confirm()}>
|
||||
OK
|
||||
</Button>
|
||||
</div>
|
||||
</>
|
||||
);
|
||||
}
|
||||
|
||||
function DateTimeRangeFilterDropdown({ setSelectedKeys, selectedKeys, confirm, clearFilters }: FilterDropdownProps) {
|
||||
const current = selectedKeys[0] as string | undefined;
|
||||
let fromVal: dayjs.Dayjs | null = null;
|
||||
let toVal: dayjs.Dayjs | null = null;
|
||||
if (current && current.includes("|")) {
|
||||
const parts = current.split("|", 2);
|
||||
fromVal = parts[0] ? dayjs(parts[0]) : null;
|
||||
toVal = parts[1] ? dayjs(parts[1]) : null;
|
||||
}
|
||||
|
||||
const updateKeys = (from: dayjs.Dayjs | null, to: dayjs.Dayjs | null) => {
|
||||
if (from === null && to === null) {
|
||||
setSelectedKeys([]);
|
||||
} else {
|
||||
setSelectedKeys([`${from ? from.utc().toISOString() : ""}|${to ? to.utc().toISOString() : ""}`]);
|
||||
}
|
||||
};
|
||||
|
||||
const hasValue = selectedKeys.length > 0;
|
||||
return (
|
||||
<>
|
||||
<div style={{ padding: "8px", display: "flex", flexDirection: "column", gap: 4 }}>
|
||||
<DatePicker
|
||||
showTime={{ use12Hours: false }}
|
||||
format="YYYY-MM-DD HH:mm:ss"
|
||||
placeholder="From..."
|
||||
value={fromVal}
|
||||
onChange={(date) => updateKeys(date, toVal)}
|
||||
/>
|
||||
<DatePicker
|
||||
showTime={{ use12Hours: false }}
|
||||
format="YYYY-MM-DD HH:mm:ss"
|
||||
placeholder="To..."
|
||||
value={toVal}
|
||||
onChange={(date) => updateKeys(fromVal, date)}
|
||||
/>
|
||||
</div>
|
||||
<div className="ant-table-filter-dropdown-btns">
|
||||
<Button
|
||||
type="link"
|
||||
size="small"
|
||||
disabled={!hasValue}
|
||||
onClick={() => {
|
||||
clearFilters?.();
|
||||
confirm();
|
||||
}}
|
||||
>
|
||||
Reset
|
||||
</Button>
|
||||
<Button type="primary" size="small" onClick={() => confirm()}>
|
||||
OK
|
||||
</Button>
|
||||
</div>
|
||||
</>
|
||||
);
|
||||
}
|
||||
|
||||
interface Entity {
|
||||
id: number;
|
||||
}
|
||||
@@ -40,7 +190,7 @@ export interface Action {
|
||||
|
||||
interface BaseColumnProps<Obj extends Entity> {
|
||||
id: string | string[];
|
||||
dataId?: keyof Obj & string;
|
||||
dataId?: (keyof Obj & string) | string; // Allow string values for custom fields
|
||||
i18ncat?: string;
|
||||
i18nkey?: string;
|
||||
title?: string;
|
||||
@@ -62,6 +212,7 @@ interface FilteredColumnProps {
|
||||
allowMultipleFilters?: boolean;
|
||||
onFilterDropdownOpen?: () => void;
|
||||
loadingFilters?: boolean;
|
||||
filterDropdown?: (props: FilterDropdownProps) => React.ReactNode;
|
||||
}
|
||||
|
||||
interface CustomColumnProps<Obj> {
|
||||
@@ -98,10 +249,8 @@ function Column<Obj extends Entity>(
|
||||
// Sorting
|
||||
if (props.sorter) {
|
||||
columnProps.sorter = true;
|
||||
columnProps.sortOrder = getSortOrderForField(
|
||||
typeSorters<Obj>(props.tableState.sorters),
|
||||
props.dataId ?? (props.id as keyof Obj),
|
||||
);
|
||||
const sortField = props.dataId ?? (Array.isArray(props.id) ? props.id.join(".") : props.id);
|
||||
columnProps.sortOrder = getSortOrderForField(typeSorters<Obj>(props.tableState.sorters), sortField);
|
||||
}
|
||||
|
||||
// Filter
|
||||
@@ -121,6 +270,13 @@ function Column<Obj extends Entity>(
|
||||
if (props.dataId) {
|
||||
columnProps.key = props.dataId;
|
||||
}
|
||||
} else if (props.filterDropdown) {
|
||||
columnProps.filterDropdown = props.filterDropdown;
|
||||
columnProps.filteredValue = props.filteredValue;
|
||||
columnProps.filterMultiple = false;
|
||||
if (props.dataId) {
|
||||
columnProps.key = props.dataId;
|
||||
}
|
||||
}
|
||||
|
||||
// Render
|
||||
@@ -174,7 +330,7 @@ export function SortedColumn<Obj extends Entity>(props: BaseColumnProps<Obj>) {
|
||||
}
|
||||
|
||||
export function RichColumn<Obj extends Entity>(
|
||||
props: Omit<BaseColumnProps<Obj>, "transform"> & { transform?: (value: unknown) => string },
|
||||
props: Omit<BaseColumnProps<Obj>, "transform"> & FilteredColumnProps & { transform?: (value: unknown) => string },
|
||||
) {
|
||||
return Column({
|
||||
...props,
|
||||
@@ -207,11 +363,12 @@ export function FilteredQueryColumn<Obj extends Entity>(props: FilteredQueryColu
|
||||
}
|
||||
filters.push({
|
||||
text: "<empty>",
|
||||
value: "<empty>",
|
||||
value: "",
|
||||
});
|
||||
|
||||
const typedFilters = typeFilters<Obj>(props.tableState.filters);
|
||||
const filteredValue = getFiltersForField(typedFilters, props.dataId ?? (props.id as keyof Obj));
|
||||
const filterField = props.dataId ?? (Array.isArray(props.id) ? props.id.join(".") : props.id);
|
||||
const filteredValue = getFiltersForField(typedFilters, filterField);
|
||||
|
||||
const onFilterDropdownOpen = () => {
|
||||
query.refetch();
|
||||
@@ -220,7 +377,7 @@ export function FilteredQueryColumn<Obj extends Entity>(props: FilteredQueryColu
|
||||
return Column({ ...props, filters, filteredValue, onFilterDropdownOpen, loadingFilters: query.isLoading });
|
||||
}
|
||||
|
||||
interface NumberColumnProps<Obj extends Entity> extends BaseColumnProps<Obj> {
|
||||
interface NumberColumnProps<Obj extends Entity> extends BaseColumnProps<Obj>, FilteredColumnProps {
|
||||
unit: string;
|
||||
maxDecimals?: number;
|
||||
minDecimals?: number;
|
||||
@@ -250,7 +407,7 @@ export function NumberColumn<Obj extends Entity>(props: NumberColumnProps<Obj>)
|
||||
});
|
||||
}
|
||||
|
||||
export function DateColumn<Obj extends Entity>(props: BaseColumnProps<Obj>) {
|
||||
export function DateColumn<Obj extends Entity>(props: BaseColumnProps<Obj> & FilteredColumnProps) {
|
||||
return Column({
|
||||
...props,
|
||||
render: (rawValue) => {
|
||||
@@ -325,7 +482,8 @@ export function SpoolIconColumn<Obj extends Entity>(props: SpoolIconColumnProps<
|
||||
});
|
||||
|
||||
const typedFilters = typeFilters<Obj>(props.tableState.filters);
|
||||
const filteredValue = getFiltersForField(typedFilters, props.dataId ?? (props.id as keyof Obj));
|
||||
const filterField = props.dataId ?? (Array.isArray(props.id) ? props.id.join(".") : props.id);
|
||||
const filteredValue = getFiltersForField(typedFilters, filterField);
|
||||
|
||||
const onFilterDropdownOpen = () => {
|
||||
query.refetch();
|
||||
@@ -389,13 +547,46 @@ export function NumberRangeColumn<Obj extends Entity>(props: NumberColumnProps<O
|
||||
});
|
||||
}
|
||||
|
||||
// Helper function to create filter items for custom fields (boolean and choice only)
|
||||
function createCustomFieldFilters(field: Field): ColumnFilterItem[] {
|
||||
const filters: ColumnFilterItem[] = [];
|
||||
|
||||
if (field.field_type === FieldType.boolean) {
|
||||
// "No" maps to empty ("") because the backend treats unset and false as equivalent
|
||||
return [
|
||||
{ text: "Yes", value: "true" },
|
||||
{ text: "No / Not set", value: "" },
|
||||
];
|
||||
}
|
||||
|
||||
// For choice fields, add each choice as a filter option
|
||||
if (field.field_type === FieldType.choice && field.choices) {
|
||||
field.choices.forEach((choice) => {
|
||||
filters.push({
|
||||
text: choice,
|
||||
value: `"${choice}"`,
|
||||
});
|
||||
});
|
||||
}
|
||||
|
||||
filters.push({ text: "<empty>", value: "" });
|
||||
|
||||
return filters;
|
||||
}
|
||||
|
||||
export function CustomFieldColumn<Obj extends Entity>(props: Omit<BaseColumnProps<Obj>, "id"> & { field: Field }) {
|
||||
const field = props.field;
|
||||
const fieldId = `extra.${field.key}`;
|
||||
|
||||
const typedFilters = typeFilters<Obj>(props.tableState.filters);
|
||||
const filteredValue = getFiltersForField(typedFilters, fieldId);
|
||||
|
||||
const commonProps = {
|
||||
...props,
|
||||
id: ["extra", field.key],
|
||||
title: field.name,
|
||||
sorter: false,
|
||||
sorter: true,
|
||||
dataId: fieldId,
|
||||
transform: (value: unknown) => {
|
||||
if (value === null || value === undefined) {
|
||||
return undefined;
|
||||
@@ -407,12 +598,16 @@ export function CustomFieldColumn<Obj extends Entity>(props: Omit<BaseColumnProp
|
||||
if (field.field_type === FieldType.integer) {
|
||||
return NumberColumn({
|
||||
...commonProps,
|
||||
filterDropdown: (p: FilterDropdownProps) => <NumberRangeFilterDropdown {...p} precision={0} />,
|
||||
filteredValue,
|
||||
unit: field.unit ?? "",
|
||||
maxDecimals: 0,
|
||||
});
|
||||
} else if (field.field_type === FieldType.float) {
|
||||
return NumberColumn({
|
||||
...commonProps,
|
||||
filterDropdown: (p: FilterDropdownProps) => <NumberRangeFilterDropdown {...p} precision={3} />,
|
||||
filteredValue,
|
||||
unit: field.unit ?? "",
|
||||
minDecimals: 0,
|
||||
maxDecimals: 3,
|
||||
@@ -420,12 +615,16 @@ export function CustomFieldColumn<Obj extends Entity>(props: Omit<BaseColumnProp
|
||||
} else if (field.field_type === FieldType.integer_range) {
|
||||
return NumberRangeColumn({
|
||||
...commonProps,
|
||||
filterDropdown: (p: FilterDropdownProps) => <NumberRangeFilterDropdown {...p} precision={0} />,
|
||||
filteredValue,
|
||||
unit: field.unit ?? "",
|
||||
maxDecimals: 0,
|
||||
});
|
||||
} else if (field.field_type === FieldType.float_range) {
|
||||
return NumberRangeColumn({
|
||||
...commonProps,
|
||||
filterDropdown: (p: FilterDropdownProps) => <NumberRangeFilterDropdown {...p} precision={3} />,
|
||||
filteredValue,
|
||||
unit: field.unit ?? "",
|
||||
minDecimals: 0,
|
||||
maxDecimals: 3,
|
||||
@@ -433,14 +632,20 @@ export function CustomFieldColumn<Obj extends Entity>(props: Omit<BaseColumnProp
|
||||
} else if (field.field_type === FieldType.text) {
|
||||
return RichColumn({
|
||||
...commonProps,
|
||||
filterDropdown: TextFilterDropdown,
|
||||
filteredValue,
|
||||
});
|
||||
} else if (field.field_type === FieldType.datetime) {
|
||||
return DateColumn({
|
||||
...commonProps,
|
||||
filterDropdown: DateTimeRangeFilterDropdown,
|
||||
filteredValue,
|
||||
});
|
||||
} else if (field.field_type === FieldType.boolean) {
|
||||
return Column({
|
||||
...commonProps,
|
||||
filters: createCustomFieldFilters(field),
|
||||
filteredValue,
|
||||
render: (rawValue) => {
|
||||
const value = commonProps.transform ? commonProps.transform(rawValue) : rawValue;
|
||||
let text;
|
||||
@@ -457,6 +662,8 @@ export function CustomFieldColumn<Obj extends Entity>(props: Omit<BaseColumnProp
|
||||
} else if (field.field_type === FieldType.choice && !field.multi_choice) {
|
||||
return Column({
|
||||
...commonProps,
|
||||
filters: createCustomFieldFilters(field),
|
||||
filteredValue,
|
||||
render: (rawValue) => {
|
||||
const value = commonProps.transform ? commonProps.transform(rawValue) : rawValue;
|
||||
return <TextField value={value} />;
|
||||
@@ -465,6 +672,8 @@ export function CustomFieldColumn<Obj extends Entity>(props: Omit<BaseColumnProp
|
||||
} else if (field.field_type === FieldType.choice && field.multi_choice) {
|
||||
return Column({
|
||||
...commonProps,
|
||||
filters: createCustomFieldFilters(field),
|
||||
filteredValue,
|
||||
render: (rawValue) => {
|
||||
const value = commonProps.transform ? commonProps.transform(rawValue) : rawValue;
|
||||
return <TextField value={(value as string[] | undefined)?.join(", ")} />;
|
||||
|
||||
@@ -2,6 +2,8 @@ import { DataProvider } from "@refinedev/core";
|
||||
import { axiosInstance } from "@refinedev/simple-rest";
|
||||
import { AxiosInstance } from "axios";
|
||||
import { stringify } from "query-string";
|
||||
import { getCustomFieldFilters } from "../utils/filtering";
|
||||
import { isCustomField } from "../utils/queryFields";
|
||||
|
||||
type MethodTypes = "get" | "delete" | "head" | "options";
|
||||
type MethodTypesWithBody = "post" | "put" | "patch";
|
||||
@@ -25,20 +27,30 @@ const dataProvider = (
|
||||
}
|
||||
|
||||
if (sorters && sorters.length > 0) {
|
||||
// Map all sorters, including custom field sorters
|
||||
queryParams["sort"] = sorters
|
||||
.map((sort) => {
|
||||
const field = sort.field;
|
||||
// Custom field sorters are already in the correct format (extra.field_key)
|
||||
return `${field}:${sort.order}`;
|
||||
})
|
||||
.join(",");
|
||||
}
|
||||
|
||||
if (filters && filters.length > 0) {
|
||||
// Process regular filters
|
||||
filters.forEach((filter) => {
|
||||
if (!("field" in filter)) {
|
||||
throw Error("Filter must be a LogicalFilter.");
|
||||
}
|
||||
|
||||
const field = filter.field;
|
||||
|
||||
// Skip custom fields, they'll be handled separately
|
||||
if (typeof field === "string" && isCustomField(field)) {
|
||||
return;
|
||||
}
|
||||
|
||||
if (filter.value.length > 0) {
|
||||
const filterValueArray = Array.isArray(filter.value) ? filter.value : [filter.value];
|
||||
|
||||
@@ -54,6 +66,14 @@ const dataProvider = (
|
||||
queryParams[field] = filterValue;
|
||||
}
|
||||
});
|
||||
|
||||
// Process custom field filters
|
||||
const customFieldFilters = getCustomFieldFilters(filters);
|
||||
Object.entries(customFieldFilters).forEach(([key, values]) => {
|
||||
if (values.length > 0) {
|
||||
queryParams[`extra.${key}`] = values.map((value) => (value === "<empty>" ? "" : value)).join(",");
|
||||
}
|
||||
});
|
||||
}
|
||||
|
||||
const { data, headers } = await httpClient[requestMethod](`${url}`, {
|
||||
|
||||
@@ -187,16 +187,20 @@ export function ParsedExtras<T extends { extra?: { [key: string]: string } }>(
|
||||
|
||||
/**
|
||||
* Convert the JSON-parsed value extra key-values of an entity to their string values.
|
||||
*
|
||||
* A field the user left empty has no value, which travels as an explicit null: the API
|
||||
* merges `extra` per key, so a key simply left out of the map would keep whatever it
|
||||
* already held instead of being cleared.
|
||||
* @param obj
|
||||
* @returns
|
||||
*/
|
||||
export function StringifiedExtras<T extends { extra?: { [key: string]: unknown } }>(
|
||||
obj: T,
|
||||
): Omit<T, "extra"> & { extra?: { [key: string]: string } } {
|
||||
): Omit<T, "extra"> & { extra?: { [key: string]: string | null } } {
|
||||
if (obj.extra) {
|
||||
const newExtra: { [key: string]: string } = {};
|
||||
const newExtra: { [key: string]: string | null } = {};
|
||||
Object.entries(obj.extra).forEach(([key, value]) => {
|
||||
newExtra[key] = JSON.stringify(value);
|
||||
newExtra[key] = value === undefined ? null : JSON.stringify(value);
|
||||
});
|
||||
return {
|
||||
...obj,
|
||||
|
||||
@@ -1,9 +1,9 @@
|
||||
import { DownOutlined } from "@ant-design/icons";
|
||||
import { DesktopOutlined, DownOutlined, MoonOutlined, SunOutlined } from "@ant-design/icons";
|
||||
import type { RefineThemedLayoutHeaderProps } from "@refinedev/antd";
|
||||
import { useGetLocale, useSetLocale } from "@refinedev/core";
|
||||
import { Layout as AntdLayout, Button, Dropdown, MenuProps, Space, Switch, theme } from "antd";
|
||||
import { useGetLocale, useSetLocale, useTranslate } from "@refinedev/core";
|
||||
import { Layout as AntdLayout, Button, Dropdown, MenuProps, Segmented, Space, theme } from "antd";
|
||||
import React, { useContext } from "react";
|
||||
import { ColorModeContext } from "../../contexts/color-mode";
|
||||
import { ColorModeContext, ThemePreference } from "../../contexts/color-mode";
|
||||
|
||||
import { languages } from "../../i18n";
|
||||
import QRCodeScannerModal from "../qrCodeScanner";
|
||||
@@ -12,12 +12,19 @@ const { useToken } = theme;
|
||||
|
||||
export const Header = ({ sticky }: RefineThemedLayoutHeaderProps) => {
|
||||
const { token } = useToken();
|
||||
const t = useTranslate();
|
||||
const locale = useGetLocale();
|
||||
const changeLanguage = useSetLocale();
|
||||
const { mode, setMode } = useContext(ColorModeContext);
|
||||
const { preference, setPreference } = useContext(ColorModeContext);
|
||||
|
||||
const currentLocale = locale();
|
||||
|
||||
const themeOptions = [
|
||||
{ value: "system", icon: <DesktopOutlined />, title: t("theme.system") },
|
||||
{ value: "light", icon: <SunOutlined />, title: t("theme.light") },
|
||||
{ value: "dark", icon: <MoonOutlined />, title: t("theme.dark") },
|
||||
];
|
||||
|
||||
const menuItems: MenuProps["items"] = [...(Object.keys(languages) || [])].sort().map((lang: string) => ({
|
||||
key: lang,
|
||||
onClick: () => changeLanguage(lang),
|
||||
@@ -55,11 +62,11 @@ export const Header = ({ sticky }: RefineThemedLayoutHeaderProps) => {
|
||||
</Space>
|
||||
</Button>
|
||||
</Dropdown>
|
||||
<Switch
|
||||
checkedChildren="🌛"
|
||||
unCheckedChildren="🔆"
|
||||
onChange={() => setMode(mode === "light" ? "dark" : "light")}
|
||||
defaultChecked={mode === "dark"}
|
||||
<Segmented
|
||||
aria-label={t("theme.label")}
|
||||
options={themeOptions}
|
||||
value={preference}
|
||||
onChange={(value) => setPreference(value as ThemePreference)}
|
||||
/>
|
||||
<QRCodeScannerModal />
|
||||
</Space>
|
||||
|
||||
@@ -18,12 +18,12 @@ const QRCodeScannerModal = () => {
|
||||
const result = detectedCodes[0].rawValue;
|
||||
|
||||
// Check for the spoolman ID format
|
||||
const match = result.match(/^web\+spoolman:s-(?<id>[0-9]+)$/);
|
||||
const match = result.match(/^web\+spoolman:s-(?<id>[0-9]+)$/i);
|
||||
if (match && match.groups) {
|
||||
setVisible(false);
|
||||
navigate(`/spool/show/${match.groups.id}`);
|
||||
}
|
||||
const fullURLmatch = result.match(/^https?:\/\/[^/]+\/spool\/show\/(?<id>[0-9]+)$/);
|
||||
const fullURLmatch = result.match(/^https?:\/\/[^/]+\/spool\/show\/(?<id>[0-9]+)$/i);
|
||||
if (fullURLmatch && fullURLmatch.groups) {
|
||||
setVisible(false);
|
||||
navigate(`/spool/show/${fullURLmatch.groups.id}`);
|
||||
@@ -41,7 +41,10 @@ const QRCodeScannerModal = () => {
|
||||
facingMode: "environment",
|
||||
}}
|
||||
onScan={onScan}
|
||||
formats={["qr_code"]}
|
||||
// Accept common 2D matrix codes, not just QR, so labels generated with e.g.
|
||||
// Data Matrix or Aztec codes can be scanned too (issue #887). Payloads that
|
||||
// don't match the spoolman format are ignored, so widening this is harmless.
|
||||
formats={["qr_code", "micro_qr_code", "rm_qr_code", "data_matrix", "aztec", "pdf417"]}
|
||||
onError={(err: unknown) => {
|
||||
const error = err as Error;
|
||||
console.error(error);
|
||||
|
||||
@@ -1,39 +1,60 @@
|
||||
import { ConfigProvider, theme } from "antd";
|
||||
import { createContext, PropsWithChildren, useEffect, useState } from "react";
|
||||
|
||||
export type ThemePreference = "system" | "light" | "dark";
|
||||
type ResolvedMode = "light" | "dark";
|
||||
|
||||
type ColorModeContextType = {
|
||||
mode: string;
|
||||
setMode: (mode: string) => void;
|
||||
// The effective theme actually applied ("light" | "dark").
|
||||
mode: ResolvedMode;
|
||||
// The user's chosen preference; "system" follows the OS/browser setting live.
|
||||
preference: ThemePreference;
|
||||
setPreference: (preference: ThemePreference) => void;
|
||||
};
|
||||
|
||||
export const ColorModeContext = createContext<ColorModeContextType>({} as ColorModeContextType);
|
||||
|
||||
const DARK_MEDIA_QUERY = "(prefers-color-scheme: dark)";
|
||||
|
||||
const isThemePreference = (value: string | null): value is ThemePreference =>
|
||||
value === "system" || value === "light" || value === "dark";
|
||||
|
||||
const getSystemMode = (): ResolvedMode => (window?.matchMedia(DARK_MEDIA_QUERY).matches ? "dark" : "light");
|
||||
|
||||
export const ColorModeContextProvider = ({ children }: PropsWithChildren) => {
|
||||
const colorModeFromLocalStorage = localStorage.getItem("colorMode");
|
||||
const isSystemPreferenceDark = window?.matchMedia("(prefers-color-scheme: dark)").matches;
|
||||
// Legacy versions stored the resolved "light"/"dark" here, which are still valid
|
||||
// preference values, so existing users keep whatever they had. New/unset installs
|
||||
// default to "system" so the app follows the OS/browser theme (issue #947).
|
||||
const storedPreference = localStorage.getItem("colorMode");
|
||||
const [preference, setPreferenceState] = useState<ThemePreference>(
|
||||
isThemePreference(storedPreference) ? storedPreference : "system",
|
||||
);
|
||||
|
||||
const systemPreference = isSystemPreferenceDark ? "dark" : "light";
|
||||
const [mode, setMode] = useState(colorModeFromLocalStorage || systemPreference);
|
||||
const [systemMode, setSystemMode] = useState<ResolvedMode>(getSystemMode);
|
||||
|
||||
// Keep tracking the OS/browser theme so "system" reacts to changes at runtime.
|
||||
useEffect(() => {
|
||||
window.localStorage.setItem("colorMode", mode);
|
||||
}, [mode]);
|
||||
const media = window.matchMedia(DARK_MEDIA_QUERY);
|
||||
const handler = (event: MediaQueryListEvent) => setSystemMode(event.matches ? "dark" : "light");
|
||||
media.addEventListener("change", handler);
|
||||
return () => media.removeEventListener("change", handler);
|
||||
}, []);
|
||||
|
||||
const setColorMode = () => {
|
||||
if (mode === "light") {
|
||||
setMode("dark");
|
||||
} else {
|
||||
setMode("light");
|
||||
}
|
||||
const setPreference = (next: ThemePreference) => {
|
||||
setPreferenceState(next);
|
||||
window.localStorage.setItem("colorMode", next);
|
||||
};
|
||||
|
||||
const mode: ResolvedMode = preference === "system" ? systemMode : preference;
|
||||
|
||||
const { darkAlgorithm, defaultAlgorithm } = theme;
|
||||
|
||||
return (
|
||||
<ColorModeContext.Provider
|
||||
value={{
|
||||
setMode: setColorMode,
|
||||
mode,
|
||||
preference,
|
||||
setPreference,
|
||||
}}
|
||||
>
|
||||
<ConfigProvider
|
||||
|
||||
@@ -139,6 +139,16 @@ export const languages: { [key: string]: Language } = {
|
||||
fullCode: "th-TH",
|
||||
djs: () => import("dayjs/locale/th"),
|
||||
},
|
||||
["lt"]: {
|
||||
name: "Lietuvių",
|
||||
fullCode: "lt-LT",
|
||||
djs: () => import("dayjs/locale/lt"),
|
||||
},
|
||||
["tr"]: {
|
||||
name: "Türkçe",
|
||||
fullCode: "tr-TR",
|
||||
djs: () => import("dayjs/locale/tr"),
|
||||
},
|
||||
};
|
||||
|
||||
i18n
|
||||
|
||||
@@ -64,6 +64,7 @@ export const FilamentCreate = (props: IResourceComponentsProps & CreateOrClonePr
|
||||
const { selectProps: vendorSelect } = useSelect<IVendor>({
|
||||
resource: "vendor",
|
||||
optionLabel: "name",
|
||||
pagination: { mode: "off" },
|
||||
});
|
||||
|
||||
const importFilament = async (filament: ExternalFilament) => {
|
||||
|
||||
@@ -19,6 +19,10 @@ We also need to stringify them again before sending them back to the API, which
|
||||
the form's onFinish method. Form.Item's normalize should do this, but it doesn't seem to work.
|
||||
*/
|
||||
|
||||
// What the form submits: extra values back as JSON strings, with null for a field left
|
||||
// empty — the API merges extra per key, so null is what clears a value.
|
||||
type IFilamentRequest = Omit<IFilament, "extra"> & { extra?: { [key: string]: string | null } };
|
||||
|
||||
export const FilamentEdit = () => {
|
||||
const t = useTranslate();
|
||||
const [messageApi, contextHolder] = message.useMessage();
|
||||
@@ -27,7 +31,7 @@ export const FilamentEdit = () => {
|
||||
const currency = useCurrency();
|
||||
const [colorType, setColorType] = useState<"single" | "multi">("single");
|
||||
|
||||
const { formProps, saveButtonProps } = useForm<IFilament, HttpError, IFilament, IFilament>({
|
||||
const { formProps, saveButtonProps } = useForm<IFilament, HttpError, IFilamentRequest, IFilament>({
|
||||
liveMode: "manual",
|
||||
onLiveEvent() {
|
||||
// Warn the user if the filament has been updated since the form was opened
|
||||
@@ -40,6 +44,7 @@ export const FilamentEdit = () => {
|
||||
const { selectProps } = useSelect<IVendor>({
|
||||
resource: "vendor",
|
||||
optionLabel: "name",
|
||||
pagination: { mode: "off" },
|
||||
});
|
||||
|
||||
// Add the vendor_id field to the form
|
||||
|
||||
@@ -107,7 +107,7 @@ export function LocationContainer() {
|
||||
|
||||
// Update the value in the settings
|
||||
const newLocs = [...locationsList].filter((loc) => loc != EMPTYLOC);
|
||||
newLocs[locationsList.indexOf(location)] = newTitle;
|
||||
newLocs[newLocs.indexOf(location)] = newTitle;
|
||||
setLocationsSetting.mutate(newLocs);
|
||||
};
|
||||
|
||||
|
||||
@@ -45,7 +45,6 @@
|
||||
flex-direction: column;
|
||||
gap: 0.5em;
|
||||
min-height: 3em;
|
||||
max-height: 50em;
|
||||
overflow-y: scroll;
|
||||
}
|
||||
|
||||
|
||||
@@ -110,7 +110,7 @@ const QRCodePrintingDialog = ({
|
||||
</Radio.Group>
|
||||
</Form.Item>
|
||||
<Form.Item label={t("printing.qrcode.useHTTPUrl.preview")}>
|
||||
<Text> {useHTTPUrl ? `${baseUrlRoot}/spool/show/{id}` : `web+spoolman:s-{id}`}</Text>
|
||||
<Text> {useHTTPUrl ? `${baseUrlRoot}/spool/show/{id}` : `WEB+SPOOLMAN:S-{id}`}</Text>
|
||||
</Form.Item>
|
||||
</>
|
||||
)}
|
||||
|
||||
@@ -300,7 +300,7 @@ Spool Weight: {filament.spool_weight} g
|
||||
</>
|
||||
}
|
||||
items={items.map((spool) => ({
|
||||
value: useHTTPUrl ? `${baseUrlRoot}/spool/show/${spool.id}` : `web+spoolman:s-${spool.id}`,
|
||||
value: useHTTPUrl ? `${baseUrlRoot}/spool/show/${spool.id}` : `WEB+SPOOLMAN:S-${spool.id}`,
|
||||
label: (
|
||||
<p
|
||||
style={{
|
||||
|
||||
@@ -9,6 +9,7 @@ import { useEffect, useMemo, useState } from "react";
|
||||
import { ExtraFieldFormItem, ParsedExtras, StringifiedExtras } from "../../components/extraFields";
|
||||
import { useSpoolmanLocations } from "../../components/otherModels";
|
||||
import { searchMatches } from "../../utils/filtering";
|
||||
import { useLocations } from "../locations/functions";
|
||||
import "../../utils/overrides.css";
|
||||
import { formatNumberOnUserInput, numberParser, numberParserAllowEmpty } from "../../utils/parsing";
|
||||
import { EntityType, useGetFields } from "../../utils/queryFields";
|
||||
@@ -165,9 +166,15 @@ export const SpoolCreate = (props: IResourceComponentsProps & CreateOrCloneProps
|
||||
};
|
||||
|
||||
const locations = useSpoolmanLocations(true);
|
||||
const settingsLocation = useLocations();
|
||||
const [newLocation, setNewLocation] = useState("");
|
||||
|
||||
const allLocations = [...(locations.data || [])];
|
||||
const allLocations = [...(settingsLocation || [])];
|
||||
locations?.data?.forEach((loc) => {
|
||||
if (!allLocations.includes(loc)) {
|
||||
allLocations.push(loc);
|
||||
}
|
||||
});
|
||||
if (newLocation.trim() && !allLocations.includes(newLocation)) {
|
||||
allLocations.push(newLocation.trim());
|
||||
}
|
||||
|
||||
@@ -128,6 +128,7 @@ export function useGetFilamentSelectOptions() {
|
||||
const t = useTranslate();
|
||||
const { query: internalFilaments } = useSelect<IFilament>({
|
||||
resource: "filament",
|
||||
pagination: { mode: "off" },
|
||||
});
|
||||
const externalFilaments = useGetExternalDBFilaments();
|
||||
|
||||
|
||||
@@ -57,7 +57,10 @@ function collapseSpool(element: ISpool): ISpoolCollapsed {
|
||||
} else {
|
||||
filament_name = element.filament.name ?? element.filament.id.toString();
|
||||
}
|
||||
if (element.price === undefined) {
|
||||
// The REST list omits `price` when unset (response_model_exclude_none), but websocket
|
||||
// live updates send it as `null`. Fall back to the filament price for both cases,
|
||||
// otherwise a live update (e.g. after a weight adjust) blanks the price column until reload.
|
||||
if (element.price === undefined || element.price === null) {
|
||||
element.price = element.filament.price;
|
||||
}
|
||||
return {
|
||||
@@ -381,7 +384,7 @@ export const SpoolList = () => {
|
||||
align: "right",
|
||||
width: 80,
|
||||
render: (_, obj: ISpoolCollapsed) => {
|
||||
if (obj.price === undefined) {
|
||||
if (obj.price === undefined || obj.price === null) {
|
||||
return "";
|
||||
}
|
||||
return currencyFormatter.format(obj.price);
|
||||
|
||||
Vendored
+5
-1
@@ -15,13 +15,17 @@ We also need to stringify them again before sending them back to the API, which
|
||||
the form's onFinish method. Form.Item's normalize should do this, but it doesn't seem to work.
|
||||
*/
|
||||
|
||||
// What the form submits: extra values back as JSON strings, with null for a field left
|
||||
// empty — the API merges extra per key, so null is what clears a value.
|
||||
type IVendorRequest = Omit<IVendor, "extra"> & { extra?: { [key: string]: string | null } };
|
||||
|
||||
export const VendorEdit = () => {
|
||||
const t = useTranslate();
|
||||
const [messageApi, contextHolder] = message.useMessage();
|
||||
const [hasChanged, setHasChanged] = useState(false);
|
||||
const extraFields = useGetFields(EntityType.vendor);
|
||||
|
||||
const { formProps, saveButtonProps } = useForm<IVendor, HttpError, IVendor, IVendor>({
|
||||
const { formProps, saveButtonProps } = useForm<IVendor, HttpError, IVendorRequest, IVendor>({
|
||||
liveMode: "manual",
|
||||
onLiveEvent() {
|
||||
// Warn the user if the vendor has been updated since the form was opened
|
||||
|
||||
@@ -1,7 +1,8 @@
|
||||
import { CrudFilter, CrudOperators } from "@refinedev/core";
|
||||
import { Field, FieldType, getCustomFieldKey, isCustomField } from "./queryFields";
|
||||
|
||||
interface TypedCrudFilter<Obj> {
|
||||
field: keyof Obj;
|
||||
field: keyof Obj | string;
|
||||
operator: Exclude<CrudOperators, "or" | "and">;
|
||||
value: string[];
|
||||
}
|
||||
@@ -16,10 +17,7 @@ export function typeFilters<Obj>(filters: CrudFilter[]): TypedCrudFilter<Obj>[]
|
||||
* @param field The field to get the filter values for.
|
||||
* @returns An array of filter values for the given field.
|
||||
*/
|
||||
export function getFiltersForField<Obj, Field extends keyof Obj>(
|
||||
filters: TypedCrudFilter<Obj>[],
|
||||
field: Field,
|
||||
): string[] {
|
||||
export function getFiltersForField<Obj>(filters: TypedCrudFilter<Obj>[], field: Field | string): string[] {
|
||||
const filterValues: string[] = [];
|
||||
filters.forEach((filter) => {
|
||||
if (filter.field === field) {
|
||||
@@ -29,6 +27,89 @@ export function getFiltersForField<Obj, Field extends keyof Obj>(
|
||||
return filterValues;
|
||||
}
|
||||
|
||||
/**
|
||||
* Creates a filter value for a custom field based on its type
|
||||
* @param field The custom field definition
|
||||
* @param value The value to filter by
|
||||
* @returns The formatted filter value
|
||||
*/
|
||||
type CustomFieldFilterValue =
|
||||
| string
|
||||
| number
|
||||
| boolean
|
||||
| Date
|
||||
| [number | null | undefined, number | null | undefined]
|
||||
| null
|
||||
| undefined;
|
||||
|
||||
export function formatCustomFieldFilterValue(field: Field, value: CustomFieldFilterValue): string {
|
||||
switch (field.field_type) {
|
||||
case FieldType.text:
|
||||
case FieldType.choice:
|
||||
// For text and choice fields, we can use the value directly
|
||||
// If it's an exact match, surround with quotes
|
||||
if (typeof value === "string" && !value.startsWith('"') && !value.endsWith('"')) {
|
||||
// Check if we need an exact match (no wildcards)
|
||||
if (!value.includes("*") && !value.includes("?")) {
|
||||
return `"${value}"`;
|
||||
}
|
||||
}
|
||||
return value == null ? "" : String(value);
|
||||
|
||||
case FieldType.integer:
|
||||
case FieldType.float:
|
||||
// For numeric fields, we can use the value directly
|
||||
return value == null ? "" : value.toString();
|
||||
|
||||
case FieldType.boolean:
|
||||
// For boolean fields, convert to "true" or "false"
|
||||
return value ? "true" : "false";
|
||||
|
||||
case FieldType.datetime:
|
||||
// For datetime fields, format as ISO string
|
||||
if (value instanceof Date) {
|
||||
return value.toISOString();
|
||||
}
|
||||
return value == null ? "" : String(value);
|
||||
|
||||
case FieldType.integer_range:
|
||||
case FieldType.float_range:
|
||||
// For range fields, format as min:max
|
||||
if (Array.isArray(value) && value.length === 2) {
|
||||
return `${value[0] ?? ""}:${value[1] ?? ""}`;
|
||||
}
|
||||
return value == null ? "" : String(value);
|
||||
|
||||
default:
|
||||
return value == null ? "" : String(value);
|
||||
}
|
||||
}
|
||||
|
||||
/**
|
||||
* Extracts all custom field filters from a list of filters
|
||||
* @param filters The list of filters
|
||||
* @returns An object with custom field keys and their filter values
|
||||
*/
|
||||
export function getCustomFieldFilters<Obj = unknown>(
|
||||
filters: CrudFilter[] | TypedCrudFilter<Obj>[],
|
||||
): Record<string, string[]> {
|
||||
const customFieldFilters: Record<string, string[]> = {};
|
||||
|
||||
filters.forEach((filter) => {
|
||||
if (!("field" in filter)) {
|
||||
return; // Skip non-field filters
|
||||
}
|
||||
|
||||
const field = filter.field.toString();
|
||||
if (isCustomField(field)) {
|
||||
const key = getCustomFieldKey(field);
|
||||
customFieldFilters[key] = filter.value as string[];
|
||||
}
|
||||
});
|
||||
|
||||
return customFieldFilters;
|
||||
}
|
||||
|
||||
/**
|
||||
* Function that returns an array with all undefined values removed.
|
||||
*/
|
||||
|
||||
@@ -110,6 +110,24 @@ export function useSetField(entity_type: EntityType) {
|
||||
});
|
||||
}
|
||||
|
||||
/**
|
||||
* Checks if a field is a custom field (starts with "extra.")
|
||||
* @param field The field to check
|
||||
* @returns True if the field is a custom field
|
||||
*/
|
||||
export function isCustomField(field: string): boolean {
|
||||
return field.startsWith("extra.");
|
||||
}
|
||||
|
||||
/**
|
||||
* Extracts the key from a custom field (removes the "extra." prefix)
|
||||
* @param field The custom field
|
||||
* @returns The key of the custom field
|
||||
*/
|
||||
export function getCustomFieldKey(field: string): string {
|
||||
return field.substring(6); // Remove "extra." prefix
|
||||
}
|
||||
|
||||
export function useDeleteField(entity_type: EntityType) {
|
||||
const queryClient = useQueryClient();
|
||||
|
||||
|
||||
@@ -2,7 +2,11 @@ import { useGetSetting } from "./querySettings";
|
||||
|
||||
export function useCurrency() {
|
||||
const { data: currency } = useGetSetting("currency");
|
||||
return JSON.parse(currency?.value ?? '"EUR"');
|
||||
try {
|
||||
return JSON.parse(currency?.value ?? '"EUR"');
|
||||
} catch {
|
||||
return "EUR";
|
||||
}
|
||||
}
|
||||
|
||||
export function getCurrencySymbol(locale: string | undefined, currency: string) {
|
||||
@@ -20,7 +24,12 @@ export function getCurrencySymbol(locale: string | undefined, currency: string)
|
||||
|
||||
export function useCurrencyFormatter() {
|
||||
const currency = useCurrency();
|
||||
const roundPrices = JSON.parse(useGetSetting("round_prices").data?.value ?? "false");
|
||||
let roundPrices = false;
|
||||
try {
|
||||
roundPrices = JSON.parse(useGetSetting("round_prices").data?.value ?? "false");
|
||||
} catch {
|
||||
roundPrices = false;
|
||||
}
|
||||
|
||||
return new Intl.NumberFormat(undefined, {
|
||||
style: "currency",
|
||||
|
||||
@@ -1,8 +1,9 @@
|
||||
import { CrudSort } from "@refinedev/core";
|
||||
import { SortOrder } from "antd/es/table/interface";
|
||||
import { Field, getCustomFieldKey, isCustomField } from "./queryFields";
|
||||
|
||||
interface TypedCrudSort<Obj> {
|
||||
field: keyof Obj;
|
||||
field: keyof Obj | string;
|
||||
order: "asc" | "desc";
|
||||
}
|
||||
|
||||
@@ -12,10 +13,7 @@ interface TypedCrudSort<Obj> {
|
||||
* @param field The field to get the sort order for.
|
||||
* @returns The sort order for the given field, or undefined if the field is not being sorted.
|
||||
*/
|
||||
export function getSortOrderForField<Obj, Field extends keyof Obj>(
|
||||
sorters: TypedCrudSort<Obj>[],
|
||||
field: Field,
|
||||
): SortOrder | undefined {
|
||||
export function getSortOrderForField<Obj>(sorters: TypedCrudSort<Obj>[], field: Field | string): SortOrder | undefined {
|
||||
const sorter = sorters.find((s) => s.field === field);
|
||||
if (sorter) {
|
||||
return sorter.order === "asc" ? "ascend" : "descend";
|
||||
@@ -26,3 +24,33 @@ export function getSortOrderForField<Obj, Field extends keyof Obj>(
|
||||
export function typeSorters<Obj>(sorters: CrudSort[]): TypedCrudSort<Obj>[] {
|
||||
return sorters as TypedCrudSort<Obj>[]; // <-- Unsafe cast
|
||||
}
|
||||
|
||||
/**
|
||||
* Checks if a sorter is for a custom field
|
||||
* @param sorter The sorter to check
|
||||
* @returns True if the sorter is for a custom field
|
||||
*/
|
||||
export function isCustomFieldSorter<Obj = unknown>(sorter: TypedCrudSort<Obj> | CrudSort): boolean {
|
||||
return typeof sorter.field === "string" && isCustomField(sorter.field);
|
||||
}
|
||||
|
||||
/**
|
||||
* Extracts all custom field sorters from a list of sorters
|
||||
* @param sorters The list of sorters
|
||||
* @returns An object with custom field keys and their sort orders
|
||||
*/
|
||||
export function getCustomFieldSorters<Obj = unknown>(
|
||||
sorters: TypedCrudSort<Obj>[] | CrudSort[],
|
||||
): Record<string, "asc" | "desc"> {
|
||||
const customFieldSorters: Record<string, "asc" | "desc"> = {};
|
||||
|
||||
sorters.forEach((sorter) => {
|
||||
if (isCustomFieldSorter(sorter)) {
|
||||
const field = sorter.field.toString();
|
||||
const key = getCustomFieldKey(field);
|
||||
customFieldSorters[key] = sorter.order;
|
||||
}
|
||||
});
|
||||
|
||||
return customFieldSorters;
|
||||
}
|
||||
@@ -0,0 +1,14 @@
|
||||
node_modules
|
||||
/build
|
||||
/.svelte-kit
|
||||
/package
|
||||
.env
|
||||
.env.*
|
||||
!.env.example
|
||||
vite.config.js.timestamp-*
|
||||
vite.config.ts.timestamp-*
|
||||
|
||||
# Playwright a11y audit output
|
||||
/playwright-report
|
||||
/test-results
|
||||
/a11y-report.md
|
||||
@@ -0,0 +1 @@
|
||||
engine-strict=false
|
||||
@@ -0,0 +1,20 @@
|
||||
# Weblate-managed translation files — do not reformat (mirrors the old client).
|
||||
locales
|
||||
|
||||
# Build output and tooling
|
||||
build
|
||||
.svelte-kit
|
||||
dist
|
||||
node_modules
|
||||
|
||||
# Generated code (paraglide i18n compiler output — also gitignored)
|
||||
src/lib/paraglide
|
||||
|
||||
# Written into the inlang project by the compiler; everything but settings.json
|
||||
# there is gitignored, so compiling before linting must not fail the check.
|
||||
project.inlang/.meta.json
|
||||
project.inlang/README.md
|
||||
project.inlang/cache
|
||||
|
||||
# Local scratch notes (gitignored, never reaches CI — don't fail the local hook)
|
||||
docs
|
||||
@@ -0,0 +1,8 @@
|
||||
{
|
||||
"useTabs": true,
|
||||
"singleQuote": true,
|
||||
"trailingComma": "none",
|
||||
"printWidth": 110,
|
||||
"plugins": ["prettier-plugin-svelte"],
|
||||
"overrides": [{ "files": "*.svelte", "options": { "parser": "svelte" } }]
|
||||
}
|
||||
@@ -0,0 +1,174 @@
|
||||
# Spoolman client v2
|
||||
|
||||
A ground-up rewrite of the Spoolman frontend using **Svelte 5 + SvelteKit**,
|
||||
replacing the React / Refine / Ant Design stack in `client/`.
|
||||
|
||||
> Status: **connected to the real Spoolman API.** `src/lib/api/spoolSource.ts`
|
||||
> talks to `/api/v1` over HTTP and `src/lib/api/live.ts` opens the real
|
||||
> WebSocket channels; `src/lib/api/map.ts` maps the API shape to the client's
|
||||
> domain types. Reads (grouped + flat lists, inspector details), writes (spool /
|
||||
> filament / vendor edits, adjust weight, archive, add spools, drag-to-relocate)
|
||||
> and live updates all round-trip against the backend.
|
||||
>
|
||||
> **Dev:** point the client at a running backend with `VITE_APIURL`, e.g.
|
||||
> `VITE_APIURL=http://localhost:8000/api/v1 npm run dev`. In production the
|
||||
> backend serves this SPA same-origin, so `VITE_APIURL` is unset and the base
|
||||
> resolves to `<SPOOLMAN_BASE_PATH>/api/v1`.
|
||||
>
|
||||
> **Settings** (currency / round_prices / external URL) round-trip to
|
||||
> `/api/v1/setting`; the low-stock threshold is a local per-browser preference.
|
||||
> **Extra fields** have full parity with the original frontend: manage
|
||||
> definitions per entity (all 8 types, key/type/multi_choice immutable after
|
||||
> create, append-only choices) in Settings, and edit values inline on each
|
||||
> inspector via type-aware inputs (`ExtraFieldInput`).
|
||||
>
|
||||
> **Add spools** is a single unified flow that creates spool + filament + vendor
|
||||
> as needed. It searches the local catalog and **SpoolmanDB**
|
||||
> (`/api/v1/external/filament`); a picked SpoolmanDB filament is imported (with its
|
||||
> vendor, de-duplicated by `external_id`). "Create a new filament" expands the
|
||||
> same modal inline: a **vendor combobox** reuses an existing vendor or creates a
|
||||
> new one (with a live hint), and picking a **material** auto-fills density/temps
|
||||
> from SpoolmanDB material presets. One submit creates whatever doesn't yet exist.
|
||||
> Imported filaments show a "SpoolmanDB" badge in the inspector.
|
||||
>
|
||||
> **Not yet wired:** library search is a filament-name match (the API has no
|
||||
> combined free-text or color-similarity search); status/diameter filters were
|
||||
> dropped as the API can't express them.
|
||||
|
||||
## Data flow (server does the work)
|
||||
|
||||
Filtering, sorting, searching, **aggregation** and pagination are the server's
|
||||
job — the client never sifts the full dataset. The list **paginates groups**, not
|
||||
spools, so a group is atomic on a page (no splitting) and its header totals are
|
||||
server-accurate. See `docs/backend-api-proposal.md` for the endpoints this
|
||||
assumes.
|
||||
|
||||
```
|
||||
UI state (filters/sort/group/search/page)
|
||||
│
|
||||
grouped mode (group≠none, not a color search):
|
||||
│ buildGroupQuery() api/query.ts
|
||||
▼
|
||||
GroupQuery ── listGroups() ──▶ Page<GroupSummary> api/spoolSource.ts
|
||||
▼ (key, title, counts, total_remaining,
|
||||
FilamentList has_stock, last_used — server aggregates)
|
||||
└─ GroupRow (per group)
|
||||
│ buildScopedSpoolQuery(group, limit) ← lazily loads the
|
||||
▼ group's spools,
|
||||
listSpools() ── Page<Spool> ─▶ rows in-use first, "show more"
|
||||
|
||||
flat mode (group=none OR color search):
|
||||
│ buildFlatSpoolQuery()
|
||||
▼
|
||||
SpoolQuery ── listSpools() ──▶ Page<Spool> ─▶ flat rows (no split problem)
|
||||
|
||||
Pagination ── paginates groups (grouped) or spools (flat)
|
||||
```
|
||||
|
||||
- **Grouped**: `listGroups` returns a page of group summaries; each `GroupRow`
|
||||
fetches its own spools (`filament.id` / `vendor.id` / `location` / material
|
||||
scope). "Sort:" orders both the groups (by aggregate) and the rows within.
|
||||
- **Flat** (`group=none` or a color search): plain spool pagination — no groups
|
||||
to split. Color search orders by similarity.
|
||||
- **Pagination** is classic `limit`/`offset` + `X-Total-Count`. Any query change
|
||||
resets to page 1.
|
||||
|
||||
### Live updates (WebSocket)
|
||||
|
||||
Everything viewed is subscribed to and live-updates. The seam is `api/live.ts`
|
||||
(`LiveConnection.subscribe(resource, {id?}, handler)` — mirrors
|
||||
`ws://…/api/v1/<resource>[/<id>]`):
|
||||
|
||||
- **`inventory`** is a reactive normalized **cache**. `api/liveSync.ts` runs one
|
||||
central subscription per resource and applies remote events to it, so every
|
||||
cache-backed view (inspectors, locations) is live automatically.
|
||||
- The **paginated list** fetches server-paged data _outside_ the cache, so it
|
||||
keeps its **own** subscription and refetches the current page on relevant
|
||||
events.
|
||||
- Local edits patch the cache **and** emit a `local` event (mirroring the server
|
||||
echo). Try it in dev: `__spoolman.bumpId(103, 120)` in the console injects a
|
||||
`remote` update — the inspector and list both update instantly.
|
||||
|
||||
## Design
|
||||
|
||||
The look is ported from the design prototype (`Spoolman Prototype.dc.html` /
|
||||
`Spoolman Mobile.dc.html`): a dark theme, IBM Plex type, warm-orange (`#be682f`)
|
||||
accent, and a dense two-pane **Library** (list + inspector). Design tokens live as
|
||||
CSS custom properties in `src/app.css`.
|
||||
|
||||
### Responsiveness
|
||||
|
||||
- **Desktop** — two panes: the filament/spool list on the left, a live inspector
|
||||
on the right.
|
||||
- **Mobile** — the list becomes full-width and front-and-centre; selecting an item
|
||||
slides the _same_ inspector up as a bottom-sheet **Drawer**
|
||||
(`src/lib/components/Drawer.svelte`). The top-bar search/nav reflow onto their
|
||||
own rows and the "Add spools" button becomes a FAB.
|
||||
|
||||
The breakpoint is `860px`.
|
||||
|
||||
## Structure
|
||||
|
||||
```
|
||||
src/
|
||||
app.css design tokens + resets
|
||||
routes/
|
||||
+layout.svelte top bar + add-spools modal shell
|
||||
+page.svelte Library (list + inspector / drawer)
|
||||
locations/+page.svelte drag-and-drop shelf grid
|
||||
settings/+page.svelte server-settings style sections
|
||||
lib/
|
||||
types.ts domain types
|
||||
api/
|
||||
config.ts API base + WebSocket URL resolution (VITE_APIURL)
|
||||
http.ts fetch wrappers (list + X-Total-Count, GET/PATCH/POST)
|
||||
map.ts API JSON ↔ domain types (colors, rel-time, patches)
|
||||
types.ts GroupQuery/SpoolQuery/Page/SpoolDataSource contract
|
||||
query.ts UI state → queries (sort/group field maps)
|
||||
spoolSource.ts HTTP client: /spool/group, /spool (+ scoping),
|
||||
writes, filter-option lists; populates the cache
|
||||
live.ts real WebSockets to /api/v1/{spool,filament,vendor}
|
||||
liveSync.ts central live events → cache
|
||||
stores/ inventory (reactive cache), settings, ui (runes)
|
||||
utils/ color, format, saver (debounced writes), library
|
||||
components/ Swatch, ProgressBar, Button, Toggle, TopBar,
|
||||
Pagination, library/* (GroupRow, …), Drawer, …
|
||||
docs/
|
||||
backend-api-proposal.md the grouped/aggregated endpoint (implemented)
|
||||
```
|
||||
|
||||
### How the backend is wired
|
||||
|
||||
- **Reads** — `api/spoolSource.ts` hits `GET /api/v1/spool/group` (grouped) and
|
||||
`GET /api/v1/spool` (flat / group-scoped), both `limit`/`offset` +
|
||||
`X-Total-Count`. Filter option lists come from `/material`, `/location`,
|
||||
`/lot-number`, `/vendor`. Every fetched entity is upserted into the cache.
|
||||
- **Writes** — inline edits PATCH `/spool|/filament|/vendor/{id}` (debounced,
|
||||
optimistic); adjust-weight and archive PATCH the spool; Add-spools POSTs
|
||||
`/spool`; drag-to-relocate PATCHes `location`.
|
||||
- **Live** — `api/live.ts` opens one WebSocket per resource; `liveSync` applies
|
||||
events to the cache, so cache-backed views update instantly and the paginated
|
||||
list refetches. `api/map.ts` maps every payload to domain types.
|
||||
|
||||
## Develop
|
||||
|
||||
```bash
|
||||
npm install
|
||||
npm run dev # http://localhost:5174
|
||||
npm run check # svelte-check (type gate)
|
||||
npm run build # static SPA build (adapter-static, index.html fallback)
|
||||
```
|
||||
|
||||
### Mobile accessibility audit
|
||||
|
||||
```bash
|
||||
npm run audit:a11y # Playwright + axe-core under Pixel 5 emulation
|
||||
npm run audit:a11y:report # open the last HTML report
|
||||
```
|
||||
|
||||
Runs [axe-core](https://github.com/dequelabs/axe-core) (WCAG 2.0/2.1 A+AA plus the
|
||||
2.2 `target-size` rule) and a custom tap-target measurement across the main
|
||||
surfaces (library, locations, labels, settings, add-spool modal, inspector
|
||||
drawer). Reuses a `vite dev` already on 5174, or starts one. Human-readable
|
||||
results land in `a11y-report.md`; the tap-target advisory minimum is 44px (Apple
|
||||
HIG / Material), stricter than the WCAG 24px floor. See `e2e/a11y-mobile.spec.ts`.
|
||||
@@ -0,0 +1,190 @@
|
||||
import { test, expect, type Page, type TestInfo } from '@playwright/test';
|
||||
import AxeBuilder from '@axe-core/playwright';
|
||||
import { writeFile } from 'node:fs/promises';
|
||||
import path from 'node:path';
|
||||
import { SURFACES_DIR, TAP_MIN, type SurfaceResult, type TapTarget } from './report';
|
||||
|
||||
// Mobile-accessibility audit for client_v2.
|
||||
//
|
||||
// Two independent checks run against every surface, under a Pixel 5 mobile
|
||||
// emulation (see playwright.config.ts):
|
||||
//
|
||||
// 1. axe-core — the full WCAG 2.0/2.1 A + AA ruleset PLUS the WCAG 2.2
|
||||
// `target-size` rule (SC 2.5.8, 24x24 CSS px minimum). Real conformance
|
||||
// failures.
|
||||
//
|
||||
// 2. A custom tap-target measurement — flags interactive controls smaller
|
||||
// than TAP_MIN px in either dimension. An *advisory* thumb-comfort check
|
||||
// (Apple HIG 44px / Material 48px), stricter than the WCAG minimum and
|
||||
// catching targets axe considers technically compliant.
|
||||
//
|
||||
// Each surface's findings are written to SURFACES_DIR as JSON; the consolidated
|
||||
// `a11y-report.md` is rendered by globalTeardown (which survives worker
|
||||
// restarts). Raw findings are also attached to the Playwright HTML report.
|
||||
|
||||
let surfaceCount = 0;
|
||||
|
||||
// Let the DOM and any async lists settle. The app holds an open live-sync
|
||||
// WebSocket, so `networkidle` never fires — we bound it and fall through.
|
||||
async function settle(page: Page, ms = 500) {
|
||||
await page.waitForLoadState('domcontentloaded').catch(() => {});
|
||||
await page.waitForLoadState('networkidle', { timeout: 2500 }).catch(() => {});
|
||||
await page.waitForTimeout(ms);
|
||||
}
|
||||
|
||||
// Measure every interactive control in the live DOM and return those smaller
|
||||
// than `min` px in either dimension. Runs in the browser.
|
||||
function collectSmallTargets(min: number): TapTarget[] {
|
||||
const SELECTOR = [
|
||||
'a[href]',
|
||||
'button',
|
||||
'input:not([type="hidden"])',
|
||||
'select',
|
||||
'textarea',
|
||||
'summary',
|
||||
'[role="button"]',
|
||||
'[role="link"]',
|
||||
'[role="checkbox"]',
|
||||
'[role="radio"]',
|
||||
'[role="switch"]',
|
||||
'[role="tab"]',
|
||||
'[role="menuitem"]',
|
||||
'[tabindex]:not([tabindex="-1"])'
|
||||
].join(',');
|
||||
|
||||
const out: TapTarget[] = [];
|
||||
const seen = new Set<Element>();
|
||||
|
||||
for (const el of Array.from(document.querySelectorAll(SELECTOR))) {
|
||||
if (seen.has(el)) continue;
|
||||
seen.add(el);
|
||||
|
||||
const style = getComputedStyle(el);
|
||||
if (style.display === 'none' || style.visibility === 'hidden' || style.opacity === '0') continue;
|
||||
if ((el as HTMLButtonElement).disabled) continue;
|
||||
|
||||
// WCAG exempts targets rendered inline within a run of text (e.g. a link
|
||||
// inside a sentence). Skip inline <a> elements to avoid false positives.
|
||||
if (el.tagName === 'A' && style.display.startsWith('inline')) continue;
|
||||
|
||||
const rect = el.getBoundingClientRect();
|
||||
if (rect.width === 0 || rect.height === 0) continue; // not rendered
|
||||
if (rect.width >= min && rect.height >= min) continue;
|
||||
|
||||
const id = el.id ? `#${el.id}` : '';
|
||||
const rawCls = (el as HTMLElement).className;
|
||||
const cls =
|
||||
typeof rawCls === 'string' && rawCls.trim()
|
||||
? '.' + rawCls.trim().split(/\s+/).slice(0, 2).join('.')
|
||||
: '';
|
||||
const aria = el.getAttribute('aria-label');
|
||||
|
||||
out.push({
|
||||
tag: el.tagName.toLowerCase(),
|
||||
text: (aria || el.textContent || '').trim().replace(/\s+/g, ' ').slice(0, 40),
|
||||
selector: `${el.tagName.toLowerCase()}${id}${cls}`,
|
||||
width: Math.round(rect.width),
|
||||
height: Math.round(rect.height)
|
||||
});
|
||||
}
|
||||
return out;
|
||||
}
|
||||
|
||||
// Run both checks against whatever is currently rendered and record the result.
|
||||
async function audit(page: Page, testInfo: TestInfo, label: string) {
|
||||
await settle(page);
|
||||
|
||||
const axeResults = await new AxeBuilder({ page })
|
||||
.withTags(['wcag2a', 'wcag2aa', 'wcag21a', 'wcag21aa', 'wcag22aa'])
|
||||
.analyze();
|
||||
|
||||
const smallTargets = await page.evaluate(collectSmallTargets, TAP_MIN);
|
||||
|
||||
const surface: SurfaceResult = {
|
||||
order: surfaceCount++,
|
||||
label,
|
||||
url: page.url(),
|
||||
axe: axeResults.violations.map((v) => ({
|
||||
id: v.id,
|
||||
impact: v.impact,
|
||||
help: v.help,
|
||||
nodes: v.nodes.length,
|
||||
targets: v.nodes.slice(0, 5).map((n) => n.target.join(' '))
|
||||
})),
|
||||
smallTargets
|
||||
};
|
||||
|
||||
const file = path.join(SURFACES_DIR, `${label.replace(/[^a-z0-9]+/gi, '-')}.json`);
|
||||
await writeFile(file, JSON.stringify(surface, null, 2), 'utf8');
|
||||
|
||||
await testInfo.attach(`${label} — axe violations`, {
|
||||
body: JSON.stringify(axeResults.violations, null, 2),
|
||||
contentType: 'application/json'
|
||||
});
|
||||
await testInfo.attach(`${label} — small tap targets`, {
|
||||
body: JSON.stringify(smallTargets, null, 2),
|
||||
contentType: 'application/json'
|
||||
});
|
||||
|
||||
// Soft assertions: the run completes and reports every surface, but the test
|
||||
// is still marked failed if anything is out of spec — useful as a CI gate.
|
||||
const serious = surface.axe.filter((v) => v.impact === 'serious' || v.impact === 'critical');
|
||||
expect.soft(serious, `${label}: serious/critical axe violations`).toEqual([]);
|
||||
expect.soft(smallTargets, `${label}: tap targets under ${TAP_MIN}px`).toEqual([]);
|
||||
}
|
||||
|
||||
const STATIC_ROUTES: { path: string; label: string }[] = [
|
||||
{ path: '/', label: 'library (home)' },
|
||||
{ path: '/dashboard', label: 'dashboard' },
|
||||
{ path: '/labels', label: 'labels' },
|
||||
{ path: '/settings', label: 'settings' }
|
||||
];
|
||||
|
||||
for (const route of STATIC_ROUTES) {
|
||||
test(`a11y: ${route.label}`, async ({ page }, testInfo) => {
|
||||
await page.goto(route.path);
|
||||
await audit(page, testInfo, route.label);
|
||||
});
|
||||
}
|
||||
|
||||
test('a11y: add-spool modal', async ({ page }, testInfo) => {
|
||||
await page.goto('/');
|
||||
await settle(page);
|
||||
// The mobile TopBar exposes the add control via aria-label "Add spools".
|
||||
const addBtn = page.getByRole('button', { name: /add spool/i }).first();
|
||||
if ((await addBtn.count()) === 0) test.skip(true, 'no add button found');
|
||||
await addBtn.click();
|
||||
await audit(page, testInfo, 'add-spool modal');
|
||||
});
|
||||
|
||||
test('a11y: inspector drawer (mobile bottom sheet)', async ({ page }, testInfo) => {
|
||||
await page.goto('/');
|
||||
await settle(page, 800);
|
||||
// Select the first library row to open the mobile drawer.
|
||||
const firstItem = page.locator('.list-pane a[href], .list-pane [role="button"]').first();
|
||||
if ((await firstItem.count()) === 0) test.skip(true, 'no list items to select');
|
||||
await firstItem.click({ timeout: 5000 }).catch(() => {});
|
||||
await audit(page, testInfo, 'inspector drawer');
|
||||
});
|
||||
|
||||
test('a11y: detail pages (filament / spool)', async ({ page }, testInfo) => {
|
||||
await page.goto('/');
|
||||
await settle(page, 800);
|
||||
|
||||
// Discover a real detail URL from the live DOM rather than hardcoding an id.
|
||||
const hrefs = await page.$$eval('a[href]', (els) =>
|
||||
els.map((e) => (e as HTMLAnchorElement).getAttribute('href') || '')
|
||||
);
|
||||
const filament = hrefs.find((h) => /\/filament\/show\/\d/.test(h));
|
||||
const spool = hrefs.find((h) => /\/spool\/show\/\d/.test(h));
|
||||
|
||||
if (filament) {
|
||||
await page.goto(filament);
|
||||
await audit(page, testInfo, 'filament detail');
|
||||
}
|
||||
if (spool) {
|
||||
await page.goto(spool);
|
||||
await audit(page, testInfo, 'spool detail');
|
||||
}
|
||||
if (!filament && !spool) test.skip(true, 'no detail links found in library');
|
||||
});
|
||||
@@ -0,0 +1,10 @@
|
||||
import { rm, mkdir } from 'node:fs/promises';
|
||||
import { SURFACES_DIR, REPORT_PATH } from './report';
|
||||
|
||||
// Runs once before the suite: clear any per-surface results and the report from
|
||||
// a previous run so the new report reflects only this run.
|
||||
export default async function globalSetup() {
|
||||
await rm(SURFACES_DIR, { recursive: true, force: true });
|
||||
await rm(REPORT_PATH, { force: true });
|
||||
await mkdir(SURFACES_DIR, { recursive: true });
|
||||
}
|
||||
@@ -0,0 +1,83 @@
|
||||
import { readdir, readFile, writeFile } from 'node:fs/promises';
|
||||
import path from 'node:path';
|
||||
import { SURFACES_DIR, REPORT_PATH, TAP_MIN, type SurfaceResult } from './report';
|
||||
|
||||
// Runs once after the suite (in the main process, so it survives worker
|
||||
// restarts): read every per-surface JSON and render the consolidated report.
|
||||
export default async function globalTeardown() {
|
||||
let files: string[];
|
||||
try {
|
||||
files = (await readdir(SURFACES_DIR)).filter((f) => f.endsWith('.json'));
|
||||
} catch {
|
||||
return;
|
||||
}
|
||||
|
||||
const results: SurfaceResult[] = [];
|
||||
for (const f of files) {
|
||||
try {
|
||||
results.push(JSON.parse(await readFile(path.join(SURFACES_DIR, f), 'utf8')));
|
||||
} catch {
|
||||
/* ignore malformed */
|
||||
}
|
||||
}
|
||||
results.sort((a, b) => a.order - b.order);
|
||||
|
||||
// Escape backslash and pipe in one pass (escaping them separately would let a
|
||||
// trailing backslash re-escape its own escape and leak the pipe through), and
|
||||
// flatten newlines since they'd break the table row regardless.
|
||||
const esc = (s: string) => s.replace(/[\\|]/g, '\\$&').replace(/\s*[\r\n]+\s*/g, ' ');
|
||||
const lines: string[] = [];
|
||||
lines.push('# Mobile accessibility audit — client_v2');
|
||||
lines.push('');
|
||||
lines.push(`Device profile: **Pixel 5** (393×851 CSS px, touch). Generated ${new Date().toISOString()}.`);
|
||||
lines.push('');
|
||||
lines.push(
|
||||
`Advisory tap-target minimum: **${TAP_MIN}px**. WCAG 2.2 target-size (24px) failures appear under axe.`
|
||||
);
|
||||
lines.push('');
|
||||
|
||||
const totalAxe = results.reduce((n, s) => n + s.axe.reduce((m, v) => m + v.nodes, 0), 0);
|
||||
const totalSmall = results.reduce((n, s) => n + s.smallTargets.length, 0);
|
||||
lines.push('## Summary');
|
||||
lines.push('');
|
||||
lines.push(`- Surfaces audited: **${results.length}**`);
|
||||
lines.push(`- Total axe violation instances: **${totalAxe}**`);
|
||||
lines.push(`- Total tap targets under ${TAP_MIN}px: **${totalSmall}**`);
|
||||
lines.push('');
|
||||
|
||||
for (const s of results) {
|
||||
lines.push(`## ${s.label}`);
|
||||
lines.push(`\`${s.url}\``);
|
||||
lines.push('');
|
||||
if (s.axe.length === 0) {
|
||||
lines.push('**axe:** no violations ✅');
|
||||
} else {
|
||||
lines.push('**axe violations:**');
|
||||
lines.push('');
|
||||
lines.push('| Rule | Impact | Instances | Example target |');
|
||||
lines.push('| --- | --- | --- | --- |');
|
||||
for (const v of s.axe) {
|
||||
lines.push(
|
||||
`| ${v.id} — ${esc(v.help)} | ${v.impact ?? '?'} | ${v.nodes} | \`${esc((v.targets[0] ?? '').slice(0, 50))}\` |`
|
||||
);
|
||||
}
|
||||
}
|
||||
lines.push('');
|
||||
if (s.smallTargets.length === 0) {
|
||||
lines.push(`**Tap targets:** all ≥ ${TAP_MIN}px ✅`);
|
||||
} else {
|
||||
lines.push(`**Tap targets under ${TAP_MIN}px (${s.smallTargets.length}):**`);
|
||||
lines.push('');
|
||||
lines.push('| Element | Size (w×h) | Text/label |');
|
||||
lines.push('| --- | --- | --- |');
|
||||
for (const t of s.smallTargets.slice(0, 30)) {
|
||||
lines.push(`| \`${esc(t.selector.slice(0, 40))}\` | ${t.width}×${t.height} | ${esc(t.text)} |`);
|
||||
}
|
||||
if (s.smallTargets.length > 30) lines.push(`| … | | +${s.smallTargets.length - 30} more |`);
|
||||
}
|
||||
lines.push('');
|
||||
}
|
||||
|
||||
await writeFile(REPORT_PATH, lines.join('\n'), 'utf8');
|
||||
console.log(`\nWrote ${path.relative(process.cwd(), REPORT_PATH)} (${results.length} surfaces)`);
|
||||
}
|
||||
@@ -0,0 +1,35 @@
|
||||
// Shared types and paths for the mobile-a11y audit's file-based result
|
||||
// aggregation. Each test writes one JSON file per audited surface into
|
||||
// SURFACES_DIR; globalTeardown reads them all and renders a11y-report.md.
|
||||
//
|
||||
// We go through disk rather than module-level state because Playwright may
|
||||
// recycle the worker process between failing tests, which would wipe any
|
||||
// in-memory accumulator before the final report is written.
|
||||
import path from 'node:path';
|
||||
|
||||
export const TAP_MIN = 44;
|
||||
|
||||
export const SURFACES_DIR = path.resolve('test-results', 'a11y-surfaces');
|
||||
export const REPORT_PATH = path.resolve('a11y-report.md');
|
||||
|
||||
export interface TapTarget {
|
||||
tag: string;
|
||||
text: string;
|
||||
selector: string;
|
||||
width: number;
|
||||
height: number;
|
||||
}
|
||||
|
||||
export interface SurfaceResult {
|
||||
order: number;
|
||||
label: string;
|
||||
url: string;
|
||||
axe: {
|
||||
id: string;
|
||||
impact: string | null | undefined;
|
||||
help: string;
|
||||
nodes: number;
|
||||
targets: string[];
|
||||
}[];
|
||||
smallTargets: TapTarget[];
|
||||
}
|
||||
@@ -0,0 +1,58 @@
|
||||
import js from '@eslint/js';
|
||||
import svelte from 'eslint-plugin-svelte';
|
||||
import prettier from 'eslint-config-prettier';
|
||||
import globals from 'globals';
|
||||
import ts from 'typescript-eslint';
|
||||
import svelteConfig from './svelte.config.js';
|
||||
|
||||
export default ts.config(
|
||||
// Generated, tooling-managed, and build-output directories are not linted.
|
||||
{
|
||||
ignores: [
|
||||
'build/',
|
||||
'.svelte-kit/',
|
||||
'dist/',
|
||||
'package/',
|
||||
'src/lib/paraglide/', // auto-generated by inlang paraglide-js
|
||||
'project.inlang/', // inlang-managed
|
||||
'locales/', // Weblate-managed translation files
|
||||
'playwright-report/', // generated a11y-audit report (bundled/minified JS)
|
||||
'test-results/' // generated Playwright artifacts
|
||||
]
|
||||
},
|
||||
js.configs.recommended,
|
||||
...ts.configs.recommended,
|
||||
...svelte.configs.recommended,
|
||||
prettier,
|
||||
...svelte.configs.prettier,
|
||||
{
|
||||
languageOptions: {
|
||||
globals: { ...globals.browser, ...globals.node }
|
||||
},
|
||||
rules: {
|
||||
// Typed as `no-undef`; TypeScript already reports undefined identifiers.
|
||||
'no-undef': 'off'
|
||||
// svelte/no-navigation-without-resolve is left ON: it is the only automated guard
|
||||
// against base-path navigation bugs, and those are invisible to anyone developing
|
||||
// at the root path. It can't see through the helpers in src/lib/library/params.ts
|
||||
// (selectHref/libraryHref/... already call resolve() from $app/paths) nor through
|
||||
// components that take an already-resolved href prop, so the files where that is
|
||||
// the case carry a file-level disable naming the reason. Never "fix" one of those
|
||||
// by wrapping the call site in resolve() — that double-applies the base path.
|
||||
// svelte/prefer-svelte-reactivity is left ON to guard against in-place mutation of
|
||||
// reactive Set/Map. The current hits are all transient computation-local collections
|
||||
// and are silenced with per-line eslint-disable comments at each site.
|
||||
}
|
||||
},
|
||||
{
|
||||
files: ['**/*.svelte', '**/*.svelte.ts', '**/*.svelte.js'],
|
||||
languageOptions: {
|
||||
parserOptions: {
|
||||
projectService: true,
|
||||
extraFileExtensions: ['.svelte'],
|
||||
parser: ts.parser,
|
||||
svelteConfig
|
||||
}
|
||||
}
|
||||
}
|
||||
);
|
||||
@@ -0,0 +1,235 @@
|
||||
{
|
||||
"add.addAndNew": "Přidat & nová",
|
||||
"add.addN_few": "Přidat {{count}} cívky",
|
||||
"add.addN_one": "Přidat {{count}} cívku",
|
||||
"add.addN_other": "Přidat {{count}} cívky",
|
||||
"add.adding": "Přidávám...",
|
||||
"add.advanced": "Podrobné technické údaje",
|
||||
"add.advancedNote": "hustota, průměr, teploty (automaticky vyplněno podle materiálu)",
|
||||
"add.change": "změna",
|
||||
"add.count": "Počet",
|
||||
"add.createNew": "Vytvořit nový filament",
|
||||
"add.createNewSub": "není ve vašem katalogu ani v {{name}}",
|
||||
"add.dbUnavailable": "{{name}} není k dispozici",
|
||||
"add.duplicate": "duplikát",
|
||||
"add.duplicateNote": "Technické parametry, výrobce a cena byly zkopírovány. Zadejte nový název a barvu.",
|
||||
"add.duplicateRename": "Stále má stejný název jako původní – přejmenujte jej, abyste je mohli od sebe odlišit.",
|
||||
"add.duplicateTitle": "Nový filament · kopie „{{name}}“",
|
||||
"add.filamentNamePlaceholder": "např. PolyTerra Matte Sage",
|
||||
"add.fill.full": "Celý",
|
||||
"add.fillLevel": "Úroveň naplnění",
|
||||
"add.importNote": "Tento filament se přidá do vašeho katalogu jakmile přidáte cívky.",
|
||||
"add.inCatalog": "v katalogu",
|
||||
"add.locationHint": "Kde cívku fyzicky uchováváte – na polici, v krabici nebo v tiskárně. Pokud je všechny uchováváte na jednom místě, pole nechte prázdné.",
|
||||
"add.locationPlaceholder": "např. police A, sušička 2, tiskárna 1",
|
||||
"add.manufacturerPlaceholder": "např. Polymaker",
|
||||
"add.nameHint": "Uveďte barvu – právě podle ní se dají vaše filamenty od sebe rozeznat.",
|
||||
"add.newFilament": "nový filament",
|
||||
"add.newFilamentTitle": "Nový filament",
|
||||
"add.noCatalog": "Ve vašem katalogu nejsou žádné filamenty",
|
||||
"add.noManufacturer": "Žádný výrobce",
|
||||
"add.pickColor": "Vyberte barvu",
|
||||
"add.searchPlaceholder": "Prohledejte svůj katalog a {{name}}...",
|
||||
"add.searching": "Hledám...",
|
||||
"add.spoolWeightPreset.cardboard": "Karton {{weight}} g",
|
||||
"add.spoolWeightPreset.plastic": "Plast {{weight}} g",
|
||||
"add.spoolWeightPresetsLead": "Začněte s typickou cívkou:",
|
||||
"add.step2": "Krok 2 · podrobnosti o cívce",
|
||||
"add.summary_few": "{{count}} cívky",
|
||||
"add.summary_one": "{{count}} cívka",
|
||||
"add.summary_other": "{{count}} cívek",
|
||||
"add.typeToSearchAll": "Zadejte text a prohledejte tisíce filamentů",
|
||||
"add.typeToSearchMatches": "Zadejte text pro vyhledávání — žádné výsledky",
|
||||
"add.useExisting": "použít stávající",
|
||||
"add.vendorHint.existing": "S využitím stávajícího výrobce “{{name}}”",
|
||||
"add.vendorHint.new": "Nový výrobce “{{name}}” bude vytvořen",
|
||||
"add.vendorHint.optional": "Volitelné — pokud není uveden výrobce, ponechte pole prázdné",
|
||||
"add.yourCatalog": "Váš katalog",
|
||||
"buttons.archive": "Archivovat",
|
||||
"buttons.cancel": "Zrušit",
|
||||
"buttons.clear": "Vymazat",
|
||||
"buttons.close": "Zavřít",
|
||||
"buttons.delete": "Smazat",
|
||||
"buttons.edit": "Upravit",
|
||||
"buttons.filter": "Filtr",
|
||||
"buttons.save": "Uložit",
|
||||
"buttons.showArchived": "Zobrazit archivované",
|
||||
"buttons.unArchive": "Zrušit archivaci",
|
||||
"common.decrement": "Snížení",
|
||||
"common.increment": "Zvýšení",
|
||||
"common.remove": "Odstranit",
|
||||
"common.search": "Hledat",
|
||||
"dashboard.dashboard": "Přehledová obrazovka",
|
||||
"dashboard.deleteGroup": "Odstranit skupinu",
|
||||
"dashboard.errorEmptyName": "Jméno nesmí být prázdné",
|
||||
"dashboard.newGroup": "Nová skupina",
|
||||
"dashboard.newGroupName": "Nová skupina {{n}}",
|
||||
"dashboard.spoolCount_few": "{{count}} cívky",
|
||||
"dashboard.spoolCount_one": "{{count}} cívka",
|
||||
"dashboard.spoolCount_other": "{{count}} cívek",
|
||||
"dashboard.unassigned": "Nepřiřazeno",
|
||||
"datetime.done": "Hotovo",
|
||||
"datetime.hour": "Hodina",
|
||||
"datetime.minute": "Minuta",
|
||||
"datetime.nextMonth": "Příští měsíc",
|
||||
"datetime.now": "Nyní",
|
||||
"datetime.pick": "Vyberte datum a čas",
|
||||
"datetime.prevMonth": "Předchozí měsíc",
|
||||
"datetime.time": "Čas",
|
||||
"documentTitle.dashboard.list": "Ovládací panel | Spoolman",
|
||||
"documentTitle.labels.list": "Štítky | Spoolman",
|
||||
"documentTitle.library.list": "Knihovna | Spoolman",
|
||||
"documentTitle.locations.list": "Umístění | Spoolman",
|
||||
"documentTitle.settings.list": "Nastavení | Spoolman",
|
||||
"filament.fields.addColor": "Přidat barvu",
|
||||
"filament.fields.articleNumber": "Číslo výrobku",
|
||||
"filament.fields.coaxial": "Koextrudovaný",
|
||||
"filament.fields.colorHex": "Barva",
|
||||
"filament.fields.colorType": "Typ barvy",
|
||||
"filament.fields.comment": "Komentář",
|
||||
"filament.fields.density": "Hustota",
|
||||
"filament.fields.diameter": "Průměr",
|
||||
"filament.fields.externalId": "Externí ID",
|
||||
"filament.fields.id": "Id",
|
||||
"filament.fields.longitudinal": "Podélná",
|
||||
"filament.fields.material": "Materiál",
|
||||
"filament.fields.multiColor": "Více",
|
||||
"filament.fields.name": "Název",
|
||||
"filament.fields.price": "Cena",
|
||||
"filament.fields.registered": "Registrováno",
|
||||
"filament.fields.removeColor": "Odstranit barvu",
|
||||
"filament.fields.settingsBedTemp": "Teplota podložky",
|
||||
"filament.fields.settingsExtruderTemp": "Teplota extruderu",
|
||||
"filament.fields.singleColor": "Jediný",
|
||||
"filament.fields.spoolWeight": "Hmotnost cívky",
|
||||
"filament.fields.vendor": "Výrobce",
|
||||
"filament.fields.weight": "Váha",
|
||||
"filament.fieldsHelp.articleNumber": "Např. EAN, UPC, atd.",
|
||||
"filament.fieldsHelp.multiColorDirection": "Filamenty mohou mít více barev dvěma způsoby: buď koextruzí jako dvoubarevná vlákna s konzistentními více barvami, nebo podélnými změnami barev jako gradientní vlákna, která mění barvy podél cívky.",
|
||||
"filament.fieldsHelp.spoolWeight": "Hmotnost prázdné cívky. Slouží k určení naměřené hmotnosti cívky.",
|
||||
"filament.fieldsHelp.weight": "Hmotnost plného cívky filamentu (čistá hmotnost). Tato hmotnost by neměla zahrnovat hmotnost samotné cívky, ale pouze filamentu. Obvykle se uvádí na obalu.",
|
||||
"filament.filament": "Filamenty",
|
||||
"footer.documentation": "Dokumentace",
|
||||
"help.help": "Nápověda",
|
||||
"inspector.adjustWeight": "Nastavit váhu",
|
||||
"kofi": "Příspěvek autorovi na Ko-fi",
|
||||
"loading": "Načítání",
|
||||
"locations.locations": "Umístění",
|
||||
"locations.newLocation": "Nové umístění",
|
||||
"locations.noLocation": "Žádné umístění",
|
||||
"locations.noLocationsHelp": "Na této stránce můžete uspořádat své cívky podle umístění, přidejte několik cívek a začněte!",
|
||||
"no": "Ne",
|
||||
"notifications.error": "Chyba (kód chyby: {{statusCode}})",
|
||||
"notifications.saveSuccessful": "Úspěšně uloženo!",
|
||||
"printing.generic.columns": "Sloupce",
|
||||
"printing.generic.customSize": "Vlastní",
|
||||
"printing.generic.description": "Níže uvedeným nastavením dosáhnete požadovaného rozložení tisku. Mějte na paměti, že tiskárny a váš operační systém mohou použít vlastní okraje a měřítka, takže možná budete muset provést několik pokusů a omylů, než bude vše správně nastaveno. Před tiskem na skutečné štítky si to vyzkoušejte na kousku běžného papíru.",
|
||||
"printing.generic.dimensions": "Rozměry",
|
||||
"printing.generic.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.",
|
||||
"printing.generic.helpPrinterMargin": "Bezpečná zóna by měla být nastavena tak, jak blízko okraje papíru může tiskárna tisknout, jejich změna neovlivní celou mřížku.",
|
||||
"printing.generic.horizontalSpacing": "Vodorovná rozteč",
|
||||
"printing.generic.itemCopies": "Kopie položky",
|
||||
"printing.generic.marginBottom": "Dolní okraj",
|
||||
"printing.generic.marginLeft": "Levý okraj",
|
||||
"printing.generic.marginRight": "Pravý okraj",
|
||||
"printing.generic.marginTop": "Horní okraj",
|
||||
"printing.generic.paperSize": "Velikost papíru",
|
||||
"printing.generic.printerMarginBottom": "Okraj tiskárny dolní",
|
||||
"printing.generic.printerMarginLeft": "Okraj tiskárny vlevo",
|
||||
"printing.generic.printerMarginRight": "Okraj tiskárny vpravo",
|
||||
"printing.generic.printerMarginTop": "Okraj tiskárny horní",
|
||||
"printing.generic.saveAsImage": "Uložit jako obrázek",
|
||||
"printing.generic.skipItems": "Vynechat položky",
|
||||
"printing.generic.verticalSpacing": "Svislá rozteč",
|
||||
"printing.qrcode.button": "Tisk štítků",
|
||||
"printing.qrcode.useHTTPUrl.label": "Odkaz na QR kód",
|
||||
"printing.qrcode.useHTTPUrl.options.default": "Výchozí",
|
||||
"printing.qrcode.useHTTPUrl.options.url": "URL",
|
||||
"printing.qrcode.useHTTPUrl.preview": "Náhled:",
|
||||
"printing.qrcode.useHTTPUrl.tooltip": "Použije proprietární odkaz, který bude fungovat pouze v případě, že bude skenován pomocí funkce skenování Spoolman (výchozí). Adresa URL používá buď základní adresu URL zadanou v nastavení, nebo adresu URL aktuální stránky, pokud není nastavena.",
|
||||
"printing.spoolSelect.selectedTotal_few": "{{count}} vybrané cívky",
|
||||
"printing.spoolSelect.selectedTotal_one": "{{count}} vybraná cívka",
|
||||
"printing.spoolSelect.selectedTotal_other": "{{count}} vybraných cívek",
|
||||
"scanner.description": "Naskenováním QR kódu Spoolman zobrazíte podrobnosti o cívce.",
|
||||
"scanner.error.insecureContext": "Stránka se nezobrazuje přes protokol HTTPS.",
|
||||
"scanner.error.notAllowed": "Nemáte povolen přístup ke kameře.",
|
||||
"scanner.error.notFound": "Nebyla nalezena žádná kamera.",
|
||||
"scanner.error.streamApiNotSupported": "Prohlížeč nepodporuje MediaStream API.",
|
||||
"scanner.error.unknown": "Došlo k neznámé chybě. ({{error}})",
|
||||
"scanner.title": "Skener QR kódu",
|
||||
"settings.extraFields.booleanFalse": "Ne",
|
||||
"settings.extraFields.booleanTrue": "Ano",
|
||||
"settings.extraFields.deleteConfirm": "Smazat pole {{name}}?",
|
||||
"settings.extraFields.description.constraints": "Jakmile je pole přidáno, nemůžete změnit jeho klíč ani typ a u polí typu výběr nemůžete odebrat volby ani změnit stav více voleb. Pokud pole odstraníte, budou odstraněna přidružená data pro všechny subjekty.",
|
||||
"settings.extraFields.description.intro": "Zde můžete přidat další vlastní pole k subjektům.",
|
||||
"settings.extraFields.description.keyUsage": "Klíčové je, jako co ostatní programy čtou/zapisují data, takže pokud má být vaše vlastní pole integrováno s programem třetí strany, ujistěte se, že je správně nastaveno. Výchozí hodnota se použije pouze pro nové položky.",
|
||||
"settings.extraFields.description.tableViews": "Výstupní pole nelze v zobrazeních tabulky řadit ani filtrovat.",
|
||||
"settings.extraFields.errors.nameRequired": "Jméno je povinné.",
|
||||
"settings.extraFields.fieldType.boolean": "Logická hodnota",
|
||||
"settings.extraFields.fieldType.choice": "Volba",
|
||||
"settings.extraFields.fieldType.datetime": "Datumčas",
|
||||
"settings.extraFields.fieldType.float": "Plovoucí",
|
||||
"settings.extraFields.fieldType.floatRange": "Plovoucí rozsah",
|
||||
"settings.extraFields.fieldType.integer": "Celé číslo",
|
||||
"settings.extraFields.fieldType.integerRange": "Rozsah celých čísel",
|
||||
"settings.extraFields.fieldType.text": "Text",
|
||||
"settings.extraFields.max": "max",
|
||||
"settings.extraFields.min": "min",
|
||||
"settings.extraFields.multiple": "Více",
|
||||
"settings.extraFields.namePlaceholder": "Zobrazovaný název",
|
||||
"settings.extraFields.nonUniqueKeyError": "Tento klíč musí být jedinečný.",
|
||||
"settings.extraFields.params.choices": "Volby",
|
||||
"settings.extraFields.params.defaultValue": "Výchozí hodnota",
|
||||
"settings.extraFields.params.fieldType": "Typ",
|
||||
"settings.extraFields.params.key": "Klíč",
|
||||
"settings.extraFields.params.name": "Název",
|
||||
"settings.extraFields.params.order": "Objednávka",
|
||||
"settings.extraFields.params.unit": "Jednotka",
|
||||
"settings.extraFields.saveField": "Uložit pole",
|
||||
"settings.extraFields.tab": "Další pole",
|
||||
"settings.general.baseUrl.label": "Základní URL",
|
||||
"settings.general.baseUrl.tooltip": "Základní adresa URL, která se má použít při generování funkcí, jako jsou QR kódy.",
|
||||
"settings.general.currency.desc": "Třípísmenný kód ISO (např. EUR, USD) používaný pro ceny",
|
||||
"settings.general.currency.label": "Měna",
|
||||
"settings.general.roundPrices.label": "Zaokrouhlené ceny",
|
||||
"settings.general.roundPrices.tooltip": "Zaokrouhlete ceny na nejbližší celé číslo.",
|
||||
"settings.general.tab": "Obecné",
|
||||
"settings.header": "Nastavení",
|
||||
"settings.language.desc": "Jazyk rozhraní (pouze v tomto prohlížeči)",
|
||||
"settings.language.label": "Jazyk",
|
||||
"settings.library.tab": "Chování knihovny",
|
||||
"spool.fields.archived": "Archivováno",
|
||||
"spool.fields.comment": "Komentář",
|
||||
"spool.fields.filament": "Filament",
|
||||
"spool.fields.firstUsed": "První použití",
|
||||
"spool.fields.id": "ID",
|
||||
"spool.fields.lastUsed": "Naposledy použitá",
|
||||
"spool.fields.location": "Umístění",
|
||||
"spool.fields.lotNr": "Číslo šarže",
|
||||
"spool.fields.material": "Materiál",
|
||||
"spool.fields.measuredWeight": "Naměřená hmotnost",
|
||||
"spool.fields.price": "Cena",
|
||||
"spool.fields.registered": "Registrováno",
|
||||
"spool.fields.remainingWeight": "Zbývající hmotnost",
|
||||
"spool.fields.usedWeight": "Použitá hmotnost",
|
||||
"spool.fieldsHelp.location": "Kde se cívka nachází, pokud máte více míst, kde cívky skladujete.",
|
||||
"spool.fieldsHelp.lotNr": "Číslo šarže výrobce. Lze použít k zajištění jednotné barvy tisku v případě použití více cívek.",
|
||||
"spool.fieldsHelp.measuredWeight": "Jaká je hmotnost filamentu a cívky.",
|
||||
"spool.fieldsHelp.price": "Cena celé cívky. Pokud není nastavena, předpokládá se cena filamentu.",
|
||||
"spool.fieldsHelp.remainingWeight": "Kolik filamentu zbývá na cívce. U nové cívky by to mělo odpovídat hmotnosti filamentu na cívce.",
|
||||
"spool.fieldsHelp.usedWeight": "Kolik filamntu bylo z cívky spotřebováno. Na nové cívce by mělo být použito 0 g.",
|
||||
"spool.form.measurementType.length": "Délka",
|
||||
"spool.form.measurementType.weight": "Hmotnost",
|
||||
"spool.spool": "Cívky",
|
||||
"unknown": "Neznámý",
|
||||
"validation.mustBeNumber": "Musí to být číslo",
|
||||
"validation.required": "Povinné",
|
||||
"vendor.fields.comment": "Komentář",
|
||||
"vendor.fields.emptySpoolWeight": "Hmotnost prázdné cívky",
|
||||
"vendor.fields.externalId": "Externí ID",
|
||||
"vendor.fields.id": "Id",
|
||||
"vendor.fields.name": "Název",
|
||||
"vendor.fields.registered": "Registrováno",
|
||||
"vendor.fieldsHelp.emptySpoolWeight": "Hmotnost prázdné cívky od tohoto výrobce.",
|
||||
"yes": "Ano"
|
||||
}
|
||||
@@ -0,0 +1,145 @@
|
||||
{
|
||||
"buttons.archive": "Arkivér",
|
||||
"buttons.cancel": "Annuller",
|
||||
"buttons.clear": "Ryd",
|
||||
"buttons.delete": "Slet",
|
||||
"buttons.edit": "Redigér",
|
||||
"buttons.filter": "Filtrér",
|
||||
"buttons.save": "Gem",
|
||||
"buttons.showArchived": "Vis arkiverede",
|
||||
"buttons.unArchive": "Gendan arkiv",
|
||||
"documentTitle.locations.list": "Lokationer | Spoolman",
|
||||
"filament.fields.articleNumber": "Produktnummer",
|
||||
"filament.fields.coaxial": "Koaksialt",
|
||||
"filament.fields.colorHex": "Farve",
|
||||
"filament.fields.comment": "Kommentar",
|
||||
"filament.fields.density": "Massefylde",
|
||||
"filament.fields.diameter": "Diameter",
|
||||
"filament.fields.externalId": "Eksternt ID",
|
||||
"filament.fields.id": "ID",
|
||||
"filament.fields.longitudinal": "Langsgående",
|
||||
"filament.fields.material": "Materiale",
|
||||
"filament.fields.multiColor": "Flerfarvet",
|
||||
"filament.fields.name": "Navn",
|
||||
"filament.fields.price": "Pris",
|
||||
"filament.fields.registered": "Registreret",
|
||||
"filament.fields.settingsBedTemp": "Printpladetemperatur",
|
||||
"filament.fields.settingsExtruderTemp": "Ekstrudertemperatur",
|
||||
"filament.fields.singleColor": "Enkeltfarvet",
|
||||
"filament.fields.spoolWeight": "Spolevægt",
|
||||
"filament.fields.vendor": "Producent",
|
||||
"filament.fields.weight": "Vægt",
|
||||
"filament.fieldsHelp.articleNumber": "F.eks. EAN, UPC, e.l.",
|
||||
"filament.fieldsHelp.multiColorDirection": "Filamenter kan have flere farver på to måder: Enten koaksialt, som 2- & 3-farvede filamenter med vedvarende flerfarvethed, eller gennem langsgående ændringer, som regnbuefilamenter, hvor farven skifter undervejs på spolen.",
|
||||
"filament.fieldsHelp.spoolWeight": "Vægten af en tom spole. Bruges til at angive den målte vægt af en spole.",
|
||||
"filament.fieldsHelp.weight": "Filamentets vægt på en ny spole (nettovægt). Dette bør ikke inkludere vægten af selve spolen, kun filamentet. Det er som regel den angivne vægt på pakken.",
|
||||
"filament.filament": "Filamenter",
|
||||
"help.help": "Hjælp",
|
||||
"kofi": "Donér på Ko-fi",
|
||||
"loading": "Indlæser",
|
||||
"locations.locations": "Lokationer",
|
||||
"locations.newLocation": "Ny lokation",
|
||||
"locations.noLocation": "Ingen lokation",
|
||||
"locations.noLocationsHelp": "Denne side lader dig organisere dine spoler i lokationer, tilføj nogle spoler for at komme i gang!",
|
||||
"no": "Nej",
|
||||
"notifications.error": "Fejl (statuskode: {{statusCode}})",
|
||||
"notifications.saveSuccessful": "Gemt!",
|
||||
"printing.generic.columns": "Kolonner",
|
||||
"printing.generic.customSize": "Brugerdefineret",
|
||||
"printing.generic.description": "Redigér nedenstående indstillinger for at opnå det ønskede layout. Husk på at printere og dit operativsystem kan tilføje deres egne margener og skalering, så det kan kræve et par forsøg, før alt er korrekt. Test på et stykke almindeligt papir, før du udskriver på etiketter.",
|
||||
"printing.generic.dimensions": "Dimensioner",
|
||||
"printing.generic.helpMargin": "Margener bør indstilles til at matche din printer og papir. Ændringer her vil have indflydelse på hele layoutet.",
|
||||
"printing.generic.helpPrinterMargin": "\"Safe-Zone\" bør indstilles til hvor tæt på kanten af papiret din printer kan printe. Ændringer her vil IKKE have indflydelse på hele layoutet.",
|
||||
"printing.generic.horizontalSpacing": "Horisontal afstand",
|
||||
"printing.generic.itemCopies": "Kopier",
|
||||
"printing.generic.marginBottom": "Bund margen",
|
||||
"printing.generic.marginLeft": "Venstre margen",
|
||||
"printing.generic.marginRight": "Højre margen",
|
||||
"printing.generic.marginTop": "Top margen",
|
||||
"printing.generic.paperSize": "Papirstørrelse",
|
||||
"printing.generic.printerMarginBottom": "Safe-Zone bund",
|
||||
"printing.generic.printerMarginLeft": "Safe-Zone venstre",
|
||||
"printing.generic.printerMarginRight": "Safe-Zone højre",
|
||||
"printing.generic.printerMarginTop": "Safe-Zone top",
|
||||
"printing.generic.saveAsImage": "Gem som Billede",
|
||||
"printing.generic.skipItems": "Spring over",
|
||||
"printing.generic.verticalSpacing": "Vertikal afstand",
|
||||
"printing.qrcode.button": "Print etiketter",
|
||||
"printing.qrcode.useHTTPUrl.label": "QR-kode link",
|
||||
"printing.qrcode.useHTTPUrl.options.default": "Standard",
|
||||
"printing.qrcode.useHTTPUrl.options.url": "Webadresse",
|
||||
"printing.qrcode.useHTTPUrl.preview": "Forhåndsvisning:",
|
||||
"printing.qrcode.useHTTPUrl.tooltip": "Vil bruge proprietært link, der kun vil virke, hvis skannet med Spoolmans skanningsfunktion (standard). Webadressen bruger enten den basis-webadresse, specificeret i indstillinger, eller den nuværende sides webadresse, hvis ikke indstillet.",
|
||||
"printing.spoolSelect.selectedTotal_one": "{{count}} spole valgt",
|
||||
"printing.spoolSelect.selectedTotal_other": "{{count}} spoler valgt",
|
||||
"scanner.description": "Skan en Spoolman QR-kode for at se detaljer om spolen.",
|
||||
"scanner.error.insecureContext": "Denne side er ikke sikret med HTTPS.",
|
||||
"scanner.error.notAllowed": "Du har ikke givet adgang til kameraet.",
|
||||
"scanner.error.notFound": "Intet kamera fundet.",
|
||||
"scanner.error.streamApiNotSupported": "Denne browser understøtter ikke MediaStream API'et.",
|
||||
"scanner.error.unknown": "En ukendt fejl opstod. {{error}}",
|
||||
"scanner.title": "QR-kode skanner",
|
||||
"settings.extraFields.booleanFalse": "Nej",
|
||||
"settings.extraFields.booleanTrue": "Ja",
|
||||
"settings.extraFields.deleteConfirm": "Slet felt: {{name}}?",
|
||||
"settings.extraFields.description.intro": "Her kan du tilføje ekstra felter til dine poster.",
|
||||
"settings.extraFields.description.constraints": "Når et felt er tilføjet kan du ikke redigere dens Nøgle eller Type, og for visse felttyper kan du ikke fjerne valg, eller ændre multi-valgstatus. Hvis du fjerner et felt, vil associeret data i alle poster blive slettet.",
|
||||
"settings.extraFields.description.keyUsage": "Nøglen er hvad andre programmer læser/skriver data som, så hvis dit felt skal integreres med et tredjepartsprogram, skal du sørge for at indstille det korrekt. Standardværdi bliver kun tilføjet til nye felter.",
|
||||
"settings.extraFields.description.tableViews": "Ekstra felter kan ikke sorteres eller filtreres i oversigterne.",
|
||||
"settings.extraFields.fieldType.boolean": "Boolean (Ja/Nej)",
|
||||
"settings.extraFields.fieldType.choice": "Valg",
|
||||
"settings.extraFields.fieldType.datetime": "Dato-tid",
|
||||
"settings.extraFields.fieldType.float": "Decimaltal",
|
||||
"settings.extraFields.fieldType.floatRange": "Decimaltalspænd",
|
||||
"settings.extraFields.fieldType.integer": "Heltal",
|
||||
"settings.extraFields.fieldType.integerRange": "Heltalspænd",
|
||||
"settings.extraFields.fieldType.text": "Tekst",
|
||||
"settings.extraFields.nonUniqueKeyError": "Nøglen skal være Unik.",
|
||||
"settings.extraFields.params.choices": "Valgmuligheder",
|
||||
"settings.extraFields.params.defaultValue": "Standardværdi",
|
||||
"settings.extraFields.params.fieldType": "Type",
|
||||
"settings.extraFields.params.key": "Nøgle",
|
||||
"settings.extraFields.params.name": "Navn",
|
||||
"settings.extraFields.params.order": "Sortering",
|
||||
"settings.extraFields.params.unit": "Enhed",
|
||||
"settings.extraFields.tab": "Ekstra felter",
|
||||
"settings.general.baseUrl.label": "Basis-webadresse",
|
||||
"settings.general.baseUrl.tooltip": "Basis-webadressen til at benytte ved generering af funktioner, såsom QR-koder.",
|
||||
"settings.general.currency.label": "Valuta",
|
||||
"settings.general.roundPrices.label": "Afrund priser",
|
||||
"settings.general.roundPrices.tooltip": "Afrund priser til nærmeste heltal.",
|
||||
"settings.general.tab": "Generelt",
|
||||
"settings.header": "Indstillinger",
|
||||
"spool.fields.archived": "Arkiveret",
|
||||
"spool.fields.comment": "Kommentar",
|
||||
"spool.fields.filament": "Filament",
|
||||
"spool.fields.firstUsed": "Først anvendt",
|
||||
"spool.fields.id": "ID",
|
||||
"spool.fields.lastUsed": "Sidst anvendt",
|
||||
"spool.fields.location": "Placering",
|
||||
"spool.fields.lotNr": "Partinummer",
|
||||
"spool.fields.material": "Materiale",
|
||||
"spool.fields.measuredWeight": "Målt vægt",
|
||||
"spool.fields.price": "Pris",
|
||||
"spool.fields.registered": "Registreret",
|
||||
"spool.fields.remainingWeight": "Resterende vægt",
|
||||
"spool.fields.usedWeight": "Brugt vægt",
|
||||
"spool.fieldsHelp.location": "Placering af spolen, hvis du opbevarer spoler flere steder.",
|
||||
"spool.fieldsHelp.lotNr": "Producentens \"batch/partinummer\". Kan bruges til at sikre ensartede farver ved brug af flere ruller.",
|
||||
"spool.fieldsHelp.measuredWeight": "Hvor meget filament og spole vejer.",
|
||||
"spool.fieldsHelp.price": "Pris for en fuld spole. Hvis ikke indstillet, vil prisen i stedet blive antaget.",
|
||||
"spool.fieldsHelp.remainingWeight": "Hvor meget filament er der tilbage på spolen. For en ny spole bør dette matche spolens vægt.",
|
||||
"spool.fieldsHelp.usedWeight": "Hvor meget filament er der brugt fra spolen. En ny spole bør have 0g brugt.",
|
||||
"spool.form.measurementType.length": "Længde",
|
||||
"spool.form.measurementType.weight": "Vægt",
|
||||
"spool.spool": "Spoler",
|
||||
"unknown": "Ukendt",
|
||||
"vendor.fields.comment": "Kommentar",
|
||||
"vendor.fields.emptySpoolWeight": "Tom Spolevægt",
|
||||
"vendor.fields.externalId": "Eksternt ID",
|
||||
"vendor.fields.id": "ID",
|
||||
"vendor.fields.name": "Navn",
|
||||
"vendor.fields.registered": "Registreret",
|
||||
"vendor.fieldsHelp.emptySpoolWeight": "Vægten af en tom spole fra denne producent.",
|
||||
"yes": "Ja"
|
||||
}
|
||||
@@ -0,0 +1,145 @@
|
||||
{
|
||||
"buttons.archive": "Archiv",
|
||||
"buttons.cancel": "Abbrechen",
|
||||
"buttons.clear": "Bereinigen",
|
||||
"buttons.delete": "Löschen",
|
||||
"buttons.edit": "Bearbeiten",
|
||||
"buttons.filter": "Filter",
|
||||
"buttons.save": "Speichern",
|
||||
"buttons.showArchived": "Archivierte anzeigen",
|
||||
"buttons.unArchive": "Archivieren rückgängig machen",
|
||||
"documentTitle.locations.list": "Orte | Spoolman",
|
||||
"filament.fields.articleNumber": "Artikelnummer",
|
||||
"filament.fields.coaxial": "Coextrudiert",
|
||||
"filament.fields.colorHex": "Farbe",
|
||||
"filament.fields.comment": "Kommentar",
|
||||
"filament.fields.density": "Dichte",
|
||||
"filament.fields.diameter": "Durchmesser",
|
||||
"filament.fields.externalId": "Externe ID",
|
||||
"filament.fields.id": "ID",
|
||||
"filament.fields.longitudinal": "Längs",
|
||||
"filament.fields.material": "Material",
|
||||
"filament.fields.multiColor": "Mehrfarbig",
|
||||
"filament.fields.name": "Name",
|
||||
"filament.fields.price": "Preis",
|
||||
"filament.fields.registered": "Registriert",
|
||||
"filament.fields.settingsBedTemp": "Betttemperatur",
|
||||
"filament.fields.settingsExtruderTemp": "Düsentemperatur",
|
||||
"filament.fields.singleColor": "Einfarbig",
|
||||
"filament.fields.spoolWeight": "Gewicht Spule",
|
||||
"filament.fields.vendor": "Hersteller",
|
||||
"filament.fields.weight": "Gewicht",
|
||||
"filament.fieldsHelp.articleNumber": "z.B. EAN, UPC o.Ä.",
|
||||
"filament.fieldsHelp.multiColorDirection": "Filamente können auf zwei Arten mehrere Farben haben: entweder durch Koextrusion, wie bei zweifarbigen Filamenten mit konsistenten Mehrfarben, oder durch Farbveränderungen in Längsrichtung, wie bei Gradient-Filamenten, die die Farben entlang der Spule verschieben.",
|
||||
"filament.fieldsHelp.spoolWeight": "Das Gewicht der leeren Spule. Wird verwendet, um das gemessene Gewicht der Spule zu berechnen.",
|
||||
"filament.fieldsHelp.weight": "Das Gewicht einer vollen Spule (Nettogewicht). Sollte nicht das Gewicht der Spule, sondern nur dass des Filaments auf der Spule enthalten. Entspricht normalerweise dem Gewicht, das auf der Spule aufgedruckt ist.",
|
||||
"filament.filament": "Filamente",
|
||||
"help.help": "Hilfe",
|
||||
"kofi": "Schick mir ein Trinkgeld über Ko-fi",
|
||||
"loading": "Läd",
|
||||
"locations.locations": "Orte",
|
||||
"locations.newLocation": "Neuer Ort",
|
||||
"locations.noLocation": "Kein Ort",
|
||||
"locations.noLocationsHelp": "Diese Seite lässt Sie Ihre Spulen zu Orten zuweisen, fügen Sie ein paar Spulen hinzu um loszulegen!",
|
||||
"no": "Nein",
|
||||
"notifications.error": "Fehler (status code: {{statusCode}})",
|
||||
"notifications.saveSuccessful": "Erfolgreich gespeichert!",
|
||||
"printing.generic.columns": "Spalten",
|
||||
"printing.generic.customSize": "Benutzerdefiniert",
|
||||
"printing.generic.description": "Passe die Einstellungen unten an, um das gewünschte Drucklayout zu bekommen. Denk daran, dass Drucker und dein OS eigene Abstände und Skalierungen anwenden könnte, also musst du vielleicht ein bisschen ausprobieren, bis alles passt. Teste es auf einem normalen Blatt Papier, bevor du auf die richtigen Labels druckst.",
|
||||
"printing.generic.dimensions": "Dimensionen",
|
||||
"printing.generic.helpMargin": "Abstände sollten so konfiguriert werden, dass sie zum Papier und Drucker passen. Änderungen beeinflussen die Abmessungen des gesamten Gitters.",
|
||||
"printing.generic.helpPrinterMargin": "Der Sicherheitsabstand sollte so eingestellt werden, wie dicht der Drucker am Rand des Papiers drucken kann. Änderungen beeinflussen nicht die Abmessungen des Gitters.",
|
||||
"printing.generic.horizontalSpacing": "Horizontaler Abstand",
|
||||
"printing.generic.itemCopies": "Anzahl der Kopien",
|
||||
"printing.generic.marginBottom": "Abstand Unten",
|
||||
"printing.generic.marginLeft": "Abstand Links",
|
||||
"printing.generic.marginRight": "Abstand Rechts",
|
||||
"printing.generic.marginTop": "Abstand Oben",
|
||||
"printing.generic.paperSize": "Papiergröße",
|
||||
"printing.generic.printerMarginBottom": "Sicherheitsabstand Unten",
|
||||
"printing.generic.printerMarginLeft": "Sicherheitsabstand Links",
|
||||
"printing.generic.printerMarginRight": "Sicherheitsabstand Rechts",
|
||||
"printing.generic.printerMarginTop": "Sicherheitsabstand Oben",
|
||||
"printing.generic.saveAsImage": "Als Bild speichern",
|
||||
"printing.generic.skipItems": "Objekt überspringen",
|
||||
"printing.generic.verticalSpacing": "Vertikaler Abstand",
|
||||
"printing.qrcode.button": "Beschriftung drucken",
|
||||
"printing.qrcode.useHTTPUrl.label": "QR Code Link",
|
||||
"printing.qrcode.useHTTPUrl.options.default": "Standard",
|
||||
"printing.qrcode.useHTTPUrl.options.url": "URL",
|
||||
"printing.qrcode.useHTTPUrl.preview": "Vorschau:",
|
||||
"printing.qrcode.useHTTPUrl.tooltip": "Die Standardeinstellung verwendet einen proprietären Link, der nur funktioniert, wenn er mit der Scanfunktion von Spoolman gescannt wird. URL verwendet entweder die in den Einstellungen angegebene Basis-URL oder wenn diese nicht festgelegt ist die aktuelle Seiten-URL.",
|
||||
"printing.spoolSelect.selectedTotal_one": "{{count}} Spule ausgewählt",
|
||||
"printing.spoolSelect.selectedTotal_other": "{{count}} Spulen ausgewählt",
|
||||
"scanner.description": "Spoolman QR-Code scannen, um Details der Spule anzuzeigen.",
|
||||
"scanner.error.insecureContext": "Die Seite wird nicht über HTTPS bereitgestellt.",
|
||||
"scanner.error.notAllowed": "Zugriff auf Kamera wurde nicht erlaubt.",
|
||||
"scanner.error.notFound": "Keine Kamera gefunden.",
|
||||
"scanner.error.streamApiNotSupported": "Der Browser unterstützt die MediaStream API nicht.",
|
||||
"scanner.error.unknown": "Ein unbekannter Fehler ist aufgetreten. ({{error}})",
|
||||
"scanner.title": "QR-Code Scanner",
|
||||
"settings.extraFields.booleanFalse": "Nein",
|
||||
"settings.extraFields.booleanTrue": "Ja",
|
||||
"settings.extraFields.deleteConfirm": "Feld {{name}} entfernen?",
|
||||
"settings.extraFields.description.intro": "Hier können Sie zusätzliche benutzerdefinierte Felder zu Ihren Elementen hinzufügen.",
|
||||
"settings.extraFields.description.constraints": "Nach dem Hinzufügen eines Feldes können Sie dessen Schlüssel oder Typ nicht mehr ändern, und bei Auswahlfeldern können Sie keine Auswahlmöglichkeiten entfernen oder den Mehrfachauswahlstatus ändern. Wenn Sie ein Feld entfernen, werden die zugehörigen Daten für alle Elemente gelöscht.",
|
||||
"settings.extraFields.description.keyUsage": "Der Schlüssel ist derjenige, unter dem andere Programme die Daten lesen/schreiben, wenn Ihr benutzerdefiniertes Feld also mit einem Programm eines Drittanbieters integriert werden soll, stellen Sie sicher, dass Sie ihn richtig einstellen. Der Standardwert wird nur auf neue Elemente angewendet.",
|
||||
"settings.extraFields.description.tableViews": "Zusätzliche Felder können in den Tabellenansichten nicht sortiert oder gefiltert werden.",
|
||||
"settings.extraFields.fieldType.boolean": "Wahr/Falsch",
|
||||
"settings.extraFields.fieldType.choice": "Auswahl",
|
||||
"settings.extraFields.fieldType.datetime": "Datum und Uhrzeit",
|
||||
"settings.extraFields.fieldType.float": "Dezimalzahl",
|
||||
"settings.extraFields.fieldType.floatRange": "Float-Bereich",
|
||||
"settings.extraFields.fieldType.integer": "Ganze Zahl",
|
||||
"settings.extraFields.fieldType.integerRange": "Ganzzahlbereich",
|
||||
"settings.extraFields.fieldType.text": "Text",
|
||||
"settings.extraFields.nonUniqueKeyError": "Der Schlüssel muss einzigartig sein.",
|
||||
"settings.extraFields.params.choices": "Auswahlmöglichkeiten",
|
||||
"settings.extraFields.params.defaultValue": "Standardwert",
|
||||
"settings.extraFields.params.fieldType": "Typ",
|
||||
"settings.extraFields.params.key": "Schlüssel",
|
||||
"settings.extraFields.params.name": "Name",
|
||||
"settings.extraFields.params.order": "Reihenfolge",
|
||||
"settings.extraFields.params.unit": "Einheit",
|
||||
"settings.extraFields.tab": "Extra Felder",
|
||||
"settings.general.baseUrl.label": "Basis URL",
|
||||
"settings.general.baseUrl.tooltip": "Die basis URL für die Generierung von Funktionen wie QR Codes.",
|
||||
"settings.general.currency.label": "Währung",
|
||||
"settings.general.roundPrices.label": "Gerundeter Preis",
|
||||
"settings.general.roundPrices.tooltip": "Rundet die Preise auf die nächsthöhere ganze Zahl.",
|
||||
"settings.general.tab": "Allgemein",
|
||||
"settings.header": "Einstellungen",
|
||||
"spool.fields.archived": "Archiviert",
|
||||
"spool.fields.comment": "Kommentar",
|
||||
"spool.fields.filament": "Filament",
|
||||
"spool.fields.firstUsed": "Erste Verwendung",
|
||||
"spool.fields.id": "ID",
|
||||
"spool.fields.lastUsed": "Letzte Verwendung",
|
||||
"spool.fields.location": "Ort",
|
||||
"spool.fields.lotNr": "Chargennummer",
|
||||
"spool.fields.material": "Material",
|
||||
"spool.fields.measuredWeight": "Gemessenes Gewicht",
|
||||
"spool.fields.price": "Preis",
|
||||
"spool.fields.registered": "Registriert",
|
||||
"spool.fields.remainingWeight": "Verbleibendes Gewicht",
|
||||
"spool.fields.usedWeight": "Verbrauchtes Gewicht",
|
||||
"spool.fieldsHelp.location": "Ort, an dem die Spule gelagert wird.",
|
||||
"spool.fieldsHelp.lotNr": "Chargennummer des Herstellers. Kann verwendet werden um gleichmäßige Farben zu garantieren, wenn mehrere Spulen verwendet werden.",
|
||||
"spool.fieldsHelp.measuredWeight": "Gesamtgewicht von Spule und Filament.",
|
||||
"spool.fieldsHelp.price": "Preis einer vollen Spule. Falls nicht ausgewählt, wird der Preis des Filaments geschätzt.",
|
||||
"spool.fieldsHelp.remainingWeight": "Wie viel Filament noch auf der Spule ist. Entspricht dem auf der Spule angegeben Nettogewicht, wenn die Spule neu ist.",
|
||||
"spool.fieldsHelp.usedWeight": "Wie viel Gewicht bereits verbraucht wurde z.B. 0g für eine neue Spule.",
|
||||
"spool.form.measurementType.length": "Länge",
|
||||
"spool.form.measurementType.weight": "Gewicht",
|
||||
"spool.spool": "Spulen",
|
||||
"unknown": "Unbekannt",
|
||||
"vendor.fields.comment": "Kommentar",
|
||||
"vendor.fields.emptySpoolWeight": "Gewicht der leeren Spule",
|
||||
"vendor.fields.externalId": "Externe ID",
|
||||
"vendor.fields.id": "ID",
|
||||
"vendor.fields.name": "Name",
|
||||
"vendor.fields.registered": "Registriert",
|
||||
"vendor.fieldsHelp.emptySpoolWeight": "Das Gewicht einer leeren Spule von diesem Hersteller.",
|
||||
"yes": "Ja"
|
||||
}
|
||||
@@ -0,0 +1,118 @@
|
||||
{
|
||||
"buttons.archive": "Αρχειοθέτηση",
|
||||
"buttons.cancel": "Ακύρωση",
|
||||
"buttons.clear": "Εκκαθάριση",
|
||||
"buttons.delete": "Διαγραφή",
|
||||
"buttons.edit": "Τροποποίηση",
|
||||
"buttons.filter": "Φιλτράρισμα",
|
||||
"buttons.save": "Αποθήκευση",
|
||||
"buttons.showArchived": "Εμφάνιση Αρχειοθετημένων",
|
||||
"buttons.unArchive": "Επαναφορά Αρχειοθετημένου",
|
||||
"filament.fields.articleNumber": "Κωδικός Προϊόντος",
|
||||
"filament.fields.colorHex": "Χρώμα",
|
||||
"filament.fields.comment": "Σχόλια",
|
||||
"filament.fields.density": "Πυκνότητα",
|
||||
"filament.fields.diameter": "Διάμετρος",
|
||||
"filament.fields.id": "Α/Α",
|
||||
"filament.fields.material": "Υλικό",
|
||||
"filament.fields.name": "Όνομα",
|
||||
"filament.fields.price": "Τιμή",
|
||||
"filament.fields.registered": "Ημερομηνία Εγγραφής",
|
||||
"filament.fields.settingsBedTemp": "Θερμοκρασία Κρεβατιού",
|
||||
"filament.fields.settingsExtruderTemp": "Θερμοκρασία Μύτης",
|
||||
"filament.fields.spoolWeight": "Βάρος Καρουλιού",
|
||||
"filament.fields.vendor": "Προμηθευτής",
|
||||
"filament.fields.weight": "Βάρος",
|
||||
"filament.fieldsHelp.articleNumber": "Π.χ. EAN, UPC, κλπ.",
|
||||
"filament.fieldsHelp.spoolWeight": "Το βάρος ενός άδειου καρουλιού. Χρησιμοποιείται για τον προσδιορισμό του μετρημένου βάρους ενός καρουλιού.",
|
||||
"filament.fieldsHelp.weight": "Το βάρος του νήματος ενός πλήρους καρουλιού (καθαρό βάρος). Αυτό δεν πρέπει να περιλαμβάνει το βάρος του ίδιου του καρουλιού, μόνο το βάρος του νήματος. Είναι αυτό που συνήθως αναγράφεται στη συσκευασία.",
|
||||
"filament.filament": "Νήματα",
|
||||
"help.help": "Βοήθεια",
|
||||
"kofi": "Φιλοδώρημα στο Ko-fi",
|
||||
"loading": "Φόρτωση",
|
||||
"no": "Όχι",
|
||||
"notifications.error": "Λάθος (status code: {{statusCode}})",
|
||||
"notifications.saveSuccessful": "Επιτυχής Αποθήκευση!",
|
||||
"printing.generic.columns": "Στήλες",
|
||||
"printing.generic.customSize": "Προσαρμοσμένο",
|
||||
"printing.generic.description": "Τροποποιήστε τις παρακάτω ρυθμίσεις για να αποκτήσετε την επιθυμητή διάταξη εκτύπωσης. Λάβετε υπόψη ότι οι εκτυπωτές και το λειτουργικό σας σύστημα ενδέχεται να εφαρμόζουν τα δικά τους περιθώρια και την δική τους μεγέθυνση, επομένως ίσως χρειαστεί να εκτελέσετε κάποιες δοκιμές πριν είναι όλα σωστά. Δοκιμάστε τις ρυθμίσεις σε ένα κομμάτι κανονικού χαρτιού πριν εκτυπώσετε στις πραγματικές ετικέτες.",
|
||||
"printing.generic.dimensions": "Διαστάσεις",
|
||||
"printing.generic.helpMargin": "Τα περιθώρια θα πρέπει να διαμορφωθούν ώστε να ταιριάζουν με το χαρτί ετικετών που χρησιμοποιείτε αλλά και τον εκτυπωτή σας. Η αλλαγή αυτών των περιθωρίων θα επηρεάσει το μέγεθος ολόκληρου του πλέγματος.",
|
||||
"printing.generic.helpPrinterMargin": "Το ασφαλές περιθώριο πρέπει να ρυθμιστεί στο πόσο κοντά στην άκρη του χαρτιού μπορεί να εκτυπώσει ο εκτυπωτής σας. Η αλλαγή αυτών δεν θα επηρεάσει ολόκληρο το πλέγμα.",
|
||||
"printing.generic.horizontalSpacing": "Οριζόντιο Διάστημα",
|
||||
"printing.generic.marginBottom": "Κάτω Περιθώριο",
|
||||
"printing.generic.marginLeft": "Αριστερό περιθώριο",
|
||||
"printing.generic.marginRight": "Δεξιό Περιθώριο",
|
||||
"printing.generic.marginTop": "Επάνω Περιθώριο",
|
||||
"printing.generic.paperSize": "Μέγεθος Χαρτιού",
|
||||
"printing.generic.printerMarginBottom": "Ασφαλές Περιθώριο Κάτω",
|
||||
"printing.generic.printerMarginLeft": "Ασφαλές Περιθώριο Αριστερά",
|
||||
"printing.generic.printerMarginRight": "Ασφαλές Περιθώριο Δεξιά",
|
||||
"printing.generic.printerMarginTop": "Ασφαλές Περιθώριο Επάνω",
|
||||
"printing.generic.skipItems": "Παράληψη Αντικειμένων",
|
||||
"printing.generic.verticalSpacing": "Κάθετο Διάστημα",
|
||||
"printing.qrcode.button": "Tύπωση Κωδικών QR",
|
||||
"printing.spoolSelect.selectedTotal_one": "{{count}} καρούλι έχει επιλεγεί",
|
||||
"printing.spoolSelect.selectedTotal_other": "{{count}} καρούλια έχουν επιλεγεί",
|
||||
"scanner.description": "Σκάναρε τον Spoolman κωδικό QR για να δεις πληροφορίες για το νήμα.",
|
||||
"scanner.error.insecureContext": "Η σελίδα δεν υποστηρίζεται μέσω HTTPS.",
|
||||
"scanner.error.notAllowed": "Δεν έχετε επιτρέψει την πρόσβαση στην κάμερα.",
|
||||
"scanner.error.notFound": "Δεν βρέθηκε κάμερα.",
|
||||
"scanner.error.streamApiNotSupported": "Αυτός ο browser δεν υποστηρίζει το MediaStream API.",
|
||||
"scanner.error.unknown": "Προέκυψε άγνωστο σφάλμα. ({{error}})",
|
||||
"scanner.title": "Αναγνώστης κωδικού QR",
|
||||
"settings.extraFields.booleanFalse": "Τιμή για ένα πρόσθετο πεδίο boolean Λανθασμένο",
|
||||
"settings.extraFields.booleanTrue": "Τιμή για ένα πρόσθετο πεδίο boolean Αληθές",
|
||||
"settings.extraFields.deleteConfirm": "Διαγραφή πεδίου {{name}};",
|
||||
"settings.extraFields.description.intro": "Εδώ μπορείτε να προσθέσετε επιπλέον προσαρμοσμένα πεδία στις οντότητες σας.",
|
||||
"settings.extraFields.description.constraints": "Μόλις προστεθεί ένα πεδίο, δεν μπορείτε να αλλάξετε το κλειδί ή τον τύπο του και για στα πεδία τύπου επιλογής δεν μπορείτε να αφαιρέσετε επιλογές ή να αλλάξετε την κατάσταση πολλαπλών επιλογών. Εάν καταργήσετε ένα πεδίο, τα συσχετισμένα δεδομένα για όλες τις οντότητες θα διαγραφούν.",
|
||||
"settings.extraFields.description.keyUsage": "Το κλειδί είναι πώς τα άλλα προγράμματα διαβάζουν/εγγράφουν τα δεδομένα, οπότε αν το προσαρμοσμένο πεδίο σας υποτίθεται ότι ενσωματώνεται με ένα πρόγραμμα τρίτου κατασκευαστή, φροντίστε να το ρυθμίσετε σωστά. Η προεπιλεγμένη τιμή εφαρμόζεται μόνο σε νέα στοιχεία.",
|
||||
"settings.extraFields.description.tableViews": "Τα πρόσθετα πεδία δεν μπορούν να ταξινομηθούν ή να φιλτραριστούν στις προβολές πίνακα.",
|
||||
"settings.extraFields.fieldType.boolean": "Πρόσθετο πεδίο τύπου \"Boolean\", Ναι/Όχι",
|
||||
"settings.extraFields.fieldType.choice": "\"Choice\" πληκτρολογήστε επιπλέον πεδίο, οι χρήστες μπορούν να επιλέξουν από μια λίστα τιμών",
|
||||
"settings.extraFields.fieldType.datetime": "Πληκτρολογήστε επιπλέον πεδίο \"Date+Time\"",
|
||||
"settings.extraFields.fieldType.float": "\"Float\" πληκτρολογήστε επιπλέον πεδίο, έναν αριθμό με δεκαδικούς αριθμούς",
|
||||
"settings.extraFields.fieldType.floatRange": "\"Float Range\" πληκτρολογήστε επιπλέον πεδίο, ένα εύρος δύο αριθμών με δεκαδικούς αριθμούς",
|
||||
"settings.extraFields.fieldType.integer": "\"Integer\" πληκτρολογήστε επιπλέον πεδίο, ακέραιο αριθμό χωρίς δεκαδικούς αριθμούς",
|
||||
"settings.extraFields.fieldType.integerRange": "\"Integer Range\" πληκτρολογήστε επιπλέον πεδίο, ένα εύρος δύο ακέραιων αριθμών χωρίς δεκαδικoύς αριθμούς",
|
||||
"settings.extraFields.fieldType.text": "Πληκτρολογήστε επιπλέον πεδίο \"Text\".",
|
||||
"settings.extraFields.nonUniqueKeyError": "Το κλειδί πρέπει να είναι μοναδικό.",
|
||||
"settings.extraFields.params.choices": "Επιλογές",
|
||||
"settings.extraFields.params.defaultValue": "Προεπιλεγμένη τιμή",
|
||||
"settings.extraFields.params.fieldType": "Τύπος",
|
||||
"settings.extraFields.params.key": "Κλειδί",
|
||||
"settings.extraFields.params.name": "Όνομα",
|
||||
"settings.extraFields.params.order": "Σειρά",
|
||||
"settings.extraFields.params.unit": "Μονάδα",
|
||||
"settings.extraFields.tab": "Επιπλέον Πεδία",
|
||||
"settings.general.currency.label": "Ετικέτα για τη ρύθμιση του νομίσματος",
|
||||
"settings.general.tab": "Γενικές",
|
||||
"settings.header": "Ρυθμίσεις",
|
||||
"spool.fields.archived": "Αρχειοθετημένο",
|
||||
"spool.fields.comment": "Σχόλια",
|
||||
"spool.fields.filament": "Νήμα",
|
||||
"spool.fields.firstUsed": "Πρώτη Χρήση",
|
||||
"spool.fields.id": "Α/Α",
|
||||
"spool.fields.lastUsed": "Τελευταία Χρήση",
|
||||
"spool.fields.location": "Τοποθεσία Αποθήκευσης",
|
||||
"spool.fields.lotNr": "Αριθμός Παρτίδας",
|
||||
"spool.fields.material": "Υλικό",
|
||||
"spool.fields.measuredWeight": "Μετρημένο Βάρος",
|
||||
"spool.fields.price": "Τιμή",
|
||||
"spool.fields.registered": "Ημερομηνία Εγγραφής",
|
||||
"spool.fields.remainingWeight": "Υπολειπόμενο Βάρος",
|
||||
"spool.fields.usedWeight": "Χρησιμοποιημένο Βάρος",
|
||||
"spool.fieldsHelp.location": "Που βρίσκεται το καρούλι, εάν υπάρχουν πολλαπλά σημεία αποθήκευσης για τα καρούλια.",
|
||||
"spool.fieldsHelp.lotNr": "Αριθμός παρτίδας κατασκευαστή. Μπορεί να χρησιμοποιηθεί για να διασφαλιστεί ότι μια εκτύπωση έχει σταθερό χρώμα εάν χρησιμοποιούνται πολλαπλά καρούλια.",
|
||||
"spool.fieldsHelp.measuredWeight": "Πόσο ζυγίζουν το νήμα και το καρούλι.",
|
||||
"spool.fieldsHelp.price": "Τιμή πλήρους καρουλιού. Εάν δεν οριστεί, η τιμή του νήματος θα θεωρηθεί αντ' αυτού.",
|
||||
"spool.fieldsHelp.remainingWeight": "Πόσο νήμα έχει απομείνει στο καρούλι. Για ένα καινούργιο καρούλι αυτό πρέπει να συμπίπτει με το βάρος του καρουλιού.",
|
||||
"spool.fieldsHelp.usedWeight": "Πόσο νήμα έχει χρησιμοποιηθεί από το καρούλι. Σε ένα καινούργιο καρούλι θα πρέπει να έχουν χρησιμοποιηθεί 0g.",
|
||||
"spool.spool": "Καρούλια",
|
||||
"unknown": "Άγνωστος",
|
||||
"vendor.fields.comment": "Σχόλια",
|
||||
"vendor.fields.id": "Α/Α",
|
||||
"vendor.fields.name": "Όνομα",
|
||||
"vendor.fields.registered": "Ημερομηνία Εγγραφής",
|
||||
"yes": "Ναι"
|
||||
}
|
||||
@@ -0,0 +1,476 @@
|
||||
{
|
||||
"add.addAndNew": "Add & new",
|
||||
"add.addN_one": "Add {{count}} spool",
|
||||
"add.addN_other": "Add {{count}} spools",
|
||||
"add.adding": "Adding...",
|
||||
"add.advanced": "Advanced specs",
|
||||
"add.advancedNote": "density, diameter, temperatures (auto-filled from material)",
|
||||
"add.change": "change",
|
||||
"add.count": "Count",
|
||||
"add.createNew": "Create a new filament",
|
||||
"add.createNewSub": "not in your catalog or {{name}}",
|
||||
"add.duplicate": "duplicate",
|
||||
"add.duplicateTitle": "New filament · copy of “{{name}}”",
|
||||
"add.duplicateNote": "Specs, manufacturer and price were copied over. Give it a new name and color.",
|
||||
"add.duplicateRename": "Still named like the original — rename it to tell them apart.",
|
||||
"add.dbUnavailable": "{{name}} unavailable",
|
||||
"add.manufacturerPlaceholder": "e.g. Polymaker",
|
||||
"add.filamentNamePlaceholder": "e.g. PolyTerra Matte Sage",
|
||||
"add.nameHint": "Include the color — it’s what tells your filaments apart.",
|
||||
"add.fill.full": "Full",
|
||||
"add.fillLevel": "Fill level",
|
||||
"add.importNote": "This filament will be added to your catalog when you add the spools.",
|
||||
"add.inCatalog": "in catalog",
|
||||
"add.locationHint": "Where you physically keep the spool — a shelf, a box, or a printer. Leave it blank if you keep them all in one place.",
|
||||
"add.locationPlaceholder": "e.g. Shelf A, Dry box 2, Printer 1",
|
||||
"add.newFilament": "new filament",
|
||||
"add.newFilamentTitle": "New filament",
|
||||
"add.noCatalog": "No filaments in your catalog",
|
||||
"add.noManufacturer": "No manufacturer",
|
||||
"add.pickColor": "Pick color",
|
||||
"add.searchPlaceholder": "Search your catalog and {{name}}...",
|
||||
"add.searching": "Searching...",
|
||||
"add.spoolWeightPreset.cardboard": "Cardboard {{weight}} g",
|
||||
"add.spoolWeightPreset.plastic": "Plastic {{weight}} g",
|
||||
"add.spoolWeightPresetsLead": "Start from a typical spool:",
|
||||
"add.step2": "Step 2 · spool details",
|
||||
"add.summary_one": "{{count}} spool",
|
||||
"add.summary_other": "{{count}} spools",
|
||||
"add.typeToSearchAll": "Type to search thousands of filaments",
|
||||
"add.typeToSearchMatches": "Type to search — no matches",
|
||||
"add.useExisting": "use an existing one",
|
||||
"add.vendorHint.existing": "Using existing manufacturer “{{name}}”",
|
||||
"add.vendorHint.new": "New manufacturer “{{name}}” will be created",
|
||||
"add.vendorHint.optional": "Optional — leave blank for no manufacturer",
|
||||
"add.yourCatalog": "Your catalog",
|
||||
"buttons.archive": "Archive",
|
||||
"buttons.cancel": "Cancel",
|
||||
"buttons.clear": "Clear",
|
||||
"buttons.close": "Close",
|
||||
"buttons.delete": "Delete",
|
||||
"buttons.edit": "Edit",
|
||||
"buttons.filter": "Filter",
|
||||
"buttons.save": "Save",
|
||||
"buttons.showArchived": "Show Archived",
|
||||
"buttons.unArchive": "Unarchive",
|
||||
"common.decrement": "Decrement",
|
||||
"common.increment": "Increment",
|
||||
"common.remove": "Remove",
|
||||
"common.search": "Search",
|
||||
"dashboard.addFieldHint": "Add a text or choice field to spools in Settings to group by it too",
|
||||
"dashboard.dashboard": "Dashboard",
|
||||
"dashboard.deleteGroup": "Delete group",
|
||||
"dashboard.dragHint": "Drag a spool to another card to change its {{field}}, or within a card to reorder",
|
||||
"dashboard.dropHere": "drop spools here",
|
||||
"dashboard.emptyHelp": "This page groups your spools by a field of your choosing, add some spools to get started!",
|
||||
"dashboard.errorEmptyName": "Name cannot be empty",
|
||||
"dashboard.errorExists": "A group with that name already exists",
|
||||
"dashboard.errorRename": "Failed to rename group",
|
||||
"dashboard.lastUsed": "Last used {{time}} ago",
|
||||
"dashboard.newGroup": "New group",
|
||||
"dashboard.newGroupName": "New group {{n}}",
|
||||
"dashboard.reorderGroup": "Drag to reorder group",
|
||||
"dashboard.spoolCount_one": "{{count}} spool",
|
||||
"dashboard.spoolCount_other": "{{count}} spools",
|
||||
"dashboard.unassigned": "Unassigned",
|
||||
"datetime.done": "Done",
|
||||
"datetime.hour": "Hour",
|
||||
"datetime.minute": "Minute",
|
||||
"datetime.nextMonth": "Next month",
|
||||
"datetime.now": "Now",
|
||||
"datetime.pick": "Pick date and time",
|
||||
"datetime.prevMonth": "Previous month",
|
||||
"datetime.time": "Time",
|
||||
"documentTitle.dashboard.list": "Dashboard | Spoolman",
|
||||
"documentTitle.labels.list": "Labels | Spoolman",
|
||||
"documentTitle.library.list": "Library | Spoolman",
|
||||
"documentTitle.settings.list": "Settings | Spoolman",
|
||||
"filament.fields.addColor": "Add color",
|
||||
"filament.fields.articleNumber": "Article Number",
|
||||
"filament.fields.coaxial": "Coextruded",
|
||||
"filament.fields.colorHex": "Color",
|
||||
"filament.fields.colorType": "Color type",
|
||||
"filament.fields.comment": "Comment",
|
||||
"filament.fields.density": "Density",
|
||||
"filament.fields.diameter": "Diameter",
|
||||
"filament.fields.externalId": "External ID",
|
||||
"filament.fields.id": "ID",
|
||||
"filament.fields.longitudinal": "Longitudinal",
|
||||
"filament.fields.material": "Material",
|
||||
"filament.fields.multiColor": "Multi",
|
||||
"filament.fields.name": "Name",
|
||||
"filament.fields.price": "Price",
|
||||
"filament.fields.registered": "Registered",
|
||||
"filament.fields.removeColor": "Remove color",
|
||||
"filament.fields.settingsBedTemp": "Bed Temp",
|
||||
"filament.fields.settingsExtruderTemp": "Extruder Temp",
|
||||
"filament.fields.singleColor": "Single",
|
||||
"filament.fields.spoolWeight": "Spool Weight",
|
||||
"filament.fields.vendor": "Manufacturer",
|
||||
"filament.fields.weight": "Weight",
|
||||
"filament.fieldsHelp.articleNumber": "E.g. EAN, UPC, etc.",
|
||||
"filament.fieldsHelp.multiColorDirection": "Filaments can have multiple colors in two ways: either through coextrusion, like dual-color filaments with consistent multi-colors, or through longitudinal color changes, like gradient filaments that shift colors along the spool.",
|
||||
"filament.fieldsHelp.spoolWeight": "The weight of an empty spool. Used to determine measured weight of a spool. Not sure? Cardboard spools usually weigh 130–150 g and plastic ones 180–250 g — for an exact number, put the spool on a scale once it runs out.",
|
||||
"filament.fieldsHelp.weight": "The filament weight of a full spool (net weight). This should not include the weight of the spool itself, only the filament. It is what is usually written on the packaging.",
|
||||
"filament.filament": "Filaments",
|
||||
"footer.documentation": "Documentation",
|
||||
"footer.reportIssue": "Report an issue",
|
||||
"help.help": "Help",
|
||||
"inspector.addSpoolsOfThis": "Add spools of this",
|
||||
"inspector.adjustFailed": "Failed to adjust weight.",
|
||||
"inspector.adjustHelp": "Positive consumes filament, negative adds it back.",
|
||||
"inspector.adjustWeight": "Adjust weight",
|
||||
"inspector.apply": "Apply",
|
||||
"inspector.applying": "Applying...",
|
||||
"inspector.colorHex": "Color hex",
|
||||
"inspector.consumeAmount": "Consume amount:",
|
||||
"inspector.delete.deleting": "Deleting...",
|
||||
"inspector.delete.errorGone": "It had already been deleted.",
|
||||
"inspector.delete.errorSpoolsExist": "Can't delete this filament — spools still use it.",
|
||||
"inspector.delete.errorUnknown": "Delete failed. See the server logs for details.",
|
||||
"inspector.delete.filament": "Delete filament",
|
||||
"inspector.delete.filamentBlockedHint": "Delete those spools first. Archiving them is not enough.",
|
||||
"inspector.delete.filamentBlockedTitle": "This filament can't be deleted",
|
||||
"inspector.delete.filamentBlocked_one": "{{count}} spool still uses “{{name}}”, including archived ones.",
|
||||
"inspector.delete.filamentBlocked_other": "{{count}} spools still use “{{name}}”, including archived ones.",
|
||||
"inspector.delete.filamentBody": "“{{name}}” will be removed from your catalog. This cannot be undone.",
|
||||
"inspector.delete.filamentDone": "Filament deleted.",
|
||||
"inspector.delete.filamentTitle": "Delete this filament?",
|
||||
"inspector.delete.spool": "Delete spool",
|
||||
"inspector.delete.spoolBody": "Spool #{{id}} of “{{name}}” will be removed, along with its usage history. This cannot be undone.",
|
||||
"inspector.delete.spoolDone": "Spool deleted.",
|
||||
"inspector.delete.spoolRemaining": "It still has {{weight}} of filament left. Archive it instead if you only want it out of the way.",
|
||||
"inspector.delete.spoolTitle": "Delete this spool?",
|
||||
"inspector.delete.vendor": "Delete manufacturer",
|
||||
"inspector.delete.vendorBody": "“{{name}}” will be removed. This cannot be undone.",
|
||||
"inspector.delete.vendorDone": "Manufacturer deleted.",
|
||||
"inspector.delete.vendorOrphans_one": "Its {{count}} filament is kept, but is left without a manufacturer.",
|
||||
"inspector.delete.vendorOrphans_other": "Its {{count}} filaments are kept, but are left without a manufacturer.",
|
||||
"inspector.delete.vendorTitle": "Delete this manufacturer?",
|
||||
"inspector.duplicateFilament": "Duplicate",
|
||||
"inspector.empty": "Select a spool, filament or manufacturer from the list to see its details here.",
|
||||
"inspector.loading": "Loading...",
|
||||
"inspector.notFound": "This item could not be found. It may have been deleted.",
|
||||
"inspector.enterValidLength": "Enter a valid length.",
|
||||
"inspector.enterValidWeight": "Enter a valid weight.",
|
||||
"inspector.filamentDefault": "{{price}} · filament default",
|
||||
"inspector.measuredHelp": "Total weight of the spool + remaining filament, as read from a scale.",
|
||||
"inspector.manageExtraFields": "Manage fields",
|
||||
"inspector.multi": "multi ×{{count}}",
|
||||
"inspector.newGross": "New gross weight:",
|
||||
"inspector.noExtraFields": "None yet — add your own fields to track anything Spoolman doesn't.",
|
||||
"inspector.ofRemaining": "of {{weight}} remaining · {{length}} m",
|
||||
"inspector.openFilament": "Open filament",
|
||||
"inspector.openLink": "Open {{url}} in a new tab",
|
||||
"inspector.openManufacturer": "Open manufacturer",
|
||||
"inspector.specs": "Specs — edit in place",
|
||||
"inspector.spoolsCount": "Spools · {{count}}",
|
||||
"inspector.spoolsTotalRemaining": "{{weight}} total",
|
||||
"inspector.used": "used",
|
||||
"inspector.vendorSub_one": "{{count}} filament",
|
||||
"inspector.vendorSub_other": "{{count}} filaments",
|
||||
"kofi": "Tip me on Ko-fi",
|
||||
"labels.addHead": "Add",
|
||||
"labels.addQr": "QR code",
|
||||
"labels.addRect": "Rectangle",
|
||||
"labels.addSwatch": "Color swatch",
|
||||
"labels.addText": "Text / field",
|
||||
"labels.align": "Align",
|
||||
"labels.alignCenter": "Center",
|
||||
"labels.alignLeft": "Left",
|
||||
"labels.alignRight": "Right",
|
||||
"labels.blank": "You don't have any label designs yet.",
|
||||
"labels.bold": "Bold",
|
||||
"labels.canvasHint": "Drag to move · click to select · handles to resize.",
|
||||
"labels.centerLogo": "Center Spoolman logo",
|
||||
"labels.chooseField": "Choose a field...",
|
||||
"labels.clearFill": "Clear fill (outline only)",
|
||||
"labels.copies": "Copies",
|
||||
"labels.cornerRadiusMm": "Corner radius",
|
||||
"labels.createFirst": "Create your first label",
|
||||
"labels.cutGuides": "Cut guides",
|
||||
"labels.deleteConfirm": "Delete this label design?",
|
||||
"labels.deleteElement": "Delete element",
|
||||
"labels.designName": "Design name",
|
||||
"labels.selectDesign": "Select label design",
|
||||
"labels.designerDesc": "Design QR-code labels with any spool, filament, or vendor field, then print them on sheets or a label printer. Designs are saved on the server.",
|
||||
"labels.designerTitle": "Label designer",
|
||||
"labels.dpi": "Resolution",
|
||||
"labels.dpiHint": "Match your printer to keep small labels sharp: 203 dpi for most thermal label printers, 300 or more for laser and inkjet.",
|
||||
"labels.duplicate": "Duplicate",
|
||||
"labels.fields.bedTemp": "Bed temp",
|
||||
"labels.fields.diameterMm": "Diameter (mm)",
|
||||
"labels.fields.groupVendor": "Vendor",
|
||||
"labels.fields.initialG": "Initial (g)",
|
||||
"labels.fields.netWeightG": "Net weight (g)",
|
||||
"labels.fields.remainingG": "Remaining (g)",
|
||||
"labels.filamentsSelected_one": "{{count}} filament selected",
|
||||
"labels.filamentsSelected_other": "{{count}} filaments selected",
|
||||
"labels.fill": "Fill",
|
||||
"labels.fitWidth": "Fit width to columns",
|
||||
"labels.fitWidthHint": "Set the label width so the chosen number of columns fills the page.",
|
||||
"labels.fontMm": "Font",
|
||||
"labels.gridInfo": "{{cols}} × {{rows}} = {{perPage}} labels / page",
|
||||
"labels.hMm": "H",
|
||||
"labels.heightMm": "Height",
|
||||
"labels.hintNowrap": "Text stays on one line; anything past the width is clipped.",
|
||||
"labels.hintSwatch": "Filled with the spool's filament color(s) at print time.",
|
||||
"labels.hintWrap": "Wrap a field to hide it when empty:",
|
||||
"labels.imageDesc": "Saves one PNG per selected spool instead of printing, each {{w}}×{{h}} mm.",
|
||||
"labels.imageZipNote": "More than {{threshold}} labels are delivered as a single zip file.",
|
||||
"labels.insertField": "Insert field",
|
||||
"labels.kind.qr": "QR code",
|
||||
"labels.kind.rect": "Rectangle",
|
||||
"labels.kind.swatch": "Swatch",
|
||||
"labels.kind.text": "Text",
|
||||
"labels.labelSize": "Label size",
|
||||
"labels.labelType": "Label type",
|
||||
"labels.layout": "Layout",
|
||||
"labels.modeImage": "Image files",
|
||||
"labels.modeLabel": "Label printer",
|
||||
"labels.modeSheet": "Sheet (tile)",
|
||||
"labels.new": "New",
|
||||
"labels.newText": "New text",
|
||||
"labels.noDesignsOption": "No designs yet",
|
||||
"labels.noFilaments": "No filaments.",
|
||||
"labels.noSpools": "No spools.",
|
||||
"labels.onePerLabel": "One {{w}}×{{h}} mm page per label.",
|
||||
"labels.preparing": "Preparing...",
|
||||
"labels.preview": "Preview",
|
||||
"labels.previewWith": "Preview with",
|
||||
"labels.printN_one": "Print {{count}} label",
|
||||
"labels.printN_other": "Print {{count}} labels",
|
||||
"labels.radiusMm": "Radius",
|
||||
"labels.sampleData": "Sample data",
|
||||
"labels.saved": "Saved",
|
||||
"labels.saving": "Saving...",
|
||||
"labels.searchFilaments": "Search filaments...",
|
||||
"labels.searchSpools": "Search spools...",
|
||||
"labels.selectAllShort": "All",
|
||||
"labels.selectAtLeastOne": "Select at least one spool.",
|
||||
"labels.selectAtLeastOneFilament": "Select at least one filament.",
|
||||
"labels.selectElement": "Select an element to edit it, or add one from the palette.",
|
||||
"labels.selectNoneShort": "None",
|
||||
"labels.selectRecentShort": "Recent ({{count}})",
|
||||
"labels.selectRecentHint": "Select spools added in the last 24 hours",
|
||||
"labels.sortNewest": "Newest",
|
||||
"labels.sortId": "#",
|
||||
"labels.sortHint": "Sort spools",
|
||||
"labels.showingFilament": "Showing filament #{{id}}",
|
||||
"labels.showingReal": "Showing real spool data.",
|
||||
"labels.showingSpool": "Showing spool #{{id}}",
|
||||
"labels.showingTags": "Fields show as tags until you pick a spool above.",
|
||||
"labels.sizeMm": "Size",
|
||||
"labels.skipHint": "Skip Items leaves that many cells blank before the first label, letting you reuse a partly used sheet: count the labels already peeled off, left to right from the top.",
|
||||
"labels.stroke": "Stroke",
|
||||
"labels.strokeMm": "Stroke",
|
||||
"labels.tabDesign": "Design",
|
||||
"labels.tabPrint": "Print",
|
||||
"labels.textTemplate": "Text / template",
|
||||
"labels.typeFilament": "Filament",
|
||||
"labels.typeHint": "Filament labels leave out spool-only fields, and their QR code links to the filament instead of a spool.",
|
||||
"labels.typeSpool": "Spool",
|
||||
"labels.unknownFilament": "Unknown filament",
|
||||
"labels.wMm": "W",
|
||||
"labels.widthMm": "Width",
|
||||
"labels.wrapText": "Wrap text",
|
||||
"labels.xMm": "X",
|
||||
"labels.yMm": "Y",
|
||||
"library.apiError": "Couldn't reach the Spoolman API. Is the backend running?",
|
||||
"library.collapseGroup": "Hide these spools",
|
||||
"library.emptyFiltered": "No {{unit}} match the current filters.",
|
||||
"library.emptyTitle": "No spools yet",
|
||||
"library.emptyBody": "Add your first spool to start tracking your filament.",
|
||||
"library.expandGroup": "Show these spools",
|
||||
"library.filterBy": "Filter by",
|
||||
"library.groupBy": "Group",
|
||||
"library.groupNone": "None (flat)",
|
||||
"library.groupSpools_one": "{{count}} spool",
|
||||
"library.groupSpools_other": "{{count}} spools",
|
||||
"library.nUnused": "×{{count}} unused",
|
||||
"library.noLocation": "no location",
|
||||
"library.noValues": "No values",
|
||||
"library.openGroup": "Open {{name}}",
|
||||
"library.openManufacturer": "Open manufacturer {{name}}",
|
||||
"library.section.extra": "Extra fields",
|
||||
"library.section.filament": "Filament",
|
||||
"library.section.spool": "Spool",
|
||||
"library.section.vendor": "Manufacturer",
|
||||
"library.showMore": "show {{count}} more",
|
||||
"library.sort.nozzle": "Nozzle temp",
|
||||
"library.sortBy": "Sort",
|
||||
"library.unassigned": "unassigned",
|
||||
"library.unitGroups": "groups",
|
||||
"library.unitSpools": "spools",
|
||||
"library.unused": "unused",
|
||||
"library.unusedGroup": "{{count}} unused · {{weight}} g each",
|
||||
"library.unusedGroupMixed": "{{count}} unused",
|
||||
"library.unusedSub": "{{weight}} g each · {{location}}",
|
||||
"library.unusedSubMixed": "{{location}}",
|
||||
"library.used": "used",
|
||||
"library.usedAgo": "used {{time}} ago",
|
||||
"loading": "Loading",
|
||||
"nav.labels": "Labels",
|
||||
"nav.library": "Library",
|
||||
"no": "No",
|
||||
"notifications.error": "Error (status code: {{statusCode}})",
|
||||
"notifications.saveSuccessful": "Save successful!",
|
||||
"pagination.empty": "No {{unit}}",
|
||||
"pagination.next": "Next page",
|
||||
"pagination.pageSize": "Page size",
|
||||
"pagination.perPage": "{{size}} / page",
|
||||
"pagination.prev": "Previous page",
|
||||
"pagination.range": "{{from}}–{{to}} of {{total}} {{unit}}",
|
||||
"printing.generic.columns": "Columns",
|
||||
"printing.generic.customSize": "Custom",
|
||||
"printing.generic.description": "Tune in the settings below to get the desired print layout. Keep in mind that printers and your OS may apply it's own margins and scaling, so you may need to perform some trial-and-error before it's all correct. Test it on a piece of regular paper before printing on the actual labels.",
|
||||
"printing.generic.dimensions": "Dimensions",
|
||||
"printing.generic.gridTooWide": "The labels are wider than the page. Reduce the number of columns, the spacing, or the margins.",
|
||||
"printing.generic.helpMargin": "Margins should be configured to match your label paper and printer, changing these will affect the size of the entire grid.",
|
||||
"printing.generic.helpPrinterMargin": "Safe-Zone should be set to how close to the paper edge your printer can print, changing these will not affect the entire grid.",
|
||||
"printing.generic.horizontalSpacing": "Horizontal Spacing",
|
||||
"printing.generic.itemCopies": "Item Copies",
|
||||
"printing.generic.marginBottom": "Bottom Margin",
|
||||
"printing.generic.marginLeft": "Left Margin",
|
||||
"printing.generic.marginRight": "Right Margin",
|
||||
"printing.generic.marginTop": "Top Margin",
|
||||
"printing.generic.paperSize": "Paper Size",
|
||||
"printing.generic.printerMarginBottom": "Safe-Zone Bottom",
|
||||
"printing.generic.printerMarginLeft": "Safe-Zone Left",
|
||||
"printing.generic.printerMarginRight": "Safe-Zone Right",
|
||||
"printing.generic.printerMarginTop": "Safe-Zone Top",
|
||||
"printing.generic.saveAsImage": "Save as Image",
|
||||
"printing.generic.skipItems": "Skip Items",
|
||||
"printing.generic.verticalSpacing": "Vertical Spacing",
|
||||
"printing.qrcode.button": "Print Labels",
|
||||
"printing.qrcode.customUrl.caveat": "A custom URL won't scan back into Spoolman — use it to point a printed QR at an external app or a different host.",
|
||||
"printing.qrcode.customUrl.hint": "Insert the spool id anywhere with the placeholder",
|
||||
"printing.qrcode.customUrl.label": "Custom URL template",
|
||||
"printing.qrcode.useHTTPUrl.label": "QR code link",
|
||||
"printing.qrcode.useHTTPUrl.options.custom": "Custom URL",
|
||||
"printing.qrcode.useHTTPUrl.options.default": "Default",
|
||||
"printing.qrcode.useHTTPUrl.options.url": "URL",
|
||||
"printing.qrcode.useHTTPUrl.preview": "Preview:",
|
||||
"printing.qrcode.useHTTPUrl.tooltip": "Default encodes a Spoolman-only code that only Spoolman's own scanner can read. URL encodes a normal web link that any scanner can open, built from the base URL in settings — or this site's address if that's unset.",
|
||||
"printing.spoolSelect.selectedTotal_one": "{{count}} spool selected",
|
||||
"printing.spoolSelect.selectedTotal_other": "{{count}} spools selected",
|
||||
"scanner.description": "Scan a Spoolman QR code to view details about the spool.",
|
||||
"scanner.error.insecureContext": "The page is not served over HTTPS.",
|
||||
"scanner.error.notAllowed": "You have not allowed access to the camera.",
|
||||
"scanner.error.notFound": "No camera was found.",
|
||||
"scanner.error.streamApiNotSupported": "The browser does not support the MediaStream API.",
|
||||
"scanner.error.unknown": "An unknown error occurred. ({{error}})",
|
||||
"scanner.error.inUse": "The camera is already in use by another application.",
|
||||
"scanner.starting": "Starting camera...",
|
||||
"scanner.title": "QR Code Scanner",
|
||||
"search.colorHint": "Color names must be entered in English.",
|
||||
"search.noResults": "No matches found",
|
||||
"search.searching": "Searching...",
|
||||
"search.section.filaments": "Filaments",
|
||||
"search.section.spools": "Spools",
|
||||
"search.section.vendors": "Manufacturers",
|
||||
"search.threshold": "Color match",
|
||||
"search.unknownFilament": "Unknown filament",
|
||||
"settings.appearance.tab": "Appearance",
|
||||
"settings.appearance.theme.dark": "Dark",
|
||||
"settings.appearance.theme.desc": "Color theme (this browser only)",
|
||||
"settings.appearance.theme.label": "Theme",
|
||||
"settings.appearance.theme.light": "Light",
|
||||
"settings.appearance.theme.system": "System",
|
||||
"settings.extraFields.addChoice": "add choice...",
|
||||
"settings.extraFields.addChoicesFirst": "Add choices first",
|
||||
"settings.extraFields.addEntityField": "Add {{entity}} field",
|
||||
"settings.extraFields.booleanFalse": "No",
|
||||
"settings.extraFields.booleanTrue": "Yes",
|
||||
"settings.extraFields.deleteConfirm": "Delete field {{name}} on {{entity}}?",
|
||||
"settings.extraFields.description.constraints": "Once a field is added, you can not change its key or type, and for choice type fields you can not remove choices or change the multi choice state. If you remove a field, the associated data for all entities will be deleted.",
|
||||
"settings.extraFields.description.intro": "Here you can add extra custom fields to your entities.",
|
||||
"settings.extraFields.description.keyUsage": "The key is what other programs read/write the data as, so if your custom field is supposed to integrate with a third-party program, make sure to set it correctly. Default value is only applied to new items.",
|
||||
"settings.extraFields.description.tableViews": "Extra fields can be shown and sorted in the table views. Choice and boolean fields expose filter options there as well, and all extra field types support filtering for empty values.",
|
||||
"settings.extraFields.editorEdit": "Edit {{entity}} field",
|
||||
"settings.extraFields.editorNew": "New {{entity}} field",
|
||||
"settings.extraFields.errors.choiceNeeded": "Choice fields need at least one choice.",
|
||||
"settings.extraFields.errors.choicesRemoved": "Existing choices cannot be removed: {{choices}}.",
|
||||
"settings.extraFields.errors.deleteFailed": "Failed to delete field.",
|
||||
"settings.extraFields.errors.keyFormat": "Key must contain only lowercase letters, numbers and underscores.",
|
||||
"settings.extraFields.errors.nameRequired": "Name is required.",
|
||||
"settings.extraFields.errors.saveFailed": "Failed to save field.",
|
||||
"settings.extraFields.fieldType.boolean": "Boolean",
|
||||
"settings.extraFields.fieldType.choice": "Choice",
|
||||
"settings.extraFields.fieldType.datetime": "Datetime",
|
||||
"settings.extraFields.fieldType.float": "Float",
|
||||
"settings.extraFields.fieldType.floatRange": "Float Range",
|
||||
"settings.extraFields.fieldType.integer": "Integer",
|
||||
"settings.extraFields.fieldType.integerRange": "Integer Range",
|
||||
"settings.extraFields.fieldType.text": "Text",
|
||||
"settings.extraFields.max": "max",
|
||||
"settings.extraFields.min": "min",
|
||||
"settings.extraFields.multiSuffix": " · multi",
|
||||
"settings.extraFields.multiple": "Multiple",
|
||||
"settings.extraFields.namePlaceholder": "Display name",
|
||||
"settings.extraFields.nonUniqueKeyError": "The key must be unique.",
|
||||
"settings.extraFields.none": "No {{entity}} extra fields defined yet.",
|
||||
"settings.extraFields.params.choices": "Choices",
|
||||
"settings.extraFields.params.defaultValue": "Default Value",
|
||||
"settings.extraFields.params.fieldType": "Type",
|
||||
"settings.extraFields.params.key": "Key",
|
||||
"settings.extraFields.params.name": "Name",
|
||||
"settings.extraFields.params.order": "Order",
|
||||
"settings.extraFields.params.unit": "Unit",
|
||||
"settings.extraFields.saveField": "Save field",
|
||||
"settings.extraFields.tab": "Extra Fields",
|
||||
"settings.general.baseUrl.label": "Base URL",
|
||||
"settings.general.baseUrl.tooltip": "The base URL to use when generating features such as QR codes.",
|
||||
"settings.general.currency.desc": "Three-letter ISO code (e.g. EUR, USD) used for prices",
|
||||
"settings.general.currency.label": "Currency",
|
||||
"settings.general.roundPrices.label": "Round prices",
|
||||
"settings.general.roundPrices.tooltip": "Round prices to the nearest whole number.",
|
||||
"settings.general.tab": "General",
|
||||
"settings.header": "Settings",
|
||||
"settings.language.desc": "Interface language (this browser only)",
|
||||
"settings.language.label": "Language",
|
||||
"settings.library.lowThreshold.desc": "Spools at or below this weight are flagged red (this browser only)",
|
||||
"settings.library.lowThreshold.label": "Low-stock threshold",
|
||||
"settings.library.tab": "Library behavior",
|
||||
"spool.fields.archived": "Archived",
|
||||
"spool.fields.comment": "Comment",
|
||||
"spool.fields.filament": "Filament",
|
||||
"spool.fields.firstUsed": "First Used",
|
||||
"spool.fields.id": "ID",
|
||||
"spool.fields.lastUsed": "Last Used",
|
||||
"spool.fields.location": "Location",
|
||||
"spool.fields.lotNr": "Lot Nr",
|
||||
"spool.fields.material": "Material",
|
||||
"spool.fields.measuredWeight": "Measured Weight",
|
||||
"spool.fields.price": "Price",
|
||||
"spool.fields.registered": "Registered",
|
||||
"spool.fields.remainingWeight": "Remaining Weight",
|
||||
"spool.fields.usedWeight": "Used Weight",
|
||||
"spool.fieldsHelp.location": "Where you physically keep this spool — a shelf, a drawer, a dry box, or the printer it is loaded in. Spools are grouped by location in your library, so it is how you find one again.",
|
||||
"spool.fieldsHelp.lotNr": "Manufacturer's lot number. Can be used to ensure a print has consistent color if multiple spools are used.",
|
||||
"spool.fieldsHelp.measuredWeight": "How much the filament and spool weigh.",
|
||||
"spool.fieldsHelp.price": "Price of a full spool. If not set, the price of the filament will be assumed instead.",
|
||||
"spool.fieldsHelp.remainingWeight": "How much filament is left on the spool. For a new spool this should match the spool weight.",
|
||||
"spool.fieldsHelp.usedWeight": "How much filament has been used from the spool. A new spool should have 0g used.",
|
||||
"spool.form.measurementType.length": "Length",
|
||||
"spool.form.measurementType.weight": "Weight",
|
||||
"spool.spool": "Spools",
|
||||
"topbar.addSpools": "Add spools",
|
||||
"topbar.searchPlaceholder": "Search — try \"red\" or \"pla\"",
|
||||
"unknown": "Unknown",
|
||||
"validation.hexDigits": "Use 6 or 8 hex digits",
|
||||
"validation.maxChars": "At most {{max}} characters",
|
||||
"validation.mustBeGt": "Must be greater than {{value}}",
|
||||
"validation.mustBeMax": "Must be {{value}} or less",
|
||||
"validation.mustBeMin": "Must be {{value}} or more",
|
||||
"validation.mustBeNumber": "Must be a number",
|
||||
"validation.required": "Required",
|
||||
"vendor.fields.comment": "Comment",
|
||||
"vendor.fields.emptySpoolWeight": "Empty Spool Weight",
|
||||
"vendor.fields.externalId": "External ID",
|
||||
"vendor.fields.id": "ID",
|
||||
"vendor.fields.name": "Name",
|
||||
"vendor.fields.registered": "Registered",
|
||||
"vendor.fieldsHelp.emptySpoolWeight": "The weight of an empty spool from this manufacturer.",
|
||||
"yes": "Yes"
|
||||
}
|
||||
@@ -0,0 +1,146 @@
|
||||
{
|
||||
"buttons.archive": "Archivar",
|
||||
"buttons.cancel": "Cancelar",
|
||||
"buttons.clear": "Limpiar",
|
||||
"buttons.delete": "Borrar",
|
||||
"buttons.edit": "Editar",
|
||||
"buttons.filter": "Filtrar",
|
||||
"buttons.save": "Guardar",
|
||||
"buttons.showArchived": "Mostrar Archivados",
|
||||
"buttons.unArchive": "Desarchivar",
|
||||
"documentTitle.locations.list": "Ubicaciones | Spoolman",
|
||||
"filament.fields.articleNumber": "Numero de Articulo",
|
||||
"filament.fields.coaxial": "coextruido",
|
||||
"filament.fields.colorHex": "Color",
|
||||
"filament.fields.comment": "Comentarios",
|
||||
"filament.fields.density": "Densidad",
|
||||
"filament.fields.diameter": "Diámetro",
|
||||
"filament.fields.externalId": "ID Externo",
|
||||
"filament.fields.id": "ID",
|
||||
"filament.fields.longitudinal": "Longitudinal",
|
||||
"filament.fields.material": "Material",
|
||||
"filament.fields.multiColor": "Multiple",
|
||||
"filament.fields.name": "Nombre",
|
||||
"filament.fields.price": "Precio",
|
||||
"filament.fields.registered": "Registrado",
|
||||
"filament.fields.settingsBedTemp": "Temp. de Cama",
|
||||
"filament.fields.settingsExtruderTemp": "Temp. del Extrusor",
|
||||
"filament.fields.singleColor": "Único",
|
||||
"filament.fields.spoolWeight": "Peso de la Bobina",
|
||||
"filament.fields.vendor": "Fabricante",
|
||||
"filament.fields.weight": "Peso",
|
||||
"filament.fieldsHelp.articleNumber": "ej. EAN, UPC, etc.",
|
||||
"filament.fieldsHelp.multiColorDirection": "Los filamentos pueden tener varios colores de dos formas: mediante coextrusión, como los filamentos bicolor con multicolores consistentes, o mediante cambios de color longitudinales, como los filamentos degradados que cambian de color a lo largo de la bobina.",
|
||||
"filament.fieldsHelp.spoolWeight": "El peso de una bobina vacía. Se utiliza para determinar el peso medido de una bobina.",
|
||||
"filament.fieldsHelp.weight": "El peso de una bobina entera (peso neto). Esta cifra no debe incluir el peso de la bobina vacía, solo el filamento. Es, normalmente, el peso escrito en la etiqueta de la bobina.",
|
||||
"filament.filament": "Filamentos",
|
||||
"help.help": "Ayuda",
|
||||
"kofi": "Donar en Ko-fi",
|
||||
"loading": "Cargando",
|
||||
"locations.locations": "Ubicaciones",
|
||||
"locations.newLocation": "Nueva ubicación",
|
||||
"locations.noLocation": "Sin ubicación",
|
||||
"locations.noLocationsHelp": "Esta página te permite organizar tus carretes en ubicaciones, ¡añade algunos carretes para empezar!",
|
||||
"no": "No",
|
||||
"notifications.error": "Error (status code: {{statusCode}})",
|
||||
"notifications.saveSuccessful": "¡Se guardo correctamente!",
|
||||
"printing.generic.columns": "Columnas",
|
||||
"printing.generic.customSize": "Personalizar",
|
||||
"printing.generic.description": "Ajuste los parámetros siguientes para obtener el diseño de impresión deseado. Recuerda que impresoras y el sistema operativo aplican sus propios márgenes y escala. Es probable que tengas que probar con valores varias veces hasta que el diseño te parezca correcto. Prueba en papel normal antes de usar etiquetas.",
|
||||
"printing.generic.dimensions": "Dimensiones",
|
||||
"printing.generic.helpMargin": "Los márgenes deben ser configurados a ser los mismos que tu papel e impresora. Cambiar los mismos afectaran todas las etiquetas.",
|
||||
"printing.generic.helpPrinterMargin": "La Zona de Seguridad debe ajustarse lo más cercano posible al borde que tu impresora es capaz de imprimir. Cambiar estos valores no afectaran todas las etiquetas.",
|
||||
"printing.generic.horizontalSpacing": "Espacio Horizontal",
|
||||
"printing.generic.itemCopies": "Copias del artículo",
|
||||
"printing.generic.marginBottom": "Margen Inferior",
|
||||
"printing.generic.marginLeft": "Margen Izquierdo",
|
||||
"printing.generic.marginRight": "Margen Derecho",
|
||||
"printing.generic.marginTop": "Margen Superior",
|
||||
"printing.generic.paperSize": "Tamaño de Papel",
|
||||
"printing.generic.printerMarginBottom": "Zona Segura Inferior",
|
||||
"printing.generic.printerMarginLeft": "Zona Segura Izquierda",
|
||||
"printing.generic.printerMarginRight": "Zona Segura Derecha",
|
||||
"printing.generic.printerMarginTop": "Zona Segura Superior",
|
||||
"printing.generic.saveAsImage": "Guardar como una imagen",
|
||||
"printing.generic.skipItems": "Saltar Elementos",
|
||||
"printing.generic.verticalSpacing": "Espacio Vertical",
|
||||
"printing.qrcode.button": "Imprimir las etiquetas",
|
||||
"printing.qrcode.useHTTPUrl.label": "Enlace al código QR",
|
||||
"printing.qrcode.useHTTPUrl.options.default": "Por defecto",
|
||||
"printing.qrcode.useHTTPUrl.options.url": "URL",
|
||||
"printing.qrcode.useHTTPUrl.preview": "Vista previa:",
|
||||
"printing.qrcode.useHTTPUrl.tooltip": "Se utilizará un enlace propietario que funcionará solo si se escanea desde la función de escaneo de Spoolman (predeterminado). La URL utiliza la URL base especificada en la configuración o la URL de la página actual si no está configurada.",
|
||||
"printing.spoolSelect.selectedTotal_many": "{{count}} bobinas seleccionadas",
|
||||
"printing.spoolSelect.selectedTotal_one": "{{count}} bobina seleccionada",
|
||||
"printing.spoolSelect.selectedTotal_other": "{{count}} bobinas seleccionadas",
|
||||
"scanner.description": "Escanea un código QR de Spoolman para ver detalles de la bobina.",
|
||||
"scanner.error.insecureContext": "La página no se muestra a través de HTTPS.",
|
||||
"scanner.error.notAllowed": "No has dado permiso de acceso a la cámara.",
|
||||
"scanner.error.notFound": "La cámara no ha sido detectada.",
|
||||
"scanner.error.streamApiNotSupported": "El navegador no es compatible con la API MediaStream.",
|
||||
"scanner.error.unknown": "Un error desconocido ocurrió. ({{error}})",
|
||||
"scanner.title": "Escáner de Código QR",
|
||||
"settings.extraFields.booleanFalse": "No",
|
||||
"settings.extraFields.booleanTrue": "Sí",
|
||||
"settings.extraFields.deleteConfirm": "¿Borrar campo {{name}}?",
|
||||
"settings.extraFields.description.intro": " Aquí puede agregar más campos personalizados a los asuntos.",
|
||||
"settings.extraFields.description.constraints": " Una vez que se agrega un campo, no puede cambiar su clave o tipo, y no puede eliminar opciones ni cambiar el estado de múltiples opciones para campos seleccionados. Si elimina un campo, se eliminarán los datos asociados a todos los sujetos.",
|
||||
"settings.extraFields.description.keyUsage": " La forma en que otros programas leen/escriben los datos es clave, por lo que si su campo personalizado se va a integrar con un programa de terceros, asegúrese de que esté configurado correctamente. El valor predeterminado solo se utilizará para elementos nuevos.",
|
||||
"settings.extraFields.description.tableViews": " Los campos de salida no se pueden ordenar ni filtrar en las vistas de tabla.",
|
||||
"settings.extraFields.fieldType.boolean": "Booleano",
|
||||
"settings.extraFields.fieldType.choice": "Opción",
|
||||
"settings.extraFields.fieldType.datetime": "Fecha y hora",
|
||||
"settings.extraFields.fieldType.float": "Decimal",
|
||||
"settings.extraFields.fieldType.floatRange": "Rango Decimal",
|
||||
"settings.extraFields.fieldType.integer": "Entero",
|
||||
"settings.extraFields.fieldType.integerRange": "Rango de enteros",
|
||||
"settings.extraFields.fieldType.text": "Texto",
|
||||
"settings.extraFields.nonUniqueKeyError": "La clave debe ser única.",
|
||||
"settings.extraFields.params.choices": "Opciones",
|
||||
"settings.extraFields.params.defaultValue": "Valor predeterminado",
|
||||
"settings.extraFields.params.fieldType": "Tipo",
|
||||
"settings.extraFields.params.key": "Clave",
|
||||
"settings.extraFields.params.name": "Nombre",
|
||||
"settings.extraFields.params.order": "Orden",
|
||||
"settings.extraFields.params.unit": "Unidad",
|
||||
"settings.extraFields.tab": "Campos adicionales",
|
||||
"settings.general.baseUrl.label": "URL base",
|
||||
"settings.general.baseUrl.tooltip": "La URL base que se utilizará al generar funciones como códigos QR.",
|
||||
"settings.general.currency.label": "Moneda",
|
||||
"settings.general.roundPrices.label": "Redondear precios",
|
||||
"settings.general.roundPrices.tooltip": "Redondear precios al número entero más cercano.",
|
||||
"settings.general.tab": "General",
|
||||
"settings.header": "Ajustes",
|
||||
"spool.fields.archived": "Archivado",
|
||||
"spool.fields.comment": "Comentarios",
|
||||
"spool.fields.filament": "Filamento",
|
||||
"spool.fields.firstUsed": "Fecha de Primer Uso",
|
||||
"spool.fields.id": "ID",
|
||||
"spool.fields.lastUsed": "Ultimo Uso",
|
||||
"spool.fields.location": "Ubicación",
|
||||
"spool.fields.lotNr": "No. Lote",
|
||||
"spool.fields.material": "Material",
|
||||
"spool.fields.measuredWeight": "Peso Medido",
|
||||
"spool.fields.price": "Precio",
|
||||
"spool.fields.registered": "Registrado",
|
||||
"spool.fields.remainingWeight": "Peso Restante",
|
||||
"spool.fields.usedWeight": "Peso Usado",
|
||||
"spool.fieldsHelp.location": "Dónde se encuentra el carrete si tiene varias ubicaciones donde almacena sus carretes.",
|
||||
"spool.fieldsHelp.lotNr": "Número de lote del fabricante. Puede ser usado si el modelo a imprimir necesita color homogéneo y varias bobinas son necesarias.",
|
||||
"spool.fieldsHelp.measuredWeight": "Cuanto pesa el filamento y la bobina.",
|
||||
"spool.fieldsHelp.price": "Precio de una bobina completa. Si no se establece, se asumirá en su lugar el precio del filamento.",
|
||||
"spool.fieldsHelp.remainingWeight": "Cuanto filamento resta en la bobina. Para una bobina nueva el peso debe ser igual al peso indicado de fábrica.",
|
||||
"spool.fieldsHelp.usedWeight": "Cuanto filamento ha sido usado de la bobina. Una bobina nueva debería tener 0g usados.",
|
||||
"spool.form.measurementType.length": "Longitud",
|
||||
"spool.form.measurementType.weight": "Peso",
|
||||
"spool.spool": "Bobinas",
|
||||
"unknown": "Desconocido",
|
||||
"vendor.fields.comment": "Comentarios",
|
||||
"vendor.fields.emptySpoolWeight": "Peso de bobina vacía",
|
||||
"vendor.fields.externalId": "ID Externa",
|
||||
"vendor.fields.id": "ID",
|
||||
"vendor.fields.name": "Nombre",
|
||||
"vendor.fields.registered": "Registrado",
|
||||
"vendor.fieldsHelp.emptySpoolWeight": "El peso de una bobina vacía de este fabricante.",
|
||||
"yes": "Si"
|
||||
}
|
||||
@@ -0,0 +1,142 @@
|
||||
{
|
||||
"buttons.archive": "Arhiveeri",
|
||||
"buttons.cancel": "Tühista",
|
||||
"buttons.clear": "Tühjenda",
|
||||
"buttons.delete": "Kustuta",
|
||||
"buttons.edit": "Muuda",
|
||||
"buttons.filter": "Filtreeri",
|
||||
"buttons.save": "Salvesta",
|
||||
"buttons.showArchived": "Näita arhiveeritud",
|
||||
"buttons.unArchive": "Võta arhiivist tagasi",
|
||||
"documentTitle.locations.list": "",
|
||||
"filament.fields.articleNumber": "",
|
||||
"filament.fields.coaxial": "",
|
||||
"filament.fields.colorHex": "",
|
||||
"filament.fields.comment": "",
|
||||
"filament.fields.density": "",
|
||||
"filament.fields.diameter": "",
|
||||
"filament.fields.externalId": "",
|
||||
"filament.fields.id": "",
|
||||
"filament.fields.longitudinal": "",
|
||||
"filament.fields.material": "",
|
||||
"filament.fields.multiColor": "",
|
||||
"filament.fields.name": "",
|
||||
"filament.fields.price": "",
|
||||
"filament.fields.registered": "",
|
||||
"filament.fields.settingsBedTemp": "",
|
||||
"filament.fields.settingsExtruderTemp": "",
|
||||
"filament.fields.singleColor": "",
|
||||
"filament.fields.spoolWeight": "",
|
||||
"filament.fields.vendor": "",
|
||||
"filament.fields.weight": "",
|
||||
"filament.fieldsHelp.articleNumber": "",
|
||||
"filament.fieldsHelp.multiColorDirection": "",
|
||||
"filament.fieldsHelp.spoolWeight": "",
|
||||
"filament.fieldsHelp.weight": "",
|
||||
"filament.filament": "",
|
||||
"help.help": "",
|
||||
"kofi": "Anna mulle tippi Ko-fi's",
|
||||
"loading": "Laadimine",
|
||||
"locations.locations": "",
|
||||
"locations.newLocation": "",
|
||||
"locations.noLocation": "",
|
||||
"locations.noLocationsHelp": "",
|
||||
"no": "Ei",
|
||||
"notifications.error": "Viga (kood: {{statusCode}})",
|
||||
"notifications.saveSuccessful": "Salvesta edukalt!",
|
||||
"printing.generic.columns": "",
|
||||
"printing.generic.customSize": "",
|
||||
"printing.generic.description": "",
|
||||
"printing.generic.dimensions": "",
|
||||
"printing.generic.helpMargin": "",
|
||||
"printing.generic.helpPrinterMargin": "",
|
||||
"printing.generic.horizontalSpacing": "",
|
||||
"printing.generic.itemCopies": "",
|
||||
"printing.generic.marginBottom": "",
|
||||
"printing.generic.marginLeft": "",
|
||||
"printing.generic.marginRight": "",
|
||||
"printing.generic.marginTop": "",
|
||||
"printing.generic.paperSize": "",
|
||||
"printing.generic.printerMarginBottom": "",
|
||||
"printing.generic.printerMarginLeft": "",
|
||||
"printing.generic.printerMarginRight": "",
|
||||
"printing.generic.printerMarginTop": "",
|
||||
"printing.generic.saveAsImage": "",
|
||||
"printing.generic.skipItems": "",
|
||||
"printing.generic.verticalSpacing": "",
|
||||
"printing.qrcode.button": "",
|
||||
"printing.qrcode.useHTTPUrl.label": "",
|
||||
"printing.qrcode.useHTTPUrl.options.default": "",
|
||||
"printing.qrcode.useHTTPUrl.options.url": "",
|
||||
"printing.qrcode.useHTTPUrl.preview": "",
|
||||
"printing.qrcode.useHTTPUrl.tooltip": "",
|
||||
"printing.spoolSelect.selectedTotal_one": "",
|
||||
"printing.spoolSelect.selectedTotal_other": "",
|
||||
"scanner.description": "",
|
||||
"scanner.error.insecureContext": "",
|
||||
"scanner.error.notAllowed": "",
|
||||
"scanner.error.notFound": "",
|
||||
"scanner.error.streamApiNotSupported": "",
|
||||
"scanner.error.unknown": "",
|
||||
"scanner.title": "",
|
||||
"settings.extraFields.booleanFalse": "",
|
||||
"settings.extraFields.booleanTrue": "",
|
||||
"settings.extraFields.deleteConfirm": "",
|
||||
"settings.extraFields.description": "",
|
||||
"settings.extraFields.fieldType.boolean": "",
|
||||
"settings.extraFields.fieldType.choice": "",
|
||||
"settings.extraFields.fieldType.datetime": "",
|
||||
"settings.extraFields.fieldType.float": "",
|
||||
"settings.extraFields.fieldType.floatRange": "",
|
||||
"settings.extraFields.fieldType.integer": "",
|
||||
"settings.extraFields.fieldType.integerRange": "",
|
||||
"settings.extraFields.fieldType.text": "",
|
||||
"settings.extraFields.nonUniqueKeyError": "",
|
||||
"settings.extraFields.params.choices": "",
|
||||
"settings.extraFields.params.defaultValue": "",
|
||||
"settings.extraFields.params.fieldType": "",
|
||||
"settings.extraFields.params.key": "",
|
||||
"settings.extraFields.params.name": "",
|
||||
"settings.extraFields.params.order": "",
|
||||
"settings.extraFields.params.unit": "",
|
||||
"settings.extraFields.tab": "",
|
||||
"settings.general.baseUrl.label": "",
|
||||
"settings.general.baseUrl.tooltip": "",
|
||||
"settings.general.currency.label": "",
|
||||
"settings.general.roundPrices.label": "",
|
||||
"settings.general.roundPrices.tooltip": "",
|
||||
"settings.general.tab": "",
|
||||
"settings.header": "",
|
||||
"spool.fields.archived": "",
|
||||
"spool.fields.comment": "",
|
||||
"spool.fields.filament": "",
|
||||
"spool.fields.firstUsed": "",
|
||||
"spool.fields.id": "",
|
||||
"spool.fields.lastUsed": "",
|
||||
"spool.fields.location": "",
|
||||
"spool.fields.lotNr": "",
|
||||
"spool.fields.material": "",
|
||||
"spool.fields.measuredWeight": "",
|
||||
"spool.fields.price": "",
|
||||
"spool.fields.registered": "",
|
||||
"spool.fields.remainingWeight": "",
|
||||
"spool.fields.usedWeight": "",
|
||||
"spool.fieldsHelp.location": "",
|
||||
"spool.fieldsHelp.lotNr": "",
|
||||
"spool.fieldsHelp.measuredWeight": "",
|
||||
"spool.fieldsHelp.price": "",
|
||||
"spool.fieldsHelp.remainingWeight": "",
|
||||
"spool.fieldsHelp.usedWeight": "",
|
||||
"spool.form.measurementType.length": "",
|
||||
"spool.form.measurementType.weight": "",
|
||||
"spool.spool": "",
|
||||
"unknown": "Tundmatu",
|
||||
"vendor.fields.comment": "",
|
||||
"vendor.fields.emptySpoolWeight": "",
|
||||
"vendor.fields.externalId": "",
|
||||
"vendor.fields.id": "",
|
||||
"vendor.fields.name": "",
|
||||
"vendor.fields.registered": "",
|
||||
"vendor.fieldsHelp.emptySpoolWeight": "",
|
||||
"yes": "Jah"
|
||||
}
|
||||
@@ -0,0 +1,138 @@
|
||||
{
|
||||
"buttons.archive": "آرشیو کردن",
|
||||
"buttons.cancel": "انصراف",
|
||||
"buttons.clear": "پاک کردن",
|
||||
"buttons.delete": "حذف",
|
||||
"buttons.edit": "ویرایش",
|
||||
"buttons.filter": "فیلتر",
|
||||
"buttons.save": "ذخیره",
|
||||
"buttons.showArchived": "نمایش آرشیو",
|
||||
"buttons.unArchive": "درآوردن از آرشیو",
|
||||
"filament.fields.articleNumber": "شماره انحصاری تولید",
|
||||
"filament.fields.coaxial": "کوپلیمری",
|
||||
"filament.fields.colorHex": "رنگ",
|
||||
"filament.fields.comment": "توضیحات",
|
||||
"filament.fields.density": "چگالی (Density)",
|
||||
"filament.fields.diameter": "ضخامت",
|
||||
"filament.fields.externalId": "آیدی خارجی",
|
||||
"filament.fields.id": "شماره",
|
||||
"filament.fields.longitudinal": "طولی",
|
||||
"filament.fields.material": "متریال",
|
||||
"filament.fields.multiColor": "تغییر رنگ",
|
||||
"filament.fields.name": "عنوان",
|
||||
"filament.fields.price": "قیمت",
|
||||
"filament.fields.registered": "ثبت شده",
|
||||
"filament.fields.settingsBedTemp": "دمای هیت بد",
|
||||
"filament.fields.settingsExtruderTemp": "دمای اکسترودر",
|
||||
"filament.fields.singleColor": "تک رنگ",
|
||||
"filament.fields.spoolWeight": "وزن قرقره فیلامنت",
|
||||
"filament.fields.vendor": "تولید کننده",
|
||||
"filament.fields.weight": "وزن",
|
||||
"filament.fieldsHelp.articleNumber": "برای مثال EAN/UPC یا ...",
|
||||
"filament.fieldsHelp.multiColorDirection": "فیلامنتها میتوانند به دو روش دارای چندین رنگ باشند: یا از طریق کوپلیمری، مانند فیلامنتهای دو رنگ با رنگهای چندگانه ثابت، یا از طریق تغییر رنگ طولی، مانند فیلامنتهای گرادیانت که رنگها را در طول قرقره تغییر میدهند.",
|
||||
"filament.fieldsHelp.spoolWeight": "وزن یک قرقره خالی. برای تعیین وزن اندازهگیریشده یک قرقره استفاده میشود.",
|
||||
"filament.fieldsHelp.weight": "وزن فیلامنت یک قرقره کامل (وزن خالص). این باید شامل وزن خود قرقره نباشد و فقط فیلامنت را شامل شود. معمولاً روی بستهبندی نوشته شده است.",
|
||||
"filament.filament": "فیلامنت ها",
|
||||
"help.help": "راهنما",
|
||||
"kofi": "حمایت از سازنده این برنامه",
|
||||
"loading": "در حال بارگذاری",
|
||||
"no": "خیر",
|
||||
"notifications.error": "خطای {{statusCode}} رخ داد",
|
||||
"notifications.saveSuccessful": "با موفقیت ثبت شد!",
|
||||
"printing.generic.columns": "ستون",
|
||||
"printing.generic.customSize": "کاستوم",
|
||||
"printing.generic.description": "تنظیمات زیر را جوری تنظیم کنید که چیدمان پرینت لیبل مد نظرتان بدست بیاید. توجه کنید پرینتر و سیستم عامل شما ممکن است تنظیمات خودشان را لحاظ کنند، لذا ممکن است کمی آزمون و خطا نیاز باشد تا نتیجه مطلوب بدست بیاید. قبل اینکه لیبل نهایی را پرینت کنید ابتدا روی یک تکه کاغذ معمولی پرینت بگیرید و تست کنید.",
|
||||
"printing.generic.dimensions": "ابعاد",
|
||||
"printing.generic.helpMargin": "حاشیهها باید با کاغذ برچسب و چاپگر شما هماهنگ شوند، تغییر دادن این تنظیمات بر اندازه کل شبکه تأثیر میگذارد.",
|
||||
"printing.generic.helpPrinterMargin": "ناحیه امن باید بر اساس نزدیکترین فاصلهای که چاپگر شما میتواند تا لبه کاغذ چاپ کند تنظیم شود. تغییر این تنظیمات بر کل شبکه تأثیری نخواهد داشت.",
|
||||
"printing.generic.horizontalSpacing": "فاصله افقی",
|
||||
"printing.generic.itemCopies": "تعداد کپی هر آیتم",
|
||||
"printing.generic.marginBottom": "فاصله از پایین",
|
||||
"printing.generic.marginLeft": "فاصله از چپ",
|
||||
"printing.generic.marginRight": "فاصله از راست",
|
||||
"printing.generic.marginTop": "فاصله از بالا",
|
||||
"printing.generic.paperSize": "اندازه کاغذ",
|
||||
"printing.generic.printerMarginBottom": "منطقه ایمن از پایین",
|
||||
"printing.generic.printerMarginLeft": "منطقه ایمن از چپ",
|
||||
"printing.generic.printerMarginRight": "منطقه ایمن از راست",
|
||||
"printing.generic.printerMarginTop": "منطقه ایمن از بالا",
|
||||
"printing.generic.saveAsImage": "ذخیره به عنوان عکس",
|
||||
"printing.generic.skipItems": "نادیده گرفتن یک آیتم",
|
||||
"printing.generic.verticalSpacing": "فاصله عمودی",
|
||||
"printing.qrcode.button": "پرینت لیبل",
|
||||
"printing.qrcode.useHTTPUrl.label": "لینک بارکد QR",
|
||||
"printing.qrcode.useHTTPUrl.options.default": "پیشفرض",
|
||||
"printing.qrcode.useHTTPUrl.options.url": "لینک",
|
||||
"printing.qrcode.useHTTPUrl.preview": "پیش نمایش:",
|
||||
"printing.qrcode.useHTTPUrl.tooltip": "از لینک اختصاصی استفاده خواهد شد که فقط در صورتی کار میکند که از ویژگی اسکن Spoolman اسکن شود (پیشفرض). آدرس URL یا از آدرس پایهای که در تنظیمات مشخص شده استفاده میکند، یا در صورت عدم تنظیم، از آدرس صفحه فعلی.",
|
||||
"printing.spoolSelect.selectedTotal_one": "{{count}} رول فیلامنت انتخاب شد",
|
||||
"printing.spoolSelect.selectedTotal_other": "تعدا د {{count}} رول فیلامنت انتخاب شد",
|
||||
"scanner.description": "یک بارکد QR از Spoolman را اسکن کنید تا جزئیات مربوط به spool را مشاهده کنید.",
|
||||
"scanner.error.insecureContext": "این صفحه از طریق HTTPS ارائه نمیشود.",
|
||||
"scanner.error.notAllowed": "شما اجازه دسترسی به دوربین را ندادهاید.",
|
||||
"scanner.error.notFound": "دوربینی پیدا نشد.",
|
||||
"scanner.error.streamApiNotSupported": "مرورگر از API رسانهای (MediaStream API) پشتیبانی نمیکند.",
|
||||
"scanner.error.unknown": "خطای نامشخص {{error}} رخ داد",
|
||||
"scanner.title": "اسکنر بارکد QR",
|
||||
"settings.extraFields.booleanFalse": "خیر",
|
||||
"settings.extraFields.booleanTrue": "بله",
|
||||
"settings.extraFields.deleteConfirm": "آیا میخواهید {{name}} را حذف کنید؟",
|
||||
"settings.extraFields.description.intro": "در اینجا میتوانید فیلدهای سفارشی اضافی را به موجودیهای خود اضافه کنید.",
|
||||
"settings.extraFields.description.constraints": "پس از افزودن یک فیلد، نمیتوانید کلید یا نوع آن را تغییر دهید و برای فیلدهای نوع انتخاب، نمیتوانید گزینهها را حذف یا وضعیت چندانتخابی را تغییر دهید. اگر یک فیلد را حذف کنید، دادههای مرتبط با تمام موجودیها حذف خواهد شد.",
|
||||
"settings.extraFields.description.keyUsage": "کلید، اطلاعاتی است که برنامههای دیگر آن را میخوانند یا مینویسند، بنابراین اگر فیلد سفارشی شما قرار است با یک برنامه شخص ثالث ادغام شود، اطمینان حاصل کنید که به درستی تنظیم شده باشد. مقدار پیشفرض فقط بر روی اقلام جدید اعمال میشود.",
|
||||
"settings.extraFields.description.tableViews": "فیلدهای اضافی نمیتوانند در نماهای جدول مرتب یا فیلتر شوند.",
|
||||
"settings.extraFields.fieldType.boolean": "Boolean",
|
||||
"settings.extraFields.fieldType.choice": "انتخاب",
|
||||
"settings.extraFields.fieldType.datetime": "زمان و تاریخ",
|
||||
"settings.extraFields.fieldType.float": "عدد اعشاری",
|
||||
"settings.extraFields.fieldType.floatRange": "رنج عددی اعشاری",
|
||||
"settings.extraFields.fieldType.integer": "عدد بدون اعشار",
|
||||
"settings.extraFields.fieldType.integerRange": "رنج عددی بدون اعشار",
|
||||
"settings.extraFields.fieldType.text": "متن",
|
||||
"settings.extraFields.nonUniqueKeyError": "شاخصه کلیدی باید منحصر به فرد باشد.",
|
||||
"settings.extraFields.params.choices": "آپشن های قابل استفاده",
|
||||
"settings.extraFields.params.defaultValue": "مقدار پیشفرض",
|
||||
"settings.extraFields.params.fieldType": "نوع",
|
||||
"settings.extraFields.params.key": "شاخصه کلیدی",
|
||||
"settings.extraFields.params.name": "عنوان",
|
||||
"settings.extraFields.params.order": "ترتیب",
|
||||
"settings.extraFields.params.unit": "واحد",
|
||||
"settings.extraFields.tab": "فیلد های اضافه",
|
||||
"settings.general.baseUrl.label": "لینک Spoolman",
|
||||
"settings.general.baseUrl.tooltip": "آدرس پایگاه داده Spoolman که باید هنگام ایجاد ویژگیهایی مانند کدهای QR استفاده شود.",
|
||||
"settings.general.currency.label": "ارز مورد استفاده",
|
||||
"settings.general.tab": "تنظیمات کلی",
|
||||
"settings.header": "تنظیمات",
|
||||
"spool.fields.archived": "آرشیو شده",
|
||||
"spool.fields.comment": "توضیحات",
|
||||
"spool.fields.filament": "فیلامنت",
|
||||
"spool.fields.firstUsed": "زمان اولین استفاده",
|
||||
"spool.fields.id": "شماره",
|
||||
"spool.fields.lastUsed": "زمان آخرین استفاده",
|
||||
"spool.fields.location": "محل نگهداری",
|
||||
"spool.fields.lotNr": "شماره تولید",
|
||||
"spool.fields.material": "متریال",
|
||||
"spool.fields.measuredWeight": "مقدار اندازه گیری شده",
|
||||
"spool.fields.price": "قیمت",
|
||||
"spool.fields.registered": "ثبت شده",
|
||||
"spool.fields.remainingWeight": "مقدار باقی مانده",
|
||||
"spool.fields.usedWeight": "مقدار استفاده شده",
|
||||
"spool.fieldsHelp.location": "مکانی که قرقره در آن قرار دارد اگر چندین مکان برای ذخیره قرقرهها دارید.",
|
||||
"spool.fieldsHelp.lotNr": "شماره بچ تولیدکننده. میتواند برای اطمینان از اینکه چاپ رنگ ثابتی دارد در صورتی که از چندین قرقره استفاده شود، استفاده شود.",
|
||||
"spool.fieldsHelp.measuredWeight": "وزن فیلامنت و قرقره چقدر است.",
|
||||
"spool.fieldsHelp.price": "قیمت یک قرقره کامل. در صورت عدم تنظیم، قیمت فیلامنت در نظر گرفته میشود.",
|
||||
"spool.fieldsHelp.remainingWeight": "چقدر فیلامنت در قرقره باقی مانده است. برای یک قرقره جدید، این باید با وزن قرقره مطابقت داشته باشد.",
|
||||
"spool.fieldsHelp.usedWeight": "چقدر فیلامنت از قرقره استفاده شده است. یک قرقره جدید باید 0 گرم استفاده شده داشته باشد.",
|
||||
"spool.form.measurementType.length": "طول",
|
||||
"spool.form.measurementType.weight": "وزن",
|
||||
"spool.spool": "رول های فیلامنت",
|
||||
"unknown": "نامشخص",
|
||||
"vendor.fields.comment": "توضیحات",
|
||||
"vendor.fields.emptySpoolWeight": "وزن قرقره فیلامنت خالی",
|
||||
"vendor.fields.externalId": "شماره خارجی",
|
||||
"vendor.fields.id": "شماره",
|
||||
"vendor.fields.name": "اسم",
|
||||
"vendor.fields.registered": "ثبت شده",
|
||||
"vendor.fieldsHelp.emptySpoolWeight": "وزن یک قرقره خالی فیلامنت ارائه شده از تولید کننده.",
|
||||
"yes": "بله"
|
||||
}
|
||||
@@ -0,0 +1,144 @@
|
||||
{
|
||||
"buttons.archive": "Archiver",
|
||||
"buttons.cancel": "Abandonner",
|
||||
"buttons.clear": "Effacer",
|
||||
"buttons.delete": "Supprimer",
|
||||
"buttons.edit": "Editer",
|
||||
"buttons.filter": "Filtre",
|
||||
"buttons.save": "Enregistrer",
|
||||
"buttons.showArchived": "Afficher les archives",
|
||||
"buttons.unArchive": "Désarchiver",
|
||||
"documentTitle.locations.list": "Emplacements | Spoolman",
|
||||
"filament.fields.articleNumber": "Numéro d'article",
|
||||
"filament.fields.coaxial": "Coextrudée",
|
||||
"filament.fields.colorHex": "Couleur",
|
||||
"filament.fields.comment": "Commentaire",
|
||||
"filament.fields.density": "Densité",
|
||||
"filament.fields.diameter": "Diamètre",
|
||||
"filament.fields.externalId": "ID externe",
|
||||
"filament.fields.id": "ID",
|
||||
"filament.fields.longitudinal": "Longitudinale",
|
||||
"filament.fields.material": "Matériau",
|
||||
"filament.fields.multiColor": "Multi",
|
||||
"filament.fields.name": "Nom",
|
||||
"filament.fields.price": "Prix",
|
||||
"filament.fields.registered": "Enregistré",
|
||||
"filament.fields.settingsBedTemp": "Température du lit",
|
||||
"filament.fields.settingsExtruderTemp": "Température de l'extrudeuse",
|
||||
"filament.fields.singleColor": "Unique",
|
||||
"filament.fields.spoolWeight": "Poids de la bobine",
|
||||
"filament.fields.vendor": "Fabricant",
|
||||
"filament.fields.weight": "Poids",
|
||||
"filament.fieldsHelp.articleNumber": "Exemple EAN, UPC, etc.",
|
||||
"filament.fieldsHelp.multiColorDirection": "Les filaments peuvent avoir plusieurs couleurs de deux manières : soit par coextrusion, comme les filaments bicolores avec plusieurs couleurs uniformes, soit par des changements de couleur longitudinaux, comme les filaments dégradés qui changent de couleurs le long de la bobine.",
|
||||
"filament.fieldsHelp.spoolWeight": "Le poids d'une bobine vide. Utilisé pour déterminer le poids d'une bobine.",
|
||||
"filament.fieldsHelp.weight": "Le poids du filament d'une bobine complète (poids net). Ce poids ne doit pas inclure le poids de la bobine elle-même, mais uniquement celui du filament. C'est ce qui est généralement indiqué sur l'emballage.",
|
||||
"filament.filament": "Filaments",
|
||||
"help.help": "Aide",
|
||||
"kofi": "Me donner un pourboire sur Ko-fi",
|
||||
"loading": "Chargement",
|
||||
"locations.locations": "Emplacements",
|
||||
"locations.newLocation": "Créer un emplacement",
|
||||
"locations.noLocation": "Pas de localisation",
|
||||
"locations.noLocationsHelp": "Cette page vous permet d'organiser vos bobines par lieu, ajoutez une bobine pour commencer !",
|
||||
"no": "Non",
|
||||
"notifications.error": "Erreur (status code : {{statusCode}})",
|
||||
"notifications.saveSuccessful": "Sauvegarde réussie !",
|
||||
"printing.generic.columns": "Colonnes",
|
||||
"printing.generic.customSize": "Personnaliser",
|
||||
"printing.generic.description": "Ajustez les paramètres ci-dessous pour obtenir la mise en page d'impression souhaitée. Gardez à l'esprit que les imprimantes et votre système d'exploitation peuvent appliquer leurs propres marges et mises à l'échelle, il se peut donc que vous deviez faire quelques essais avant que tout soit correct. Testez-le sur une feuille de papier ordinaire avant d'imprimer les étiquettes en elles mêmes.",
|
||||
"printing.generic.dimensions": "Dimensions",
|
||||
"printing.generic.helpMargin": "Les marges doivent être configurées en fonction de votre papier à étiquettes et de votre imprimante, leur modification aura une incidence sur la taille de l'ensemble de la grille.",
|
||||
"printing.generic.helpPrinterMargin": "La zone de sécurité doit être définie en fonction de la proximité du bord du papier que votre imprimante peut imprimer, la modification de ces paramètres n'affectera pas l'ensemble de la grille.",
|
||||
"printing.generic.horizontalSpacing": "Espacement horizontal",
|
||||
"printing.generic.itemCopies": "Nombre d'articles",
|
||||
"printing.generic.marginBottom": "Marge inférieure",
|
||||
"printing.generic.marginLeft": "Marge gauche",
|
||||
"printing.generic.marginRight": "Marge droite",
|
||||
"printing.generic.marginTop": "Marge supérieure",
|
||||
"printing.generic.paperSize": "Format du papier",
|
||||
"printing.generic.printerMarginBottom": "Zone de sécurité en bas",
|
||||
"printing.generic.printerMarginLeft": "Zone de sécurité à gauche",
|
||||
"printing.generic.printerMarginRight": "Zone de sécurité à droite",
|
||||
"printing.generic.printerMarginTop": "Zone de sécurité en haut",
|
||||
"printing.generic.saveAsImage": "Enregistrer comme image",
|
||||
"printing.generic.skipItems": "Articles ignorés",
|
||||
"printing.generic.verticalSpacing": "Espacement vertical",
|
||||
"printing.qrcode.button": "Imprimer des étiquettes",
|
||||
"printing.qrcode.useHTTPUrl.label": "Lien du QR code",
|
||||
"printing.qrcode.useHTTPUrl.options.default": "Défaut",
|
||||
"printing.qrcode.useHTTPUrl.options.url": "URL",
|
||||
"printing.qrcode.useHTTPUrl.preview": "Prévisualisation :",
|
||||
"printing.qrcode.useHTTPUrl.tooltip": "Utilise un lien privé qui ne marchera que si il est scanné depuis Spoolman (défaut). URL utilises soit l'URL spécifiée dans les options soit l'URL de la page actuelle si ce n'est pas défini.",
|
||||
"printing.spoolSelect.selectedTotal_many": "{{count}} bobines sélectionnées",
|
||||
"printing.spoolSelect.selectedTotal_one": "{{count}} bobine sélectionnée",
|
||||
"printing.spoolSelect.selectedTotal_other": "{{count}} bobines sélectionnées",
|
||||
"scanner.description": "Scannez un code QR de Spoolman pour afficher les détails de la bobine.",
|
||||
"scanner.error.insecureContext": "La page n'est pas servie par HTTPS.",
|
||||
"scanner.error.notAllowed": "Vous n'avez pas autorisé l'accès à l'appareil photo.",
|
||||
"scanner.error.notFound": "Aucun appareil photo n'a été trouvé.",
|
||||
"scanner.error.streamApiNotSupported": "Le navigateur ne prend pas en charge l'API MediaStream.",
|
||||
"scanner.error.unknown": "Une erreur inconnue s'est produite. ({{error}})",
|
||||
"scanner.title": "Scanner de code QR",
|
||||
"settings.extraFields.booleanFalse": "Non",
|
||||
"settings.extraFields.booleanTrue": "Oui",
|
||||
"settings.extraFields.deleteConfirm": "Supprimer le champ {{name}} ?",
|
||||
"settings.extraFields.description.intro": "Ici vous pouvez ajouter des champs personnalisés supplémentaires à vos entités.",
|
||||
"settings.extraFields.description.constraints": "Une fois qu'un champ est ajouté, vous ne pouvez plus changer sa clé ou son type, et pour les champs de types \"Choix\", vous ne pouvez plus retirer un choix ou changer l'état des choix multiples. Si vous supprimez un champ, les données associées aux entités seront supprimées.",
|
||||
"settings.extraFields.description.keyUsage": "La clé correspond à ce que les autres programmes lisent/écrivent, donc si votre champs doit s'intégrer avec un programme tiers, assurez-vous de le configurer correctement. La valeur par défaut n'est appliquées qu'aux nouveaux éléments.",
|
||||
"settings.extraFields.description.tableViews": "Les champs supplementaires ne peuvent pas être triés ou filtrés dans les vues de table.",
|
||||
"settings.extraFields.fieldType.boolean": "Booléen",
|
||||
"settings.extraFields.fieldType.choice": "Choix",
|
||||
"settings.extraFields.fieldType.datetime": "Date et heure",
|
||||
"settings.extraFields.fieldType.float": "Décimal",
|
||||
"settings.extraFields.fieldType.floatRange": "Plage décimal",
|
||||
"settings.extraFields.fieldType.integer": "Entier",
|
||||
"settings.extraFields.fieldType.integerRange": "Plage d'entier",
|
||||
"settings.extraFields.fieldType.text": "Texte",
|
||||
"settings.extraFields.nonUniqueKeyError": "La clé doit être unique.",
|
||||
"settings.extraFields.params.choices": "Choix",
|
||||
"settings.extraFields.params.defaultValue": "Valeur par défaut",
|
||||
"settings.extraFields.params.fieldType": "Type",
|
||||
"settings.extraFields.params.key": "Clé",
|
||||
"settings.extraFields.params.name": "Nom",
|
||||
"settings.extraFields.params.order": "Ordre",
|
||||
"settings.extraFields.params.unit": "Unité",
|
||||
"settings.extraFields.tab": "Champs additionnel",
|
||||
"settings.general.baseUrl.label": "Base de l'URL",
|
||||
"settings.general.baseUrl.tooltip": "La base de l'URL à utiliser lors de la génération de QR codes.",
|
||||
"settings.general.currency.label": "Devise",
|
||||
"settings.general.tab": "Général",
|
||||
"settings.header": "Paramètres",
|
||||
"spool.fields.archived": "Archivé",
|
||||
"spool.fields.comment": "Commentaire",
|
||||
"spool.fields.filament": "Filament",
|
||||
"spool.fields.firstUsed": "Première utilisation",
|
||||
"spool.fields.id": "ID",
|
||||
"spool.fields.lastUsed": "Dernière utilisation",
|
||||
"spool.fields.location": "Localisation",
|
||||
"spool.fields.lotNr": "N° de Lot",
|
||||
"spool.fields.material": "Matériau",
|
||||
"spool.fields.measuredWeight": "Poids mesuré",
|
||||
"spool.fields.price": "Prix",
|
||||
"spool.fields.registered": "Enregistré",
|
||||
"spool.fields.remainingWeight": "Poids restant",
|
||||
"spool.fields.usedWeight": "Poids utilisé",
|
||||
"spool.fieldsHelp.location": "L'emplacement de la bobine si vous stockez vos bobines à plusieurs endroits.",
|
||||
"spool.fieldsHelp.lotNr": "Numéro de lot du fabricant. Peut être utilisé pour s'assurer que la couleur d'une impression est homogène si plusieurs bobines sont utilisées.",
|
||||
"spool.fieldsHelp.measuredWeight": "Le poids du filament et de la bobine.",
|
||||
"spool.fieldsHelp.price": "Prix d'une bobine complète. S'il n'est pas défini, le prix du filament sera pris en compte.",
|
||||
"spool.fieldsHelp.remainingWeight": "La quantité de filament restant sur la bobine. Pour une nouvelle bobine, cela devrait correspondre au poids de la bobine.",
|
||||
"spool.fieldsHelp.usedWeight": "Combien de filament a été utilisé à partir de la bobine. Une bobine neuve devrait avoir 0g utilisé.",
|
||||
"spool.form.measurementType.length": "Longueur",
|
||||
"spool.form.measurementType.weight": "Poids",
|
||||
"spool.spool": "Bobines",
|
||||
"unknown": "Inconnu",
|
||||
"vendor.fields.comment": "Commentaire",
|
||||
"vendor.fields.emptySpoolWeight": "Poids de la bobine vide",
|
||||
"vendor.fields.externalId": "ID externe",
|
||||
"vendor.fields.id": "ID",
|
||||
"vendor.fields.name": "Nom",
|
||||
"vendor.fields.registered": "Enregistré",
|
||||
"vendor.fieldsHelp.emptySpoolWeight": "Le poids d'une bobine vide de ce fabricant.",
|
||||
"yes": "Oui"
|
||||
}
|
||||
@@ -0,0 +1,142 @@
|
||||
{
|
||||
"buttons.archive": "",
|
||||
"buttons.cancel": "",
|
||||
"buttons.clear": "",
|
||||
"buttons.delete": "",
|
||||
"buttons.edit": "Sampadan Karen",
|
||||
"buttons.filter": "",
|
||||
"buttons.save": "Sahejen",
|
||||
"buttons.showArchived": "",
|
||||
"buttons.unArchive": "",
|
||||
"documentTitle.locations.list": "",
|
||||
"filament.fields.articleNumber": "",
|
||||
"filament.fields.coaxial": "",
|
||||
"filament.fields.colorHex": "",
|
||||
"filament.fields.comment": "",
|
||||
"filament.fields.density": "",
|
||||
"filament.fields.diameter": "",
|
||||
"filament.fields.externalId": "",
|
||||
"filament.fields.id": "",
|
||||
"filament.fields.longitudinal": "",
|
||||
"filament.fields.material": "",
|
||||
"filament.fields.multiColor": "",
|
||||
"filament.fields.name": "",
|
||||
"filament.fields.price": "",
|
||||
"filament.fields.registered": "",
|
||||
"filament.fields.settingsBedTemp": "",
|
||||
"filament.fields.settingsExtruderTemp": "",
|
||||
"filament.fields.singleColor": "",
|
||||
"filament.fields.spoolWeight": "",
|
||||
"filament.fields.vendor": "",
|
||||
"filament.fields.weight": "",
|
||||
"filament.fieldsHelp.articleNumber": "",
|
||||
"filament.fieldsHelp.multiColorDirection": "",
|
||||
"filament.fieldsHelp.spoolWeight": "",
|
||||
"filament.fieldsHelp.weight": "",
|
||||
"filament.filament": "",
|
||||
"help.help": "",
|
||||
"kofi": "",
|
||||
"loading": "",
|
||||
"locations.locations": "",
|
||||
"locations.newLocation": "",
|
||||
"locations.noLocation": "",
|
||||
"locations.noLocationsHelp": "",
|
||||
"no": "",
|
||||
"notifications.error": "",
|
||||
"notifications.saveSuccessful": "",
|
||||
"printing.generic.columns": "",
|
||||
"printing.generic.customSize": "",
|
||||
"printing.generic.description": "",
|
||||
"printing.generic.dimensions": "",
|
||||
"printing.generic.helpMargin": "",
|
||||
"printing.generic.helpPrinterMargin": "",
|
||||
"printing.generic.horizontalSpacing": "",
|
||||
"printing.generic.itemCopies": "",
|
||||
"printing.generic.marginBottom": "",
|
||||
"printing.generic.marginLeft": "",
|
||||
"printing.generic.marginRight": "",
|
||||
"printing.generic.marginTop": "",
|
||||
"printing.generic.paperSize": "",
|
||||
"printing.generic.printerMarginBottom": "",
|
||||
"printing.generic.printerMarginLeft": "",
|
||||
"printing.generic.printerMarginRight": "",
|
||||
"printing.generic.printerMarginTop": "",
|
||||
"printing.generic.saveAsImage": "",
|
||||
"printing.generic.skipItems": "",
|
||||
"printing.generic.verticalSpacing": "",
|
||||
"printing.qrcode.button": "",
|
||||
"printing.qrcode.useHTTPUrl.label": "",
|
||||
"printing.qrcode.useHTTPUrl.options.default": "",
|
||||
"printing.qrcode.useHTTPUrl.options.url": "",
|
||||
"printing.qrcode.useHTTPUrl.preview": "",
|
||||
"printing.qrcode.useHTTPUrl.tooltip": "",
|
||||
"printing.spoolSelect.selectedTotal_one": "",
|
||||
"printing.spoolSelect.selectedTotal_other": "",
|
||||
"scanner.description": "",
|
||||
"scanner.error.insecureContext": "",
|
||||
"scanner.error.notAllowed": "",
|
||||
"scanner.error.notFound": "",
|
||||
"scanner.error.streamApiNotSupported": "",
|
||||
"scanner.error.unknown": "",
|
||||
"scanner.title": "",
|
||||
"settings.extraFields.booleanFalse": "",
|
||||
"settings.extraFields.booleanTrue": "",
|
||||
"settings.extraFields.deleteConfirm": "",
|
||||
"settings.extraFields.description": "",
|
||||
"settings.extraFields.fieldType.boolean": "",
|
||||
"settings.extraFields.fieldType.choice": "",
|
||||
"settings.extraFields.fieldType.datetime": "",
|
||||
"settings.extraFields.fieldType.float": "",
|
||||
"settings.extraFields.fieldType.floatRange": "",
|
||||
"settings.extraFields.fieldType.integer": "",
|
||||
"settings.extraFields.fieldType.integerRange": "",
|
||||
"settings.extraFields.fieldType.text": "",
|
||||
"settings.extraFields.nonUniqueKeyError": "",
|
||||
"settings.extraFields.params.choices": "",
|
||||
"settings.extraFields.params.defaultValue": "",
|
||||
"settings.extraFields.params.fieldType": "",
|
||||
"settings.extraFields.params.key": "",
|
||||
"settings.extraFields.params.name": "",
|
||||
"settings.extraFields.params.order": "",
|
||||
"settings.extraFields.params.unit": "",
|
||||
"settings.extraFields.tab": "",
|
||||
"settings.general.baseUrl.label": "",
|
||||
"settings.general.baseUrl.tooltip": "",
|
||||
"settings.general.currency.label": "",
|
||||
"settings.general.roundPrices.label": "",
|
||||
"settings.general.roundPrices.tooltip": "",
|
||||
"settings.general.tab": "",
|
||||
"settings.header": "",
|
||||
"spool.fields.archived": "",
|
||||
"spool.fields.comment": "",
|
||||
"spool.fields.filament": "",
|
||||
"spool.fields.firstUsed": "",
|
||||
"spool.fields.id": "",
|
||||
"spool.fields.lastUsed": "",
|
||||
"spool.fields.location": "",
|
||||
"spool.fields.lotNr": "",
|
||||
"spool.fields.material": "",
|
||||
"spool.fields.measuredWeight": "",
|
||||
"spool.fields.price": "",
|
||||
"spool.fields.registered": "",
|
||||
"spool.fields.remainingWeight": "",
|
||||
"spool.fields.usedWeight": "",
|
||||
"spool.fieldsHelp.location": "",
|
||||
"spool.fieldsHelp.lotNr": "",
|
||||
"spool.fieldsHelp.measuredWeight": "",
|
||||
"spool.fieldsHelp.price": "",
|
||||
"spool.fieldsHelp.remainingWeight": "",
|
||||
"spool.fieldsHelp.usedWeight": "",
|
||||
"spool.form.measurementType.length": "",
|
||||
"spool.form.measurementType.weight": "",
|
||||
"spool.spool": "",
|
||||
"unknown": "",
|
||||
"vendor.fields.comment": "",
|
||||
"vendor.fields.emptySpoolWeight": "",
|
||||
"vendor.fields.externalId": "",
|
||||
"vendor.fields.id": "",
|
||||
"vendor.fields.name": "",
|
||||
"vendor.fields.registered": "",
|
||||
"vendor.fieldsHelp.emptySpoolWeight": "",
|
||||
"yes": ""
|
||||
}
|
||||
@@ -0,0 +1,138 @@
|
||||
{
|
||||
"buttons.archive": "Arhiválás",
|
||||
"buttons.cancel": "Mégse",
|
||||
"buttons.clear": "Törlés",
|
||||
"buttons.delete": "Töröl",
|
||||
"buttons.edit": "Szerkeszt",
|
||||
"buttons.filter": "Szűrő",
|
||||
"buttons.save": "Mentés",
|
||||
"buttons.showArchived": "Arhiváltak megjelítése",
|
||||
"buttons.unArchive": "Arhiválás visszavonása",
|
||||
"documentTitle.locations.list": "Tároló helyek | Spoolman",
|
||||
"filament.fields.articleNumber": "Cikkszám",
|
||||
"filament.fields.colorHex": "Szín",
|
||||
"filament.fields.comment": "Megjegyzés",
|
||||
"filament.fields.density": "Sűrűség",
|
||||
"filament.fields.diameter": "Átmérő",
|
||||
"filament.fields.externalId": "Külső ID",
|
||||
"filament.fields.id": "ID",
|
||||
"filament.fields.material": "Anyag",
|
||||
"filament.fields.name": "Név",
|
||||
"filament.fields.price": "Ár",
|
||||
"filament.fields.registered": "Nyilvántartott",
|
||||
"filament.fields.settingsBedTemp": "Tárgyasztal hőmérséklet",
|
||||
"filament.fields.settingsExtruderTemp": "Extruder hőmérséklet",
|
||||
"filament.fields.spoolWeight": "Tekercs súlya",
|
||||
"filament.fields.vendor": "Gyártó",
|
||||
"filament.fields.weight": "Súly",
|
||||
"filament.fieldsHelp.articleNumber": "Például. EAN, UPC stb.",
|
||||
"filament.fieldsHelp.spoolWeight": "Az üres tekercs súlya. Ezt használják a tekercs mért súlyának meghatározásához.",
|
||||
"filament.fieldsHelp.weight": "A teljes tekercs súlya (nettó súly), amely nem tartalmazza a tekercs saját súlyát, csak a filament súlyát. Általában ez szerepel a csomagoláson.",
|
||||
"filament.filament": "Szálak",
|
||||
"help.help": "Segítség",
|
||||
"kofi": "Tipp a Ko-fi-ra",
|
||||
"loading": "Betöltés",
|
||||
"locations.locations": "Helyek",
|
||||
"locations.newLocation": "Új hely",
|
||||
"locations.noLocation": "Nincs hely megadva",
|
||||
"locations.noLocationsHelp": "Ez az oldal lehetővé teszi, hogy rendszerezd a tekercseket helyek szerint, adj hozzá néhány tekercset a kezdéshez!",
|
||||
"no": "Nem",
|
||||
"notifications.error": "Hiba (Hibakód: {{statusCode}})",
|
||||
"notifications.saveSuccessful": "Sikeres mentés!",
|
||||
"printing.generic.columns": "Oszlopok",
|
||||
"printing.generic.customSize": "Egyéni",
|
||||
"printing.generic.description": "A kívánt nyomtatási elrendezés eléréséhez állítsd be az alábbi beállításokat. Tartsd észben, hogy a nyomtatók és az operációs rendszer saját margókat és méretezéseket alkalmazhatnak, ezért szükséged lehet néhány próbára és hibára, mielőtt minden tökéletes lesz. Teszteld egy darab normál papíron, mielőtt az aktuális címkéken nyomtatnád.",
|
||||
"printing.generic.dimensions": "Dimenziók",
|
||||
"printing.generic.helpMargin": "A margókat úgy kell beállítani, hogy illeszkedjenek a címképapírhoz és a nyomtatóhoz, azok megváltoztatása befolyásolja az egész rács méretét.",
|
||||
"printing.generic.helpPrinterMargin": "A biztonsági zónát úgy kell beállítani, hogy mekkora távolságban legyen a tárgyasztal szélétől, ahol a nyomtató tud nyomtatni. Ezeknek a beállításoknak a megváltoztatása nem befolyásolja az egész rácsot.",
|
||||
"printing.generic.horizontalSpacing": "Vízszintes távolság",
|
||||
"printing.generic.itemCopies": "Termék másolatok",
|
||||
"printing.generic.marginBottom": "Alsó margó",
|
||||
"printing.generic.marginLeft": "Bal margó",
|
||||
"printing.generic.marginRight": "Jobb margó",
|
||||
"printing.generic.marginTop": "Felső margó",
|
||||
"printing.generic.paperSize": "Papír méret",
|
||||
"printing.generic.printerMarginBottom": "Biztonságos zóna alja",
|
||||
"printing.generic.printerMarginLeft": "Biztonságos zóna balra",
|
||||
"printing.generic.printerMarginRight": "Biztonságos zóna jobbra",
|
||||
"printing.generic.printerMarginTop": "Biztonságos zóna felül",
|
||||
"printing.generic.saveAsImage": "Mentés Képként",
|
||||
"printing.generic.skipItems": "Elem átugrása",
|
||||
"printing.generic.verticalSpacing": "Függőleges térköz",
|
||||
"printing.qrcode.button": "Cimkék Nyomtatása",
|
||||
"printing.qrcode.useHTTPUrl.label": "QR kód link",
|
||||
"printing.qrcode.useHTTPUrl.options.default": "Alapbeállítás",
|
||||
"printing.qrcode.useHTTPUrl.options.url": "URL",
|
||||
"printing.qrcode.useHTTPUrl.preview": "Előnézet:",
|
||||
"printing.spoolSelect.selectedTotal_one": "{{count}} tekercs kiválasztva",
|
||||
"printing.spoolSelect.selectedTotal_other": "{{count}} db tekercs kiválasztva",
|
||||
"scanner.description": "Olvass be egy Spoolman QR kódot a tekercsről szóló részletek megtekintéséhez.",
|
||||
"scanner.error.insecureContext": "Az oldal kiszolgálása nem HTTPS-en keresztül történik.",
|
||||
"scanner.error.notAllowed": "Nem engedélyezte a kamerához való hozzáférést.",
|
||||
"scanner.error.notFound": "Nem található kamera.",
|
||||
"scanner.error.streamApiNotSupported": "A böngésző nem támogatja a MediaStream API-t.",
|
||||
"scanner.error.unknown": "Ismeretlen hiba történt. ({{error}})",
|
||||
"scanner.title": "QR kód beolvasása",
|
||||
"settings.extraFields.booleanFalse": "Nem",
|
||||
"settings.extraFields.booleanTrue": "Igen",
|
||||
"settings.extraFields.deleteConfirm": "Töröli a következő mezőt: {{name}}?",
|
||||
"settings.extraFields.description.intro": "Itt hozzáadhatsz további egyedi mezőket az entitásokhoz.",
|
||||
"settings.extraFields.description.constraints": "Ha egy mezőt hozzáadtál, nem lehet megváltoztatni annak kulcsát vagy típusát, és a választási típusú mezők esetében nem lehet eltávolítani a választásokat vagy megváltoztatni a többválasztásos állapotot. Ha eltávolítasz egy mezőt, az összes entitásra vonatkozó adat törlődik.",
|
||||
"settings.extraFields.description.keyUsage": "A kulcs az, amit más programok olvasnak/írnak az adatokként, tehát ha az egyedi meződ egy harmadik féllel integrálódik, győződj meg róla, hogy helyesen van beállítva. Az alapértelmezett érték csak az új elemekre vonatkozik.",
|
||||
"settings.extraFields.description.tableViews": "Az extra mezőket nem lehet rendezni vagy szűrni a táblázatnézetekben.",
|
||||
"settings.extraFields.fieldType.boolean": "Logikai",
|
||||
"settings.extraFields.fieldType.choice": "Választás",
|
||||
"settings.extraFields.fieldType.datetime": "Dátum és idő",
|
||||
"settings.extraFields.fieldType.float": "Lebegőpontos szám",
|
||||
"settings.extraFields.fieldType.floatRange": "Lebegőpontos szám tartomány",
|
||||
"settings.extraFields.fieldType.integer": "Egész szám",
|
||||
"settings.extraFields.fieldType.integerRange": "Egész szám tartománya",
|
||||
"settings.extraFields.fieldType.text": "Szöveg",
|
||||
"settings.extraFields.nonUniqueKeyError": "A kulcsnak egyedinek kell lennie.",
|
||||
"settings.extraFields.params.choices": "Választás",
|
||||
"settings.extraFields.params.defaultValue": "Alapértelmezet érték",
|
||||
"settings.extraFields.params.fieldType": "Típus",
|
||||
"settings.extraFields.params.key": "Kulcs",
|
||||
"settings.extraFields.params.name": "Név",
|
||||
"settings.extraFields.params.order": "Rendezés",
|
||||
"settings.extraFields.params.unit": "Egység",
|
||||
"settings.extraFields.tab": "Extra mezők",
|
||||
"settings.general.baseUrl.label": "Alap URL",
|
||||
"settings.general.currency.label": "Pénznem",
|
||||
"settings.general.roundPrices.label": "Árak kerekítése",
|
||||
"settings.general.roundPrices.tooltip": "Az árak legközelebbi egész számra való kerekítése.",
|
||||
"settings.general.tab": "Általános",
|
||||
"settings.header": "Beállítások",
|
||||
"spool.fields.archived": "Arhivált",
|
||||
"spool.fields.comment": "Megjegyzés",
|
||||
"spool.fields.filament": "Szál",
|
||||
"spool.fields.firstUsed": "Először használt",
|
||||
"spool.fields.id": "ID",
|
||||
"spool.fields.lastUsed": "Utoljára használt",
|
||||
"spool.fields.location": "Hely",
|
||||
"spool.fields.lotNr": "Tételszám",
|
||||
"spool.fields.material": "Anyag",
|
||||
"spool.fields.measuredWeight": "Mért súly",
|
||||
"spool.fields.price": "Ár",
|
||||
"spool.fields.registered": "Nyilvántartott",
|
||||
"spool.fields.remainingWeight": "Maradék súly",
|
||||
"spool.fields.usedWeight": "Felhasznált súly",
|
||||
"spool.fieldsHelp.location": "Hol található a tekercs, ha több helyen tárolod a tekercseidet.",
|
||||
"spool.fieldsHelp.lotNr": "Gyártói tételszám. A szín egységesség ellenőrzésére használható, ha több tekercset használsz egy nyomtatáshoz.",
|
||||
"spool.fieldsHelp.measuredWeight": "Mennyit nyom a filament és a tekercs együtt.",
|
||||
"spool.fieldsHelp.price": "Egy teljes tekercs ára. Ha nincs beállítva, a rendszer az filament árát veszi fel helyette.",
|
||||
"spool.fieldsHelp.remainingWeight": "Mennyi filament van még a tekercsen. Egy új tekercsnél ez a tekercs súlyával kell megegyeznie.",
|
||||
"spool.fieldsHelp.usedWeight": "Mennyi filament használódott el a tekercsről. Egy új tekercsnek 0 gramm használt mennyiséggel kell rendelkeznie.",
|
||||
"spool.form.measurementType.length": "Hossz",
|
||||
"spool.form.measurementType.weight": "Súly",
|
||||
"spool.spool": "Tekercsek",
|
||||
"unknown": "Ismeretlen",
|
||||
"vendor.fields.comment": "Megjegyzés",
|
||||
"vendor.fields.emptySpoolWeight": "Üres tekercs súlya",
|
||||
"vendor.fields.externalId": "Külső ID",
|
||||
"vendor.fields.id": "ID",
|
||||
"vendor.fields.name": "Név",
|
||||
"vendor.fields.registered": "Nyilvántartott",
|
||||
"vendor.fieldsHelp.emptySpoolWeight": "Ettől a gyártótól származó üres tekercs súlya.",
|
||||
"yes": "Igen"
|
||||
}
|
||||
@@ -0,0 +1,146 @@
|
||||
{
|
||||
"buttons.archive": "Archivia",
|
||||
"buttons.cancel": "Cancella",
|
||||
"buttons.clear": "Pulisci",
|
||||
"buttons.delete": "Elimina",
|
||||
"buttons.edit": "Modifica",
|
||||
"buttons.filter": "Filtro",
|
||||
"buttons.save": "Salva",
|
||||
"buttons.showArchived": "Mostra Archiviati",
|
||||
"buttons.unArchive": "Ripristina",
|
||||
"documentTitle.locations.list": "Posizione | Spoolman",
|
||||
"filament.fields.articleNumber": "Numero Articolo",
|
||||
"filament.fields.coaxial": "Coestruso",
|
||||
"filament.fields.colorHex": "Colore",
|
||||
"filament.fields.comment": "Note",
|
||||
"filament.fields.density": "Densità",
|
||||
"filament.fields.diameter": "Diametro",
|
||||
"filament.fields.externalId": "ID esterno",
|
||||
"filament.fields.id": "ID",
|
||||
"filament.fields.longitudinal": "Longitudinale",
|
||||
"filament.fields.material": "Materiale",
|
||||
"filament.fields.multiColor": "Multiplo",
|
||||
"filament.fields.name": "Nome",
|
||||
"filament.fields.price": "Prezzo",
|
||||
"filament.fields.registered": "Registrato",
|
||||
"filament.fields.settingsBedTemp": "Temperatura Piatto",
|
||||
"filament.fields.settingsExtruderTemp": "Temperatura Estrusore",
|
||||
"filament.fields.singleColor": "Unico",
|
||||
"filament.fields.spoolWeight": "Peso Bobina",
|
||||
"filament.fields.vendor": "Produttore",
|
||||
"filament.fields.weight": "Peso",
|
||||
"filament.fieldsHelp.articleNumber": "Es.: EAN, UPC, etc.",
|
||||
"filament.fieldsHelp.multiColorDirection": "I filamenti possono avere più colori in due modi: attraverso la coestrusione, come i filamenti a due colori con più colori omogenei, o attraverso cambiamenti di colore longitudinali, come i filamenti a gradiente che cambiano colore lungo la bobina.",
|
||||
"filament.fieldsHelp.spoolWeight": "Il peso di una bobina vuota. Utilizzato per determinare il peso misurato di una bobina.",
|
||||
"filament.fieldsHelp.weight": "Il peso del filamento di una bobina piena (peso netto). Questo non dovrebbe includere il peso della bobina stessa, ma solo del filamento. È quello che solitamente c'è scritto sulla confezione.",
|
||||
"filament.filament": "Filamenti",
|
||||
"help.help": "Aiuto",
|
||||
"kofi": "Donazione su Ko-fi",
|
||||
"loading": "Caricamento",
|
||||
"locations.locations": "Posizioni",
|
||||
"locations.newLocation": "Nuova Posizione",
|
||||
"locations.noLocation": "Nessuna Posizione",
|
||||
"locations.noLocationsHelp": "Questa pagina ti consente di organizzare le bobine in base alla posizione. Aggiungi alcune bobine per iniziare!",
|
||||
"no": "No",
|
||||
"notifications.error": "Errore (status code: {{statusCode}})",
|
||||
"notifications.saveSuccessful": "Salvataggio completato!",
|
||||
"printing.generic.columns": "Colonne",
|
||||
"printing.generic.customSize": "Personalizzato",
|
||||
"printing.generic.description": "Sintonizza le impostazioni di seguito per ottenere il layout di stampa desiderato. Tieni presente che le stampanti e il tuo sistema operativo potrebbero applicare i propri margini e ridimensionamenti, quindi potrebbe essere necessario eseguire alcuni tentativi ed errori prima che tutto sia corretto. Provalo su un pezzo di carta normale prima di stampare sulle etichette effettive.",
|
||||
"printing.generic.dimensions": "Dimensioni",
|
||||
"printing.generic.helpMargin": "I margini devono essere configurati affinchè corrispondano alla carta per etichette e alla stampante, la modifica di questi influirà sulla dimensione dell'intera griglia.",
|
||||
"printing.generic.helpPrinterMargin": "La Safe-Zone deve essere impostata in prossimità del bordo stampabile della carta; la modifica di questi valori non influirà sull'intera griglia.",
|
||||
"printing.generic.horizontalSpacing": "Spaziatura Orizzontale",
|
||||
"printing.generic.itemCopies": "Copie dell'elemento",
|
||||
"printing.generic.marginBottom": "Margine Inferiore",
|
||||
"printing.generic.marginLeft": "Margine Sinistro",
|
||||
"printing.generic.marginRight": "Margine Destro",
|
||||
"printing.generic.marginTop": "Margine Superiore",
|
||||
"printing.generic.paperSize": "Dimensione Carta",
|
||||
"printing.generic.printerMarginBottom": "Safe-Zone Inferiore",
|
||||
"printing.generic.printerMarginLeft": "Safe-Zone Sinistra",
|
||||
"printing.generic.printerMarginRight": "Safe-Zone Destra",
|
||||
"printing.generic.printerMarginTop": "Safe-Zone Superiore",
|
||||
"printing.generic.saveAsImage": "Salva come immagine",
|
||||
"printing.generic.skipItems": "Salta Elementi",
|
||||
"printing.generic.verticalSpacing": "Spaziatura Verticale",
|
||||
"printing.qrcode.button": "Stampa etichette",
|
||||
"printing.qrcode.useHTTPUrl.label": "Link codice QR",
|
||||
"printing.qrcode.useHTTPUrl.options.default": "Preimpostato",
|
||||
"printing.qrcode.useHTTPUrl.options.url": "URL",
|
||||
"printing.qrcode.useHTTPUrl.preview": "Anteprima:",
|
||||
"printing.qrcode.useHTTPUrl.tooltip": "Verrà utilizzato un link che funzionerà solo se scansionato dalla funzione di scansione di Spoolman (impostazione predefinita). L'URL utilizza l'URL di base specificato nelle impostazioni o l'URL della pagina corrente, se non impostato.",
|
||||
"printing.spoolSelect.selectedTotal_many": "{{count}} bobine selezionate",
|
||||
"printing.spoolSelect.selectedTotal_one": "{{count}} bobina selezionata",
|
||||
"printing.spoolSelect.selectedTotal_other": "{{count}} bobine selezionate",
|
||||
"scanner.description": "Scansiona uno Spoolman QR-Code per visualizzare i dettagli della bobina.",
|
||||
"scanner.error.insecureContext": "La pagina non è disponibile tramite HTTPS.",
|
||||
"scanner.error.notAllowed": "Non hai accesso alla fotocamera.",
|
||||
"scanner.error.notFound": "Nessuna fotocamera rilevata.",
|
||||
"scanner.error.streamApiNotSupported": "il browser non supporta le API MediaStream.",
|
||||
"scanner.error.unknown": "Si è verificato un errore. ({{error}})",
|
||||
"scanner.title": "QR-Code Scanner",
|
||||
"settings.extraFields.booleanFalse": "No",
|
||||
"settings.extraFields.booleanTrue": "Si",
|
||||
"settings.extraFields.deleteConfirm": "Cancellare il campo {{name}}?",
|
||||
"settings.extraFields.description.intro": "Qui è possibile aggiungere campi personalizzati.",
|
||||
"settings.extraFields.description.constraints": "Una volta aggiunto un campo, non è possibile modificarne la chiave o il tipo, e per i campi di tipo scelta non è possibile rimuovere le scelte o modificare lo stato di scelta multipla. Se si rimuove un campo, tutti i dati associati saranno cancellati.",
|
||||
"settings.extraFields.description.keyUsage": "La chiave è il modo in cui gli altri programmi leggono/scrivono i dati, quindi se il campo personalizzato deve integrarsi con un programma di terze parti, assicurarsi di impostarla correttamente. Il valore predefinito viene applicato solo ai nuovi elementi.",
|
||||
"settings.extraFields.description.tableViews": "I campi extra non possono essere ordinati o filtrati nelle viste tabella.",
|
||||
"settings.extraFields.fieldType.boolean": "Booleano",
|
||||
"settings.extraFields.fieldType.choice": "Scelta",
|
||||
"settings.extraFields.fieldType.datetime": "Data e ora",
|
||||
"settings.extraFields.fieldType.float": "Decimali",
|
||||
"settings.extraFields.fieldType.floatRange": "Intervallo decimali",
|
||||
"settings.extraFields.fieldType.integer": "\"Intero\" per tipo campo extra, numero intero senza decimali",
|
||||
"settings.extraFields.fieldType.integerRange": "Intervallo di numeri interi",
|
||||
"settings.extraFields.fieldType.text": "\"Testo\" per tipo campo extra",
|
||||
"settings.extraFields.nonUniqueKeyError": "La chiave deve essere univoca.",
|
||||
"settings.extraFields.params.choices": "Scelte",
|
||||
"settings.extraFields.params.defaultValue": "Valore di Default",
|
||||
"settings.extraFields.params.fieldType": "Tipo",
|
||||
"settings.extraFields.params.key": "Chiave",
|
||||
"settings.extraFields.params.name": "Nome",
|
||||
"settings.extraFields.params.order": "Ordine",
|
||||
"settings.extraFields.params.unit": "Unità",
|
||||
"settings.extraFields.tab": "Campi extra",
|
||||
"settings.general.baseUrl.label": "URL di base",
|
||||
"settings.general.baseUrl.tooltip": "L'URL di base da utilizzare quando si generano funzioni come i codici QR.",
|
||||
"settings.general.currency.label": "Valuta",
|
||||
"settings.general.roundPrices.label": "Prezzi arrotondati",
|
||||
"settings.general.roundPrices.tooltip": "Prezzi arrotondati al numero intero più vicino.",
|
||||
"settings.general.tab": "Generale",
|
||||
"settings.header": "Configurazione",
|
||||
"spool.fields.archived": "Archiviati",
|
||||
"spool.fields.comment": "Note",
|
||||
"spool.fields.filament": "Filamento",
|
||||
"spool.fields.firstUsed": "Primo Utilizzo",
|
||||
"spool.fields.id": "ID",
|
||||
"spool.fields.lastUsed": "Ultimo Utilizzo",
|
||||
"spool.fields.location": "Posizione",
|
||||
"spool.fields.lotNr": "Lotto Nr",
|
||||
"spool.fields.material": "Materiale",
|
||||
"spool.fields.measuredWeight": "Peso Misurato",
|
||||
"spool.fields.price": "Prezzo",
|
||||
"spool.fields.registered": "Registrato",
|
||||
"spool.fields.remainingWeight": "Peso Rimanente",
|
||||
"spool.fields.usedWeight": "Peso Utilizzato",
|
||||
"spool.fieldsHelp.location": "Dove si trova la bobina se disponi di più posizioni in cui conservare le bobine.",
|
||||
"spool.fieldsHelp.lotNr": "Numero di lotto del produttore. Può essere utilizzato per garantire che la stampa abbia colori uniformi se vengono utilizzate più bobine.",
|
||||
"spool.fieldsHelp.measuredWeight": "Quanto pesano il filamento e la bobina.",
|
||||
"spool.fieldsHelp.price": "Prezzo di una bobina completa. Se non viene impostato, verrà utilizzato il prezzo del filamento.",
|
||||
"spool.fieldsHelp.remainingWeight": "Quanto filamento è rimasto sulla bobina. Per una nuova bobina questo dovrebbe corrispondere al peso della bobina.",
|
||||
"spool.fieldsHelp.usedWeight": "Quanto filamento è stato utilizzato dalla bobina. Una nuova bobina dovrebbe avere 0 gr utilizzati.",
|
||||
"spool.form.measurementType.length": "Lunghezza",
|
||||
"spool.form.measurementType.weight": "Peso",
|
||||
"spool.spool": "Bobine",
|
||||
"unknown": "Sconosciuto",
|
||||
"vendor.fields.comment": "Note",
|
||||
"vendor.fields.emptySpoolWeight": "Peso a vuoto della bobina/tara",
|
||||
"vendor.fields.externalId": "ID Esterno",
|
||||
"vendor.fields.id": "ID",
|
||||
"vendor.fields.name": "Nome",
|
||||
"vendor.fields.registered": "Registrato",
|
||||
"vendor.fieldsHelp.emptySpoolWeight": "Il peso di una bobina vuota di questo produttore.",
|
||||
"yes": "Si"
|
||||
}
|
||||
@@ -0,0 +1,144 @@
|
||||
{
|
||||
"buttons.archive": "アーカイブ",
|
||||
"buttons.cancel": "キャンセル",
|
||||
"buttons.clear": "クリア",
|
||||
"buttons.delete": "削除",
|
||||
"buttons.edit": "編集",
|
||||
"buttons.filter": "フィルター",
|
||||
"buttons.save": "保存",
|
||||
"buttons.showArchived": "アーカイブを表示",
|
||||
"buttons.unArchive": "非アーカイブ",
|
||||
"documentTitle.locations.list": "場所 | Spoolman",
|
||||
"filament.fields.articleNumber": "製品番号",
|
||||
"filament.fields.coaxial": "断面",
|
||||
"filament.fields.colorHex": "色",
|
||||
"filament.fields.comment": "コメント",
|
||||
"filament.fields.density": "密度",
|
||||
"filament.fields.diameter": "直径",
|
||||
"filament.fields.externalId": "外部ID",
|
||||
"filament.fields.id": "ID",
|
||||
"filament.fields.longitudinal": "縦方向",
|
||||
"filament.fields.material": "マテリアル",
|
||||
"filament.fields.multiColor": "複数色",
|
||||
"filament.fields.name": "名称",
|
||||
"filament.fields.price": "価格",
|
||||
"filament.fields.registered": "登録",
|
||||
"filament.fields.settingsBedTemp": "ベッド温度",
|
||||
"filament.fields.settingsExtruderTemp": "エクストルーダー温度",
|
||||
"filament.fields.singleColor": "単色",
|
||||
"filament.fields.spoolWeight": "スプールの重さ",
|
||||
"filament.fields.vendor": "製造者",
|
||||
"filament.fields.weight": "重さ",
|
||||
"filament.fieldsHelp.articleNumber": "例: EAN, UPC, etc.",
|
||||
"filament.fieldsHelp.multiColorDirection": "フィラメントは2つの方法で複数の色を持つことができます。断面: 押出し時に円の断面に複数色を持つ二色フィラメントのような形態です。縦方向: 長手方向の色変化によるもので、スプールに沿って色が変化するグラデーションフィラメントのような形態です。",
|
||||
"filament.fieldsHelp.spoolWeight": "空のスプールの重量。スプールの測定重量を決定するために使用されます。",
|
||||
"filament.fieldsHelp.weight": "フィラメントの正味重量(フルスプール時)。スプール自体の重量は含まず、フィラメントのみの重量です。通常、パッケージに記載されている重量です。",
|
||||
"filament.filament": "フィラメント",
|
||||
"help.help": "ヘルプ",
|
||||
"kofi": "Ko-fiでチップをください",
|
||||
"loading": "読み込み中",
|
||||
"locations.locations": "場所",
|
||||
"locations.newLocation": "新しい場所",
|
||||
"locations.noLocation": "場所なし",
|
||||
"locations.noLocationsHelp": "このページでは、スプールを場所ごとに整理することができます!",
|
||||
"no": "いいえ",
|
||||
"notifications.error": "エラー (status code: {{statusCode}})",
|
||||
"notifications.saveSuccessful": "保存完了!",
|
||||
"printing.generic.columns": "列",
|
||||
"printing.generic.customSize": "カスタム",
|
||||
"printing.generic.description": "以下の設定を調整して、希望する印刷レイアウトを得てください。プリンターやOSが独自のマージンや拡大縮小を適用する場合があるため、すべてが正確になるまでには試行錯誤が必要かもしれません。実際のラベルに印刷する前に、普通の紙でテストしてください。",
|
||||
"printing.generic.dimensions": "寸法",
|
||||
"printing.generic.helpMargin": "マージンはラベル用紙とプリンターに合わせて設定する必要があります。これらを変更すると、グリッド全体のサイズに影響します。",
|
||||
"printing.generic.helpPrinterMargin": "セーフゾーンは、プリンターが用紙の端にどれだけ近づけて印刷できるかの設定です。これらを変更しても、グリッド全体には影響しません。",
|
||||
"printing.generic.horizontalSpacing": "水平方向の余白",
|
||||
"printing.generic.itemCopies": "複製",
|
||||
"printing.generic.marginBottom": "下側の余白",
|
||||
"printing.generic.marginLeft": "左側の余白",
|
||||
"printing.generic.marginRight": "右側の余白",
|
||||
"printing.generic.marginTop": "上側の余白",
|
||||
"printing.generic.paperSize": "用紙サイズ",
|
||||
"printing.generic.printerMarginBottom": "下側のセーフゾーン",
|
||||
"printing.generic.printerMarginLeft": "左側のセーフゾーン",
|
||||
"printing.generic.printerMarginRight": "右側のセーフゾーン",
|
||||
"printing.generic.printerMarginTop": "上側のセーフゾーン",
|
||||
"printing.generic.saveAsImage": "画像として保存",
|
||||
"printing.generic.skipItems": "スキップ",
|
||||
"printing.generic.verticalSpacing": "垂直方向の余白",
|
||||
"printing.qrcode.button": "ラベルを印刷",
|
||||
"printing.qrcode.useHTTPUrl.label": "QRコードリンク",
|
||||
"printing.qrcode.useHTTPUrl.options.default": "デフォルト",
|
||||
"printing.qrcode.useHTTPUrl.options.url": "URL",
|
||||
"printing.qrcode.useHTTPUrl.preview": "プレビュー:",
|
||||
"printing.qrcode.useHTTPUrl.tooltip": "Spoolmanのスキャン機能からスキャンした場合にのみ機能する独自リンクを使用します(デフォルト)。URLは設定で指定されたベースURLを使用するか、設定されていない場合は現在のページURLを使用します。",
|
||||
"printing.spoolSelect.selectedTotal_other": "{{count}}本のスプールを選択",
|
||||
"scanner.description": "スプールの詳細を表示するには、SpoolmanのQRコードをスキャンしてください。",
|
||||
"scanner.error.insecureContext": "このページはHTTPSで接続されていません。",
|
||||
"scanner.error.notAllowed": "カメラへのアクセスが許可されていません。",
|
||||
"scanner.error.notFound": "カメラが見つかりません。",
|
||||
"scanner.error.streamApiNotSupported": "ブラウザがMediaStream APIに対応していません。",
|
||||
"scanner.error.unknown": "未知のエラーが発生しました。({{error}})",
|
||||
"scanner.title": "QRコードスキャナ",
|
||||
"settings.extraFields.booleanFalse": "いいえ",
|
||||
"settings.extraFields.booleanTrue": "はい",
|
||||
"settings.extraFields.deleteConfirm": "{{name}}のフィールドを削除しますか?",
|
||||
"settings.extraFields.description.intro": "ここで追加のカスタムフィールドを追加できます。",
|
||||
"settings.extraFields.description.constraints": "フィールドを追加すると、そのキーやタイプを変更することはできません。また、選択肢タイプのフィールドでは、選択肢の削除や複数選択の状態を変更することはできません。フィールドを削除すると、すべてのエンティティの関連データが削除されます。",
|
||||
"settings.extraFields.description.keyUsage": "キーは他のプログラムがデータを読み書きする際に使用するものなので、カスタムフィールドがサードパーティのプログラムと連携する予定がある場合は、正しく設定してください。デフォルト値は新しいアイテムにのみ適用されます。",
|
||||
"settings.extraFields.description.tableViews": "追加フィールドはテーブルビューで並べ替えやフィルタリングすることはできません。",
|
||||
"settings.extraFields.fieldType.boolean": "真偽値",
|
||||
"settings.extraFields.fieldType.choice": "選択肢",
|
||||
"settings.extraFields.fieldType.datetime": "日時",
|
||||
"settings.extraFields.fieldType.float": "小数点型",
|
||||
"settings.extraFields.fieldType.floatRange": "小数点型の範囲",
|
||||
"settings.extraFields.fieldType.integer": "整数",
|
||||
"settings.extraFields.fieldType.integerRange": "数値範囲",
|
||||
"settings.extraFields.fieldType.text": "テキスト",
|
||||
"settings.extraFields.nonUniqueKeyError": "キーは一意の値である必要があります。",
|
||||
"settings.extraFields.params.choices": "選択肢",
|
||||
"settings.extraFields.params.defaultValue": "デフォルト値",
|
||||
"settings.extraFields.params.fieldType": "タイプ",
|
||||
"settings.extraFields.params.key": "キー",
|
||||
"settings.extraFields.params.name": "名称",
|
||||
"settings.extraFields.params.order": "数量",
|
||||
"settings.extraFields.params.unit": "単位",
|
||||
"settings.extraFields.tab": "追加項目",
|
||||
"settings.general.baseUrl.label": "ベースURL",
|
||||
"settings.general.baseUrl.tooltip": "QRコードなどの機能を生成する際に使用する基本URL。",
|
||||
"settings.general.currency.label": "通過",
|
||||
"settings.general.roundPrices.label": "価格の端数処理",
|
||||
"settings.general.roundPrices.tooltip": "価格の小数点以下を四捨五入する。",
|
||||
"settings.general.tab": "一般",
|
||||
"settings.header": "設定",
|
||||
"spool.fields.archived": "アーカイブ",
|
||||
"spool.fields.comment": "コメント",
|
||||
"spool.fields.filament": "フィラメント",
|
||||
"spool.fields.firstUsed": "最初の使用",
|
||||
"spool.fields.id": "ID",
|
||||
"spool.fields.lastUsed": "最後の使用",
|
||||
"spool.fields.location": "場所",
|
||||
"spool.fields.lotNr": "ロットナンバー",
|
||||
"spool.fields.material": "マテリアル",
|
||||
"spool.fields.measuredWeight": "計測した重さ",
|
||||
"spool.fields.price": "価格",
|
||||
"spool.fields.registered": "登録",
|
||||
"spool.fields.remainingWeight": "残りの重さ",
|
||||
"spool.fields.usedWeight": "使用した重さ",
|
||||
"spool.fieldsHelp.location": "スプールを複数の場所に保管している場合、そのスプールの保管場所。",
|
||||
"spool.fieldsHelp.lotNr": "メーカーのロット番号。複数のスプールを使用する場合、印刷の色が一定であることを確認するために使用できます。",
|
||||
"spool.fieldsHelp.measuredWeight": "フィラメントとスプールの重量。",
|
||||
"spool.fieldsHelp.price": "スプール全体の価格。設定されていない場合は、フィラメントの価格が代わりに使用されます。",
|
||||
"spool.fieldsHelp.remainingWeight": "スプールに残っているフィラメントの量。新しいスプールの場合、これはスプールの重量と一致するはずです。",
|
||||
"spool.fieldsHelp.usedWeight": "スプールからどれだけのフィラメントが使用されたか。新しいスプールは0gとなるはずです。",
|
||||
"spool.form.measurementType.length": "長さ",
|
||||
"spool.form.measurementType.weight": "重さ",
|
||||
"spool.spool": "スプール",
|
||||
"unknown": "未知",
|
||||
"vendor.fields.comment": "コメント",
|
||||
"vendor.fields.emptySpoolWeight": "空スプールの重さ",
|
||||
"vendor.fields.externalId": "外部ID",
|
||||
"vendor.fields.id": "ID",
|
||||
"vendor.fields.name": "名称",
|
||||
"vendor.fields.registered": "登録",
|
||||
"vendor.fieldsHelp.emptySpoolWeight": "この製造者の空スプールの重量。",
|
||||
"yes": "はい"
|
||||
}
|
||||
@@ -0,0 +1,144 @@
|
||||
{
|
||||
"buttons.archive": "보관",
|
||||
"buttons.cancel": "취소",
|
||||
"buttons.clear": "지우기",
|
||||
"buttons.delete": "삭제",
|
||||
"buttons.edit": "수정",
|
||||
"buttons.filter": "필터",
|
||||
"buttons.save": "저장",
|
||||
"buttons.showArchived": "보관 보이기",
|
||||
"buttons.unArchive": "보관취소",
|
||||
"documentTitle.locations.list": "위치 | Spoolman",
|
||||
"filament.fields.articleNumber": "제품 번호",
|
||||
"filament.fields.coaxial": "공압출",
|
||||
"filament.fields.colorHex": "색상",
|
||||
"filament.fields.comment": "주석",
|
||||
"filament.fields.density": "밀도",
|
||||
"filament.fields.diameter": "외경",
|
||||
"filament.fields.externalId": "외부 ID",
|
||||
"filament.fields.id": "ID",
|
||||
"filament.fields.longitudinal": "세로",
|
||||
"filament.fields.material": "재료",
|
||||
"filament.fields.multiColor": "다중",
|
||||
"filament.fields.name": "이름",
|
||||
"filament.fields.price": "가격",
|
||||
"filament.fields.registered": "등록됨",
|
||||
"filament.fields.settingsBedTemp": "배드 온도",
|
||||
"filament.fields.settingsExtruderTemp": "압출기 온도",
|
||||
"filament.fields.singleColor": "단일",
|
||||
"filament.fields.spoolWeight": "스풀 중량",
|
||||
"filament.fields.vendor": "제조사",
|
||||
"filament.fields.weight": "중량",
|
||||
"filament.fieldsHelp.articleNumber": "예. EAN, UPC, 등.",
|
||||
"filament.fieldsHelp.multiColorDirection": "필라멘트는 두 가지 방식으로 다중 색상을 가질 수 있습니다: 일관된 다중 색상을 가진 이중 색상 필라멘트처럼 공압출을 통해서이거나, 스풀을 따라 색상이 변하는 그라데이션 필라멘트처럼 종방향 색상 변화를 통해서입니다.",
|
||||
"filament.fieldsHelp.spoolWeight": "빈 스풀의 무게. 스풀의 측정 무게를 결정하는 데 사용됩니다.",
|
||||
"filament.fieldsHelp.weight": "전체 스풀의 필라멘트 중량(순중량). 여기에는 스풀 자체의 무게는 포함되지 않으며 필라멘트만 포함됩니다. 일반적으로 포장지에 표기되는 내용입니다.",
|
||||
"filament.filament": "필라멘트",
|
||||
"help.help": "도움말",
|
||||
"kofi": "Ko-fi 로 개발 지원",
|
||||
"loading": "로딩",
|
||||
"locations.locations": "위치",
|
||||
"locations.newLocation": "새로운 위치",
|
||||
"locations.noLocation": "위치 없음",
|
||||
"locations.noLocationsHelp": "이 페이지에서는 스풀을 위치별로 정리할 수 있습니다. 시작하려면 스풀을 추가하세요!",
|
||||
"no": "아니오",
|
||||
"notifications.error": "오류 (상태 코드: {{statusCode}})",
|
||||
"notifications.saveSuccessful": "저장 완료!",
|
||||
"printing.generic.columns": "열",
|
||||
"printing.generic.customSize": "커스텀",
|
||||
"printing.generic.description": "아래 설정을 조정하여 원하는 인쇄 레이아웃을 얻으십시오. 프린터와 운영체제(OS)가 자체 여백 및 크기 조정을 적용할 수 있으므로, 완벽하게 맞출 때까지 몇 번의 시행착오가 필요할 수 있습니다. 실제 라벨에 인쇄하기 전에 일반 용지에 테스트 인쇄를 해보십시오.",
|
||||
"printing.generic.dimensions": "치수",
|
||||
"printing.generic.helpMargin": "여백은 라벨 용지와 프린터에 맞게 설정해야 하며, 이를 변경하면 전체 그리드 크기에 영향을 미칩니다.",
|
||||
"printing.generic.helpPrinterMargin": "안전 영역은 프린터가 용지 가장자리에서 얼마나 가까운 위치까지 인쇄할 수 있는 지를 설정하는 것이며, 이 값을 변경해도 전체 격자에는 영향을 미치지 않습니다.",
|
||||
"printing.generic.horizontalSpacing": "수평 여백",
|
||||
"printing.generic.itemCopies": "항목 복사",
|
||||
"printing.generic.marginBottom": "아래쪽 여백",
|
||||
"printing.generic.marginLeft": "왼쪽 여백",
|
||||
"printing.generic.marginRight": "오른쪽 여백",
|
||||
"printing.generic.marginTop": "위쪽 여백",
|
||||
"printing.generic.paperSize": "종이 크기",
|
||||
"printing.generic.printerMarginBottom": "안전구역 아래쪽",
|
||||
"printing.generic.printerMarginLeft": "안전구역 왼쪽",
|
||||
"printing.generic.printerMarginRight": "안전구역 오른쪽",
|
||||
"printing.generic.printerMarginTop": "안전구역 위쪽",
|
||||
"printing.generic.saveAsImage": "그림으로 저장",
|
||||
"printing.generic.skipItems": "항목 건너뛰기",
|
||||
"printing.generic.verticalSpacing": "수직 여백",
|
||||
"printing.qrcode.button": "프린트 라벨",
|
||||
"printing.qrcode.useHTTPUrl.label": "QR 코드 링크",
|
||||
"printing.qrcode.useHTTPUrl.options.default": "기본값",
|
||||
"printing.qrcode.useHTTPUrl.options.url": "URL",
|
||||
"printing.qrcode.useHTTPUrl.preview": "미리보기:",
|
||||
"printing.qrcode.useHTTPUrl.tooltip": "Spoolman의 스캐닝 기능(기본값)에서 스캔 한 경우에만 작동하는 독점 링크를 사용합니다. URL은 설정에 지정된 기본 URL을 사용하거나 설정되지 않은 경우 현재 페이지 URL을 사용합니다.",
|
||||
"printing.spoolSelect.selectedTotal_other": "{{count}} 스풀 선택됨",
|
||||
"scanner.description": "스풀맨 QR 코드를 스캔하여 스풀에 대한 세부 정보를 확인하세요.",
|
||||
"scanner.error.insecureContext": "해당 페이지는 HTTPS를 통해 제공되지 않습니다.",
|
||||
"scanner.error.notAllowed": "카메라 접근 권한을 허용하지 않았습니다.",
|
||||
"scanner.error.notFound": "카메라를 찾을 수 없습니다.",
|
||||
"scanner.error.streamApiNotSupported": "브라우저가 MediaStream API를 지원하지 않습니다.",
|
||||
"scanner.error.unknown": "알수 없는 오류 발생. {{error}}",
|
||||
"scanner.title": "QR 코드 스캐너",
|
||||
"settings.extraFields.booleanFalse": "아니오",
|
||||
"settings.extraFields.booleanTrue": "네",
|
||||
"settings.extraFields.deleteConfirm": "{{name}} 필드 삭제?",
|
||||
"settings.extraFields.description.intro": "여기에서 엔터티에 추가 사용자 정의 필드를 추가할 수 있습니다.",
|
||||
"settings.extraFields.description.constraints": "필드를 추가한 후에는 키나 유형을 변경할 수 없으며, 선택형 필드의 경우 선택 항목을 제거하거나 다중 선택 상태를 변경할 수 없습니다. 필드를 삭제하면 모든 엔티티의 관련 데이터가 삭제됩니다.",
|
||||
"settings.extraFields.description.keyUsage": "키 값은 다른 프로그램이 데이터를 읽고 쓰는 방식이므로, 사용자 정의 필드가 타사 프로그램과 연동될 예정이라면 반드시 올바르게 설정해야 합니다. 기본값은 새 항목에만 적용됩니다.",
|
||||
"settings.extraFields.description.tableViews": "추가 필드는 테이블 보기에서 정렬하거나 필터링할 수 없습니다.",
|
||||
"settings.extraFields.fieldType.boolean": "Boolean",
|
||||
"settings.extraFields.fieldType.choice": "선택",
|
||||
"settings.extraFields.fieldType.datetime": "날짜 및 시간",
|
||||
"settings.extraFields.fieldType.float": "Float",
|
||||
"settings.extraFields.fieldType.floatRange": "Float 범위",
|
||||
"settings.extraFields.fieldType.integer": "정수",
|
||||
"settings.extraFields.fieldType.integerRange": "정수 범위",
|
||||
"settings.extraFields.fieldType.text": "텍스트",
|
||||
"settings.extraFields.nonUniqueKeyError": "키는 고유해야 합니다.",
|
||||
"settings.extraFields.params.choices": "선택",
|
||||
"settings.extraFields.params.defaultValue": "기본값",
|
||||
"settings.extraFields.params.fieldType": "유형",
|
||||
"settings.extraFields.params.key": "키",
|
||||
"settings.extraFields.params.name": "이름",
|
||||
"settings.extraFields.params.order": "순번",
|
||||
"settings.extraFields.params.unit": "단위",
|
||||
"settings.extraFields.tab": "추가 필드",
|
||||
"settings.general.baseUrl.label": "기본 URL",
|
||||
"settings.general.baseUrl.tooltip": "QR 코드와 같은 기능을 생성할 때 사용할 기본 URL.",
|
||||
"settings.general.currency.label": "통화",
|
||||
"settings.general.roundPrices.label": "반올림 가격",
|
||||
"settings.general.roundPrices.tooltip": "가격을 가장 가까운 정수로 반올림 합니다.",
|
||||
"settings.general.tab": "일반",
|
||||
"settings.header": "설정",
|
||||
"spool.fields.archived": "보관됨",
|
||||
"spool.fields.comment": "주석",
|
||||
"spool.fields.filament": "필라멘트",
|
||||
"spool.fields.firstUsed": "첫 사용",
|
||||
"spool.fields.id": "ID",
|
||||
"spool.fields.lastUsed": "최종 사용",
|
||||
"spool.fields.location": "위치",
|
||||
"spool.fields.lotNr": "Lot Nr",
|
||||
"spool.fields.material": "재료",
|
||||
"spool.fields.measuredWeight": "측정 중량",
|
||||
"spool.fields.price": "가격",
|
||||
"spool.fields.registered": "등록됨",
|
||||
"spool.fields.remainingWeight": "잔여 중량",
|
||||
"spool.fields.usedWeight": "사용 중량",
|
||||
"spool.fieldsHelp.location": "여러 위치에 스풀을 보관하는 경우 스풀이 위치한 곳.",
|
||||
"spool.fieldsHelp.lotNr": "제조업체 lot 번호. 여러 개의 스풀을 사용할 경우 인쇄물의 색상이 일관되도록 보장하는 데 사용할 수 있습니다.",
|
||||
"spool.fieldsHelp.measuredWeight": "필라멘트와 스풀의 무게는 얼마입니까.",
|
||||
"spool.fieldsHelp.price": "전체 스풀 가격. 설정되지 않은 경우 필라멘트 가격이 대신 적용됩니다.",
|
||||
"spool.fieldsHelp.remainingWeight": "스풀에 남은 필라멘트 양은 얼마입니까. 새 스풀의 경우 스풀 무게와 일치해야 합니다.",
|
||||
"spool.fieldsHelp.usedWeight": "스풀에서 사용된 필라멘트 양입니다. 새 스풀은 사용량이 0g이어야 합니다.",
|
||||
"spool.form.measurementType.length": "길이",
|
||||
"spool.form.measurementType.weight": "중량",
|
||||
"spool.spool": "스풀",
|
||||
"unknown": "모름",
|
||||
"vendor.fields.comment": "주석",
|
||||
"vendor.fields.emptySpoolWeight": "빈 스풀 중량",
|
||||
"vendor.fields.externalId": "외부 ID",
|
||||
"vendor.fields.id": "ID",
|
||||
"vendor.fields.name": "이름",
|
||||
"vendor.fields.registered": "등록됨",
|
||||
"vendor.fieldsHelp.emptySpoolWeight": "이 제조사의 빈 스풀 중량.",
|
||||
"yes": "네"
|
||||
}
|
||||
@@ -0,0 +1,146 @@
|
||||
{
|
||||
"buttons.archive": "Archyvas",
|
||||
"buttons.cancel": "Atšaukti",
|
||||
"buttons.clear": "Išvalyti",
|
||||
"buttons.delete": "Šalinti",
|
||||
"buttons.edit": "Redaguoti",
|
||||
"buttons.filter": "Filtras",
|
||||
"buttons.save": "Išsaugoti",
|
||||
"buttons.showArchived": "Rodyti archyvuotus",
|
||||
"buttons.unArchive": "Išarchyvuoti",
|
||||
"documentTitle.locations.list": "Vieta | Spoolman",
|
||||
"filament.fields.articleNumber": "Gaminio numeris",
|
||||
"filament.fields.coaxial": "Koekstruduotas",
|
||||
"filament.fields.colorHex": "Spalva",
|
||||
"filament.fields.comment": "Komentaras",
|
||||
"filament.fields.density": "Tankis",
|
||||
"filament.fields.diameter": "Skersmuo",
|
||||
"filament.fields.externalId": "Išorinis ID",
|
||||
"filament.fields.id": "ID",
|
||||
"filament.fields.longitudinal": "Išilginis",
|
||||
"filament.fields.material": "Medžiaga",
|
||||
"filament.fields.multiColor": "Daugiaspalvis",
|
||||
"filament.fields.name": "Pavadinimas",
|
||||
"filament.fields.price": "Kaina",
|
||||
"filament.fields.registered": "Registruota",
|
||||
"filament.fields.settingsBedTemp": "Pado temperatūra",
|
||||
"filament.fields.settingsExtruderTemp": "Ekstruderio temperatūra",
|
||||
"filament.fields.singleColor": "Viena",
|
||||
"filament.fields.spoolWeight": "Ritės svoris",
|
||||
"filament.fields.vendor": "Gamintojas",
|
||||
"filament.fields.weight": "Svoris",
|
||||
"filament.fieldsHelp.articleNumber": "Pvz. EAN, UPC, ir tt.",
|
||||
"filament.fieldsHelp.multiColorDirection": "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.",
|
||||
"filament.fieldsHelp.spoolWeight": "Tuščios ritės svoris. Naudojamas išmatuotam ritės svoriui nustatyti.",
|
||||
"filament.fieldsHelp.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.",
|
||||
"filament.filament": "Gijos",
|
||||
"help.help": "Pagalba",
|
||||
"kofi": "Paremk mane Ko-fi",
|
||||
"loading": "Kraunasi",
|
||||
"locations.locations": "Vietos",
|
||||
"locations.newLocation": "Nauja vieta",
|
||||
"locations.noLocation": "Be vietos",
|
||||
"locations.noLocationsHelp": "Šiame puslapyje galite tvarkyti rites pagal vietas, pridėkite keletą ričių, kad pradėtumėte!",
|
||||
"no": "Ne",
|
||||
"notifications.error": "Klaida (kodas: {{statusCode}})",
|
||||
"notifications.saveSuccessful": "Įrašytaa sėkmingai!",
|
||||
"printing.generic.columns": "Stulpeliai",
|
||||
"printing.generic.customSize": "Tinkintas",
|
||||
"printing.generic.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.",
|
||||
"printing.generic.dimensions": "Matmenys",
|
||||
"printing.generic.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.",
|
||||
"printing.generic.helpPrinterMargin": "Saugios zonos nustatymas turėtų atitikti spausdinimo atstumą nuo popieriaus krašto. Šios zonos keitimas neturės įtakos visam tinkleliui.",
|
||||
"printing.generic.horizontalSpacing": "Horizontalūs tarpai",
|
||||
"printing.generic.itemCopies": "Elemento kopijos",
|
||||
"printing.generic.marginBottom": "Apatinė paraštė",
|
||||
"printing.generic.marginLeft": "Kairioji paraštė",
|
||||
"printing.generic.marginRight": "Dešinioji paraštė",
|
||||
"printing.generic.marginTop": "Viršutinė paraštė",
|
||||
"printing.generic.paperSize": "Popieriaus dydis",
|
||||
"printing.generic.printerMarginBottom": "Saugi zona apačioje",
|
||||
"printing.generic.printerMarginLeft": "Saugi zona kairėje",
|
||||
"printing.generic.printerMarginRight": "Saugi zona dešinėje",
|
||||
"printing.generic.printerMarginTop": "Saugi zona viršuje",
|
||||
"printing.generic.saveAsImage": "Įrašyti kaip paveikslėlį",
|
||||
"printing.generic.skipItems": "Praleisti elementus",
|
||||
"printing.generic.verticalSpacing": "Vertikalūs tarpai",
|
||||
"printing.qrcode.button": "Spausdinti etiketes",
|
||||
"printing.qrcode.useHTTPUrl.label": "QR kodo nuoroda",
|
||||
"printing.qrcode.useHTTPUrl.options.default": "Numatytasis",
|
||||
"printing.qrcode.useHTTPUrl.options.url": "URL",
|
||||
"printing.qrcode.useHTTPUrl.preview": "Peržiūra:",
|
||||
"printing.qrcode.useHTTPUrl.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.",
|
||||
"printing.spoolSelect.selectedTotal_few": "{{count}} ritės pasirinktos",
|
||||
"printing.spoolSelect.selectedTotal_one": "{{count}} ritė pasirinkta",
|
||||
"printing.spoolSelect.selectedTotal_other": "{{count}} ričių pasirinkta",
|
||||
"scanner.description": "Nuskaitykite Spoolman QR kodą, kad peržiūrėtumėte išsamią informaciją apie ritę.",
|
||||
"scanner.error.insecureContext": "Puslapis neperduodamas per HTTPS.",
|
||||
"scanner.error.notAllowed": "Jūs nesuteikėte leidimo pasiekti kameros.",
|
||||
"scanner.error.notFound": "Nerasta jokios kameros.",
|
||||
"scanner.error.streamApiNotSupported": "Naršyklė nepalaiko „MediaStream“ API.",
|
||||
"scanner.error.unknown": "Įvyko nežinoma klaida. ({{error}})",
|
||||
"scanner.title": "QR kodo skaitytuvas",
|
||||
"settings.extraFields.booleanFalse": "Ne",
|
||||
"settings.extraFields.booleanTrue": "Taip",
|
||||
"settings.extraFields.deleteConfirm": "Šalinti lauką {{name}}?",
|
||||
"settings.extraFields.description.intro": "Čia galite pridėti papildomų pasirinktinių laukų prie savo objektų.",
|
||||
"settings.extraFields.description.constraints": "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.",
|
||||
"settings.extraFields.description.keyUsage": "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.",
|
||||
"settings.extraFields.description.tableViews": "Papildomų laukų negalima rūšiuoti ar filtruoti lentelės rodiniuose.",
|
||||
"settings.extraFields.fieldType.boolean": "Loginis",
|
||||
"settings.extraFields.fieldType.choice": "Pasirinkimas",
|
||||
"settings.extraFields.fieldType.datetime": "Data Laikas",
|
||||
"settings.extraFields.fieldType.float": "Realus skaičius",
|
||||
"settings.extraFields.fieldType.floatRange": "Realūs skaičiai",
|
||||
"settings.extraFields.fieldType.integer": "Skaičius",
|
||||
"settings.extraFields.fieldType.integerRange": "Sveiki skaičiai",
|
||||
"settings.extraFields.fieldType.text": "Tekstas",
|
||||
"settings.extraFields.nonUniqueKeyError": "Raktas turi būti unukalus.",
|
||||
"settings.extraFields.params.choices": "Pasirinkimai",
|
||||
"settings.extraFields.params.defaultValue": "Numatytoji reikšmė",
|
||||
"settings.extraFields.params.fieldType": "Tipas",
|
||||
"settings.extraFields.params.key": "Raktas",
|
||||
"settings.extraFields.params.name": "Pavadinimas",
|
||||
"settings.extraFields.params.order": "Tvarka",
|
||||
"settings.extraFields.params.unit": "Vienetas",
|
||||
"settings.extraFields.tab": "Papildomi laukai",
|
||||
"settings.general.baseUrl.label": "Bazinis URL",
|
||||
"settings.general.baseUrl.tooltip": "Bazinis URL, naudojamas generuojant tokias funkcijas kaip QR kodai.",
|
||||
"settings.general.currency.label": "Valiuta",
|
||||
"settings.general.roundPrices.label": "Apvalinti kainas",
|
||||
"settings.general.roundPrices.tooltip": "Apvalinkite kainas iki artimiausio sveikojo skaičiaus.",
|
||||
"settings.general.tab": "Pagrindiniai",
|
||||
"settings.header": "Nustatymai",
|
||||
"spool.fields.archived": "Archyvuota",
|
||||
"spool.fields.comment": "Komentaras",
|
||||
"spool.fields.filament": "Gija",
|
||||
"spool.fields.firstUsed": "Pirmą kartą panaudota",
|
||||
"spool.fields.id": "ID",
|
||||
"spool.fields.lastUsed": "Paskutinį kartą panaudota",
|
||||
"spool.fields.location": "Vieta",
|
||||
"spool.fields.lotNr": "Lot Nr",
|
||||
"spool.fields.material": "Medžiaga",
|
||||
"spool.fields.measuredWeight": "Išmatuotas svoris",
|
||||
"spool.fields.price": "Kaina",
|
||||
"spool.fields.registered": "Registruota",
|
||||
"spool.fields.remainingWeight": "Likęs svoris",
|
||||
"spool.fields.usedWeight": "Naudotas svoris",
|
||||
"spool.fieldsHelp.location": "Kur yra ritė, jei rites laikote keliose vietose.",
|
||||
"spool.fieldsHelp.lotNr": "Gamintojo partijos numeris. Gali būti naudojamas siekiant užtikrinti, kad spaudinio spalva būtų vienoda, jei naudojamos kelios ritės.",
|
||||
"spool.fieldsHelp.measuredWeight": "Kiek sveria gija ir ritė.",
|
||||
"spool.fieldsHelp.price": "Pilnos ritės kaina. Jei nenustatyta, bus laikoma, kad kaina yra pačios gijos kaina.",
|
||||
"spool.fieldsHelp.remainingWeight": "Kiek gijos liko ant ritės. Naujos ritės svoris turėtų atitikti ritės svorį.",
|
||||
"spool.fieldsHelp.usedWeight": "Kiek plastiko buvo sunaudota iš ritės. Naujoje ritėje turėtų būti sunaudota 0 g.",
|
||||
"spool.form.measurementType.length": "Ilgis",
|
||||
"spool.form.measurementType.weight": "Svoris",
|
||||
"spool.spool": "Ritės",
|
||||
"unknown": "Nežinoma",
|
||||
"vendor.fields.comment": "Komentaras",
|
||||
"vendor.fields.emptySpoolWeight": "Tuščios ritės svoris",
|
||||
"vendor.fields.externalId": "Išorinis ID",
|
||||
"vendor.fields.id": "ID",
|
||||
"vendor.fields.name": "Pavadinimas",
|
||||
"vendor.fields.registered": "Registruota",
|
||||
"vendor.fieldsHelp.emptySpoolWeight": "Tuščios šio gamintojo ritės svoris.",
|
||||
"yes": "Taip"
|
||||
}
|
||||
@@ -0,0 +1,7 @@
|
||||
{
|
||||
"buttons.clear": "Notīrīt",
|
||||
"buttons.delete": "Dzēst",
|
||||
"buttons.edit": "Rediģēt",
|
||||
"buttons.filter": "Filtrēt",
|
||||
"buttons.save": "Saglabāt"
|
||||
}
|
||||
@@ -0,0 +1,145 @@
|
||||
{
|
||||
"buttons.archive": "Arkiver",
|
||||
"buttons.cancel": "Avbryt",
|
||||
"buttons.clear": "Tøm",
|
||||
"buttons.delete": "Slett",
|
||||
"buttons.edit": "Rediger",
|
||||
"buttons.filter": "Filtrer",
|
||||
"buttons.save": "Lagre",
|
||||
"buttons.showArchived": "Vis arkiverte",
|
||||
"buttons.unArchive": "Opphev arkivering",
|
||||
"documentTitle.locations.list": "Lokasjoner | Spoolman",
|
||||
"filament.fields.articleNumber": "Artikkelnummer",
|
||||
"filament.fields.coaxial": "Koaksial",
|
||||
"filament.fields.colorHex": "Farge",
|
||||
"filament.fields.comment": "Kommentar",
|
||||
"filament.fields.density": "Tetthet",
|
||||
"filament.fields.diameter": "Diameter",
|
||||
"filament.fields.externalId": "Ekstern ID",
|
||||
"filament.fields.id": "ID",
|
||||
"filament.fields.longitudinal": "Langsgående",
|
||||
"filament.fields.material": "Materiale",
|
||||
"filament.fields.multiColor": "Flerfarget",
|
||||
"filament.fields.name": "Navn",
|
||||
"filament.fields.price": "Pris",
|
||||
"filament.fields.registered": "Registrert",
|
||||
"filament.fields.settingsBedTemp": "Printplate temp",
|
||||
"filament.fields.settingsExtruderTemp": "Dysetemperatur",
|
||||
"filament.fields.singleColor": "Ensfarget",
|
||||
"filament.fields.spoolWeight": "Spolevekt",
|
||||
"filament.fields.vendor": "Leverandør",
|
||||
"filament.fields.weight": "Vekt",
|
||||
"filament.fieldsHelp.articleNumber": "f.eks. EAN, UPC osv.",
|
||||
"filament.fieldsHelp.multiColorDirection": "Retning av fargeovergang for flerfarget filament.",
|
||||
"filament.fieldsHelp.spoolWeight": "Vekten av en tom spole. Brukes til å bestemme målt vekt på en spole.",
|
||||
"filament.fieldsHelp.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.",
|
||||
"filament.filament": "Filamenter",
|
||||
"help.help": "Hjelp",
|
||||
"kofi": "Gi meg tips på Ko-fi",
|
||||
"loading": "Laster",
|
||||
"locations.locations": "Lokasjoner",
|
||||
"locations.newLocation": "Ny lokasjon",
|
||||
"locations.noLocation": "Ingen lokasjon",
|
||||
"locations.noLocationsHelp": "Denne siden mar deg organisere rullene med filament i lokasjoner. Legg til noen ruller for å starte!",
|
||||
"no": "Nei",
|
||||
"notifications.error": "Feil (statuskode: {{statusCode}})",
|
||||
"notifications.saveSuccessful": "Lagring vellykket!",
|
||||
"printing.generic.columns": "Kolonner",
|
||||
"printing.generic.customSize": "Egendefinert",
|
||||
"printing.generic.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.",
|
||||
"printing.generic.dimensions": "Dimensjoner",
|
||||
"printing.generic.helpMargin": "Margene bør konfigureres til å matche etikettpapiret og skriveren, endring av disse vil påvirke størrelsen på hele rutenettet.",
|
||||
"printing.generic.helpPrinterMargin": "Safe-Zone bør settes til hvor nær papirkanten skriveren kan skrive ut, endring av disse vil ikke påvirke hele rutenettet.",
|
||||
"printing.generic.horizontalSpacing": "Horisontal avstand",
|
||||
"printing.generic.itemCopies": "Antall kopier",
|
||||
"printing.generic.marginBottom": "Bunnmarg",
|
||||
"printing.generic.marginLeft": "Venstre marg",
|
||||
"printing.generic.marginRight": "Høyremarg",
|
||||
"printing.generic.marginTop": "Toppmarg",
|
||||
"printing.generic.paperSize": "Papirstørrelse",
|
||||
"printing.generic.printerMarginBottom": "Trygghetsavstand, bunn",
|
||||
"printing.generic.printerMarginLeft": "Trygghetsavstand, venstre",
|
||||
"printing.generic.printerMarginRight": "Trygghetsavstand, høyre",
|
||||
"printing.generic.printerMarginTop": "Trygghetsavstand, topp",
|
||||
"printing.generic.saveAsImage": "Lagre som bilde",
|
||||
"printing.generic.skipItems": "Hopp over elementer",
|
||||
"printing.generic.verticalSpacing": "Vertikal avstand",
|
||||
"printing.qrcode.button": "Skriv ut etiketter",
|
||||
"printing.qrcode.useHTTPUrl.label": "QR-kodelenke",
|
||||
"printing.qrcode.useHTTPUrl.options.default": "Standard",
|
||||
"printing.qrcode.useHTTPUrl.options.url": "URL",
|
||||
"printing.qrcode.useHTTPUrl.preview": "Forhåndsvisning:",
|
||||
"printing.qrcode.useHTTPUrl.tooltip": "Velg om QR-koden skal bruke HTTP- eller intern URL.",
|
||||
"printing.spoolSelect.selectedTotal_one": "{{count}} spole valgt",
|
||||
"printing.spoolSelect.selectedTotal_other": "{{count}} spoler valgt",
|
||||
"scanner.description": "Skann en Spoolman QR-kode for å se detaljer om spolen.",
|
||||
"scanner.error.insecureContext": "Siden serveres ikke over HTTPS.",
|
||||
"scanner.error.notAllowed": "Du har ikke gitt tilgang til kameraet.",
|
||||
"scanner.error.notFound": "Fant ingen kameraer.",
|
||||
"scanner.error.streamApiNotSupported": "Nettleseren støtter ikke MediaStream API.",
|
||||
"scanner.error.unknown": "Ukjent feil. {{error}}",
|
||||
"scanner.title": "QR-kodeskanner",
|
||||
"settings.extraFields.booleanFalse": "Nei",
|
||||
"settings.extraFields.booleanTrue": "Ja",
|
||||
"settings.extraFields.deleteConfirm": "Slette felt {{name}}?",
|
||||
"settings.extraFields.description.intro": "Her kan du legge til ekstra tilpassede felt til enhetene dine.",
|
||||
"settings.extraFields.description.constraints": "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.",
|
||||
"settings.extraFields.description.keyUsage": "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.",
|
||||
"settings.extraFields.description.tableViews": "Ekstra felt kan ikke sorteres eller filtreres i tabellvisningene.",
|
||||
"settings.extraFields.fieldType.boolean": "Ja/Nei",
|
||||
"settings.extraFields.fieldType.choice": "Valg",
|
||||
"settings.extraFields.fieldType.datetime": "Dato/Tid",
|
||||
"settings.extraFields.fieldType.float": "Desimaltall",
|
||||
"settings.extraFields.fieldType.floatRange": "Desimalområde",
|
||||
"settings.extraFields.fieldType.integer": "Heltall",
|
||||
"settings.extraFields.fieldType.integerRange": "Heltallsområde",
|
||||
"settings.extraFields.fieldType.text": "Tekst",
|
||||
"settings.extraFields.nonUniqueKeyError": "Nøkkelen må være unik.",
|
||||
"settings.extraFields.params.choices": "Valg",
|
||||
"settings.extraFields.params.defaultValue": "Standardverdi",
|
||||
"settings.extraFields.params.fieldType": "Felttype",
|
||||
"settings.extraFields.params.key": "Nøkkel",
|
||||
"settings.extraFields.params.name": "Navn",
|
||||
"settings.extraFields.params.order": "Rekkefølge",
|
||||
"settings.extraFields.params.unit": "Enhet",
|
||||
"settings.extraFields.tab": "Ekstra felt",
|
||||
"settings.general.baseUrl.label": "Base-URL",
|
||||
"settings.general.baseUrl.tooltip": "URL som brukes ved generering av QR-koder og eksterne lenker.",
|
||||
"settings.general.currency.label": "Valuta",
|
||||
"settings.general.roundPrices.label": "Avrund priser",
|
||||
"settings.general.roundPrices.tooltip": "Runder priser til nærmeste hele verdi.",
|
||||
"settings.general.tab": "Generelt",
|
||||
"settings.header": "Innstillinger",
|
||||
"spool.fields.archived": "Arkivert",
|
||||
"spool.fields.comment": "Kommentar",
|
||||
"spool.fields.filament": "Filament",
|
||||
"spool.fields.firstUsed": "Først brukt",
|
||||
"spool.fields.id": "ID",
|
||||
"spool.fields.lastUsed": "Sist brukt",
|
||||
"spool.fields.location": "Lokasjon",
|
||||
"spool.fields.lotNr": "Batch Nr",
|
||||
"spool.fields.material": "Materiale",
|
||||
"spool.fields.measuredWeight": "Målt vekt",
|
||||
"spool.fields.price": "Pris",
|
||||
"spool.fields.registered": "Registrert",
|
||||
"spool.fields.remainingWeight": "Gjenstående vekt",
|
||||
"spool.fields.usedWeight": "Brukt vekt",
|
||||
"spool.fieldsHelp.location": "Hvor spolen er plassert hvis du har flere lokasjoner hvor du oppbevarer spoler.",
|
||||
"spool.fieldsHelp.lotNr": "Produsentens batch nummer. Kan bli benyttet or å verifiserer at print har en konsistent farge dersom flere spoler benyttes.",
|
||||
"spool.fieldsHelp.measuredWeight": "Hvor mye veier filament og spole.",
|
||||
"spool.fieldsHelp.price": "Pris på en full spole. Hvis ikke satt, vil prisen på filamentet bli antatt i stedet.",
|
||||
"spool.fieldsHelp.remainingWeight": "Hvor mye filament gjenstår på spolen. Ved en ny spole burde dette stemme med spolevekt.",
|
||||
"spool.fieldsHelp.usedWeight": "Hvor mye filament har blitt benyttet fra spolen? En ny spole burde ha 0g benyttet.",
|
||||
"spool.form.measurementType.length": "Lengde",
|
||||
"spool.form.measurementType.weight": "Vekt",
|
||||
"spool.spool": "Spoler",
|
||||
"unknown": "Ukjent",
|
||||
"vendor.fields.comment": "Kommentar",
|
||||
"vendor.fields.emptySpoolWeight": "Tom spolevekt",
|
||||
"vendor.fields.externalId": "Ekstern ID",
|
||||
"vendor.fields.id": "ID",
|
||||
"vendor.fields.name": "Navn",
|
||||
"vendor.fields.registered": "Registrert",
|
||||
"vendor.fieldsHelp.emptySpoolWeight": "Vekten av en tom spole for denne leverandøren.",
|
||||
"yes": "Ja"
|
||||
}
|
||||
@@ -0,0 +1,145 @@
|
||||
{
|
||||
"buttons.archive": "Archiveren",
|
||||
"buttons.cancel": "Annuleren",
|
||||
"buttons.clear": "Wissen",
|
||||
"buttons.delete": "Verwijderen",
|
||||
"buttons.edit": "Bewerken",
|
||||
"buttons.filter": "Filter",
|
||||
"buttons.save": "Opslaan",
|
||||
"buttons.showArchived": "Gearchiveerd tonen",
|
||||
"buttons.unArchive": "Terugzetten",
|
||||
"documentTitle.locations.list": "Locaties | Spoolman",
|
||||
"filament.fields.articleNumber": "Artikel nummer",
|
||||
"filament.fields.coaxial": "Gecoëxtrudeerde",
|
||||
"filament.fields.colorHex": "Kleur",
|
||||
"filament.fields.comment": "Opmerking",
|
||||
"filament.fields.density": "Dichtheid",
|
||||
"filament.fields.diameter": "Diameter",
|
||||
"filament.fields.externalId": "Extern ID",
|
||||
"filament.fields.id": "ID",
|
||||
"filament.fields.longitudinal": "Longitudinaal",
|
||||
"filament.fields.material": "Materiaal",
|
||||
"filament.fields.multiColor": "Meervoudig",
|
||||
"filament.fields.name": "Naam",
|
||||
"filament.fields.price": "Prijs",
|
||||
"filament.fields.registered": "Geregistreerd",
|
||||
"filament.fields.settingsBedTemp": "Bed temperatuur",
|
||||
"filament.fields.settingsExtruderTemp": "Extruder Temperatuur",
|
||||
"filament.fields.singleColor": "Enkel",
|
||||
"filament.fields.spoolWeight": "Gewicht spoel",
|
||||
"filament.fields.vendor": "Fabrikant",
|
||||
"filament.fields.weight": "Gewicht",
|
||||
"filament.fieldsHelp.articleNumber": "Bv. EAN. UPC, enz.",
|
||||
"filament.fieldsHelp.multiColorDirection": "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.",
|
||||
"filament.fieldsHelp.spoolWeight": "Het gewicht van een lege spoel. Wordt gebruikt om het gemeten gewicht van een spoel te bepalen.",
|
||||
"filament.fieldsHelp.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.",
|
||||
"filament.filament": "Filamenten",
|
||||
"help.help": "Help",
|
||||
"kofi": "Tip mij op Ko-fi",
|
||||
"loading": "Laden",
|
||||
"locations.locations": "Locaties",
|
||||
"locations.newLocation": "Nieuwe locatie",
|
||||
"locations.noLocation": "Geen locatie",
|
||||
"locations.noLocationsHelp": "Op deze pagina kunt u uw spoelen op verschillende locaties ordenen. Voeg spoelen toe om aan de slag te gaan!",
|
||||
"no": "Nee",
|
||||
"notifications.error": "Fout (fout code {{statusCode}})",
|
||||
"notifications.saveSuccessful": "Succesvol opgeslagen!",
|
||||
"printing.generic.columns": "Kolommen",
|
||||
"printing.generic.customSize": "Aangepast",
|
||||
"printing.generic.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.",
|
||||
"printing.generic.dimensions": "Afmetingen",
|
||||
"printing.generic.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.",
|
||||
"printing.generic.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.",
|
||||
"printing.generic.horizontalSpacing": "Horizontale afstand",
|
||||
"printing.generic.itemCopies": "Itemkopieën",
|
||||
"printing.generic.marginBottom": "Onderste marge",
|
||||
"printing.generic.marginLeft": "Linker marge",
|
||||
"printing.generic.marginRight": "Rechter marge",
|
||||
"printing.generic.marginTop": "Bovenste marge",
|
||||
"printing.generic.paperSize": "Papierformaat",
|
||||
"printing.generic.printerMarginBottom": "Onderste Safe-Zone",
|
||||
"printing.generic.printerMarginLeft": "Linker Safe-Zone",
|
||||
"printing.generic.printerMarginRight": "Rechter Safe-Zone",
|
||||
"printing.generic.printerMarginTop": "Bovenste Safe-Zone",
|
||||
"printing.generic.saveAsImage": "Opslaan als afbeelding",
|
||||
"printing.generic.skipItems": "Items overslaan",
|
||||
"printing.generic.verticalSpacing": "Verticale afstand",
|
||||
"printing.qrcode.button": "Labels afdrukken",
|
||||
"printing.qrcode.useHTTPUrl.label": "QR-codelink",
|
||||
"printing.qrcode.useHTTPUrl.options.default": "Standaard",
|
||||
"printing.qrcode.useHTTPUrl.options.url": "URL",
|
||||
"printing.qrcode.useHTTPUrl.preview": "Voorbeeld:",
|
||||
"printing.qrcode.useHTTPUrl.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.",
|
||||
"printing.spoolSelect.selectedTotal_one": "{{count}} spoel geselecteerd",
|
||||
"printing.spoolSelect.selectedTotal_other": "{{count}} spoelen geselecteerd",
|
||||
"scanner.description": "Scan een Spoolman QR-Code om details van de spoel te tonen.",
|
||||
"scanner.error.insecureContext": "De pagina wordt niet weergegeven via HTTPS.",
|
||||
"scanner.error.notAllowed": "Je hebt geen toegang tot de camera verleend.",
|
||||
"scanner.error.notFound": "Geen camera gevonden.",
|
||||
"scanner.error.streamApiNotSupported": "De browser ondersteunt de MediaStream API niet.",
|
||||
"scanner.error.unknown": "Er is een onbekende fout opgetreden. ({{error}})",
|
||||
"scanner.title": "QR-Code scanner",
|
||||
"settings.extraFields.booleanFalse": "Nee",
|
||||
"settings.extraFields.booleanTrue": "Ja",
|
||||
"settings.extraFields.deleteConfirm": "Veld {{name}} verwijderen?",
|
||||
"settings.extraFields.description.intro": "Hier kunt u extra aangepaste velden toevoegen aan uw entiteiten.",
|
||||
"settings.extraFields.description.constraints": "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.",
|
||||
"settings.extraFields.description.keyUsage": "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.",
|
||||
"settings.extraFields.description.tableViews": "Extra velden kunnen niet worden gesorteerd of gefilterd in de tabelweergaven.",
|
||||
"settings.extraFields.fieldType.boolean": "Booleaanse waarde",
|
||||
"settings.extraFields.fieldType.choice": "Keuze",
|
||||
"settings.extraFields.fieldType.datetime": "Datum/tijd",
|
||||
"settings.extraFields.fieldType.float": "Kommagetal",
|
||||
"settings.extraFields.fieldType.floatRange": "Bereik van kommagetallen",
|
||||
"settings.extraFields.fieldType.integer": "Gehele getallen",
|
||||
"settings.extraFields.fieldType.integerRange": "Bereik van gehele getallen",
|
||||
"settings.extraFields.fieldType.text": "Tekst",
|
||||
"settings.extraFields.nonUniqueKeyError": "De key moet uniek zijn.",
|
||||
"settings.extraFields.params.choices": "Keuzes",
|
||||
"settings.extraFields.params.defaultValue": "Standaardwaarde",
|
||||
"settings.extraFields.params.fieldType": "Type",
|
||||
"settings.extraFields.params.key": "Key",
|
||||
"settings.extraFields.params.name": "Naam",
|
||||
"settings.extraFields.params.order": "Volgorde",
|
||||
"settings.extraFields.params.unit": "Eenheid",
|
||||
"settings.extraFields.tab": "Extra velden",
|
||||
"settings.general.baseUrl.label": "Basis-URL",
|
||||
"settings.general.baseUrl.tooltip": "De basis-URL die moet worden gebruikt bij het genereren van functies zoals QR-codes.",
|
||||
"settings.general.currency.label": "Valuta",
|
||||
"settings.general.roundPrices.label": "Afgeronde prijzen",
|
||||
"settings.general.roundPrices.tooltip": "Rond prijzen af op het dichtstbijzijnde gehele getal.",
|
||||
"settings.general.tab": "Algemeen",
|
||||
"settings.header": "Instellingen",
|
||||
"spool.fields.archived": "Gearchiveerd",
|
||||
"spool.fields.comment": "Opmerking",
|
||||
"spool.fields.filament": "Filament",
|
||||
"spool.fields.firstUsed": "Eerst gebruikt",
|
||||
"spool.fields.id": "ID",
|
||||
"spool.fields.lastUsed": "Laatst gebruikt",
|
||||
"spool.fields.location": "Locatie",
|
||||
"spool.fields.lotNr": "Lotnummer",
|
||||
"spool.fields.material": "Materiaal",
|
||||
"spool.fields.measuredWeight": "Gemeten gewicht",
|
||||
"spool.fields.price": "Prijs",
|
||||
"spool.fields.registered": "Geregistreerd",
|
||||
"spool.fields.remainingWeight": "Overgebleven gewicht",
|
||||
"spool.fields.usedWeight": "Gebruikt gewicht",
|
||||
"spool.fieldsHelp.location": "Waar de spoel zich bevindt, wanneer er meerdere opslag locaties zijn.",
|
||||
"spool.fieldsHelp.lotNr": "Lotnummer van de fabrikant. Kan worden gebruikt om ervoor te zorgen dat een afdruk een consistente kleur heeft als er meerdere spoelen worden gebruikt.",
|
||||
"spool.fieldsHelp.measuredWeight": "Hoeveel het filament en de spoel wegen.",
|
||||
"spool.fieldsHelp.price": "Prijs van een volledige spoel. Als dit niet wordt ingevuld, wordt in plaats daarvan uitgegaan van de prijs van het filament.",
|
||||
"spool.fieldsHelp.remainingWeight": "Hoeveel filament zit er nog op de spoel. Bij een nieuwe spoel zal dit overeenkomen met het spoelgewicht.",
|
||||
"spool.fieldsHelp.usedWeight": "Hoeveel filament er van de spoel is gebruikt. Op een nieuwe spoel zal 0g gebruikt zijn.",
|
||||
"spool.form.measurementType.length": "Lengte",
|
||||
"spool.form.measurementType.weight": "Gewicht",
|
||||
"spool.spool": "Spoelen",
|
||||
"unknown": "Onbekend",
|
||||
"vendor.fields.comment": "Opmerking",
|
||||
"vendor.fields.emptySpoolWeight": "Gewicht lege spoel",
|
||||
"vendor.fields.externalId": "Extern ID",
|
||||
"vendor.fields.id": "ID",
|
||||
"vendor.fields.name": "Naam",
|
||||
"vendor.fields.registered": "Geregistreerd",
|
||||
"vendor.fieldsHelp.emptySpoolWeight": "Het gewicht van een lege spoel van deze fabrikant.",
|
||||
"yes": "Ja"
|
||||
}
|
||||
@@ -0,0 +1,146 @@
|
||||
{
|
||||
"buttons.archive": "Archiwizuj",
|
||||
"buttons.cancel": "Anuluj",
|
||||
"buttons.clear": "Wyczyść",
|
||||
"buttons.delete": "Usuń",
|
||||
"buttons.edit": "Edytuj",
|
||||
"buttons.filter": "Filtruj",
|
||||
"buttons.save": "Zapisz",
|
||||
"buttons.showArchived": "Pokaż zarchiwizowane",
|
||||
"buttons.unArchive": "Odarchiwizuj",
|
||||
"documentTitle.locations.list": "Lokalizacje | Spoolman",
|
||||
"filament.fields.articleNumber": "Numer artykułu",
|
||||
"filament.fields.coaxial": "Koekstrudowany",
|
||||
"filament.fields.colorHex": "Kolor",
|
||||
"filament.fields.comment": "Komentarz",
|
||||
"filament.fields.density": "Gęstość",
|
||||
"filament.fields.diameter": "Średnica",
|
||||
"filament.fields.externalId": "Zewnętrzne ID",
|
||||
"filament.fields.id": "ID",
|
||||
"filament.fields.longitudinal": "Wzdłużny",
|
||||
"filament.fields.material": "Materiał",
|
||||
"filament.fields.multiColor": "Wielo",
|
||||
"filament.fields.name": "Nazwa",
|
||||
"filament.fields.price": "Cena",
|
||||
"filament.fields.registered": "Zarejestrowano",
|
||||
"filament.fields.settingsBedTemp": "Temperatura stołu",
|
||||
"filament.fields.settingsExtruderTemp": "Temperatura ekstrudera",
|
||||
"filament.fields.singleColor": "Pojedynczy",
|
||||
"filament.fields.spoolWeight": "Waga szpuli",
|
||||
"filament.fields.vendor": "Producent",
|
||||
"filament.fields.weight": "Waga",
|
||||
"filament.fieldsHelp.articleNumber": "Np. EAN, UPC itp.",
|
||||
"filament.fieldsHelp.multiColorDirection": "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.",
|
||||
"filament.fieldsHelp.spoolWeight": "Waga pustej szpuli. Używana do określenia ciężaru szpuli.",
|
||||
"filament.fieldsHelp.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.",
|
||||
"filament.filament": "Filamenty",
|
||||
"help.help": "Pomoc",
|
||||
"kofi": "Daj napiwek na Ko-fi",
|
||||
"loading": "Wczytywanie",
|
||||
"locations.locations": "Lokalizacje",
|
||||
"locations.newLocation": "Nowa lokalizacja",
|
||||
"locations.noLocation": "Brak lokalizacji",
|
||||
"locations.noLocationsHelp": "Ta strona pozwala uporządkować szpule w lokalizacjach, dodaj kilka szpul aby rozpocząć!",
|
||||
"no": "Nie",
|
||||
"notifications.error": "Błąd (kod statusu: {{statusCode}})",
|
||||
"notifications.saveSuccessful": "Pomyślnie zapisano!",
|
||||
"printing.generic.columns": "Kolumny",
|
||||
"printing.generic.customSize": "Niestandardowy",
|
||||
"printing.generic.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.",
|
||||
"printing.generic.dimensions": "Wymiary",
|
||||
"printing.generic.helpMargin": "Marginesy powinny być skonfigurowane tak, aby pasowały do papieru etykietowego i drukarki, ich zmiana wpłynie na rozmiar całej siatki.",
|
||||
"printing.generic.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ę.",
|
||||
"printing.generic.horizontalSpacing": "Poziomy odstęp",
|
||||
"printing.generic.itemCopies": "Skopiuj element",
|
||||
"printing.generic.marginBottom": "Dolny margines",
|
||||
"printing.generic.marginLeft": "Lewy margines",
|
||||
"printing.generic.marginRight": "Prawy margines",
|
||||
"printing.generic.marginTop": "Górny margines",
|
||||
"printing.generic.paperSize": "Rozmiar papieru",
|
||||
"printing.generic.printerMarginBottom": "Bezpieczna strefa od dołu",
|
||||
"printing.generic.printerMarginLeft": "Bezpieczna strefa po lewej",
|
||||
"printing.generic.printerMarginRight": "Bezpieczna strefa po prawej",
|
||||
"printing.generic.printerMarginTop": "Bezpieczna strefa od góry",
|
||||
"printing.generic.saveAsImage": "Zapisz jako obraz",
|
||||
"printing.generic.skipItems": "Pomiń elementy",
|
||||
"printing.generic.verticalSpacing": "Pionowy odstęp",
|
||||
"printing.qrcode.button": "Drukuj etykiety",
|
||||
"printing.qrcode.useHTTPUrl.label": "Link kodu QR",
|
||||
"printing.qrcode.useHTTPUrl.options.default": "Domyślne",
|
||||
"printing.qrcode.useHTTPUrl.options.url": "URL",
|
||||
"printing.qrcode.useHTTPUrl.preview": "Podgląd:",
|
||||
"printing.qrcode.useHTTPUrl.tooltip": "Zostanie użyty link który będzie działał tylko gdy zostanie zeskanowany przez funkcję skanowania Spoolmana (Domyślna opcja). Link URL używa bazowego URL ustawionego w ustawieniach lub aktualnego URL strony jeżeli nie jest ustawiony w ustawieniach.",
|
||||
"printing.spoolSelect.selectedTotal_few": "Wybrano {{count}} szpule",
|
||||
"printing.spoolSelect.selectedTotal_many": "Wybrano {{count}} szpul",
|
||||
"printing.spoolSelect.selectedTotal_one": "Wybrano {{count}} szpulę",
|
||||
"scanner.description": "Zeskanuj kod QR Spoolman, aby wyświetlić szczegółowe informacje o szpuli.",
|
||||
"scanner.error.insecureContext": "Strona nie jest dostarczana przez HTTPS.",
|
||||
"scanner.error.notAllowed": "Nie zezwolono na dostęp do kamery.",
|
||||
"scanner.error.notFound": "Nie znaleziono kamery.",
|
||||
"scanner.error.streamApiNotSupported": "Przeglądarka nie obsługuje API MediaStream.",
|
||||
"scanner.error.unknown": "Wystąpił nieznany błąd. ({{error}})",
|
||||
"scanner.title": "Skaner kodów QR",
|
||||
"settings.extraFields.booleanFalse": "Nie",
|
||||
"settings.extraFields.booleanTrue": "Tak",
|
||||
"settings.extraFields.deleteConfirm": "Usunąć pole {{name}}?",
|
||||
"settings.extraFields.description.intro": "Tutaj możesz dodać dodatkowe pola niestandardowe do swoich podmiotów.",
|
||||
"settings.extraFields.description.constraints": "Po dodaniu pola nie można zmienić jego klucza ani typu, a w przypadku pól typu wyboru nie można usunąć wyborów ani zmienić stanu wielokrotnego wyboru. Jeśli usuniesz pole, powiązane dane dla wszystkich podmiotów zostaną usunięte.",
|
||||
"settings.extraFields.description.keyUsage": "Klucz jest tym, co inne programy odczytują/zapisują jako dane, więc jeśli twoje niestandardowe pole ma być zintegrowane z programem innej firmy, upewnij się, że ustawiłeś je poprawnie. Wartość domyślna jest stosowana tylko do nowych elementów.",
|
||||
"settings.extraFields.description.tableViews": "Dodatkowych pól nie można sortować ani filtrować w widokach tabeli.",
|
||||
"settings.extraFields.fieldType.boolean": "Wartość logiczna",
|
||||
"settings.extraFields.fieldType.choice": "Wybór",
|
||||
"settings.extraFields.fieldType.datetime": "Data i Czas",
|
||||
"settings.extraFields.fieldType.float": "Liczba zmiennoprzecinkowa",
|
||||
"settings.extraFields.fieldType.floatRange": "Zakres",
|
||||
"settings.extraFields.fieldType.integer": "Liczba całkowita",
|
||||
"settings.extraFields.fieldType.integerRange": "Zakres liczb",
|
||||
"settings.extraFields.fieldType.text": "Tekst",
|
||||
"settings.extraFields.nonUniqueKeyError": "Klucz musi być unikalny.",
|
||||
"settings.extraFields.params.choices": "Wybory",
|
||||
"settings.extraFields.params.defaultValue": "Domyślna wartość",
|
||||
"settings.extraFields.params.fieldType": "Typ",
|
||||
"settings.extraFields.params.key": "Klucz",
|
||||
"settings.extraFields.params.name": "Nazwa",
|
||||
"settings.extraFields.params.order": "Kolejność",
|
||||
"settings.extraFields.params.unit": "Jednostka",
|
||||
"settings.extraFields.tab": "Dodatkowe parametry",
|
||||
"settings.general.baseUrl.label": "Bazowy URL",
|
||||
"settings.general.baseUrl.tooltip": "Bazowy URL zostanie użyty podczas generowania QR code oraz w innych funkcjonalnościach.",
|
||||
"settings.general.currency.label": "Waluta",
|
||||
"settings.general.roundPrices.label": "Zaokrąglone ceny",
|
||||
"settings.general.roundPrices.tooltip": "Zaokrąglij ceny do najbliższej liczby całkowitej.",
|
||||
"settings.general.tab": "Ogólne",
|
||||
"settings.header": "Ustawienia",
|
||||
"spool.fields.archived": "Zarchiwizowano",
|
||||
"spool.fields.comment": "Komentarz",
|
||||
"spool.fields.filament": "Filament",
|
||||
"spool.fields.firstUsed": "Pierwsze użycie",
|
||||
"spool.fields.id": "ID",
|
||||
"spool.fields.lastUsed": "Ostatnie użycie",
|
||||
"spool.fields.location": "Lokalizacja",
|
||||
"spool.fields.lotNr": "Numer partii (LOT)",
|
||||
"spool.fields.material": "Materiał",
|
||||
"spool.fields.measuredWeight": "Zmierzona waga",
|
||||
"spool.fields.price": "Cena",
|
||||
"spool.fields.registered": "Zarejestrowano",
|
||||
"spool.fields.remainingWeight": "Pozostała waga",
|
||||
"spool.fields.usedWeight": "Zużyta waga",
|
||||
"spool.fieldsHelp.location": "Wpisz gdzie znajduje się szpula, jeśli masz wiele lokalizacji, w których przechowujesz szpule.",
|
||||
"spool.fieldsHelp.lotNr": "Numer partii producenta. Może być stosowany w celu zapewnienia jednolitego koloru wydruku w przypadku użycia wielu szpul.",
|
||||
"spool.fieldsHelp.measuredWeight": "Waga filamentu i szpuli.",
|
||||
"spool.fieldsHelp.price": "Cena pełnej szpuli. Jeśli nie ustawiona, cena filamentu będzie domyślna.",
|
||||
"spool.fieldsHelp.remainingWeight": "Ile filamentu pozostało na szpuli. W przypadku nowej szpuli powinno to odpowiadać wadze szpuli.",
|
||||
"spool.fieldsHelp.usedWeight": "Podaj ile filamentu użyto ze szpuli. Jeśli jest nowa, podaj 0g użycia.",
|
||||
"spool.form.measurementType.length": "Długość",
|
||||
"spool.form.measurementType.weight": "Waga",
|
||||
"spool.spool": "Szpule",
|
||||
"unknown": "Nieznane",
|
||||
"vendor.fields.comment": "Komentarz",
|
||||
"vendor.fields.emptySpoolWeight": "Waga pustej szpuli",
|
||||
"vendor.fields.externalId": "Zewnętrzne ID",
|
||||
"vendor.fields.id": "ID",
|
||||
"vendor.fields.name": "Nazwa",
|
||||
"vendor.fields.registered": "Zarejestrowano",
|
||||
"vendor.fieldsHelp.emptySpoolWeight": "Waga pustej szpuli od tego producenta.",
|
||||
"yes": "Tak"
|
||||
}
|
||||
@@ -0,0 +1,146 @@
|
||||
{
|
||||
"buttons.archive": "Arquivar",
|
||||
"buttons.cancel": "Cancelar",
|
||||
"buttons.clear": "Limpar",
|
||||
"buttons.delete": "Excluir",
|
||||
"buttons.edit": "Editar",
|
||||
"buttons.filter": "Filtrar",
|
||||
"buttons.save": "Salvar",
|
||||
"buttons.showArchived": "Mostrar Arquivados",
|
||||
"buttons.unArchive": "Desarquivar",
|
||||
"documentTitle.locations.list": "Locais | Spoolman",
|
||||
"filament.fields.articleNumber": "Número do Artigo",
|
||||
"filament.fields.coaxial": "Coextrusada",
|
||||
"filament.fields.colorHex": "Cor",
|
||||
"filament.fields.comment": "Comentário",
|
||||
"filament.fields.density": "Densidade",
|
||||
"filament.fields.diameter": "Diâmetro",
|
||||
"filament.fields.externalId": "ID Externo",
|
||||
"filament.fields.id": "ID",
|
||||
"filament.fields.longitudinal": "Longitudinal",
|
||||
"filament.fields.material": "Material",
|
||||
"filament.fields.multiColor": "Múltiplas",
|
||||
"filament.fields.name": "Nome",
|
||||
"filament.fields.price": "Preço",
|
||||
"filament.fields.registered": "Registrado",
|
||||
"filament.fields.settingsBedTemp": "Temperatura da Mesa",
|
||||
"filament.fields.settingsExtruderTemp": "Temperatura da Extrusora",
|
||||
"filament.fields.singleColor": "Única",
|
||||
"filament.fields.spoolWeight": "Peso do Carretel",
|
||||
"filament.fields.vendor": "Fabricante",
|
||||
"filament.fields.weight": "Peso",
|
||||
"filament.fieldsHelp.articleNumber": "Por exemplo: EAN, UPC, etc.",
|
||||
"filament.fieldsHelp.multiColorDirection": "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.",
|
||||
"filament.fieldsHelp.spoolWeight": "O peso de um carretel vazio. Usado para determinar o peso medido de um carretel.",
|
||||
"filament.fieldsHelp.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.",
|
||||
"filament.filament": "Filamentos",
|
||||
"help.help": "Ajuda",
|
||||
"kofi": "Doe pelo Ko-fi",
|
||||
"loading": "Carregando",
|
||||
"locations.locations": "Locais",
|
||||
"locations.newLocation": "Novo Local",
|
||||
"locations.noLocation": "Sem Local",
|
||||
"locations.noLocationsHelp": "Esta página permite que você organize seus carretéis em locais, adicione alguns carretéis para começar!",
|
||||
"no": "Não",
|
||||
"notifications.error": "Erro (código de status: {{statusCode}})",
|
||||
"notifications.saveSuccessful": "Salvo com sucesso!",
|
||||
"printing.generic.columns": "Colunas",
|
||||
"printing.generic.customSize": "Personalizado",
|
||||
"printing.generic.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.",
|
||||
"printing.generic.dimensions": "Dimensões",
|
||||
"printing.generic.helpMargin": "As margens devem ser configuradas para corresponder às suas etiquetas e impressora. Alterá-las afetará o tamanho de toda a grade.",
|
||||
"printing.generic.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.",
|
||||
"printing.generic.horizontalSpacing": "Espaçamento Horizontal",
|
||||
"printing.generic.itemCopies": "Cópias do Item",
|
||||
"printing.generic.marginBottom": "Margem Inferior",
|
||||
"printing.generic.marginLeft": "Margem Esquerda",
|
||||
"printing.generic.marginRight": "Margem Direita",
|
||||
"printing.generic.marginTop": "Margem Superior",
|
||||
"printing.generic.paperSize": "Tamanho do Papel",
|
||||
"printing.generic.printerMarginBottom": "Zona de Segurança Inferior",
|
||||
"printing.generic.printerMarginLeft": "Zona de Segurança Esquerda",
|
||||
"printing.generic.printerMarginRight": "Zona de Segurança Direita",
|
||||
"printing.generic.printerMarginTop": "Zona de Segurança Superior",
|
||||
"printing.generic.saveAsImage": "Salvar como Imagem",
|
||||
"printing.generic.skipItems": "Pular Itens",
|
||||
"printing.generic.verticalSpacing": "Espaçamento Vertical",
|
||||
"printing.qrcode.button": "Imprimir Etiquetas",
|
||||
"printing.qrcode.useHTTPUrl.label": "Endereço do código QR",
|
||||
"printing.qrcode.useHTTPUrl.options.default": "Padrão",
|
||||
"printing.qrcode.useHTTPUrl.options.url": "URL",
|
||||
"printing.qrcode.useHTTPUrl.preview": "Pré-visualização:",
|
||||
"printing.qrcode.useHTTPUrl.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.",
|
||||
"printing.spoolSelect.selectedTotal_many": "{{count}} carretéis selecionados",
|
||||
"printing.spoolSelect.selectedTotal_one": "{{count}} carretel selecionado",
|
||||
"printing.spoolSelect.selectedTotal_other": "{{count}} carretéis selecionados",
|
||||
"scanner.description": "Escaneie um código QR do Spoolman para ver detalhes sobre o carretel.",
|
||||
"scanner.error.insecureContext": "A página não é servida por HTTPS.",
|
||||
"scanner.error.notAllowed": "Você não deu permissão de acesso à câmera.",
|
||||
"scanner.error.notFound": "Nenhuma câmera foi encontrada.",
|
||||
"scanner.error.streamApiNotSupported": "O navegador não oferece suporte à API MediaStream.",
|
||||
"scanner.error.unknown": "Ocorreu um erro desconhecido. ({{error}})",
|
||||
"scanner.title": "Leitor de Código QR",
|
||||
"settings.extraFields.booleanFalse": "Não",
|
||||
"settings.extraFields.booleanTrue": "Sim",
|
||||
"settings.extraFields.deleteConfirm": "Apagar o campo {{name}}?",
|
||||
"settings.extraFields.description.intro": "Aqui você pode adicionar campos personalizados extras às suas entidades.",
|
||||
"settings.extraFields.description.constraints": "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.",
|
||||
"settings.extraFields.description.keyUsage": "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.",
|
||||
"settings.extraFields.description.tableViews": "Campos extras não podem ser ordenados ou filtrados nas visualizações de tabela.",
|
||||
"settings.extraFields.fieldType.boolean": "Booleano",
|
||||
"settings.extraFields.fieldType.choice": "Opção",
|
||||
"settings.extraFields.fieldType.datetime": "Data e Hora",
|
||||
"settings.extraFields.fieldType.float": "Decimal",
|
||||
"settings.extraFields.fieldType.floatRange": "Intervalo Decimal",
|
||||
"settings.extraFields.fieldType.integer": "Inteiro",
|
||||
"settings.extraFields.fieldType.integerRange": "Intervalo de Inteiros",
|
||||
"settings.extraFields.fieldType.text": "Texto",
|
||||
"settings.extraFields.nonUniqueKeyError": "A chave deve ser única.",
|
||||
"settings.extraFields.params.choices": "Opções",
|
||||
"settings.extraFields.params.defaultValue": "Valor Padrão",
|
||||
"settings.extraFields.params.fieldType": "Tipo",
|
||||
"settings.extraFields.params.key": "Chave",
|
||||
"settings.extraFields.params.name": "Nome",
|
||||
"settings.extraFields.params.order": "Ordem",
|
||||
"settings.extraFields.params.unit": "Unidade",
|
||||
"settings.extraFields.tab": "Campos Extras",
|
||||
"settings.general.baseUrl.label": "URL Base",
|
||||
"settings.general.baseUrl.tooltip": "A URL base a ser usada ao gerar recursos como códigos QR.",
|
||||
"settings.general.currency.label": "Moeda",
|
||||
"settings.general.roundPrices.label": "Arredondar preços",
|
||||
"settings.general.roundPrices.tooltip": "Arredonda os preços para o número inteiro mais próximo.",
|
||||
"settings.general.tab": "Geral",
|
||||
"settings.header": "Configurações",
|
||||
"spool.fields.archived": "Arquivado",
|
||||
"spool.fields.comment": "Comentário",
|
||||
"spool.fields.filament": "Filamento",
|
||||
"spool.fields.firstUsed": "Primeiro Uso",
|
||||
"spool.fields.id": "ID",
|
||||
"spool.fields.lastUsed": "Último Uso",
|
||||
"spool.fields.location": "Localização",
|
||||
"spool.fields.lotNr": "Número do Lote",
|
||||
"spool.fields.material": "Material",
|
||||
"spool.fields.measuredWeight": "Peso Medido",
|
||||
"spool.fields.price": "Preço",
|
||||
"spool.fields.registered": "Registrado",
|
||||
"spool.fields.remainingWeight": "Peso Restante",
|
||||
"spool.fields.usedWeight": "Peso Utilizado",
|
||||
"spool.fieldsHelp.location": "Onde o carretel está localizado se você tiver vários locais onde armazena seus carretéis.",
|
||||
"spool.fieldsHelp.lotNr": "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.",
|
||||
"spool.fieldsHelp.measuredWeight": "Quanto pesa o filamento e o carretel.",
|
||||
"spool.fieldsHelp.price": "Preço de um carretel cheio. Se não for definido, o preço do filamento será assumido.",
|
||||
"spool.fieldsHelp.remainingWeight": "Quanto filamento resta no carretel. Para um carretel novo, isso deve corresponder ao peso do carretel.",
|
||||
"spool.fieldsHelp.usedWeight": "Quanto filamento foi usado do carretel. Um novo carretel deve ter 0g usado.",
|
||||
"spool.form.measurementType.length": "Comprimento",
|
||||
"spool.form.measurementType.weight": "Peso",
|
||||
"spool.spool": "Carretéis",
|
||||
"unknown": "Desconhecido",
|
||||
"vendor.fields.comment": "Comentário",
|
||||
"vendor.fields.emptySpoolWeight": "Peso do Carretel Vazio",
|
||||
"vendor.fields.externalId": "ID Externo",
|
||||
"vendor.fields.id": "ID",
|
||||
"vendor.fields.name": "Nome",
|
||||
"vendor.fields.registered": "Registrado",
|
||||
"vendor.fieldsHelp.emptySpoolWeight": "O peso de um carretel vazio deste fabricante.",
|
||||
"yes": "Sim"
|
||||
}
|
||||
@@ -0,0 +1,146 @@
|
||||
{
|
||||
"buttons.archive": "Arquivar",
|
||||
"buttons.cancel": "Cancelar",
|
||||
"buttons.clear": "Limpar",
|
||||
"buttons.delete": "Excluir",
|
||||
"buttons.edit": "Editar",
|
||||
"buttons.filter": "Filtrar",
|
||||
"buttons.save": "Guardar",
|
||||
"buttons.showArchived": "Mostrar Arquivados",
|
||||
"buttons.unArchive": "Desarquivar",
|
||||
"documentTitle.locations.list": "Locais | Spoolman",
|
||||
"filament.fields.articleNumber": "Número do Artigo",
|
||||
"filament.fields.coaxial": "Coextrusado",
|
||||
"filament.fields.colorHex": "Cor",
|
||||
"filament.fields.comment": "Comentário",
|
||||
"filament.fields.density": "Densidade",
|
||||
"filament.fields.diameter": "Diâmetro",
|
||||
"filament.fields.externalId": "ID Externo",
|
||||
"filament.fields.id": "ID",
|
||||
"filament.fields.longitudinal": "Longitudinal",
|
||||
"filament.fields.material": "Material",
|
||||
"filament.fields.multiColor": "Múltiplo",
|
||||
"filament.fields.name": "Nome",
|
||||
"filament.fields.price": "Preço",
|
||||
"filament.fields.registered": "Registrado",
|
||||
"filament.fields.settingsBedTemp": "Temperatura da Mesa",
|
||||
"filament.fields.settingsExtruderTemp": "Temperatura do Bico",
|
||||
"filament.fields.singleColor": "Único",
|
||||
"filament.fields.spoolWeight": "Peso da Bobine",
|
||||
"filament.fields.vendor": "Fabricante",
|
||||
"filament.fields.weight": "Peso",
|
||||
"filament.fieldsHelp.articleNumber": "Por exemplo EAN, UPC, etc.",
|
||||
"filament.fieldsHelp.multiColorDirection": "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.",
|
||||
"filament.fieldsHelp.spoolWeight": "O peso de uma bobine vazia. Usado para determinar o peso medido de uma bobine.",
|
||||
"filament.fieldsHelp.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.",
|
||||
"filament.filament": "Filamentos",
|
||||
"help.help": "Ajuda",
|
||||
"kofi": "Doe no Ko-fi",
|
||||
"loading": "Carregando",
|
||||
"locations.locations": "Locais",
|
||||
"locations.newLocation": "Novo Local",
|
||||
"locations.noLocation": "Sem Local",
|
||||
"locations.noLocationsHelp": "Esta página permite organizar as suas bobines em locais, adicione algumas bobines para começar!",
|
||||
"no": "Não",
|
||||
"notifications.error": "Erro (código de status: {{statusCode}})",
|
||||
"notifications.saveSuccessful": "Guardado com sucesso!",
|
||||
"printing.generic.columns": "Colunas",
|
||||
"printing.generic.customSize": "Personalizado",
|
||||
"printing.generic.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.",
|
||||
"printing.generic.dimensions": "Dimensões",
|
||||
"printing.generic.helpMargin": "As margens devem ser configuradas para corresponder à sua etiqueta de papel e à impressora. Alterá-las afetará o tamanho de toda a grade.",
|
||||
"printing.generic.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.",
|
||||
"printing.generic.horizontalSpacing": "Espaçamento Horizontal",
|
||||
"printing.generic.itemCopies": "Cópias do Artigo",
|
||||
"printing.generic.marginBottom": "Margem Inferior",
|
||||
"printing.generic.marginLeft": "Margem Esquerda",
|
||||
"printing.generic.marginRight": "Margem Direita",
|
||||
"printing.generic.marginTop": "Margem Superior",
|
||||
"printing.generic.paperSize": "Tamanho do Papel",
|
||||
"printing.generic.printerMarginBottom": "Área Segura Inferior",
|
||||
"printing.generic.printerMarginLeft": "Área Segura Esquerda",
|
||||
"printing.generic.printerMarginRight": "Área Segura Direita",
|
||||
"printing.generic.printerMarginTop": "Área Segura Superior",
|
||||
"printing.generic.saveAsImage": "Guardar como Imagem",
|
||||
"printing.generic.skipItems": "Pular Itens",
|
||||
"printing.generic.verticalSpacing": "Espaçamento Vertical",
|
||||
"printing.qrcode.button": "Imprimir Etiquetas",
|
||||
"printing.qrcode.useHTTPUrl.label": "Endereço do Código QR",
|
||||
"printing.qrcode.useHTTPUrl.options.default": "Por omissão",
|
||||
"printing.qrcode.useHTTPUrl.options.url": "Endereço",
|
||||
"printing.qrcode.useHTTPUrl.preview": "Pré-visualização:",
|
||||
"printing.qrcode.useHTTPUrl.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.",
|
||||
"printing.spoolSelect.selectedTotal_many": "{{count}} bobines selecionados",
|
||||
"printing.spoolSelect.selectedTotal_one": "{{count}} bobine selecionado",
|
||||
"printing.spoolSelect.selectedTotal_other": "{{count}} bobines selecionados",
|
||||
"scanner.description": "Digitalize um código QR do Spoolman para ver detalhes sobre a bobine.",
|
||||
"scanner.error.insecureContext": "A página não é protegida por HTTPS.",
|
||||
"scanner.error.notAllowed": "Não deu permissão de acesso à câmara.",
|
||||
"scanner.error.notFound": "Nenhuma câmara foi encontrada.",
|
||||
"scanner.error.streamApiNotSupported": "O navegador não oferece suporte à API MediaStream.",
|
||||
"scanner.error.unknown": "Ocorreu um erro desconhecido. ({{error}})",
|
||||
"scanner.title": "Leitor de Código QR",
|
||||
"settings.extraFields.booleanFalse": "Não",
|
||||
"settings.extraFields.booleanTrue": "Sim",
|
||||
"settings.extraFields.deleteConfirm": "Apagar o campo {{name}}?",
|
||||
"settings.extraFields.description.intro": "Aqui pode adicionar campos personalizados extras às suas entidades.",
|
||||
"settings.extraFields.description.constraints": "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.",
|
||||
"settings.extraFields.description.keyUsage": "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.",
|
||||
"settings.extraFields.description.tableViews": "Campos extras não podem ser ordenados ou filtrados nas visualizações de tabela.",
|
||||
"settings.extraFields.fieldType.boolean": "Booleano",
|
||||
"settings.extraFields.fieldType.choice": "Opção",
|
||||
"settings.extraFields.fieldType.datetime": "Date e Hora",
|
||||
"settings.extraFields.fieldType.float": "Decimal",
|
||||
"settings.extraFields.fieldType.floatRange": "Intervalo Decimal",
|
||||
"settings.extraFields.fieldType.integer": "Inteiro",
|
||||
"settings.extraFields.fieldType.integerRange": "Intervalo Inteiro",
|
||||
"settings.extraFields.fieldType.text": "Texto",
|
||||
"settings.extraFields.nonUniqueKeyError": "A chave deve ser única.",
|
||||
"settings.extraFields.params.choices": "Opções",
|
||||
"settings.extraFields.params.defaultValue": "Valor Padrão",
|
||||
"settings.extraFields.params.fieldType": "Tipo",
|
||||
"settings.extraFields.params.key": "Chave",
|
||||
"settings.extraFields.params.name": "Nome",
|
||||
"settings.extraFields.params.order": "Ordem",
|
||||
"settings.extraFields.params.unit": "Unidade",
|
||||
"settings.extraFields.tab": "Campos Extras",
|
||||
"settings.general.baseUrl.label": "Endereço Base",
|
||||
"settings.general.baseUrl.tooltip": "O endereço base a utilizar em funcionalidades tais como os códigos QR.",
|
||||
"settings.general.currency.label": "Moeda",
|
||||
"settings.general.roundPrices.label": "Arredondar preços",
|
||||
"settings.general.roundPrices.tooltip": "Arredonda os preços para o número inteiro mais próximo.",
|
||||
"settings.general.tab": "Geral",
|
||||
"settings.header": "Configurações",
|
||||
"spool.fields.archived": "Arquivado",
|
||||
"spool.fields.comment": "Comentário",
|
||||
"spool.fields.filament": "Filamento",
|
||||
"spool.fields.firstUsed": "Primeiro Uso",
|
||||
"spool.fields.id": "ID",
|
||||
"spool.fields.lastUsed": "Último Uso",
|
||||
"spool.fields.location": "Localização",
|
||||
"spool.fields.lotNr": "Número do Lote",
|
||||
"spool.fields.material": "Material",
|
||||
"spool.fields.measuredWeight": "Peso Medido",
|
||||
"spool.fields.price": "Preço",
|
||||
"spool.fields.registered": "Registrado",
|
||||
"spool.fields.remainingWeight": "Peso Restante",
|
||||
"spool.fields.usedWeight": "Peso Utilizado",
|
||||
"spool.fieldsHelp.location": "Onde a bobine está localizado se tiver vários locais onde armazena as suas bobines.",
|
||||
"spool.fieldsHelp.lotNr": "Número de lote do fabricante. Pode ser usado para garantir que uma impressão tenha cores consistentes se várias bobines forem usadas.",
|
||||
"spool.fieldsHelp.measuredWeight": "Quanto pesa o filamento e a bobine.",
|
||||
"spool.fieldsHelp.price": "Preço de uma bobine completa na moeda definida no sistema. Se não for definido, o preço do filamento será presumido.",
|
||||
"spool.fieldsHelp.remainingWeight": "Quanto filamento resta na bobine. Para uma bobine nova, deve corresponder ao peso da bobine.",
|
||||
"spool.fieldsHelp.usedWeight": "Quanto filamento foi usado da bobine. Uma nova bobine deve ter usado 0g.",
|
||||
"spool.form.measurementType.length": "Comprimento",
|
||||
"spool.form.measurementType.weight": "Peso",
|
||||
"spool.spool": "Bobines",
|
||||
"unknown": "Desconhecido",
|
||||
"vendor.fields.comment": "Comentário",
|
||||
"vendor.fields.emptySpoolWeight": "Peso da Bobine Vazia",
|
||||
"vendor.fields.externalId": "ID Externo",
|
||||
"vendor.fields.id": "ID",
|
||||
"vendor.fields.name": "Nome",
|
||||
"vendor.fields.registered": "Registrado",
|
||||
"vendor.fieldsHelp.emptySpoolWeight": "O peso da bobine vazia do fabricante.",
|
||||
"yes": "Sim"
|
||||
}
|
||||
@@ -0,0 +1,146 @@
|
||||
{
|
||||
"buttons.archive": "arhiveaza",
|
||||
"buttons.cancel": "anuleaza",
|
||||
"buttons.clear": "Șterge",
|
||||
"buttons.delete": "Șterge",
|
||||
"buttons.edit": "editeaza",
|
||||
"buttons.filter": "filtreaza",
|
||||
"buttons.save": "salveaza",
|
||||
"buttons.showArchived": "Arata arhivate",
|
||||
"buttons.unArchive": "dezarhiveaza",
|
||||
"documentTitle.locations.list": "Zone | Spoolman",
|
||||
"filament.fields.articleNumber": "Numarul articolului",
|
||||
"filament.fields.coaxial": "Co-extrudat",
|
||||
"filament.fields.colorHex": "Culoare",
|
||||
"filament.fields.comment": "Comentariu",
|
||||
"filament.fields.density": "Densitate",
|
||||
"filament.fields.diameter": "Diametru",
|
||||
"filament.fields.externalId": "ID extern",
|
||||
"filament.fields.id": "ID",
|
||||
"filament.fields.longitudinal": "Longitudinal",
|
||||
"filament.fields.material": "Material",
|
||||
"filament.fields.multiColor": "Multi",
|
||||
"filament.fields.name": "Nume",
|
||||
"filament.fields.price": "Preț",
|
||||
"filament.fields.registered": "Înregistrat",
|
||||
"filament.fields.settingsBedTemp": "Temperatura patului",
|
||||
"filament.fields.settingsExtruderTemp": "Temperatura extruderului",
|
||||
"filament.fields.singleColor": "Unică",
|
||||
"filament.fields.spoolWeight": "Greutatea bobinei",
|
||||
"filament.fields.vendor": "Producător",
|
||||
"filament.fields.weight": "Greutate",
|
||||
"filament.fieldsHelp.articleNumber": "Ex. EAN, UPC etc.",
|
||||
"filament.fieldsHelp.multiColorDirection": "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.",
|
||||
"filament.fieldsHelp.spoolWeight": "Greutatea unei bobine goale (fara filament). Este folosita pentru a calcula greutatea unei bobine cu filament.",
|
||||
"filament.fieldsHelp.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.",
|
||||
"filament.filament": "Filamente",
|
||||
"help.help": "Ajutor",
|
||||
"kofi": "Doneaza pe Ko-fi",
|
||||
"loading": "Incarca",
|
||||
"locations.locations": "Zone",
|
||||
"locations.newLocation": "Zonă nouă",
|
||||
"locations.noLocation": "Fără zonă",
|
||||
"locations.noLocationsHelp": "Această pagină îți permite să îți organizezi rolele în zone, adaugă câteva role pentru a începe!",
|
||||
"no": "Nu",
|
||||
"notifications.error": "Eroare (Cod: {{statusCode}})",
|
||||
"notifications.saveSuccessful": "Salvare reusita!",
|
||||
"printing.generic.columns": "Coloane",
|
||||
"printing.generic.customSize": "Personalizat",
|
||||
"printing.generic.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.",
|
||||
"printing.generic.dimensions": "Dimensiuni",
|
||||
"printing.generic.helpMargin": "Marginile trebuie configurate pentru a se potrivi cu hârtia de etichetă și imprimanta dvs., modificarea acestora va afecta dimensiunea întregii grile.",
|
||||
"printing.generic.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ă.",
|
||||
"printing.generic.horizontalSpacing": "Spațiere orizontală",
|
||||
"printing.generic.itemCopies": "Copii ale obiectelor",
|
||||
"printing.generic.marginBottom": "Marja de jos",
|
||||
"printing.generic.marginLeft": "Margine stângă",
|
||||
"printing.generic.marginRight": "Marja dreaptă",
|
||||
"printing.generic.marginTop": "Marja superioară",
|
||||
"printing.generic.paperSize": "Dimensiunea hârtiei",
|
||||
"printing.generic.printerMarginBottom": "Safe-Zone jos",
|
||||
"printing.generic.printerMarginLeft": "Safe-Zone stanga",
|
||||
"printing.generic.printerMarginRight": "Safe-Zone dreapta",
|
||||
"printing.generic.printerMarginTop": "Safe-Zone sus",
|
||||
"printing.generic.saveAsImage": "Salvare ca imagine",
|
||||
"printing.generic.skipItems": "Treci peste articole",
|
||||
"printing.generic.verticalSpacing": "Spațiere verticală",
|
||||
"printing.qrcode.button": "Imprimați codurile QR",
|
||||
"printing.qrcode.useHTTPUrl.label": "Link către codul QR",
|
||||
"printing.qrcode.useHTTPUrl.options.default": "Implicit",
|
||||
"printing.qrcode.useHTTPUrl.options.url": "URL",
|
||||
"printing.qrcode.useHTTPUrl.preview": "Previzualizare:",
|
||||
"printing.qrcode.useHTTPUrl.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.",
|
||||
"printing.spoolSelect.selectedTotal_few": "{{count}} bobine selectate",
|
||||
"printing.spoolSelect.selectedTotal_one": "{{count}} bobina selectata",
|
||||
"printing.spoolSelect.selectedTotal_other": "{{count}} bobine selectate",
|
||||
"scanner.description": "Scanati QR code-ul Spoolman pentru detalii.",
|
||||
"scanner.error.insecureContext": "Aceasta pagina nu este servita peste HTTPS.",
|
||||
"scanner.error.notAllowed": "Accesul la camera nu a fost permis.",
|
||||
"scanner.error.notFound": "Nicio camera nu a fost gasita.",
|
||||
"scanner.error.streamApiNotSupported": "Browserul nu suporta MediaStream API.",
|
||||
"scanner.error.unknown": "Eroare necunoscuta. ({{error}})",
|
||||
"scanner.title": "Scanner QR code",
|
||||
"settings.extraFields.booleanFalse": "Nu",
|
||||
"settings.extraFields.booleanTrue": "Da",
|
||||
"settings.extraFields.deleteConfirm": "Ștergi câmpul{{name}}?",
|
||||
"settings.extraFields.description.intro": "Aici poți adăuga câmpuri suplimentare personalizate entităților tale.",
|
||||
"settings.extraFields.description.constraints": "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.",
|
||||
"settings.extraFields.description.keyUsage": "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.",
|
||||
"settings.extraFields.description.tableViews": "Câmpurile suplimentare nu pot fi sortate sau filtrate în tabele.",
|
||||
"settings.extraFields.fieldType.boolean": "Boolean",
|
||||
"settings.extraFields.fieldType.choice": "Selecție",
|
||||
"settings.extraFields.fieldType.datetime": "Dată/timp",
|
||||
"settings.extraFields.fieldType.float": "Număr zecimal",
|
||||
"settings.extraFields.fieldType.floatRange": "Interval de numere zecimale",
|
||||
"settings.extraFields.fieldType.integer": "Întreg",
|
||||
"settings.extraFields.fieldType.integerRange": "Interval întreg",
|
||||
"settings.extraFields.fieldType.text": "Text",
|
||||
"settings.extraFields.nonUniqueKeyError": "Cheia trebuie să fie unică.",
|
||||
"settings.extraFields.params.choices": "Selecții",
|
||||
"settings.extraFields.params.defaultValue": "Valoarea implicită",
|
||||
"settings.extraFields.params.fieldType": "Tip",
|
||||
"settings.extraFields.params.key": "Cheie",
|
||||
"settings.extraFields.params.name": "Nume",
|
||||
"settings.extraFields.params.order": "Stoc",
|
||||
"settings.extraFields.params.unit": "Unitate",
|
||||
"settings.extraFields.tab": "Câmpuri extra",
|
||||
"settings.general.baseUrl.label": "URL de bază",
|
||||
"settings.general.baseUrl.tooltip": "URL-ul de bază care trebuie utilizat atunci când generați caracteristici, cum ar fi codurile QR.",
|
||||
"settings.general.currency.label": "Valută",
|
||||
"settings.general.roundPrices.label": "Prețurile estimative",
|
||||
"settings.general.roundPrices.tooltip": "Prețurile estimative la cel mai apropiat întreg.",
|
||||
"settings.general.tab": "General",
|
||||
"settings.header": "Setări",
|
||||
"spool.fields.archived": "Arhivat",
|
||||
"spool.fields.comment": "Comentariu",
|
||||
"spool.fields.filament": "Filament",
|
||||
"spool.fields.firstUsed": "Prima utilizare",
|
||||
"spool.fields.id": "ID",
|
||||
"spool.fields.lastUsed": "Ultima utilizare",
|
||||
"spool.fields.location": "Locație",
|
||||
"spool.fields.lotNr": "Lot Nr",
|
||||
"spool.fields.material": "Material",
|
||||
"spool.fields.measuredWeight": "Greutate masurata",
|
||||
"spool.fields.price": "Preț",
|
||||
"spool.fields.registered": "Înregistrat",
|
||||
"spool.fields.remainingWeight": "Greutate ramasa",
|
||||
"spool.fields.usedWeight": "Greutate folosita",
|
||||
"spool.fieldsHelp.location": "Locatia in care bobina este stocata.",
|
||||
"spool.fieldsHelp.lotNr": "Numarul de productie al lotului. Poate fi folosit pentru a garanta consistenta culorii, in caz ca mai multe bobine sunt folosite la acelasi print.",
|
||||
"spool.fieldsHelp.measuredWeight": "Greutatea totala a bobinei si filamentului.",
|
||||
"spool.fieldsHelp.price": "Pretul unei bobine. Daca nu e definit, pretul filamentului va fi folosit.",
|
||||
"spool.fieldsHelp.remainingWeight": "Cat filament a ramas pe bobina. Aceasta valoare reprezinta greutatea filamentului de pe bobina respectiva.",
|
||||
"spool.fieldsHelp.usedWeight": "Cat filament a fost folosit de pe bobina respectiva. O bobina noua ar trebui sa aiba 0 grame folosite.",
|
||||
"spool.form.measurementType.length": "Lungime",
|
||||
"spool.form.measurementType.weight": "Greutate",
|
||||
"spool.spool": "Bobine",
|
||||
"unknown": "Necunoscut",
|
||||
"vendor.fields.comment": "Comentariu",
|
||||
"vendor.fields.emptySpoolWeight": "Greutatea rolei goale",
|
||||
"vendor.fields.externalId": "ID extern",
|
||||
"vendor.fields.id": "ID",
|
||||
"vendor.fields.name": "Nume",
|
||||
"vendor.fields.registered": "Înregistrat",
|
||||
"vendor.fieldsHelp.emptySpoolWeight": "Greutatea unei role goale de la acest producător.",
|
||||
"yes": "Da"
|
||||
}
|
||||
@@ -0,0 +1,146 @@
|
||||
{
|
||||
"buttons.archive": "В архив",
|
||||
"buttons.cancel": "Отмена",
|
||||
"buttons.clear": "Очистить",
|
||||
"buttons.delete": "Удалить",
|
||||
"buttons.edit": "Редактировать",
|
||||
"buttons.filter": "Фильтр",
|
||||
"buttons.save": "Сохранить",
|
||||
"buttons.showArchived": "Показать архивные",
|
||||
"buttons.unArchive": "Из архива",
|
||||
"documentTitle.locations.list": "Местоположения | Spoolman",
|
||||
"filament.fields.articleNumber": "Артикул",
|
||||
"filament.fields.coaxial": "Коэкструдированный",
|
||||
"filament.fields.colorHex": "Цвет",
|
||||
"filament.fields.comment": "Комментарий",
|
||||
"filament.fields.density": "Плотность",
|
||||
"filament.fields.diameter": "Диаметр",
|
||||
"filament.fields.externalId": "Внешний ID",
|
||||
"filament.fields.id": "ID",
|
||||
"filament.fields.longitudinal": "Продольный",
|
||||
"filament.fields.material": "Материал",
|
||||
"filament.fields.multiColor": "Многоцветный",
|
||||
"filament.fields.name": "Имя",
|
||||
"filament.fields.price": "Цена",
|
||||
"filament.fields.registered": "Добавлен",
|
||||
"filament.fields.settingsBedTemp": "Температура стола",
|
||||
"filament.fields.settingsExtruderTemp": "Температура экструдера",
|
||||
"filament.fields.singleColor": "Одноцветный",
|
||||
"filament.fields.spoolWeight": "Вес катушки",
|
||||
"filament.fields.vendor": "Производитель",
|
||||
"filament.fields.weight": "Вес",
|
||||
"filament.fieldsHelp.articleNumber": "Например: EAN, UPC, и т.д.",
|
||||
"filament.fieldsHelp.multiColorDirection": "Филаменты могут иметь несколько цветов двумя способами: либо через коэкструзию, как двойные цветные филаменты с постоянными разноцветными участками, либо через продольные изменения цвета, как градиентные филаменты, которые меняют цвет по всей длине катушки.",
|
||||
"filament.fieldsHelp.spoolWeight": "Вес пустой катушки. Используется для определения измеренного веса катушки.",
|
||||
"filament.fieldsHelp.weight": "Вес филамента на полной катушке (вес нетто). Сюда не следует включать вес самой катушки, а только филамента. Это то, что обычно пишут на упаковке.",
|
||||
"filament.filament": "Филаменты",
|
||||
"help.help": "Помощь",
|
||||
"kofi": "Поддержите меня на Ko-fi",
|
||||
"loading": "Загрузка",
|
||||
"locations.locations": "Местоположения",
|
||||
"locations.newLocation": "Новое местоположение",
|
||||
"locations.noLocation": "Нет местоположения",
|
||||
"locations.noLocationsHelp": "Эта страница позволяет организовать катушки по местоположениям. Добавьте несколько катушек, чтобы начать!",
|
||||
"no": "Нет",
|
||||
"notifications.error": "Ошибка (status code: {{statusCode}})",
|
||||
"notifications.saveSuccessful": "Успешное сохранение!",
|
||||
"printing.generic.columns": "Столбцы",
|
||||
"printing.generic.customSize": "Настроить",
|
||||
"printing.generic.description": "Настройте параметры ниже, чтобы получить желаемый макет печати. Имейте в виду, что принтеры и ваша ОС могут применять свои собственные поля и масштабирование, поэтому вам, возможно, придется выполнить несколько проб и ошибок, прежде чем все будет правильно. Прежде чем печатать на этикетках, проверьте это на листе обычной бумаги.",
|
||||
"printing.generic.dimensions": "Размеры",
|
||||
"printing.generic.helpMargin": "Поля должны быть настроены в соответствии с вашей этикеточной бумагой и принтером. Их изменение повлияет на размер всей сетки.",
|
||||
"printing.generic.helpPrinterMargin": "В безопасной зоне должно быть установлено, насколько близко к краю бумаги может печатать ваш принтер. Изменение этих значений не повлияет на всю сетку.",
|
||||
"printing.generic.horizontalSpacing": "Горизонтальный интервал",
|
||||
"printing.generic.itemCopies": "Копии элементов",
|
||||
"printing.generic.marginBottom": "Нижнее поле",
|
||||
"printing.generic.marginLeft": "Левое поле",
|
||||
"printing.generic.marginRight": "Правое поле",
|
||||
"printing.generic.marginTop": "Верхнее поле",
|
||||
"printing.generic.paperSize": "Размер бумаги",
|
||||
"printing.generic.printerMarginBottom": "Безопасная зона снизу",
|
||||
"printing.generic.printerMarginLeft": "Безопасная зона слева",
|
||||
"printing.generic.printerMarginRight": "Безопасная зона справа",
|
||||
"printing.generic.printerMarginTop": "Безопасная зона сверху",
|
||||
"printing.generic.saveAsImage": "Сохранить как изображение",
|
||||
"printing.generic.skipItems": "Пропустить элементы",
|
||||
"printing.generic.verticalSpacing": "Вертикальный интервал",
|
||||
"printing.qrcode.button": "Печать этикеток",
|
||||
"printing.qrcode.useHTTPUrl.label": "Ссылка на QR-код",
|
||||
"printing.qrcode.useHTTPUrl.options.default": "По умолчанию",
|
||||
"printing.qrcode.useHTTPUrl.options.url": "URL",
|
||||
"printing.qrcode.useHTTPUrl.preview": "Предварительный просмотр:",
|
||||
"printing.qrcode.useHTTPUrl.tooltip": "Будет использоваться проприетарная ссылка, которая будет работать только при сканировании через функцию сканирования Spoolman (по умолчанию). URL использует либо базовый URL, указанный в настройках, либо URL текущей страницы, если он не задан.",
|
||||
"printing.spoolSelect.selectedTotal_few": "{{count}} катушки выбрано",
|
||||
"printing.spoolSelect.selectedTotal_many": "{{count}} катушек выбрано",
|
||||
"printing.spoolSelect.selectedTotal_one": "{{count}} катушка выбрана",
|
||||
"scanner.description": "Отсканируйте QR-код Spoolman, чтобы просмотреть подробную информацию о катушке.",
|
||||
"scanner.error.insecureContext": "Страница не обслуживается по протоколу HTTPS.",
|
||||
"scanner.error.notAllowed": "Вы запретили доступ к камере.",
|
||||
"scanner.error.notFound": "Ни одна камера не найдена.",
|
||||
"scanner.error.streamApiNotSupported": "Браузер не поддерживает API MediaStream.",
|
||||
"scanner.error.unknown": "Произошла неизвестная ошибка. ({{error}})",
|
||||
"scanner.title": "Сканер QR-кода",
|
||||
"settings.extraFields.booleanFalse": "Нет",
|
||||
"settings.extraFields.booleanTrue": "Да",
|
||||
"settings.extraFields.deleteConfirm": "Удалить поле {{name}}?",
|
||||
"settings.extraFields.description.intro": "Здесь вы можете добавлять дополнительные пользовательские поля к своим сущностям.",
|
||||
"settings.extraFields.description.constraints": "Как только поле добавлено, вы не можете изменить его ключ или тип, а для полей типа выбора вы не можете удалить варианты или изменить состояние множественного выбора. Если вы удалите поле, связанные данные для всех сущностей будут удалены.",
|
||||
"settings.extraFields.description.keyUsage": "Ключевым моментом является то, как другие программы считывают/записывают данные, поэтому, если предполагается, что ваше пользовательское поле интегрируется со сторонней программой, убедитесь, что оно настроено правильно. Значение по умолчанию применяется только к новым элементам.",
|
||||
"settings.extraFields.description.tableViews": "Дополнительные поля нельзя отсортировать или отфильтровать в табличных представлениях.",
|
||||
"settings.extraFields.fieldType.boolean": "Логический",
|
||||
"settings.extraFields.fieldType.choice": "Выбор",
|
||||
"settings.extraFields.fieldType.datetime": "Дата и время",
|
||||
"settings.extraFields.fieldType.float": "Дробное",
|
||||
"settings.extraFields.fieldType.floatRange": "Дробный диапазон",
|
||||
"settings.extraFields.fieldType.integer": "Целое число",
|
||||
"settings.extraFields.fieldType.integerRange": "Целочисленный диапазон",
|
||||
"settings.extraFields.fieldType.text": "Текст",
|
||||
"settings.extraFields.nonUniqueKeyError": "Ключ должен быть уникальным.",
|
||||
"settings.extraFields.params.choices": "Выбор",
|
||||
"settings.extraFields.params.defaultValue": "Значение по умолчанию",
|
||||
"settings.extraFields.params.fieldType": "Тип",
|
||||
"settings.extraFields.params.key": "Ключ",
|
||||
"settings.extraFields.params.name": "Имя",
|
||||
"settings.extraFields.params.order": "Заказ",
|
||||
"settings.extraFields.params.unit": "Единица измерения",
|
||||
"settings.extraFields.tab": "Дополнительные поля",
|
||||
"settings.general.baseUrl.label": "Базовый URL-адрес",
|
||||
"settings.general.baseUrl.tooltip": "Базовый URL-адрес, используемый при создании таких функций, как QR-коды.",
|
||||
"settings.general.currency.label": "Валюта",
|
||||
"settings.general.roundPrices.label": "Округлять цены",
|
||||
"settings.general.roundPrices.tooltip": "Округлять цены до ближайшего целого числа.",
|
||||
"settings.general.tab": "Общие",
|
||||
"settings.header": "Настройки",
|
||||
"spool.fields.archived": "В архиве",
|
||||
"spool.fields.comment": "Комментарий",
|
||||
"spool.fields.filament": "Филамент",
|
||||
"spool.fields.firstUsed": "Первое использование",
|
||||
"spool.fields.id": "ID",
|
||||
"spool.fields.lastUsed": "Последнее использование",
|
||||
"spool.fields.location": "Расположение",
|
||||
"spool.fields.lotNr": "№ партии",
|
||||
"spool.fields.material": "Материал",
|
||||
"spool.fields.measuredWeight": "Измеренный вес",
|
||||
"spool.fields.price": "Цена",
|
||||
"spool.fields.registered": "Добавлен",
|
||||
"spool.fields.remainingWeight": "Оставшийся вес",
|
||||
"spool.fields.usedWeight": "Использованный вес",
|
||||
"spool.fieldsHelp.location": "Где находится катушка, если у вас есть несколько мест хранения катушек.",
|
||||
"spool.fieldsHelp.lotNr": "Номер партии производителя. Может использоваться для обеспечения однородного цвета печати при использовании нескольких катушек.",
|
||||
"spool.fieldsHelp.measuredWeight": "Сколько весит филамент и катушка.",
|
||||
"spool.fieldsHelp.price": "Цена полной катушки. Если не указано, будет использоваться цена филамента.",
|
||||
"spool.fieldsHelp.remainingWeight": "Сколько филамента осталось на катушке. Для новой катушки этот вес должен соответствовать весу катушки.",
|
||||
"spool.fieldsHelp.usedWeight": "Сколько филамента было использовано с катушки. На новой катушке должно быть использовано 0 г.",
|
||||
"spool.form.measurementType.length": "Длина",
|
||||
"spool.form.measurementType.weight": "Вес",
|
||||
"spool.spool": "Катушки",
|
||||
"unknown": "Неизвестно",
|
||||
"vendor.fields.comment": "Комментарий",
|
||||
"vendor.fields.emptySpoolWeight": "Вес пустой катушки",
|
||||
"vendor.fields.externalId": "Внешний ID",
|
||||
"vendor.fields.id": "ID",
|
||||
"vendor.fields.name": "Имя",
|
||||
"vendor.fields.registered": "Зарегистрирован",
|
||||
"vendor.fieldsHelp.emptySpoolWeight": "Вес пустой катушки от этого производителя.",
|
||||
"yes": "Да"
|
||||
}
|
||||
@@ -0,0 +1,11 @@
|
||||
{
|
||||
"buttons.archive": "Archivovať",
|
||||
"buttons.cancel": "Zrušiť",
|
||||
"buttons.clear": "Vyčistiť",
|
||||
"buttons.delete": "Zmazať",
|
||||
"buttons.edit": "Editovať",
|
||||
"buttons.filter": "Filter",
|
||||
"buttons.save": "Uložiť",
|
||||
"buttons.showArchived": "Zobraziť Archivované",
|
||||
"notifications.error": "Chyba (status code: {{statusCode}})"
|
||||
}
|
||||
@@ -0,0 +1,147 @@
|
||||
{
|
||||
"buttons.archive": "Arhiviraj",
|
||||
"buttons.cancel": "Prekliči",
|
||||
"buttons.clear": "Počisti",
|
||||
"buttons.delete": "Izbriši",
|
||||
"buttons.edit": "Uredi",
|
||||
"buttons.filter": "Filter",
|
||||
"buttons.save": "Shrani",
|
||||
"buttons.showArchived": "Prikaži arhiv",
|
||||
"buttons.unArchive": "Odstrani iz arhiva",
|
||||
"documentTitle.locations.list": "Lokacije | Kolutar",
|
||||
"filament.fields.articleNumber": "Številka izdelka",
|
||||
"filament.fields.coaxial": "Soosno",
|
||||
"filament.fields.colorHex": "Barva",
|
||||
"filament.fields.comment": "Komentar",
|
||||
"filament.fields.density": "Gostota",
|
||||
"filament.fields.diameter": "Premer",
|
||||
"filament.fields.externalId": "Zunanji ID",
|
||||
"filament.fields.id": "ID",
|
||||
"filament.fields.longitudinal": "Vzdolžno",
|
||||
"filament.fields.material": "Material",
|
||||
"filament.fields.multiColor": "Večbarvno",
|
||||
"filament.fields.name": "Ime",
|
||||
"filament.fields.price": "Cena",
|
||||
"filament.fields.registered": "Registrirano",
|
||||
"filament.fields.settingsBedTemp": "Temperatura mize",
|
||||
"filament.fields.settingsExtruderTemp": "Temperatura ekstruderja",
|
||||
"filament.fields.singleColor": "Enobarvno",
|
||||
"filament.fields.spoolWeight": "Masa koluta",
|
||||
"filament.fields.vendor": "Proizvajalec",
|
||||
"filament.fields.weight": "Masa",
|
||||
"filament.fieldsHelp.articleNumber": "Npr. EAN, UPC itd.",
|
||||
"filament.fieldsHelp.multiColorDirection": "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.",
|
||||
"filament.fieldsHelp.spoolWeight": "Masa praznega koluta. Uporablja se za določitev izmerjene mase koluta.",
|
||||
"filament.fieldsHelp.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.",
|
||||
"filament.filament": "Filamenti",
|
||||
"help.help": "Pomoč",
|
||||
"kofi": "Prispevajte na Ko-fi",
|
||||
"loading": "Nalaganje",
|
||||
"locations.locations": "Lokacije",
|
||||
"locations.newLocation": "Nova lokacija",
|
||||
"locations.noLocation": "Brez lokacije",
|
||||
"locations.noLocationsHelp": "Na tej strani lahko kolute razvrstite po lokacijah. Za začetek dodajte nekaj kolutov.",
|
||||
"no": "Ne",
|
||||
"notifications.error": "Napaka (status code: {{statusCode}})",
|
||||
"notifications.saveSuccessful": "Uspešno shranjeno!",
|
||||
"printing.generic.columns": "Stolpci",
|
||||
"printing.generic.customSize": "Po meri",
|
||||
"printing.generic.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.",
|
||||
"printing.generic.dimensions": "Dimenzije",
|
||||
"printing.generic.helpMargin": "Robove je treba nastaviti tako, da ustrezajo papirju za nalepke in tiskalniku; njihova sprememba bo vplivala na velikost celotne mreže.",
|
||||
"printing.generic.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.",
|
||||
"printing.generic.horizontalSpacing": "Vodoraven razmik",
|
||||
"printing.generic.itemCopies": "Kopije elementov",
|
||||
"printing.generic.marginBottom": "Spodnji rob",
|
||||
"printing.generic.marginLeft": "Lev rob",
|
||||
"printing.generic.marginRight": "Desen rob",
|
||||
"printing.generic.marginTop": "Zgornji rob",
|
||||
"printing.generic.paperSize": "Velikost papirja",
|
||||
"printing.generic.printerMarginBottom": "Varno območje spodaj",
|
||||
"printing.generic.printerMarginLeft": "Varno območje levo",
|
||||
"printing.generic.printerMarginRight": "Varno območje desno",
|
||||
"printing.generic.printerMarginTop": "Varno območje zgoraj",
|
||||
"printing.generic.saveAsImage": "Shrani kot sliko",
|
||||
"printing.generic.skipItems": "Preskoči elemente",
|
||||
"printing.generic.verticalSpacing": "Navpičen razmik",
|
||||
"printing.qrcode.button": "Natisni nalepke",
|
||||
"printing.qrcode.useHTTPUrl.label": "Povezava QR kode",
|
||||
"printing.qrcode.useHTTPUrl.options.default": "Privzeto",
|
||||
"printing.qrcode.useHTTPUrl.options.url": "URL",
|
||||
"printing.qrcode.useHTTPUrl.preview": "Predogled:",
|
||||
"printing.qrcode.useHTTPUrl.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.",
|
||||
"printing.spoolSelect.selectedTotal_few": "Izbrani {{count}} koluti",
|
||||
"printing.spoolSelect.selectedTotal_one": "Izbran {{count}} kolut",
|
||||
"printing.spoolSelect.selectedTotal_other": "Izbranih {{count}} kolutov",
|
||||
"printing.spoolSelect.selectedTotal_two": "Izbrana {{count}} koluta",
|
||||
"scanner.description": "Preberite Kolutarjevo QR kodo za ogled podrobnosti o kolutu.",
|
||||
"scanner.error.insecureContext": "Stran ni dostopna prek protokola HTTPS.",
|
||||
"scanner.error.notAllowed": "Niste omogočili dostopa do kamere.",
|
||||
"scanner.error.notFound": "Kamere ni bilo mogoče najti.",
|
||||
"scanner.error.streamApiNotSupported": "Brskalnik ne podpira MediaStream API.",
|
||||
"scanner.error.unknown": "Prišlo je do neznane napake. ({{error}})",
|
||||
"scanner.title": "Čitalnik QR kode",
|
||||
"settings.extraFields.booleanFalse": "Ne",
|
||||
"settings.extraFields.booleanTrue": "Da",
|
||||
"settings.extraFields.deleteConfirm": "Zbrišem polje {{name}}?",
|
||||
"settings.extraFields.description.intro": "Tukaj lahko svojim entitetam dodate dodatna polja po meri.",
|
||||
"settings.extraFields.description.constraints": "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.",
|
||||
"settings.extraFields.description.keyUsage": "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.",
|
||||
"settings.extraFields.description.tableViews": "Dodatna polja ni mogoče razvrstiti ali filtrirati v pogledih tabel.",
|
||||
"settings.extraFields.fieldType.boolean": "Logična vrednost",
|
||||
"settings.extraFields.fieldType.choice": "Izbira",
|
||||
"settings.extraFields.fieldType.datetime": "Datum in čas",
|
||||
"settings.extraFields.fieldType.float": "Decimalno število",
|
||||
"settings.extraFields.fieldType.floatRange": "Območje decimalnih števil",
|
||||
"settings.extraFields.fieldType.integer": "Celo število",
|
||||
"settings.extraFields.fieldType.integerRange": "Območje celih števil",
|
||||
"settings.extraFields.fieldType.text": "Besedilo",
|
||||
"settings.extraFields.nonUniqueKeyError": "Ključ mora biti edinstven.",
|
||||
"settings.extraFields.params.choices": "Izbire",
|
||||
"settings.extraFields.params.defaultValue": "Privzeta vrednost",
|
||||
"settings.extraFields.params.fieldType": "Tip",
|
||||
"settings.extraFields.params.key": "Ključ",
|
||||
"settings.extraFields.params.name": "Ime",
|
||||
"settings.extraFields.params.order": "Zaporedje",
|
||||
"settings.extraFields.params.unit": "Enota",
|
||||
"settings.extraFields.tab": "Dodatna polja",
|
||||
"settings.general.baseUrl.label": "Osnovni URL",
|
||||
"settings.general.baseUrl.tooltip": "Osnoven URL, ki se uporablja pri ustvarjanju elementov, kot npr. QR-kode.",
|
||||
"settings.general.currency.label": "Valuta",
|
||||
"settings.general.roundPrices.label": "Zaokrožene cene",
|
||||
"settings.general.roundPrices.tooltip": "Zaokroži cene na najbližje celo število.",
|
||||
"settings.general.tab": "Splošno",
|
||||
"settings.header": "Nastavitve",
|
||||
"spool.fields.archived": "Arhivirano",
|
||||
"spool.fields.comment": "Komentar",
|
||||
"spool.fields.filament": "Filament",
|
||||
"spool.fields.firstUsed": "Prvič uporabljeno",
|
||||
"spool.fields.id": "ID",
|
||||
"spool.fields.lastUsed": "Zadnjič uporabljeno",
|
||||
"spool.fields.location": "Lokacija",
|
||||
"spool.fields.lotNr": "Št. serije",
|
||||
"spool.fields.material": "Material",
|
||||
"spool.fields.measuredWeight": "Izmerjena masa",
|
||||
"spool.fields.price": "Cena",
|
||||
"spool.fields.registered": "Registrirano",
|
||||
"spool.fields.remainingWeight": "Preostala masa",
|
||||
"spool.fields.usedWeight": "Porabljena masa",
|
||||
"spool.fieldsHelp.location": "Kje se nahaja kolut, če imate več mest za shranjevanje.",
|
||||
"spool.fieldsHelp.lotNr": "Številka serije proizvajalca. Uporablja se za zagotavljanje barvne doslednosti tiska, če se uporablja več kolutov.",
|
||||
"spool.fieldsHelp.measuredWeight": "Koliko tehtata filament in kolut.",
|
||||
"spool.fieldsHelp.price": "Cena polnega koluta. Če ta vrednost ni nastavljena, se namesto nje upošteva cena filamenta.",
|
||||
"spool.fieldsHelp.remainingWeight": "Koliko filamenta je še na kolutu. Pri novem kolutu se ta količina ujema z maso koluta.",
|
||||
"spool.fieldsHelp.usedWeight": "Koliko filamenta je bilo porabljenega s koluta. Pri novem kolutu je vrednost 0 g.",
|
||||
"spool.form.measurementType.length": "Dolžina",
|
||||
"spool.form.measurementType.weight": "Masa",
|
||||
"spool.spool": "Koluti",
|
||||
"unknown": "Neznano",
|
||||
"vendor.fields.comment": "Komentar",
|
||||
"vendor.fields.emptySpoolWeight": "Masa praznega koluta",
|
||||
"vendor.fields.externalId": "Zunanji ID",
|
||||
"vendor.fields.id": "ID",
|
||||
"vendor.fields.name": "Ime",
|
||||
"vendor.fields.registered": "Registrirano",
|
||||
"vendor.fieldsHelp.emptySpoolWeight": "Masa praznega koluta tega proizvajalca.",
|
||||
"yes": "Da"
|
||||
}
|
||||
@@ -0,0 +1,172 @@
|
||||
{
|
||||
"add.addAndNew": "Lägg till och nytt",
|
||||
"add.addN_one": "Lägg till {{count}} spole",
|
||||
"add.addN_other": "Lägg till {{count}} spolar",
|
||||
"add.adding": "Lägger till...",
|
||||
"add.advanced": "Avancerade specifikationer",
|
||||
"add.advancedNote": "densitet, diameter, temperaturer (auto-fylld av materialet)",
|
||||
"add.change": "ändra",
|
||||
"add.count": "Antal",
|
||||
"add.createNew": "Skapa ett nytt filament",
|
||||
"add.createNewSub": "inte i din katalog eller {{name}}",
|
||||
"add.dbUnavailable": "{{name}} otillgänglig",
|
||||
"add.duplicate": "duplicera",
|
||||
"add.duplicateNote": "Parametrar, tillverkare och pris kopierades över. Ge det ett nytt namn och färg.",
|
||||
"add.duplicateRename": "Fortfarande samma namn som originalet - byt namn för att hålla dem isär.",
|
||||
"add.duplicateTitle": "Nytt filament · kopia av \"{{name}}\"",
|
||||
"add.filamentNamePlaceholder": "till exempel PolyTerra Matte Sage",
|
||||
"add.fill.full": "Full",
|
||||
"add.fillLevel": "Fyllnadsnivå",
|
||||
"add.importNote": "Detta filament kommer att läggas till i din katalog när du lägger till spolarna.",
|
||||
"add.inCatalog": "i katalog",
|
||||
"add.locationHint": "Där spolen fysiskt finns - en hylla, en låda eller en skrivare. Lämna det tomt om du håller dem alla på ett ställe.",
|
||||
"add.locationPlaceholder": "till exempel Hylla A, Låda 2, Skrivare 1",
|
||||
"add.manufacturerPlaceholder": "till exempel Polymaker",
|
||||
"add.nameHint": "Inkludera färgnamnet - det är vad som skiljer dina filament ifrån varandra.",
|
||||
"add.newFilament": "nytt filament",
|
||||
"add.newFilamentTitle": "Nytt filament",
|
||||
"add.noCatalog": "Inga filament i din katalog",
|
||||
"add.noManufacturer": "Ingen tillverkare",
|
||||
"add.pickColor": "Välj färg",
|
||||
"add.searchPlaceholder": "Sök i din katalog och {{name}}...",
|
||||
"add.searching": "Söker...",
|
||||
"add.spoolWeightPreset.cardboard": "Kartong {{weight}} g",
|
||||
"add.spoolWeightPreset.plastic": "Plast {{weight}} g",
|
||||
"add.spoolWeightPresetsLead": "Börja med en typisk spole:",
|
||||
"add.step2": "Steg 2 · Spoldetaljer",
|
||||
"add.summary_one": "{{count}} spole",
|
||||
"add.summary_other": "{{count}} spolar",
|
||||
"add.typeToSearchAll": "Skriv för att söka bland tusentals filament",
|
||||
"add.typeToSearchMatches": "Skriv för att söka - inga resultat",
|
||||
"buttons.archive": "Arkivera",
|
||||
"buttons.cancel": "Avbryt",
|
||||
"buttons.clear": "Rensa",
|
||||
"buttons.delete": "Ta bort",
|
||||
"buttons.edit": "Ändra",
|
||||
"buttons.filter": "Filtrera",
|
||||
"buttons.save": "Spara",
|
||||
"buttons.showArchived": "Visa arkiverade",
|
||||
"buttons.unArchive": "Avarkivera",
|
||||
"filament.fields.articleNumber": "Artikelnummer",
|
||||
"filament.fields.coaxial": "Coextruderad",
|
||||
"filament.fields.colorHex": "Färg",
|
||||
"filament.fields.comment": "Kommentar",
|
||||
"filament.fields.density": "Densitet",
|
||||
"filament.fields.diameter": "Diameter",
|
||||
"filament.fields.externalId": "Externt ID",
|
||||
"filament.fields.id": "ID",
|
||||
"filament.fields.longitudinal": "Longitudinell",
|
||||
"filament.fields.material": "Material",
|
||||
"filament.fields.multiColor": "Flerfärgad",
|
||||
"filament.fields.name": "Namn",
|
||||
"filament.fields.price": "Pris",
|
||||
"filament.fields.registered": "Registrerad",
|
||||
"filament.fields.settingsBedTemp": "Bäddtemp",
|
||||
"filament.fields.settingsExtruderTemp": "Extrudertemp",
|
||||
"filament.fields.singleColor": "Enkel",
|
||||
"filament.fields.spoolWeight": "Spolvikt",
|
||||
"filament.fields.vendor": "Tillverkare",
|
||||
"filament.fields.weight": "Vikt",
|
||||
"filament.fieldsHelp.articleNumber": "T.ex. EAN, UPC, etc.",
|
||||
"filament.fieldsHelp.multiColorDirection": "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.",
|
||||
"filament.fieldsHelp.spoolWeight": "Vikten på en tom spole. Används för att beräkna filamentvikten från en vägning.",
|
||||
"filament.fieldsHelp.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.",
|
||||
"filament.filament": "Filament",
|
||||
"help.help": "Hjälp",
|
||||
"kofi": "Dricksa mig på Ko-fi",
|
||||
"loading": "Laddar",
|
||||
"locations.newLocation": "Ny plats",
|
||||
"locations.noLocation": "Ingen plats",
|
||||
"no": "Nej",
|
||||
"notifications.error": "Fel (statuskod: {{statusCode}})",
|
||||
"notifications.saveSuccessful": "Sparning lyckades!",
|
||||
"printing.generic.columns": "Kolumner",
|
||||
"printing.generic.customSize": "Anpassad",
|
||||
"printing.generic.description": "Justera inställningarna nedan för att få önskat utskriftslayout. Kom ihåg att skrivare och ditt operativsystem kan tillämpa sina egna marginaler och skalning, så du kan behöva justera inställningarna därefter. Testa på ett vanligt papper innan du skriver ut på de faktiska etiketterna.",
|
||||
"printing.generic.dimensions": "Dimensioner",
|
||||
"printing.generic.helpMargin": "Marginaler bör konfigureras för att matcha ditt etikettpapper och skrivare, ändringar av dessa kommer att påverka storleken på hela rutnätet.",
|
||||
"printing.generic.helpPrinterMargin": "Säkerhetszon bör ställas in på hur nära papperskanten din skrivare kan skriva ut, ändringar av dessa kommer inte att påverka hela rutnätet.",
|
||||
"printing.generic.horizontalSpacing": "Horisontellt avstånd",
|
||||
"printing.generic.itemCopies": "Kopior",
|
||||
"printing.generic.marginBottom": "Marginal - botten",
|
||||
"printing.generic.marginLeft": "Marginal - vänster",
|
||||
"printing.generic.marginRight": "Marginal - höger",
|
||||
"printing.generic.marginTop": "Marginal - topp",
|
||||
"printing.generic.paperSize": "Papperstyp",
|
||||
"printing.generic.printerMarginBottom": "Säkerhetszon - botten",
|
||||
"printing.generic.printerMarginLeft": "Säkerhetszon - vänster",
|
||||
"printing.generic.printerMarginRight": "Säkerhetszon - höger",
|
||||
"printing.generic.printerMarginTop": "Säkerhetszon - topp",
|
||||
"printing.generic.saveAsImage": "Spara som bild",
|
||||
"printing.generic.skipItems": "Hoppa över objekt",
|
||||
"printing.generic.verticalSpacing": "Vertikalt avstånd",
|
||||
"printing.qrcode.button": "Skriv ut etiketter",
|
||||
"printing.spoolSelect.selectedTotal_one": "{{count}} spole vald",
|
||||
"printing.spoolSelect.selectedTotal_other": "{{count}} spolar valda",
|
||||
"scanner.description": "Skanna en QR-kod för att visa information om en spole.",
|
||||
"scanner.error.insecureContext": "Sidan måste använda sig av HTTPS.",
|
||||
"scanner.error.notAllowed": "Du har inte tillåtit åtkomst till kameran.",
|
||||
"scanner.error.notFound": "Ingen kamera hittades.",
|
||||
"scanner.error.streamApiNotSupported": "Webbläsaren stödjer inte MediaStream API.",
|
||||
"scanner.error.unknown": "Ett okänt fel inträffade. ({{error}})",
|
||||
"scanner.title": "Skanna QR-kod",
|
||||
"settings.extraFields.booleanFalse": "Nej",
|
||||
"settings.extraFields.booleanTrue": "Ja",
|
||||
"settings.extraFields.deleteConfirm": "Ta bort fältet {{name}}?",
|
||||
"settings.extraFields.description.constraints": "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.",
|
||||
"settings.extraFields.description.intro": "Här kan du lägga till extra anpassade fält för dina objekt.",
|
||||
"settings.extraFields.description.keyUsage": "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.",
|
||||
"settings.extraFields.description.tableViews": "Extra fält kan inte sorteras eller filtreras i tabellvyn.",
|
||||
"settings.extraFields.fieldType.boolean": "Booleansk",
|
||||
"settings.extraFields.fieldType.choice": "Val",
|
||||
"settings.extraFields.fieldType.datetime": "Datum och tid",
|
||||
"settings.extraFields.fieldType.float": "Decimaltal",
|
||||
"settings.extraFields.fieldType.floatRange": "Decimaltalsintervall",
|
||||
"settings.extraFields.fieldType.integer": "Heltal",
|
||||
"settings.extraFields.fieldType.integerRange": "Heltalsintervall",
|
||||
"settings.extraFields.fieldType.text": "Text",
|
||||
"settings.extraFields.nonUniqueKeyError": "Nyckeln måste vara unik.",
|
||||
"settings.extraFields.params.choices": "Val",
|
||||
"settings.extraFields.params.defaultValue": "Standardvärde",
|
||||
"settings.extraFields.params.fieldType": "Typ",
|
||||
"settings.extraFields.params.key": "Nyckel",
|
||||
"settings.extraFields.params.name": "Namn",
|
||||
"settings.extraFields.params.order": "Ordning",
|
||||
"settings.extraFields.params.unit": "Enhet",
|
||||
"settings.extraFields.tab": "Extra Fält",
|
||||
"settings.general.currency.label": "Valuta",
|
||||
"settings.general.tab": "Allmänt",
|
||||
"settings.header": "Inställningar",
|
||||
"spool.fields.archived": "Arkiverad",
|
||||
"spool.fields.comment": "Kommentar",
|
||||
"spool.fields.filament": "Filament",
|
||||
"spool.fields.firstUsed": "Användes först",
|
||||
"spool.fields.id": "ID",
|
||||
"spool.fields.lastUsed": "Användes senast",
|
||||
"spool.fields.location": "Plats",
|
||||
"spool.fields.lotNr": "Batchnummer",
|
||||
"spool.fields.material": "Material",
|
||||
"spool.fields.measuredWeight": "Uppmätt vikt",
|
||||
"spool.fields.price": "Pris",
|
||||
"spool.fields.registered": "Registrerad",
|
||||
"spool.fields.remainingWeight": "Återstående vikt",
|
||||
"spool.fields.usedWeight": "Använd vikt",
|
||||
"spool.fieldsHelp.location": "Vart spolen finns om du har flera platser att förvara spolar på.",
|
||||
"spool.fieldsHelp.lotNr": "Tillverkarens batchnummer. Kan användas för att se till att en utskrift har jämn färg ifall flera spolar används.",
|
||||
"spool.fieldsHelp.measuredWeight": "Hur mycket filamentet och spolen väger tillsammans.",
|
||||
"spool.fieldsHelp.price": "Pris för en hel rulle. Om det inte är inställt kommer priset för filamentet istället att antas.",
|
||||
"spool.fieldsHelp.remainingWeight": "Hur mycket filament som finns kvar på spolen. För en ny spole så är detta det värdet som står på etiketten.",
|
||||
"spool.fieldsHelp.usedWeight": "Hur mycket filament som använts på spolen. En ny spole har värdet 0g.",
|
||||
"spool.form.measurementType.length": "Längd",
|
||||
"spool.form.measurementType.weight": "Vikt",
|
||||
"spool.spool": "Spolar",
|
||||
"unknown": "Okänd",
|
||||
"vendor.fields.comment": "Kommentar",
|
||||
"vendor.fields.emptySpoolWeight": "Tom spolvikt",
|
||||
"vendor.fields.externalId": "Externt ID",
|
||||
"vendor.fields.id": "ID",
|
||||
"vendor.fields.name": "Namn",
|
||||
"vendor.fields.registered": "Registrerad",
|
||||
"vendor.fieldsHelp.emptySpoolWeight": "Vikten av en tom spool från denna tillverkare.",
|
||||
"yes": "Ja"
|
||||
}
|
||||
@@ -0,0 +1,145 @@
|
||||
{
|
||||
"buttons.archive": "காப்பகம்",
|
||||
"buttons.cancel": "ரத்துசெய்",
|
||||
"buttons.clear": "தெளிவான",
|
||||
"buttons.delete": "நீக்கு",
|
||||
"buttons.edit": "தொகு",
|
||||
"buttons.filter": "வடிப்பி",
|
||||
"buttons.save": "சேமி",
|
||||
"buttons.showArchived": "காப்பகப்படுத்தப்பட்டதைக் காட்டு",
|
||||
"buttons.unArchive": "அன்கான்",
|
||||
"documentTitle.locations.list": "இடங்கள் | ச்பூல்மேன்",
|
||||
"filament.fields.articleNumber": "கட்டுரை எண்",
|
||||
"filament.fields.coaxial": "இணை",
|
||||
"filament.fields.colorHex": "நிறம்",
|
||||
"filament.fields.comment": "கருத்து",
|
||||
"filament.fields.density": "அடர்த்தி",
|
||||
"filament.fields.diameter": "விட்டம்",
|
||||
"filament.fields.externalId": "வெளிப்புற ஐடி",
|
||||
"filament.fields.id": "ஐடி",
|
||||
"filament.fields.longitudinal": "நீளமான",
|
||||
"filament.fields.material": "பொருள்",
|
||||
"filament.fields.multiColor": "பல",
|
||||
"filament.fields.name": "பெயர்",
|
||||
"filament.fields.price": "விலை",
|
||||
"filament.fields.registered": "பதிவுசெய்யப்பட்டது",
|
||||
"filament.fields.settingsBedTemp": "படுக்கை தற்காலிக",
|
||||
"filament.fields.settingsExtruderTemp": "எக்ச்ட்ரூடர் தற்காலிக",
|
||||
"filament.fields.singleColor": "ஒற்றை",
|
||||
"filament.fields.spoolWeight": "ச்பூல் எடை",
|
||||
"filament.fields.vendor": "உற்பத்தியாளர்",
|
||||
"filament.fields.weight": "எடை",
|
||||
"filament.fieldsHelp.articleNumber": "எ.கா. EAN, UPC, முதலியன.",
|
||||
"filament.fieldsHelp.multiColorDirection": "இழைகள் இரண்டு வழிகளில் பல வண்ணங்களைக் கொண்டிருக்கலாம்: சகாக்களின் மூலம், நிலையான பல வண்ணங்களுடன் இரட்டை-வண்ண இழைகள் போன்றவை, அல்லது ச்பூலில் வண்ணங்களை மாற்றும் சாய்வு இழைகள் போன்ற நீளமான வண்ண மாற்றங்கள் மூலம்.",
|
||||
"filament.fieldsHelp.spoolWeight": "வெற்று ச்பூலின் எடை. ஒரு ச்பூலின் அளவிடப்பட்ட எடையை தீர்மானிக்கப் பயன்படுகிறது.",
|
||||
"filament.fieldsHelp.weight": "ஒரு முழு ச்பூலின் இழை எடை (நிகர எடை). இதில் ச்பூலின் எடையை சேர்க்கக்கூடாது, இழை மட்டுமே. இது பொதுவாக பேக்கேசிங்கில் எழுதப்படுகிறது.",
|
||||
"filament.filament": "இழைகள்",
|
||||
"help.help": "உதவி",
|
||||
"kofi": "உதவிக்குறிப்பு மற்றும் ஆன்-ஃபை",
|
||||
"loading": "ஏற்றுகிறது",
|
||||
"locations.locations": "இருப்பிடங்கள்",
|
||||
"locations.newLocation": "புதிய இடம்",
|
||||
"locations.noLocation": "இடம் இல்லை",
|
||||
"locations.noLocationsHelp": "இந்த பக்கம் உங்கள் ச்பூல்களை இருப்பிடங்களில் ஒழுங்கமைக்க அனுமதிக்கிறது, தொடங்குவதற்கு சில ச்பூல்களைச் சேர்க்கவும்!",
|
||||
"no": "இல்லை",
|
||||
"notifications.error": "பிழை (நிலை குறியீடு: {{statusCode}})",
|
||||
"notifications.saveSuccessful": "வெற்றிகரமாக சேமிக்கவும்!",
|
||||
"printing.generic.columns": "நெடுவரிசைகள்",
|
||||
"printing.generic.customSize": "தனிப்பயன்",
|
||||
"printing.generic.description": "விரும்பிய அச்சு தளவமைப்பைப் பெற கீழேயுள்ள அமைப்புகளில் டியூன் செய்யுங்கள். அச்சுப்பொறிகளும் உங்கள் ஓஎச்வும் அதன் சொந்த ஓரங்கள் மற்றும் அளவிடுதலைப் பயன்படுத்தலாம் என்பதை நினைவில் கொள்ளுங்கள், எனவே இவை அனைத்தும் சரியானதாக இருப்பதற்கு முன்பு நீங்கள் சில சோதனை மற்றும் பிழை செய்ய வேண்டியிருக்கும். உண்மையான லேபிள்களில் அச்சிடுவதற்கு முன் வழக்கமான காகிதத்தில் அதை சோதிக்கவும்.",
|
||||
"printing.generic.dimensions": "பரிமாணங்கள்",
|
||||
"printing.generic.helpMargin": "உங்கள் சிட்டை காகிதம் மற்றும் அச்சுப்பொறியுடன் பொருந்தக்கூடிய வகையில் விளிம்புகள் கட்டமைக்கப்பட வேண்டும், இவற்றை மாற்றுவது முழு கட்டத்தின் அளவையும் பாதிக்கும்.",
|
||||
"printing.generic.helpPrinterMargin": "உங்கள் அச்சுப்பொறி எவ்வளவு நெருக்கமாக அச்சிட முடியும் என்பதற்கு பாதுகாப்பான-மண்டலத்தை அமைக்க வேண்டும், இவற்றை மாற்றுவது முழு கட்டத்தையும் பாதிக்காது.",
|
||||
"printing.generic.horizontalSpacing": "கிடைமட்ட இடைவெளி",
|
||||
"printing.generic.itemCopies": "உருப்படி நகல்கள்",
|
||||
"printing.generic.marginBottom": "கீழ் விளிம்பு",
|
||||
"printing.generic.marginLeft": "இடது விளிம்பு",
|
||||
"printing.generic.marginRight": "வலது விளிம்பு",
|
||||
"printing.generic.marginTop": "மேல் விளிம்பு",
|
||||
"printing.generic.paperSize": "காகித அளவு",
|
||||
"printing.generic.printerMarginBottom": "பாதுகாப்பான-மண்டல கீழே",
|
||||
"printing.generic.printerMarginLeft": "பாதுகாப்பான மண்டலம் இடது",
|
||||
"printing.generic.printerMarginRight": "பாதுகாப்பான-மண்டல உரிமை",
|
||||
"printing.generic.printerMarginTop": "பாதுகாப்பான-மண்டல மேல்",
|
||||
"printing.generic.saveAsImage": "படமாக சேமிக்கவும்",
|
||||
"printing.generic.skipItems": "உருப்படிகளைத் தவிர்க்கவும்",
|
||||
"printing.generic.verticalSpacing": "செங்குத்து இடைவெளி",
|
||||
"printing.qrcode.button": "லேபிள்களை அச்சிடுக",
|
||||
"printing.qrcode.useHTTPUrl.label": "QR குறியீடு இணைப்பு",
|
||||
"printing.qrcode.useHTTPUrl.options.default": "இயல்புநிலை",
|
||||
"printing.qrcode.useHTTPUrl.options.url": "முகவரி",
|
||||
"printing.qrcode.useHTTPUrl.preview": "முன்னோட்டம்:",
|
||||
"printing.qrcode.useHTTPUrl.tooltip": "ச்பூல்மேனின் ச்கேனிங் அம்சத்திலிருந்து (இயல்புநிலை) ச்கேன் செய்யப்பட்டால் மட்டுமே செயல்படும் தனியுரிம இணைப்பைப் பயன்படுத்தும். அமைப்புகளில் குறிப்பிடப்பட்டுள்ள அடிப்படை முகவரி அல்லது தற்போதைய பக்க முகவரி ஐ அமைக்கவில்லை என்றால் முகவரி பயன்படுத்துகிறது.",
|
||||
"printing.spoolSelect.selectedTotal_one": "{{count}} ச்பூல் தேர்ந்தெடுக்கப்பட்டது",
|
||||
"printing.spoolSelect.selectedTotal_other": "{{count}} spools தேர்ந்தெடுக்கப்பட்டவை",
|
||||
"scanner.description": "ச்பூல் பற்றிய விவரங்களைக் காண ஒரு ச்பூல்மேன் கியூஆர் குறியீட்டை ச்கேன் செய்யுங்கள்.",
|
||||
"scanner.error.insecureContext": "பக்கம் HTTPS க்கு மேல் வழங்கப்படவில்லை.",
|
||||
"scanner.error.notAllowed": "கேமராவை அணுக நீங்கள் அனுமதிக்கவில்லை.",
|
||||
"scanner.error.notFound": "கேமரா எதுவும் கண்டுபிடிக்கப்படவில்லை.",
|
||||
"scanner.error.streamApiNotSupported": "உலாவி மீடியாச்ட்ரீம் பநிஇ ஆதரிக்காது.",
|
||||
"scanner.error.unknown": "அறியப்படாத பிழை ஏற்பட்டது. ({{error}})",
|
||||
"scanner.title": "QR குறியீடு ச்கேனர்",
|
||||
"settings.extraFields.booleanFalse": "இல்லை",
|
||||
"settings.extraFields.booleanTrue": "ஆம்",
|
||||
"settings.extraFields.deleteConfirm": "புலம் {{name}} ஐ நீக்கு?",
|
||||
"settings.extraFields.description.intro": " இங்கே நீங்கள் உங்கள் நிறுவனங்களுக்குக் கூடுதல் தனிப்பயன் புலங்களைச் சேர்க்கலாம். நீங்கள் ஒரு புலத்தை அகற்றினால், அனைத்து நிறுவனங்களுக்கும் தொடர்புடைய தரவு நீக்கப்படும்.",
|
||||
"settings.extraFields.description.constraints": " மற்ற நிரல்கள் தரவைப் படிக்கிறோம்/எழுதுகின்றன என்பதுதான் முக்கியமானது, எனவே உங்கள் தனிப்பயன் புலம் மூன்றாம் தரப்பு நிரலுடன் ஒருங்கிணைக்க வேண்டுமானால், அதைச் சரியாக அமைக்க உறுதிசெய்க. ",
|
||||
"settings.extraFields.description.keyUsage": "இயல்புநிலை மதிப்பு புதிய உருப்படிகளுக்கு மட்டுமே பயன்படுத்தப்படுகிறது. ",
|
||||
"settings.extraFields.description.tableViews": " கூடுதல் புலங்களை அட்டவணை காட்சிகளில் வரிசைப்படுத்தவோ வடிகட்டவோ முடியாது. ",
|
||||
"settings.extraFields.fieldType.boolean": "பூலியன்",
|
||||
"settings.extraFields.fieldType.choice": "தேர்வு",
|
||||
"settings.extraFields.fieldType.datetime": "தேதிநேரம்",
|
||||
"settings.extraFields.fieldType.float": "மிதவை",
|
||||
"settings.extraFields.fieldType.floatRange": "மிதவை வரம்பு",
|
||||
"settings.extraFields.fieldType.integer": "முழு எண்",
|
||||
"settings.extraFields.fieldType.integerRange": "முழு எண் வரம்பு",
|
||||
"settings.extraFields.fieldType.text": "உரை",
|
||||
"settings.extraFields.nonUniqueKeyError": "முக்கியமானது தனித்துவமாக இருக்க வேண்டும்.",
|
||||
"settings.extraFields.params.choices": "தேர்வுகள்",
|
||||
"settings.extraFields.params.defaultValue": "இயல்புநிலை மதிப்பு",
|
||||
"settings.extraFields.params.fieldType": "வகை",
|
||||
"settings.extraFields.params.key": "விசை",
|
||||
"settings.extraFields.params.name": "பெயர்",
|
||||
"settings.extraFields.params.order": "ஒழுங்கு",
|
||||
"settings.extraFields.params.unit": "அலகு",
|
||||
"settings.extraFields.tab": "கூடுதல் புலங்கள்",
|
||||
"settings.general.baseUrl.label": "அடிப்படை முகவரி",
|
||||
"settings.general.baseUrl.tooltip": "QR குறியீடுகள் போன்ற அம்சங்களை உருவாக்கும்போது பயன்படுத்த வேண்டிய அடிப்படை முகவரி.",
|
||||
"settings.general.currency.label": "நாணயம்",
|
||||
"settings.general.roundPrices.label": "சுற்று விலைகள்",
|
||||
"settings.general.roundPrices.tooltip": "அருகிலுள்ள முழு எண்ணுக்கு வட்ட விலைகள்.",
|
||||
"settings.general.tab": "பொது",
|
||||
"settings.header": "அமைப்புகள்",
|
||||
"spool.fields.archived": "காப்பகப்படுத்தப்பட்டது",
|
||||
"spool.fields.comment": "கருத்து",
|
||||
"spool.fields.filament": "தாள்",
|
||||
"spool.fields.firstUsed": "முதலில் பயன்படுத்தப்பட்டது",
|
||||
"spool.fields.id": "ஐடி",
|
||||
"spool.fields.lastUsed": "கடைசியாக பயன்படுத்தப்பட்டது",
|
||||
"spool.fields.location": "இடம்",
|
||||
"spool.fields.lotNr": "நிறைய இல்லை",
|
||||
"spool.fields.material": "பொருள்",
|
||||
"spool.fields.measuredWeight": "அளவிடப்பட்ட எடை",
|
||||
"spool.fields.price": "விலை",
|
||||
"spool.fields.registered": "பதிவுசெய்யப்பட்டது",
|
||||
"spool.fields.remainingWeight": "மீதமுள்ள எடை",
|
||||
"spool.fields.usedWeight": "பயன்படுத்தப்பட்ட எடை",
|
||||
"spool.fieldsHelp.location": "உங்கள் ச்பூல்களை சேமிக்கும் பல இடங்கள் இருந்தால் ச்பூல் அமைந்துள்ள இடத்தில்.",
|
||||
"spool.fieldsHelp.lotNr": "உற்பத்தியாளரின் நிறைய எண். பல ச்பூல்கள் பயன்படுத்தப்பட்டால் அச்சுக்கு நிலையான வண்ணம் இருப்பதை உறுதிப்படுத்த பயன்படுத்தலாம்.",
|
||||
"spool.fieldsHelp.measuredWeight": "இழை மற்றும் ச்பூல் எவ்வளவு எடை கொண்டது.",
|
||||
"spool.fieldsHelp.price": "ஒரு முழு ச்பூலின் விலை. அமைக்கப்படாவிட்டால், அதற்கு பதிலாக இழைகளின் விலை ஏற்றுக்கொள்ளப்படும்.",
|
||||
"spool.fieldsHelp.remainingWeight": "ச்பூலில் எவ்வளவு இழை விடப்பட்டுள்ளது. ஒரு புதிய ச்பூலுக்கு இது ச்பூல் எடையுடன் பொருந்த வேண்டும்.",
|
||||
"spool.fieldsHelp.usedWeight": "ச்பூலில் இருந்து எவ்வளவு இழை பயன்படுத்தப்பட்டுள்ளது. ஒரு புதிய ச்பூல் 0 ஐயா பயன்படுத்தப்பட வேண்டும்.",
|
||||
"spool.form.measurementType.length": "நீளம்",
|
||||
"spool.form.measurementType.weight": "எடை",
|
||||
"spool.spool": "ச்பூல்கள்",
|
||||
"unknown": "தெரியவில்லை",
|
||||
"vendor.fields.comment": "கருத்து",
|
||||
"vendor.fields.emptySpoolWeight": "வெற்று ச்பூல் எடை",
|
||||
"vendor.fields.externalId": "வெளிப்புற ஐடி",
|
||||
"vendor.fields.id": "ஐடி",
|
||||
"vendor.fields.name": "பெயர்",
|
||||
"vendor.fields.registered": "பதிவுசெய்யப்பட்டது",
|
||||
"vendor.fieldsHelp.emptySpoolWeight": "இந்த உற்பத்தியாளரிடமிருந்து வெற்று ச்பூலின் எடை.",
|
||||
"yes": "ஆம்"
|
||||
}
|
||||
@@ -0,0 +1,142 @@
|
||||
{
|
||||
"buttons.archive": "เก็บถาวร",
|
||||
"buttons.cancel": "ยกเลิก",
|
||||
"buttons.clear": "ล้าง",
|
||||
"buttons.delete": "ลบ",
|
||||
"buttons.edit": "แก้ไข",
|
||||
"buttons.filter": "กรอง",
|
||||
"buttons.save": "บันทึก",
|
||||
"buttons.showArchived": "แสดงที่เก็บถาวร",
|
||||
"buttons.unArchive": "ยกเลิกเก็บถาวร",
|
||||
"documentTitle.locations.list": "สถานที่เก็บ | Spoolman",
|
||||
"filament.fields.articleNumber": "เลขบทความ",
|
||||
"filament.fields.coaxial": "เส้นหลายสี",
|
||||
"filament.fields.colorHex": "สี",
|
||||
"filament.fields.comment": "หมายเหตุ",
|
||||
"filament.fields.density": "ความหนาแน่น",
|
||||
"filament.fields.diameter": "เส้นผ่านศูนย์กลาง",
|
||||
"filament.fields.externalId": "รหัสภายนอก",
|
||||
"filament.fields.id": "ID",
|
||||
"filament.fields.longitudinal": "ไล่สีตามความยาว",
|
||||
"filament.fields.material": "วัสดุ",
|
||||
"filament.fields.multiColor": "หลายสี",
|
||||
"filament.fields.name": "ชื่อ",
|
||||
"filament.fields.price": "ราคา",
|
||||
"filament.fields.registered": "ลงทะเบียน",
|
||||
"filament.fields.settingsBedTemp": "อุณหภูมิฐานพิมพ์",
|
||||
"filament.fields.settingsExtruderTemp": "อุณหภูมิหัวพิมพ์",
|
||||
"filament.fields.singleColor": "สีเดียว",
|
||||
"filament.fields.spoolWeight": "น้ำหนักม้วนพลาสติกเปล่า",
|
||||
"filament.fields.vendor": "ผู้ผลิต",
|
||||
"filament.fields.weight": "น้ำหนัก",
|
||||
"filament.fieldsHelp.articleNumber": "เช่น EAN, UPC, เป็นต้น",
|
||||
"filament.fieldsHelp.multiColorDirection": "เส้นพลาสติกหลายสีสามารถมีหลายสีได้ 2 รูปแบบ: แบบ coextrusion (เช่น เส้นพลาสติกสองสีพร้อมกัน) หรือแบบไล่สีตามความยาว (เช่น เส้นพลาสติกเปลี่ยนสีไปเรื่อยๆ)",
|
||||
"filament.fieldsHelp.spoolWeight": "น้ำหนักม้วนพลาสติกเปล่า ใช้เพื่อคำนวณน้ำหนักรวมของม้วนพลาสติก",
|
||||
"filament.fieldsHelp.weight": "น้ำหนักของเส้นพลาสติกในม้วนพลาสติก (สุทธิ) ไม่รวมม้วนพลาสติกเปล่า เป็นค่าน้ำหนักที่มักระบุบนบรรจุภัณฑ์",
|
||||
"filament.filament": "เส้นพลาสติก",
|
||||
"help.help": "วิธีใช้",
|
||||
"kofi": "สนับสนุนเราได้ที่ Ko-fi",
|
||||
"loading": "กำลังโหลด",
|
||||
"locations.locations": "สถานที่เก็บ",
|
||||
"locations.newLocation": "สถานที่เก็บใหม่",
|
||||
"locations.noLocation": "ไม่มีสถานที่เก็บ",
|
||||
"locations.noLocationsHelp": "หน้านี้ให้คุณจัดการม้วนพลาสติกตามสถานที่เก็บ เพิ่มม้วนพลาสติกเพื่อเริ่มต้น!",
|
||||
"no": "ไม่",
|
||||
"notifications.error": "เกิดข้อผิดพลาด (รหัสสถานะ: {{statusCode}})",
|
||||
"notifications.saveSuccessful": "บันทึกสำเร็จ!",
|
||||
"printing.generic.columns": "คอลัมน์",
|
||||
"printing.generic.customSize": "กำหนดเอง",
|
||||
"printing.generic.description": "ปรับการตั้งค่าด้านล่างเพื่อให้ได้รูปแบบการพิมพ์ที่ต้องการ โปรดทราบว่าเครื่องพิมพ์และระบบปฏิบัติการของคุณอาจมีการตั้งค่าขอบกระดาษและการปรับขนาดของตัวเอง ดังนั้นคุณอาจต้องลองผิดลองถูกเล็กน้อยก่อนที่จะได้ผลลัพธ์ที่ถูกต้อง แนะนำให้ทดสอบบนกระดาษธรรมดาก่อนที่จะพิมพ์บนกระดาษสติกเกอร์จริง",
|
||||
"printing.generic.dimensions": "ขนาด",
|
||||
"printing.generic.helpMargin": "การตั้งค่าขอบกระดาษควรกำหนดให้ตรงกับขนาดกระดาษและเครื่องพิมพ์ของคุณ การเปลี่ยนค่านี้จะมีผลต่อขนาดตารางทั้งหมด",
|
||||
"printing.generic.helpPrinterMargin": "Safe-Zone ควรกำหนดเป็นค่าระยะห่างจากขอบกระดาษที่เครื่องพิมพ์สามารถพิมพ์ได้ การเปลี่ยนค่านี้จะไม่กระทบต่อขนาดตารางทั้งหมด",
|
||||
"printing.generic.horizontalSpacing": "ระยะห่างแนวนอน",
|
||||
"printing.generic.itemCopies": "สำเนาต่อรายการ",
|
||||
"printing.generic.marginBottom": "ระยะขอบล่าง",
|
||||
"printing.generic.marginLeft": "ระยะขอบซ้าย",
|
||||
"printing.generic.marginRight": "ระยะขอบขวา",
|
||||
"printing.generic.marginTop": "ระยะขอบบน",
|
||||
"printing.generic.paperSize": "ขนาดกระดาษ",
|
||||
"printing.generic.printerMarginBottom": "Safe-Zone ล่าง",
|
||||
"printing.generic.printerMarginLeft": "Safe-Zone ซ้าย",
|
||||
"printing.generic.printerMarginRight": "Safe-Zone ขวา",
|
||||
"printing.generic.printerMarginTop": "Safe-Zone บน",
|
||||
"printing.generic.saveAsImage": "บันทึกเป็นรูปภาพ",
|
||||
"printing.generic.skipItems": "ข้ามรายการ",
|
||||
"printing.generic.verticalSpacing": "ระยะห่างแนวตั้ง",
|
||||
"printing.qrcode.button": "พิมพ์ฉลาก",
|
||||
"printing.qrcode.useHTTPUrl.label": "ลิงก์ QR code",
|
||||
"printing.qrcode.useHTTPUrl.options.default": "ค่าเริ่มต้น",
|
||||
"printing.qrcode.useHTTPUrl.options.url": "URL",
|
||||
"printing.qrcode.useHTTPUrl.preview": "ตัวอย่าง:",
|
||||
"printing.qrcode.useHTTPUrl.tooltip": "จะใช้ลิงก์ภายในที่จะทำงานได้เฉพาะเมื่อสแกนจากฟีเจอร์สแกนของ Spoolman (ค่าเริ่มต้น) URL จะใช้จาก base URL ที่กำหนดไว้ใน settings หรือใช้ URL ของหน้าปัจจุบันหากไม่ได้ตั้งค่า",
|
||||
"printing.spoolSelect.selectedTotal_other": "เลือก {{count}} ม้วนพลาสติก",
|
||||
"scanner.description": "สแกน Spoolman QR code เพื่อดูข้อมูลเกี่ยวกับม้วนพลาสติก",
|
||||
"scanner.error.insecureContext": "หน้านี้ไม่ได้ถูกให้บริการผ่าน HTTPS",
|
||||
"scanner.error.notAllowed": "คุณไม่ได้อนุญาตให้เข้าถึงกล้อง",
|
||||
"scanner.error.notFound": "ไม่พบกล้อง",
|
||||
"scanner.error.streamApiNotSupported": "เบราว์เซอร์ไม่รองรับ MediaStream API",
|
||||
"scanner.error.unknown": "เกิดข้อผิดพลาดที่ไม่ทราบสาเหตุ ({{error}})",
|
||||
"scanner.title": "เครื่องสแกน QR Code",
|
||||
"settings.extraFields.booleanFalse": "ไม่",
|
||||
"settings.extraFields.booleanTrue": "ใช่",
|
||||
"settings.extraFields.deleteConfirm": "ลบฟิลด์ {{name}} หรือไม่?",
|
||||
"settings.extraFields.description.intro": "คุณสามารถเพิ่มฟิลด์ที่กำหนดเองเพิ่มเติมสำหรับเอนทิตีของคุณได้ที่นี่",
|
||||
"settings.extraFields.description.constraints": "เมื่อเพิ่มฟิลด์แล้ว คุณจะไม่สามารถเปลี่ยนคีย์หรือประเภทของฟิลด์ได้ และสำหรับฟิลด์ประเภทตัวเลือกคุณจะไม่สามารถลบตัวเลือกหรือเปลี่ยนโหมด multi choice ได้ หากคุณลบฟิลด์ ข้อมูลของเอนทิตีทั้งหมดจะถูกลบด้วย",
|
||||
"settings.extraFields.description.keyUsage": "คีย์คือสิ่งที่โปรแกรมอื่นจะใช้เพื่ออ่าน/เขียนข้อมูล ดังนั้นหากฟิลด์ที่คุณสร้างเพื่อเชื่อมต่อกับโปรแกรมอื่น กรุณาตั้งค่าให้ถูกต้อง ค่าดีฟอลต์จะถูกนำไปใช้เฉพาะกับรายการใหม่เท่านั้น",
|
||||
"settings.extraFields.description.tableViews": "ฟิลด์เพิ่มเติมไม่สามารถเรียงหรือกรองได้ในตาราง",
|
||||
"settings.extraFields.fieldType.boolean": "บูลีน(ใส่เฉพาะ ใช่/ไม่)",
|
||||
"settings.extraFields.fieldType.choice": "ตัวเลือก",
|
||||
"settings.extraFields.fieldType.datetime": "วันเวลา",
|
||||
"settings.extraFields.fieldType.float": "ทศนิยม",
|
||||
"settings.extraFields.fieldType.floatRange": "ช่วงทศนิยม",
|
||||
"settings.extraFields.fieldType.integer": "จำนวนเต็ม",
|
||||
"settings.extraFields.fieldType.integerRange": "ช่วงจำนวนเต็ม",
|
||||
"settings.extraFields.fieldType.text": "ข้อความ",
|
||||
"settings.extraFields.nonUniqueKeyError": "คีย์ต้องไม่ซ้ำ",
|
||||
"settings.extraFields.params.choices": "ตัวเลือก",
|
||||
"settings.extraFields.params.defaultValue": "ค่าเริ่มต้น",
|
||||
"settings.extraFields.params.fieldType": "ประเภท",
|
||||
"settings.extraFields.params.key": "คีย์",
|
||||
"settings.extraFields.params.name": "ชื่อ",
|
||||
"settings.extraFields.params.order": "ลำดับ",
|
||||
"settings.extraFields.params.unit": "หน่วย",
|
||||
"settings.extraFields.tab": "ฟิลด์เพิ่มเติม",
|
||||
"settings.general.baseUrl.label": "URLพื้นฐาน",
|
||||
"settings.general.baseUrl.tooltip": "URLพื้นฐาน ที่ใช้สำหรับสร้างฟีเจอร์ต่างๆ เช่น QR code",
|
||||
"settings.general.currency.label": "สกุลเงิน",
|
||||
"settings.general.tab": "ทั่วไป",
|
||||
"settings.header": "การตั้งค่า",
|
||||
"spool.fields.archived": "เก็บถาวร",
|
||||
"spool.fields.comment": "หมายเหตุ",
|
||||
"spool.fields.filament": "เส้นพลาสติก",
|
||||
"spool.fields.firstUsed": "ใช้ครั้งแรก",
|
||||
"spool.fields.id": "ID",
|
||||
"spool.fields.lastUsed": "ใช้ครั้งล่าสุด",
|
||||
"spool.fields.location": "สถานที่จัดเก็บ",
|
||||
"spool.fields.lotNr": "เลขล็อต",
|
||||
"spool.fields.material": "วัสดุ",
|
||||
"spool.fields.measuredWeight": "น้ำหนักที่วัดได้",
|
||||
"spool.fields.price": "ราคา",
|
||||
"spool.fields.registered": "ลงทะเบียน",
|
||||
"spool.fields.remainingWeight": "น้ำหนักคงเหลือ",
|
||||
"spool.fields.usedWeight": "น้ำหนักที่ใช้ไป",
|
||||
"spool.fieldsHelp.location": "ตำแหน่งที่เก็บม้วนพลาสติก หากคุณมีหลายที่เก็บ นี่คือที่ที่คุณจัดเก็บม้วนพลาสติก",
|
||||
"spool.fieldsHelp.lotNr": "เลขล็อตของผู้ผลิต ใช้เพื่อให้มั่นใจว่า การพิมพ์จะมีสีสม่ำเสมอ หากต้องใช้พลาสติกหลายม้วน",
|
||||
"spool.fieldsHelp.measuredWeight": "น้ำหนักรวมของเส้นพลาสติกและม้วนพลาสติก",
|
||||
"spool.fieldsHelp.price": "ราคาของม้วนพลาสติกเต็ม หากไม่ได้ตั้งค่า จะใช้ราคาของเส้นพลาสติกแทน",
|
||||
"spool.fieldsHelp.remainingWeight": "ปริมาณเส้นพลาสติกที่เหลืออยู่ในม้วนพลาสติก สำหรับม้วนพลาสติกใหม่ควรมีค่าเท่ากับน้ำหนักของม้วนพลาสติกเต็ม",
|
||||
"spool.fieldsHelp.usedWeight": "ปริมาณเส้นพลาสติกที่ถูกใช้ไปจากม้วนพลาสติก ม้วนพลาสติกใหม่ควรเริ่มต้นที่ 0 กรัม",
|
||||
"spool.form.measurementType.length": "ความยาว",
|
||||
"spool.form.measurementType.weight": "น้ำหนัก",
|
||||
"spool.spool": "ม้วนพลาสติก",
|
||||
"unknown": "ไม่ทราบ",
|
||||
"vendor.fields.comment": "หมายเหตุ",
|
||||
"vendor.fields.emptySpoolWeight": "น้ำหนักม้วนพลาสติกเปล่า",
|
||||
"vendor.fields.externalId": "รหัสภายนอก",
|
||||
"vendor.fields.id": "ID",
|
||||
"vendor.fields.name": "ชื่อ",
|
||||
"vendor.fields.registered": "ลงทะเบียน",
|
||||
"vendor.fieldsHelp.emptySpoolWeight": "น้ำหนักม้วนพลาสติกเปล่าของผู้ผลิตนี้",
|
||||
"yes": "ใช่"
|
||||
}
|
||||
@@ -0,0 +1,145 @@
|
||||
{
|
||||
"buttons.archive": "Arşivle",
|
||||
"buttons.cancel": "İptal et",
|
||||
"buttons.clear": "Temizle",
|
||||
"buttons.delete": "Sil",
|
||||
"buttons.edit": "Düzenle",
|
||||
"buttons.filter": "Filtrele",
|
||||
"buttons.save": "Kaydet",
|
||||
"buttons.showArchived": "Arşivlenenleri göster",
|
||||
"buttons.unArchive": "Arşivden çıkar",
|
||||
"documentTitle.locations.list": "Konumlar | Spoolman",
|
||||
"filament.fields.articleNumber": "Artikel Numarası",
|
||||
"filament.fields.coaxial": "Koekstrüde edilmiş",
|
||||
"filament.fields.colorHex": "Renk",
|
||||
"filament.fields.comment": "Yorum",
|
||||
"filament.fields.density": "Yoğunluk",
|
||||
"filament.fields.diameter": "Çap",
|
||||
"filament.fields.externalId": "Harici ID",
|
||||
"filament.fields.id": "ID",
|
||||
"filament.fields.longitudinal": "Boylamsal",
|
||||
"filament.fields.material": "Malzeme",
|
||||
"filament.fields.multiColor": "Çok Renk",
|
||||
"filament.fields.name": "Ad",
|
||||
"filament.fields.price": "Fiyat",
|
||||
"filament.fields.registered": "Kayıtlı",
|
||||
"filament.fields.settingsBedTemp": "Tabla Sıcaklığı",
|
||||
"filament.fields.settingsExtruderTemp": "Extruder Sıcaklığı",
|
||||
"filament.fields.singleColor": "Tek Renk",
|
||||
"filament.fields.spoolWeight": "Makara Ağırlığı",
|
||||
"filament.fields.vendor": "Üretici",
|
||||
"filament.fields.weight": "Ağırlık",
|
||||
"filament.fieldsHelp.articleNumber": "Örn. EAN, UPC, gibi.",
|
||||
"filament.fieldsHelp.multiColorDirection": "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.",
|
||||
"filament.fieldsHelp.spoolWeight": "Boş bir makaranın ağırlığıdır. Makaradaki ölçülen ağırlığın hesaplanmasında kullanılır.",
|
||||
"filament.fieldsHelp.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.",
|
||||
"filament.filament": "Filamentler",
|
||||
"help.help": "Yardım",
|
||||
"kofi": "Ko-fi'den bana birşeyler ateşle",
|
||||
"loading": "Yükleniyor",
|
||||
"locations.locations": "Konumlar",
|
||||
"locations.newLocation": "Yeni Konum",
|
||||
"locations.noLocation": "Konum Yok",
|
||||
"locations.noLocationsHelp": "Bu sayfa, makaralarınızı konumlara göre düzenlemenizi sağlar. Başlamak için birkaç makara ekleyin!",
|
||||
"no": "Hayır",
|
||||
"notifications.error": "Hata (durum kodu: {{statusCode}})",
|
||||
"notifications.saveSuccessful": "Kayıt başarılı!",
|
||||
"printing.generic.columns": "Sütunlar",
|
||||
"printing.generic.customSize": "Özel",
|
||||
"printing.generic.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.",
|
||||
"printing.generic.dimensions": "Boyutlar",
|
||||
"printing.generic.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.",
|
||||
"printing.generic.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.",
|
||||
"printing.generic.horizontalSpacing": "Yatay Boşluk",
|
||||
"printing.generic.itemCopies": "Öğe Kopyası",
|
||||
"printing.generic.marginBottom": "Alt Kenar Boşluğu",
|
||||
"printing.generic.marginLeft": "Sol Kenar Boşluğu",
|
||||
"printing.generic.marginRight": "Sağ Kenar Boşluğu",
|
||||
"printing.generic.marginTop": "Üst Kenar Boşluğu",
|
||||
"printing.generic.paperSize": "Sayfa Boyutu",
|
||||
"printing.generic.printerMarginBottom": "Alt Güvenli-Bölge",
|
||||
"printing.generic.printerMarginLeft": "Sol Güvenli-Bölge",
|
||||
"printing.generic.printerMarginRight": "Sağ Güvenli-Bölge",
|
||||
"printing.generic.printerMarginTop": "Üst Güvenli-Bölge",
|
||||
"printing.generic.saveAsImage": "Resim olarak kaydet",
|
||||
"printing.generic.skipItems": "Öğeleri Atla",
|
||||
"printing.generic.verticalSpacing": "Dikey Boşluk",
|
||||
"printing.qrcode.button": "Etiketleri Yazdır",
|
||||
"printing.qrcode.useHTTPUrl.label": "QR kod bağlantısı",
|
||||
"printing.qrcode.useHTTPUrl.options.default": "Varsayılan",
|
||||
"printing.qrcode.useHTTPUrl.options.url": "URL",
|
||||
"printing.qrcode.useHTTPUrl.preview": "Öngörünüm:",
|
||||
"printing.qrcode.useHTTPUrl.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.",
|
||||
"printing.spoolSelect.selectedTotal_one": "{{count}} makara seçildi",
|
||||
"printing.spoolSelect.selectedTotal_other": "{{count}} makara seçildi",
|
||||
"scanner.description": "Makara hakkında bilgi almak için Spoolman QR kodunu taratınız.",
|
||||
"scanner.error.insecureContext": "Bu sayfa HTTPS üstünden güvenli olarak gösterilmemektedir.",
|
||||
"scanner.error.notAllowed": "Kameraya erişim yetkisi vermediniz.",
|
||||
"scanner.error.notFound": "Kamera bulunamadı.",
|
||||
"scanner.error.streamApiNotSupported": "Bu tarayıcı MediaStream API'sini desteklememektedir.",
|
||||
"scanner.error.unknown": "Bilinmeyen hata oluştu.({{error}})",
|
||||
"scanner.title": "QR Kod Tarayıcı",
|
||||
"settings.extraFields.booleanFalse": "Hayır",
|
||||
"settings.extraFields.booleanTrue": "Evet",
|
||||
"settings.extraFields.deleteConfirm": "{{name}} alanı silinsin mi?",
|
||||
"settings.extraFields.description.intro": "Burada varlıklarınıza ekstra özel alanlar ekleyebilirsiniz.",
|
||||
"settings.extraFields.description.constraints": "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.",
|
||||
"settings.extraFields.description.keyUsage": "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.",
|
||||
"settings.extraFields.description.tableViews": "Ekstra alanlar tablo görünümünde sıralanamaz veya filtrelenemez.",
|
||||
"settings.extraFields.fieldType.boolean": "İkili Değer",
|
||||
"settings.extraFields.fieldType.choice": "Seçim Listesi",
|
||||
"settings.extraFields.fieldType.datetime": "Tarih+Saat",
|
||||
"settings.extraFields.fieldType.float": "Ondalıklı Sayı",
|
||||
"settings.extraFields.fieldType.floatRange": "Ondalıklı Sayı Aralığı",
|
||||
"settings.extraFields.fieldType.integer": "Tam Sayı",
|
||||
"settings.extraFields.fieldType.integerRange": "Tam Sayı Aralık",
|
||||
"settings.extraFields.fieldType.text": "Metin",
|
||||
"settings.extraFields.nonUniqueKeyError": "Anahtar benzersiz olmalıdır.",
|
||||
"settings.extraFields.params.choices": "Seçenekler",
|
||||
"settings.extraFields.params.defaultValue": "Varsayılan Değer",
|
||||
"settings.extraFields.params.fieldType": "Tür",
|
||||
"settings.extraFields.params.key": "Anahtar",
|
||||
"settings.extraFields.params.name": "İsim",
|
||||
"settings.extraFields.params.order": "Sipariş",
|
||||
"settings.extraFields.params.unit": "Birim",
|
||||
"settings.extraFields.tab": "Ekstra Alanlar",
|
||||
"settings.general.baseUrl.label": "Temel URL",
|
||||
"settings.general.baseUrl.tooltip": "QR kodları gibi ek özellikler kullanılırken kullanılacak temel URL.",
|
||||
"settings.general.currency.label": "Para Birimi",
|
||||
"settings.general.roundPrices.label": "Fiyatları Yuvarla",
|
||||
"settings.general.roundPrices.tooltip": "Fiyatları en yakın tam sayıya yuvarla.",
|
||||
"settings.general.tab": "Genel",
|
||||
"settings.header": "Ayarlar",
|
||||
"spool.fields.archived": "Arşivlendi",
|
||||
"spool.fields.comment": "Yorum",
|
||||
"spool.fields.filament": "Filament",
|
||||
"spool.fields.firstUsed": "İlk Kullanım Tarihi",
|
||||
"spool.fields.id": "ID",
|
||||
"spool.fields.lastUsed": "Son Kullanım Tarihi",
|
||||
"spool.fields.location": "Konum",
|
||||
"spool.fields.lotNr": "Lot No",
|
||||
"spool.fields.material": "Malzeme",
|
||||
"spool.fields.measuredWeight": "Tartılmış Ağırlık",
|
||||
"spool.fields.price": "Fiyat",
|
||||
"spool.fields.registered": "Kayıtlı",
|
||||
"spool.fields.remainingWeight": "Kalan Ağırlık",
|
||||
"spool.fields.usedWeight": "Kullanılmış Ağırlık",
|
||||
"spool.fieldsHelp.location": "Makaralarınızı birden fazla konumda saklamanız durumunda makaranın bulunduğu yer bilgisidir.",
|
||||
"spool.fieldsHelp.lotNr": "Üretici lot numarası. Birden fazla makara kullanımı durumunda tutarlı renk alınmasını sağlamak için kullanılabilir.",
|
||||
"spool.fieldsHelp.measuredWeight": "Filament ve makaranın toplam ağırlığını gösterir.",
|
||||
"spool.fieldsHelp.price": "Makaranın fiyatı eğer makara fiyatı belirlenmemişse filament fiyatı devralınacaktır.",
|
||||
"spool.fieldsHelp.remainingWeight": "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.",
|
||||
"spool.fieldsHelp.usedWeight": "Makaradan ne kadar filament kullanıldığını gösterir. Yeni bir makaranın kullanılmamış olması gerekir ve 0g kullanım göstermelidir.",
|
||||
"spool.form.measurementType.length": "Uzunluk",
|
||||
"spool.form.measurementType.weight": "Ağırlık",
|
||||
"spool.spool": "Makaralar",
|
||||
"unknown": "Bilinmeyen",
|
||||
"vendor.fields.comment": "Yorum",
|
||||
"vendor.fields.emptySpoolWeight": "Boş Makara Ağırlığı",
|
||||
"vendor.fields.externalId": "Harici ID",
|
||||
"vendor.fields.id": "ID",
|
||||
"vendor.fields.name": "İsim",
|
||||
"vendor.fields.registered": "Kayıtlı",
|
||||
"vendor.fieldsHelp.emptySpoolWeight": "Bu üreticiden boş bir makaranın ağırlığı.",
|
||||
"yes": "Evet"
|
||||
}
|
||||
@@ -0,0 +1,134 @@
|
||||
{
|
||||
"buttons.archive": "Архівувати",
|
||||
"buttons.cancel": "Скасувати",
|
||||
"buttons.clear": "Очистити",
|
||||
"buttons.delete": "Видалити",
|
||||
"buttons.edit": "Редагувати",
|
||||
"buttons.filter": "Фільтр",
|
||||
"buttons.save": "Зберегти",
|
||||
"buttons.showArchived": "Показати Архівовані",
|
||||
"buttons.unArchive": "Розархівувати",
|
||||
"filament.fields.articleNumber": "Артикул",
|
||||
"filament.fields.coaxial": "Коекструдтваний",
|
||||
"filament.fields.colorHex": "Колір",
|
||||
"filament.fields.comment": "Коментар",
|
||||
"filament.fields.density": "Щільність",
|
||||
"filament.fields.diameter": "Діаметр",
|
||||
"filament.fields.externalId": "Зовнішній ID",
|
||||
"filament.fields.id": "ІД",
|
||||
"filament.fields.material": "Матеріал",
|
||||
"filament.fields.multiColor": "Багатокольоровий",
|
||||
"filament.fields.name": "Назва",
|
||||
"filament.fields.price": "Ціна",
|
||||
"filament.fields.registered": "Додано",
|
||||
"filament.fields.settingsBedTemp": "Температура Столу",
|
||||
"filament.fields.settingsExtruderTemp": "Температура Екструдера",
|
||||
"filament.fields.singleColor": "Одноколірний",
|
||||
"filament.fields.spoolWeight": "Вага Котушки",
|
||||
"filament.fields.vendor": "Виробник",
|
||||
"filament.fields.weight": "Вага",
|
||||
"filament.fieldsHelp.articleNumber": "Напр. EAN, UPC тощо.",
|
||||
"filament.fieldsHelp.spoolWeight": "Вага порожньої котушки. Використовується для визначення виміряної ваги котушки.",
|
||||
"filament.fieldsHelp.weight": "Вага повної котушки філаменту (нетто). Ця вага не повинна включати вагу самої котушки, а тільки філаменту. Зазвичай це вказується на упаковці.",
|
||||
"filament.filament": "Філаменти",
|
||||
"help.help": "Довідка",
|
||||
"kofi": "Задонатити на Ko-fi",
|
||||
"loading": "Завантаження",
|
||||
"no": "Ні",
|
||||
"notifications.error": "Помилка (код: {{statusCode}})",
|
||||
"notifications.saveSuccessful": "Успішно збережено!",
|
||||
"printing.generic.columns": "Колонки",
|
||||
"printing.generic.customSize": "Нестандартний",
|
||||
"printing.generic.description": "Використовуйте наведені нижче параметри, щоб отримати бажаний макет друку. Майте на увазі, що принтери та ваша операційна система можуть використовувати власні настроювані поля та масштабування, тому вам може знадобитися декілька спроб щоб отримати правильний результат. Спробуйте це на аркуші звичайного паперу, перш ніж друкувати на справжніх етикетках.",
|
||||
"printing.generic.dimensions": "Розміри",
|
||||
"printing.generic.helpMargin": "Поля повинні бути встановлені відповідно до етикеткового паперу та принтера, їхня зміна вплине на розмір усієї сітки.",
|
||||
"printing.generic.helpPrinterMargin": "Безпечну зону слід встановити якомога ближче до краю паперу, наскільки принтер може друкувати, зміна не вплине на всю сітку.",
|
||||
"printing.generic.horizontalSpacing": "Горизонтальний відступ",
|
||||
"printing.generic.itemCopies": "Копії елементів",
|
||||
"printing.generic.marginBottom": "Нижній Відступ",
|
||||
"printing.generic.marginLeft": "Лівий Відступ",
|
||||
"printing.generic.marginRight": "Правий Відступ",
|
||||
"printing.generic.marginTop": "Верхній Відступ",
|
||||
"printing.generic.paperSize": "Розмір Паперу",
|
||||
"printing.generic.printerMarginBottom": "Безпечна зона знизу",
|
||||
"printing.generic.printerMarginLeft": "Безпечна зона зліва",
|
||||
"printing.generic.printerMarginRight": "Безпечна зона справа",
|
||||
"printing.generic.printerMarginTop": "Безпечна зона зверху",
|
||||
"printing.generic.saveAsImage": "Зберегти як зображення",
|
||||
"printing.generic.skipItems": "Пропустити елементи",
|
||||
"printing.generic.verticalSpacing": "Вертикальний відступ",
|
||||
"printing.qrcode.button": "Друкувати етикетки",
|
||||
"printing.qrcode.useHTTPUrl.label": "Посилання на QR-код",
|
||||
"printing.qrcode.useHTTPUrl.options.default": "За замовчуванням",
|
||||
"printing.qrcode.useHTTPUrl.options.url": "URL",
|
||||
"printing.qrcode.useHTTPUrl.preview": "Попередній перегляд:",
|
||||
"printing.spoolSelect.selectedTotal_few": "{{count}} обрані котушки",
|
||||
"printing.spoolSelect.selectedTotal_many": "{{count}} обраних котушок",
|
||||
"printing.spoolSelect.selectedTotal_one": "{{count}} обрана котушка",
|
||||
"scanner.description": "Відскануй QR-код Spoolman щоб переглянути подробиці про котушку.",
|
||||
"scanner.error.insecureContext": "Сторінка не відображається через HTTPS.",
|
||||
"scanner.error.notAllowed": "У вас недостатньо прав для доступу до камери.",
|
||||
"scanner.error.notFound": "Не знайдено жодної камери.",
|
||||
"scanner.error.streamApiNotSupported": "Браузер не підтримує MediaStream API.",
|
||||
"scanner.error.unknown": "Сталась невідома помилка. ({{error}})",
|
||||
"scanner.title": "Сканер QR-кодів",
|
||||
"settings.extraFields.booleanFalse": "Ні",
|
||||
"settings.extraFields.booleanTrue": "Так",
|
||||
"settings.extraFields.deleteConfirm": "Видалити поле {{name}}?",
|
||||
"settings.extraFields.description.intro": "Тут ви можете додати додаткові користувацькі поля до своїх об’єктів.",
|
||||
"settings.extraFields.description.constraints": "Після додавання поля ви не можете змінити його ключ або тип, а для полів типу вибору ви не можете видалити варіанти або змінити стан кількох варіантів. Якщо ви вилучите поле, пов’язані дані для всіх об’єктів буде видалено.",
|
||||
"settings.extraFields.description.keyUsage": "Ключ – це те, як інші програми читають/записують дані, тож якщо ваше спеціальне поле має інтегруватися зі сторонніми програми, переконайтеся, що ви правильно її налаштували. Значення за замовчуванням застосовується лише до нових елементів.",
|
||||
"settings.extraFields.description.tableViews": "Додаткові поля не можна сортувати чи фільтрувати в режимі перегляду таблиці.",
|
||||
"settings.extraFields.fieldType.boolean": "Логічний тип даних",
|
||||
"settings.extraFields.fieldType.choice": "Можливісь вибору",
|
||||
"settings.extraFields.fieldType.datetime": "Дата та час",
|
||||
"settings.extraFields.fieldType.float": "Число з рухомою комою",
|
||||
"settings.extraFields.fieldType.floatRange": "Діапазон чисел з рухомою комою",
|
||||
"settings.extraFields.fieldType.integer": "Ціле число",
|
||||
"settings.extraFields.fieldType.integerRange": "Цілочисловий діапазон",
|
||||
"settings.extraFields.fieldType.text": "Текст",
|
||||
"settings.extraFields.nonUniqueKeyError": "Ключ має бути унікальним.",
|
||||
"settings.extraFields.params.choices": "Вибір",
|
||||
"settings.extraFields.params.defaultValue": "Стандартне значення",
|
||||
"settings.extraFields.params.fieldType": "Тип",
|
||||
"settings.extraFields.params.key": "Ключ",
|
||||
"settings.extraFields.params.name": "Ім'я",
|
||||
"settings.extraFields.params.order": "Замовлення",
|
||||
"settings.extraFields.params.unit": "Одиниця",
|
||||
"settings.extraFields.tab": "Додаткові поля",
|
||||
"settings.general.baseUrl.label": "Базова URL-адреса",
|
||||
"settings.general.currency.label": "Валюта",
|
||||
"settings.general.tab": "Загальне",
|
||||
"settings.header": "Налаштування",
|
||||
"spool.fields.archived": "Архівовано",
|
||||
"spool.fields.comment": "Коментар",
|
||||
"spool.fields.filament": "Філамент",
|
||||
"spool.fields.firstUsed": "Вперше Використано",
|
||||
"spool.fields.id": "ІД",
|
||||
"spool.fields.lastUsed": "Востаннє Використано",
|
||||
"spool.fields.location": "Розташування",
|
||||
"spool.fields.lotNr": "Номер партії",
|
||||
"spool.fields.material": "Матеріал",
|
||||
"spool.fields.measuredWeight": "Виміряна Вага",
|
||||
"spool.fields.price": "Ціна",
|
||||
"spool.fields.registered": "Додано",
|
||||
"spool.fields.remainingWeight": "Залишок Ваги",
|
||||
"spool.fields.usedWeight": "Використана Вага",
|
||||
"spool.fieldsHelp.location": "Де розташована котушка, якщо у вас є кілька місць для зберігання котушок.",
|
||||
"spool.fieldsHelp.lotNr": "Номер партії виробника. Може використовуватися для гарантування рівномірного кольору друку при використанні декількох котушок.",
|
||||
"spool.fieldsHelp.measuredWeight": "Яка вага філаменту та котушки.",
|
||||
"spool.fieldsHelp.price": "Ціна цілої котушки. Якщо не вказано, замість неї буде використано ціну філамента.",
|
||||
"spool.fieldsHelp.remainingWeight": "Скільки філаменту залишилося на котушці. Для нової котушки це має відповідати вазі філаменту на котушці.",
|
||||
"spool.fieldsHelp.usedWeight": "Скільки філаменту було використано з котушки. Для нової котушки слід використовувати 0g.",
|
||||
"spool.form.measurementType.length": "Довжина",
|
||||
"spool.form.measurementType.weight": "Вага",
|
||||
"spool.spool": "Котушки",
|
||||
"unknown": "Невідомий",
|
||||
"vendor.fields.comment": "Коментар",
|
||||
"vendor.fields.emptySpoolWeight": "Вага пустої котушки",
|
||||
"vendor.fields.externalId": "Зовнішній ID",
|
||||
"vendor.fields.id": "ІД",
|
||||
"vendor.fields.name": "Назва",
|
||||
"vendor.fields.registered": "Додано",
|
||||
"yes": "Так"
|
||||
}
|
||||
@@ -0,0 +1,144 @@
|
||||
{
|
||||
"buttons.archive": "封存",
|
||||
"buttons.cancel": "取消",
|
||||
"buttons.clear": "清除",
|
||||
"buttons.delete": "刪除",
|
||||
"buttons.edit": "編輯",
|
||||
"buttons.filter": "過濾器",
|
||||
"buttons.save": "儲存",
|
||||
"buttons.showArchived": "檢視已封存",
|
||||
"buttons.unArchive": "取消封存",
|
||||
"documentTitle.locations.list": "位置| Spoolman",
|
||||
"filament.fields.articleNumber": "產品編號",
|
||||
"filament.fields.coaxial": "混色",
|
||||
"filament.fields.colorHex": "顏色",
|
||||
"filament.fields.comment": "備註",
|
||||
"filament.fields.density": "密度",
|
||||
"filament.fields.diameter": "線徑",
|
||||
"filament.fields.externalId": "內部ID",
|
||||
"filament.fields.id": "ID",
|
||||
"filament.fields.longitudinal": "縱向",
|
||||
"filament.fields.material": "材料",
|
||||
"filament.fields.multiColor": "多色",
|
||||
"filament.fields.name": "名稱",
|
||||
"filament.fields.price": "價格",
|
||||
"filament.fields.registered": "已登記",
|
||||
"filament.fields.settingsBedTemp": "床台溫度",
|
||||
"filament.fields.settingsExtruderTemp": "擠出機溫度",
|
||||
"filament.fields.singleColor": "單色",
|
||||
"filament.fields.spoolWeight": "料盤重量",
|
||||
"filament.fields.vendor": "製造商",
|
||||
"filament.fields.weight": "重量",
|
||||
"filament.fieldsHelp.articleNumber": "例如EAN、UPC等。",
|
||||
"filament.fieldsHelp.multiColorDirection": "線材的顏色可通過兩種方式呈現多樣性:一種是共擠技術,例如雙色線材,具有穩定的多色效果;另一種是沿線材長度的顏色變化,例如漸變線材,顏色會隨著線材捲的長度逐漸轉變。",
|
||||
"filament.fieldsHelp.spoolWeight": "空線盤的重量,用於計算整捲線的實際重量。",
|
||||
"filament.fieldsHelp.weight": "整捲線材的重量(淨重)。此重量不應包含線盤本身的重量,僅限於線材的重量,通常會標示在包裝上。",
|
||||
"filament.filament": "線材",
|
||||
"help.help": "說明",
|
||||
"kofi": "在Ko-fi上打賞我",
|
||||
"loading": "讀取中",
|
||||
"locations.locations": "位置",
|
||||
"locations.newLocation": "新增位置",
|
||||
"locations.noLocation": "未設定位置",
|
||||
"locations.noLocationsHelp": "這個頁面讓您將料盤按位置進行整理,請從增加一些線盤來開始!",
|
||||
"no": "否",
|
||||
"notifications.error": "錯誤 ( 狀態碼:{{statusCode}} )",
|
||||
"notifications.saveSuccessful": "儲存成功!",
|
||||
"printing.generic.columns": "欄",
|
||||
"printing.generic.customSize": "自訂",
|
||||
"printing.generic.description": "調整以下設定以獲得所需的列印佈局。請注意,列表機和您的操作系統可能會套用自己的邊距和縮放比例,因此可能需要進行一些反覆測試才能達到理想效果。在實際標籤上列印之前,先在普通紙上測試。",
|
||||
"printing.generic.dimensions": "尺寸",
|
||||
"printing.generic.helpMargin": "邊距應配置為與您的標籤紙和列表機相符,調整這些將影響整個網格的大小。",
|
||||
"printing.generic.helpPrinterMargin": "安全區域應設定為列表機能列印的距離紙張的邊界,更改此選項不影響整個網格。",
|
||||
"printing.generic.horizontalSpacing": "水平間距",
|
||||
"printing.generic.itemCopies": "項目複製",
|
||||
"printing.generic.marginBottom": "下邊界",
|
||||
"printing.generic.marginLeft": "左邊界",
|
||||
"printing.generic.marginRight": "右邊界",
|
||||
"printing.generic.marginTop": "上邊界",
|
||||
"printing.generic.paperSize": "紙張大小",
|
||||
"printing.generic.printerMarginBottom": "安全區域下側",
|
||||
"printing.generic.printerMarginLeft": "安全區域左側",
|
||||
"printing.generic.printerMarginRight": "安全區域右側",
|
||||
"printing.generic.printerMarginTop": "安全區域上側",
|
||||
"printing.generic.saveAsImage": "另存為圖片",
|
||||
"printing.generic.skipItems": "跳過項目",
|
||||
"printing.generic.verticalSpacing": "垂直間距",
|
||||
"printing.qrcode.button": "列印標籤",
|
||||
"printing.qrcode.useHTTPUrl.label": "QR碼連結",
|
||||
"printing.qrcode.useHTTPUrl.options.default": "預設",
|
||||
"printing.qrcode.useHTTPUrl.options.url": "URL",
|
||||
"printing.qrcode.useHTTPUrl.preview": "預覽:",
|
||||
"printing.qrcode.useHTTPUrl.tooltip": "將使用專屬連結,僅在使用 Spoolman 的掃描功能掃描時有效(預設)。URL 使用設定中指定的基礎 URL,若未設置則使用目前頁面的 URL。",
|
||||
"printing.spoolSelect.selectedTotal_other": "已選擇 {{count}} 個料盤",
|
||||
"scanner.description": "掃描Spoolman的QR碼以檢視關於料盤的詳細資料。",
|
||||
"scanner.error.insecureContext": "此頁面未通過 HTTPS 提供服務。",
|
||||
"scanner.error.notAllowed": "您未被允許存取攝影機。",
|
||||
"scanner.error.notFound": "未找到攝影機。",
|
||||
"scanner.error.streamApiNotSupported": "瀏覽器不支援MediaStream API。",
|
||||
"scanner.error.unknown": "發生未知的錯誤。({{error}})",
|
||||
"scanner.title": "掃描QR碼",
|
||||
"settings.extraFields.booleanFalse": "否",
|
||||
"settings.extraFields.booleanTrue": "是",
|
||||
"settings.extraFields.deleteConfirm": "刪除欄位 {{name}}?",
|
||||
"settings.extraFields.description.intro": "在此,您可以為您的實體加入額外的自訂欄位。",
|
||||
"settings.extraFields.description.constraints": "一旦加入欄位,您將無法更改其鍵值或類型,對於選擇類型欄位,您也無法刪除選項或更改多選狀態。如果刪除欄位,所有實體的相關資料將被刪除。",
|
||||
"settings.extraFields.description.keyUsage": "鍵值是其他程式讀取/寫入資料的方式,因此如果您的自訂欄位需要與第三方程式整合,請確保正確設置。預設值僅適用於新品項。",
|
||||
"settings.extraFields.description.tableViews": "額外的欄位無法在表格視圖中排序或過濾。",
|
||||
"settings.extraFields.fieldType.boolean": "布林",
|
||||
"settings.extraFields.fieldType.choice": "選項",
|
||||
"settings.extraFields.fieldType.datetime": "日期時間",
|
||||
"settings.extraFields.fieldType.float": "小數",
|
||||
"settings.extraFields.fieldType.floatRange": "小數範圍",
|
||||
"settings.extraFields.fieldType.integer": "整數",
|
||||
"settings.extraFields.fieldType.integerRange": "整數範圍",
|
||||
"settings.extraFields.fieldType.text": "文字",
|
||||
"settings.extraFields.nonUniqueKeyError": "鍵值必須為唯一。",
|
||||
"settings.extraFields.params.choices": "選項",
|
||||
"settings.extraFields.params.defaultValue": "預設值",
|
||||
"settings.extraFields.params.fieldType": "類型",
|
||||
"settings.extraFields.params.key": "鍵值",
|
||||
"settings.extraFields.params.name": "名稱",
|
||||
"settings.extraFields.params.order": "順序",
|
||||
"settings.extraFields.params.unit": "單位",
|
||||
"settings.extraFields.tab": "額外欄位",
|
||||
"settings.general.baseUrl.label": "基本URL",
|
||||
"settings.general.baseUrl.tooltip": "生成 QR 碼等功能時使用的基本 URL。",
|
||||
"settings.general.currency.label": "貨幣設定標籤",
|
||||
"settings.general.roundPrices.label": "價格四捨五入",
|
||||
"settings.general.roundPrices.tooltip": "將價格四捨五入至最接近的整數。",
|
||||
"settings.general.tab": "一般",
|
||||
"settings.header": "設定",
|
||||
"spool.fields.archived": "封存",
|
||||
"spool.fields.comment": "備註",
|
||||
"spool.fields.filament": "線材",
|
||||
"spool.fields.firstUsed": "首次使用",
|
||||
"spool.fields.id": "ID",
|
||||
"spool.fields.lastUsed": "上次使用",
|
||||
"spool.fields.location": "位置",
|
||||
"spool.fields.lotNr": "批號",
|
||||
"spool.fields.material": "材料",
|
||||
"spool.fields.measuredWeight": "實測重量",
|
||||
"spool.fields.price": "價格",
|
||||
"spool.fields.registered": "登記於",
|
||||
"spool.fields.remainingWeight": "剩餘重量",
|
||||
"spool.fields.usedWeight": "已用重量",
|
||||
"spool.fieldsHelp.location": "如果您的料盤存於多個位置,請填寫料盤所在位置。",
|
||||
"spool.fieldsHelp.lotNr": "製造商的批號。如果使用多個線盤,可用於確保列印的顏色一致。",
|
||||
"spool.fieldsHelp.measuredWeight": "線材和料盤的重量為多少。",
|
||||
"spool.fieldsHelp.price": "完整線盤的價格。如果未設定,則會假設為線材的價格。",
|
||||
"spool.fieldsHelp.remainingWeight": "料盤所剩餘的線材。對於新的料盤來說應等於料盤重量。",
|
||||
"spool.fieldsHelp.usedWeight": "料盤所使用的線材重量。一個新料盤應該為0克。",
|
||||
"spool.form.measurementType.length": "長度",
|
||||
"spool.form.measurementType.weight": "重量",
|
||||
"spool.spool": "料盤",
|
||||
"unknown": "未知",
|
||||
"vendor.fields.comment": "備註",
|
||||
"vendor.fields.emptySpoolWeight": "空料盤重量",
|
||||
"vendor.fields.externalId": "外部ID",
|
||||
"vendor.fields.id": "ID",
|
||||
"vendor.fields.name": "名稱",
|
||||
"vendor.fields.registered": "已登記",
|
||||
"vendor.fieldsHelp.emptySpoolWeight": "此製造商空線盤的重量。",
|
||||
"yes": "是"
|
||||
}
|
||||
Loaded 100 of 335 files, more files were not shown because too many files have changed in this diff.
Show more
Reference in new issue
Block a user