Merge branch 'master' of https://github.com/inventree/InvenTree into typechecking-remove-ignore
This commit is contained in:
commit
f60ccd4309
|
|
@ -1,9 +1,7 @@
|
||||||
# Dockerfile for the InvenTree devcontainer
|
# Dockerfile for the InvenTree devcontainer
|
||||||
|
# This container is used for development of the InvenTree project, and includes all necessary dependencies for both backend and frontend development.
|
||||||
|
|
||||||
# In contrast with the "production" image (which is based on an Alpine image)
|
FROM mcr.microsoft.com/devcontainers/python:3.14-trixie@sha256:66af9ee0a89e76f83b5c54a0cfdc19966ec8e443e294707f8f9b45f465b42cf1
|
||||||
# we use a Debian-based image for the devcontainer
|
|
||||||
|
|
||||||
FROM mcr.microsoft.com/devcontainers/python:3.11-bookworm@sha256:e754c29c4e3ffcf6c794c1020e36a0812341d88ec9569a34704b975fa89e8848
|
|
||||||
|
|
||||||
# InvenTree paths
|
# InvenTree paths
|
||||||
ENV INVENTREE_HOME="/home/inventree"
|
ENV INVENTREE_HOME="/home/inventree"
|
||||||
|
|
@ -25,10 +23,10 @@ RUN chmod +x init.sh
|
||||||
|
|
||||||
# Install required base packages
|
# Install required base packages
|
||||||
RUN apt update && apt install -y \
|
RUN apt update && apt install -y \
|
||||||
python3.11-dev python3.11-venv \
|
python3-dev python3-venv \
|
||||||
postgresql-client \
|
postgresql-client \
|
||||||
libldap2-dev libsasl2-dev \
|
libldap2-dev libsasl2-dev \
|
||||||
libpango1.0-0 libcairo2 \
|
libpango-1.0-0 libcairo2 \
|
||||||
poppler-utils weasyprint
|
poppler-utils weasyprint
|
||||||
|
|
||||||
# Install packages required for frontend development
|
# Install packages required for frontend development
|
||||||
|
|
|
||||||
|
|
@ -14,7 +14,7 @@ pool:
|
||||||
strategy:
|
strategy:
|
||||||
matrix:
|
matrix:
|
||||||
Python39:
|
Python39:
|
||||||
PYTHON_VERSION: '3.11'
|
PYTHON_VERSION: 3.12
|
||||||
maxParallel: 3
|
maxParallel: 3
|
||||||
|
|
||||||
steps:
|
steps:
|
||||||
|
|
|
||||||
|
|
@ -9,7 +9,7 @@ on:
|
||||||
- l10
|
- l10
|
||||||
|
|
||||||
env:
|
env:
|
||||||
python_version: 3.11
|
python_version: 3.12
|
||||||
|
|
||||||
permissions:
|
permissions:
|
||||||
contents: read
|
contents: read
|
||||||
|
|
|
||||||
|
|
@ -62,7 +62,7 @@ jobs:
|
||||||
contents: read
|
contents: read
|
||||||
env:
|
env:
|
||||||
GITHUB_TOKEN: ${{ secrets.GITHUB_TOKEN }}
|
GITHUB_TOKEN: ${{ secrets.GITHUB_TOKEN }}
|
||||||
python_version: "3.11"
|
python_version: 3.12
|
||||||
runs-on: ubuntu-latest # in the future we can try to use alternative runners here
|
runs-on: ubuntu-latest # in the future we can try to use alternative runners here
|
||||||
|
|
||||||
steps:
|
steps:
|
||||||
|
|
@ -134,7 +134,7 @@ jobs:
|
||||||
contents: read
|
contents: read
|
||||||
env:
|
env:
|
||||||
GITHUB_TOKEN: ${{ secrets.GITHUB_TOKEN }}
|
GITHUB_TOKEN: ${{ secrets.GITHUB_TOKEN }}
|
||||||
python_version: "3.11"
|
python_version: 3.12
|
||||||
runs-on: ubuntu-latest # in the future we can try to use alternative runners here
|
runs-on: ubuntu-latest # in the future we can try to use alternative runners here
|
||||||
|
|
||||||
steps:
|
steps:
|
||||||
|
|
@ -158,7 +158,7 @@ jobs:
|
||||||
id-token: write
|
id-token: write
|
||||||
env:
|
env:
|
||||||
GITHUB_TOKEN: ${{ secrets.GITHUB_TOKEN }}
|
GITHUB_TOKEN: ${{ secrets.GITHUB_TOKEN }}
|
||||||
python_version: "3.11"
|
python_version: 3.12
|
||||||
runs-on: ubuntu-latest # in the future we can try to use alternative runners here
|
runs-on: ubuntu-latest # in the future we can try to use alternative runners here
|
||||||
|
|
||||||
steps:
|
steps:
|
||||||
|
|
|
||||||
|
|
@ -13,7 +13,7 @@ on:
|
||||||
branches-ignore: ["l10*"]
|
branches-ignore: ["l10*"]
|
||||||
|
|
||||||
env:
|
env:
|
||||||
python_version: 3.11
|
python_version: 3.12
|
||||||
node_version: 24
|
node_version: 24
|
||||||
# The OS version must be set per job
|
# The OS version must be set per job
|
||||||
server_start_sleep: 60
|
server_start_sleep: 60
|
||||||
|
|
|
||||||
|
|
@ -15,7 +15,7 @@ permissions:
|
||||||
contents: read
|
contents: read
|
||||||
|
|
||||||
env:
|
env:
|
||||||
python_version: 3.11
|
python_version: 3.12
|
||||||
|
|
||||||
GITHUB_TOKEN: ${{ secrets.GITHUB_TOKEN }}
|
GITHUB_TOKEN: ${{ secrets.GITHUB_TOKEN }}
|
||||||
|
|
||||||
|
|
|
||||||
|
|
@ -9,7 +9,7 @@ on:
|
||||||
branches-ignore: ["l10*"]
|
branches-ignore: ["l10*"]
|
||||||
|
|
||||||
env:
|
env:
|
||||||
python_version: 3.11
|
python_version: 3.12
|
||||||
node_version: 24
|
node_version: 24
|
||||||
# The OS version must be set per job
|
# The OS version must be set per job
|
||||||
server_start_sleep: 60
|
server_start_sleep: 60
|
||||||
|
|
@ -222,7 +222,7 @@ jobs:
|
||||||
echo "Downloaded api.yaml"
|
echo "Downloaded api.yaml"
|
||||||
- name: Running OpenAPI Spec diff action
|
- name: Running OpenAPI Spec diff action
|
||||||
id: breaking_changes
|
id: breaking_changes
|
||||||
uses: oasdiff/oasdiff-action/diff@3530478ec30f84adedbfeb28f0d9527a290f50a9 # pin@main
|
uses: oasdiff/oasdiff-action/diff@5fbe96ede8d0c53aeadef122d7a0abb79152d493 # pin@main
|
||||||
with:
|
with:
|
||||||
base: "api.yaml"
|
base: "api.yaml"
|
||||||
revision: "src/backend/InvenTree/schema.yml"
|
revision: "src/backend/InvenTree/schema.yml"
|
||||||
|
|
@ -363,7 +363,7 @@ jobs:
|
||||||
pip install .
|
pip install .
|
||||||
if: needs.paths-filter.outputs.submit-performance == 'true'
|
if: needs.paths-filter.outputs.submit-performance == 'true'
|
||||||
- name: Performance Reporting
|
- name: Performance Reporting
|
||||||
uses: CodSpeedHQ/action@9d332c4d90b43981c3e55ae8e38e68709996240f # pin@v4.17.0
|
uses: CodSpeedHQ/action@c145068895e045cc725ee76fcd2307624b65c3af # pin@v4.17.5
|
||||||
# check if we are in inventree/inventree - reporting only works in that OIDC context
|
# check if we are in inventree/inventree - reporting only works in that OIDC context
|
||||||
if: github.repository == 'inventree/InvenTree' && needs.paths-filter.outputs.submit-performance == 'true'
|
if: github.repository == 'inventree/InvenTree' && needs.paths-filter.outputs.submit-performance == 'true'
|
||||||
with:
|
with:
|
||||||
|
|
@ -379,7 +379,7 @@ jobs:
|
||||||
continue-on-error: true # continue if a step fails so that coverage gets pushed
|
continue-on-error: true # continue if a step fails so that coverage gets pushed
|
||||||
strategy:
|
strategy:
|
||||||
matrix:
|
matrix:
|
||||||
python_version: [3.11, 3.14]
|
python_version: [3.12, 3.14]
|
||||||
|
|
||||||
env:
|
env:
|
||||||
INVENTREE_DB_NAME: ./inventree.sqlite
|
INVENTREE_DB_NAME: ./inventree.sqlite
|
||||||
|
|
@ -454,7 +454,7 @@ jobs:
|
||||||
env:
|
env:
|
||||||
node_version: '>=24'
|
node_version: '>=24'
|
||||||
- name: Performance Reporting
|
- name: Performance Reporting
|
||||||
uses: CodSpeedHQ/action@9d332c4d90b43981c3e55ae8e38e68709996240f # pin@v4.17.0
|
uses: CodSpeedHQ/action@c145068895e045cc725ee76fcd2307624b65c3af # pin@v4.17.5
|
||||||
with:
|
with:
|
||||||
mode: walltime
|
mode: walltime
|
||||||
run: inv dev.test --pytest
|
run: inv dev.test --pytest
|
||||||
|
|
|
||||||
|
|
@ -7,7 +7,7 @@ on:
|
||||||
permissions:
|
permissions:
|
||||||
contents: read
|
contents: read
|
||||||
env:
|
env:
|
||||||
python_version: 3.11
|
python_version: 3.12
|
||||||
|
|
||||||
jobs:
|
jobs:
|
||||||
stable:
|
stable:
|
||||||
|
|
@ -151,9 +151,9 @@ jobs:
|
||||||
fail-fast: false
|
fail-fast: false
|
||||||
matrix:
|
matrix:
|
||||||
target:
|
target:
|
||||||
- ubuntu:22.04
|
|
||||||
- ubuntu:24.04
|
- ubuntu:24.04
|
||||||
- debian:12
|
- ubuntu:26.04
|
||||||
|
- debian:13
|
||||||
|
|
||||||
steps:
|
steps:
|
||||||
- uses: actions/checkout@df4cb1c069e1874edd31b4311f1884172cec0e10 # pin@v6.0.3
|
- uses: actions/checkout@df4cb1c069e1874edd31b4311f1884172cec0e10 # pin@v6.0.3
|
||||||
|
|
|
||||||
|
|
@ -6,7 +6,7 @@ on:
|
||||||
- master
|
- master
|
||||||
|
|
||||||
env:
|
env:
|
||||||
python_version: 3.11
|
python_version: 3.12
|
||||||
node_version: 24
|
node_version: 24
|
||||||
|
|
||||||
permissions:
|
permissions:
|
||||||
|
|
@ -56,7 +56,7 @@ jobs:
|
||||||
echo "Resetting to HEAD~"
|
echo "Resetting to HEAD~"
|
||||||
git reset HEAD~ || true
|
git reset HEAD~ || true
|
||||||
- name: crowdin action
|
- name: crowdin action
|
||||||
uses: crowdin/github-action@8868a33591d21088edfc398968173a3b98d51706 # pin@v2
|
uses: crowdin/github-action@52aa776766211d83d975df51f3b9c53c2f8ba35f # pin@v2
|
||||||
with:
|
with:
|
||||||
upload_sources: true
|
upload_sources: true
|
||||||
upload_translations: false
|
upload_translations: false
|
||||||
|
|
|
||||||
10
.pkgr.yml
10
.pkgr.yml
|
|
@ -21,9 +21,9 @@ before:
|
||||||
dependencies:
|
dependencies:
|
||||||
- curl
|
- curl
|
||||||
- poppler-utils
|
- poppler-utils
|
||||||
- "python3.11 | python3.12 | python3.13 | python3.14"
|
- "python3.12 | python3.13 | python3.14"
|
||||||
- "python3.11-venv | python3.12-venv | python3.13-venv | python3.14-venv"
|
- "python3.12-venv | python3.13-venv | python3.14-venv"
|
||||||
- "python3.11-dev | python3.12-dev | python3.13-dev | python3.14-dev"
|
- "python3.12-dev | python3.13-dev | python3.14-dev"
|
||||||
- python3-pip
|
- python3-pip
|
||||||
- python3-cffi
|
- python3-cffi
|
||||||
- python3-brotli
|
- python3-brotli
|
||||||
|
|
@ -36,6 +36,6 @@ dependencies:
|
||||||
- jq
|
- jq
|
||||||
- "libffi7 | libffi8"
|
- "libffi7 | libffi8"
|
||||||
targets:
|
targets:
|
||||||
ubuntu-22.04: true
|
|
||||||
ubuntu-24.04: true
|
ubuntu-24.04: true
|
||||||
debian-12: true
|
ubuntu-26.04: true
|
||||||
|
debian-13: true
|
||||||
|
|
|
||||||
|
|
@ -97,4 +97,4 @@ repos:
|
||||||
rev: 0.4.3
|
rev: 0.4.3
|
||||||
hooks:
|
hooks:
|
||||||
- id: teyit
|
- id: teyit
|
||||||
language_version: python3.11
|
language_version: python3.12
|
||||||
|
|
|
||||||
|
|
@ -47,7 +47,7 @@
|
||||||
"name": "InvenTree invoke schema",
|
"name": "InvenTree invoke schema",
|
||||||
"type": "debugpy",
|
"type": "debugpy",
|
||||||
"request": "launch",
|
"request": "launch",
|
||||||
"program": "${workspaceFolder}/.venv/lib/python3.11/site-packages/invoke/__main__.py",
|
"program": "${workspaceFolder}/.venv/lib/python3.12/site-packages/invoke/__main__.py",
|
||||||
"cwd": "${workspaceFolder}",
|
"cwd": "${workspaceFolder}",
|
||||||
"args": [
|
"args": [
|
||||||
"dev.schema","--ignore-warnings"
|
"dev.schema","--ignore-warnings"
|
||||||
|
|
|
||||||
14
CHANGELOG.md
14
CHANGELOG.md
|
|
@ -5,7 +5,19 @@ All major notable changes to this project will be documented in this file (start
|
||||||
The format is based on [Keep a Changelog](https://keepachangelog.com/en/1.1.0/),
|
The format is based on [Keep a Changelog](https://keepachangelog.com/en/1.1.0/),
|
||||||
and this project adheres to [Semantic Versioning](https://semver.org/spec/v2.0.0.html).
|
and this project adheres to [Semantic Versioning](https://semver.org/spec/v2.0.0.html).
|
||||||
|
|
||||||
## Unreleased - YYYY-MM-DD
|
## Unreleased - xxxx.xx.xx
|
||||||
|
|
||||||
|
### Breaking Changes
|
||||||
|
|
||||||
|
- [#12223](https://github.com/inventree/InvenTree/pull/12223) removes support for python 3.11 and stops providing packages for Debian 11 and Ubuntu 20.04.
|
||||||
|
|
||||||
|
### Added
|
||||||
|
|
||||||
|
### Changed
|
||||||
|
|
||||||
|
### Removed
|
||||||
|
|
||||||
|
## 1.4.0 - 2026-06-24
|
||||||
|
|
||||||
### Breaking Changes
|
### Breaking Changes
|
||||||
|
|
||||||
|
|
|
||||||
|
|
@ -24,7 +24,7 @@ flag_management:
|
||||||
carryforward: true
|
carryforward: true
|
||||||
statuses:
|
statuses:
|
||||||
- type: project
|
- type: project
|
||||||
target: 40%
|
target: 38%
|
||||||
- name: web
|
- name: web
|
||||||
carryforward: true
|
carryforward: true
|
||||||
statuses:
|
statuses:
|
||||||
|
|
|
||||||
|
|
@ -79,7 +79,7 @@ function detect_python() {
|
||||||
echo "${On_Red}"
|
echo "${On_Red}"
|
||||||
echo "# POI07| Python ${SETUP_PYTHON} not found - aborting!"
|
echo "# POI07| Python ${SETUP_PYTHON} not found - aborting!"
|
||||||
echo "# POI07| Please ensure python can be executed with the command '$SETUP_PYTHON' by the current user '$USER'."
|
echo "# POI07| Please ensure python can be executed with the command '$SETUP_PYTHON' by the current user '$USER'."
|
||||||
echo "# POI07| If you are using a different python version, please set the environment variable SETUP_PYTHON to the correct command - eg. 'python3.11'."
|
echo "# POI07| If you are using a different python version, please set the environment variable SETUP_PYTHON to the correct command - eg. 'python3.12'."
|
||||||
echo "${Color_Off}"
|
echo "${Color_Off}"
|
||||||
exit 1
|
exit 1
|
||||||
fi
|
fi
|
||||||
|
|
|
||||||
|
|
@ -26,7 +26,7 @@ export DATA_DIR=${APP_HOME}/data
|
||||||
export SETUP_NGINX_FILE=${SETUP_NGINX_FILE:-/etc/nginx/sites-enabled/inventree.conf}
|
export SETUP_NGINX_FILE=${SETUP_NGINX_FILE:-/etc/nginx/sites-enabled/inventree.conf}
|
||||||
export SETUP_ADMIN_PASSWORD_FILE=${CONF_DIR}/admin_password.txt
|
export SETUP_ADMIN_PASSWORD_FILE=${CONF_DIR}/admin_password.txt
|
||||||
export SETUP_NO_CALLS=${SETUP_NO_CALLS:-false}
|
export SETUP_NO_CALLS=${SETUP_NO_CALLS:-false}
|
||||||
export SETUP_PYTHON=${SETUP_PYTHON:-python3.11}
|
export SETUP_PYTHON=${SETUP_PYTHON:-python3.12}
|
||||||
export SETUP_ADMIN_NOCREATION=${SETUP_ADMIN_NOCREATION:-false}
|
export SETUP_ADMIN_NOCREATION=${SETUP_ADMIN_NOCREATION:-false}
|
||||||
# SETUP_DEBUG can be set to get debug info
|
# SETUP_DEBUG can be set to get debug info
|
||||||
# SETUP_EXTRA_PIP can be set to install extra pip packages
|
# SETUP_EXTRA_PIP can be set to install extra pip packages
|
||||||
|
|
|
||||||
|
|
@ -4,10 +4,10 @@ import json
|
||||||
import os
|
import os
|
||||||
import re
|
import re
|
||||||
from datetime import datetime
|
from datetime import datetime
|
||||||
from distutils.version import StrictVersion # type: ignore[import]
|
|
||||||
from pathlib import Path
|
from pathlib import Path
|
||||||
|
|
||||||
import requests
|
import requests
|
||||||
|
from packaging.version import Version
|
||||||
|
|
||||||
here = Path(__file__).parent
|
here = Path(__file__).parent
|
||||||
|
|
||||||
|
|
@ -57,7 +57,7 @@ def fetch_rtd_versions():
|
||||||
print('No RTD token found - skipping RTD version fetch')
|
print('No RTD token found - skipping RTD version fetch')
|
||||||
|
|
||||||
# Sort versions by version number
|
# Sort versions by version number
|
||||||
versions = sorted(versions, key=lambda x: StrictVersion(x['version']), reverse=True)
|
versions = sorted(versions, key=lambda x: Version(x['version']), reverse=True)
|
||||||
|
|
||||||
# Add "latest" version first
|
# Add "latest" version first
|
||||||
if not any(x['title'] == 'latest' for x in versions):
|
if not any(x['title'] == 'latest' for x in versions):
|
||||||
|
|
|
||||||
|
|
@ -54,14 +54,14 @@ class InvenTreeBarcodePlugin(BarcodeMixin, InvenTreePlugin):
|
||||||
VERSION = "0.0.1"
|
VERSION = "0.0.1"
|
||||||
AUTHOR = "Michael"
|
AUTHOR = "Michael"
|
||||||
|
|
||||||
def scan(self, barcode_data):
|
def scan(self, barcode_data, user, **kwargs):
|
||||||
if barcode_data.startswith("PART-"):
|
if barcode_data.startswith("PART-"):
|
||||||
try:
|
try:
|
||||||
pk = int(barcode_data.split("PART-")[1])
|
pk = int(barcode_data.split("PART-")[1])
|
||||||
instance = Part.objects.get(pk=pk)
|
instance = Part.objects.get(pk=pk)
|
||||||
label = Part.barcode_model_type()
|
label = Part.barcode_model_type()
|
||||||
|
|
||||||
return {label: instance.format_matched_response()}
|
return {label: instance.format_matched_response(user=user)}
|
||||||
except Part.DoesNotExist:
|
except Part.DoesNotExist:
|
||||||
pass
|
pass
|
||||||
```
|
```
|
||||||
|
|
|
||||||
|
|
@ -226,6 +226,7 @@ Configuration of stock item options
|
||||||
{{ globalsetting("STOCK_SHOW_INSTALLED_ITEMS") }}
|
{{ globalsetting("STOCK_SHOW_INSTALLED_ITEMS") }}
|
||||||
{{ globalsetting("STOCK_ENFORCE_BOM_INSTALLATION") }}
|
{{ globalsetting("STOCK_ENFORCE_BOM_INSTALLATION") }}
|
||||||
{{ globalsetting("STOCK_ALLOW_OUT_OF_STOCK_TRANSFER") }}
|
{{ globalsetting("STOCK_ALLOW_OUT_OF_STOCK_TRANSFER") }}
|
||||||
|
{{ globalsetting("STOCK_MERGE_ON_TRANSFER") }}
|
||||||
{{ globalsetting("TEST_STATION_DATA") }}
|
{{ globalsetting("TEST_STATION_DATA") }}
|
||||||
|
|
||||||
### Build Orders
|
### Build Orders
|
||||||
|
|
|
||||||
|
|
@ -325,7 +325,7 @@ ARG INVENTREE_TAG
|
||||||
|
|
||||||
# prebuild stage - needs a lot of build dependencies
|
# prebuild stage - needs a lot of build dependencies
|
||||||
# make sure, the alpine and python version matches the version used in the inventree base image
|
# make sure, the alpine and python version matches the version used in the inventree base image
|
||||||
FROM python:3.11-alpine3.18 as prebuild
|
FROM python:3.12-alpine3.18 as prebuild
|
||||||
|
|
||||||
# Install whatever development dependency is needed (e.g. cups-dev, gcc, the musl-dev build tools and the pip pycups package)
|
# Install whatever development dependency is needed (e.g. cups-dev, gcc, the musl-dev build tools and the pip pycups package)
|
||||||
RUN apk add --no-cache cups-dev gcc musl-dev && \
|
RUN apk add --no-cache cups-dev gcc musl-dev && \
|
||||||
|
|
|
||||||
|
|
@ -366,7 +366,7 @@ extra:
|
||||||
# provider: google
|
# provider: google
|
||||||
# property: UA-143467500-1
|
# property: UA-143467500-1
|
||||||
|
|
||||||
min_python_version: 3.11
|
min_python_version: 3.12
|
||||||
min_invoke_version: 2.0.0
|
min_invoke_version: 2.0.0
|
||||||
django_version: 5.2
|
django_version: 5.2
|
||||||
docker_postgres_version: 17
|
docker_postgres_version: 17
|
||||||
|
|
|
||||||
|
|
@ -97,7 +97,7 @@ skip-magic-trailing-comma = true
|
||||||
line-ending = "auto"
|
line-ending = "auto"
|
||||||
|
|
||||||
[tool.uv.pip]
|
[tool.uv.pip]
|
||||||
python-version = "3.11"
|
python-version = "3.12"
|
||||||
no-strip-extras=true
|
no-strip-extras=true
|
||||||
generate-hashes=true
|
generate-hashes=true
|
||||||
|
|
||||||
|
|
|
||||||
|
|
@ -9,9 +9,9 @@ python:
|
||||||
- requirements: src/backend/requirements.txt
|
- requirements: src/backend/requirements.txt
|
||||||
|
|
||||||
build:
|
build:
|
||||||
os: "ubuntu-22.04"
|
os: "ubuntu-24.04"
|
||||||
tools:
|
tools:
|
||||||
python: "3.11"
|
python: "3.12"
|
||||||
jobs:
|
jobs:
|
||||||
post_install:
|
post_install:
|
||||||
- pip install -U invoke
|
- pip install -U invoke
|
||||||
|
|
|
||||||
|
|
@ -1,11 +1,16 @@
|
||||||
"""InvenTree API version information."""
|
"""InvenTree API version information."""
|
||||||
|
|
||||||
# InvenTree API version
|
# InvenTree API version
|
||||||
INVENTREE_API_VERSION = 511
|
INVENTREE_API_VERSION = 512
|
||||||
"""Increment this API version number whenever there is a significant change to the API that any clients need to know about."""
|
"""Increment this API version number whenever there is a significant change to the API that any clients need to know about."""
|
||||||
|
|
||||||
INVENTREE_API_TEXT = """
|
INVENTREE_API_TEXT = """
|
||||||
|
|
||||||
|
v512 -> 2026-06-20 : https://github.com/inventree/InvenTree/pull/12022
|
||||||
|
- Adds optional "merge" field to each item in the Stock Transfer API endpoint
|
||||||
|
- When merge is enabled, transferred stock is combined into compatible existing stock at the destination
|
||||||
|
- Stock merge tracking entries now include an "added" delta field.
|
||||||
|
|
||||||
v511 -> 2026-06-19 : https://github.com/inventree/InvenTree/pull/12204
|
v511 -> 2026-06-19 : https://github.com/inventree/InvenTree/pull/12204
|
||||||
- Adds new filtering options to PartCategoryTree and StockLocationTree API endpoints
|
- Adds new filtering options to PartCategoryTree and StockLocationTree API endpoints
|
||||||
|
|
||||||
|
|
|
||||||
|
|
@ -23,6 +23,7 @@ from django_q.models import Task
|
||||||
from error_report.models import Error
|
from error_report.models import Error
|
||||||
from mptt.exceptions import InvalidMove
|
from mptt.exceptions import InvalidMove
|
||||||
from mptt.models import MPTTModel, TreeForeignKey
|
from mptt.models import MPTTModel, TreeForeignKey
|
||||||
|
from rest_framework.exceptions import PermissionDenied
|
||||||
from stdimage.models import StdImageField
|
from stdimage.models import StdImageField
|
||||||
from taggit.managers import TaggableManager
|
from taggit.managers import TaggableManager
|
||||||
|
|
||||||
|
|
@ -1334,8 +1335,16 @@ class InvenTreeBarcodeMixin(models.Model):
|
||||||
|
|
||||||
return generate_barcode(self)
|
return generate_barcode(self)
|
||||||
|
|
||||||
def format_matched_response(self):
|
def format_matched_response(self, user, **kwargs):
|
||||||
"""Format a standard response for a matched barcode."""
|
"""Format a standard response for a matched barcode."""
|
||||||
|
# Check permission for this object
|
||||||
|
from users.permissions import check_user_permission
|
||||||
|
|
||||||
|
if not check_user_permission(user, self, 'view'):
|
||||||
|
raise PermissionDenied(
|
||||||
|
_('User does not have permission to view this model')
|
||||||
|
)
|
||||||
|
|
||||||
data = {'pk': self.pk}
|
data = {'pk': self.pk}
|
||||||
|
|
||||||
if hasattr(self, 'get_api_url'):
|
if hasattr(self, 'get_api_url'):
|
||||||
|
|
|
||||||
|
|
@ -15,10 +15,10 @@ from datetime import timedelta as td
|
||||||
from .api_version import INVENTREE_API_TEXT, INVENTREE_API_VERSION
|
from .api_version import INVENTREE_API_TEXT, INVENTREE_API_VERSION
|
||||||
|
|
||||||
# InvenTree software version
|
# InvenTree software version
|
||||||
INVENTREE_SW_VERSION = '1.4.0 dev'
|
INVENTREE_SW_VERSION = '1.5.0 dev'
|
||||||
|
|
||||||
# Minimum supported Python version
|
# Minimum supported Python version
|
||||||
MIN_PYTHON_VERSION = (3, 11)
|
MIN_PYTHON_VERSION = (3, 12)
|
||||||
|
|
||||||
logger = logging.getLogger('inventree')
|
logger = logging.getLogger('inventree')
|
||||||
|
|
||||||
|
|
|
||||||
|
|
@ -3,7 +3,7 @@
|
||||||
from __future__ import annotations
|
from __future__ import annotations
|
||||||
|
|
||||||
from django.contrib.auth.models import User
|
from django.contrib.auth.models import User
|
||||||
from django.db.models import F, OuterRef, Q, Subquery, Sum
|
from django.db.models import DecimalField, F, OuterRef, Q, Subquery, Sum
|
||||||
from django.db.models.functions import Coalesce
|
from django.db.models.functions import Coalesce
|
||||||
from django.urls import include, path
|
from django.urls import include, path
|
||||||
from django.utils.translation import gettext_lazy as _
|
from django.utils.translation import gettext_lazy as _
|
||||||
|
|
@ -494,9 +494,25 @@ class BuildLineFilter(FilterSet):
|
||||||
|
|
||||||
def filter_allocated(self, queryset, name, value):
|
def filter_allocated(self, queryset, name, value):
|
||||||
"""Filter by whether each BuildLine is fully allocated."""
|
"""Filter by whether each BuildLine is fully allocated."""
|
||||||
|
allocated_subquery = (
|
||||||
|
BuildItem.objects
|
||||||
|
.filter(build_line=OuterRef('pk'))
|
||||||
|
.values('build_line')
|
||||||
|
.annotate(total=Sum('quantity'))
|
||||||
|
.values('total')
|
||||||
|
)
|
||||||
|
|
||||||
|
queryset = queryset.alias(
|
||||||
|
allocated_quantity=Coalesce(
|
||||||
|
Subquery(allocated_subquery), 0, output_field=DecimalField()
|
||||||
|
)
|
||||||
|
)
|
||||||
|
|
||||||
if str2bool(value):
|
if str2bool(value):
|
||||||
return queryset.filter(allocated__gte=F('quantity') - F('consumed'))
|
return queryset.filter(
|
||||||
return queryset.filter(allocated__lt=F('quantity') - F('consumed'))
|
allocated_quantity__gte=F('quantity') - F('consumed')
|
||||||
|
)
|
||||||
|
return queryset.filter(allocated_quantity__lt=F('quantity') - F('consumed'))
|
||||||
|
|
||||||
consumed = rest_filters.BooleanFilter(label=_('Consumed'), method='filter_consumed')
|
consumed = rest_filters.BooleanFilter(label=_('Consumed'), method='filter_consumed')
|
||||||
|
|
||||||
|
|
@ -528,7 +544,9 @@ class BuildLineFilter(FilterSet):
|
||||||
)
|
)
|
||||||
|
|
||||||
queryset = queryset.alias(
|
queryset = queryset.alias(
|
||||||
allocated_quantity=Coalesce(Subquery(allocated_subquery), 0)
|
allocated_quantity=Coalesce(
|
||||||
|
Subquery(allocated_subquery), 0, output_field=DecimalField()
|
||||||
|
)
|
||||||
)
|
)
|
||||||
|
|
||||||
# A query filter construct to determine the total quantity available for this BuildLine,
|
# A query filter construct to determine the total quantity available for this BuildLine,
|
||||||
|
|
|
||||||
|
|
@ -793,6 +793,14 @@ SYSTEM_SETTINGS: dict[str, InvenTreeSettingsKeyType] = {
|
||||||
'default': False,
|
'default': False,
|
||||||
'validator': bool,
|
'validator': bool,
|
||||||
},
|
},
|
||||||
|
'STOCK_MERGE_ON_TRANSFER': {
|
||||||
|
'name': _('Merge stock with existing stock on transfer by default'),
|
||||||
|
'description': _(
|
||||||
|
'Default state for merge stock on transfer behaviour. (Can be changed per transfer if desired)'
|
||||||
|
),
|
||||||
|
'default': False,
|
||||||
|
'validator': bool,
|
||||||
|
},
|
||||||
'BUILDORDER_REFERENCE_PATTERN': {
|
'BUILDORDER_REFERENCE_PATTERN': {
|
||||||
'name': _('Build Order Reference Pattern'),
|
'name': _('Build Order Reference Pattern'),
|
||||||
'description': _('Required pattern for generating Build Order reference field'),
|
'description': _('Required pattern for generating Build Order reference field'),
|
||||||
|
|
|
||||||
|
|
@ -1,19 +1,7 @@
|
||||||
"""Types for settings."""
|
"""Types for settings."""
|
||||||
|
|
||||||
import sys
|
|
||||||
from collections.abc import Callable
|
from collections.abc import Callable
|
||||||
from typing import Any, TypedDict
|
from typing import Any, NotRequired, TypedDict
|
||||||
|
|
||||||
if sys.version_info >= (3, 11):
|
|
||||||
from typing import NotRequired # pragma: no cover
|
|
||||||
else:
|
|
||||||
|
|
||||||
class NotRequired: # pragma: no cover
|
|
||||||
"""NotRequired type helper is only supported with Python 3.11+."""
|
|
||||||
|
|
||||||
def __class_getitem__(cls, item):
|
|
||||||
"""Return the item."""
|
|
||||||
return item
|
|
||||||
|
|
||||||
|
|
||||||
class SettingsKeyType(TypedDict, total=False):
|
class SettingsKeyType(TypedDict, total=False):
|
||||||
|
|
|
||||||
File diff suppressed because it is too large
Load Diff
File diff suppressed because it is too large
Load Diff
File diff suppressed because it is too large
Load Diff
File diff suppressed because it is too large
Load Diff
File diff suppressed because it is too large
Load Diff
File diff suppressed because it is too large
Load Diff
File diff suppressed because it is too large
Load Diff
File diff suppressed because it is too large
Load Diff
File diff suppressed because it is too large
Load Diff
File diff suppressed because it is too large
Load Diff
File diff suppressed because it is too large
Load Diff
File diff suppressed because it is too large
Load Diff
File diff suppressed because it is too large
Load Diff
File diff suppressed because it is too large
Load Diff
File diff suppressed because it is too large
Load Diff
File diff suppressed because it is too large
Load Diff
File diff suppressed because it is too large
Load Diff
File diff suppressed because it is too large
Load Diff
File diff suppressed because it is too large
Load Diff
File diff suppressed because it is too large
Load Diff
File diff suppressed because it is too large
Load Diff
File diff suppressed because it is too large
Load Diff
File diff suppressed because it is too large
Load Diff
File diff suppressed because it is too large
Load Diff
File diff suppressed because it is too large
Load Diff
File diff suppressed because it is too large
Load Diff
File diff suppressed because it is too large
Load Diff
File diff suppressed because it is too large
Load Diff
File diff suppressed because it is too large
Load Diff
File diff suppressed because it is too large
Load Diff
File diff suppressed because it is too large
Load Diff
File diff suppressed because it is too large
Load Diff
File diff suppressed because it is too large
Load Diff
File diff suppressed because it is too large
Load Diff
File diff suppressed because it is too large
Load Diff
File diff suppressed because it is too large
Load Diff
File diff suppressed because it is too large
Load Diff
File diff suppressed because it is too large
Load Diff
File diff suppressed because it is too large
Load Diff
|
|
@ -153,7 +153,9 @@ class BarcodeView(CreateAPIView):
|
||||||
|
|
||||||
for current_plugin in plugins:
|
for current_plugin in plugins:
|
||||||
try:
|
try:
|
||||||
result = current_plugin.scan(barcode)
|
result = current_plugin.scan(barcode, user=request.user, **kwargs)
|
||||||
|
except PermissionDenied as exc:
|
||||||
|
raise exc
|
||||||
except Exception:
|
except Exception:
|
||||||
log_error('BarcodeView.scan_barcode', plugin=current_plugin.slug)
|
log_error('BarcodeView.scan_barcode', plugin=current_plugin.slug)
|
||||||
continue
|
continue
|
||||||
|
|
@ -282,7 +284,7 @@ class BarcodeAssign(BarcodeView):
|
||||||
|
|
||||||
# First check if the provided barcode matches an existing database entry
|
# First check if the provided barcode matches an existing database entry
|
||||||
if inventree_barcode_plugin:
|
if inventree_barcode_plugin:
|
||||||
result = inventree_barcode_plugin.scan(barcode)
|
result = inventree_barcode_plugin.scan(barcode, user=request.user, **kwargs)
|
||||||
|
|
||||||
if result is not None:
|
if result is not None:
|
||||||
result['error'] = _('Barcode matches existing item')
|
result['error'] = _('Barcode matches existing item')
|
||||||
|
|
@ -459,7 +461,9 @@ class BarcodePOAllocate(BarcodeView):
|
||||||
manufacturer_part=response.get('manufacturerpart', None),
|
manufacturer_part=response.get('manufacturerpart', None),
|
||||||
)
|
)
|
||||||
response['success'] = _('Matched supplier part')
|
response['success'] = _('Matched supplier part')
|
||||||
response['supplierpart'] = supplier_part.format_matched_response()
|
response['supplierpart'] = supplier_part.format_matched_response(
|
||||||
|
user=request.user
|
||||||
|
)
|
||||||
except ValidationError as e:
|
except ValidationError as e:
|
||||||
response['error'] = str(e)
|
response['error'] = str(e)
|
||||||
|
|
||||||
|
|
@ -524,7 +528,7 @@ class BarcodePOReceive(BarcodeView):
|
||||||
filter(lambda plugin: plugin.name == 'InvenTreeBarcode', plugins)
|
filter(lambda plugin: plugin.name == 'InvenTreeBarcode', plugins)
|
||||||
)
|
)
|
||||||
|
|
||||||
if result := internal_barcode_plugin.scan(barcode):
|
if result := internal_barcode_plugin.scan(barcode, user=request.user, **kwargs):
|
||||||
if 'stockitem' in result:
|
if 'stockitem' in result:
|
||||||
response['error'] = _('Item has already been received')
|
response['error'] = _('Item has already been received')
|
||||||
self.log_scan(request, response, False)
|
self.log_scan(request, response, False)
|
||||||
|
|
|
||||||
|
|
@ -42,7 +42,7 @@ class BarcodeMixin:
|
||||||
"""Does this plugin have everything needed to process a barcode."""
|
"""Does this plugin have everything needed to process a barcode."""
|
||||||
return True
|
return True
|
||||||
|
|
||||||
def scan(self, barcode_data):
|
def scan(self, barcode_data: str, user, **kwargs) -> dict | None:
|
||||||
"""Scan a barcode against this plugin.
|
"""Scan a barcode against this plugin.
|
||||||
|
|
||||||
This method is explicitly called from the /scan/ API endpoint,
|
This method is explicitly called from the /scan/ API endpoint,
|
||||||
|
|
@ -261,7 +261,7 @@ class SupplierBarcodeMixin(BarcodeMixin):
|
||||||
'extract_barcode_fields must be implemented by each plugin'
|
'extract_barcode_fields must be implemented by each plugin'
|
||||||
)
|
)
|
||||||
|
|
||||||
def scan(self, barcode_data: str) -> dict | None:
|
def scan(self, barcode_data: str, user, **kwargs) -> dict | None:
|
||||||
"""Perform a generic 'scan' operation on a supplier barcode.
|
"""Perform a generic 'scan' operation on a supplier barcode.
|
||||||
|
|
||||||
The supplier barcode may provide sufficient information to match against
|
The supplier barcode may provide sufficient information to match against
|
||||||
|
|
@ -297,7 +297,7 @@ class SupplierBarcodeMixin(BarcodeMixin):
|
||||||
for k, v in matches.items():
|
for k, v in matches.items():
|
||||||
if v and hasattr(v, 'pk'):
|
if v and hasattr(v, 'pk'):
|
||||||
has_match = True
|
has_match = True
|
||||||
data[k] = v.format_matched_response()
|
data[k] = v.format_matched_response(user=user)
|
||||||
|
|
||||||
if not has_match:
|
if not has_match:
|
||||||
return None
|
return None
|
||||||
|
|
|
||||||
|
|
@ -15,6 +15,7 @@ class BarcodeAPITest(InvenTreeAPITestCase):
|
||||||
"""Tests for barcode api."""
|
"""Tests for barcode api."""
|
||||||
|
|
||||||
fixtures = ['category', 'part', 'location', 'stock']
|
fixtures = ['category', 'part', 'location', 'stock']
|
||||||
|
roles = ['stock.view', 'stock_location.view', 'part.view']
|
||||||
|
|
||||||
def setUp(self):
|
def setUp(self):
|
||||||
"""Setup for all tests."""
|
"""Setup for all tests."""
|
||||||
|
|
@ -259,6 +260,7 @@ class SOAllocateTest(InvenTreeAPITestCase):
|
||||||
"""Unit tests for the barcode endpoint for allocating items to a sales order."""
|
"""Unit tests for the barcode endpoint for allocating items to a sales order."""
|
||||||
|
|
||||||
fixtures = ['category', 'company', 'part', 'location', 'stock']
|
fixtures = ['category', 'company', 'part', 'location', 'stock']
|
||||||
|
roles = ['stock.view']
|
||||||
|
|
||||||
@classmethod
|
@classmethod
|
||||||
def setUpTestData(cls):
|
def setUpTestData(cls):
|
||||||
|
|
@ -343,10 +345,14 @@ class SOAllocateTest(InvenTreeAPITestCase):
|
||||||
# Test with barcode which points to a *part* instance
|
# Test with barcode which points to a *part* instance
|
||||||
item.part.assign_barcode(barcode_data='abcde')
|
item.part.assign_barcode(barcode_data='abcde')
|
||||||
|
|
||||||
|
# missing permission for viewing the part - error
|
||||||
|
self.postBarcode('abcde', sales_order=self.sales_order.pk, expected_code=403)
|
||||||
|
|
||||||
|
# Add part.view role and test again
|
||||||
|
self.assignRole('part.view')
|
||||||
result = self.postBarcode(
|
result = self.postBarcode(
|
||||||
'abcde', sales_order=self.sales_order.pk, expected_code=400
|
'abcde', sales_order=self.sales_order.pk, expected_code=400
|
||||||
)
|
)
|
||||||
|
|
||||||
self.assertIn('does not match an existing stock item', str(result['error']))
|
self.assertIn('does not match an existing stock item', str(result['error']))
|
||||||
|
|
||||||
def test_submit(self):
|
def test_submit(self):
|
||||||
|
|
|
||||||
|
|
@ -48,11 +48,11 @@ class InvenTreeInternalBarcodePlugin(SettingsMixin, BarcodeMixin, InvenTreePlugi
|
||||||
},
|
},
|
||||||
}
|
}
|
||||||
|
|
||||||
def format_matched_response(self, label, model, instance):
|
def format_matched_response(self, label, model, instance, user, **kwargs):
|
||||||
"""Format a response for the scanned data."""
|
"""Format a response for the scanned data."""
|
||||||
return {label: instance.format_matched_response()}
|
return {label: instance.format_matched_response(user=user, **kwargs)}
|
||||||
|
|
||||||
def scan(self, barcode_data):
|
def scan(self, barcode_data, user, **kwargs):
|
||||||
"""Scan a barcode against this plugin.
|
"""Scan a barcode against this plugin.
|
||||||
|
|
||||||
Here we are looking for a dict object which contains a reference to a particular InvenTree database object
|
Here we are looking for a dict object which contains a reference to a particular InvenTree database object
|
||||||
|
|
@ -79,7 +79,7 @@ class InvenTreeInternalBarcodePlugin(SettingsMixin, BarcodeMixin, InvenTreePlugi
|
||||||
|
|
||||||
try:
|
try:
|
||||||
instance = model.objects.get(pk=int(pk))
|
instance = model.objects.get(pk=int(pk))
|
||||||
return self.format_matched_response(label, model, instance)
|
return self.format_matched_response(label, model, instance, user=user)
|
||||||
except (ValueError, model.DoesNotExist):
|
except (ValueError, model.DoesNotExist):
|
||||||
pass
|
pass
|
||||||
|
|
||||||
|
|
@ -111,7 +111,9 @@ class InvenTreeInternalBarcodePlugin(SettingsMixin, BarcodeMixin, InvenTreePlugi
|
||||||
instance = model.objects.get(pk=pk)
|
instance = model.objects.get(pk=pk)
|
||||||
|
|
||||||
return {
|
return {
|
||||||
**self.format_matched_response(label, model, instance),
|
**self.format_matched_response(
|
||||||
|
label, model, instance, user=user
|
||||||
|
),
|
||||||
'success': succcess_message,
|
'success': succcess_message,
|
||||||
}
|
}
|
||||||
except (ValueError, model.DoesNotExist):
|
except (ValueError, model.DoesNotExist):
|
||||||
|
|
@ -129,7 +131,7 @@ class InvenTreeInternalBarcodePlugin(SettingsMixin, BarcodeMixin, InvenTreePlugi
|
||||||
|
|
||||||
if instance is not None:
|
if instance is not None:
|
||||||
return {
|
return {
|
||||||
**self.format_matched_response(label, model, instance),
|
**self.format_matched_response(label, model, instance, user=user),
|
||||||
'success': succcess_message,
|
'success': succcess_message,
|
||||||
}
|
}
|
||||||
|
|
||||||
|
|
|
||||||
|
|
@ -11,6 +11,7 @@ class TestInvenTreeBarcode(InvenTreeAPITestCase):
|
||||||
"""Tests for the integrated InvenTreeBarcode barcode plugin."""
|
"""Tests for the integrated InvenTreeBarcode barcode plugin."""
|
||||||
|
|
||||||
fixtures = ['category', 'part', 'location', 'stock', 'company', 'supplier_part']
|
fixtures = ['category', 'part', 'location', 'stock', 'company', 'supplier_part']
|
||||||
|
roles = ['stock.view', 'stock_location.view', 'part.view']
|
||||||
|
|
||||||
def setUp(self):
|
def setUp(self):
|
||||||
"""Set up the test case."""
|
"""Set up the test case."""
|
||||||
|
|
|
||||||
|
|
@ -14,6 +14,13 @@ class SupplierBarcodeTests(InvenTreeAPITestCase):
|
||||||
"""Tests barcode parsing for all suppliers."""
|
"""Tests barcode parsing for all suppliers."""
|
||||||
|
|
||||||
SCAN_URL = reverse('api-barcode-scan')
|
SCAN_URL = reverse('api-barcode-scan')
|
||||||
|
roles = [
|
||||||
|
'stock.view',
|
||||||
|
'stock_location.view',
|
||||||
|
'part.view',
|
||||||
|
'company.view',
|
||||||
|
'order.view',
|
||||||
|
]
|
||||||
|
|
||||||
@classmethod
|
@classmethod
|
||||||
def setUpTestData(cls):
|
def setUpTestData(cls):
|
||||||
|
|
@ -176,6 +183,8 @@ class SupplierBarcodeTests(InvenTreeAPITestCase):
|
||||||
class SupplierBarcodePOReceiveTests(InvenTreeAPITestCase):
|
class SupplierBarcodePOReceiveTests(InvenTreeAPITestCase):
|
||||||
"""Tests barcode scanning to receive a purchase order item."""
|
"""Tests barcode scanning to receive a purchase order item."""
|
||||||
|
|
||||||
|
roles = ['stock.view', 'stock_location.view']
|
||||||
|
|
||||||
def setUp(self):
|
def setUp(self):
|
||||||
"""Create supplier part and purchase_order."""
|
"""Create supplier part and purchase_order."""
|
||||||
super().setUp()
|
super().setUp()
|
||||||
|
|
|
||||||
|
|
@ -108,9 +108,6 @@ def handle_error(error, do_raise: bool = True, do_log: bool = True, log_name: st
|
||||||
|
|
||||||
def get_entrypoints():
|
def get_entrypoints():
|
||||||
"""Returns list for entrypoints for InvenTree plugins."""
|
"""Returns list for entrypoints for InvenTree plugins."""
|
||||||
# on python before 3.12, we need to use importlib_metadata
|
|
||||||
if sys.version_info < (3, 12):
|
|
||||||
return entry_points().get('inventree_plugins', [])
|
|
||||||
return entry_points(group='inventree_plugins')
|
return entry_points(group='inventree_plugins')
|
||||||
|
|
||||||
|
|
||||||
|
|
@ -190,13 +187,11 @@ def get_modules(pkg, path=None):
|
||||||
continue
|
continue
|
||||||
|
|
||||||
try:
|
try:
|
||||||
if sys.version_info < (3, 12):
|
spec = finder.find_spec(name, path)
|
||||||
module = finder.find_module(name).load_module(name)
|
module = module_from_spec(spec)
|
||||||
else:
|
sys.modules[name] = module
|
||||||
spec = finder.find_spec(name)
|
spec.loader.exec_module(module)
|
||||||
module = module_from_spec(spec)
|
|
||||||
sys.modules[name] = module
|
|
||||||
spec.loader.exec_module(module)
|
|
||||||
pkg_names = getattr(module, '__all__', None)
|
pkg_names = getattr(module, '__all__', None)
|
||||||
for k, v in vars(module).items():
|
for k, v in vars(module).items():
|
||||||
if not k.startswith('_') and (pkg_names is None or k in pkg_names):
|
if not k.startswith('_') and (pkg_names is None or k in pkg_names):
|
||||||
|
|
|
||||||
|
|
@ -117,8 +117,7 @@ def plugins_file_hash():
|
||||||
|
|
||||||
try:
|
try:
|
||||||
with pf.open('rb') as f:
|
with pf.open('rb') as f:
|
||||||
# Note: Once we support 3.11 as a minimum, we can use hashlib.file_digest
|
return hashlib.file_digest(f, 'sha256').hexdigest()
|
||||||
return hashlib.sha256(f.read()).hexdigest()
|
|
||||||
except Exception:
|
except Exception:
|
||||||
log_error('plugins_file_hash', scope='plugins')
|
log_error('plugins_file_hash', scope='plugins')
|
||||||
return None
|
return None
|
||||||
|
|
|
||||||
|
|
@ -7,6 +7,7 @@ import warnings
|
||||||
from datetime import datetime
|
from datetime import datetime
|
||||||
from importlib.metadata import PackageNotFoundError, metadata
|
from importlib.metadata import PackageNotFoundError, metadata
|
||||||
from pathlib import Path
|
from pathlib import Path
|
||||||
|
from sysconfig import get_path
|
||||||
from typing import Optional
|
from typing import Optional
|
||||||
|
|
||||||
from django.conf import settings
|
from django.conf import settings
|
||||||
|
|
@ -517,7 +518,6 @@ class InvenTreePlugin(VersionMixin, MixinBase, MetaBase):
|
||||||
return InvenTree.helpers.pui_url(f'/settings/admin/plugin/{config.pk}/')
|
return InvenTree.helpers.pui_url(f'/settings/admin/plugin/{config.pk}/')
|
||||||
return InvenTree.helpers.pui_url('/settings/admin/plugin/')
|
return InvenTree.helpers.pui_url('/settings/admin/plugin/')
|
||||||
|
|
||||||
# region package info
|
|
||||||
@mark_final
|
@mark_final
|
||||||
def _get_package_commit(self):
|
def _get_package_commit(self):
|
||||||
"""Get last git commit for the plugin."""
|
"""Get last git commit for the plugin."""
|
||||||
|
|
@ -527,10 +527,9 @@ class InvenTreePlugin(VersionMixin, MixinBase, MetaBase):
|
||||||
@mark_final
|
@mark_final
|
||||||
def is_editable(cls):
|
def is_editable(cls):
|
||||||
"""Returns if the current part is editable."""
|
"""Returns if the current part is editable."""
|
||||||
from distutils.sysconfig import get_python_lib
|
|
||||||
|
|
||||||
pkg_name = cls.__name__.split('.')[0]
|
pkg_name = cls.__name__.split('.')[0]
|
||||||
dist_info = list(Path(get_python_lib()).glob(f'{pkg_name}-*.dist-info'))
|
py_lib = get_path('platlib')
|
||||||
|
dist_info = list(Path(py_lib).glob(f'{pkg_name}-*.dist-info'))
|
||||||
return bool(len(dist_info) == 1)
|
return bool(len(dist_info) == 1)
|
||||||
|
|
||||||
@classmethod
|
@classmethod
|
||||||
|
|
|
||||||
|
|
@ -585,15 +585,9 @@ class PluginsRegistry:
|
||||||
|
|
||||||
# Gather Modules
|
# Gather Modules
|
||||||
if parent_path:
|
if parent_path:
|
||||||
# On python 3.12 use new loader method
|
raw_module = SourceFileLoader(
|
||||||
if sys.version_info < (3, 12):
|
plugin_dir, str(parent_obj.joinpath('__init__.py'))
|
||||||
raw_module = _load_source(
|
).load_module()
|
||||||
plugin_dir, str(parent_obj.joinpath('__init__.py'))
|
|
||||||
)
|
|
||||||
else:
|
|
||||||
raw_module = SourceFileLoader(
|
|
||||||
plugin_dir, str(parent_obj.joinpath('__init__.py'))
|
|
||||||
).load_module()
|
|
||||||
else:
|
else:
|
||||||
raw_module = importlib.import_module(plugin_dir)
|
raw_module = importlib.import_module(plugin_dir)
|
||||||
|
|
||||||
|
|
|
||||||
|
|
@ -1,6 +1,7 @@
|
||||||
"""Template tags for rendering various barcodes."""
|
"""Template tags for rendering various barcodes."""
|
||||||
|
|
||||||
from django import template
|
from django import template
|
||||||
|
from django.core.exceptions import ValidationError
|
||||||
from django.utils.safestring import mark_safe
|
from django.utils.safestring import mark_safe
|
||||||
|
|
||||||
import barcode as python_barcode
|
import barcode as python_barcode
|
||||||
|
|
@ -70,7 +71,7 @@ def qrcode(data: str, **kwargs) -> str:
|
||||||
data = str(data).strip()
|
data = str(data).strip()
|
||||||
|
|
||||||
if not data:
|
if not data:
|
||||||
raise ValueError("No data provided to 'qrcode' template tag")
|
raise ValidationError("qrcode: No data provided to 'qrcode' template tag")
|
||||||
|
|
||||||
# Extract other arguments from kwargs
|
# Extract other arguments from kwargs
|
||||||
fill_color = kwargs.pop('fill_color', 'black')
|
fill_color = kwargs.pop('fill_color', 'black')
|
||||||
|
|
@ -115,7 +116,7 @@ def barcode(data: str, barcode_class='code128', **kwargs) -> str:
|
||||||
data = str(data).strip()
|
data = str(data).strip()
|
||||||
|
|
||||||
if not data:
|
if not data:
|
||||||
raise ValueError("No data provided to 'barcode' template tag")
|
raise ValidationError("barcode: No data provided to 'barcode' template tag")
|
||||||
|
|
||||||
constructor = python_barcode.get_barcode_class(barcode_class)
|
constructor = python_barcode.get_barcode_class(barcode_class)
|
||||||
|
|
||||||
|
|
@ -134,17 +135,26 @@ def barcode(data: str, barcode_class='code128', **kwargs) -> str:
|
||||||
|
|
||||||
|
|
||||||
@register.simple_tag()
|
@register.simple_tag()
|
||||||
def datamatrix(data: str, **kwargs) -> str:
|
def datamatrix(
|
||||||
|
data: str,
|
||||||
|
rectangular: bool = False,
|
||||||
|
fill_color: str = 'black',
|
||||||
|
back_color: str = 'white',
|
||||||
|
scale: float = 1.0,
|
||||||
|
border: int = 1,
|
||||||
|
fmt: str = 'PNG',
|
||||||
|
**kwargs,
|
||||||
|
) -> str:
|
||||||
"""Render a DataMatrix barcode.
|
"""Render a DataMatrix barcode.
|
||||||
|
|
||||||
Arguments:
|
Arguments:
|
||||||
data: Data to encode
|
data: Data to encode
|
||||||
|
rectangular: Whether to generate a rectangular DataMatrix (default = False)
|
||||||
Keyword Arguments:
|
fill_color: Foreground color (default = 'black')
|
||||||
fill_color (str): Foreground color (default = 'black')
|
back_color: Background color (default = 'white')
|
||||||
back_color (str): Background color (default = 'white')
|
scale: Scaling factor (default = 1)
|
||||||
scale (float): Matrix scaling factor (default = 1)
|
border: Border width (default = 1)
|
||||||
border (int): Border width (default = 1)
|
fmt: Generated image format (default = 'PNG')
|
||||||
|
|
||||||
Returns:
|
Returns:
|
||||||
image (str): base64 encoded image data
|
image (str): base64 encoded image data
|
||||||
|
|
@ -154,14 +164,11 @@ def datamatrix(data: str, **kwargs) -> str:
|
||||||
data = str(data).strip()
|
data = str(data).strip()
|
||||||
|
|
||||||
if not data:
|
if not data:
|
||||||
raise ValueError("No data provided to 'datamatrix' template tag")
|
raise ValidationError(
|
||||||
|
"datamatrix: No data provided to 'datamatrix' template tag"
|
||||||
|
)
|
||||||
|
|
||||||
dm = DataMatrix(data)
|
dm = DataMatrix(data, rect=rectangular)
|
||||||
|
|
||||||
fill_color = kwargs.pop('fill_color', 'black')
|
|
||||||
back_color = kwargs.pop('back_color', 'white')
|
|
||||||
|
|
||||||
border = kwargs.pop('border', 1)
|
|
||||||
|
|
||||||
try:
|
try:
|
||||||
border = int(border)
|
border = int(border)
|
||||||
|
|
@ -180,8 +187,6 @@ def datamatrix(data: str, **kwargs) -> str:
|
||||||
except Exception:
|
except Exception:
|
||||||
bg = ImageColor.getcolor('white', 'RGB')
|
bg = ImageColor.getcolor('white', 'RGB')
|
||||||
|
|
||||||
scale = kwargs.pop('scale', 1)
|
|
||||||
|
|
||||||
height = len(dm.matrix) + 2 * border
|
height = len(dm.matrix) + 2 * border
|
||||||
width = len(dm.matrix[0]) + 2 * border
|
width = len(dm.matrix[0]) + 2 * border
|
||||||
|
|
||||||
|
|
@ -193,7 +198,8 @@ def datamatrix(data: str, **kwargs) -> str:
|
||||||
if value:
|
if value:
|
||||||
img.putpixel((x + border, y + border), fg)
|
img.putpixel((x + border, y + border), fg)
|
||||||
|
|
||||||
if scale != 1:
|
img = img.resize(
|
||||||
img = img.resize((int(width * scale), int(height * scale)))
|
(int(width * scale), int(height * scale)), Image.Resampling.NEAREST
|
||||||
|
)
|
||||||
|
|
||||||
return image_data(img, fmt='PNG')
|
return image_data(img, fmt=fmt)
|
||||||
|
|
|
||||||
|
|
@ -440,7 +440,6 @@ class ReportTagTest(PartImageTestMixin, InvenTreeTestCase):
|
||||||
]
|
]
|
||||||
|
|
||||||
for tz, fmt, locale, expected in tests:
|
for tz, fmt, locale, expected in tests:
|
||||||
print(tz, fmt, locale, expected)
|
|
||||||
result = report_tags.format_datetime(
|
result = report_tags.format_datetime(
|
||||||
time, timezone=tz, fmt=fmt, locale=locale
|
time, timezone=tz, fmt=fmt, locale=locale
|
||||||
)
|
)
|
||||||
|
|
@ -857,7 +856,7 @@ class BarcodeTagTest(TestCase):
|
||||||
self.assertTrue(barcode.startswith('data:image/bmp;'))
|
self.assertTrue(barcode.startswith('data:image/bmp;'))
|
||||||
|
|
||||||
# Test empty tag
|
# Test empty tag
|
||||||
with self.assertRaises(ValueError):
|
with self.assertRaises(ValidationError):
|
||||||
barcode_tags.barcode('')
|
barcode_tags.barcode('')
|
||||||
|
|
||||||
def test_qrcode(self):
|
def test_qrcode(self):
|
||||||
|
|
@ -877,7 +876,7 @@ class BarcodeTagTest(TestCase):
|
||||||
self.assertEqual(len(qrcode), 309720)
|
self.assertEqual(len(qrcode), 309720)
|
||||||
|
|
||||||
# Test empty tag
|
# Test empty tag
|
||||||
with self.assertRaises(ValueError):
|
with self.assertRaises(ValidationError):
|
||||||
barcode_tags.qrcode('')
|
barcode_tags.qrcode('')
|
||||||
|
|
||||||
def test_clean_barcode(self):
|
def test_clean_barcode(self):
|
||||||
|
|
@ -908,7 +907,7 @@ class BarcodeTagTest(TestCase):
|
||||||
)
|
)
|
||||||
|
|
||||||
# Test empty tag
|
# Test empty tag
|
||||||
with self.assertRaises(ValueError):
|
with self.assertRaises(ValidationError):
|
||||||
barcode_tags.datamatrix('')
|
barcode_tags.datamatrix('')
|
||||||
|
|
||||||
# Failure cases with wrong args
|
# Failure cases with wrong args
|
||||||
|
|
|
||||||
|
|
@ -2206,6 +2206,35 @@ class StockItem(
|
||||||
|
|
||||||
return True
|
return True
|
||||||
|
|
||||||
|
def find_merge_target(self, location):
|
||||||
|
"""Find an existing stock item at location that can absorb this item."""
|
||||||
|
if location is None:
|
||||||
|
return None
|
||||||
|
|
||||||
|
candidates = list(
|
||||||
|
StockItem.objects
|
||||||
|
.filter(part=self.part, location=location)
|
||||||
|
.exclude(pk=self.pk)
|
||||||
|
.order_by('pk')
|
||||||
|
)
|
||||||
|
|
||||||
|
if not candidates:
|
||||||
|
return None
|
||||||
|
|
||||||
|
if self.batch:
|
||||||
|
batch_matches = [c for c in candidates if c.batch == self.batch]
|
||||||
|
search_order = batch_matches + [
|
||||||
|
c for c in candidates if c not in batch_matches
|
||||||
|
]
|
||||||
|
else:
|
||||||
|
search_order = candidates
|
||||||
|
|
||||||
|
for target in search_order:
|
||||||
|
if target.can_merge(other=self, raise_error=False):
|
||||||
|
return target
|
||||||
|
|
||||||
|
return None
|
||||||
|
|
||||||
@transaction.atomic
|
@transaction.atomic
|
||||||
def merge_stock_items(self, other_items, raise_error=False, **kwargs):
|
def merge_stock_items(self, other_items, raise_error=False, **kwargs):
|
||||||
"""Merge another stock item into this one; the two become one!
|
"""Merge another stock item into this one; the two become one!
|
||||||
|
|
@ -2227,7 +2256,7 @@ class StockItem(
|
||||||
|
|
||||||
user = kwargs.get('user')
|
user = kwargs.get('user')
|
||||||
location = kwargs.get('location', self.location)
|
location = kwargs.get('location', self.location)
|
||||||
notes = kwargs.get('notes')
|
notes = kwargs.get('notes') or ''
|
||||||
|
|
||||||
parent_id = self.parent.pk if self.parent else None
|
parent_id = self.parent.pk if self.parent else None
|
||||||
|
|
||||||
|
|
@ -2245,9 +2274,12 @@ class StockItem(
|
||||||
)
|
)
|
||||||
return
|
return
|
||||||
|
|
||||||
|
merged_quantity = Decimal(0)
|
||||||
|
|
||||||
for other in other_items:
|
for other in other_items:
|
||||||
tree_ids.add(other.tree_id)
|
tree_ids.add(other.tree_id)
|
||||||
|
|
||||||
|
merged_quantity += other.quantity
|
||||||
self.quantity += other.quantity
|
self.quantity += other.quantity
|
||||||
|
|
||||||
if other.purchase_price:
|
if other.purchase_price:
|
||||||
|
|
@ -2271,15 +2303,25 @@ class StockItem(
|
||||||
|
|
||||||
other.delete()
|
other.delete()
|
||||||
|
|
||||||
|
transfer_deltas = kwargs.pop('transfer_deltas', None)
|
||||||
|
|
||||||
|
tracking_deltas = {
|
||||||
|
'quantity': float(self.quantity),
|
||||||
|
'added': float(merged_quantity),
|
||||||
|
}
|
||||||
|
|
||||||
|
if location:
|
||||||
|
tracking_deltas['location'] = location.pk
|
||||||
|
|
||||||
|
if transfer_deltas:
|
||||||
|
tracking_deltas = {**transfer_deltas, **tracking_deltas}
|
||||||
|
|
||||||
self.add_tracking_entry(
|
self.add_tracking_entry(
|
||||||
StockHistoryCode.MERGED_STOCK_ITEMS,
|
StockHistoryCode.MERGED_STOCK_ITEMS,
|
||||||
user,
|
user,
|
||||||
quantity=self.quantity,
|
quantity=self.quantity,
|
||||||
notes=notes,
|
notes=notes,
|
||||||
deltas={
|
deltas=tracking_deltas,
|
||||||
'location': location.pk if location else None,
|
|
||||||
'quantity': self.quantity,
|
|
||||||
},
|
|
||||||
)
|
)
|
||||||
|
|
||||||
# Update the location of the item
|
# Update the location of the item
|
||||||
|
|
@ -2340,6 +2382,8 @@ class StockItem(
|
||||||
status: If provided, override the status (default = existing status)
|
status: If provided, override the status (default = existing status)
|
||||||
packaging: If provided, override the packaging (default = existing packaging)
|
packaging: If provided, override the packaging (default = existing packaging)
|
||||||
allow_production: If True, allow splitting of stock which is in production (default = False)
|
allow_production: If True, allow splitting of stock which is in production (default = False)
|
||||||
|
record_tracking: If False, skip tracking entries (for merge-on-transfer)
|
||||||
|
split_transfer_deltas: Optional dict to receive split tracking deltas
|
||||||
|
|
||||||
Returns:
|
Returns:
|
||||||
The new StockItem object
|
The new StockItem object
|
||||||
|
|
@ -2352,6 +2396,8 @@ class StockItem(
|
||||||
"""
|
"""
|
||||||
# Run initial checks to test if the stock item can actually be "split"
|
# Run initial checks to test if the stock item can actually be "split"
|
||||||
allow_production = kwargs.get('allow_production', False)
|
allow_production = kwargs.get('allow_production', False)
|
||||||
|
record_tracking = kwargs.pop('record_tracking', True)
|
||||||
|
split_transfer_deltas = kwargs.pop('split_transfer_deltas', None)
|
||||||
|
|
||||||
# Cannot split a stock item which is in production
|
# Cannot split a stock item which is in production
|
||||||
if self.is_building and not allow_production:
|
if self.is_building and not allow_production:
|
||||||
|
|
@ -2424,15 +2470,23 @@ class StockItem(
|
||||||
|
|
||||||
new_stock.save(add_note=False)
|
new_stock.save(add_note=False)
|
||||||
|
|
||||||
# Add a stock tracking entry for the newly created item
|
if split_transfer_deltas is not None:
|
||||||
new_stock.add_tracking_entry(
|
split_transfer_deltas.clear()
|
||||||
StockHistoryCode.SPLIT_FROM_PARENT,
|
split_transfer_deltas.update(deltas)
|
||||||
user,
|
|
||||||
quantity=quantity,
|
if location:
|
||||||
notes=notes,
|
split_transfer_deltas['location'] = location.pk
|
||||||
location=location,
|
|
||||||
deltas=deltas,
|
if record_tracking:
|
||||||
)
|
# Add a stock tracking entry for the newly created item
|
||||||
|
new_stock.add_tracking_entry(
|
||||||
|
StockHistoryCode.SPLIT_FROM_PARENT,
|
||||||
|
user,
|
||||||
|
quantity=quantity,
|
||||||
|
notes=notes,
|
||||||
|
location=location,
|
||||||
|
deltas=deltas,
|
||||||
|
)
|
||||||
|
|
||||||
# Copy the test results of this part to the new one
|
# Copy the test results of this part to the new one
|
||||||
new_stock.copyTestResultsFrom(self)
|
new_stock.copyTestResultsFrom(self)
|
||||||
|
|
@ -2445,6 +2499,7 @@ class StockItem(
|
||||||
notes=notes,
|
notes=notes,
|
||||||
location=location,
|
location=location,
|
||||||
stockitem=new_stock,
|
stockitem=new_stock,
|
||||||
|
record_tracking=record_tracking,
|
||||||
)
|
)
|
||||||
|
|
||||||
# Rebuild the tree for this parent item
|
# Rebuild the tree for this parent item
|
||||||
|
|
@ -2754,7 +2809,10 @@ class StockItem(
|
||||||
code: The stock history code to use
|
code: The stock history code to use
|
||||||
notes: Optional notes for the stock removal
|
notes: Optional notes for the stock removal
|
||||||
status: Optionally adjust the stock status
|
status: Optionally adjust the stock status
|
||||||
|
record_tracking: If False, skip creating a tracking entry
|
||||||
"""
|
"""
|
||||||
|
record_tracking = kwargs.pop('record_tracking', True)
|
||||||
|
|
||||||
# Cannot remove items from a serialized part
|
# Cannot remove items from a serialized part
|
||||||
if self.serialized:
|
if self.serialized:
|
||||||
return False
|
return False
|
||||||
|
|
@ -2804,9 +2862,10 @@ class StockItem(
|
||||||
|
|
||||||
self.save(add_note=False)
|
self.save(add_note=False)
|
||||||
|
|
||||||
self.add_tracking_entry(
|
if record_tracking:
|
||||||
code, user, notes=kwargs.get('notes', ''), deltas=deltas
|
self.add_tracking_entry(
|
||||||
)
|
code, user, notes=kwargs.get('notes', ''), deltas=deltas
|
||||||
|
)
|
||||||
|
|
||||||
return True
|
return True
|
||||||
|
|
||||||
|
|
|
||||||
|
|
@ -1648,7 +1648,7 @@ class StockAdjustmentItemSerializer(serializers.Serializer):
|
||||||
class Meta:
|
class Meta:
|
||||||
"""Metaclass options."""
|
"""Metaclass options."""
|
||||||
|
|
||||||
fields = ['pk', 'quantity', 'batch', 'status', 'packaging']
|
fields = ['pk', 'quantity', 'batch', 'status', 'packaging', 'merge']
|
||||||
|
|
||||||
def __init__(self, *args, **kwargs):
|
def __init__(self, *args, **kwargs):
|
||||||
"""Initialize the serializer."""
|
"""Initialize the serializer."""
|
||||||
|
|
@ -1722,6 +1722,15 @@ class StockAdjustmentItemSerializer(serializers.Serializer):
|
||||||
help_text=_('Packaging this stock item is stored in'),
|
help_text=_('Packaging this stock item is stored in'),
|
||||||
)
|
)
|
||||||
|
|
||||||
|
merge = serializers.BooleanField(
|
||||||
|
default=False,
|
||||||
|
required=False,
|
||||||
|
label=_('Merge into existing stock'),
|
||||||
|
help_text=_(
|
||||||
|
'Merge this item into existing stock at the destination if possible'
|
||||||
|
),
|
||||||
|
)
|
||||||
|
|
||||||
|
|
||||||
class StockAdjustmentSerializer(serializers.Serializer):
|
class StockAdjustmentSerializer(serializers.Serializer):
|
||||||
"""Base class for managing stock adjustment actions via the API."""
|
"""Base class for managing stock adjustment actions via the API."""
|
||||||
|
|
@ -1888,6 +1897,7 @@ class StockTransferSerializer(StockAdjustmentSerializer):
|
||||||
# Required fields
|
# Required fields
|
||||||
stock_item = item['pk']
|
stock_item = item['pk']
|
||||||
quantity = item['quantity']
|
quantity = item['quantity']
|
||||||
|
merge = item.get('merge', False)
|
||||||
|
|
||||||
# Optional fields
|
# Optional fields
|
||||||
kwargs = {}
|
kwargs = {}
|
||||||
|
|
@ -1896,6 +1906,47 @@ class StockTransferSerializer(StockAdjustmentSerializer):
|
||||||
if field_value := item.get(field_name, None):
|
if field_value := item.get(field_name, None):
|
||||||
kwargs[field_name] = field_value
|
kwargs[field_name] = field_value
|
||||||
|
|
||||||
|
if merge:
|
||||||
|
target = stock_item.find_merge_target(location)
|
||||||
|
|
||||||
|
if target:
|
||||||
|
merge_kwargs = {
|
||||||
|
'location': location,
|
||||||
|
'notes': notes,
|
||||||
|
'user': request.user,
|
||||||
|
**kwargs,
|
||||||
|
}
|
||||||
|
|
||||||
|
if quantity < stock_item.quantity:
|
||||||
|
transfer_deltas = {}
|
||||||
|
|
||||||
|
piece = stock_item.splitStock(
|
||||||
|
quantity,
|
||||||
|
location,
|
||||||
|
request.user,
|
||||||
|
notes=notes,
|
||||||
|
allow_production=True,
|
||||||
|
record_tracking=False,
|
||||||
|
split_transfer_deltas=transfer_deltas,
|
||||||
|
**kwargs,
|
||||||
|
)
|
||||||
|
merge_kwargs['transfer_deltas'] = transfer_deltas
|
||||||
|
target.merge_stock_items([piece], **merge_kwargs)
|
||||||
|
else:
|
||||||
|
transfer_deltas = {'stockitem': stock_item.pk}
|
||||||
|
|
||||||
|
if location:
|
||||||
|
transfer_deltas['location'] = location.pk
|
||||||
|
|
||||||
|
for field_name in StockItem.optional_transfer_fields():
|
||||||
|
if field_name in kwargs:
|
||||||
|
transfer_deltas[field_name] = kwargs[field_name]
|
||||||
|
|
||||||
|
merge_kwargs['transfer_deltas'] = transfer_deltas
|
||||||
|
target.merge_stock_items([stock_item], **merge_kwargs)
|
||||||
|
|
||||||
|
continue
|
||||||
|
|
||||||
stock_item.move(
|
stock_item.move(
|
||||||
location, notes, request.user, quantity=quantity, **kwargs
|
location, notes, request.user, quantity=quantity, **kwargs
|
||||||
)
|
)
|
||||||
|
|
|
||||||
|
|
@ -2412,6 +2412,178 @@ class StocktakeTest(StockAPITestCase):
|
||||||
self.assertIn('does not exist', str(response.data['location']))
|
self.assertIn('does not exist', str(response.data['location']))
|
||||||
|
|
||||||
|
|
||||||
|
class StockTransferMergeTest(StockAPITestCase):
|
||||||
|
"""Tests for optional merge-on-transfer behavior."""
|
||||||
|
|
||||||
|
def setUp(self):
|
||||||
|
"""Set up stock items for merge transfer tests."""
|
||||||
|
super().setUp()
|
||||||
|
|
||||||
|
self.part = Part.objects.get(pk=1)
|
||||||
|
self.dest = StockLocation.objects.get(pk=2)
|
||||||
|
self.source_loc = StockLocation.objects.get(pk=5)
|
||||||
|
self.url = reverse('api-stock-transfer')
|
||||||
|
|
||||||
|
# Remove fixture stock at the destination so merge targets are deterministic
|
||||||
|
StockItem.objects.filter(part=self.part, location=self.dest).delete()
|
||||||
|
|
||||||
|
def test_transfer_without_merge_creates_separate_lot(self):
|
||||||
|
"""Transfer without merge leaves multiple stock rows at destination."""
|
||||||
|
existing = StockItem.objects.create(
|
||||||
|
part=self.part, location=self.dest, quantity=100
|
||||||
|
)
|
||||||
|
incoming = StockItem.objects.create(
|
||||||
|
part=self.part, location=self.source_loc, quantity=50
|
||||||
|
)
|
||||||
|
|
||||||
|
self.post(
|
||||||
|
self.url,
|
||||||
|
{
|
||||||
|
'items': [{'pk': incoming.pk, 'quantity': 50, 'merge': False}],
|
||||||
|
'location': self.dest.pk,
|
||||||
|
},
|
||||||
|
expected_code=201,
|
||||||
|
)
|
||||||
|
|
||||||
|
self.assertEqual(
|
||||||
|
StockItem.objects.filter(part=self.part, location=self.dest).count(), 2
|
||||||
|
)
|
||||||
|
|
||||||
|
existing.refresh_from_db()
|
||||||
|
self.assertEqual(existing.quantity, 100)
|
||||||
|
|
||||||
|
def test_transfer_with_merge_combines_lots(self):
|
||||||
|
"""Transfer with merge combines into an existing compatible lot."""
|
||||||
|
existing = StockItem.objects.create(
|
||||||
|
part=self.part, location=self.dest, quantity=100
|
||||||
|
)
|
||||||
|
incoming = StockItem.objects.create(
|
||||||
|
part=self.part, location=self.source_loc, quantity=50
|
||||||
|
)
|
||||||
|
|
||||||
|
self.post(
|
||||||
|
self.url,
|
||||||
|
{
|
||||||
|
'items': [{'pk': incoming.pk, 'quantity': 50, 'merge': True}],
|
||||||
|
'location': self.dest.pk,
|
||||||
|
},
|
||||||
|
expected_code=201,
|
||||||
|
)
|
||||||
|
|
||||||
|
self.assertEqual(
|
||||||
|
StockItem.objects.filter(part=self.part, location=self.dest).count(), 1
|
||||||
|
)
|
||||||
|
|
||||||
|
existing.refresh_from_db()
|
||||||
|
self.assertEqual(existing.quantity, 150)
|
||||||
|
self.assertFalse(StockItem.objects.filter(pk=incoming.pk).exists())
|
||||||
|
|
||||||
|
def test_transfer_mixed_merge_per_item(self):
|
||||||
|
"""Each transfer line can merge or move independently."""
|
||||||
|
existing = StockItem.objects.create(
|
||||||
|
part=self.part, location=self.dest, quantity=100
|
||||||
|
)
|
||||||
|
merge_incoming = StockItem.objects.create(
|
||||||
|
part=self.part, location=self.source_loc, quantity=30
|
||||||
|
)
|
||||||
|
separate_incoming = StockItem.objects.create(
|
||||||
|
part=self.part, location=self.source_loc, quantity=20
|
||||||
|
)
|
||||||
|
|
||||||
|
self.post(
|
||||||
|
self.url,
|
||||||
|
{
|
||||||
|
'items': [
|
||||||
|
{'pk': merge_incoming.pk, 'quantity': 30, 'merge': True},
|
||||||
|
{'pk': separate_incoming.pk, 'quantity': 20, 'merge': False},
|
||||||
|
],
|
||||||
|
'location': self.dest.pk,
|
||||||
|
},
|
||||||
|
expected_code=201,
|
||||||
|
)
|
||||||
|
|
||||||
|
self.assertEqual(
|
||||||
|
StockItem.objects.filter(part=self.part, location=self.dest).count(), 2
|
||||||
|
)
|
||||||
|
|
||||||
|
existing.refresh_from_db()
|
||||||
|
self.assertEqual(existing.quantity, 130)
|
||||||
|
self.assertFalse(StockItem.objects.filter(pk=merge_incoming.pk).exists())
|
||||||
|
self.assertTrue(StockItem.objects.filter(pk=separate_incoming.pk).exists())
|
||||||
|
|
||||||
|
def test_transfer_merge_does_not_copy_source_tracking(self):
|
||||||
|
"""Transfer merge keeps destination history and adds a single merge entry."""
|
||||||
|
existing = StockItem.objects.create(
|
||||||
|
part=self.part, location=self.dest, quantity=100
|
||||||
|
)
|
||||||
|
incoming = StockItem.objects.create(
|
||||||
|
part=self.part, location=self.source_loc, quantity=50
|
||||||
|
)
|
||||||
|
|
||||||
|
incoming.add_tracking_entry(
|
||||||
|
StockHistoryCode.STOCK_UPDATE, self.user, notes='Source tracking entry'
|
||||||
|
)
|
||||||
|
|
||||||
|
incoming_pk = incoming.pk
|
||||||
|
tracking_count = existing.tracking_info.count()
|
||||||
|
|
||||||
|
self.post(
|
||||||
|
self.url,
|
||||||
|
{
|
||||||
|
'items': [{'pk': incoming.pk, 'quantity': 50, 'merge': True}],
|
||||||
|
'location': self.dest.pk,
|
||||||
|
},
|
||||||
|
expected_code=201,
|
||||||
|
)
|
||||||
|
|
||||||
|
existing.refresh_from_db()
|
||||||
|
|
||||||
|
self.assertFalse(
|
||||||
|
existing.tracking_info.filter(notes='Source tracking entry').exists()
|
||||||
|
)
|
||||||
|
self.assertEqual(existing.tracking_info.count(), tracking_count + 1)
|
||||||
|
merge_entry = existing.tracking_info.filter(
|
||||||
|
tracking_type=StockHistoryCode.MERGED_STOCK_ITEMS
|
||||||
|
).first()
|
||||||
|
self.assertIsNotNone(merge_entry)
|
||||||
|
self.assertEqual(merge_entry.deltas['added'], 50.0)
|
||||||
|
self.assertEqual(merge_entry.deltas['quantity'], 150.0)
|
||||||
|
self.assertEqual(merge_entry.deltas['stockitem'], incoming_pk)
|
||||||
|
self.assertEqual(merge_entry.deltas['location'], self.dest.pk)
|
||||||
|
|
||||||
|
def test_transfer_merge_partial_reuses_split_transfer_deltas(self):
|
||||||
|
"""Partial merge reuses split transfer deltas on the merge tracking entry."""
|
||||||
|
existing = StockItem.objects.create(
|
||||||
|
part=self.part, location=self.dest, quantity=100
|
||||||
|
)
|
||||||
|
incoming = StockItem.objects.create(
|
||||||
|
part=self.part, location=self.source_loc, quantity=100
|
||||||
|
)
|
||||||
|
|
||||||
|
self.post(
|
||||||
|
self.url,
|
||||||
|
{
|
||||||
|
'items': [{'pk': incoming.pk, 'quantity': 30, 'merge': True}],
|
||||||
|
'location': self.dest.pk,
|
||||||
|
},
|
||||||
|
expected_code=201,
|
||||||
|
)
|
||||||
|
|
||||||
|
incoming.refresh_from_db()
|
||||||
|
self.assertEqual(incoming.quantity, 70)
|
||||||
|
|
||||||
|
merge_entry = existing.tracking_info.filter(
|
||||||
|
tracking_type=StockHistoryCode.MERGED_STOCK_ITEMS
|
||||||
|
).first()
|
||||||
|
self.assertEqual(merge_entry.deltas['stockitem'], incoming.pk)
|
||||||
|
self.assertEqual(merge_entry.deltas['location'], self.dest.pk)
|
||||||
|
self.assertFalse(
|
||||||
|
incoming.tracking_info.filter(
|
||||||
|
tracking_type=StockHistoryCode.SPLIT_CHILD_ITEM
|
||||||
|
).exists()
|
||||||
|
)
|
||||||
|
|
||||||
|
|
||||||
class StockItemDeletionTest(StockAPITestCase):
|
class StockItemDeletionTest(StockAPITestCase):
|
||||||
"""Tests for stock item deletion via the API."""
|
"""Tests for stock item deletion via the API."""
|
||||||
|
|
||||||
|
|
|
||||||
|
|
@ -729,6 +729,13 @@ class StockTest(StockTestBase):
|
||||||
self.assertEqual(s1.quantity, 60)
|
self.assertEqual(s1.quantity, 60)
|
||||||
self.assertIsNone(s1.purchase_price)
|
self.assertIsNone(s1.purchase_price)
|
||||||
|
|
||||||
|
merge_entry = s1.tracking_info.filter(
|
||||||
|
tracking_type=StockHistoryCode.MERGED_STOCK_ITEMS
|
||||||
|
).first()
|
||||||
|
self.assertIsNotNone(merge_entry)
|
||||||
|
self.assertEqual(merge_entry.deltas['added'], 50.0)
|
||||||
|
self.assertEqual(merge_entry.deltas['quantity'], 60.0)
|
||||||
|
|
||||||
part.stock_items.all().delete()
|
part.stock_items.all().delete()
|
||||||
|
|
||||||
# Create some stock items with pricing information
|
# Create some stock items with pricing information
|
||||||
|
|
|
||||||
|
|
@ -594,55 +594,6 @@ sqlparse==0.5.5 \
|
||||||
# -c src/backend/requirements.txt
|
# -c src/backend/requirements.txt
|
||||||
# django
|
# django
|
||||||
# django-silk
|
# django-silk
|
||||||
tomli==2.4.1 \
|
|
||||||
--hash=sha256:01f520d4f53ef97964a240a035ec2a869fe1a37dde002b57ebc4417a27ccd853 \
|
|
||||||
--hash=sha256:0d85819802132122da43cb86656f8d1f8c6587d54ae7dcaf30e90533028b49fe \
|
|
||||||
--hash=sha256:136443dbd7e1dee43c68ac2694fde36b2849865fa258d39bf822c10e8068eac5 \
|
|
||||||
--hash=sha256:1d8591993e228b0c930c4bb0db464bdad97b3289fb981255d6c9a41aedc84b2d \
|
|
||||||
--hash=sha256:2190f2e9dd7508d2a90ded5ed369255980a1bcdd58e52f7fe24b8162bf9fedbd \
|
|
||||||
--hash=sha256:2c1c351919aca02858f740c6d33adea0c5deea37f9ecca1cc1ef9e884a619d26 \
|
|
||||||
--hash=sha256:36d2bd2ad5fb9eaddba5226aa02c8ec3fa4f192631e347b3ed28186d43be6b54 \
|
|
||||||
--hash=sha256:3d48a93ee1c9b79c04bb38772ee1b64dcf18ff43085896ea460ca8dec96f35f6 \
|
|
||||||
--hash=sha256:47149d5bd38761ac8be13a84864bf0b7b70bc051806bc3669ab1cbc56216b23c \
|
|
||||||
--hash=sha256:4ab97e64ccda8756376892c53a72bd1f964e519c77236368527f758fbc36a53a \
|
|
||||||
--hash=sha256:4b605484e43cdc43f0954ddae319fb75f04cc10dd80d830540060ee7cd0243cd \
|
|
||||||
--hash=sha256:504aa796fe0569bb43171066009ead363de03675276d2d121ac1a4572397870f \
|
|
||||||
--hash=sha256:51529d40e3ca50046d7606fa99ce3956a617f9b36380da3b7f0dd3dd28e68cb5 \
|
|
||||||
--hash=sha256:52c8ef851d9a240f11a88c003eacb03c31fc1c9c4ec64a99a0f922b93874fda9 \
|
|
||||||
--hash=sha256:559db847dc486944896521f68d8190be1c9e719fced785720d2216fe7022b662 \
|
|
||||||
--hash=sha256:5a881ab208c0baf688221f8cecc5401bd291d67e38a1ac884d6736cbcd8247e9 \
|
|
||||||
--hash=sha256:5cb41aa38891e073ee49d55fbc7839cfdb2bc0e600add13874d048c94aadddd1 \
|
|
||||||
--hash=sha256:5e262d41726bc187e69af7825504c933b6794dc3fbd5945e41a79bb14c31f585 \
|
|
||||||
--hash=sha256:5ee18d9ebdb417e384b58fe414e8d6af9f4e7a0ae761519fb50f721de398dd4e \
|
|
||||||
--hash=sha256:7008df2e7655c495dd12d2a4ad038ff878d4ca4b81fccaf82b714e07eae4402c \
|
|
||||||
--hash=sha256:734e20b57ba95624ecf1841e72b53f6e186355e216e5412de414e3c51e5e3c41 \
|
|
||||||
--hash=sha256:7c7e1a961a0b2f2472c1ac5b69affa0ae1132c39adcb67aba98568702b9cc23f \
|
|
||||||
--hash=sha256:7f86fd587c4ed9dd76f318225e7d9b29cfc5a9d43de44e5754db8d1128487085 \
|
|
||||||
--hash=sha256:7f94b27a62cfad8496c8d2513e1a222dd446f095fca8987fceef261225538a15 \
|
|
||||||
--hash=sha256:88dceee75c2c63af144e456745e10101eb67361050196b0b6af5d717254dddf7 \
|
|
||||||
--hash=sha256:8a650c2dbafa08d42e51ba0b62740dae4ecb9338eefa093aa5c78ceb546fcd5c \
|
|
||||||
--hash=sha256:8d65a2fbf9d2f8352685bc1364177ee3923d6baf5e7f43ea4959d7d8bc326a36 \
|
|
||||||
--hash=sha256:96481a5786729fd470164b47cdb3e0e58062a496f455ee41b4403be77cb5a076 \
|
|
||||||
--hash=sha256:a120733b01c45e9a0c34aeef92bf0cf1d56cfe81ed9d47d562f9ed591a9828ac \
|
|
||||||
--hash=sha256:b1d22e6e9387bf4739fbe23bfa80e93f6b0373a7f1b96c6227c32bef95a4d7a8 \
|
|
||||||
--hash=sha256:b8c198f8c1805dc42708689ed6864951fd2494f924149d3e4bce7710f8eb5232 \
|
|
||||||
--hash=sha256:c2541745709bad0264b7d4705ad453b76ccd191e64aa6f0fc66b69a293a45ece \
|
|
||||||
--hash=sha256:c742f741d58a28940ce01d58f0ab2ea3ced8b12402f162f4d534dfe18ba1cd6a \
|
|
||||||
--hash=sha256:c7f2c7f2b9ca6bdeef8f0fa897f8e05085923eb091721675170254cbc5b02897 \
|
|
||||||
--hash=sha256:d312ef37c91508b0ab2cee7da26ec0b3ed2f03ce12bd87a588d771ae15dcf82d \
|
|
||||||
--hash=sha256:d4d8fe59808a54658fcc0160ecfb1b30f9089906c50b23bcb4c69eddc19ec2b4 \
|
|
||||||
--hash=sha256:da25dc3563bff5965356133435b757a795a17b17d01dbc0f42fb32447ddfd917 \
|
|
||||||
--hash=sha256:eab21f45c7f66c13f2a9e0e1535309cee140182a9cdae1e041d02e47291e8396 \
|
|
||||||
--hash=sha256:eb0dc4e38e6a1fd579e5d50369aa2e10acfc9cace504579b2faabb478e76941a \
|
|
||||||
--hash=sha256:ec9bfaf3ad2df51ace80688143a6a4ebc09a248f6ff781a9945e51937008fcbc \
|
|
||||||
--hash=sha256:ede3e6487c5ef5d28634ba3f31f989030ad6af71edfb0055cbbd14189ff240ba \
|
|
||||||
--hash=sha256:f3c6818a1a86dd6dca7ddcaaf76947d5ba31aecc28cb1b67009a5877c9a64f3f \
|
|
||||||
--hash=sha256:f758f1b9299d059cc3f6546ae2af89670cb1c4d48ea29c3cacc4fe7de3058257 \
|
|
||||||
--hash=sha256:f8f0fc26ec2cc2b965b7a3b87cd19c5c6b8c5e5f436b984e85f486d652285c30 \
|
|
||||||
--hash=sha256:fd0409a3653af6c147209d267a0e4243f0ae46b011aa978b1080359fddc9b6cf \
|
|
||||||
--hash=sha256:ff18e6a727ee0ab0388507b89d1bc6a22b138d1e2fa56d1ad494586d61d2eae9 \
|
|
||||||
--hash=sha256:ff2983983d34813c1aeb0fa89091e76c3a22889ee83ab27c5eeb45100560c049
|
|
||||||
# via coverage
|
|
||||||
ty==0.0.51 \
|
ty==0.0.51 \
|
||||||
--hash=sha256:08adbe53fb8bc9e7f00e89bf1d3c875a02cda76d83f109d2e6ab1ff35a7bfa8c \
|
--hash=sha256:08adbe53fb8bc9e7f00e89bf1d3c875a02cda76d83f109d2e6ab1ff35a7bfa8c \
|
||||||
--hash=sha256:25a5b31e6f23fd5dc63ad29087ded09932409e4154e2fe07bbaed015035990bb \
|
--hash=sha256:25a5b31e6f23fd5dc63ad29087ded09932409e4154e2fe07bbaed015035990bb \
|
||||||
|
|
|
||||||
|
|
@ -8,10 +8,6 @@ asgiref==3.11.1 \
|
||||||
# django-allauth
|
# django-allauth
|
||||||
# django-cors-headers
|
# django-cors-headers
|
||||||
# django-structlog
|
# django-structlog
|
||||||
async-timeout==5.0.1 \
|
|
||||||
--hash=sha256:39e3809566ff85354557ec2398b55e096c8364bacac9405a7a1fa429e77fe76c \
|
|
||||||
--hash=sha256:d9321a7a3d5a6a5e187e824d2fa0793ce379a202935782d555d6e9d2735677d3
|
|
||||||
# via redis
|
|
||||||
attrs==26.1.0 \
|
attrs==26.1.0 \
|
||||||
--hash=sha256:c647aa4a12dfbad9333ca4e71fe62ddc36f4e63b2d260a37a8b83d2f043ac309 \
|
--hash=sha256:c647aa4a12dfbad9333ca4e71fe62ddc36f4e63b2d260a37a8b83d2f043ac309 \
|
||||||
--hash=sha256:d03ceb89cb322a8fd706d4fb91940737b6642aa36998fe130a9bc96c985eff32
|
--hash=sha256:d03ceb89cb322a8fd706d4fb91940737b6642aa36998fe130a9bc96c985eff32
|
||||||
|
|
@ -1929,7 +1925,6 @@ typing-extensions==4.15.0 \
|
||||||
--hash=sha256:f0fa19c6845758ab08074a0cfa8b7aecb71c999ca73d62883bc25cc018c4e548
|
--hash=sha256:f0fa19c6845758ab08074a0cfa8b7aecb71c999ca73d62883bc25cc018c4e548
|
||||||
# via
|
# via
|
||||||
# django-redis
|
# django-redis
|
||||||
# dulwich
|
|
||||||
# flexcache
|
# flexcache
|
||||||
# flexparser
|
# flexparser
|
||||||
# grpcio
|
# grpcio
|
||||||
|
|
|
||||||
|
|
@ -7,7 +7,7 @@
|
||||||
|
|
||||||
[build.environment]
|
[build.environment]
|
||||||
VITE_DEMO = "true"
|
VITE_DEMO = "true"
|
||||||
PYTHON_VERSION = "3.11"
|
PYTHON_VERSION = "3.12"
|
||||||
|
|
||||||
# Send requests to subpath
|
# Send requests to subpath
|
||||||
|
|
||||||
|
|
|
||||||
|
|
@ -306,12 +306,17 @@ function SelectPartsStep({
|
||||||
placeholder: t`Select supplier part`,
|
placeholder: t`Select supplier part`,
|
||||||
required: true,
|
required: true,
|
||||||
autoFill: true,
|
autoFill: true,
|
||||||
|
autoFillFilters: {
|
||||||
|
active: true,
|
||||||
|
primary: true
|
||||||
|
},
|
||||||
value: record.supplier_part?.pk,
|
value: record.supplier_part?.pk,
|
||||||
onValueChange: (value, instance) => {
|
onValueChange: (value, instance) => {
|
||||||
onSelectSupplierPart(record.part.pk, instance);
|
onSelectSupplierPart(record.part.pk, instance);
|
||||||
},
|
},
|
||||||
filters: {
|
filters: {
|
||||||
part: record.part.pk,
|
part: record.part.pk,
|
||||||
|
ordering: '-primary',
|
||||||
active: true,
|
active: true,
|
||||||
part_detail: true,
|
part_detail: true,
|
||||||
supplier_detail: true
|
supplier_detail: true
|
||||||
|
|
|
||||||
|
|
@ -1,5 +1,4 @@
|
||||||
import {
|
import {
|
||||||
type MantineColorScheme,
|
|
||||||
type MantineColorSchemeManager,
|
type MantineColorSchemeManager,
|
||||||
isMantineColorScheme
|
isMantineColorScheme
|
||||||
} from '@mantine/core';
|
} from '@mantine/core';
|
||||||
|
|
@ -21,10 +20,18 @@ export function localStorageColorSchemeManager({
|
||||||
}
|
}
|
||||||
|
|
||||||
try {
|
try {
|
||||||
return (
|
const storedValue = window.localStorage.getItem(key);
|
||||||
(window.localStorage.getItem(key) as MantineColorScheme) ||
|
|
||||||
defaultValue
|
// If a value exists in storage, return it
|
||||||
);
|
if (storedValue && isMantineColorScheme(storedValue)) {
|
||||||
|
return storedValue;
|
||||||
|
}
|
||||||
|
|
||||||
|
// If no value, check the system preference
|
||||||
|
const systemPrefersDark = window.matchMedia(
|
||||||
|
'(prefers-color-scheme: dark)'
|
||||||
|
).matches;
|
||||||
|
return systemPrefersDark ? 'dark' : 'light';
|
||||||
} catch {
|
} catch {
|
||||||
return defaultValue;
|
return defaultValue;
|
||||||
}
|
}
|
||||||
|
|
|
||||||
|
|
@ -33,8 +33,16 @@ import {
|
||||||
IconUsersGroup
|
IconUsersGroup
|
||||||
} from '@tabler/icons-react';
|
} from '@tabler/icons-react';
|
||||||
import { useQuery, useSuspenseQuery } from '@tanstack/react-query';
|
import { useQuery, useSuspenseQuery } from '@tanstack/react-query';
|
||||||
|
|
||||||
import dayjs from 'dayjs';
|
import dayjs from 'dayjs';
|
||||||
import { type JSX, Suspense, useEffect, useMemo, useState } from 'react';
|
import {
|
||||||
|
type JSX,
|
||||||
|
Suspense,
|
||||||
|
useCallback,
|
||||||
|
useEffect,
|
||||||
|
useMemo,
|
||||||
|
useState
|
||||||
|
} from 'react';
|
||||||
import { useFormContext } from 'react-hook-form';
|
import { useFormContext } from 'react-hook-form';
|
||||||
import { useNavigate } from 'react-router-dom';
|
import { useNavigate } from 'react-router-dom';
|
||||||
import { api } from '../App';
|
import { api } from '../App';
|
||||||
|
|
@ -566,6 +574,7 @@ function StockOperationsRow({
|
||||||
add = false,
|
add = false,
|
||||||
setMax = false,
|
setMax = false,
|
||||||
merge = false,
|
merge = false,
|
||||||
|
transferMerge = false,
|
||||||
returnStock = false,
|
returnStock = false,
|
||||||
record
|
record
|
||||||
}: {
|
}: {
|
||||||
|
|
@ -575,6 +584,7 @@ function StockOperationsRow({
|
||||||
add?: boolean;
|
add?: boolean;
|
||||||
setMax?: boolean;
|
setMax?: boolean;
|
||||||
merge?: boolean;
|
merge?: boolean;
|
||||||
|
transferMerge?: boolean;
|
||||||
returnStock?: boolean;
|
returnStock?: boolean;
|
||||||
record?: any;
|
record?: any;
|
||||||
}) {
|
}) {
|
||||||
|
|
@ -742,6 +752,17 @@ function StockOperationsRow({
|
||||||
variant={packagingOpen ? 'filled' : 'transparent'}
|
variant={packagingOpen ? 'filled' : 'transparent'}
|
||||||
/>
|
/>
|
||||||
)}
|
)}
|
||||||
|
{transferMerge && (
|
||||||
|
<ActionButton
|
||||||
|
size='sm'
|
||||||
|
icon={<InvenTreeIcon icon='merge' />}
|
||||||
|
tooltip={t`Merge into existing stock`}
|
||||||
|
onClick={() =>
|
||||||
|
callChangeFn(props.idx, 'merge', !props.item?.merge)
|
||||||
|
}
|
||||||
|
variant={props.item?.merge ? 'filled' : 'transparent'}
|
||||||
|
/>
|
||||||
|
)}
|
||||||
<RemoveRowButton onClick={() => props.removeFn(props.idx)} />
|
<RemoveRowButton onClick={() => props.removeFn(props.idx)} />
|
||||||
</Flex>
|
</Flex>
|
||||||
</Table.Td>
|
</Table.Td>
|
||||||
|
|
@ -789,9 +810,10 @@ type StockAdjustmentItem = {
|
||||||
batch?: string;
|
batch?: string;
|
||||||
status?: number | '' | null;
|
status?: number | '' | null;
|
||||||
packaging?: string;
|
packaging?: string;
|
||||||
|
merge?: boolean;
|
||||||
};
|
};
|
||||||
|
|
||||||
function mapAdjustmentItems(items: any[]) {
|
function mapAdjustmentItems(items: any[], mergeDefault?: boolean) {
|
||||||
const mappedItems: StockAdjustmentItemWithRecord[] = items.map((elem) => {
|
const mappedItems: StockAdjustmentItemWithRecord[] = items.map((elem) => {
|
||||||
return {
|
return {
|
||||||
pk: elem.pk,
|
pk: elem.pk,
|
||||||
|
|
@ -799,6 +821,7 @@ function mapAdjustmentItems(items: any[]) {
|
||||||
batch: elem.batch || undefined,
|
batch: elem.batch || undefined,
|
||||||
status: elem.status || undefined,
|
status: elem.status || undefined,
|
||||||
packaging: elem.packaging || undefined,
|
packaging: elem.packaging || undefined,
|
||||||
|
merge: elem.merge ?? mergeDefault ?? false,
|
||||||
obj: elem
|
obj: elem
|
||||||
};
|
};
|
||||||
});
|
});
|
||||||
|
|
@ -806,7 +829,10 @@ function mapAdjustmentItems(items: any[]) {
|
||||||
return mappedItems;
|
return mappedItems;
|
||||||
}
|
}
|
||||||
|
|
||||||
function stockTransferFields(items: any[]): ApiFormFieldSet {
|
function stockTransferFields(
|
||||||
|
items: any[],
|
||||||
|
mergeDefault = false
|
||||||
|
): ApiFormFieldSet {
|
||||||
if (!items) {
|
if (!items) {
|
||||||
return {};
|
return {};
|
||||||
}
|
}
|
||||||
|
|
@ -819,7 +845,7 @@ function stockTransferFields(items: any[]): ApiFormFieldSet {
|
||||||
const fields: ApiFormFieldSet = {
|
const fields: ApiFormFieldSet = {
|
||||||
items: {
|
items: {
|
||||||
field_type: 'table',
|
field_type: 'table',
|
||||||
value: mapAdjustmentItems(items),
|
value: mapAdjustmentItems(items, mergeDefault),
|
||||||
modelRenderer: (row: TableFieldRowProps) => {
|
modelRenderer: (row: TableFieldRowProps) => {
|
||||||
const record = records[row.item.pk];
|
const record = records[row.item.pk];
|
||||||
|
|
||||||
|
|
@ -829,6 +855,7 @@ function stockTransferFields(items: any[]): ApiFormFieldSet {
|
||||||
transfer
|
transfer
|
||||||
changeStatus
|
changeStatus
|
||||||
setMax
|
setMax
|
||||||
|
transferMerge
|
||||||
key={record.pk}
|
key={record.pk}
|
||||||
record={record}
|
record={record}
|
||||||
/>
|
/>
|
||||||
|
|
@ -1379,9 +1406,20 @@ export function useRemoveStockItem(props: StockOperationProps) {
|
||||||
}
|
}
|
||||||
|
|
||||||
export function useTransferStockItem(props: StockOperationProps) {
|
export function useTransferStockItem(props: StockOperationProps) {
|
||||||
|
const globalSettings = useGlobalSettingsState();
|
||||||
|
|
||||||
|
const fieldGenerator = useCallback(
|
||||||
|
(items: any[]) =>
|
||||||
|
stockTransferFields(
|
||||||
|
items,
|
||||||
|
globalSettings.isSet('STOCK_MERGE_ON_TRANSFER')
|
||||||
|
),
|
||||||
|
[globalSettings]
|
||||||
|
);
|
||||||
|
|
||||||
return useStockOperationModal({
|
return useStockOperationModal({
|
||||||
...props,
|
...props,
|
||||||
fieldGenerator: stockTransferFields,
|
fieldGenerator: fieldGenerator,
|
||||||
endpoint: ApiEndpoints.stock_transfer,
|
endpoint: ApiEndpoints.stock_transfer,
|
||||||
title: t`Transfer Stock`,
|
title: t`Transfer Stock`,
|
||||||
successMessage: t`Stock transferred`,
|
successMessage: t`Stock transferred`,
|
||||||
|
|
|
||||||
|
|
@ -8,7 +8,7 @@ msgstr ""
|
||||||
"Language: ar\n"
|
"Language: ar\n"
|
||||||
"Project-Id-Version: inventree\n"
|
"Project-Id-Version: inventree\n"
|
||||||
"Report-Msgid-Bugs-To: \n"
|
"Report-Msgid-Bugs-To: \n"
|
||||||
"PO-Revision-Date: 2026-06-17 22:14\n"
|
"PO-Revision-Date: 2026-06-20 13:53\n"
|
||||||
"Last-Translator: \n"
|
"Last-Translator: \n"
|
||||||
"Language-Team: Arabic\n"
|
"Language-Team: Arabic\n"
|
||||||
"Plural-Forms: nplurals=6; plural=(n==0 ? 0 : n==1 ? 1 : n==2 ? 2 : n%100>=3 && n%100<=10 ? 3 : n%100>=11 && n%100<=99 ? 4 : 5);\n"
|
"Plural-Forms: nplurals=6; plural=(n==0 ? 0 : n==1 ? 1 : n==2 ? 2 : n%100>=3 && n%100<=10 ? 3 : n%100>=11 && n%100<=99 ? 4 : 5);\n"
|
||||||
|
|
@ -147,7 +147,7 @@ msgstr ""
|
||||||
#: src/forms/StockForms.tsx:1248
|
#: src/forms/StockForms.tsx:1248
|
||||||
#: src/forms/TransferOrderForms.tsx:234
|
#: src/forms/TransferOrderForms.tsx:234
|
||||||
#: src/pages/build/BuildDetail.tsx:260
|
#: src/pages/build/BuildDetail.tsx:260
|
||||||
#: src/pages/part/PartDetail.tsx:1165
|
#: src/pages/part/PartDetail.tsx:1166
|
||||||
#: src/pages/part/bom/BomCompare.tsx:203
|
#: src/pages/part/bom/BomCompare.tsx:203
|
||||||
#: src/tables/ColumnRenderers.tsx:93
|
#: src/tables/ColumnRenderers.tsx:93
|
||||||
#: src/tables/build/BuildOrderParametricTable.tsx:29
|
#: src/tables/build/BuildOrderParametricTable.tsx:29
|
||||||
|
|
@ -166,7 +166,7 @@ msgstr ""
|
||||||
#: src/pages/part/CategoryDetail.tsx:138
|
#: src/pages/part/CategoryDetail.tsx:138
|
||||||
#: src/pages/part/CategoryDetail.tsx:285
|
#: src/pages/part/CategoryDetail.tsx:285
|
||||||
#: src/pages/part/CategoryDetail.tsx:345
|
#: src/pages/part/CategoryDetail.tsx:345
|
||||||
#: src/pages/part/CategoryDetail.tsx:387
|
#: src/pages/part/CategoryDetail.tsx:388
|
||||||
#: src/pages/part/PartDetail.tsx:893
|
#: src/pages/part/PartDetail.tsx:893
|
||||||
msgid "Parts"
|
msgid "Parts"
|
||||||
msgstr ""
|
msgstr ""
|
||||||
|
|
@ -242,7 +242,7 @@ msgid "Manufacturer Parts"
|
||||||
msgstr ""
|
msgstr ""
|
||||||
|
|
||||||
#: lib/enums/ModelInformation.tsx:80
|
#: lib/enums/ModelInformation.tsx:80
|
||||||
#: src/pages/part/CategoryDetail.tsx:387
|
#: src/pages/part/CategoryDetail.tsx:388
|
||||||
#: src/tables/Filter.tsx:496
|
#: src/tables/Filter.tsx:496
|
||||||
msgid "Part Category"
|
msgid "Part Category"
|
||||||
msgstr ""
|
msgstr ""
|
||||||
|
|
@ -261,7 +261,7 @@ msgstr ""
|
||||||
#: src/forms/BuildForms.tsx:848
|
#: src/forms/BuildForms.tsx:848
|
||||||
#: src/forms/SalesOrderForms.tsx:438
|
#: src/forms/SalesOrderForms.tsx:438
|
||||||
#: src/forms/TransferOrderForms.tsx:236
|
#: src/forms/TransferOrderForms.tsx:236
|
||||||
#: src/pages/stock/StockDetail.tsx:1075
|
#: src/pages/stock/StockDetail.tsx:1076
|
||||||
#: src/tables/ColumnRenderers.tsx:132
|
#: src/tables/ColumnRenderers.tsx:132
|
||||||
#: src/tables/part/PartTestResultTable.tsx:256
|
#: src/tables/part/PartTestResultTable.tsx:256
|
||||||
#: src/tables/stock/InstalledItemsTable.tsx:66
|
#: src/tables/stock/InstalledItemsTable.tsx:66
|
||||||
|
|
@ -283,7 +283,7 @@ msgstr ""
|
||||||
|
|
||||||
#: lib/enums/ModelInformation.tsx:99
|
#: lib/enums/ModelInformation.tsx:99
|
||||||
#: lib/enums/Roles.tsx:51
|
#: lib/enums/Roles.tsx:51
|
||||||
#: src/pages/stock/LocationDetail.tsx:522
|
#: src/pages/stock/LocationDetail.tsx:523
|
||||||
msgid "Stock Location"
|
msgid "Stock Location"
|
||||||
msgstr ""
|
msgstr ""
|
||||||
|
|
||||||
|
|
@ -644,14 +644,14 @@ msgstr ""
|
||||||
#: src/components/importer/ImporterColumnSelector.tsx:330
|
#: src/components/importer/ImporterColumnSelector.tsx:330
|
||||||
#: src/components/importer/ImporterDrawer.tsx:91
|
#: src/components/importer/ImporterDrawer.tsx:91
|
||||||
#: src/components/modals/LicenseModal.tsx:85
|
#: src/components/modals/LicenseModal.tsx:85
|
||||||
#: src/components/nav/NavigationTree.tsx:211
|
#: src/components/nav/NavigationTree.tsx:398
|
||||||
#: src/components/nav/NotificationDrawer.tsx:235
|
#: src/components/nav/NotificationDrawer.tsx:235
|
||||||
#: src/components/nav/SearchDrawer.tsx:588
|
#: src/components/nav/SearchDrawer.tsx:588
|
||||||
#: src/components/settings/SettingList.tsx:145
|
#: src/components/settings/SettingList.tsx:145
|
||||||
#: src/components/wizards/ImportPartWizard.tsx:574
|
#: src/components/wizards/ImportPartWizard.tsx:574
|
||||||
#: src/components/wizards/ImportPartWizard.tsx:719
|
#: src/components/wizards/ImportPartWizard.tsx:719
|
||||||
#: src/forms/BomForms.tsx:83
|
#: src/forms/BomForms.tsx:83
|
||||||
#: src/functions/auth.tsx:691
|
#: src/functions/auth.tsx:693
|
||||||
#: src/pages/ErrorPage.tsx:11
|
#: src/pages/ErrorPage.tsx:11
|
||||||
#: src/pages/Index/Settings/AccountSettings/MFASettings.tsx:317
|
#: src/pages/Index/Settings/AccountSettings/MFASettings.tsx:317
|
||||||
#: src/pages/Index/Settings/AccountSettings/MFASettings.tsx:408
|
#: src/pages/Index/Settings/AccountSettings/MFASettings.tsx:408
|
||||||
|
|
@ -723,6 +723,7 @@ msgstr ""
|
||||||
|
|
||||||
#: lib/hooks/MonitorDataOutput.tsx:57
|
#: lib/hooks/MonitorDataOutput.tsx:57
|
||||||
#: lib/hooks/MonitorDataOutput.tsx:116
|
#: lib/hooks/MonitorDataOutput.tsx:116
|
||||||
|
#: src/components/editors/TemplateEditor/PdfPreview/PdfPreview.tsx:76
|
||||||
msgid "Process failed"
|
msgid "Process failed"
|
||||||
msgstr ""
|
msgstr ""
|
||||||
|
|
||||||
|
|
@ -1391,11 +1392,11 @@ msgstr ""
|
||||||
msgid "This widget requires superuser permissions"
|
msgid "This widget requires superuser permissions"
|
||||||
msgstr ""
|
msgstr ""
|
||||||
|
|
||||||
#: src/components/dashboard/widgets/NewsWidget.tsx:133
|
#: src/components/dashboard/widgets/NewsWidget.tsx:135
|
||||||
msgid "No News"
|
msgid "No News"
|
||||||
msgstr ""
|
msgstr ""
|
||||||
|
|
||||||
#: src/components/dashboard/widgets/NewsWidget.tsx:134
|
#: src/components/dashboard/widgets/NewsWidget.tsx:136
|
||||||
msgid "There are no unread news items"
|
msgid "There are no unread news items"
|
||||||
msgstr ""
|
msgstr ""
|
||||||
|
|
||||||
|
|
@ -1655,7 +1656,7 @@ msgstr ""
|
||||||
msgid "Error rendering preview"
|
msgid "Error rendering preview"
|
||||||
msgstr ""
|
msgstr ""
|
||||||
|
|
||||||
#: src/components/editors/TemplateEditor/PdfPreview/PdfPreview.tsx:120
|
#: src/components/editors/TemplateEditor/PdfPreview/PdfPreview.tsx:124
|
||||||
msgid "Preview not available, click \"Reload Preview\"."
|
msgid "Preview not available, click \"Reload Preview\"."
|
||||||
msgstr ""
|
msgstr ""
|
||||||
|
|
||||||
|
|
@ -1728,11 +1729,11 @@ msgstr ""
|
||||||
#~ msgid "to preview"
|
#~ msgid "to preview"
|
||||||
#~ msgstr "to preview"
|
#~ msgstr "to preview"
|
||||||
|
|
||||||
#: src/components/editors/TemplateEditor/TemplateEditor.tsx:379
|
#: src/components/editors/TemplateEditor/TemplateEditor.tsx:380
|
||||||
msgid "Select instance to preview"
|
msgid "Select instance to preview"
|
||||||
msgstr ""
|
msgstr ""
|
||||||
|
|
||||||
#: src/components/editors/TemplateEditor/TemplateEditor.tsx:423
|
#: src/components/editors/TemplateEditor/TemplateEditor.tsx:424
|
||||||
msgid "Error rendering template"
|
msgid "Error rendering template"
|
||||||
msgstr ""
|
msgstr ""
|
||||||
|
|
||||||
|
|
@ -1829,20 +1830,20 @@ msgstr ""
|
||||||
#: src/components/forms/AuthenticationForm.tsx:81
|
#: src/components/forms/AuthenticationForm.tsx:81
|
||||||
#: src/components/forms/AuthenticationForm.tsx:89
|
#: src/components/forms/AuthenticationForm.tsx:89
|
||||||
#: src/functions/auth.tsx:133
|
#: src/functions/auth.tsx:133
|
||||||
#: src/functions/auth.tsx:142
|
#: src/functions/auth.tsx:144
|
||||||
msgid "Login failed"
|
msgid "Login failed"
|
||||||
msgstr ""
|
msgstr ""
|
||||||
|
|
||||||
#: src/components/forms/AuthenticationForm.tsx:82
|
#: src/components/forms/AuthenticationForm.tsx:82
|
||||||
#: src/components/forms/AuthenticationForm.tsx:90
|
#: src/components/forms/AuthenticationForm.tsx:90
|
||||||
#: src/components/forms/AuthenticationForm.tsx:106
|
#: src/components/forms/AuthenticationForm.tsx:106
|
||||||
#: src/functions/auth.tsx:134
|
#: src/functions/auth.tsx:136
|
||||||
#: src/functions/auth.tsx:354
|
#: src/functions/auth.tsx:356
|
||||||
msgid "Check your input and try again."
|
msgid "Check your input and try again."
|
||||||
msgstr ""
|
msgstr ""
|
||||||
|
|
||||||
#: src/components/forms/AuthenticationForm.tsx:100
|
#: src/components/forms/AuthenticationForm.tsx:100
|
||||||
#: src/functions/auth.tsx:345
|
#: src/functions/auth.tsx:347
|
||||||
msgid "Mail delivery successful"
|
msgid "Mail delivery successful"
|
||||||
msgstr ""
|
msgstr ""
|
||||||
|
|
||||||
|
|
@ -2128,6 +2129,7 @@ msgstr ""
|
||||||
|
|
||||||
#: src/components/forms/fields/IconField.tsx:211
|
#: src/components/forms/fields/IconField.tsx:211
|
||||||
#: src/components/nav/Layout.tsx:143
|
#: src/components/nav/Layout.tsx:143
|
||||||
|
#: src/components/nav/NavigationTree.tsx:378
|
||||||
#: src/tables/part/PartThumbTable.tsx:209
|
#: src/tables/part/PartThumbTable.tsx:209
|
||||||
msgid "Search..."
|
msgid "Search..."
|
||||||
msgstr ""
|
msgstr ""
|
||||||
|
|
@ -2153,6 +2155,7 @@ msgid "Loading"
|
||||||
msgstr ""
|
msgstr ""
|
||||||
|
|
||||||
#: src/components/forms/fields/RelatedModelField.tsx:540
|
#: src/components/forms/fields/RelatedModelField.tsx:540
|
||||||
|
#: src/components/nav/NavigationTree.tsx:403
|
||||||
msgid "No results found"
|
msgid "No results found"
|
||||||
msgstr ""
|
msgstr ""
|
||||||
|
|
||||||
|
|
@ -2247,7 +2250,7 @@ msgstr ""
|
||||||
#: src/components/importer/ImporterColumnSelector.tsx:299
|
#: src/components/importer/ImporterColumnSelector.tsx:299
|
||||||
#: src/components/items/ErrorItem.tsx:12
|
#: src/components/items/ErrorItem.tsx:12
|
||||||
#: src/functions/api.tsx:60
|
#: src/functions/api.tsx:60
|
||||||
#: src/functions/auth.tsx:401
|
#: src/functions/auth.tsx:403
|
||||||
msgid "An error occurred"
|
msgid "An error occurred"
|
||||||
msgstr ""
|
msgstr ""
|
||||||
|
|
||||||
|
|
@ -2925,7 +2928,7 @@ msgstr ""
|
||||||
#: src/pages/Index/Settings/SystemSettings.tsx:260
|
#: src/pages/Index/Settings/SystemSettings.tsx:260
|
||||||
#: src/pages/part/PartDetail.tsx:663
|
#: src/pages/part/PartDetail.tsx:663
|
||||||
#: src/pages/stock/LocationDetail.tsx:481
|
#: src/pages/stock/LocationDetail.tsx:481
|
||||||
#: src/pages/stock/LocationDetail.tsx:522
|
#: src/pages/stock/LocationDetail.tsx:523
|
||||||
#: src/pages/stock/StockDetail.tsx:689
|
#: src/pages/stock/StockDetail.tsx:689
|
||||||
#: src/pages/stock/TransferOrderDetail.tsx:536
|
#: src/pages/stock/TransferOrderDetail.tsx:536
|
||||||
#: src/tables/stock/StockItemTable.tsx:81
|
#: src/tables/stock/StockItemTable.tsx:81
|
||||||
|
|
@ -2971,7 +2974,11 @@ msgstr ""
|
||||||
msgid "About"
|
msgid "About"
|
||||||
msgstr ""
|
msgstr ""
|
||||||
|
|
||||||
#: src/components/nav/NavigationTree.tsx:212
|
#: src/components/nav/NavigationTree.tsx:388
|
||||||
|
msgid "Clear search"
|
||||||
|
msgstr ""
|
||||||
|
|
||||||
|
#: src/components/nav/NavigationTree.tsx:399
|
||||||
msgid "Error loading navigation tree."
|
msgid "Error loading navigation tree."
|
||||||
msgstr ""
|
msgstr ""
|
||||||
|
|
||||||
|
|
@ -5539,7 +5546,7 @@ msgstr ""
|
||||||
#~ msgstr "You have been logged out"
|
#~ msgstr "You have been logged out"
|
||||||
|
|
||||||
#: src/functions/auth.tsx:124
|
#: src/functions/auth.tsx:124
|
||||||
#: src/functions/auth.tsx:220
|
#: src/functions/auth.tsx:222
|
||||||
msgid "Logged Out"
|
msgid "Logged Out"
|
||||||
msgstr ""
|
msgstr ""
|
||||||
|
|
||||||
|
|
@ -5551,97 +5558,97 @@ msgstr ""
|
||||||
#~ msgid "Found an existing login - using it to log you in."
|
#~ msgid "Found an existing login - using it to log you in."
|
||||||
#~ msgstr "Found an existing login - using it to log you in."
|
#~ msgstr "Found an existing login - using it to log you in."
|
||||||
|
|
||||||
#: src/functions/auth.tsx:143
|
|
||||||
msgid "No response from server."
|
|
||||||
msgstr ""
|
|
||||||
|
|
||||||
#: src/functions/auth.tsx:143
|
#: src/functions/auth.tsx:143
|
||||||
#~ msgid "Found an existing login - welcome back!"
|
#~ msgid "Found an existing login - welcome back!"
|
||||||
#~ msgstr "Found an existing login - welcome back!"
|
#~ msgstr "Found an existing login - welcome back!"
|
||||||
|
|
||||||
#: src/functions/auth.tsx:186
|
#: src/functions/auth.tsx:145
|
||||||
|
msgid "No response from server."
|
||||||
|
msgstr ""
|
||||||
|
|
||||||
|
#: src/functions/auth.tsx:188
|
||||||
msgid "MFA Login successful"
|
msgid "MFA Login successful"
|
||||||
msgstr ""
|
msgstr ""
|
||||||
|
|
||||||
#: src/functions/auth.tsx:187
|
#: src/functions/auth.tsx:189
|
||||||
msgid "MFA details were automatically provided in the browser"
|
msgid "MFA details were automatically provided in the browser"
|
||||||
msgstr ""
|
msgstr ""
|
||||||
|
|
||||||
#: src/functions/auth.tsx:221
|
#: src/functions/auth.tsx:223
|
||||||
msgid "Successfully logged out"
|
msgid "Successfully logged out"
|
||||||
msgstr ""
|
msgstr ""
|
||||||
|
|
||||||
#: src/functions/auth.tsx:288
|
#: src/functions/auth.tsx:290
|
||||||
msgid "Language changed"
|
msgid "Language changed"
|
||||||
msgstr ""
|
msgstr ""
|
||||||
|
|
||||||
#: src/functions/auth.tsx:289
|
#: src/functions/auth.tsx:291
|
||||||
msgid "Your active language has been changed to the one set in your profile"
|
msgid "Your active language has been changed to the one set in your profile"
|
||||||
msgstr ""
|
msgstr ""
|
||||||
|
|
||||||
#: src/functions/auth.tsx:310
|
#: src/functions/auth.tsx:312
|
||||||
msgid "Theme changed"
|
msgid "Theme changed"
|
||||||
msgstr ""
|
msgstr ""
|
||||||
|
|
||||||
#: src/functions/auth.tsx:311
|
#: src/functions/auth.tsx:313
|
||||||
msgid "Your active theme has been changed to the one set in your profile"
|
msgid "Your active theme has been changed to the one set in your profile"
|
||||||
msgstr ""
|
msgstr ""
|
||||||
|
|
||||||
#: src/functions/auth.tsx:346
|
#: src/functions/auth.tsx:348
|
||||||
msgid "Check your inbox for a reset link. This only works if you have an account. Check in spam too."
|
msgid "Check your inbox for a reset link. This only works if you have an account. Check in spam too."
|
||||||
msgstr ""
|
msgstr ""
|
||||||
|
|
||||||
#: src/functions/auth.tsx:353
|
#: src/functions/auth.tsx:355
|
||||||
#: src/functions/auth.tsx:617
|
#: src/functions/auth.tsx:619
|
||||||
msgid "Reset failed"
|
msgid "Reset failed"
|
||||||
msgstr ""
|
msgstr ""
|
||||||
|
|
||||||
#: src/functions/auth.tsx:380
|
#: src/functions/auth.tsx:382
|
||||||
msgid "Already logged in"
|
msgid "Already logged in"
|
||||||
msgstr ""
|
msgstr ""
|
||||||
|
|
||||||
#: src/functions/auth.tsx:381
|
#: src/functions/auth.tsx:383
|
||||||
msgid "There is a conflicting session on the server for this browser. Please logout of that first."
|
msgid "There is a conflicting session on the server for this browser. Please logout of that first."
|
||||||
msgstr ""
|
msgstr ""
|
||||||
|
|
||||||
#: src/functions/auth.tsx:437
|
#: src/functions/auth.tsx:439
|
||||||
msgid "Logged In"
|
msgid "Logged In"
|
||||||
msgstr ""
|
msgstr ""
|
||||||
|
|
||||||
#: src/functions/auth.tsx:438
|
#: src/functions/auth.tsx:440
|
||||||
msgid "Successfully logged in"
|
msgid "Successfully logged in"
|
||||||
msgstr ""
|
msgstr ""
|
||||||
|
|
||||||
#: src/functions/auth.tsx:572
|
#: src/functions/auth.tsx:574
|
||||||
msgid "Failed to set up MFA"
|
msgid "Failed to set up MFA"
|
||||||
msgstr ""
|
msgstr ""
|
||||||
|
|
||||||
#: src/functions/auth.tsx:591
|
#: src/functions/auth.tsx:593
|
||||||
msgid "MFA Setup successful"
|
msgid "MFA Setup successful"
|
||||||
msgstr ""
|
msgstr ""
|
||||||
|
|
||||||
#: src/functions/auth.tsx:592
|
#: src/functions/auth.tsx:594
|
||||||
msgid "MFA via TOTP has been set up successfully; you will need to login again."
|
msgid "MFA via TOTP has been set up successfully; you will need to login again."
|
||||||
msgstr ""
|
msgstr ""
|
||||||
|
|
||||||
#: src/functions/auth.tsx:607
|
#: src/functions/auth.tsx:609
|
||||||
msgid "Password set"
|
msgid "Password set"
|
||||||
msgstr ""
|
msgstr ""
|
||||||
|
|
||||||
#: src/functions/auth.tsx:608
|
#: src/functions/auth.tsx:610
|
||||||
#: src/functions/auth.tsx:717
|
#: src/functions/auth.tsx:719
|
||||||
msgid "The password was set successfully. You can now login with your new password"
|
msgid "The password was set successfully. You can now login with your new password"
|
||||||
msgstr ""
|
msgstr ""
|
||||||
|
|
||||||
#: src/functions/auth.tsx:682
|
#: src/functions/auth.tsx:684
|
||||||
msgid "Password could not be changed"
|
msgid "Password could not be changed"
|
||||||
msgstr ""
|
msgstr ""
|
||||||
|
|
||||||
#: src/functions/auth.tsx:700
|
#: src/functions/auth.tsx:702
|
||||||
msgid "The two password fields didn’t match"
|
msgid "The two password fields didn’t match"
|
||||||
msgstr ""
|
msgstr ""
|
||||||
|
|
||||||
#: src/functions/auth.tsx:716
|
#: src/functions/auth.tsx:718
|
||||||
msgid "Password Changed"
|
msgid "Password Changed"
|
||||||
msgstr ""
|
msgstr ""
|
||||||
|
|
||||||
|
|
@ -8347,11 +8354,11 @@ msgstr ""
|
||||||
msgid "Part Actions"
|
msgid "Part Actions"
|
||||||
msgstr ""
|
msgstr ""
|
||||||
|
|
||||||
#: src/pages/part/PartDetail.tsx:1182
|
#: src/pages/part/PartDetail.tsx:1183
|
||||||
msgid "Part locked"
|
msgid "Part locked"
|
||||||
msgstr ""
|
msgstr ""
|
||||||
|
|
||||||
#: src/pages/part/PartDetail.tsx:1182
|
#: src/pages/part/PartDetail.tsx:1183
|
||||||
msgid "Part unlocked"
|
msgid "Part unlocked"
|
||||||
msgstr ""
|
msgstr ""
|
||||||
|
|
||||||
|
|
|
||||||
|
|
@ -8,7 +8,7 @@ msgstr ""
|
||||||
"Language: bg\n"
|
"Language: bg\n"
|
||||||
"Project-Id-Version: inventree\n"
|
"Project-Id-Version: inventree\n"
|
||||||
"Report-Msgid-Bugs-To: \n"
|
"Report-Msgid-Bugs-To: \n"
|
||||||
"PO-Revision-Date: 2026-06-17 22:14\n"
|
"PO-Revision-Date: 2026-06-20 13:53\n"
|
||||||
"Last-Translator: \n"
|
"Last-Translator: \n"
|
||||||
"Language-Team: Bulgarian\n"
|
"Language-Team: Bulgarian\n"
|
||||||
"Plural-Forms: nplurals=2; plural=(n != 1);\n"
|
"Plural-Forms: nplurals=2; plural=(n != 1);\n"
|
||||||
|
|
@ -147,7 +147,7 @@ msgstr ""
|
||||||
#: src/forms/StockForms.tsx:1248
|
#: src/forms/StockForms.tsx:1248
|
||||||
#: src/forms/TransferOrderForms.tsx:234
|
#: src/forms/TransferOrderForms.tsx:234
|
||||||
#: src/pages/build/BuildDetail.tsx:260
|
#: src/pages/build/BuildDetail.tsx:260
|
||||||
#: src/pages/part/PartDetail.tsx:1165
|
#: src/pages/part/PartDetail.tsx:1166
|
||||||
#: src/pages/part/bom/BomCompare.tsx:203
|
#: src/pages/part/bom/BomCompare.tsx:203
|
||||||
#: src/tables/ColumnRenderers.tsx:93
|
#: src/tables/ColumnRenderers.tsx:93
|
||||||
#: src/tables/build/BuildOrderParametricTable.tsx:29
|
#: src/tables/build/BuildOrderParametricTable.tsx:29
|
||||||
|
|
@ -166,7 +166,7 @@ msgstr ""
|
||||||
#: src/pages/part/CategoryDetail.tsx:138
|
#: src/pages/part/CategoryDetail.tsx:138
|
||||||
#: src/pages/part/CategoryDetail.tsx:285
|
#: src/pages/part/CategoryDetail.tsx:285
|
||||||
#: src/pages/part/CategoryDetail.tsx:345
|
#: src/pages/part/CategoryDetail.tsx:345
|
||||||
#: src/pages/part/CategoryDetail.tsx:387
|
#: src/pages/part/CategoryDetail.tsx:388
|
||||||
#: src/pages/part/PartDetail.tsx:893
|
#: src/pages/part/PartDetail.tsx:893
|
||||||
msgid "Parts"
|
msgid "Parts"
|
||||||
msgstr ""
|
msgstr ""
|
||||||
|
|
@ -242,7 +242,7 @@ msgid "Manufacturer Parts"
|
||||||
msgstr ""
|
msgstr ""
|
||||||
|
|
||||||
#: lib/enums/ModelInformation.tsx:80
|
#: lib/enums/ModelInformation.tsx:80
|
||||||
#: src/pages/part/CategoryDetail.tsx:387
|
#: src/pages/part/CategoryDetail.tsx:388
|
||||||
#: src/tables/Filter.tsx:496
|
#: src/tables/Filter.tsx:496
|
||||||
msgid "Part Category"
|
msgid "Part Category"
|
||||||
msgstr ""
|
msgstr ""
|
||||||
|
|
@ -261,7 +261,7 @@ msgstr ""
|
||||||
#: src/forms/BuildForms.tsx:848
|
#: src/forms/BuildForms.tsx:848
|
||||||
#: src/forms/SalesOrderForms.tsx:438
|
#: src/forms/SalesOrderForms.tsx:438
|
||||||
#: src/forms/TransferOrderForms.tsx:236
|
#: src/forms/TransferOrderForms.tsx:236
|
||||||
#: src/pages/stock/StockDetail.tsx:1075
|
#: src/pages/stock/StockDetail.tsx:1076
|
||||||
#: src/tables/ColumnRenderers.tsx:132
|
#: src/tables/ColumnRenderers.tsx:132
|
||||||
#: src/tables/part/PartTestResultTable.tsx:256
|
#: src/tables/part/PartTestResultTable.tsx:256
|
||||||
#: src/tables/stock/InstalledItemsTable.tsx:66
|
#: src/tables/stock/InstalledItemsTable.tsx:66
|
||||||
|
|
@ -283,7 +283,7 @@ msgstr ""
|
||||||
|
|
||||||
#: lib/enums/ModelInformation.tsx:99
|
#: lib/enums/ModelInformation.tsx:99
|
||||||
#: lib/enums/Roles.tsx:51
|
#: lib/enums/Roles.tsx:51
|
||||||
#: src/pages/stock/LocationDetail.tsx:522
|
#: src/pages/stock/LocationDetail.tsx:523
|
||||||
msgid "Stock Location"
|
msgid "Stock Location"
|
||||||
msgstr ""
|
msgstr ""
|
||||||
|
|
||||||
|
|
@ -644,14 +644,14 @@ msgstr ""
|
||||||
#: src/components/importer/ImporterColumnSelector.tsx:330
|
#: src/components/importer/ImporterColumnSelector.tsx:330
|
||||||
#: src/components/importer/ImporterDrawer.tsx:91
|
#: src/components/importer/ImporterDrawer.tsx:91
|
||||||
#: src/components/modals/LicenseModal.tsx:85
|
#: src/components/modals/LicenseModal.tsx:85
|
||||||
#: src/components/nav/NavigationTree.tsx:211
|
#: src/components/nav/NavigationTree.tsx:398
|
||||||
#: src/components/nav/NotificationDrawer.tsx:235
|
#: src/components/nav/NotificationDrawer.tsx:235
|
||||||
#: src/components/nav/SearchDrawer.tsx:588
|
#: src/components/nav/SearchDrawer.tsx:588
|
||||||
#: src/components/settings/SettingList.tsx:145
|
#: src/components/settings/SettingList.tsx:145
|
||||||
#: src/components/wizards/ImportPartWizard.tsx:574
|
#: src/components/wizards/ImportPartWizard.tsx:574
|
||||||
#: src/components/wizards/ImportPartWizard.tsx:719
|
#: src/components/wizards/ImportPartWizard.tsx:719
|
||||||
#: src/forms/BomForms.tsx:83
|
#: src/forms/BomForms.tsx:83
|
||||||
#: src/functions/auth.tsx:691
|
#: src/functions/auth.tsx:693
|
||||||
#: src/pages/ErrorPage.tsx:11
|
#: src/pages/ErrorPage.tsx:11
|
||||||
#: src/pages/Index/Settings/AccountSettings/MFASettings.tsx:317
|
#: src/pages/Index/Settings/AccountSettings/MFASettings.tsx:317
|
||||||
#: src/pages/Index/Settings/AccountSettings/MFASettings.tsx:408
|
#: src/pages/Index/Settings/AccountSettings/MFASettings.tsx:408
|
||||||
|
|
@ -723,6 +723,7 @@ msgstr ""
|
||||||
|
|
||||||
#: lib/hooks/MonitorDataOutput.tsx:57
|
#: lib/hooks/MonitorDataOutput.tsx:57
|
||||||
#: lib/hooks/MonitorDataOutput.tsx:116
|
#: lib/hooks/MonitorDataOutput.tsx:116
|
||||||
|
#: src/components/editors/TemplateEditor/PdfPreview/PdfPreview.tsx:76
|
||||||
msgid "Process failed"
|
msgid "Process failed"
|
||||||
msgstr ""
|
msgstr ""
|
||||||
|
|
||||||
|
|
@ -1391,11 +1392,11 @@ msgstr ""
|
||||||
msgid "This widget requires superuser permissions"
|
msgid "This widget requires superuser permissions"
|
||||||
msgstr ""
|
msgstr ""
|
||||||
|
|
||||||
#: src/components/dashboard/widgets/NewsWidget.tsx:133
|
#: src/components/dashboard/widgets/NewsWidget.tsx:135
|
||||||
msgid "No News"
|
msgid "No News"
|
||||||
msgstr ""
|
msgstr ""
|
||||||
|
|
||||||
#: src/components/dashboard/widgets/NewsWidget.tsx:134
|
#: src/components/dashboard/widgets/NewsWidget.tsx:136
|
||||||
msgid "There are no unread news items"
|
msgid "There are no unread news items"
|
||||||
msgstr ""
|
msgstr ""
|
||||||
|
|
||||||
|
|
@ -1655,7 +1656,7 @@ msgstr ""
|
||||||
msgid "Error rendering preview"
|
msgid "Error rendering preview"
|
||||||
msgstr ""
|
msgstr ""
|
||||||
|
|
||||||
#: src/components/editors/TemplateEditor/PdfPreview/PdfPreview.tsx:120
|
#: src/components/editors/TemplateEditor/PdfPreview/PdfPreview.tsx:124
|
||||||
msgid "Preview not available, click \"Reload Preview\"."
|
msgid "Preview not available, click \"Reload Preview\"."
|
||||||
msgstr ""
|
msgstr ""
|
||||||
|
|
||||||
|
|
@ -1728,11 +1729,11 @@ msgstr ""
|
||||||
#~ msgid "to preview"
|
#~ msgid "to preview"
|
||||||
#~ msgstr "to preview"
|
#~ msgstr "to preview"
|
||||||
|
|
||||||
#: src/components/editors/TemplateEditor/TemplateEditor.tsx:379
|
#: src/components/editors/TemplateEditor/TemplateEditor.tsx:380
|
||||||
msgid "Select instance to preview"
|
msgid "Select instance to preview"
|
||||||
msgstr ""
|
msgstr ""
|
||||||
|
|
||||||
#: src/components/editors/TemplateEditor/TemplateEditor.tsx:423
|
#: src/components/editors/TemplateEditor/TemplateEditor.tsx:424
|
||||||
msgid "Error rendering template"
|
msgid "Error rendering template"
|
||||||
msgstr ""
|
msgstr ""
|
||||||
|
|
||||||
|
|
@ -1829,20 +1830,20 @@ msgstr ""
|
||||||
#: src/components/forms/AuthenticationForm.tsx:81
|
#: src/components/forms/AuthenticationForm.tsx:81
|
||||||
#: src/components/forms/AuthenticationForm.tsx:89
|
#: src/components/forms/AuthenticationForm.tsx:89
|
||||||
#: src/functions/auth.tsx:133
|
#: src/functions/auth.tsx:133
|
||||||
#: src/functions/auth.tsx:142
|
#: src/functions/auth.tsx:144
|
||||||
msgid "Login failed"
|
msgid "Login failed"
|
||||||
msgstr ""
|
msgstr ""
|
||||||
|
|
||||||
#: src/components/forms/AuthenticationForm.tsx:82
|
#: src/components/forms/AuthenticationForm.tsx:82
|
||||||
#: src/components/forms/AuthenticationForm.tsx:90
|
#: src/components/forms/AuthenticationForm.tsx:90
|
||||||
#: src/components/forms/AuthenticationForm.tsx:106
|
#: src/components/forms/AuthenticationForm.tsx:106
|
||||||
#: src/functions/auth.tsx:134
|
#: src/functions/auth.tsx:136
|
||||||
#: src/functions/auth.tsx:354
|
#: src/functions/auth.tsx:356
|
||||||
msgid "Check your input and try again."
|
msgid "Check your input and try again."
|
||||||
msgstr ""
|
msgstr ""
|
||||||
|
|
||||||
#: src/components/forms/AuthenticationForm.tsx:100
|
#: src/components/forms/AuthenticationForm.tsx:100
|
||||||
#: src/functions/auth.tsx:345
|
#: src/functions/auth.tsx:347
|
||||||
msgid "Mail delivery successful"
|
msgid "Mail delivery successful"
|
||||||
msgstr ""
|
msgstr ""
|
||||||
|
|
||||||
|
|
@ -2128,6 +2129,7 @@ msgstr ""
|
||||||
|
|
||||||
#: src/components/forms/fields/IconField.tsx:211
|
#: src/components/forms/fields/IconField.tsx:211
|
||||||
#: src/components/nav/Layout.tsx:143
|
#: src/components/nav/Layout.tsx:143
|
||||||
|
#: src/components/nav/NavigationTree.tsx:378
|
||||||
#: src/tables/part/PartThumbTable.tsx:209
|
#: src/tables/part/PartThumbTable.tsx:209
|
||||||
msgid "Search..."
|
msgid "Search..."
|
||||||
msgstr ""
|
msgstr ""
|
||||||
|
|
@ -2153,6 +2155,7 @@ msgid "Loading"
|
||||||
msgstr ""
|
msgstr ""
|
||||||
|
|
||||||
#: src/components/forms/fields/RelatedModelField.tsx:540
|
#: src/components/forms/fields/RelatedModelField.tsx:540
|
||||||
|
#: src/components/nav/NavigationTree.tsx:403
|
||||||
msgid "No results found"
|
msgid "No results found"
|
||||||
msgstr ""
|
msgstr ""
|
||||||
|
|
||||||
|
|
@ -2247,7 +2250,7 @@ msgstr ""
|
||||||
#: src/components/importer/ImporterColumnSelector.tsx:299
|
#: src/components/importer/ImporterColumnSelector.tsx:299
|
||||||
#: src/components/items/ErrorItem.tsx:12
|
#: src/components/items/ErrorItem.tsx:12
|
||||||
#: src/functions/api.tsx:60
|
#: src/functions/api.tsx:60
|
||||||
#: src/functions/auth.tsx:401
|
#: src/functions/auth.tsx:403
|
||||||
msgid "An error occurred"
|
msgid "An error occurred"
|
||||||
msgstr ""
|
msgstr ""
|
||||||
|
|
||||||
|
|
@ -2925,7 +2928,7 @@ msgstr ""
|
||||||
#: src/pages/Index/Settings/SystemSettings.tsx:260
|
#: src/pages/Index/Settings/SystemSettings.tsx:260
|
||||||
#: src/pages/part/PartDetail.tsx:663
|
#: src/pages/part/PartDetail.tsx:663
|
||||||
#: src/pages/stock/LocationDetail.tsx:481
|
#: src/pages/stock/LocationDetail.tsx:481
|
||||||
#: src/pages/stock/LocationDetail.tsx:522
|
#: src/pages/stock/LocationDetail.tsx:523
|
||||||
#: src/pages/stock/StockDetail.tsx:689
|
#: src/pages/stock/StockDetail.tsx:689
|
||||||
#: src/pages/stock/TransferOrderDetail.tsx:536
|
#: src/pages/stock/TransferOrderDetail.tsx:536
|
||||||
#: src/tables/stock/StockItemTable.tsx:81
|
#: src/tables/stock/StockItemTable.tsx:81
|
||||||
|
|
@ -2971,7 +2974,11 @@ msgstr ""
|
||||||
msgid "About"
|
msgid "About"
|
||||||
msgstr ""
|
msgstr ""
|
||||||
|
|
||||||
#: src/components/nav/NavigationTree.tsx:212
|
#: src/components/nav/NavigationTree.tsx:388
|
||||||
|
msgid "Clear search"
|
||||||
|
msgstr ""
|
||||||
|
|
||||||
|
#: src/components/nav/NavigationTree.tsx:399
|
||||||
msgid "Error loading navigation tree."
|
msgid "Error loading navigation tree."
|
||||||
msgstr ""
|
msgstr ""
|
||||||
|
|
||||||
|
|
@ -5539,7 +5546,7 @@ msgstr ""
|
||||||
#~ msgstr "You have been logged out"
|
#~ msgstr "You have been logged out"
|
||||||
|
|
||||||
#: src/functions/auth.tsx:124
|
#: src/functions/auth.tsx:124
|
||||||
#: src/functions/auth.tsx:220
|
#: src/functions/auth.tsx:222
|
||||||
msgid "Logged Out"
|
msgid "Logged Out"
|
||||||
msgstr ""
|
msgstr ""
|
||||||
|
|
||||||
|
|
@ -5551,97 +5558,97 @@ msgstr ""
|
||||||
#~ msgid "Found an existing login - using it to log you in."
|
#~ msgid "Found an existing login - using it to log you in."
|
||||||
#~ msgstr "Found an existing login - using it to log you in."
|
#~ msgstr "Found an existing login - using it to log you in."
|
||||||
|
|
||||||
#: src/functions/auth.tsx:143
|
|
||||||
msgid "No response from server."
|
|
||||||
msgstr ""
|
|
||||||
|
|
||||||
#: src/functions/auth.tsx:143
|
#: src/functions/auth.tsx:143
|
||||||
#~ msgid "Found an existing login - welcome back!"
|
#~ msgid "Found an existing login - welcome back!"
|
||||||
#~ msgstr "Found an existing login - welcome back!"
|
#~ msgstr "Found an existing login - welcome back!"
|
||||||
|
|
||||||
#: src/functions/auth.tsx:186
|
#: src/functions/auth.tsx:145
|
||||||
|
msgid "No response from server."
|
||||||
|
msgstr ""
|
||||||
|
|
||||||
|
#: src/functions/auth.tsx:188
|
||||||
msgid "MFA Login successful"
|
msgid "MFA Login successful"
|
||||||
msgstr ""
|
msgstr ""
|
||||||
|
|
||||||
#: src/functions/auth.tsx:187
|
#: src/functions/auth.tsx:189
|
||||||
msgid "MFA details were automatically provided in the browser"
|
msgid "MFA details were automatically provided in the browser"
|
||||||
msgstr ""
|
msgstr ""
|
||||||
|
|
||||||
#: src/functions/auth.tsx:221
|
#: src/functions/auth.tsx:223
|
||||||
msgid "Successfully logged out"
|
msgid "Successfully logged out"
|
||||||
msgstr ""
|
msgstr ""
|
||||||
|
|
||||||
#: src/functions/auth.tsx:288
|
#: src/functions/auth.tsx:290
|
||||||
msgid "Language changed"
|
msgid "Language changed"
|
||||||
msgstr ""
|
msgstr ""
|
||||||
|
|
||||||
#: src/functions/auth.tsx:289
|
#: src/functions/auth.tsx:291
|
||||||
msgid "Your active language has been changed to the one set in your profile"
|
msgid "Your active language has been changed to the one set in your profile"
|
||||||
msgstr ""
|
msgstr ""
|
||||||
|
|
||||||
#: src/functions/auth.tsx:310
|
#: src/functions/auth.tsx:312
|
||||||
msgid "Theme changed"
|
msgid "Theme changed"
|
||||||
msgstr ""
|
msgstr ""
|
||||||
|
|
||||||
#: src/functions/auth.tsx:311
|
#: src/functions/auth.tsx:313
|
||||||
msgid "Your active theme has been changed to the one set in your profile"
|
msgid "Your active theme has been changed to the one set in your profile"
|
||||||
msgstr ""
|
msgstr ""
|
||||||
|
|
||||||
#: src/functions/auth.tsx:346
|
#: src/functions/auth.tsx:348
|
||||||
msgid "Check your inbox for a reset link. This only works if you have an account. Check in spam too."
|
msgid "Check your inbox for a reset link. This only works if you have an account. Check in spam too."
|
||||||
msgstr ""
|
msgstr ""
|
||||||
|
|
||||||
#: src/functions/auth.tsx:353
|
#: src/functions/auth.tsx:355
|
||||||
#: src/functions/auth.tsx:617
|
#: src/functions/auth.tsx:619
|
||||||
msgid "Reset failed"
|
msgid "Reset failed"
|
||||||
msgstr ""
|
msgstr ""
|
||||||
|
|
||||||
#: src/functions/auth.tsx:380
|
#: src/functions/auth.tsx:382
|
||||||
msgid "Already logged in"
|
msgid "Already logged in"
|
||||||
msgstr ""
|
msgstr ""
|
||||||
|
|
||||||
#: src/functions/auth.tsx:381
|
#: src/functions/auth.tsx:383
|
||||||
msgid "There is a conflicting session on the server for this browser. Please logout of that first."
|
msgid "There is a conflicting session on the server for this browser. Please logout of that first."
|
||||||
msgstr ""
|
msgstr ""
|
||||||
|
|
||||||
#: src/functions/auth.tsx:437
|
#: src/functions/auth.tsx:439
|
||||||
msgid "Logged In"
|
msgid "Logged In"
|
||||||
msgstr ""
|
msgstr ""
|
||||||
|
|
||||||
#: src/functions/auth.tsx:438
|
#: src/functions/auth.tsx:440
|
||||||
msgid "Successfully logged in"
|
msgid "Successfully logged in"
|
||||||
msgstr ""
|
msgstr ""
|
||||||
|
|
||||||
#: src/functions/auth.tsx:572
|
#: src/functions/auth.tsx:574
|
||||||
msgid "Failed to set up MFA"
|
msgid "Failed to set up MFA"
|
||||||
msgstr ""
|
msgstr ""
|
||||||
|
|
||||||
#: src/functions/auth.tsx:591
|
#: src/functions/auth.tsx:593
|
||||||
msgid "MFA Setup successful"
|
msgid "MFA Setup successful"
|
||||||
msgstr ""
|
msgstr ""
|
||||||
|
|
||||||
#: src/functions/auth.tsx:592
|
#: src/functions/auth.tsx:594
|
||||||
msgid "MFA via TOTP has been set up successfully; you will need to login again."
|
msgid "MFA via TOTP has been set up successfully; you will need to login again."
|
||||||
msgstr ""
|
msgstr ""
|
||||||
|
|
||||||
#: src/functions/auth.tsx:607
|
#: src/functions/auth.tsx:609
|
||||||
msgid "Password set"
|
msgid "Password set"
|
||||||
msgstr ""
|
msgstr ""
|
||||||
|
|
||||||
#: src/functions/auth.tsx:608
|
#: src/functions/auth.tsx:610
|
||||||
#: src/functions/auth.tsx:717
|
#: src/functions/auth.tsx:719
|
||||||
msgid "The password was set successfully. You can now login with your new password"
|
msgid "The password was set successfully. You can now login with your new password"
|
||||||
msgstr ""
|
msgstr ""
|
||||||
|
|
||||||
#: src/functions/auth.tsx:682
|
#: src/functions/auth.tsx:684
|
||||||
msgid "Password could not be changed"
|
msgid "Password could not be changed"
|
||||||
msgstr ""
|
msgstr ""
|
||||||
|
|
||||||
#: src/functions/auth.tsx:700
|
#: src/functions/auth.tsx:702
|
||||||
msgid "The two password fields didn’t match"
|
msgid "The two password fields didn’t match"
|
||||||
msgstr ""
|
msgstr ""
|
||||||
|
|
||||||
#: src/functions/auth.tsx:716
|
#: src/functions/auth.tsx:718
|
||||||
msgid "Password Changed"
|
msgid "Password Changed"
|
||||||
msgstr ""
|
msgstr ""
|
||||||
|
|
||||||
|
|
@ -8347,11 +8354,11 @@ msgstr ""
|
||||||
msgid "Part Actions"
|
msgid "Part Actions"
|
||||||
msgstr ""
|
msgstr ""
|
||||||
|
|
||||||
#: src/pages/part/PartDetail.tsx:1182
|
#: src/pages/part/PartDetail.tsx:1183
|
||||||
msgid "Part locked"
|
msgid "Part locked"
|
||||||
msgstr ""
|
msgstr ""
|
||||||
|
|
||||||
#: src/pages/part/PartDetail.tsx:1182
|
#: src/pages/part/PartDetail.tsx:1183
|
||||||
msgid "Part unlocked"
|
msgid "Part unlocked"
|
||||||
msgstr ""
|
msgstr ""
|
||||||
|
|
||||||
|
|
|
||||||
|
|
@ -8,7 +8,7 @@ msgstr ""
|
||||||
"Language: cs\n"
|
"Language: cs\n"
|
||||||
"Project-Id-Version: inventree\n"
|
"Project-Id-Version: inventree\n"
|
||||||
"Report-Msgid-Bugs-To: \n"
|
"Report-Msgid-Bugs-To: \n"
|
||||||
"PO-Revision-Date: 2026-06-17 22:14\n"
|
"PO-Revision-Date: 2026-06-23 06:29\n"
|
||||||
"Last-Translator: \n"
|
"Last-Translator: \n"
|
||||||
"Language-Team: Czech\n"
|
"Language-Team: Czech\n"
|
||||||
"Plural-Forms: nplurals=4; plural=(n==1) ? 0 : (n>=2 && n<=4) ? 1 : 3;\n"
|
"Plural-Forms: nplurals=4; plural=(n==1) ? 0 : (n>=2 && n<=4) ? 1 : 3;\n"
|
||||||
|
|
@ -147,7 +147,7 @@ msgstr "Ne"
|
||||||
#: src/forms/StockForms.tsx:1248
|
#: src/forms/StockForms.tsx:1248
|
||||||
#: src/forms/TransferOrderForms.tsx:234
|
#: src/forms/TransferOrderForms.tsx:234
|
||||||
#: src/pages/build/BuildDetail.tsx:260
|
#: src/pages/build/BuildDetail.tsx:260
|
||||||
#: src/pages/part/PartDetail.tsx:1165
|
#: src/pages/part/PartDetail.tsx:1166
|
||||||
#: src/pages/part/bom/BomCompare.tsx:203
|
#: src/pages/part/bom/BomCompare.tsx:203
|
||||||
#: src/tables/ColumnRenderers.tsx:93
|
#: src/tables/ColumnRenderers.tsx:93
|
||||||
#: src/tables/build/BuildOrderParametricTable.tsx:29
|
#: src/tables/build/BuildOrderParametricTable.tsx:29
|
||||||
|
|
@ -166,7 +166,7 @@ msgstr "Díl"
|
||||||
#: src/pages/part/CategoryDetail.tsx:138
|
#: src/pages/part/CategoryDetail.tsx:138
|
||||||
#: src/pages/part/CategoryDetail.tsx:285
|
#: src/pages/part/CategoryDetail.tsx:285
|
||||||
#: src/pages/part/CategoryDetail.tsx:345
|
#: src/pages/part/CategoryDetail.tsx:345
|
||||||
#: src/pages/part/CategoryDetail.tsx:387
|
#: src/pages/part/CategoryDetail.tsx:388
|
||||||
#: src/pages/part/PartDetail.tsx:893
|
#: src/pages/part/PartDetail.tsx:893
|
||||||
msgid "Parts"
|
msgid "Parts"
|
||||||
msgstr "Díly"
|
msgstr "Díly"
|
||||||
|
|
@ -242,7 +242,7 @@ msgid "Manufacturer Parts"
|
||||||
msgstr "Díly výrobce"
|
msgstr "Díly výrobce"
|
||||||
|
|
||||||
#: lib/enums/ModelInformation.tsx:80
|
#: lib/enums/ModelInformation.tsx:80
|
||||||
#: src/pages/part/CategoryDetail.tsx:387
|
#: src/pages/part/CategoryDetail.tsx:388
|
||||||
#: src/tables/Filter.tsx:496
|
#: src/tables/Filter.tsx:496
|
||||||
msgid "Part Category"
|
msgid "Part Category"
|
||||||
msgstr "Kategorie dílu"
|
msgstr "Kategorie dílu"
|
||||||
|
|
@ -261,7 +261,7 @@ msgstr "Kategorie dílů"
|
||||||
#: src/forms/BuildForms.tsx:848
|
#: src/forms/BuildForms.tsx:848
|
||||||
#: src/forms/SalesOrderForms.tsx:438
|
#: src/forms/SalesOrderForms.tsx:438
|
||||||
#: src/forms/TransferOrderForms.tsx:236
|
#: src/forms/TransferOrderForms.tsx:236
|
||||||
#: src/pages/stock/StockDetail.tsx:1075
|
#: src/pages/stock/StockDetail.tsx:1076
|
||||||
#: src/tables/ColumnRenderers.tsx:132
|
#: src/tables/ColumnRenderers.tsx:132
|
||||||
#: src/tables/part/PartTestResultTable.tsx:256
|
#: src/tables/part/PartTestResultTable.tsx:256
|
||||||
#: src/tables/stock/InstalledItemsTable.tsx:66
|
#: src/tables/stock/InstalledItemsTable.tsx:66
|
||||||
|
|
@ -283,7 +283,7 @@ msgstr "Skladové položky"
|
||||||
|
|
||||||
#: lib/enums/ModelInformation.tsx:99
|
#: lib/enums/ModelInformation.tsx:99
|
||||||
#: lib/enums/Roles.tsx:51
|
#: lib/enums/Roles.tsx:51
|
||||||
#: src/pages/stock/LocationDetail.tsx:522
|
#: src/pages/stock/LocationDetail.tsx:523
|
||||||
msgid "Stock Location"
|
msgid "Stock Location"
|
||||||
msgstr "Umístění skladu"
|
msgstr "Umístění skladu"
|
||||||
|
|
||||||
|
|
@ -644,14 +644,14 @@ msgstr "Výběr záznamů"
|
||||||
#: src/components/importer/ImporterColumnSelector.tsx:330
|
#: src/components/importer/ImporterColumnSelector.tsx:330
|
||||||
#: src/components/importer/ImporterDrawer.tsx:91
|
#: src/components/importer/ImporterDrawer.tsx:91
|
||||||
#: src/components/modals/LicenseModal.tsx:85
|
#: src/components/modals/LicenseModal.tsx:85
|
||||||
#: src/components/nav/NavigationTree.tsx:211
|
#: src/components/nav/NavigationTree.tsx:398
|
||||||
#: src/components/nav/NotificationDrawer.tsx:235
|
#: src/components/nav/NotificationDrawer.tsx:235
|
||||||
#: src/components/nav/SearchDrawer.tsx:588
|
#: src/components/nav/SearchDrawer.tsx:588
|
||||||
#: src/components/settings/SettingList.tsx:145
|
#: src/components/settings/SettingList.tsx:145
|
||||||
#: src/components/wizards/ImportPartWizard.tsx:574
|
#: src/components/wizards/ImportPartWizard.tsx:574
|
||||||
#: src/components/wizards/ImportPartWizard.tsx:719
|
#: src/components/wizards/ImportPartWizard.tsx:719
|
||||||
#: src/forms/BomForms.tsx:83
|
#: src/forms/BomForms.tsx:83
|
||||||
#: src/functions/auth.tsx:691
|
#: src/functions/auth.tsx:693
|
||||||
#: src/pages/ErrorPage.tsx:11
|
#: src/pages/ErrorPage.tsx:11
|
||||||
#: src/pages/Index/Settings/AccountSettings/MFASettings.tsx:317
|
#: src/pages/Index/Settings/AccountSettings/MFASettings.tsx:317
|
||||||
#: src/pages/Index/Settings/AccountSettings/MFASettings.tsx:408
|
#: src/pages/Index/Settings/AccountSettings/MFASettings.tsx:408
|
||||||
|
|
@ -723,6 +723,7 @@ msgstr "Vypršel časový limit žádosti."
|
||||||
|
|
||||||
#: lib/hooks/MonitorDataOutput.tsx:57
|
#: lib/hooks/MonitorDataOutput.tsx:57
|
||||||
#: lib/hooks/MonitorDataOutput.tsx:116
|
#: lib/hooks/MonitorDataOutput.tsx:116
|
||||||
|
#: src/components/editors/TemplateEditor/PdfPreview/PdfPreview.tsx:76
|
||||||
msgid "Process failed"
|
msgid "Process failed"
|
||||||
msgstr "Proces se nezdařil"
|
msgstr "Proces se nezdařil"
|
||||||
|
|
||||||
|
|
@ -1391,11 +1392,11 @@ msgstr "Vyžadováno aministrátorské oprávnění"
|
||||||
msgid "This widget requires superuser permissions"
|
msgid "This widget requires superuser permissions"
|
||||||
msgstr "Tento widget vyžaduje administrátorské oprávnění "
|
msgstr "Tento widget vyžaduje administrátorské oprávnění "
|
||||||
|
|
||||||
#: src/components/dashboard/widgets/NewsWidget.tsx:133
|
#: src/components/dashboard/widgets/NewsWidget.tsx:135
|
||||||
msgid "No News"
|
msgid "No News"
|
||||||
msgstr "Žádné novinky"
|
msgstr "Žádné novinky"
|
||||||
|
|
||||||
#: src/components/dashboard/widgets/NewsWidget.tsx:134
|
#: src/components/dashboard/widgets/NewsWidget.tsx:136
|
||||||
msgid "There are no unread news items"
|
msgid "There are no unread news items"
|
||||||
msgstr "Žádné nepřečtené novinky"
|
msgstr "Žádné nepřečtené novinky"
|
||||||
|
|
||||||
|
|
@ -1655,7 +1656,7 @@ msgstr "Kód"
|
||||||
msgid "Error rendering preview"
|
msgid "Error rendering preview"
|
||||||
msgstr "Chyba při vykreslování náhledu"
|
msgstr "Chyba při vykreslování náhledu"
|
||||||
|
|
||||||
#: src/components/editors/TemplateEditor/PdfPreview/PdfPreview.tsx:120
|
#: src/components/editors/TemplateEditor/PdfPreview/PdfPreview.tsx:124
|
||||||
msgid "Preview not available, click \"Reload Preview\"."
|
msgid "Preview not available, click \"Reload Preview\"."
|
||||||
msgstr "Náhled není k dispozici, klikněte na \"Znovu načíst náhled\"."
|
msgstr "Náhled není k dispozici, klikněte na \"Znovu načíst náhled\"."
|
||||||
|
|
||||||
|
|
@ -1728,11 +1729,11 @@ msgstr "Uložit aktuální šablonu a znovu načíst náhled"
|
||||||
#~ msgid "to preview"
|
#~ msgid "to preview"
|
||||||
#~ msgstr "to preview"
|
#~ msgstr "to preview"
|
||||||
|
|
||||||
#: src/components/editors/TemplateEditor/TemplateEditor.tsx:379
|
#: src/components/editors/TemplateEditor/TemplateEditor.tsx:380
|
||||||
msgid "Select instance to preview"
|
msgid "Select instance to preview"
|
||||||
msgstr "Vyberte instanci pro náhled"
|
msgstr "Vyberte instanci pro náhled"
|
||||||
|
|
||||||
#: src/components/editors/TemplateEditor/TemplateEditor.tsx:423
|
#: src/components/editors/TemplateEditor/TemplateEditor.tsx:424
|
||||||
msgid "Error rendering template"
|
msgid "Error rendering template"
|
||||||
msgstr "Chyba při načítání šablony"
|
msgstr "Chyba při načítání šablony"
|
||||||
|
|
||||||
|
|
@ -1829,20 +1830,20 @@ msgstr "Přihlášení proběhlo úspěšně"
|
||||||
#: src/components/forms/AuthenticationForm.tsx:81
|
#: src/components/forms/AuthenticationForm.tsx:81
|
||||||
#: src/components/forms/AuthenticationForm.tsx:89
|
#: src/components/forms/AuthenticationForm.tsx:89
|
||||||
#: src/functions/auth.tsx:133
|
#: src/functions/auth.tsx:133
|
||||||
#: src/functions/auth.tsx:142
|
#: src/functions/auth.tsx:144
|
||||||
msgid "Login failed"
|
msgid "Login failed"
|
||||||
msgstr "Přihlášení se nezdařilo"
|
msgstr "Přihlášení se nezdařilo"
|
||||||
|
|
||||||
#: src/components/forms/AuthenticationForm.tsx:82
|
#: src/components/forms/AuthenticationForm.tsx:82
|
||||||
#: src/components/forms/AuthenticationForm.tsx:90
|
#: src/components/forms/AuthenticationForm.tsx:90
|
||||||
#: src/components/forms/AuthenticationForm.tsx:106
|
#: src/components/forms/AuthenticationForm.tsx:106
|
||||||
#: src/functions/auth.tsx:134
|
#: src/functions/auth.tsx:136
|
||||||
#: src/functions/auth.tsx:354
|
#: src/functions/auth.tsx:356
|
||||||
msgid "Check your input and try again."
|
msgid "Check your input and try again."
|
||||||
msgstr "Zkontrolujte vstup a zkuste to znovu."
|
msgstr "Zkontrolujte vstup a zkuste to znovu."
|
||||||
|
|
||||||
#: src/components/forms/AuthenticationForm.tsx:100
|
#: src/components/forms/AuthenticationForm.tsx:100
|
||||||
#: src/functions/auth.tsx:345
|
#: src/functions/auth.tsx:347
|
||||||
msgid "Mail delivery successful"
|
msgid "Mail delivery successful"
|
||||||
msgstr "E-mail byl doručen úspěšně"
|
msgstr "E-mail byl doručen úspěšně"
|
||||||
|
|
||||||
|
|
@ -2128,6 +2129,7 @@ msgstr "Nezařazené"
|
||||||
|
|
||||||
#: src/components/forms/fields/IconField.tsx:211
|
#: src/components/forms/fields/IconField.tsx:211
|
||||||
#: src/components/nav/Layout.tsx:143
|
#: src/components/nav/Layout.tsx:143
|
||||||
|
#: src/components/nav/NavigationTree.tsx:378
|
||||||
#: src/tables/part/PartThumbTable.tsx:209
|
#: src/tables/part/PartThumbTable.tsx:209
|
||||||
msgid "Search..."
|
msgid "Search..."
|
||||||
msgstr "Hledat..."
|
msgstr "Hledat..."
|
||||||
|
|
@ -2153,6 +2155,7 @@ msgid "Loading"
|
||||||
msgstr "Načítání"
|
msgstr "Načítání"
|
||||||
|
|
||||||
#: src/components/forms/fields/RelatedModelField.tsx:540
|
#: src/components/forms/fields/RelatedModelField.tsx:540
|
||||||
|
#: src/components/nav/NavigationTree.tsx:403
|
||||||
msgid "No results found"
|
msgid "No results found"
|
||||||
msgstr "Nebyly nalezeny žádné výsledky"
|
msgstr "Nebyly nalezeny žádné výsledky"
|
||||||
|
|
||||||
|
|
@ -2247,7 +2250,7 @@ msgstr "Zpracovávání dat"
|
||||||
#: src/components/importer/ImporterColumnSelector.tsx:299
|
#: src/components/importer/ImporterColumnSelector.tsx:299
|
||||||
#: src/components/items/ErrorItem.tsx:12
|
#: src/components/items/ErrorItem.tsx:12
|
||||||
#: src/functions/api.tsx:60
|
#: src/functions/api.tsx:60
|
||||||
#: src/functions/auth.tsx:401
|
#: src/functions/auth.tsx:403
|
||||||
msgid "An error occurred"
|
msgid "An error occurred"
|
||||||
msgstr "Vyskytla se chyba"
|
msgstr "Vyskytla se chyba"
|
||||||
|
|
||||||
|
|
@ -2925,7 +2928,7 @@ msgstr "Odhlásit"
|
||||||
#: src/pages/Index/Settings/SystemSettings.tsx:260
|
#: src/pages/Index/Settings/SystemSettings.tsx:260
|
||||||
#: src/pages/part/PartDetail.tsx:663
|
#: src/pages/part/PartDetail.tsx:663
|
||||||
#: src/pages/stock/LocationDetail.tsx:481
|
#: src/pages/stock/LocationDetail.tsx:481
|
||||||
#: src/pages/stock/LocationDetail.tsx:522
|
#: src/pages/stock/LocationDetail.tsx:523
|
||||||
#: src/pages/stock/StockDetail.tsx:689
|
#: src/pages/stock/StockDetail.tsx:689
|
||||||
#: src/pages/stock/TransferOrderDetail.tsx:536
|
#: src/pages/stock/TransferOrderDetail.tsx:536
|
||||||
#: src/tables/stock/StockItemTable.tsx:81
|
#: src/tables/stock/StockItemTable.tsx:81
|
||||||
|
|
@ -2971,7 +2974,11 @@ msgstr "Navigace"
|
||||||
msgid "About"
|
msgid "About"
|
||||||
msgstr "O aplikaci"
|
msgstr "O aplikaci"
|
||||||
|
|
||||||
#: src/components/nav/NavigationTree.tsx:212
|
#: src/components/nav/NavigationTree.tsx:388
|
||||||
|
msgid "Clear search"
|
||||||
|
msgstr "Vymazat vyhledávání"
|
||||||
|
|
||||||
|
#: src/components/nav/NavigationTree.tsx:399
|
||||||
msgid "Error loading navigation tree."
|
msgid "Error loading navigation tree."
|
||||||
msgstr "Chyba při načítání navigačního stromu."
|
msgstr "Chyba při načítání navigačního stromu."
|
||||||
|
|
||||||
|
|
@ -5539,7 +5546,7 @@ msgstr "Interní chyba serveru"
|
||||||
#~ msgstr "You have been logged out"
|
#~ msgstr "You have been logged out"
|
||||||
|
|
||||||
#: src/functions/auth.tsx:124
|
#: src/functions/auth.tsx:124
|
||||||
#: src/functions/auth.tsx:220
|
#: src/functions/auth.tsx:222
|
||||||
msgid "Logged Out"
|
msgid "Logged Out"
|
||||||
msgstr "Odhlášen(a)"
|
msgstr "Odhlášen(a)"
|
||||||
|
|
||||||
|
|
@ -5551,97 +5558,97 @@ msgstr "Pro tento prohlížeč došlo ke konfliktní relaci, která byla odhlá
|
||||||
#~ msgid "Found an existing login - using it to log you in."
|
#~ msgid "Found an existing login - using it to log you in."
|
||||||
#~ msgstr "Found an existing login - using it to log you in."
|
#~ msgstr "Found an existing login - using it to log you in."
|
||||||
|
|
||||||
#: src/functions/auth.tsx:143
|
|
||||||
msgid "No response from server."
|
|
||||||
msgstr "Žádná odezva ze serveru."
|
|
||||||
|
|
||||||
#: src/functions/auth.tsx:143
|
#: src/functions/auth.tsx:143
|
||||||
#~ msgid "Found an existing login - welcome back!"
|
#~ msgid "Found an existing login - welcome back!"
|
||||||
#~ msgstr "Found an existing login - welcome back!"
|
#~ msgstr "Found an existing login - welcome back!"
|
||||||
|
|
||||||
#: src/functions/auth.tsx:186
|
#: src/functions/auth.tsx:145
|
||||||
|
msgid "No response from server."
|
||||||
|
msgstr "Žádná odezva ze serveru."
|
||||||
|
|
||||||
|
#: src/functions/auth.tsx:188
|
||||||
msgid "MFA Login successful"
|
msgid "MFA Login successful"
|
||||||
msgstr "MFA přihlášení úspěšné"
|
msgstr "MFA přihlášení úspěšné"
|
||||||
|
|
||||||
#: src/functions/auth.tsx:187
|
#: src/functions/auth.tsx:189
|
||||||
msgid "MFA details were automatically provided in the browser"
|
msgid "MFA details were automatically provided in the browser"
|
||||||
msgstr "Údaje o MFA byly automaticky poskytnuty v prohlížeči"
|
msgstr "Údaje o MFA byly automaticky poskytnuty v prohlížeči"
|
||||||
|
|
||||||
#: src/functions/auth.tsx:221
|
#: src/functions/auth.tsx:223
|
||||||
msgid "Successfully logged out"
|
msgid "Successfully logged out"
|
||||||
msgstr "Úspěšně odhlášen/a"
|
msgstr "Úspěšně odhlášen/a"
|
||||||
|
|
||||||
#: src/functions/auth.tsx:288
|
#: src/functions/auth.tsx:290
|
||||||
msgid "Language changed"
|
msgid "Language changed"
|
||||||
msgstr "Jazyk změněn"
|
msgstr "Jazyk změněn"
|
||||||
|
|
||||||
#: src/functions/auth.tsx:289
|
#: src/functions/auth.tsx:291
|
||||||
msgid "Your active language has been changed to the one set in your profile"
|
msgid "Your active language has been changed to the one set in your profile"
|
||||||
msgstr "Váš aktivní jazyk byl změněn podle nastavení Vašeho profilu"
|
msgstr "Váš aktivní jazyk byl změněn podle nastavení Vašeho profilu"
|
||||||
|
|
||||||
#: src/functions/auth.tsx:310
|
#: src/functions/auth.tsx:312
|
||||||
msgid "Theme changed"
|
msgid "Theme changed"
|
||||||
msgstr "Motiv změněn"
|
msgstr "Motiv změněn"
|
||||||
|
|
||||||
#: src/functions/auth.tsx:311
|
#: src/functions/auth.tsx:313
|
||||||
msgid "Your active theme has been changed to the one set in your profile"
|
msgid "Your active theme has been changed to the one set in your profile"
|
||||||
msgstr "Váš aktivní jazyk byl změněn podle nastavení Vašeho profilu"
|
msgstr "Váš aktivní jazyk byl změněn podle nastavení Vašeho profilu"
|
||||||
|
|
||||||
#: src/functions/auth.tsx:346
|
#: src/functions/auth.tsx:348
|
||||||
msgid "Check your inbox for a reset link. This only works if you have an account. Check in spam too."
|
msgid "Check your inbox for a reset link. This only works if you have an account. Check in spam too."
|
||||||
msgstr "Zkontrolujte doručenou poštu pro odkaz pro obnovení. Funguje to pouze v případě, že máte účet. Zkontrolujte také ve spamu."
|
msgstr "Zkontrolujte doručenou poštu pro odkaz pro obnovení. Funguje to pouze v případě, že máte účet. Zkontrolujte také ve spamu."
|
||||||
|
|
||||||
#: src/functions/auth.tsx:353
|
#: src/functions/auth.tsx:355
|
||||||
#: src/functions/auth.tsx:617
|
#: src/functions/auth.tsx:619
|
||||||
msgid "Reset failed"
|
msgid "Reset failed"
|
||||||
msgstr "Obnovení selhalo"
|
msgstr "Obnovení selhalo"
|
||||||
|
|
||||||
#: src/functions/auth.tsx:380
|
#: src/functions/auth.tsx:382
|
||||||
msgid "Already logged in"
|
msgid "Already logged in"
|
||||||
msgstr "Již přihlášeno!"
|
msgstr "Již přihlášeno!"
|
||||||
|
|
||||||
#: src/functions/auth.tsx:381
|
#: src/functions/auth.tsx:383
|
||||||
msgid "There is a conflicting session on the server for this browser. Please logout of that first."
|
msgid "There is a conflicting session on the server for this browser. Please logout of that first."
|
||||||
msgstr "Vyskytl se konflikt relací na serveru pro tento prohlížeč, prosím nejdřív se odhlašte."
|
msgstr "Vyskytl se konflikt relací na serveru pro tento prohlížeč, prosím nejdřív se odhlašte."
|
||||||
|
|
||||||
#: src/functions/auth.tsx:437
|
#: src/functions/auth.tsx:439
|
||||||
msgid "Logged In"
|
msgid "Logged In"
|
||||||
msgstr "Přihlášen"
|
msgstr "Přihlášen"
|
||||||
|
|
||||||
#: src/functions/auth.tsx:438
|
#: src/functions/auth.tsx:440
|
||||||
msgid "Successfully logged in"
|
msgid "Successfully logged in"
|
||||||
msgstr "Úspěšně přihlášen/a"
|
msgstr "Úspěšně přihlášen/a"
|
||||||
|
|
||||||
#: src/functions/auth.tsx:572
|
#: src/functions/auth.tsx:574
|
||||||
msgid "Failed to set up MFA"
|
msgid "Failed to set up MFA"
|
||||||
msgstr "Nepodařilo se nastavit MFA"
|
msgstr "Nepodařilo se nastavit MFA"
|
||||||
|
|
||||||
#: src/functions/auth.tsx:591
|
#: src/functions/auth.tsx:593
|
||||||
msgid "MFA Setup successful"
|
msgid "MFA Setup successful"
|
||||||
msgstr "Nastavení MFA bylo úspěšné"
|
msgstr "Nastavení MFA bylo úspěšné"
|
||||||
|
|
||||||
#: src/functions/auth.tsx:592
|
#: src/functions/auth.tsx:594
|
||||||
msgid "MFA via TOTP has been set up successfully; you will need to login again."
|
msgid "MFA via TOTP has been set up successfully; you will need to login again."
|
||||||
msgstr "MFA přes TOTP bylo úspěšně nastaveno; budete se muset znovu přihlásit."
|
msgstr "MFA přes TOTP bylo úspěšně nastaveno; budete se muset znovu přihlásit."
|
||||||
|
|
||||||
#: src/functions/auth.tsx:607
|
#: src/functions/auth.tsx:609
|
||||||
msgid "Password set"
|
msgid "Password set"
|
||||||
msgstr "Nastavení hesla"
|
msgstr "Nastavení hesla"
|
||||||
|
|
||||||
#: src/functions/auth.tsx:608
|
#: src/functions/auth.tsx:610
|
||||||
#: src/functions/auth.tsx:717
|
#: src/functions/auth.tsx:719
|
||||||
msgid "The password was set successfully. You can now login with your new password"
|
msgid "The password was set successfully. You can now login with your new password"
|
||||||
msgstr "Heslo bylo úspěšně nastaveno. Nyní se můžete přihlásit s novým heslem"
|
msgstr "Heslo bylo úspěšně nastaveno. Nyní se můžete přihlásit s novým heslem"
|
||||||
|
|
||||||
#: src/functions/auth.tsx:682
|
#: src/functions/auth.tsx:684
|
||||||
msgid "Password could not be changed"
|
msgid "Password could not be changed"
|
||||||
msgstr "Heslo nelze změnit"
|
msgstr "Heslo nelze změnit"
|
||||||
|
|
||||||
#: src/functions/auth.tsx:700
|
#: src/functions/auth.tsx:702
|
||||||
msgid "The two password fields didn’t match"
|
msgid "The two password fields didn’t match"
|
||||||
msgstr "Dvě pole s hesly se neshodují"
|
msgstr "Dvě pole s hesly se neshodují"
|
||||||
|
|
||||||
#: src/functions/auth.tsx:716
|
#: src/functions/auth.tsx:718
|
||||||
msgid "Password Changed"
|
msgid "Password Changed"
|
||||||
msgstr "Heslo bylo změněno"
|
msgstr "Heslo bylo změněno"
|
||||||
|
|
||||||
|
|
@ -8347,11 +8354,11 @@ msgstr "Vyhledat podle sériového čísla"
|
||||||
msgid "Part Actions"
|
msgid "Part Actions"
|
||||||
msgstr "Akce s položkou"
|
msgstr "Akce s položkou"
|
||||||
|
|
||||||
#: src/pages/part/PartDetail.tsx:1182
|
#: src/pages/part/PartDetail.tsx:1183
|
||||||
msgid "Part locked"
|
msgid "Part locked"
|
||||||
msgstr "Díl uzamčen"
|
msgstr "Díl uzamčen"
|
||||||
|
|
||||||
#: src/pages/part/PartDetail.tsx:1182
|
#: src/pages/part/PartDetail.tsx:1183
|
||||||
msgid "Part unlocked"
|
msgid "Part unlocked"
|
||||||
msgstr "Díl odemčen"
|
msgstr "Díl odemčen"
|
||||||
|
|
||||||
|
|
|
||||||
|
|
@ -8,7 +8,7 @@ msgstr ""
|
||||||
"Language: da\n"
|
"Language: da\n"
|
||||||
"Project-Id-Version: inventree\n"
|
"Project-Id-Version: inventree\n"
|
||||||
"Report-Msgid-Bugs-To: \n"
|
"Report-Msgid-Bugs-To: \n"
|
||||||
"PO-Revision-Date: 2026-06-17 22:14\n"
|
"PO-Revision-Date: 2026-06-20 13:53\n"
|
||||||
"Last-Translator: \n"
|
"Last-Translator: \n"
|
||||||
"Language-Team: Danish\n"
|
"Language-Team: Danish\n"
|
||||||
"Plural-Forms: nplurals=2; plural=(n != 1);\n"
|
"Plural-Forms: nplurals=2; plural=(n != 1);\n"
|
||||||
|
|
@ -147,7 +147,7 @@ msgstr "Nej"
|
||||||
#: src/forms/StockForms.tsx:1248
|
#: src/forms/StockForms.tsx:1248
|
||||||
#: src/forms/TransferOrderForms.tsx:234
|
#: src/forms/TransferOrderForms.tsx:234
|
||||||
#: src/pages/build/BuildDetail.tsx:260
|
#: src/pages/build/BuildDetail.tsx:260
|
||||||
#: src/pages/part/PartDetail.tsx:1165
|
#: src/pages/part/PartDetail.tsx:1166
|
||||||
#: src/pages/part/bom/BomCompare.tsx:203
|
#: src/pages/part/bom/BomCompare.tsx:203
|
||||||
#: src/tables/ColumnRenderers.tsx:93
|
#: src/tables/ColumnRenderers.tsx:93
|
||||||
#: src/tables/build/BuildOrderParametricTable.tsx:29
|
#: src/tables/build/BuildOrderParametricTable.tsx:29
|
||||||
|
|
@ -166,7 +166,7 @@ msgstr "Del"
|
||||||
#: src/pages/part/CategoryDetail.tsx:138
|
#: src/pages/part/CategoryDetail.tsx:138
|
||||||
#: src/pages/part/CategoryDetail.tsx:285
|
#: src/pages/part/CategoryDetail.tsx:285
|
||||||
#: src/pages/part/CategoryDetail.tsx:345
|
#: src/pages/part/CategoryDetail.tsx:345
|
||||||
#: src/pages/part/CategoryDetail.tsx:387
|
#: src/pages/part/CategoryDetail.tsx:388
|
||||||
#: src/pages/part/PartDetail.tsx:893
|
#: src/pages/part/PartDetail.tsx:893
|
||||||
msgid "Parts"
|
msgid "Parts"
|
||||||
msgstr "Dele"
|
msgstr "Dele"
|
||||||
|
|
@ -242,7 +242,7 @@ msgid "Manufacturer Parts"
|
||||||
msgstr "Producent Dele"
|
msgstr "Producent Dele"
|
||||||
|
|
||||||
#: lib/enums/ModelInformation.tsx:80
|
#: lib/enums/ModelInformation.tsx:80
|
||||||
#: src/pages/part/CategoryDetail.tsx:387
|
#: src/pages/part/CategoryDetail.tsx:388
|
||||||
#: src/tables/Filter.tsx:496
|
#: src/tables/Filter.tsx:496
|
||||||
msgid "Part Category"
|
msgid "Part Category"
|
||||||
msgstr "Del Kategori"
|
msgstr "Del Kategori"
|
||||||
|
|
@ -261,7 +261,7 @@ msgstr "Del Kategorier"
|
||||||
#: src/forms/BuildForms.tsx:848
|
#: src/forms/BuildForms.tsx:848
|
||||||
#: src/forms/SalesOrderForms.tsx:438
|
#: src/forms/SalesOrderForms.tsx:438
|
||||||
#: src/forms/TransferOrderForms.tsx:236
|
#: src/forms/TransferOrderForms.tsx:236
|
||||||
#: src/pages/stock/StockDetail.tsx:1075
|
#: src/pages/stock/StockDetail.tsx:1076
|
||||||
#: src/tables/ColumnRenderers.tsx:132
|
#: src/tables/ColumnRenderers.tsx:132
|
||||||
#: src/tables/part/PartTestResultTable.tsx:256
|
#: src/tables/part/PartTestResultTable.tsx:256
|
||||||
#: src/tables/stock/InstalledItemsTable.tsx:66
|
#: src/tables/stock/InstalledItemsTable.tsx:66
|
||||||
|
|
@ -283,7 +283,7 @@ msgstr "Lagervarer"
|
||||||
|
|
||||||
#: lib/enums/ModelInformation.tsx:99
|
#: lib/enums/ModelInformation.tsx:99
|
||||||
#: lib/enums/Roles.tsx:51
|
#: lib/enums/Roles.tsx:51
|
||||||
#: src/pages/stock/LocationDetail.tsx:522
|
#: src/pages/stock/LocationDetail.tsx:523
|
||||||
msgid "Stock Location"
|
msgid "Stock Location"
|
||||||
msgstr "Lagerlokation"
|
msgstr "Lagerlokation"
|
||||||
|
|
||||||
|
|
@ -644,14 +644,14 @@ msgstr ""
|
||||||
#: src/components/importer/ImporterColumnSelector.tsx:330
|
#: src/components/importer/ImporterColumnSelector.tsx:330
|
||||||
#: src/components/importer/ImporterDrawer.tsx:91
|
#: src/components/importer/ImporterDrawer.tsx:91
|
||||||
#: src/components/modals/LicenseModal.tsx:85
|
#: src/components/modals/LicenseModal.tsx:85
|
||||||
#: src/components/nav/NavigationTree.tsx:211
|
#: src/components/nav/NavigationTree.tsx:398
|
||||||
#: src/components/nav/NotificationDrawer.tsx:235
|
#: src/components/nav/NotificationDrawer.tsx:235
|
||||||
#: src/components/nav/SearchDrawer.tsx:588
|
#: src/components/nav/SearchDrawer.tsx:588
|
||||||
#: src/components/settings/SettingList.tsx:145
|
#: src/components/settings/SettingList.tsx:145
|
||||||
#: src/components/wizards/ImportPartWizard.tsx:574
|
#: src/components/wizards/ImportPartWizard.tsx:574
|
||||||
#: src/components/wizards/ImportPartWizard.tsx:719
|
#: src/components/wizards/ImportPartWizard.tsx:719
|
||||||
#: src/forms/BomForms.tsx:83
|
#: src/forms/BomForms.tsx:83
|
||||||
#: src/functions/auth.tsx:691
|
#: src/functions/auth.tsx:693
|
||||||
#: src/pages/ErrorPage.tsx:11
|
#: src/pages/ErrorPage.tsx:11
|
||||||
#: src/pages/Index/Settings/AccountSettings/MFASettings.tsx:317
|
#: src/pages/Index/Settings/AccountSettings/MFASettings.tsx:317
|
||||||
#: src/pages/Index/Settings/AccountSettings/MFASettings.tsx:408
|
#: src/pages/Index/Settings/AccountSettings/MFASettings.tsx:408
|
||||||
|
|
@ -723,6 +723,7 @@ msgstr "Anmodningen udløb"
|
||||||
|
|
||||||
#: lib/hooks/MonitorDataOutput.tsx:57
|
#: lib/hooks/MonitorDataOutput.tsx:57
|
||||||
#: lib/hooks/MonitorDataOutput.tsx:116
|
#: lib/hooks/MonitorDataOutput.tsx:116
|
||||||
|
#: src/components/editors/TemplateEditor/PdfPreview/PdfPreview.tsx:76
|
||||||
msgid "Process failed"
|
msgid "Process failed"
|
||||||
msgstr "Proces fejlede"
|
msgstr "Proces fejlede"
|
||||||
|
|
||||||
|
|
@ -1391,11 +1392,11 @@ msgstr "Kræver Superbruger"
|
||||||
msgid "This widget requires superuser permissions"
|
msgid "This widget requires superuser permissions"
|
||||||
msgstr "Denne widget kræver superbruger tilladelser"
|
msgstr "Denne widget kræver superbruger tilladelser"
|
||||||
|
|
||||||
#: src/components/dashboard/widgets/NewsWidget.tsx:133
|
#: src/components/dashboard/widgets/NewsWidget.tsx:135
|
||||||
msgid "No News"
|
msgid "No News"
|
||||||
msgstr "Ingen Nyheder"
|
msgstr "Ingen Nyheder"
|
||||||
|
|
||||||
#: src/components/dashboard/widgets/NewsWidget.tsx:134
|
#: src/components/dashboard/widgets/NewsWidget.tsx:136
|
||||||
msgid "There are no unread news items"
|
msgid "There are no unread news items"
|
||||||
msgstr "Der er ingen ulæste nyheder"
|
msgstr "Der er ingen ulæste nyheder"
|
||||||
|
|
||||||
|
|
@ -1655,7 +1656,7 @@ msgstr "Kode"
|
||||||
msgid "Error rendering preview"
|
msgid "Error rendering preview"
|
||||||
msgstr "Fejl under visning"
|
msgstr "Fejl under visning"
|
||||||
|
|
||||||
#: src/components/editors/TemplateEditor/PdfPreview/PdfPreview.tsx:120
|
#: src/components/editors/TemplateEditor/PdfPreview/PdfPreview.tsx:124
|
||||||
msgid "Preview not available, click \"Reload Preview\"."
|
msgid "Preview not available, click \"Reload Preview\"."
|
||||||
msgstr "Forhåndsvisning ikke tilgængelig, klik \"Genindlæs forhåndsvisning\"."
|
msgstr "Forhåndsvisning ikke tilgængelig, klik \"Genindlæs forhåndsvisning\"."
|
||||||
|
|
||||||
|
|
@ -1728,11 +1729,11 @@ msgstr "Gem den nuværende skabelon og genindlæs forhåndsvisningen"
|
||||||
#~ msgid "to preview"
|
#~ msgid "to preview"
|
||||||
#~ msgstr "to preview"
|
#~ msgstr "to preview"
|
||||||
|
|
||||||
#: src/components/editors/TemplateEditor/TemplateEditor.tsx:379
|
#: src/components/editors/TemplateEditor/TemplateEditor.tsx:380
|
||||||
msgid "Select instance to preview"
|
msgid "Select instance to preview"
|
||||||
msgstr "Vælg eksempel til forhåndsvisning"
|
msgstr "Vælg eksempel til forhåndsvisning"
|
||||||
|
|
||||||
#: src/components/editors/TemplateEditor/TemplateEditor.tsx:423
|
#: src/components/editors/TemplateEditor/TemplateEditor.tsx:424
|
||||||
msgid "Error rendering template"
|
msgid "Error rendering template"
|
||||||
msgstr "Render fejl af skabelon"
|
msgstr "Render fejl af skabelon"
|
||||||
|
|
||||||
|
|
@ -1829,20 +1830,20 @@ msgstr "Logget ind"
|
||||||
#: src/components/forms/AuthenticationForm.tsx:81
|
#: src/components/forms/AuthenticationForm.tsx:81
|
||||||
#: src/components/forms/AuthenticationForm.tsx:89
|
#: src/components/forms/AuthenticationForm.tsx:89
|
||||||
#: src/functions/auth.tsx:133
|
#: src/functions/auth.tsx:133
|
||||||
#: src/functions/auth.tsx:142
|
#: src/functions/auth.tsx:144
|
||||||
msgid "Login failed"
|
msgid "Login failed"
|
||||||
msgstr "Login mislykkedes"
|
msgstr "Login mislykkedes"
|
||||||
|
|
||||||
#: src/components/forms/AuthenticationForm.tsx:82
|
#: src/components/forms/AuthenticationForm.tsx:82
|
||||||
#: src/components/forms/AuthenticationForm.tsx:90
|
#: src/components/forms/AuthenticationForm.tsx:90
|
||||||
#: src/components/forms/AuthenticationForm.tsx:106
|
#: src/components/forms/AuthenticationForm.tsx:106
|
||||||
#: src/functions/auth.tsx:134
|
#: src/functions/auth.tsx:136
|
||||||
#: src/functions/auth.tsx:354
|
#: src/functions/auth.tsx:356
|
||||||
msgid "Check your input and try again."
|
msgid "Check your input and try again."
|
||||||
msgstr "Tjek din indtastning og prøv igen."
|
msgstr "Tjek din indtastning og prøv igen."
|
||||||
|
|
||||||
#: src/components/forms/AuthenticationForm.tsx:100
|
#: src/components/forms/AuthenticationForm.tsx:100
|
||||||
#: src/functions/auth.tsx:345
|
#: src/functions/auth.tsx:347
|
||||||
msgid "Mail delivery successful"
|
msgid "Mail delivery successful"
|
||||||
msgstr "Mail levering succesfuld"
|
msgstr "Mail levering succesfuld"
|
||||||
|
|
||||||
|
|
@ -2128,6 +2129,7 @@ msgstr "Ukategoriseret"
|
||||||
|
|
||||||
#: src/components/forms/fields/IconField.tsx:211
|
#: src/components/forms/fields/IconField.tsx:211
|
||||||
#: src/components/nav/Layout.tsx:143
|
#: src/components/nav/Layout.tsx:143
|
||||||
|
#: src/components/nav/NavigationTree.tsx:378
|
||||||
#: src/tables/part/PartThumbTable.tsx:209
|
#: src/tables/part/PartThumbTable.tsx:209
|
||||||
msgid "Search..."
|
msgid "Search..."
|
||||||
msgstr "Søg..."
|
msgstr "Søg..."
|
||||||
|
|
@ -2153,6 +2155,7 @@ msgid "Loading"
|
||||||
msgstr "Indlæser"
|
msgstr "Indlæser"
|
||||||
|
|
||||||
#: src/components/forms/fields/RelatedModelField.tsx:540
|
#: src/components/forms/fields/RelatedModelField.tsx:540
|
||||||
|
#: src/components/nav/NavigationTree.tsx:403
|
||||||
msgid "No results found"
|
msgid "No results found"
|
||||||
msgstr "Ingen resultater fundet"
|
msgstr "Ingen resultater fundet"
|
||||||
|
|
||||||
|
|
@ -2247,7 +2250,7 @@ msgstr "Behandler Data"
|
||||||
#: src/components/importer/ImporterColumnSelector.tsx:299
|
#: src/components/importer/ImporterColumnSelector.tsx:299
|
||||||
#: src/components/items/ErrorItem.tsx:12
|
#: src/components/items/ErrorItem.tsx:12
|
||||||
#: src/functions/api.tsx:60
|
#: src/functions/api.tsx:60
|
||||||
#: src/functions/auth.tsx:401
|
#: src/functions/auth.tsx:403
|
||||||
msgid "An error occurred"
|
msgid "An error occurred"
|
||||||
msgstr "En feil opstod"
|
msgstr "En feil opstod"
|
||||||
|
|
||||||
|
|
@ -2925,7 +2928,7 @@ msgstr "Log ud"
|
||||||
#: src/pages/Index/Settings/SystemSettings.tsx:260
|
#: src/pages/Index/Settings/SystemSettings.tsx:260
|
||||||
#: src/pages/part/PartDetail.tsx:663
|
#: src/pages/part/PartDetail.tsx:663
|
||||||
#: src/pages/stock/LocationDetail.tsx:481
|
#: src/pages/stock/LocationDetail.tsx:481
|
||||||
#: src/pages/stock/LocationDetail.tsx:522
|
#: src/pages/stock/LocationDetail.tsx:523
|
||||||
#: src/pages/stock/StockDetail.tsx:689
|
#: src/pages/stock/StockDetail.tsx:689
|
||||||
#: src/pages/stock/TransferOrderDetail.tsx:536
|
#: src/pages/stock/TransferOrderDetail.tsx:536
|
||||||
#: src/tables/stock/StockItemTable.tsx:81
|
#: src/tables/stock/StockItemTable.tsx:81
|
||||||
|
|
@ -2971,7 +2974,11 @@ msgstr "Navigation"
|
||||||
msgid "About"
|
msgid "About"
|
||||||
msgstr "Omkring"
|
msgstr "Omkring"
|
||||||
|
|
||||||
#: src/components/nav/NavigationTree.tsx:212
|
#: src/components/nav/NavigationTree.tsx:388
|
||||||
|
msgid "Clear search"
|
||||||
|
msgstr ""
|
||||||
|
|
||||||
|
#: src/components/nav/NavigationTree.tsx:399
|
||||||
msgid "Error loading navigation tree."
|
msgid "Error loading navigation tree."
|
||||||
msgstr "Fejl ved indlæsning af navigationstræ."
|
msgstr "Fejl ved indlæsning af navigationstræ."
|
||||||
|
|
||||||
|
|
@ -5539,7 +5546,7 @@ msgstr "Intern serverfejl"
|
||||||
#~ msgstr "You have been logged out"
|
#~ msgstr "You have been logged out"
|
||||||
|
|
||||||
#: src/functions/auth.tsx:124
|
#: src/functions/auth.tsx:124
|
||||||
#: src/functions/auth.tsx:220
|
#: src/functions/auth.tsx:222
|
||||||
msgid "Logged Out"
|
msgid "Logged Out"
|
||||||
msgstr "Logget af"
|
msgstr "Logget af"
|
||||||
|
|
||||||
|
|
@ -5551,97 +5558,97 @@ msgstr ""
|
||||||
#~ msgid "Found an existing login - using it to log you in."
|
#~ msgid "Found an existing login - using it to log you in."
|
||||||
#~ msgstr "Found an existing login - using it to log you in."
|
#~ msgstr "Found an existing login - using it to log you in."
|
||||||
|
|
||||||
#: src/functions/auth.tsx:143
|
|
||||||
msgid "No response from server."
|
|
||||||
msgstr "Intet svar fra server."
|
|
||||||
|
|
||||||
#: src/functions/auth.tsx:143
|
#: src/functions/auth.tsx:143
|
||||||
#~ msgid "Found an existing login - welcome back!"
|
#~ msgid "Found an existing login - welcome back!"
|
||||||
#~ msgstr "Found an existing login - welcome back!"
|
#~ msgstr "Found an existing login - welcome back!"
|
||||||
|
|
||||||
#: src/functions/auth.tsx:186
|
#: src/functions/auth.tsx:145
|
||||||
|
msgid "No response from server."
|
||||||
|
msgstr "Intet svar fra server."
|
||||||
|
|
||||||
|
#: src/functions/auth.tsx:188
|
||||||
msgid "MFA Login successful"
|
msgid "MFA Login successful"
|
||||||
msgstr "Multifaktorgodkendelse Login succesfuld"
|
msgstr "Multifaktorgodkendelse Login succesfuld"
|
||||||
|
|
||||||
#: src/functions/auth.tsx:187
|
#: src/functions/auth.tsx:189
|
||||||
msgid "MFA details were automatically provided in the browser"
|
msgid "MFA details were automatically provided in the browser"
|
||||||
msgstr "Multifaktorgodkendelse detaljer blev automatisk givet i browseren"
|
msgstr "Multifaktorgodkendelse detaljer blev automatisk givet i browseren"
|
||||||
|
|
||||||
#: src/functions/auth.tsx:221
|
#: src/functions/auth.tsx:223
|
||||||
msgid "Successfully logged out"
|
msgid "Successfully logged out"
|
||||||
msgstr "Du er nu logget af"
|
msgstr "Du er nu logget af"
|
||||||
|
|
||||||
#: src/functions/auth.tsx:288
|
#: src/functions/auth.tsx:290
|
||||||
msgid "Language changed"
|
msgid "Language changed"
|
||||||
msgstr "Sprog ændret"
|
msgstr "Sprog ændret"
|
||||||
|
|
||||||
#: src/functions/auth.tsx:289
|
#: src/functions/auth.tsx:291
|
||||||
msgid "Your active language has been changed to the one set in your profile"
|
msgid "Your active language has been changed to the one set in your profile"
|
||||||
msgstr "Dit aktive sprog er blevet ændret til det der er sat i din profil"
|
msgstr "Dit aktive sprog er blevet ændret til det der er sat i din profil"
|
||||||
|
|
||||||
#: src/functions/auth.tsx:310
|
#: src/functions/auth.tsx:312
|
||||||
msgid "Theme changed"
|
msgid "Theme changed"
|
||||||
msgstr "Tema ændret"
|
msgstr "Tema ændret"
|
||||||
|
|
||||||
#: src/functions/auth.tsx:311
|
#: src/functions/auth.tsx:313
|
||||||
msgid "Your active theme has been changed to the one set in your profile"
|
msgid "Your active theme has been changed to the one set in your profile"
|
||||||
msgstr "Dit aktive tema er blevet ændret til det der er sat i din profil"
|
msgstr "Dit aktive tema er blevet ændret til det der er sat i din profil"
|
||||||
|
|
||||||
#: src/functions/auth.tsx:346
|
#: src/functions/auth.tsx:348
|
||||||
msgid "Check your inbox for a reset link. This only works if you have an account. Check in spam too."
|
msgid "Check your inbox for a reset link. This only works if you have an account. Check in spam too."
|
||||||
msgstr "Tjek din indbakke for et nulstillingslink. Dette virker kun, hvis du har en konto. Tjek også spam."
|
msgstr "Tjek din indbakke for et nulstillingslink. Dette virker kun, hvis du har en konto. Tjek også spam."
|
||||||
|
|
||||||
#: src/functions/auth.tsx:353
|
#: src/functions/auth.tsx:355
|
||||||
#: src/functions/auth.tsx:617
|
#: src/functions/auth.tsx:619
|
||||||
msgid "Reset failed"
|
msgid "Reset failed"
|
||||||
msgstr "Nulstilling fejlede"
|
msgstr "Nulstilling fejlede"
|
||||||
|
|
||||||
#: src/functions/auth.tsx:380
|
#: src/functions/auth.tsx:382
|
||||||
msgid "Already logged in"
|
msgid "Already logged in"
|
||||||
msgstr "Allerede logget ind"
|
msgstr "Allerede logget ind"
|
||||||
|
|
||||||
#: src/functions/auth.tsx:381
|
#: src/functions/auth.tsx:383
|
||||||
msgid "There is a conflicting session on the server for this browser. Please logout of that first."
|
msgid "There is a conflicting session on the server for this browser. Please logout of that first."
|
||||||
msgstr "Der er en konfliktfyldt session på serveren for denne browser. Log ud af det først."
|
msgstr "Der er en konfliktfyldt session på serveren for denne browser. Log ud af det først."
|
||||||
|
|
||||||
#: src/functions/auth.tsx:437
|
#: src/functions/auth.tsx:439
|
||||||
msgid "Logged In"
|
msgid "Logged In"
|
||||||
msgstr "Logget ind"
|
msgstr "Logget ind"
|
||||||
|
|
||||||
#: src/functions/auth.tsx:438
|
#: src/functions/auth.tsx:440
|
||||||
msgid "Successfully logged in"
|
msgid "Successfully logged in"
|
||||||
msgstr "Logget ind"
|
msgstr "Logget ind"
|
||||||
|
|
||||||
#: src/functions/auth.tsx:572
|
#: src/functions/auth.tsx:574
|
||||||
msgid "Failed to set up MFA"
|
msgid "Failed to set up MFA"
|
||||||
msgstr "Kunne ikke oprette Multifaktorgodkendelse"
|
msgstr "Kunne ikke oprette Multifaktorgodkendelse"
|
||||||
|
|
||||||
#: src/functions/auth.tsx:591
|
#: src/functions/auth.tsx:593
|
||||||
msgid "MFA Setup successful"
|
msgid "MFA Setup successful"
|
||||||
msgstr ""
|
msgstr ""
|
||||||
|
|
||||||
#: src/functions/auth.tsx:592
|
#: src/functions/auth.tsx:594
|
||||||
msgid "MFA via TOTP has been set up successfully; you will need to login again."
|
msgid "MFA via TOTP has been set up successfully; you will need to login again."
|
||||||
msgstr ""
|
msgstr ""
|
||||||
|
|
||||||
#: src/functions/auth.tsx:607
|
#: src/functions/auth.tsx:609
|
||||||
msgid "Password set"
|
msgid "Password set"
|
||||||
msgstr "Adgangskode sat"
|
msgstr "Adgangskode sat"
|
||||||
|
|
||||||
#: src/functions/auth.tsx:608
|
#: src/functions/auth.tsx:610
|
||||||
#: src/functions/auth.tsx:717
|
#: src/functions/auth.tsx:719
|
||||||
msgid "The password was set successfully. You can now login with your new password"
|
msgid "The password was set successfully. You can now login with your new password"
|
||||||
msgstr "Adgangskoden blev oprettet. Du kan nu logge ind med din nye adgangskode"
|
msgstr "Adgangskoden blev oprettet. Du kan nu logge ind med din nye adgangskode"
|
||||||
|
|
||||||
#: src/functions/auth.tsx:682
|
#: src/functions/auth.tsx:684
|
||||||
msgid "Password could not be changed"
|
msgid "Password could not be changed"
|
||||||
msgstr "Adgangskoden kunne ikke ændres"
|
msgstr "Adgangskoden kunne ikke ændres"
|
||||||
|
|
||||||
#: src/functions/auth.tsx:700
|
#: src/functions/auth.tsx:702
|
||||||
msgid "The two password fields didn’t match"
|
msgid "The two password fields didn’t match"
|
||||||
msgstr "De to adgangskodefelter matcher ikke"
|
msgstr "De to adgangskodefelter matcher ikke"
|
||||||
|
|
||||||
#: src/functions/auth.tsx:716
|
#: src/functions/auth.tsx:718
|
||||||
msgid "Password Changed"
|
msgid "Password Changed"
|
||||||
msgstr "Adgangskode ændret"
|
msgstr "Adgangskode ændret"
|
||||||
|
|
||||||
|
|
@ -8347,11 +8354,11 @@ msgstr "Søg på serienummer"
|
||||||
msgid "Part Actions"
|
msgid "Part Actions"
|
||||||
msgstr "Del Handlinger"
|
msgstr "Del Handlinger"
|
||||||
|
|
||||||
#: src/pages/part/PartDetail.tsx:1182
|
#: src/pages/part/PartDetail.tsx:1183
|
||||||
msgid "Part locked"
|
msgid "Part locked"
|
||||||
msgstr ""
|
msgstr ""
|
||||||
|
|
||||||
#: src/pages/part/PartDetail.tsx:1182
|
#: src/pages/part/PartDetail.tsx:1183
|
||||||
msgid "Part unlocked"
|
msgid "Part unlocked"
|
||||||
msgstr ""
|
msgstr ""
|
||||||
|
|
||||||
|
|
|
||||||
|
|
@ -8,7 +8,7 @@ msgstr ""
|
||||||
"Language: de\n"
|
"Language: de\n"
|
||||||
"Project-Id-Version: inventree\n"
|
"Project-Id-Version: inventree\n"
|
||||||
"Report-Msgid-Bugs-To: \n"
|
"Report-Msgid-Bugs-To: \n"
|
||||||
"PO-Revision-Date: 2026-06-17 22:14\n"
|
"PO-Revision-Date: 2026-06-20 13:53\n"
|
||||||
"Last-Translator: \n"
|
"Last-Translator: \n"
|
||||||
"Language-Team: German\n"
|
"Language-Team: German\n"
|
||||||
"Plural-Forms: nplurals=2; plural=(n != 1);\n"
|
"Plural-Forms: nplurals=2; plural=(n != 1);\n"
|
||||||
|
|
@ -147,7 +147,7 @@ msgstr "Nein"
|
||||||
#: src/forms/StockForms.tsx:1248
|
#: src/forms/StockForms.tsx:1248
|
||||||
#: src/forms/TransferOrderForms.tsx:234
|
#: src/forms/TransferOrderForms.tsx:234
|
||||||
#: src/pages/build/BuildDetail.tsx:260
|
#: src/pages/build/BuildDetail.tsx:260
|
||||||
#: src/pages/part/PartDetail.tsx:1165
|
#: src/pages/part/PartDetail.tsx:1166
|
||||||
#: src/pages/part/bom/BomCompare.tsx:203
|
#: src/pages/part/bom/BomCompare.tsx:203
|
||||||
#: src/tables/ColumnRenderers.tsx:93
|
#: src/tables/ColumnRenderers.tsx:93
|
||||||
#: src/tables/build/BuildOrderParametricTable.tsx:29
|
#: src/tables/build/BuildOrderParametricTable.tsx:29
|
||||||
|
|
@ -166,7 +166,7 @@ msgstr "Teil"
|
||||||
#: src/pages/part/CategoryDetail.tsx:138
|
#: src/pages/part/CategoryDetail.tsx:138
|
||||||
#: src/pages/part/CategoryDetail.tsx:285
|
#: src/pages/part/CategoryDetail.tsx:285
|
||||||
#: src/pages/part/CategoryDetail.tsx:345
|
#: src/pages/part/CategoryDetail.tsx:345
|
||||||
#: src/pages/part/CategoryDetail.tsx:387
|
#: src/pages/part/CategoryDetail.tsx:388
|
||||||
#: src/pages/part/PartDetail.tsx:893
|
#: src/pages/part/PartDetail.tsx:893
|
||||||
msgid "Parts"
|
msgid "Parts"
|
||||||
msgstr "Teile"
|
msgstr "Teile"
|
||||||
|
|
@ -242,7 +242,7 @@ msgid "Manufacturer Parts"
|
||||||
msgstr "Herstellerteile"
|
msgstr "Herstellerteile"
|
||||||
|
|
||||||
#: lib/enums/ModelInformation.tsx:80
|
#: lib/enums/ModelInformation.tsx:80
|
||||||
#: src/pages/part/CategoryDetail.tsx:387
|
#: src/pages/part/CategoryDetail.tsx:388
|
||||||
#: src/tables/Filter.tsx:496
|
#: src/tables/Filter.tsx:496
|
||||||
msgid "Part Category"
|
msgid "Part Category"
|
||||||
msgstr "Teilkategorie"
|
msgstr "Teilkategorie"
|
||||||
|
|
@ -261,7 +261,7 @@ msgstr "Teil-Kategorien"
|
||||||
#: src/forms/BuildForms.tsx:848
|
#: src/forms/BuildForms.tsx:848
|
||||||
#: src/forms/SalesOrderForms.tsx:438
|
#: src/forms/SalesOrderForms.tsx:438
|
||||||
#: src/forms/TransferOrderForms.tsx:236
|
#: src/forms/TransferOrderForms.tsx:236
|
||||||
#: src/pages/stock/StockDetail.tsx:1075
|
#: src/pages/stock/StockDetail.tsx:1076
|
||||||
#: src/tables/ColumnRenderers.tsx:132
|
#: src/tables/ColumnRenderers.tsx:132
|
||||||
#: src/tables/part/PartTestResultTable.tsx:256
|
#: src/tables/part/PartTestResultTable.tsx:256
|
||||||
#: src/tables/stock/InstalledItemsTable.tsx:66
|
#: src/tables/stock/InstalledItemsTable.tsx:66
|
||||||
|
|
@ -283,7 +283,7 @@ msgstr "Lagerartikel"
|
||||||
|
|
||||||
#: lib/enums/ModelInformation.tsx:99
|
#: lib/enums/ModelInformation.tsx:99
|
||||||
#: lib/enums/Roles.tsx:51
|
#: lib/enums/Roles.tsx:51
|
||||||
#: src/pages/stock/LocationDetail.tsx:522
|
#: src/pages/stock/LocationDetail.tsx:523
|
||||||
msgid "Stock Location"
|
msgid "Stock Location"
|
||||||
msgstr "Lagerort"
|
msgstr "Lagerort"
|
||||||
|
|
||||||
|
|
@ -644,14 +644,14 @@ msgstr ""
|
||||||
#: src/components/importer/ImporterColumnSelector.tsx:330
|
#: src/components/importer/ImporterColumnSelector.tsx:330
|
||||||
#: src/components/importer/ImporterDrawer.tsx:91
|
#: src/components/importer/ImporterDrawer.tsx:91
|
||||||
#: src/components/modals/LicenseModal.tsx:85
|
#: src/components/modals/LicenseModal.tsx:85
|
||||||
#: src/components/nav/NavigationTree.tsx:211
|
#: src/components/nav/NavigationTree.tsx:398
|
||||||
#: src/components/nav/NotificationDrawer.tsx:235
|
#: src/components/nav/NotificationDrawer.tsx:235
|
||||||
#: src/components/nav/SearchDrawer.tsx:588
|
#: src/components/nav/SearchDrawer.tsx:588
|
||||||
#: src/components/settings/SettingList.tsx:145
|
#: src/components/settings/SettingList.tsx:145
|
||||||
#: src/components/wizards/ImportPartWizard.tsx:574
|
#: src/components/wizards/ImportPartWizard.tsx:574
|
||||||
#: src/components/wizards/ImportPartWizard.tsx:719
|
#: src/components/wizards/ImportPartWizard.tsx:719
|
||||||
#: src/forms/BomForms.tsx:83
|
#: src/forms/BomForms.tsx:83
|
||||||
#: src/functions/auth.tsx:691
|
#: src/functions/auth.tsx:693
|
||||||
#: src/pages/ErrorPage.tsx:11
|
#: src/pages/ErrorPage.tsx:11
|
||||||
#: src/pages/Index/Settings/AccountSettings/MFASettings.tsx:317
|
#: src/pages/Index/Settings/AccountSettings/MFASettings.tsx:317
|
||||||
#: src/pages/Index/Settings/AccountSettings/MFASettings.tsx:408
|
#: src/pages/Index/Settings/AccountSettings/MFASettings.tsx:408
|
||||||
|
|
@ -723,6 +723,7 @@ msgstr "Bei der Anfrage ist eine Zeitüberschreitung aufgetreten"
|
||||||
|
|
||||||
#: lib/hooks/MonitorDataOutput.tsx:57
|
#: lib/hooks/MonitorDataOutput.tsx:57
|
||||||
#: lib/hooks/MonitorDataOutput.tsx:116
|
#: lib/hooks/MonitorDataOutput.tsx:116
|
||||||
|
#: src/components/editors/TemplateEditor/PdfPreview/PdfPreview.tsx:76
|
||||||
msgid "Process failed"
|
msgid "Process failed"
|
||||||
msgstr "Prozess fehlgeschlagen"
|
msgstr "Prozess fehlgeschlagen"
|
||||||
|
|
||||||
|
|
@ -1391,11 +1392,11 @@ msgstr "Superuser benötigt"
|
||||||
msgid "This widget requires superuser permissions"
|
msgid "This widget requires superuser permissions"
|
||||||
msgstr "Dieses Widget benötigt Superuser-Berechtigungen"
|
msgstr "Dieses Widget benötigt Superuser-Berechtigungen"
|
||||||
|
|
||||||
#: src/components/dashboard/widgets/NewsWidget.tsx:133
|
#: src/components/dashboard/widgets/NewsWidget.tsx:135
|
||||||
msgid "No News"
|
msgid "No News"
|
||||||
msgstr "Keine Neuigkeiten"
|
msgstr "Keine Neuigkeiten"
|
||||||
|
|
||||||
#: src/components/dashboard/widgets/NewsWidget.tsx:134
|
#: src/components/dashboard/widgets/NewsWidget.tsx:136
|
||||||
msgid "There are no unread news items"
|
msgid "There are no unread news items"
|
||||||
msgstr "Es gibt keine ungelesenen Neuigkeiten"
|
msgstr "Es gibt keine ungelesenen Neuigkeiten"
|
||||||
|
|
||||||
|
|
@ -1655,7 +1656,7 @@ msgstr "Code"
|
||||||
msgid "Error rendering preview"
|
msgid "Error rendering preview"
|
||||||
msgstr "Fehler beim rendern der Vorschau"
|
msgstr "Fehler beim rendern der Vorschau"
|
||||||
|
|
||||||
#: src/components/editors/TemplateEditor/PdfPreview/PdfPreview.tsx:120
|
#: src/components/editors/TemplateEditor/PdfPreview/PdfPreview.tsx:124
|
||||||
msgid "Preview not available, click \"Reload Preview\"."
|
msgid "Preview not available, click \"Reload Preview\"."
|
||||||
msgstr "Vorschau nicht verfügbar, klicke \"Vorschau neu laden\"."
|
msgstr "Vorschau nicht verfügbar, klicke \"Vorschau neu laden\"."
|
||||||
|
|
||||||
|
|
@ -1728,11 +1729,11 @@ msgstr "Die aktuelle Vorlage speichern und die Vorschau neu laden"
|
||||||
#~ msgid "to preview"
|
#~ msgid "to preview"
|
||||||
#~ msgstr "to preview"
|
#~ msgstr "to preview"
|
||||||
|
|
||||||
#: src/components/editors/TemplateEditor/TemplateEditor.tsx:379
|
#: src/components/editors/TemplateEditor/TemplateEditor.tsx:380
|
||||||
msgid "Select instance to preview"
|
msgid "Select instance to preview"
|
||||||
msgstr "Instanz für Vorschau auswählen"
|
msgstr "Instanz für Vorschau auswählen"
|
||||||
|
|
||||||
#: src/components/editors/TemplateEditor/TemplateEditor.tsx:423
|
#: src/components/editors/TemplateEditor/TemplateEditor.tsx:424
|
||||||
msgid "Error rendering template"
|
msgid "Error rendering template"
|
||||||
msgstr "Fehler bei Darstellung der Vorlage"
|
msgstr "Fehler bei Darstellung der Vorlage"
|
||||||
|
|
||||||
|
|
@ -1829,20 +1830,20 @@ msgstr "Erfolgreich eingeloggt"
|
||||||
#: src/components/forms/AuthenticationForm.tsx:81
|
#: src/components/forms/AuthenticationForm.tsx:81
|
||||||
#: src/components/forms/AuthenticationForm.tsx:89
|
#: src/components/forms/AuthenticationForm.tsx:89
|
||||||
#: src/functions/auth.tsx:133
|
#: src/functions/auth.tsx:133
|
||||||
#: src/functions/auth.tsx:142
|
#: src/functions/auth.tsx:144
|
||||||
msgid "Login failed"
|
msgid "Login failed"
|
||||||
msgstr "Login fehlgeschlagen"
|
msgstr "Login fehlgeschlagen"
|
||||||
|
|
||||||
#: src/components/forms/AuthenticationForm.tsx:82
|
#: src/components/forms/AuthenticationForm.tsx:82
|
||||||
#: src/components/forms/AuthenticationForm.tsx:90
|
#: src/components/forms/AuthenticationForm.tsx:90
|
||||||
#: src/components/forms/AuthenticationForm.tsx:106
|
#: src/components/forms/AuthenticationForm.tsx:106
|
||||||
#: src/functions/auth.tsx:134
|
#: src/functions/auth.tsx:136
|
||||||
#: src/functions/auth.tsx:354
|
#: src/functions/auth.tsx:356
|
||||||
msgid "Check your input and try again."
|
msgid "Check your input and try again."
|
||||||
msgstr "Überprüfen Sie Ihre Eingabe und versuchen Sie es erneut."
|
msgstr "Überprüfen Sie Ihre Eingabe und versuchen Sie es erneut."
|
||||||
|
|
||||||
#: src/components/forms/AuthenticationForm.tsx:100
|
#: src/components/forms/AuthenticationForm.tsx:100
|
||||||
#: src/functions/auth.tsx:345
|
#: src/functions/auth.tsx:347
|
||||||
msgid "Mail delivery successful"
|
msgid "Mail delivery successful"
|
||||||
msgstr "Mail erfolgreich gesendet"
|
msgstr "Mail erfolgreich gesendet"
|
||||||
|
|
||||||
|
|
@ -2128,6 +2129,7 @@ msgstr "Nicht kategorisiert"
|
||||||
|
|
||||||
#: src/components/forms/fields/IconField.tsx:211
|
#: src/components/forms/fields/IconField.tsx:211
|
||||||
#: src/components/nav/Layout.tsx:143
|
#: src/components/nav/Layout.tsx:143
|
||||||
|
#: src/components/nav/NavigationTree.tsx:378
|
||||||
#: src/tables/part/PartThumbTable.tsx:209
|
#: src/tables/part/PartThumbTable.tsx:209
|
||||||
msgid "Search..."
|
msgid "Search..."
|
||||||
msgstr "Suchen..."
|
msgstr "Suchen..."
|
||||||
|
|
@ -2153,6 +2155,7 @@ msgid "Loading"
|
||||||
msgstr "Wird geladen"
|
msgstr "Wird geladen"
|
||||||
|
|
||||||
#: src/components/forms/fields/RelatedModelField.tsx:540
|
#: src/components/forms/fields/RelatedModelField.tsx:540
|
||||||
|
#: src/components/nav/NavigationTree.tsx:403
|
||||||
msgid "No results found"
|
msgid "No results found"
|
||||||
msgstr "Keine Ergebnisse gefunden"
|
msgstr "Keine Ergebnisse gefunden"
|
||||||
|
|
||||||
|
|
@ -2247,7 +2250,7 @@ msgstr "Daten werden verarbeiten"
|
||||||
#: src/components/importer/ImporterColumnSelector.tsx:299
|
#: src/components/importer/ImporterColumnSelector.tsx:299
|
||||||
#: src/components/items/ErrorItem.tsx:12
|
#: src/components/items/ErrorItem.tsx:12
|
||||||
#: src/functions/api.tsx:60
|
#: src/functions/api.tsx:60
|
||||||
#: src/functions/auth.tsx:401
|
#: src/functions/auth.tsx:403
|
||||||
msgid "An error occurred"
|
msgid "An error occurred"
|
||||||
msgstr "Ein Fehler ist aufgetreten"
|
msgstr "Ein Fehler ist aufgetreten"
|
||||||
|
|
||||||
|
|
@ -2925,7 +2928,7 @@ msgstr "Abmelden"
|
||||||
#: src/pages/Index/Settings/SystemSettings.tsx:260
|
#: src/pages/Index/Settings/SystemSettings.tsx:260
|
||||||
#: src/pages/part/PartDetail.tsx:663
|
#: src/pages/part/PartDetail.tsx:663
|
||||||
#: src/pages/stock/LocationDetail.tsx:481
|
#: src/pages/stock/LocationDetail.tsx:481
|
||||||
#: src/pages/stock/LocationDetail.tsx:522
|
#: src/pages/stock/LocationDetail.tsx:523
|
||||||
#: src/pages/stock/StockDetail.tsx:689
|
#: src/pages/stock/StockDetail.tsx:689
|
||||||
#: src/pages/stock/TransferOrderDetail.tsx:536
|
#: src/pages/stock/TransferOrderDetail.tsx:536
|
||||||
#: src/tables/stock/StockItemTable.tsx:81
|
#: src/tables/stock/StockItemTable.tsx:81
|
||||||
|
|
@ -2971,7 +2974,11 @@ msgstr "Navigation"
|
||||||
msgid "About"
|
msgid "About"
|
||||||
msgstr "Über uns"
|
msgstr "Über uns"
|
||||||
|
|
||||||
#: src/components/nav/NavigationTree.tsx:212
|
#: src/components/nav/NavigationTree.tsx:388
|
||||||
|
msgid "Clear search"
|
||||||
|
msgstr ""
|
||||||
|
|
||||||
|
#: src/components/nav/NavigationTree.tsx:399
|
||||||
msgid "Error loading navigation tree."
|
msgid "Error loading navigation tree."
|
||||||
msgstr "Fehler beim Laden des Navigationsbaums."
|
msgstr "Fehler beim Laden des Navigationsbaums."
|
||||||
|
|
||||||
|
|
@ -5539,7 +5546,7 @@ msgstr "Interner Serverfehler"
|
||||||
#~ msgstr "You have been logged out"
|
#~ msgstr "You have been logged out"
|
||||||
|
|
||||||
#: src/functions/auth.tsx:124
|
#: src/functions/auth.tsx:124
|
||||||
#: src/functions/auth.tsx:220
|
#: src/functions/auth.tsx:222
|
||||||
msgid "Logged Out"
|
msgid "Logged Out"
|
||||||
msgstr "Ausgeloggt"
|
msgstr "Ausgeloggt"
|
||||||
|
|
||||||
|
|
@ -5551,97 +5558,97 @@ msgstr ""
|
||||||
#~ msgid "Found an existing login - using it to log you in."
|
#~ msgid "Found an existing login - using it to log you in."
|
||||||
#~ msgstr "Found an existing login - using it to log you in."
|
#~ msgstr "Found an existing login - using it to log you in."
|
||||||
|
|
||||||
#: src/functions/auth.tsx:143
|
|
||||||
msgid "No response from server."
|
|
||||||
msgstr ""
|
|
||||||
|
|
||||||
#: src/functions/auth.tsx:143
|
#: src/functions/auth.tsx:143
|
||||||
#~ msgid "Found an existing login - welcome back!"
|
#~ msgid "Found an existing login - welcome back!"
|
||||||
#~ msgstr "Found an existing login - welcome back!"
|
#~ msgstr "Found an existing login - welcome back!"
|
||||||
|
|
||||||
#: src/functions/auth.tsx:186
|
#: src/functions/auth.tsx:145
|
||||||
|
msgid "No response from server."
|
||||||
|
msgstr ""
|
||||||
|
|
||||||
|
#: src/functions/auth.tsx:188
|
||||||
msgid "MFA Login successful"
|
msgid "MFA Login successful"
|
||||||
msgstr "MFA Anmeldung erfolgreich"
|
msgstr "MFA Anmeldung erfolgreich"
|
||||||
|
|
||||||
#: src/functions/auth.tsx:187
|
#: src/functions/auth.tsx:189
|
||||||
msgid "MFA details were automatically provided in the browser"
|
msgid "MFA details were automatically provided in the browser"
|
||||||
msgstr "MFA-Details wurden automatisch im Browser angegeben"
|
msgstr "MFA-Details wurden automatisch im Browser angegeben"
|
||||||
|
|
||||||
#: src/functions/auth.tsx:221
|
#: src/functions/auth.tsx:223
|
||||||
msgid "Successfully logged out"
|
msgid "Successfully logged out"
|
||||||
msgstr "Erfolgreich abgemeldet"
|
msgstr "Erfolgreich abgemeldet"
|
||||||
|
|
||||||
#: src/functions/auth.tsx:288
|
#: src/functions/auth.tsx:290
|
||||||
msgid "Language changed"
|
msgid "Language changed"
|
||||||
msgstr "Sprache geändert"
|
msgstr "Sprache geändert"
|
||||||
|
|
||||||
#: src/functions/auth.tsx:289
|
#: src/functions/auth.tsx:291
|
||||||
msgid "Your active language has been changed to the one set in your profile"
|
msgid "Your active language has been changed to the one set in your profile"
|
||||||
msgstr "Die aktive Sprache wurde auf die Sprache des Profils geändert"
|
msgstr "Die aktive Sprache wurde auf die Sprache des Profils geändert"
|
||||||
|
|
||||||
#: src/functions/auth.tsx:310
|
#: src/functions/auth.tsx:312
|
||||||
msgid "Theme changed"
|
msgid "Theme changed"
|
||||||
msgstr "Design geändert"
|
msgstr "Design geändert"
|
||||||
|
|
||||||
#: src/functions/auth.tsx:311
|
#: src/functions/auth.tsx:313
|
||||||
msgid "Your active theme has been changed to the one set in your profile"
|
msgid "Your active theme has been changed to the one set in your profile"
|
||||||
msgstr "Das aktive Design wurde zu dem im Profil eingestellten geändert"
|
msgstr "Das aktive Design wurde zu dem im Profil eingestellten geändert"
|
||||||
|
|
||||||
#: src/functions/auth.tsx:346
|
#: src/functions/auth.tsx:348
|
||||||
msgid "Check your inbox for a reset link. This only works if you have an account. Check in spam too."
|
msgid "Check your inbox for a reset link. This only works if you have an account. Check in spam too."
|
||||||
msgstr "Prüfen Sie Ihren Posteingang für einen Link zum Zurücksetzen. Dies funktioniert nur, wenn Sie ein Konto haben. Prüfen Sie auch den Spam-Ordner."
|
msgstr "Prüfen Sie Ihren Posteingang für einen Link zum Zurücksetzen. Dies funktioniert nur, wenn Sie ein Konto haben. Prüfen Sie auch den Spam-Ordner."
|
||||||
|
|
||||||
#: src/functions/auth.tsx:353
|
#: src/functions/auth.tsx:355
|
||||||
#: src/functions/auth.tsx:617
|
#: src/functions/auth.tsx:619
|
||||||
msgid "Reset failed"
|
msgid "Reset failed"
|
||||||
msgstr "Zurücksetzen fehlgeschlagen"
|
msgstr "Zurücksetzen fehlgeschlagen"
|
||||||
|
|
||||||
#: src/functions/auth.tsx:380
|
#: src/functions/auth.tsx:382
|
||||||
msgid "Already logged in"
|
msgid "Already logged in"
|
||||||
msgstr "Bereits angemeldet"
|
msgstr "Bereits angemeldet"
|
||||||
|
|
||||||
#: src/functions/auth.tsx:381
|
#: src/functions/auth.tsx:383
|
||||||
msgid "There is a conflicting session on the server for this browser. Please logout of that first."
|
msgid "There is a conflicting session on the server for this browser. Please logout of that first."
|
||||||
msgstr "Es gibt eine widersprüchliche Sitzung auf dem Server für diesen Browser. Bitte zuerst abmelden."
|
msgstr "Es gibt eine widersprüchliche Sitzung auf dem Server für diesen Browser. Bitte zuerst abmelden."
|
||||||
|
|
||||||
#: src/functions/auth.tsx:437
|
#: src/functions/auth.tsx:439
|
||||||
msgid "Logged In"
|
msgid "Logged In"
|
||||||
msgstr "Angemeldet"
|
msgstr "Angemeldet"
|
||||||
|
|
||||||
#: src/functions/auth.tsx:438
|
#: src/functions/auth.tsx:440
|
||||||
msgid "Successfully logged in"
|
msgid "Successfully logged in"
|
||||||
msgstr "Erfolgreich angemeldet"
|
msgstr "Erfolgreich angemeldet"
|
||||||
|
|
||||||
#: src/functions/auth.tsx:572
|
#: src/functions/auth.tsx:574
|
||||||
msgid "Failed to set up MFA"
|
msgid "Failed to set up MFA"
|
||||||
msgstr "MFA konnte nicht eingerichtet werden"
|
msgstr "MFA konnte nicht eingerichtet werden"
|
||||||
|
|
||||||
#: src/functions/auth.tsx:591
|
#: src/functions/auth.tsx:593
|
||||||
msgid "MFA Setup successful"
|
msgid "MFA Setup successful"
|
||||||
msgstr ""
|
msgstr ""
|
||||||
|
|
||||||
#: src/functions/auth.tsx:592
|
#: src/functions/auth.tsx:594
|
||||||
msgid "MFA via TOTP has been set up successfully; you will need to login again."
|
msgid "MFA via TOTP has been set up successfully; you will need to login again."
|
||||||
msgstr ""
|
msgstr ""
|
||||||
|
|
||||||
#: src/functions/auth.tsx:607
|
#: src/functions/auth.tsx:609
|
||||||
msgid "Password set"
|
msgid "Password set"
|
||||||
msgstr "Passwort festgelegt"
|
msgstr "Passwort festgelegt"
|
||||||
|
|
||||||
#: src/functions/auth.tsx:608
|
#: src/functions/auth.tsx:610
|
||||||
#: src/functions/auth.tsx:717
|
#: src/functions/auth.tsx:719
|
||||||
msgid "The password was set successfully. You can now login with your new password"
|
msgid "The password was set successfully. You can now login with your new password"
|
||||||
msgstr "Das Passwort wurde erfolgreich festgelegt. Sie können sich jetzt mit Ihrem neuen Passwort anmelden"
|
msgstr "Das Passwort wurde erfolgreich festgelegt. Sie können sich jetzt mit Ihrem neuen Passwort anmelden"
|
||||||
|
|
||||||
#: src/functions/auth.tsx:682
|
#: src/functions/auth.tsx:684
|
||||||
msgid "Password could not be changed"
|
msgid "Password could not be changed"
|
||||||
msgstr "Passwort konnte nicht geändert werden"
|
msgstr "Passwort konnte nicht geändert werden"
|
||||||
|
|
||||||
#: src/functions/auth.tsx:700
|
#: src/functions/auth.tsx:702
|
||||||
msgid "The two password fields didn’t match"
|
msgid "The two password fields didn’t match"
|
||||||
msgstr "Die beiden Passwortfelder stimmten nicht überein."
|
msgstr "Die beiden Passwortfelder stimmten nicht überein."
|
||||||
|
|
||||||
#: src/functions/auth.tsx:716
|
#: src/functions/auth.tsx:718
|
||||||
msgid "Password Changed"
|
msgid "Password Changed"
|
||||||
msgstr "Passwort geändert"
|
msgstr "Passwort geändert"
|
||||||
|
|
||||||
|
|
@ -8347,11 +8354,11 @@ msgstr "Nach Seriennummer suchen"
|
||||||
msgid "Part Actions"
|
msgid "Part Actions"
|
||||||
msgstr "Teile-Aktionen"
|
msgstr "Teile-Aktionen"
|
||||||
|
|
||||||
#: src/pages/part/PartDetail.tsx:1182
|
#: src/pages/part/PartDetail.tsx:1183
|
||||||
msgid "Part locked"
|
msgid "Part locked"
|
||||||
msgstr ""
|
msgstr ""
|
||||||
|
|
||||||
#: src/pages/part/PartDetail.tsx:1182
|
#: src/pages/part/PartDetail.tsx:1183
|
||||||
msgid "Part unlocked"
|
msgid "Part unlocked"
|
||||||
msgstr ""
|
msgstr ""
|
||||||
|
|
||||||
|
|
|
||||||
|
|
@ -8,7 +8,7 @@ msgstr ""
|
||||||
"Language: el\n"
|
"Language: el\n"
|
||||||
"Project-Id-Version: inventree\n"
|
"Project-Id-Version: inventree\n"
|
||||||
"Report-Msgid-Bugs-To: \n"
|
"Report-Msgid-Bugs-To: \n"
|
||||||
"PO-Revision-Date: 2026-06-17 22:14\n"
|
"PO-Revision-Date: 2026-06-20 13:53\n"
|
||||||
"Last-Translator: \n"
|
"Last-Translator: \n"
|
||||||
"Language-Team: Greek\n"
|
"Language-Team: Greek\n"
|
||||||
"Plural-Forms: nplurals=2; plural=(n != 1);\n"
|
"Plural-Forms: nplurals=2; plural=(n != 1);\n"
|
||||||
|
|
@ -147,7 +147,7 @@ msgstr "Όχι"
|
||||||
#: src/forms/StockForms.tsx:1248
|
#: src/forms/StockForms.tsx:1248
|
||||||
#: src/forms/TransferOrderForms.tsx:234
|
#: src/forms/TransferOrderForms.tsx:234
|
||||||
#: src/pages/build/BuildDetail.tsx:260
|
#: src/pages/build/BuildDetail.tsx:260
|
||||||
#: src/pages/part/PartDetail.tsx:1165
|
#: src/pages/part/PartDetail.tsx:1166
|
||||||
#: src/pages/part/bom/BomCompare.tsx:203
|
#: src/pages/part/bom/BomCompare.tsx:203
|
||||||
#: src/tables/ColumnRenderers.tsx:93
|
#: src/tables/ColumnRenderers.tsx:93
|
||||||
#: src/tables/build/BuildOrderParametricTable.tsx:29
|
#: src/tables/build/BuildOrderParametricTable.tsx:29
|
||||||
|
|
@ -166,7 +166,7 @@ msgstr "Προϊόν"
|
||||||
#: src/pages/part/CategoryDetail.tsx:138
|
#: src/pages/part/CategoryDetail.tsx:138
|
||||||
#: src/pages/part/CategoryDetail.tsx:285
|
#: src/pages/part/CategoryDetail.tsx:285
|
||||||
#: src/pages/part/CategoryDetail.tsx:345
|
#: src/pages/part/CategoryDetail.tsx:345
|
||||||
#: src/pages/part/CategoryDetail.tsx:387
|
#: src/pages/part/CategoryDetail.tsx:388
|
||||||
#: src/pages/part/PartDetail.tsx:893
|
#: src/pages/part/PartDetail.tsx:893
|
||||||
msgid "Parts"
|
msgid "Parts"
|
||||||
msgstr "Προϊόντα"
|
msgstr "Προϊόντα"
|
||||||
|
|
@ -242,7 +242,7 @@ msgid "Manufacturer Parts"
|
||||||
msgstr "Προϊόντα Κατασκευαστή"
|
msgstr "Προϊόντα Κατασκευαστή"
|
||||||
|
|
||||||
#: lib/enums/ModelInformation.tsx:80
|
#: lib/enums/ModelInformation.tsx:80
|
||||||
#: src/pages/part/CategoryDetail.tsx:387
|
#: src/pages/part/CategoryDetail.tsx:388
|
||||||
#: src/tables/Filter.tsx:496
|
#: src/tables/Filter.tsx:496
|
||||||
msgid "Part Category"
|
msgid "Part Category"
|
||||||
msgstr "Κατηγορία Προϊόντος"
|
msgstr "Κατηγορία Προϊόντος"
|
||||||
|
|
@ -261,7 +261,7 @@ msgstr "Κατηγορίες Προϊόντων"
|
||||||
#: src/forms/BuildForms.tsx:848
|
#: src/forms/BuildForms.tsx:848
|
||||||
#: src/forms/SalesOrderForms.tsx:438
|
#: src/forms/SalesOrderForms.tsx:438
|
||||||
#: src/forms/TransferOrderForms.tsx:236
|
#: src/forms/TransferOrderForms.tsx:236
|
||||||
#: src/pages/stock/StockDetail.tsx:1075
|
#: src/pages/stock/StockDetail.tsx:1076
|
||||||
#: src/tables/ColumnRenderers.tsx:132
|
#: src/tables/ColumnRenderers.tsx:132
|
||||||
#: src/tables/part/PartTestResultTable.tsx:256
|
#: src/tables/part/PartTestResultTable.tsx:256
|
||||||
#: src/tables/stock/InstalledItemsTable.tsx:66
|
#: src/tables/stock/InstalledItemsTable.tsx:66
|
||||||
|
|
@ -283,7 +283,7 @@ msgstr "Προϊόντα Αποθέματος"
|
||||||
|
|
||||||
#: lib/enums/ModelInformation.tsx:99
|
#: lib/enums/ModelInformation.tsx:99
|
||||||
#: lib/enums/Roles.tsx:51
|
#: lib/enums/Roles.tsx:51
|
||||||
#: src/pages/stock/LocationDetail.tsx:522
|
#: src/pages/stock/LocationDetail.tsx:523
|
||||||
msgid "Stock Location"
|
msgid "Stock Location"
|
||||||
msgstr "Τοποθεσία Αποθέματος"
|
msgstr "Τοποθεσία Αποθέματος"
|
||||||
|
|
||||||
|
|
@ -644,14 +644,14 @@ msgstr ""
|
||||||
#: src/components/importer/ImporterColumnSelector.tsx:330
|
#: src/components/importer/ImporterColumnSelector.tsx:330
|
||||||
#: src/components/importer/ImporterDrawer.tsx:91
|
#: src/components/importer/ImporterDrawer.tsx:91
|
||||||
#: src/components/modals/LicenseModal.tsx:85
|
#: src/components/modals/LicenseModal.tsx:85
|
||||||
#: src/components/nav/NavigationTree.tsx:211
|
#: src/components/nav/NavigationTree.tsx:398
|
||||||
#: src/components/nav/NotificationDrawer.tsx:235
|
#: src/components/nav/NotificationDrawer.tsx:235
|
||||||
#: src/components/nav/SearchDrawer.tsx:588
|
#: src/components/nav/SearchDrawer.tsx:588
|
||||||
#: src/components/settings/SettingList.tsx:145
|
#: src/components/settings/SettingList.tsx:145
|
||||||
#: src/components/wizards/ImportPartWizard.tsx:574
|
#: src/components/wizards/ImportPartWizard.tsx:574
|
||||||
#: src/components/wizards/ImportPartWizard.tsx:719
|
#: src/components/wizards/ImportPartWizard.tsx:719
|
||||||
#: src/forms/BomForms.tsx:83
|
#: src/forms/BomForms.tsx:83
|
||||||
#: src/functions/auth.tsx:691
|
#: src/functions/auth.tsx:693
|
||||||
#: src/pages/ErrorPage.tsx:11
|
#: src/pages/ErrorPage.tsx:11
|
||||||
#: src/pages/Index/Settings/AccountSettings/MFASettings.tsx:317
|
#: src/pages/Index/Settings/AccountSettings/MFASettings.tsx:317
|
||||||
#: src/pages/Index/Settings/AccountSettings/MFASettings.tsx:408
|
#: src/pages/Index/Settings/AccountSettings/MFASettings.tsx:408
|
||||||
|
|
@ -723,6 +723,7 @@ msgstr "Το αίτημα έληξε χρονικά"
|
||||||
|
|
||||||
#: lib/hooks/MonitorDataOutput.tsx:57
|
#: lib/hooks/MonitorDataOutput.tsx:57
|
||||||
#: lib/hooks/MonitorDataOutput.tsx:116
|
#: lib/hooks/MonitorDataOutput.tsx:116
|
||||||
|
#: src/components/editors/TemplateEditor/PdfPreview/PdfPreview.tsx:76
|
||||||
msgid "Process failed"
|
msgid "Process failed"
|
||||||
msgstr "Η διαδικασία απέτυχε"
|
msgstr "Η διαδικασία απέτυχε"
|
||||||
|
|
||||||
|
|
@ -1391,11 +1392,11 @@ msgstr "Απαιτεί Superuser"
|
||||||
msgid "This widget requires superuser permissions"
|
msgid "This widget requires superuser permissions"
|
||||||
msgstr "Αυτό το widget απαιτεί δικαιώματα superuser"
|
msgstr "Αυτό το widget απαιτεί δικαιώματα superuser"
|
||||||
|
|
||||||
#: src/components/dashboard/widgets/NewsWidget.tsx:133
|
#: src/components/dashboard/widgets/NewsWidget.tsx:135
|
||||||
msgid "No News"
|
msgid "No News"
|
||||||
msgstr "Δεν υπάρχουν νέα"
|
msgstr "Δεν υπάρχουν νέα"
|
||||||
|
|
||||||
#: src/components/dashboard/widgets/NewsWidget.tsx:134
|
#: src/components/dashboard/widgets/NewsWidget.tsx:136
|
||||||
msgid "There are no unread news items"
|
msgid "There are no unread news items"
|
||||||
msgstr "Δεν υπάρχουν μη αναγνωσμένα νέα"
|
msgstr "Δεν υπάρχουν μη αναγνωσμένα νέα"
|
||||||
|
|
||||||
|
|
@ -1655,7 +1656,7 @@ msgstr "Κωδικός"
|
||||||
msgid "Error rendering preview"
|
msgid "Error rendering preview"
|
||||||
msgstr "Σφάλμα δημιουργίας προεπισκόπησης"
|
msgstr "Σφάλμα δημιουργίας προεπισκόπησης"
|
||||||
|
|
||||||
#: src/components/editors/TemplateEditor/PdfPreview/PdfPreview.tsx:120
|
#: src/components/editors/TemplateEditor/PdfPreview/PdfPreview.tsx:124
|
||||||
msgid "Preview not available, click \"Reload Preview\"."
|
msgid "Preview not available, click \"Reload Preview\"."
|
||||||
msgstr "Η προεπισκόπηση δεν είναι διαθέσιμη, πατήστε \"Επαναφόρτωση προεπισκόπησης\"."
|
msgstr "Η προεπισκόπηση δεν είναι διαθέσιμη, πατήστε \"Επαναφόρτωση προεπισκόπησης\"."
|
||||||
|
|
||||||
|
|
@ -1728,11 +1729,11 @@ msgstr "Αποθήκευση του τρέχοντος προτύπου και
|
||||||
#~ msgid "to preview"
|
#~ msgid "to preview"
|
||||||
#~ msgstr "to preview"
|
#~ msgstr "to preview"
|
||||||
|
|
||||||
#: src/components/editors/TemplateEditor/TemplateEditor.tsx:379
|
#: src/components/editors/TemplateEditor/TemplateEditor.tsx:380
|
||||||
msgid "Select instance to preview"
|
msgid "Select instance to preview"
|
||||||
msgstr "Επιλέξτε Προϊόν για προεπισκόπηση"
|
msgstr "Επιλέξτε Προϊόν για προεπισκόπηση"
|
||||||
|
|
||||||
#: src/components/editors/TemplateEditor/TemplateEditor.tsx:423
|
#: src/components/editors/TemplateEditor/TemplateEditor.tsx:424
|
||||||
msgid "Error rendering template"
|
msgid "Error rendering template"
|
||||||
msgstr "Σφάλμα αποτύπωσης προτύπου"
|
msgstr "Σφάλμα αποτύπωσης προτύπου"
|
||||||
|
|
||||||
|
|
@ -1829,20 +1830,20 @@ msgstr "Συνδεθήκατε με επιτυχία"
|
||||||
#: src/components/forms/AuthenticationForm.tsx:81
|
#: src/components/forms/AuthenticationForm.tsx:81
|
||||||
#: src/components/forms/AuthenticationForm.tsx:89
|
#: src/components/forms/AuthenticationForm.tsx:89
|
||||||
#: src/functions/auth.tsx:133
|
#: src/functions/auth.tsx:133
|
||||||
#: src/functions/auth.tsx:142
|
#: src/functions/auth.tsx:144
|
||||||
msgid "Login failed"
|
msgid "Login failed"
|
||||||
msgstr "Αποτυχία σύνδεσης"
|
msgstr "Αποτυχία σύνδεσης"
|
||||||
|
|
||||||
#: src/components/forms/AuthenticationForm.tsx:82
|
#: src/components/forms/AuthenticationForm.tsx:82
|
||||||
#: src/components/forms/AuthenticationForm.tsx:90
|
#: src/components/forms/AuthenticationForm.tsx:90
|
||||||
#: src/components/forms/AuthenticationForm.tsx:106
|
#: src/components/forms/AuthenticationForm.tsx:106
|
||||||
#: src/functions/auth.tsx:134
|
#: src/functions/auth.tsx:136
|
||||||
#: src/functions/auth.tsx:354
|
#: src/functions/auth.tsx:356
|
||||||
msgid "Check your input and try again."
|
msgid "Check your input and try again."
|
||||||
msgstr "Ελέγξτε τα στοιχεία σας και προσπαθήστε ξανά."
|
msgstr "Ελέγξτε τα στοιχεία σας και προσπαθήστε ξανά."
|
||||||
|
|
||||||
#: src/components/forms/AuthenticationForm.tsx:100
|
#: src/components/forms/AuthenticationForm.tsx:100
|
||||||
#: src/functions/auth.tsx:345
|
#: src/functions/auth.tsx:347
|
||||||
msgid "Mail delivery successful"
|
msgid "Mail delivery successful"
|
||||||
msgstr "Το email στάλθηκε με επιτυχία"
|
msgstr "Το email στάλθηκε με επιτυχία"
|
||||||
|
|
||||||
|
|
@ -2128,6 +2129,7 @@ msgstr "Χωρίς κατηγορία"
|
||||||
|
|
||||||
#: src/components/forms/fields/IconField.tsx:211
|
#: src/components/forms/fields/IconField.tsx:211
|
||||||
#: src/components/nav/Layout.tsx:143
|
#: src/components/nav/Layout.tsx:143
|
||||||
|
#: src/components/nav/NavigationTree.tsx:378
|
||||||
#: src/tables/part/PartThumbTable.tsx:209
|
#: src/tables/part/PartThumbTable.tsx:209
|
||||||
msgid "Search..."
|
msgid "Search..."
|
||||||
msgstr "Αναζήτηση..."
|
msgstr "Αναζήτηση..."
|
||||||
|
|
@ -2153,6 +2155,7 @@ msgid "Loading"
|
||||||
msgstr "Φόρτωση"
|
msgstr "Φόρτωση"
|
||||||
|
|
||||||
#: src/components/forms/fields/RelatedModelField.tsx:540
|
#: src/components/forms/fields/RelatedModelField.tsx:540
|
||||||
|
#: src/components/nav/NavigationTree.tsx:403
|
||||||
msgid "No results found"
|
msgid "No results found"
|
||||||
msgstr "Δεν βρέθηκαν αποτελέσματα"
|
msgstr "Δεν βρέθηκαν αποτελέσματα"
|
||||||
|
|
||||||
|
|
@ -2247,7 +2250,7 @@ msgstr "Επεξεργασία δεδομένων"
|
||||||
#: src/components/importer/ImporterColumnSelector.tsx:299
|
#: src/components/importer/ImporterColumnSelector.tsx:299
|
||||||
#: src/components/items/ErrorItem.tsx:12
|
#: src/components/items/ErrorItem.tsx:12
|
||||||
#: src/functions/api.tsx:60
|
#: src/functions/api.tsx:60
|
||||||
#: src/functions/auth.tsx:401
|
#: src/functions/auth.tsx:403
|
||||||
msgid "An error occurred"
|
msgid "An error occurred"
|
||||||
msgstr "Παρουσιάστηκε σφάλμα"
|
msgstr "Παρουσιάστηκε σφάλμα"
|
||||||
|
|
||||||
|
|
@ -2925,7 +2928,7 @@ msgstr "Αποσύνδεση"
|
||||||
#: src/pages/Index/Settings/SystemSettings.tsx:260
|
#: src/pages/Index/Settings/SystemSettings.tsx:260
|
||||||
#: src/pages/part/PartDetail.tsx:663
|
#: src/pages/part/PartDetail.tsx:663
|
||||||
#: src/pages/stock/LocationDetail.tsx:481
|
#: src/pages/stock/LocationDetail.tsx:481
|
||||||
#: src/pages/stock/LocationDetail.tsx:522
|
#: src/pages/stock/LocationDetail.tsx:523
|
||||||
#: src/pages/stock/StockDetail.tsx:689
|
#: src/pages/stock/StockDetail.tsx:689
|
||||||
#: src/pages/stock/TransferOrderDetail.tsx:536
|
#: src/pages/stock/TransferOrderDetail.tsx:536
|
||||||
#: src/tables/stock/StockItemTable.tsx:81
|
#: src/tables/stock/StockItemTable.tsx:81
|
||||||
|
|
@ -2971,7 +2974,11 @@ msgstr "Πλοήγηση"
|
||||||
msgid "About"
|
msgid "About"
|
||||||
msgstr "Σχετικά"
|
msgstr "Σχετικά"
|
||||||
|
|
||||||
#: src/components/nav/NavigationTree.tsx:212
|
#: src/components/nav/NavigationTree.tsx:388
|
||||||
|
msgid "Clear search"
|
||||||
|
msgstr ""
|
||||||
|
|
||||||
|
#: src/components/nav/NavigationTree.tsx:399
|
||||||
msgid "Error loading navigation tree."
|
msgid "Error loading navigation tree."
|
||||||
msgstr "Σφάλμα φόρτωσης του δέντρου πλοήγησης."
|
msgstr "Σφάλμα φόρτωσης του δέντρου πλοήγησης."
|
||||||
|
|
||||||
|
|
@ -5539,7 +5546,7 @@ msgstr "Εσωτερικό σφάλμα διακομιστή"
|
||||||
#~ msgstr "You have been logged out"
|
#~ msgstr "You have been logged out"
|
||||||
|
|
||||||
#: src/functions/auth.tsx:124
|
#: src/functions/auth.tsx:124
|
||||||
#: src/functions/auth.tsx:220
|
#: src/functions/auth.tsx:222
|
||||||
msgid "Logged Out"
|
msgid "Logged Out"
|
||||||
msgstr "Αποσυνδεθήκατε"
|
msgstr "Αποσυνδεθήκατε"
|
||||||
|
|
||||||
|
|
@ -5551,97 +5558,97 @@ msgstr ""
|
||||||
#~ msgid "Found an existing login - using it to log you in."
|
#~ msgid "Found an existing login - using it to log you in."
|
||||||
#~ msgstr "Found an existing login - using it to log you in."
|
#~ msgstr "Found an existing login - using it to log you in."
|
||||||
|
|
||||||
#: src/functions/auth.tsx:143
|
|
||||||
msgid "No response from server."
|
|
||||||
msgstr "Δεν υπάρχει απόκριση από τον διακομιστή."
|
|
||||||
|
|
||||||
#: src/functions/auth.tsx:143
|
#: src/functions/auth.tsx:143
|
||||||
#~ msgid "Found an existing login - welcome back!"
|
#~ msgid "Found an existing login - welcome back!"
|
||||||
#~ msgstr "Found an existing login - welcome back!"
|
#~ msgstr "Found an existing login - welcome back!"
|
||||||
|
|
||||||
#: src/functions/auth.tsx:186
|
#: src/functions/auth.tsx:145
|
||||||
|
msgid "No response from server."
|
||||||
|
msgstr "Δεν υπάρχει απόκριση από τον διακομιστή."
|
||||||
|
|
||||||
|
#: src/functions/auth.tsx:188
|
||||||
msgid "MFA Login successful"
|
msgid "MFA Login successful"
|
||||||
msgstr "Επιτυχής σύνδεση με MFA"
|
msgstr "Επιτυχής σύνδεση με MFA"
|
||||||
|
|
||||||
#: src/functions/auth.tsx:187
|
#: src/functions/auth.tsx:189
|
||||||
msgid "MFA details were automatically provided in the browser"
|
msgid "MFA details were automatically provided in the browser"
|
||||||
msgstr "Οι λεπτομέρειες MFA παρέχθηκαν αυτόματα από τον browser"
|
msgstr "Οι λεπτομέρειες MFA παρέχθηκαν αυτόματα από τον browser"
|
||||||
|
|
||||||
#: src/functions/auth.tsx:221
|
#: src/functions/auth.tsx:223
|
||||||
msgid "Successfully logged out"
|
msgid "Successfully logged out"
|
||||||
msgstr "Αποσυνδεθήκατε με επιτυχία"
|
msgstr "Αποσυνδεθήκατε με επιτυχία"
|
||||||
|
|
||||||
#: src/functions/auth.tsx:288
|
#: src/functions/auth.tsx:290
|
||||||
msgid "Language changed"
|
msgid "Language changed"
|
||||||
msgstr "Η γλώσσα άλλαξε"
|
msgstr "Η γλώσσα άλλαξε"
|
||||||
|
|
||||||
#: src/functions/auth.tsx:289
|
#: src/functions/auth.tsx:291
|
||||||
msgid "Your active language has been changed to the one set in your profile"
|
msgid "Your active language has been changed to the one set in your profile"
|
||||||
msgstr "Η ενεργή γλώσσα σας άλλαξε σε αυτή που έχει οριστεί στο προφίλ σας"
|
msgstr "Η ενεργή γλώσσα σας άλλαξε σε αυτή που έχει οριστεί στο προφίλ σας"
|
||||||
|
|
||||||
#: src/functions/auth.tsx:310
|
#: src/functions/auth.tsx:312
|
||||||
msgid "Theme changed"
|
msgid "Theme changed"
|
||||||
msgstr "Το θέμα άλλαξε"
|
msgstr "Το θέμα άλλαξε"
|
||||||
|
|
||||||
#: src/functions/auth.tsx:311
|
#: src/functions/auth.tsx:313
|
||||||
msgid "Your active theme has been changed to the one set in your profile"
|
msgid "Your active theme has been changed to the one set in your profile"
|
||||||
msgstr "Το ενεργό θέμα άλλαξε σε αυτό που έχει οριστεί στο προφίλ σας"
|
msgstr "Το ενεργό θέμα άλλαξε σε αυτό που έχει οριστεί στο προφίλ σας"
|
||||||
|
|
||||||
#: src/functions/auth.tsx:346
|
#: src/functions/auth.tsx:348
|
||||||
msgid "Check your inbox for a reset link. This only works if you have an account. Check in spam too."
|
msgid "Check your inbox for a reset link. This only works if you have an account. Check in spam too."
|
||||||
msgstr "Ελέγξτε τα εισερχόμενά σας για τον σύνδεσμο επαναφοράς. Λειτουργεί μόνο αν έχετε λογαριασμό. Ελέγξτε και στα spam."
|
msgstr "Ελέγξτε τα εισερχόμενά σας για τον σύνδεσμο επαναφοράς. Λειτουργεί μόνο αν έχετε λογαριασμό. Ελέγξτε και στα spam."
|
||||||
|
|
||||||
#: src/functions/auth.tsx:353
|
#: src/functions/auth.tsx:355
|
||||||
#: src/functions/auth.tsx:617
|
#: src/functions/auth.tsx:619
|
||||||
msgid "Reset failed"
|
msgid "Reset failed"
|
||||||
msgstr "Η επαναφορά απέτυχε"
|
msgstr "Η επαναφορά απέτυχε"
|
||||||
|
|
||||||
#: src/functions/auth.tsx:380
|
#: src/functions/auth.tsx:382
|
||||||
msgid "Already logged in"
|
msgid "Already logged in"
|
||||||
msgstr "Ήδη συνδεδεμένος"
|
msgstr "Ήδη συνδεδεμένος"
|
||||||
|
|
||||||
#: src/functions/auth.tsx:381
|
#: src/functions/auth.tsx:383
|
||||||
msgid "There is a conflicting session on the server for this browser. Please logout of that first."
|
msgid "There is a conflicting session on the server for this browser. Please logout of that first."
|
||||||
msgstr "Υπάρχει αντικρουόμενη συνεδρία στον διακομιστή για αυτόν τον browser. Παρακαλώ αποσυνδεθείτε πρώτα από αυτή."
|
msgstr "Υπάρχει αντικρουόμενη συνεδρία στον διακομιστή για αυτόν τον browser. Παρακαλώ αποσυνδεθείτε πρώτα από αυτή."
|
||||||
|
|
||||||
#: src/functions/auth.tsx:437
|
#: src/functions/auth.tsx:439
|
||||||
msgid "Logged In"
|
msgid "Logged In"
|
||||||
msgstr "Συνδεθήκατε"
|
msgstr "Συνδεθήκατε"
|
||||||
|
|
||||||
#: src/functions/auth.tsx:438
|
#: src/functions/auth.tsx:440
|
||||||
msgid "Successfully logged in"
|
msgid "Successfully logged in"
|
||||||
msgstr "Συνδεθήκατε με επιτυχία"
|
msgstr "Συνδεθήκατε με επιτυχία"
|
||||||
|
|
||||||
#: src/functions/auth.tsx:572
|
#: src/functions/auth.tsx:574
|
||||||
msgid "Failed to set up MFA"
|
msgid "Failed to set up MFA"
|
||||||
msgstr "Αποτυχία ρύθμισης MFA"
|
msgstr "Αποτυχία ρύθμισης MFA"
|
||||||
|
|
||||||
#: src/functions/auth.tsx:591
|
#: src/functions/auth.tsx:593
|
||||||
msgid "MFA Setup successful"
|
msgid "MFA Setup successful"
|
||||||
msgstr ""
|
msgstr ""
|
||||||
|
|
||||||
#: src/functions/auth.tsx:592
|
#: src/functions/auth.tsx:594
|
||||||
msgid "MFA via TOTP has been set up successfully; you will need to login again."
|
msgid "MFA via TOTP has been set up successfully; you will need to login again."
|
||||||
msgstr ""
|
msgstr ""
|
||||||
|
|
||||||
#: src/functions/auth.tsx:607
|
#: src/functions/auth.tsx:609
|
||||||
msgid "Password set"
|
msgid "Password set"
|
||||||
msgstr "Ο κωδικός ορίστηκε"
|
msgstr "Ο κωδικός ορίστηκε"
|
||||||
|
|
||||||
#: src/functions/auth.tsx:608
|
#: src/functions/auth.tsx:610
|
||||||
#: src/functions/auth.tsx:717
|
#: src/functions/auth.tsx:719
|
||||||
msgid "The password was set successfully. You can now login with your new password"
|
msgid "The password was set successfully. You can now login with your new password"
|
||||||
msgstr "Ο κωδικός ορίστηκε με επιτυχία. Μπορείτε πλέον να συνδεθείτε με τον νέο σας κωδικό"
|
msgstr "Ο κωδικός ορίστηκε με επιτυχία. Μπορείτε πλέον να συνδεθείτε με τον νέο σας κωδικό"
|
||||||
|
|
||||||
#: src/functions/auth.tsx:682
|
#: src/functions/auth.tsx:684
|
||||||
msgid "Password could not be changed"
|
msgid "Password could not be changed"
|
||||||
msgstr "Ο κωδικός δεν μπόρεσε να αλλάξει"
|
msgstr "Ο κωδικός δεν μπόρεσε να αλλάξει"
|
||||||
|
|
||||||
#: src/functions/auth.tsx:700
|
#: src/functions/auth.tsx:702
|
||||||
msgid "The two password fields didn’t match"
|
msgid "The two password fields didn’t match"
|
||||||
msgstr "Οι δύο πεδία κωδικού δεν ταιριάζουν"
|
msgstr "Οι δύο πεδία κωδικού δεν ταιριάζουν"
|
||||||
|
|
||||||
#: src/functions/auth.tsx:716
|
#: src/functions/auth.tsx:718
|
||||||
msgid "Password Changed"
|
msgid "Password Changed"
|
||||||
msgstr "Ο κωδικός άλλαξε"
|
msgstr "Ο κωδικός άλλαξε"
|
||||||
|
|
||||||
|
|
@ -8347,11 +8354,11 @@ msgstr "Αναζήτηση με σειριακό αριθμό"
|
||||||
msgid "Part Actions"
|
msgid "Part Actions"
|
||||||
msgstr "Ενέργειες Προϊόντος"
|
msgstr "Ενέργειες Προϊόντος"
|
||||||
|
|
||||||
#: src/pages/part/PartDetail.tsx:1182
|
#: src/pages/part/PartDetail.tsx:1183
|
||||||
msgid "Part locked"
|
msgid "Part locked"
|
||||||
msgstr ""
|
msgstr ""
|
||||||
|
|
||||||
#: src/pages/part/PartDetail.tsx:1182
|
#: src/pages/part/PartDetail.tsx:1183
|
||||||
msgid "Part unlocked"
|
msgid "Part unlocked"
|
||||||
msgstr ""
|
msgstr ""
|
||||||
|
|
||||||
|
|
|
||||||
|
|
@ -142,7 +142,7 @@ msgstr "No"
|
||||||
#: src/forms/StockForms.tsx:1248
|
#: src/forms/StockForms.tsx:1248
|
||||||
#: src/forms/TransferOrderForms.tsx:234
|
#: src/forms/TransferOrderForms.tsx:234
|
||||||
#: src/pages/build/BuildDetail.tsx:260
|
#: src/pages/build/BuildDetail.tsx:260
|
||||||
#: src/pages/part/PartDetail.tsx:1165
|
#: src/pages/part/PartDetail.tsx:1166
|
||||||
#: src/pages/part/bom/BomCompare.tsx:203
|
#: src/pages/part/bom/BomCompare.tsx:203
|
||||||
#: src/tables/ColumnRenderers.tsx:93
|
#: src/tables/ColumnRenderers.tsx:93
|
||||||
#: src/tables/build/BuildOrderParametricTable.tsx:29
|
#: src/tables/build/BuildOrderParametricTable.tsx:29
|
||||||
|
|
@ -161,7 +161,7 @@ msgstr "Part"
|
||||||
#: src/pages/part/CategoryDetail.tsx:138
|
#: src/pages/part/CategoryDetail.tsx:138
|
||||||
#: src/pages/part/CategoryDetail.tsx:285
|
#: src/pages/part/CategoryDetail.tsx:285
|
||||||
#: src/pages/part/CategoryDetail.tsx:345
|
#: src/pages/part/CategoryDetail.tsx:345
|
||||||
#: src/pages/part/CategoryDetail.tsx:387
|
#: src/pages/part/CategoryDetail.tsx:388
|
||||||
#: src/pages/part/PartDetail.tsx:893
|
#: src/pages/part/PartDetail.tsx:893
|
||||||
msgid "Parts"
|
msgid "Parts"
|
||||||
msgstr "Parts"
|
msgstr "Parts"
|
||||||
|
|
@ -237,7 +237,7 @@ msgid "Manufacturer Parts"
|
||||||
msgstr "Manufacturer Parts"
|
msgstr "Manufacturer Parts"
|
||||||
|
|
||||||
#: lib/enums/ModelInformation.tsx:80
|
#: lib/enums/ModelInformation.tsx:80
|
||||||
#: src/pages/part/CategoryDetail.tsx:387
|
#: src/pages/part/CategoryDetail.tsx:388
|
||||||
#: src/tables/Filter.tsx:496
|
#: src/tables/Filter.tsx:496
|
||||||
msgid "Part Category"
|
msgid "Part Category"
|
||||||
msgstr "Part Category"
|
msgstr "Part Category"
|
||||||
|
|
@ -256,7 +256,7 @@ msgstr "Part Categories"
|
||||||
#: src/forms/BuildForms.tsx:848
|
#: src/forms/BuildForms.tsx:848
|
||||||
#: src/forms/SalesOrderForms.tsx:438
|
#: src/forms/SalesOrderForms.tsx:438
|
||||||
#: src/forms/TransferOrderForms.tsx:236
|
#: src/forms/TransferOrderForms.tsx:236
|
||||||
#: src/pages/stock/StockDetail.tsx:1075
|
#: src/pages/stock/StockDetail.tsx:1076
|
||||||
#: src/tables/ColumnRenderers.tsx:132
|
#: src/tables/ColumnRenderers.tsx:132
|
||||||
#: src/tables/part/PartTestResultTable.tsx:256
|
#: src/tables/part/PartTestResultTable.tsx:256
|
||||||
#: src/tables/stock/InstalledItemsTable.tsx:66
|
#: src/tables/stock/InstalledItemsTable.tsx:66
|
||||||
|
|
@ -278,7 +278,7 @@ msgstr "Stock Items"
|
||||||
|
|
||||||
#: lib/enums/ModelInformation.tsx:99
|
#: lib/enums/ModelInformation.tsx:99
|
||||||
#: lib/enums/Roles.tsx:51
|
#: lib/enums/Roles.tsx:51
|
||||||
#: src/pages/stock/LocationDetail.tsx:522
|
#: src/pages/stock/LocationDetail.tsx:523
|
||||||
msgid "Stock Location"
|
msgid "Stock Location"
|
||||||
msgstr "Stock Location"
|
msgstr "Stock Location"
|
||||||
|
|
||||||
|
|
@ -639,14 +639,14 @@ msgstr "Selection Entries"
|
||||||
#: src/components/importer/ImporterColumnSelector.tsx:330
|
#: src/components/importer/ImporterColumnSelector.tsx:330
|
||||||
#: src/components/importer/ImporterDrawer.tsx:91
|
#: src/components/importer/ImporterDrawer.tsx:91
|
||||||
#: src/components/modals/LicenseModal.tsx:85
|
#: src/components/modals/LicenseModal.tsx:85
|
||||||
#: src/components/nav/NavigationTree.tsx:211
|
#: src/components/nav/NavigationTree.tsx:398
|
||||||
#: src/components/nav/NotificationDrawer.tsx:235
|
#: src/components/nav/NotificationDrawer.tsx:235
|
||||||
#: src/components/nav/SearchDrawer.tsx:588
|
#: src/components/nav/SearchDrawer.tsx:588
|
||||||
#: src/components/settings/SettingList.tsx:145
|
#: src/components/settings/SettingList.tsx:145
|
||||||
#: src/components/wizards/ImportPartWizard.tsx:574
|
#: src/components/wizards/ImportPartWizard.tsx:574
|
||||||
#: src/components/wizards/ImportPartWizard.tsx:719
|
#: src/components/wizards/ImportPartWizard.tsx:719
|
||||||
#: src/forms/BomForms.tsx:83
|
#: src/forms/BomForms.tsx:83
|
||||||
#: src/functions/auth.tsx:691
|
#: src/functions/auth.tsx:693
|
||||||
#: src/pages/ErrorPage.tsx:11
|
#: src/pages/ErrorPage.tsx:11
|
||||||
#: src/pages/Index/Settings/AccountSettings/MFASettings.tsx:317
|
#: src/pages/Index/Settings/AccountSettings/MFASettings.tsx:317
|
||||||
#: src/pages/Index/Settings/AccountSettings/MFASettings.tsx:408
|
#: src/pages/Index/Settings/AccountSettings/MFASettings.tsx:408
|
||||||
|
|
@ -718,6 +718,7 @@ msgstr "The request timed out"
|
||||||
|
|
||||||
#: lib/hooks/MonitorDataOutput.tsx:57
|
#: lib/hooks/MonitorDataOutput.tsx:57
|
||||||
#: lib/hooks/MonitorDataOutput.tsx:116
|
#: lib/hooks/MonitorDataOutput.tsx:116
|
||||||
|
#: src/components/editors/TemplateEditor/PdfPreview/PdfPreview.tsx:76
|
||||||
msgid "Process failed"
|
msgid "Process failed"
|
||||||
msgstr "Process failed"
|
msgstr "Process failed"
|
||||||
|
|
||||||
|
|
@ -1386,11 +1387,11 @@ msgstr "Requires Superuser"
|
||||||
msgid "This widget requires superuser permissions"
|
msgid "This widget requires superuser permissions"
|
||||||
msgstr "This widget requires superuser permissions"
|
msgstr "This widget requires superuser permissions"
|
||||||
|
|
||||||
#: src/components/dashboard/widgets/NewsWidget.tsx:133
|
#: src/components/dashboard/widgets/NewsWidget.tsx:135
|
||||||
msgid "No News"
|
msgid "No News"
|
||||||
msgstr "No News"
|
msgstr "No News"
|
||||||
|
|
||||||
#: src/components/dashboard/widgets/NewsWidget.tsx:134
|
#: src/components/dashboard/widgets/NewsWidget.tsx:136
|
||||||
msgid "There are no unread news items"
|
msgid "There are no unread news items"
|
||||||
msgstr "There are no unread news items"
|
msgstr "There are no unread news items"
|
||||||
|
|
||||||
|
|
@ -1650,7 +1651,7 @@ msgstr "Code"
|
||||||
msgid "Error rendering preview"
|
msgid "Error rendering preview"
|
||||||
msgstr "Error rendering preview"
|
msgstr "Error rendering preview"
|
||||||
|
|
||||||
#: src/components/editors/TemplateEditor/PdfPreview/PdfPreview.tsx:120
|
#: src/components/editors/TemplateEditor/PdfPreview/PdfPreview.tsx:124
|
||||||
msgid "Preview not available, click \"Reload Preview\"."
|
msgid "Preview not available, click \"Reload Preview\"."
|
||||||
msgstr "Preview not available, click \"Reload Preview\"."
|
msgstr "Preview not available, click \"Reload Preview\"."
|
||||||
|
|
||||||
|
|
@ -1723,11 +1724,11 @@ msgstr "Save the current template and reload the preview"
|
||||||
#~ msgid "to preview"
|
#~ msgid "to preview"
|
||||||
#~ msgstr "to preview"
|
#~ msgstr "to preview"
|
||||||
|
|
||||||
#: src/components/editors/TemplateEditor/TemplateEditor.tsx:379
|
#: src/components/editors/TemplateEditor/TemplateEditor.tsx:380
|
||||||
msgid "Select instance to preview"
|
msgid "Select instance to preview"
|
||||||
msgstr "Select instance to preview"
|
msgstr "Select instance to preview"
|
||||||
|
|
||||||
#: src/components/editors/TemplateEditor/TemplateEditor.tsx:423
|
#: src/components/editors/TemplateEditor/TemplateEditor.tsx:424
|
||||||
msgid "Error rendering template"
|
msgid "Error rendering template"
|
||||||
msgstr "Error rendering template"
|
msgstr "Error rendering template"
|
||||||
|
|
||||||
|
|
@ -1824,20 +1825,20 @@ msgstr "Logged in successfully"
|
||||||
#: src/components/forms/AuthenticationForm.tsx:81
|
#: src/components/forms/AuthenticationForm.tsx:81
|
||||||
#: src/components/forms/AuthenticationForm.tsx:89
|
#: src/components/forms/AuthenticationForm.tsx:89
|
||||||
#: src/functions/auth.tsx:133
|
#: src/functions/auth.tsx:133
|
||||||
#: src/functions/auth.tsx:142
|
#: src/functions/auth.tsx:144
|
||||||
msgid "Login failed"
|
msgid "Login failed"
|
||||||
msgstr "Login failed"
|
msgstr "Login failed"
|
||||||
|
|
||||||
#: src/components/forms/AuthenticationForm.tsx:82
|
#: src/components/forms/AuthenticationForm.tsx:82
|
||||||
#: src/components/forms/AuthenticationForm.tsx:90
|
#: src/components/forms/AuthenticationForm.tsx:90
|
||||||
#: src/components/forms/AuthenticationForm.tsx:106
|
#: src/components/forms/AuthenticationForm.tsx:106
|
||||||
#: src/functions/auth.tsx:134
|
#: src/functions/auth.tsx:136
|
||||||
#: src/functions/auth.tsx:354
|
#: src/functions/auth.tsx:356
|
||||||
msgid "Check your input and try again."
|
msgid "Check your input and try again."
|
||||||
msgstr "Check your input and try again."
|
msgstr "Check your input and try again."
|
||||||
|
|
||||||
#: src/components/forms/AuthenticationForm.tsx:100
|
#: src/components/forms/AuthenticationForm.tsx:100
|
||||||
#: src/functions/auth.tsx:345
|
#: src/functions/auth.tsx:347
|
||||||
msgid "Mail delivery successful"
|
msgid "Mail delivery successful"
|
||||||
msgstr "Mail delivery successful"
|
msgstr "Mail delivery successful"
|
||||||
|
|
||||||
|
|
@ -2123,6 +2124,7 @@ msgstr "Uncategorized"
|
||||||
|
|
||||||
#: src/components/forms/fields/IconField.tsx:211
|
#: src/components/forms/fields/IconField.tsx:211
|
||||||
#: src/components/nav/Layout.tsx:143
|
#: src/components/nav/Layout.tsx:143
|
||||||
|
#: src/components/nav/NavigationTree.tsx:378
|
||||||
#: src/tables/part/PartThumbTable.tsx:209
|
#: src/tables/part/PartThumbTable.tsx:209
|
||||||
msgid "Search..."
|
msgid "Search..."
|
||||||
msgstr "Search..."
|
msgstr "Search..."
|
||||||
|
|
@ -2148,6 +2150,7 @@ msgid "Loading"
|
||||||
msgstr "Loading"
|
msgstr "Loading"
|
||||||
|
|
||||||
#: src/components/forms/fields/RelatedModelField.tsx:540
|
#: src/components/forms/fields/RelatedModelField.tsx:540
|
||||||
|
#: src/components/nav/NavigationTree.tsx:403
|
||||||
msgid "No results found"
|
msgid "No results found"
|
||||||
msgstr "No results found"
|
msgstr "No results found"
|
||||||
|
|
||||||
|
|
@ -2242,7 +2245,7 @@ msgstr "Processing Data"
|
||||||
#: src/components/importer/ImporterColumnSelector.tsx:299
|
#: src/components/importer/ImporterColumnSelector.tsx:299
|
||||||
#: src/components/items/ErrorItem.tsx:12
|
#: src/components/items/ErrorItem.tsx:12
|
||||||
#: src/functions/api.tsx:60
|
#: src/functions/api.tsx:60
|
||||||
#: src/functions/auth.tsx:401
|
#: src/functions/auth.tsx:403
|
||||||
msgid "An error occurred"
|
msgid "An error occurred"
|
||||||
msgstr "An error occurred"
|
msgstr "An error occurred"
|
||||||
|
|
||||||
|
|
@ -2920,7 +2923,7 @@ msgstr "Logout"
|
||||||
#: src/pages/Index/Settings/SystemSettings.tsx:260
|
#: src/pages/Index/Settings/SystemSettings.tsx:260
|
||||||
#: src/pages/part/PartDetail.tsx:663
|
#: src/pages/part/PartDetail.tsx:663
|
||||||
#: src/pages/stock/LocationDetail.tsx:481
|
#: src/pages/stock/LocationDetail.tsx:481
|
||||||
#: src/pages/stock/LocationDetail.tsx:522
|
#: src/pages/stock/LocationDetail.tsx:523
|
||||||
#: src/pages/stock/StockDetail.tsx:689
|
#: src/pages/stock/StockDetail.tsx:689
|
||||||
#: src/pages/stock/TransferOrderDetail.tsx:536
|
#: src/pages/stock/TransferOrderDetail.tsx:536
|
||||||
#: src/tables/stock/StockItemTable.tsx:81
|
#: src/tables/stock/StockItemTable.tsx:81
|
||||||
|
|
@ -2966,7 +2969,11 @@ msgstr "Navigation"
|
||||||
msgid "About"
|
msgid "About"
|
||||||
msgstr "About"
|
msgstr "About"
|
||||||
|
|
||||||
#: src/components/nav/NavigationTree.tsx:212
|
#: src/components/nav/NavigationTree.tsx:388
|
||||||
|
msgid "Clear search"
|
||||||
|
msgstr "Clear search"
|
||||||
|
|
||||||
|
#: src/components/nav/NavigationTree.tsx:399
|
||||||
msgid "Error loading navigation tree."
|
msgid "Error loading navigation tree."
|
||||||
msgstr "Error loading navigation tree."
|
msgstr "Error loading navigation tree."
|
||||||
|
|
||||||
|
|
@ -5534,7 +5541,7 @@ msgstr "Internal server error"
|
||||||
#~ msgstr "You have been logged out"
|
#~ msgstr "You have been logged out"
|
||||||
|
|
||||||
#: src/functions/auth.tsx:124
|
#: src/functions/auth.tsx:124
|
||||||
#: src/functions/auth.tsx:220
|
#: src/functions/auth.tsx:222
|
||||||
msgid "Logged Out"
|
msgid "Logged Out"
|
||||||
msgstr "Logged Out"
|
msgstr "Logged Out"
|
||||||
|
|
||||||
|
|
@ -5546,97 +5553,97 @@ msgstr "There was a conflicting session for this browser, which has been logged
|
||||||
#~ msgid "Found an existing login - using it to log you in."
|
#~ msgid "Found an existing login - using it to log you in."
|
||||||
#~ msgstr "Found an existing login - using it to log you in."
|
#~ msgstr "Found an existing login - using it to log you in."
|
||||||
|
|
||||||
#: src/functions/auth.tsx:143
|
|
||||||
msgid "No response from server."
|
|
||||||
msgstr "No response from server."
|
|
||||||
|
|
||||||
#: src/functions/auth.tsx:143
|
#: src/functions/auth.tsx:143
|
||||||
#~ msgid "Found an existing login - welcome back!"
|
#~ msgid "Found an existing login - welcome back!"
|
||||||
#~ msgstr "Found an existing login - welcome back!"
|
#~ msgstr "Found an existing login - welcome back!"
|
||||||
|
|
||||||
#: src/functions/auth.tsx:186
|
#: src/functions/auth.tsx:145
|
||||||
|
msgid "No response from server."
|
||||||
|
msgstr "No response from server."
|
||||||
|
|
||||||
|
#: src/functions/auth.tsx:188
|
||||||
msgid "MFA Login successful"
|
msgid "MFA Login successful"
|
||||||
msgstr "MFA Login successful"
|
msgstr "MFA Login successful"
|
||||||
|
|
||||||
#: src/functions/auth.tsx:187
|
#: src/functions/auth.tsx:189
|
||||||
msgid "MFA details were automatically provided in the browser"
|
msgid "MFA details were automatically provided in the browser"
|
||||||
msgstr "MFA details were automatically provided in the browser"
|
msgstr "MFA details were automatically provided in the browser"
|
||||||
|
|
||||||
#: src/functions/auth.tsx:221
|
#: src/functions/auth.tsx:223
|
||||||
msgid "Successfully logged out"
|
msgid "Successfully logged out"
|
||||||
msgstr "Successfully logged out"
|
msgstr "Successfully logged out"
|
||||||
|
|
||||||
#: src/functions/auth.tsx:288
|
#: src/functions/auth.tsx:290
|
||||||
msgid "Language changed"
|
msgid "Language changed"
|
||||||
msgstr "Language changed"
|
msgstr "Language changed"
|
||||||
|
|
||||||
#: src/functions/auth.tsx:289
|
#: src/functions/auth.tsx:291
|
||||||
msgid "Your active language has been changed to the one set in your profile"
|
msgid "Your active language has been changed to the one set in your profile"
|
||||||
msgstr "Your active language has been changed to the one set in your profile"
|
msgstr "Your active language has been changed to the one set in your profile"
|
||||||
|
|
||||||
#: src/functions/auth.tsx:310
|
#: src/functions/auth.tsx:312
|
||||||
msgid "Theme changed"
|
msgid "Theme changed"
|
||||||
msgstr "Theme changed"
|
msgstr "Theme changed"
|
||||||
|
|
||||||
#: src/functions/auth.tsx:311
|
#: src/functions/auth.tsx:313
|
||||||
msgid "Your active theme has been changed to the one set in your profile"
|
msgid "Your active theme has been changed to the one set in your profile"
|
||||||
msgstr "Your active theme has been changed to the one set in your profile"
|
msgstr "Your active theme has been changed to the one set in your profile"
|
||||||
|
|
||||||
#: src/functions/auth.tsx:346
|
#: src/functions/auth.tsx:348
|
||||||
msgid "Check your inbox for a reset link. This only works if you have an account. Check in spam too."
|
msgid "Check your inbox for a reset link. This only works if you have an account. Check in spam too."
|
||||||
msgstr "Check your inbox for a reset link. This only works if you have an account. Check in spam too."
|
msgstr "Check your inbox for a reset link. This only works if you have an account. Check in spam too."
|
||||||
|
|
||||||
#: src/functions/auth.tsx:353
|
#: src/functions/auth.tsx:355
|
||||||
#: src/functions/auth.tsx:617
|
#: src/functions/auth.tsx:619
|
||||||
msgid "Reset failed"
|
msgid "Reset failed"
|
||||||
msgstr "Reset failed"
|
msgstr "Reset failed"
|
||||||
|
|
||||||
#: src/functions/auth.tsx:380
|
#: src/functions/auth.tsx:382
|
||||||
msgid "Already logged in"
|
msgid "Already logged in"
|
||||||
msgstr "Already logged in"
|
msgstr "Already logged in"
|
||||||
|
|
||||||
#: src/functions/auth.tsx:381
|
#: src/functions/auth.tsx:383
|
||||||
msgid "There is a conflicting session on the server for this browser. Please logout of that first."
|
msgid "There is a conflicting session on the server for this browser. Please logout of that first."
|
||||||
msgstr "There is a conflicting session on the server for this browser. Please logout of that first."
|
msgstr "There is a conflicting session on the server for this browser. Please logout of that first."
|
||||||
|
|
||||||
#: src/functions/auth.tsx:437
|
#: src/functions/auth.tsx:439
|
||||||
msgid "Logged In"
|
msgid "Logged In"
|
||||||
msgstr "Logged In"
|
msgstr "Logged In"
|
||||||
|
|
||||||
#: src/functions/auth.tsx:438
|
#: src/functions/auth.tsx:440
|
||||||
msgid "Successfully logged in"
|
msgid "Successfully logged in"
|
||||||
msgstr "Successfully logged in"
|
msgstr "Successfully logged in"
|
||||||
|
|
||||||
#: src/functions/auth.tsx:572
|
#: src/functions/auth.tsx:574
|
||||||
msgid "Failed to set up MFA"
|
msgid "Failed to set up MFA"
|
||||||
msgstr "Failed to set up MFA"
|
msgstr "Failed to set up MFA"
|
||||||
|
|
||||||
#: src/functions/auth.tsx:591
|
#: src/functions/auth.tsx:593
|
||||||
msgid "MFA Setup successful"
|
msgid "MFA Setup successful"
|
||||||
msgstr "MFA Setup successful"
|
msgstr "MFA Setup successful"
|
||||||
|
|
||||||
#: src/functions/auth.tsx:592
|
#: src/functions/auth.tsx:594
|
||||||
msgid "MFA via TOTP has been set up successfully; you will need to login again."
|
msgid "MFA via TOTP has been set up successfully; you will need to login again."
|
||||||
msgstr "MFA via TOTP has been set up successfully; you will need to login again."
|
msgstr "MFA via TOTP has been set up successfully; you will need to login again."
|
||||||
|
|
||||||
#: src/functions/auth.tsx:607
|
#: src/functions/auth.tsx:609
|
||||||
msgid "Password set"
|
msgid "Password set"
|
||||||
msgstr "Password set"
|
msgstr "Password set"
|
||||||
|
|
||||||
#: src/functions/auth.tsx:608
|
#: src/functions/auth.tsx:610
|
||||||
#: src/functions/auth.tsx:717
|
#: src/functions/auth.tsx:719
|
||||||
msgid "The password was set successfully. You can now login with your new password"
|
msgid "The password was set successfully. You can now login with your new password"
|
||||||
msgstr "The password was set successfully. You can now login with your new password"
|
msgstr "The password was set successfully. You can now login with your new password"
|
||||||
|
|
||||||
#: src/functions/auth.tsx:682
|
#: src/functions/auth.tsx:684
|
||||||
msgid "Password could not be changed"
|
msgid "Password could not be changed"
|
||||||
msgstr "Password could not be changed"
|
msgstr "Password could not be changed"
|
||||||
|
|
||||||
#: src/functions/auth.tsx:700
|
#: src/functions/auth.tsx:702
|
||||||
msgid "The two password fields didn’t match"
|
msgid "The two password fields didn’t match"
|
||||||
msgstr "The two password fields didn’t match"
|
msgstr "The two password fields didn’t match"
|
||||||
|
|
||||||
#: src/functions/auth.tsx:716
|
#: src/functions/auth.tsx:718
|
||||||
msgid "Password Changed"
|
msgid "Password Changed"
|
||||||
msgstr "Password Changed"
|
msgstr "Password Changed"
|
||||||
|
|
||||||
|
|
@ -8342,11 +8349,11 @@ msgstr "Search by serial number"
|
||||||
msgid "Part Actions"
|
msgid "Part Actions"
|
||||||
msgstr "Part Actions"
|
msgstr "Part Actions"
|
||||||
|
|
||||||
#: src/pages/part/PartDetail.tsx:1182
|
#: src/pages/part/PartDetail.tsx:1183
|
||||||
msgid "Part locked"
|
msgid "Part locked"
|
||||||
msgstr "Part locked"
|
msgstr "Part locked"
|
||||||
|
|
||||||
#: src/pages/part/PartDetail.tsx:1182
|
#: src/pages/part/PartDetail.tsx:1183
|
||||||
msgid "Part unlocked"
|
msgid "Part unlocked"
|
||||||
msgstr "Part unlocked"
|
msgstr "Part unlocked"
|
||||||
|
|
||||||
|
|
|
||||||
|
|
@ -8,7 +8,7 @@ msgstr ""
|
||||||
"Language: es\n"
|
"Language: es\n"
|
||||||
"Project-Id-Version: inventree\n"
|
"Project-Id-Version: inventree\n"
|
||||||
"Report-Msgid-Bugs-To: \n"
|
"Report-Msgid-Bugs-To: \n"
|
||||||
"PO-Revision-Date: 2026-06-17 22:14\n"
|
"PO-Revision-Date: 2026-06-20 13:53\n"
|
||||||
"Last-Translator: \n"
|
"Last-Translator: \n"
|
||||||
"Language-Team: Spanish\n"
|
"Language-Team: Spanish\n"
|
||||||
"Plural-Forms: nplurals=2; plural=(n != 1);\n"
|
"Plural-Forms: nplurals=2; plural=(n != 1);\n"
|
||||||
|
|
@ -147,7 +147,7 @@ msgstr "No"
|
||||||
#: src/forms/StockForms.tsx:1248
|
#: src/forms/StockForms.tsx:1248
|
||||||
#: src/forms/TransferOrderForms.tsx:234
|
#: src/forms/TransferOrderForms.tsx:234
|
||||||
#: src/pages/build/BuildDetail.tsx:260
|
#: src/pages/build/BuildDetail.tsx:260
|
||||||
#: src/pages/part/PartDetail.tsx:1165
|
#: src/pages/part/PartDetail.tsx:1166
|
||||||
#: src/pages/part/bom/BomCompare.tsx:203
|
#: src/pages/part/bom/BomCompare.tsx:203
|
||||||
#: src/tables/ColumnRenderers.tsx:93
|
#: src/tables/ColumnRenderers.tsx:93
|
||||||
#: src/tables/build/BuildOrderParametricTable.tsx:29
|
#: src/tables/build/BuildOrderParametricTable.tsx:29
|
||||||
|
|
@ -166,7 +166,7 @@ msgstr "Pieza"
|
||||||
#: src/pages/part/CategoryDetail.tsx:138
|
#: src/pages/part/CategoryDetail.tsx:138
|
||||||
#: src/pages/part/CategoryDetail.tsx:285
|
#: src/pages/part/CategoryDetail.tsx:285
|
||||||
#: src/pages/part/CategoryDetail.tsx:345
|
#: src/pages/part/CategoryDetail.tsx:345
|
||||||
#: src/pages/part/CategoryDetail.tsx:387
|
#: src/pages/part/CategoryDetail.tsx:388
|
||||||
#: src/pages/part/PartDetail.tsx:893
|
#: src/pages/part/PartDetail.tsx:893
|
||||||
msgid "Parts"
|
msgid "Parts"
|
||||||
msgstr "Piezas"
|
msgstr "Piezas"
|
||||||
|
|
@ -242,7 +242,7 @@ msgid "Manufacturer Parts"
|
||||||
msgstr "Piezas del fabricante"
|
msgstr "Piezas del fabricante"
|
||||||
|
|
||||||
#: lib/enums/ModelInformation.tsx:80
|
#: lib/enums/ModelInformation.tsx:80
|
||||||
#: src/pages/part/CategoryDetail.tsx:387
|
#: src/pages/part/CategoryDetail.tsx:388
|
||||||
#: src/tables/Filter.tsx:496
|
#: src/tables/Filter.tsx:496
|
||||||
msgid "Part Category"
|
msgid "Part Category"
|
||||||
msgstr "Categoría de Pieza"
|
msgstr "Categoría de Pieza"
|
||||||
|
|
@ -261,7 +261,7 @@ msgstr "Categorías de Pieza"
|
||||||
#: src/forms/BuildForms.tsx:848
|
#: src/forms/BuildForms.tsx:848
|
||||||
#: src/forms/SalesOrderForms.tsx:438
|
#: src/forms/SalesOrderForms.tsx:438
|
||||||
#: src/forms/TransferOrderForms.tsx:236
|
#: src/forms/TransferOrderForms.tsx:236
|
||||||
#: src/pages/stock/StockDetail.tsx:1075
|
#: src/pages/stock/StockDetail.tsx:1076
|
||||||
#: src/tables/ColumnRenderers.tsx:132
|
#: src/tables/ColumnRenderers.tsx:132
|
||||||
#: src/tables/part/PartTestResultTable.tsx:256
|
#: src/tables/part/PartTestResultTable.tsx:256
|
||||||
#: src/tables/stock/InstalledItemsTable.tsx:66
|
#: src/tables/stock/InstalledItemsTable.tsx:66
|
||||||
|
|
@ -283,7 +283,7 @@ msgstr "Artículos de Stock"
|
||||||
|
|
||||||
#: lib/enums/ModelInformation.tsx:99
|
#: lib/enums/ModelInformation.tsx:99
|
||||||
#: lib/enums/Roles.tsx:51
|
#: lib/enums/Roles.tsx:51
|
||||||
#: src/pages/stock/LocationDetail.tsx:522
|
#: src/pages/stock/LocationDetail.tsx:523
|
||||||
msgid "Stock Location"
|
msgid "Stock Location"
|
||||||
msgstr "Ubicación de existencias"
|
msgstr "Ubicación de existencias"
|
||||||
|
|
||||||
|
|
@ -644,14 +644,14 @@ msgstr ""
|
||||||
#: src/components/importer/ImporterColumnSelector.tsx:330
|
#: src/components/importer/ImporterColumnSelector.tsx:330
|
||||||
#: src/components/importer/ImporterDrawer.tsx:91
|
#: src/components/importer/ImporterDrawer.tsx:91
|
||||||
#: src/components/modals/LicenseModal.tsx:85
|
#: src/components/modals/LicenseModal.tsx:85
|
||||||
#: src/components/nav/NavigationTree.tsx:211
|
#: src/components/nav/NavigationTree.tsx:398
|
||||||
#: src/components/nav/NotificationDrawer.tsx:235
|
#: src/components/nav/NotificationDrawer.tsx:235
|
||||||
#: src/components/nav/SearchDrawer.tsx:588
|
#: src/components/nav/SearchDrawer.tsx:588
|
||||||
#: src/components/settings/SettingList.tsx:145
|
#: src/components/settings/SettingList.tsx:145
|
||||||
#: src/components/wizards/ImportPartWizard.tsx:574
|
#: src/components/wizards/ImportPartWizard.tsx:574
|
||||||
#: src/components/wizards/ImportPartWizard.tsx:719
|
#: src/components/wizards/ImportPartWizard.tsx:719
|
||||||
#: src/forms/BomForms.tsx:83
|
#: src/forms/BomForms.tsx:83
|
||||||
#: src/functions/auth.tsx:691
|
#: src/functions/auth.tsx:693
|
||||||
#: src/pages/ErrorPage.tsx:11
|
#: src/pages/ErrorPage.tsx:11
|
||||||
#: src/pages/Index/Settings/AccountSettings/MFASettings.tsx:317
|
#: src/pages/Index/Settings/AccountSettings/MFASettings.tsx:317
|
||||||
#: src/pages/Index/Settings/AccountSettings/MFASettings.tsx:408
|
#: src/pages/Index/Settings/AccountSettings/MFASettings.tsx:408
|
||||||
|
|
@ -723,6 +723,7 @@ msgstr "La solicitud ha expirado"
|
||||||
|
|
||||||
#: lib/hooks/MonitorDataOutput.tsx:57
|
#: lib/hooks/MonitorDataOutput.tsx:57
|
||||||
#: lib/hooks/MonitorDataOutput.tsx:116
|
#: lib/hooks/MonitorDataOutput.tsx:116
|
||||||
|
#: src/components/editors/TemplateEditor/PdfPreview/PdfPreview.tsx:76
|
||||||
msgid "Process failed"
|
msgid "Process failed"
|
||||||
msgstr ""
|
msgstr ""
|
||||||
|
|
||||||
|
|
@ -1391,11 +1392,11 @@ msgstr "Requiere Superusuario"
|
||||||
msgid "This widget requires superuser permissions"
|
msgid "This widget requires superuser permissions"
|
||||||
msgstr "Este widget requiere permisos de superusuario"
|
msgstr "Este widget requiere permisos de superusuario"
|
||||||
|
|
||||||
#: src/components/dashboard/widgets/NewsWidget.tsx:133
|
#: src/components/dashboard/widgets/NewsWidget.tsx:135
|
||||||
msgid "No News"
|
msgid "No News"
|
||||||
msgstr "Sin noticias"
|
msgstr "Sin noticias"
|
||||||
|
|
||||||
#: src/components/dashboard/widgets/NewsWidget.tsx:134
|
#: src/components/dashboard/widgets/NewsWidget.tsx:136
|
||||||
msgid "There are no unread news items"
|
msgid "There are no unread news items"
|
||||||
msgstr "No hay noticias sin leer"
|
msgstr "No hay noticias sin leer"
|
||||||
|
|
||||||
|
|
@ -1655,7 +1656,7 @@ msgstr "Código"
|
||||||
msgid "Error rendering preview"
|
msgid "Error rendering preview"
|
||||||
msgstr ""
|
msgstr ""
|
||||||
|
|
||||||
#: src/components/editors/TemplateEditor/PdfPreview/PdfPreview.tsx:120
|
#: src/components/editors/TemplateEditor/PdfPreview/PdfPreview.tsx:124
|
||||||
msgid "Preview not available, click \"Reload Preview\"."
|
msgid "Preview not available, click \"Reload Preview\"."
|
||||||
msgstr "Vista previa no disponible, haga clic en \"Recargar vista previa\"."
|
msgstr "Vista previa no disponible, haga clic en \"Recargar vista previa\"."
|
||||||
|
|
||||||
|
|
@ -1728,11 +1729,11 @@ msgstr "Guardar la plantilla actual y recargar la vista previa"
|
||||||
#~ msgid "to preview"
|
#~ msgid "to preview"
|
||||||
#~ msgstr "to preview"
|
#~ msgstr "to preview"
|
||||||
|
|
||||||
#: src/components/editors/TemplateEditor/TemplateEditor.tsx:379
|
#: src/components/editors/TemplateEditor/TemplateEditor.tsx:380
|
||||||
msgid "Select instance to preview"
|
msgid "Select instance to preview"
|
||||||
msgstr "Seleccione la instancia a previsualizar"
|
msgstr "Seleccione la instancia a previsualizar"
|
||||||
|
|
||||||
#: src/components/editors/TemplateEditor/TemplateEditor.tsx:423
|
#: src/components/editors/TemplateEditor/TemplateEditor.tsx:424
|
||||||
msgid "Error rendering template"
|
msgid "Error rendering template"
|
||||||
msgstr "Error al renderizar plantilla"
|
msgstr "Error al renderizar plantilla"
|
||||||
|
|
||||||
|
|
@ -1829,20 +1830,20 @@ msgstr "Se ha iniciado sesión con éxito"
|
||||||
#: src/components/forms/AuthenticationForm.tsx:81
|
#: src/components/forms/AuthenticationForm.tsx:81
|
||||||
#: src/components/forms/AuthenticationForm.tsx:89
|
#: src/components/forms/AuthenticationForm.tsx:89
|
||||||
#: src/functions/auth.tsx:133
|
#: src/functions/auth.tsx:133
|
||||||
#: src/functions/auth.tsx:142
|
#: src/functions/auth.tsx:144
|
||||||
msgid "Login failed"
|
msgid "Login failed"
|
||||||
msgstr "Error al iniciar sesión"
|
msgstr "Error al iniciar sesión"
|
||||||
|
|
||||||
#: src/components/forms/AuthenticationForm.tsx:82
|
#: src/components/forms/AuthenticationForm.tsx:82
|
||||||
#: src/components/forms/AuthenticationForm.tsx:90
|
#: src/components/forms/AuthenticationForm.tsx:90
|
||||||
#: src/components/forms/AuthenticationForm.tsx:106
|
#: src/components/forms/AuthenticationForm.tsx:106
|
||||||
#: src/functions/auth.tsx:134
|
#: src/functions/auth.tsx:136
|
||||||
#: src/functions/auth.tsx:354
|
#: src/functions/auth.tsx:356
|
||||||
msgid "Check your input and try again."
|
msgid "Check your input and try again."
|
||||||
msgstr "Verifique su entrada e intente nuevamente."
|
msgstr "Verifique su entrada e intente nuevamente."
|
||||||
|
|
||||||
#: src/components/forms/AuthenticationForm.tsx:100
|
#: src/components/forms/AuthenticationForm.tsx:100
|
||||||
#: src/functions/auth.tsx:345
|
#: src/functions/auth.tsx:347
|
||||||
msgid "Mail delivery successful"
|
msgid "Mail delivery successful"
|
||||||
msgstr "Envío de correo exitoso"
|
msgstr "Envío de correo exitoso"
|
||||||
|
|
||||||
|
|
@ -2128,6 +2129,7 @@ msgstr "No clasificado"
|
||||||
|
|
||||||
#: src/components/forms/fields/IconField.tsx:211
|
#: src/components/forms/fields/IconField.tsx:211
|
||||||
#: src/components/nav/Layout.tsx:143
|
#: src/components/nav/Layout.tsx:143
|
||||||
|
#: src/components/nav/NavigationTree.tsx:378
|
||||||
#: src/tables/part/PartThumbTable.tsx:209
|
#: src/tables/part/PartThumbTable.tsx:209
|
||||||
msgid "Search..."
|
msgid "Search..."
|
||||||
msgstr "Búsqueda..."
|
msgstr "Búsqueda..."
|
||||||
|
|
@ -2153,6 +2155,7 @@ msgid "Loading"
|
||||||
msgstr "Cargando"
|
msgstr "Cargando"
|
||||||
|
|
||||||
#: src/components/forms/fields/RelatedModelField.tsx:540
|
#: src/components/forms/fields/RelatedModelField.tsx:540
|
||||||
|
#: src/components/nav/NavigationTree.tsx:403
|
||||||
msgid "No results found"
|
msgid "No results found"
|
||||||
msgstr "No hay resultados"
|
msgstr "No hay resultados"
|
||||||
|
|
||||||
|
|
@ -2247,7 +2250,7 @@ msgstr "Procesando datos"
|
||||||
#: src/components/importer/ImporterColumnSelector.tsx:299
|
#: src/components/importer/ImporterColumnSelector.tsx:299
|
||||||
#: src/components/items/ErrorItem.tsx:12
|
#: src/components/items/ErrorItem.tsx:12
|
||||||
#: src/functions/api.tsx:60
|
#: src/functions/api.tsx:60
|
||||||
#: src/functions/auth.tsx:401
|
#: src/functions/auth.tsx:403
|
||||||
msgid "An error occurred"
|
msgid "An error occurred"
|
||||||
msgstr "Se ha producido un error"
|
msgstr "Se ha producido un error"
|
||||||
|
|
||||||
|
|
@ -2925,7 +2928,7 @@ msgstr "Cerrar sesión"
|
||||||
#: src/pages/Index/Settings/SystemSettings.tsx:260
|
#: src/pages/Index/Settings/SystemSettings.tsx:260
|
||||||
#: src/pages/part/PartDetail.tsx:663
|
#: src/pages/part/PartDetail.tsx:663
|
||||||
#: src/pages/stock/LocationDetail.tsx:481
|
#: src/pages/stock/LocationDetail.tsx:481
|
||||||
#: src/pages/stock/LocationDetail.tsx:522
|
#: src/pages/stock/LocationDetail.tsx:523
|
||||||
#: src/pages/stock/StockDetail.tsx:689
|
#: src/pages/stock/StockDetail.tsx:689
|
||||||
#: src/pages/stock/TransferOrderDetail.tsx:536
|
#: src/pages/stock/TransferOrderDetail.tsx:536
|
||||||
#: src/tables/stock/StockItemTable.tsx:81
|
#: src/tables/stock/StockItemTable.tsx:81
|
||||||
|
|
@ -2971,7 +2974,11 @@ msgstr "Navegación"
|
||||||
msgid "About"
|
msgid "About"
|
||||||
msgstr "Acerca de"
|
msgstr "Acerca de"
|
||||||
|
|
||||||
#: src/components/nav/NavigationTree.tsx:212
|
#: src/components/nav/NavigationTree.tsx:388
|
||||||
|
msgid "Clear search"
|
||||||
|
msgstr ""
|
||||||
|
|
||||||
|
#: src/components/nav/NavigationTree.tsx:399
|
||||||
msgid "Error loading navigation tree."
|
msgid "Error loading navigation tree."
|
||||||
msgstr ""
|
msgstr ""
|
||||||
|
|
||||||
|
|
@ -5539,7 +5546,7 @@ msgstr "Error interno del servidor"
|
||||||
#~ msgstr "You have been logged out"
|
#~ msgstr "You have been logged out"
|
||||||
|
|
||||||
#: src/functions/auth.tsx:124
|
#: src/functions/auth.tsx:124
|
||||||
#: src/functions/auth.tsx:220
|
#: src/functions/auth.tsx:222
|
||||||
msgid "Logged Out"
|
msgid "Logged Out"
|
||||||
msgstr "Desconectado"
|
msgstr "Desconectado"
|
||||||
|
|
||||||
|
|
@ -5551,97 +5558,97 @@ msgstr ""
|
||||||
#~ msgid "Found an existing login - using it to log you in."
|
#~ msgid "Found an existing login - using it to log you in."
|
||||||
#~ msgstr "Found an existing login - using it to log you in."
|
#~ msgstr "Found an existing login - using it to log you in."
|
||||||
|
|
||||||
#: src/functions/auth.tsx:143
|
|
||||||
msgid "No response from server."
|
|
||||||
msgstr ""
|
|
||||||
|
|
||||||
#: src/functions/auth.tsx:143
|
#: src/functions/auth.tsx:143
|
||||||
#~ msgid "Found an existing login - welcome back!"
|
#~ msgid "Found an existing login - welcome back!"
|
||||||
#~ msgstr "Found an existing login - welcome back!"
|
#~ msgstr "Found an existing login - welcome back!"
|
||||||
|
|
||||||
#: src/functions/auth.tsx:186
|
#: src/functions/auth.tsx:145
|
||||||
|
msgid "No response from server."
|
||||||
|
msgstr ""
|
||||||
|
|
||||||
|
#: src/functions/auth.tsx:188
|
||||||
msgid "MFA Login successful"
|
msgid "MFA Login successful"
|
||||||
msgstr ""
|
msgstr ""
|
||||||
|
|
||||||
#: src/functions/auth.tsx:187
|
#: src/functions/auth.tsx:189
|
||||||
msgid "MFA details were automatically provided in the browser"
|
msgid "MFA details were automatically provided in the browser"
|
||||||
msgstr ""
|
msgstr ""
|
||||||
|
|
||||||
#: src/functions/auth.tsx:221
|
#: src/functions/auth.tsx:223
|
||||||
msgid "Successfully logged out"
|
msgid "Successfully logged out"
|
||||||
msgstr "Se cerró sesión correctamente"
|
msgstr "Se cerró sesión correctamente"
|
||||||
|
|
||||||
#: src/functions/auth.tsx:288
|
#: src/functions/auth.tsx:290
|
||||||
msgid "Language changed"
|
msgid "Language changed"
|
||||||
msgstr ""
|
msgstr ""
|
||||||
|
|
||||||
#: src/functions/auth.tsx:289
|
#: src/functions/auth.tsx:291
|
||||||
msgid "Your active language has been changed to the one set in your profile"
|
msgid "Your active language has been changed to the one set in your profile"
|
||||||
msgstr ""
|
msgstr ""
|
||||||
|
|
||||||
#: src/functions/auth.tsx:310
|
#: src/functions/auth.tsx:312
|
||||||
msgid "Theme changed"
|
msgid "Theme changed"
|
||||||
msgstr ""
|
msgstr ""
|
||||||
|
|
||||||
#: src/functions/auth.tsx:311
|
#: src/functions/auth.tsx:313
|
||||||
msgid "Your active theme has been changed to the one set in your profile"
|
msgid "Your active theme has been changed to the one set in your profile"
|
||||||
msgstr ""
|
msgstr ""
|
||||||
|
|
||||||
#: src/functions/auth.tsx:346
|
#: src/functions/auth.tsx:348
|
||||||
msgid "Check your inbox for a reset link. This only works if you have an account. Check in spam too."
|
msgid "Check your inbox for a reset link. This only works if you have an account. Check in spam too."
|
||||||
msgstr ""
|
msgstr ""
|
||||||
|
|
||||||
#: src/functions/auth.tsx:353
|
#: src/functions/auth.tsx:355
|
||||||
#: src/functions/auth.tsx:617
|
#: src/functions/auth.tsx:619
|
||||||
msgid "Reset failed"
|
msgid "Reset failed"
|
||||||
msgstr "Restablecimiento fallido"
|
msgstr "Restablecimiento fallido"
|
||||||
|
|
||||||
#: src/functions/auth.tsx:380
|
#: src/functions/auth.tsx:382
|
||||||
msgid "Already logged in"
|
msgid "Already logged in"
|
||||||
msgstr "Ya iniciaste sesión"
|
msgstr "Ya iniciaste sesión"
|
||||||
|
|
||||||
#: src/functions/auth.tsx:381
|
#: src/functions/auth.tsx:383
|
||||||
msgid "There is a conflicting session on the server for this browser. Please logout of that first."
|
msgid "There is a conflicting session on the server for this browser. Please logout of that first."
|
||||||
msgstr ""
|
msgstr ""
|
||||||
|
|
||||||
#: src/functions/auth.tsx:437
|
#: src/functions/auth.tsx:439
|
||||||
msgid "Logged In"
|
msgid "Logged In"
|
||||||
msgstr "Conectado"
|
msgstr "Conectado"
|
||||||
|
|
||||||
#: src/functions/auth.tsx:438
|
#: src/functions/auth.tsx:440
|
||||||
msgid "Successfully logged in"
|
msgid "Successfully logged in"
|
||||||
msgstr "Sesión iniciada correctamente"
|
msgstr "Sesión iniciada correctamente"
|
||||||
|
|
||||||
#: src/functions/auth.tsx:572
|
#: src/functions/auth.tsx:574
|
||||||
msgid "Failed to set up MFA"
|
msgid "Failed to set up MFA"
|
||||||
msgstr ""
|
msgstr ""
|
||||||
|
|
||||||
#: src/functions/auth.tsx:591
|
#: src/functions/auth.tsx:593
|
||||||
msgid "MFA Setup successful"
|
msgid "MFA Setup successful"
|
||||||
msgstr ""
|
msgstr ""
|
||||||
|
|
||||||
#: src/functions/auth.tsx:592
|
#: src/functions/auth.tsx:594
|
||||||
msgid "MFA via TOTP has been set up successfully; you will need to login again."
|
msgid "MFA via TOTP has been set up successfully; you will need to login again."
|
||||||
msgstr ""
|
msgstr ""
|
||||||
|
|
||||||
#: src/functions/auth.tsx:607
|
#: src/functions/auth.tsx:609
|
||||||
msgid "Password set"
|
msgid "Password set"
|
||||||
msgstr "Contraseña establecida"
|
msgstr "Contraseña establecida"
|
||||||
|
|
||||||
#: src/functions/auth.tsx:608
|
#: src/functions/auth.tsx:610
|
||||||
#: src/functions/auth.tsx:717
|
#: src/functions/auth.tsx:719
|
||||||
msgid "The password was set successfully. You can now login with your new password"
|
msgid "The password was set successfully. You can now login with your new password"
|
||||||
msgstr "La contraseña fue establecida con éxito. Ahora puede iniciar sesión con su nueva contraseña"
|
msgstr "La contraseña fue establecida con éxito. Ahora puede iniciar sesión con su nueva contraseña"
|
||||||
|
|
||||||
#: src/functions/auth.tsx:682
|
#: src/functions/auth.tsx:684
|
||||||
msgid "Password could not be changed"
|
msgid "Password could not be changed"
|
||||||
msgstr ""
|
msgstr ""
|
||||||
|
|
||||||
#: src/functions/auth.tsx:700
|
#: src/functions/auth.tsx:702
|
||||||
msgid "The two password fields didn’t match"
|
msgid "The two password fields didn’t match"
|
||||||
msgstr ""
|
msgstr ""
|
||||||
|
|
||||||
#: src/functions/auth.tsx:716
|
#: src/functions/auth.tsx:718
|
||||||
msgid "Password Changed"
|
msgid "Password Changed"
|
||||||
msgstr ""
|
msgstr ""
|
||||||
|
|
||||||
|
|
@ -8347,11 +8354,11 @@ msgstr ""
|
||||||
msgid "Part Actions"
|
msgid "Part Actions"
|
||||||
msgstr ""
|
msgstr ""
|
||||||
|
|
||||||
#: src/pages/part/PartDetail.tsx:1182
|
#: src/pages/part/PartDetail.tsx:1183
|
||||||
msgid "Part locked"
|
msgid "Part locked"
|
||||||
msgstr ""
|
msgstr ""
|
||||||
|
|
||||||
#: src/pages/part/PartDetail.tsx:1182
|
#: src/pages/part/PartDetail.tsx:1183
|
||||||
msgid "Part unlocked"
|
msgid "Part unlocked"
|
||||||
msgstr ""
|
msgstr ""
|
||||||
|
|
||||||
|
|
|
||||||
|
|
@ -8,7 +8,7 @@ msgstr ""
|
||||||
"Language: es_MX\n"
|
"Language: es_MX\n"
|
||||||
"Project-Id-Version: inventree\n"
|
"Project-Id-Version: inventree\n"
|
||||||
"Report-Msgid-Bugs-To: \n"
|
"Report-Msgid-Bugs-To: \n"
|
||||||
"PO-Revision-Date: 2026-06-17 22:14\n"
|
"PO-Revision-Date: 2026-06-20 13:53\n"
|
||||||
"Last-Translator: \n"
|
"Last-Translator: \n"
|
||||||
"Language-Team: Spanish, Mexico\n"
|
"Language-Team: Spanish, Mexico\n"
|
||||||
"Plural-Forms: nplurals=2; plural=(n != 1);\n"
|
"Plural-Forms: nplurals=2; plural=(n != 1);\n"
|
||||||
|
|
@ -147,7 +147,7 @@ msgstr "No"
|
||||||
#: src/forms/StockForms.tsx:1248
|
#: src/forms/StockForms.tsx:1248
|
||||||
#: src/forms/TransferOrderForms.tsx:234
|
#: src/forms/TransferOrderForms.tsx:234
|
||||||
#: src/pages/build/BuildDetail.tsx:260
|
#: src/pages/build/BuildDetail.tsx:260
|
||||||
#: src/pages/part/PartDetail.tsx:1165
|
#: src/pages/part/PartDetail.tsx:1166
|
||||||
#: src/pages/part/bom/BomCompare.tsx:203
|
#: src/pages/part/bom/BomCompare.tsx:203
|
||||||
#: src/tables/ColumnRenderers.tsx:93
|
#: src/tables/ColumnRenderers.tsx:93
|
||||||
#: src/tables/build/BuildOrderParametricTable.tsx:29
|
#: src/tables/build/BuildOrderParametricTable.tsx:29
|
||||||
|
|
@ -166,7 +166,7 @@ msgstr "Pieza"
|
||||||
#: src/pages/part/CategoryDetail.tsx:138
|
#: src/pages/part/CategoryDetail.tsx:138
|
||||||
#: src/pages/part/CategoryDetail.tsx:285
|
#: src/pages/part/CategoryDetail.tsx:285
|
||||||
#: src/pages/part/CategoryDetail.tsx:345
|
#: src/pages/part/CategoryDetail.tsx:345
|
||||||
#: src/pages/part/CategoryDetail.tsx:387
|
#: src/pages/part/CategoryDetail.tsx:388
|
||||||
#: src/pages/part/PartDetail.tsx:893
|
#: src/pages/part/PartDetail.tsx:893
|
||||||
msgid "Parts"
|
msgid "Parts"
|
||||||
msgstr "Piezas"
|
msgstr "Piezas"
|
||||||
|
|
@ -242,7 +242,7 @@ msgid "Manufacturer Parts"
|
||||||
msgstr "Piezas del fabricante"
|
msgstr "Piezas del fabricante"
|
||||||
|
|
||||||
#: lib/enums/ModelInformation.tsx:80
|
#: lib/enums/ModelInformation.tsx:80
|
||||||
#: src/pages/part/CategoryDetail.tsx:387
|
#: src/pages/part/CategoryDetail.tsx:388
|
||||||
#: src/tables/Filter.tsx:496
|
#: src/tables/Filter.tsx:496
|
||||||
msgid "Part Category"
|
msgid "Part Category"
|
||||||
msgstr "Categoría de Pieza"
|
msgstr "Categoría de Pieza"
|
||||||
|
|
@ -261,7 +261,7 @@ msgstr "Categorías de Pieza"
|
||||||
#: src/forms/BuildForms.tsx:848
|
#: src/forms/BuildForms.tsx:848
|
||||||
#: src/forms/SalesOrderForms.tsx:438
|
#: src/forms/SalesOrderForms.tsx:438
|
||||||
#: src/forms/TransferOrderForms.tsx:236
|
#: src/forms/TransferOrderForms.tsx:236
|
||||||
#: src/pages/stock/StockDetail.tsx:1075
|
#: src/pages/stock/StockDetail.tsx:1076
|
||||||
#: src/tables/ColumnRenderers.tsx:132
|
#: src/tables/ColumnRenderers.tsx:132
|
||||||
#: src/tables/part/PartTestResultTable.tsx:256
|
#: src/tables/part/PartTestResultTable.tsx:256
|
||||||
#: src/tables/stock/InstalledItemsTable.tsx:66
|
#: src/tables/stock/InstalledItemsTable.tsx:66
|
||||||
|
|
@ -283,7 +283,7 @@ msgstr "Artículos de Stock"
|
||||||
|
|
||||||
#: lib/enums/ModelInformation.tsx:99
|
#: lib/enums/ModelInformation.tsx:99
|
||||||
#: lib/enums/Roles.tsx:51
|
#: lib/enums/Roles.tsx:51
|
||||||
#: src/pages/stock/LocationDetail.tsx:522
|
#: src/pages/stock/LocationDetail.tsx:523
|
||||||
msgid "Stock Location"
|
msgid "Stock Location"
|
||||||
msgstr "Ubicación de almacén"
|
msgstr "Ubicación de almacén"
|
||||||
|
|
||||||
|
|
@ -644,14 +644,14 @@ msgstr ""
|
||||||
#: src/components/importer/ImporterColumnSelector.tsx:330
|
#: src/components/importer/ImporterColumnSelector.tsx:330
|
||||||
#: src/components/importer/ImporterDrawer.tsx:91
|
#: src/components/importer/ImporterDrawer.tsx:91
|
||||||
#: src/components/modals/LicenseModal.tsx:85
|
#: src/components/modals/LicenseModal.tsx:85
|
||||||
#: src/components/nav/NavigationTree.tsx:211
|
#: src/components/nav/NavigationTree.tsx:398
|
||||||
#: src/components/nav/NotificationDrawer.tsx:235
|
#: src/components/nav/NotificationDrawer.tsx:235
|
||||||
#: src/components/nav/SearchDrawer.tsx:588
|
#: src/components/nav/SearchDrawer.tsx:588
|
||||||
#: src/components/settings/SettingList.tsx:145
|
#: src/components/settings/SettingList.tsx:145
|
||||||
#: src/components/wizards/ImportPartWizard.tsx:574
|
#: src/components/wizards/ImportPartWizard.tsx:574
|
||||||
#: src/components/wizards/ImportPartWizard.tsx:719
|
#: src/components/wizards/ImportPartWizard.tsx:719
|
||||||
#: src/forms/BomForms.tsx:83
|
#: src/forms/BomForms.tsx:83
|
||||||
#: src/functions/auth.tsx:691
|
#: src/functions/auth.tsx:693
|
||||||
#: src/pages/ErrorPage.tsx:11
|
#: src/pages/ErrorPage.tsx:11
|
||||||
#: src/pages/Index/Settings/AccountSettings/MFASettings.tsx:317
|
#: src/pages/Index/Settings/AccountSettings/MFASettings.tsx:317
|
||||||
#: src/pages/Index/Settings/AccountSettings/MFASettings.tsx:408
|
#: src/pages/Index/Settings/AccountSettings/MFASettings.tsx:408
|
||||||
|
|
@ -723,6 +723,7 @@ msgstr "La solicitud ha expirado"
|
||||||
|
|
||||||
#: lib/hooks/MonitorDataOutput.tsx:57
|
#: lib/hooks/MonitorDataOutput.tsx:57
|
||||||
#: lib/hooks/MonitorDataOutput.tsx:116
|
#: lib/hooks/MonitorDataOutput.tsx:116
|
||||||
|
#: src/components/editors/TemplateEditor/PdfPreview/PdfPreview.tsx:76
|
||||||
msgid "Process failed"
|
msgid "Process failed"
|
||||||
msgstr "Proceso fallido"
|
msgstr "Proceso fallido"
|
||||||
|
|
||||||
|
|
@ -1391,11 +1392,11 @@ msgstr "Requiere Superusuario"
|
||||||
msgid "This widget requires superuser permissions"
|
msgid "This widget requires superuser permissions"
|
||||||
msgstr "Este widget requiere permisos de superusuario"
|
msgstr "Este widget requiere permisos de superusuario"
|
||||||
|
|
||||||
#: src/components/dashboard/widgets/NewsWidget.tsx:133
|
#: src/components/dashboard/widgets/NewsWidget.tsx:135
|
||||||
msgid "No News"
|
msgid "No News"
|
||||||
msgstr "Sin noticias"
|
msgstr "Sin noticias"
|
||||||
|
|
||||||
#: src/components/dashboard/widgets/NewsWidget.tsx:134
|
#: src/components/dashboard/widgets/NewsWidget.tsx:136
|
||||||
msgid "There are no unread news items"
|
msgid "There are no unread news items"
|
||||||
msgstr "No hay noticias sin leer"
|
msgstr "No hay noticias sin leer"
|
||||||
|
|
||||||
|
|
@ -1655,7 +1656,7 @@ msgstr "Código"
|
||||||
msgid "Error rendering preview"
|
msgid "Error rendering preview"
|
||||||
msgstr ""
|
msgstr ""
|
||||||
|
|
||||||
#: src/components/editors/TemplateEditor/PdfPreview/PdfPreview.tsx:120
|
#: src/components/editors/TemplateEditor/PdfPreview/PdfPreview.tsx:124
|
||||||
msgid "Preview not available, click \"Reload Preview\"."
|
msgid "Preview not available, click \"Reload Preview\"."
|
||||||
msgstr "Vista previa no disponible, haga clic en \"Recargar vista previa\"."
|
msgstr "Vista previa no disponible, haga clic en \"Recargar vista previa\"."
|
||||||
|
|
||||||
|
|
@ -1728,11 +1729,11 @@ msgstr "Guardar la plantilla actual y recargar la vista previa"
|
||||||
#~ msgid "to preview"
|
#~ msgid "to preview"
|
||||||
#~ msgstr "to preview"
|
#~ msgstr "to preview"
|
||||||
|
|
||||||
#: src/components/editors/TemplateEditor/TemplateEditor.tsx:379
|
#: src/components/editors/TemplateEditor/TemplateEditor.tsx:380
|
||||||
msgid "Select instance to preview"
|
msgid "Select instance to preview"
|
||||||
msgstr "Seleccione la instancia a previsualizar"
|
msgstr "Seleccione la instancia a previsualizar"
|
||||||
|
|
||||||
#: src/components/editors/TemplateEditor/TemplateEditor.tsx:423
|
#: src/components/editors/TemplateEditor/TemplateEditor.tsx:424
|
||||||
msgid "Error rendering template"
|
msgid "Error rendering template"
|
||||||
msgstr "Error al renderizar plantilla"
|
msgstr "Error al renderizar plantilla"
|
||||||
|
|
||||||
|
|
@ -1829,20 +1830,20 @@ msgstr "Se ha iniciado sesión con éxito"
|
||||||
#: src/components/forms/AuthenticationForm.tsx:81
|
#: src/components/forms/AuthenticationForm.tsx:81
|
||||||
#: src/components/forms/AuthenticationForm.tsx:89
|
#: src/components/forms/AuthenticationForm.tsx:89
|
||||||
#: src/functions/auth.tsx:133
|
#: src/functions/auth.tsx:133
|
||||||
#: src/functions/auth.tsx:142
|
#: src/functions/auth.tsx:144
|
||||||
msgid "Login failed"
|
msgid "Login failed"
|
||||||
msgstr "Error al iniciar sesión"
|
msgstr "Error al iniciar sesión"
|
||||||
|
|
||||||
#: src/components/forms/AuthenticationForm.tsx:82
|
#: src/components/forms/AuthenticationForm.tsx:82
|
||||||
#: src/components/forms/AuthenticationForm.tsx:90
|
#: src/components/forms/AuthenticationForm.tsx:90
|
||||||
#: src/components/forms/AuthenticationForm.tsx:106
|
#: src/components/forms/AuthenticationForm.tsx:106
|
||||||
#: src/functions/auth.tsx:134
|
#: src/functions/auth.tsx:136
|
||||||
#: src/functions/auth.tsx:354
|
#: src/functions/auth.tsx:356
|
||||||
msgid "Check your input and try again."
|
msgid "Check your input and try again."
|
||||||
msgstr "Verifique su entrada e intente nuevamente."
|
msgstr "Verifique su entrada e intente nuevamente."
|
||||||
|
|
||||||
#: src/components/forms/AuthenticationForm.tsx:100
|
#: src/components/forms/AuthenticationForm.tsx:100
|
||||||
#: src/functions/auth.tsx:345
|
#: src/functions/auth.tsx:347
|
||||||
msgid "Mail delivery successful"
|
msgid "Mail delivery successful"
|
||||||
msgstr "Envío de correo exitoso"
|
msgstr "Envío de correo exitoso"
|
||||||
|
|
||||||
|
|
@ -2128,6 +2129,7 @@ msgstr "No clasificado"
|
||||||
|
|
||||||
#: src/components/forms/fields/IconField.tsx:211
|
#: src/components/forms/fields/IconField.tsx:211
|
||||||
#: src/components/nav/Layout.tsx:143
|
#: src/components/nav/Layout.tsx:143
|
||||||
|
#: src/components/nav/NavigationTree.tsx:378
|
||||||
#: src/tables/part/PartThumbTable.tsx:209
|
#: src/tables/part/PartThumbTable.tsx:209
|
||||||
msgid "Search..."
|
msgid "Search..."
|
||||||
msgstr "Búsqueda..."
|
msgstr "Búsqueda..."
|
||||||
|
|
@ -2153,6 +2155,7 @@ msgid "Loading"
|
||||||
msgstr "Cargando"
|
msgstr "Cargando"
|
||||||
|
|
||||||
#: src/components/forms/fields/RelatedModelField.tsx:540
|
#: src/components/forms/fields/RelatedModelField.tsx:540
|
||||||
|
#: src/components/nav/NavigationTree.tsx:403
|
||||||
msgid "No results found"
|
msgid "No results found"
|
||||||
msgstr "No hay resultados"
|
msgstr "No hay resultados"
|
||||||
|
|
||||||
|
|
@ -2247,7 +2250,7 @@ msgstr "Procesando datos"
|
||||||
#: src/components/importer/ImporterColumnSelector.tsx:299
|
#: src/components/importer/ImporterColumnSelector.tsx:299
|
||||||
#: src/components/items/ErrorItem.tsx:12
|
#: src/components/items/ErrorItem.tsx:12
|
||||||
#: src/functions/api.tsx:60
|
#: src/functions/api.tsx:60
|
||||||
#: src/functions/auth.tsx:401
|
#: src/functions/auth.tsx:403
|
||||||
msgid "An error occurred"
|
msgid "An error occurred"
|
||||||
msgstr "Se ha producido un error"
|
msgstr "Se ha producido un error"
|
||||||
|
|
||||||
|
|
@ -2925,7 +2928,7 @@ msgstr "Cerrar sesión"
|
||||||
#: src/pages/Index/Settings/SystemSettings.tsx:260
|
#: src/pages/Index/Settings/SystemSettings.tsx:260
|
||||||
#: src/pages/part/PartDetail.tsx:663
|
#: src/pages/part/PartDetail.tsx:663
|
||||||
#: src/pages/stock/LocationDetail.tsx:481
|
#: src/pages/stock/LocationDetail.tsx:481
|
||||||
#: src/pages/stock/LocationDetail.tsx:522
|
#: src/pages/stock/LocationDetail.tsx:523
|
||||||
#: src/pages/stock/StockDetail.tsx:689
|
#: src/pages/stock/StockDetail.tsx:689
|
||||||
#: src/pages/stock/TransferOrderDetail.tsx:536
|
#: src/pages/stock/TransferOrderDetail.tsx:536
|
||||||
#: src/tables/stock/StockItemTable.tsx:81
|
#: src/tables/stock/StockItemTable.tsx:81
|
||||||
|
|
@ -2971,7 +2974,11 @@ msgstr "Navegación"
|
||||||
msgid "About"
|
msgid "About"
|
||||||
msgstr "Acerca de"
|
msgstr "Acerca de"
|
||||||
|
|
||||||
#: src/components/nav/NavigationTree.tsx:212
|
#: src/components/nav/NavigationTree.tsx:388
|
||||||
|
msgid "Clear search"
|
||||||
|
msgstr ""
|
||||||
|
|
||||||
|
#: src/components/nav/NavigationTree.tsx:399
|
||||||
msgid "Error loading navigation tree."
|
msgid "Error loading navigation tree."
|
||||||
msgstr ""
|
msgstr ""
|
||||||
|
|
||||||
|
|
@ -5539,7 +5546,7 @@ msgstr "Error interno del servidor"
|
||||||
#~ msgstr "You have been logged out"
|
#~ msgstr "You have been logged out"
|
||||||
|
|
||||||
#: src/functions/auth.tsx:124
|
#: src/functions/auth.tsx:124
|
||||||
#: src/functions/auth.tsx:220
|
#: src/functions/auth.tsx:222
|
||||||
msgid "Logged Out"
|
msgid "Logged Out"
|
||||||
msgstr "Desconectado"
|
msgstr "Desconectado"
|
||||||
|
|
||||||
|
|
@ -5551,97 +5558,97 @@ msgstr ""
|
||||||
#~ msgid "Found an existing login - using it to log you in."
|
#~ msgid "Found an existing login - using it to log you in."
|
||||||
#~ msgstr "Found an existing login - using it to log you in."
|
#~ msgstr "Found an existing login - using it to log you in."
|
||||||
|
|
||||||
#: src/functions/auth.tsx:143
|
|
||||||
msgid "No response from server."
|
|
||||||
msgstr ""
|
|
||||||
|
|
||||||
#: src/functions/auth.tsx:143
|
#: src/functions/auth.tsx:143
|
||||||
#~ msgid "Found an existing login - welcome back!"
|
#~ msgid "Found an existing login - welcome back!"
|
||||||
#~ msgstr "Found an existing login - welcome back!"
|
#~ msgstr "Found an existing login - welcome back!"
|
||||||
|
|
||||||
#: src/functions/auth.tsx:186
|
#: src/functions/auth.tsx:145
|
||||||
|
msgid "No response from server."
|
||||||
|
msgstr ""
|
||||||
|
|
||||||
|
#: src/functions/auth.tsx:188
|
||||||
msgid "MFA Login successful"
|
msgid "MFA Login successful"
|
||||||
msgstr ""
|
msgstr ""
|
||||||
|
|
||||||
#: src/functions/auth.tsx:187
|
#: src/functions/auth.tsx:189
|
||||||
msgid "MFA details were automatically provided in the browser"
|
msgid "MFA details were automatically provided in the browser"
|
||||||
msgstr ""
|
msgstr ""
|
||||||
|
|
||||||
#: src/functions/auth.tsx:221
|
#: src/functions/auth.tsx:223
|
||||||
msgid "Successfully logged out"
|
msgid "Successfully logged out"
|
||||||
msgstr "Se cerró sesión correctamente"
|
msgstr "Se cerró sesión correctamente"
|
||||||
|
|
||||||
#: src/functions/auth.tsx:288
|
#: src/functions/auth.tsx:290
|
||||||
msgid "Language changed"
|
msgid "Language changed"
|
||||||
msgstr ""
|
msgstr ""
|
||||||
|
|
||||||
#: src/functions/auth.tsx:289
|
#: src/functions/auth.tsx:291
|
||||||
msgid "Your active language has been changed to the one set in your profile"
|
msgid "Your active language has been changed to the one set in your profile"
|
||||||
msgstr ""
|
msgstr ""
|
||||||
|
|
||||||
#: src/functions/auth.tsx:310
|
#: src/functions/auth.tsx:312
|
||||||
msgid "Theme changed"
|
msgid "Theme changed"
|
||||||
msgstr ""
|
msgstr ""
|
||||||
|
|
||||||
#: src/functions/auth.tsx:311
|
#: src/functions/auth.tsx:313
|
||||||
msgid "Your active theme has been changed to the one set in your profile"
|
msgid "Your active theme has been changed to the one set in your profile"
|
||||||
msgstr ""
|
msgstr ""
|
||||||
|
|
||||||
#: src/functions/auth.tsx:346
|
#: src/functions/auth.tsx:348
|
||||||
msgid "Check your inbox for a reset link. This only works if you have an account. Check in spam too."
|
msgid "Check your inbox for a reset link. This only works if you have an account. Check in spam too."
|
||||||
msgstr "Revisa tu bandeja de entrada para un enlace de restablecimiento. Esto solo funciona si tienes una cuenta. Revisa el correo no deseado también."
|
msgstr "Revisa tu bandeja de entrada para un enlace de restablecimiento. Esto solo funciona si tienes una cuenta. Revisa el correo no deseado también."
|
||||||
|
|
||||||
#: src/functions/auth.tsx:353
|
#: src/functions/auth.tsx:355
|
||||||
#: src/functions/auth.tsx:617
|
#: src/functions/auth.tsx:619
|
||||||
msgid "Reset failed"
|
msgid "Reset failed"
|
||||||
msgstr "Restablecimiento fallido"
|
msgstr "Restablecimiento fallido"
|
||||||
|
|
||||||
#: src/functions/auth.tsx:380
|
#: src/functions/auth.tsx:382
|
||||||
msgid "Already logged in"
|
msgid "Already logged in"
|
||||||
msgstr "Ya iniciaste sesión"
|
msgstr "Ya iniciaste sesión"
|
||||||
|
|
||||||
#: src/functions/auth.tsx:381
|
#: src/functions/auth.tsx:383
|
||||||
msgid "There is a conflicting session on the server for this browser. Please logout of that first."
|
msgid "There is a conflicting session on the server for this browser. Please logout of that first."
|
||||||
msgstr "Hay una sesión en conflicto en el servidor para este navegador. Por favor, cierra la sesión primero."
|
msgstr "Hay una sesión en conflicto en el servidor para este navegador. Por favor, cierra la sesión primero."
|
||||||
|
|
||||||
#: src/functions/auth.tsx:437
|
#: src/functions/auth.tsx:439
|
||||||
msgid "Logged In"
|
msgid "Logged In"
|
||||||
msgstr "Conectado"
|
msgstr "Conectado"
|
||||||
|
|
||||||
#: src/functions/auth.tsx:438
|
#: src/functions/auth.tsx:440
|
||||||
msgid "Successfully logged in"
|
msgid "Successfully logged in"
|
||||||
msgstr "Sesión iniciada correctamente"
|
msgstr "Sesión iniciada correctamente"
|
||||||
|
|
||||||
#: src/functions/auth.tsx:572
|
#: src/functions/auth.tsx:574
|
||||||
msgid "Failed to set up MFA"
|
msgid "Failed to set up MFA"
|
||||||
msgstr "Error al configurar MFA"
|
msgstr "Error al configurar MFA"
|
||||||
|
|
||||||
#: src/functions/auth.tsx:591
|
#: src/functions/auth.tsx:593
|
||||||
msgid "MFA Setup successful"
|
msgid "MFA Setup successful"
|
||||||
msgstr ""
|
msgstr ""
|
||||||
|
|
||||||
#: src/functions/auth.tsx:592
|
#: src/functions/auth.tsx:594
|
||||||
msgid "MFA via TOTP has been set up successfully; you will need to login again."
|
msgid "MFA via TOTP has been set up successfully; you will need to login again."
|
||||||
msgstr ""
|
msgstr ""
|
||||||
|
|
||||||
#: src/functions/auth.tsx:607
|
#: src/functions/auth.tsx:609
|
||||||
msgid "Password set"
|
msgid "Password set"
|
||||||
msgstr "Contraseña establecida"
|
msgstr "Contraseña establecida"
|
||||||
|
|
||||||
#: src/functions/auth.tsx:608
|
#: src/functions/auth.tsx:610
|
||||||
#: src/functions/auth.tsx:717
|
#: src/functions/auth.tsx:719
|
||||||
msgid "The password was set successfully. You can now login with your new password"
|
msgid "The password was set successfully. You can now login with your new password"
|
||||||
msgstr "La contraseña fue establecida con éxito. Ahora puede iniciar sesión con su nueva contraseña"
|
msgstr "La contraseña fue establecida con éxito. Ahora puede iniciar sesión con su nueva contraseña"
|
||||||
|
|
||||||
#: src/functions/auth.tsx:682
|
#: src/functions/auth.tsx:684
|
||||||
msgid "Password could not be changed"
|
msgid "Password could not be changed"
|
||||||
msgstr "No se ha podido cambiar la contraseña"
|
msgstr "No se ha podido cambiar la contraseña"
|
||||||
|
|
||||||
#: src/functions/auth.tsx:700
|
#: src/functions/auth.tsx:702
|
||||||
msgid "The two password fields didn’t match"
|
msgid "The two password fields didn’t match"
|
||||||
msgstr ""
|
msgstr ""
|
||||||
|
|
||||||
#: src/functions/auth.tsx:716
|
#: src/functions/auth.tsx:718
|
||||||
msgid "Password Changed"
|
msgid "Password Changed"
|
||||||
msgstr "Contraseña Cambiada"
|
msgstr "Contraseña Cambiada"
|
||||||
|
|
||||||
|
|
@ -8347,11 +8354,11 @@ msgstr ""
|
||||||
msgid "Part Actions"
|
msgid "Part Actions"
|
||||||
msgstr ""
|
msgstr ""
|
||||||
|
|
||||||
#: src/pages/part/PartDetail.tsx:1182
|
#: src/pages/part/PartDetail.tsx:1183
|
||||||
msgid "Part locked"
|
msgid "Part locked"
|
||||||
msgstr ""
|
msgstr ""
|
||||||
|
|
||||||
#: src/pages/part/PartDetail.tsx:1182
|
#: src/pages/part/PartDetail.tsx:1183
|
||||||
msgid "Part unlocked"
|
msgid "Part unlocked"
|
||||||
msgstr ""
|
msgstr ""
|
||||||
|
|
||||||
|
|
|
||||||
|
|
@ -8,7 +8,7 @@ msgstr ""
|
||||||
"Language: et\n"
|
"Language: et\n"
|
||||||
"Project-Id-Version: inventree\n"
|
"Project-Id-Version: inventree\n"
|
||||||
"Report-Msgid-Bugs-To: \n"
|
"Report-Msgid-Bugs-To: \n"
|
||||||
"PO-Revision-Date: 2026-06-17 22:14\n"
|
"PO-Revision-Date: 2026-06-20 13:53\n"
|
||||||
"Last-Translator: \n"
|
"Last-Translator: \n"
|
||||||
"Language-Team: Estonian\n"
|
"Language-Team: Estonian\n"
|
||||||
"Plural-Forms: nplurals=2; plural=(n != 1);\n"
|
"Plural-Forms: nplurals=2; plural=(n != 1);\n"
|
||||||
|
|
@ -147,7 +147,7 @@ msgstr "Ei"
|
||||||
#: src/forms/StockForms.tsx:1248
|
#: src/forms/StockForms.tsx:1248
|
||||||
#: src/forms/TransferOrderForms.tsx:234
|
#: src/forms/TransferOrderForms.tsx:234
|
||||||
#: src/pages/build/BuildDetail.tsx:260
|
#: src/pages/build/BuildDetail.tsx:260
|
||||||
#: src/pages/part/PartDetail.tsx:1165
|
#: src/pages/part/PartDetail.tsx:1166
|
||||||
#: src/pages/part/bom/BomCompare.tsx:203
|
#: src/pages/part/bom/BomCompare.tsx:203
|
||||||
#: src/tables/ColumnRenderers.tsx:93
|
#: src/tables/ColumnRenderers.tsx:93
|
||||||
#: src/tables/build/BuildOrderParametricTable.tsx:29
|
#: src/tables/build/BuildOrderParametricTable.tsx:29
|
||||||
|
|
@ -166,7 +166,7 @@ msgstr "Osa"
|
||||||
#: src/pages/part/CategoryDetail.tsx:138
|
#: src/pages/part/CategoryDetail.tsx:138
|
||||||
#: src/pages/part/CategoryDetail.tsx:285
|
#: src/pages/part/CategoryDetail.tsx:285
|
||||||
#: src/pages/part/CategoryDetail.tsx:345
|
#: src/pages/part/CategoryDetail.tsx:345
|
||||||
#: src/pages/part/CategoryDetail.tsx:387
|
#: src/pages/part/CategoryDetail.tsx:388
|
||||||
#: src/pages/part/PartDetail.tsx:893
|
#: src/pages/part/PartDetail.tsx:893
|
||||||
msgid "Parts"
|
msgid "Parts"
|
||||||
msgstr "Osad"
|
msgstr "Osad"
|
||||||
|
|
@ -242,7 +242,7 @@ msgid "Manufacturer Parts"
|
||||||
msgstr ""
|
msgstr ""
|
||||||
|
|
||||||
#: lib/enums/ModelInformation.tsx:80
|
#: lib/enums/ModelInformation.tsx:80
|
||||||
#: src/pages/part/CategoryDetail.tsx:387
|
#: src/pages/part/CategoryDetail.tsx:388
|
||||||
#: src/tables/Filter.tsx:496
|
#: src/tables/Filter.tsx:496
|
||||||
msgid "Part Category"
|
msgid "Part Category"
|
||||||
msgstr "Osa kategooria"
|
msgstr "Osa kategooria"
|
||||||
|
|
@ -261,7 +261,7 @@ msgstr "Osa kategooriad"
|
||||||
#: src/forms/BuildForms.tsx:848
|
#: src/forms/BuildForms.tsx:848
|
||||||
#: src/forms/SalesOrderForms.tsx:438
|
#: src/forms/SalesOrderForms.tsx:438
|
||||||
#: src/forms/TransferOrderForms.tsx:236
|
#: src/forms/TransferOrderForms.tsx:236
|
||||||
#: src/pages/stock/StockDetail.tsx:1075
|
#: src/pages/stock/StockDetail.tsx:1076
|
||||||
#: src/tables/ColumnRenderers.tsx:132
|
#: src/tables/ColumnRenderers.tsx:132
|
||||||
#: src/tables/part/PartTestResultTable.tsx:256
|
#: src/tables/part/PartTestResultTable.tsx:256
|
||||||
#: src/tables/stock/InstalledItemsTable.tsx:66
|
#: src/tables/stock/InstalledItemsTable.tsx:66
|
||||||
|
|
@ -283,7 +283,7 @@ msgstr ""
|
||||||
|
|
||||||
#: lib/enums/ModelInformation.tsx:99
|
#: lib/enums/ModelInformation.tsx:99
|
||||||
#: lib/enums/Roles.tsx:51
|
#: lib/enums/Roles.tsx:51
|
||||||
#: src/pages/stock/LocationDetail.tsx:522
|
#: src/pages/stock/LocationDetail.tsx:523
|
||||||
msgid "Stock Location"
|
msgid "Stock Location"
|
||||||
msgstr "Lao asukoht"
|
msgstr "Lao asukoht"
|
||||||
|
|
||||||
|
|
@ -644,14 +644,14 @@ msgstr ""
|
||||||
#: src/components/importer/ImporterColumnSelector.tsx:330
|
#: src/components/importer/ImporterColumnSelector.tsx:330
|
||||||
#: src/components/importer/ImporterDrawer.tsx:91
|
#: src/components/importer/ImporterDrawer.tsx:91
|
||||||
#: src/components/modals/LicenseModal.tsx:85
|
#: src/components/modals/LicenseModal.tsx:85
|
||||||
#: src/components/nav/NavigationTree.tsx:211
|
#: src/components/nav/NavigationTree.tsx:398
|
||||||
#: src/components/nav/NotificationDrawer.tsx:235
|
#: src/components/nav/NotificationDrawer.tsx:235
|
||||||
#: src/components/nav/SearchDrawer.tsx:588
|
#: src/components/nav/SearchDrawer.tsx:588
|
||||||
#: src/components/settings/SettingList.tsx:145
|
#: src/components/settings/SettingList.tsx:145
|
||||||
#: src/components/wizards/ImportPartWizard.tsx:574
|
#: src/components/wizards/ImportPartWizard.tsx:574
|
||||||
#: src/components/wizards/ImportPartWizard.tsx:719
|
#: src/components/wizards/ImportPartWizard.tsx:719
|
||||||
#: src/forms/BomForms.tsx:83
|
#: src/forms/BomForms.tsx:83
|
||||||
#: src/functions/auth.tsx:691
|
#: src/functions/auth.tsx:693
|
||||||
#: src/pages/ErrorPage.tsx:11
|
#: src/pages/ErrorPage.tsx:11
|
||||||
#: src/pages/Index/Settings/AccountSettings/MFASettings.tsx:317
|
#: src/pages/Index/Settings/AccountSettings/MFASettings.tsx:317
|
||||||
#: src/pages/Index/Settings/AccountSettings/MFASettings.tsx:408
|
#: src/pages/Index/Settings/AccountSettings/MFASettings.tsx:408
|
||||||
|
|
@ -723,6 +723,7 @@ msgstr "Viimane päring aegus"
|
||||||
|
|
||||||
#: lib/hooks/MonitorDataOutput.tsx:57
|
#: lib/hooks/MonitorDataOutput.tsx:57
|
||||||
#: lib/hooks/MonitorDataOutput.tsx:116
|
#: lib/hooks/MonitorDataOutput.tsx:116
|
||||||
|
#: src/components/editors/TemplateEditor/PdfPreview/PdfPreview.tsx:76
|
||||||
msgid "Process failed"
|
msgid "Process failed"
|
||||||
msgstr "Töötlemine ebaõnnestus"
|
msgstr "Töötlemine ebaõnnestus"
|
||||||
|
|
||||||
|
|
@ -1391,11 +1392,11 @@ msgstr "Nõuab superkasutajat"
|
||||||
msgid "This widget requires superuser permissions"
|
msgid "This widget requires superuser permissions"
|
||||||
msgstr "See vidin nõuab superkasutaja õiguseid"
|
msgstr "See vidin nõuab superkasutaja õiguseid"
|
||||||
|
|
||||||
#: src/components/dashboard/widgets/NewsWidget.tsx:133
|
#: src/components/dashboard/widgets/NewsWidget.tsx:135
|
||||||
msgid "No News"
|
msgid "No News"
|
||||||
msgstr "Uudiseid pole"
|
msgstr "Uudiseid pole"
|
||||||
|
|
||||||
#: src/components/dashboard/widgets/NewsWidget.tsx:134
|
#: src/components/dashboard/widgets/NewsWidget.tsx:136
|
||||||
msgid "There are no unread news items"
|
msgid "There are no unread news items"
|
||||||
msgstr "Lugemata uudiseid pole"
|
msgstr "Lugemata uudiseid pole"
|
||||||
|
|
||||||
|
|
@ -1655,7 +1656,7 @@ msgstr "Kood"
|
||||||
msgid "Error rendering preview"
|
msgid "Error rendering preview"
|
||||||
msgstr "Viga eelvaate loomisel"
|
msgstr "Viga eelvaate loomisel"
|
||||||
|
|
||||||
#: src/components/editors/TemplateEditor/PdfPreview/PdfPreview.tsx:120
|
#: src/components/editors/TemplateEditor/PdfPreview/PdfPreview.tsx:124
|
||||||
msgid "Preview not available, click \"Reload Preview\"."
|
msgid "Preview not available, click \"Reload Preview\"."
|
||||||
msgstr "Eelvaade pole saadaval, klõpsake \"Laadi eelvaade uuesti\"."
|
msgstr "Eelvaade pole saadaval, klõpsake \"Laadi eelvaade uuesti\"."
|
||||||
|
|
||||||
|
|
@ -1728,11 +1729,11 @@ msgstr "Salvesta praegune mall ja laadi eelvaade uuesti"
|
||||||
#~ msgid "to preview"
|
#~ msgid "to preview"
|
||||||
#~ msgstr "to preview"
|
#~ msgstr "to preview"
|
||||||
|
|
||||||
#: src/components/editors/TemplateEditor/TemplateEditor.tsx:379
|
#: src/components/editors/TemplateEditor/TemplateEditor.tsx:380
|
||||||
msgid "Select instance to preview"
|
msgid "Select instance to preview"
|
||||||
msgstr "Vali eelvaate jaoks eksemplar"
|
msgstr "Vali eelvaate jaoks eksemplar"
|
||||||
|
|
||||||
#: src/components/editors/TemplateEditor/TemplateEditor.tsx:423
|
#: src/components/editors/TemplateEditor/TemplateEditor.tsx:424
|
||||||
msgid "Error rendering template"
|
msgid "Error rendering template"
|
||||||
msgstr "Malli renderdamisel tekkis viga"
|
msgstr "Malli renderdamisel tekkis viga"
|
||||||
|
|
||||||
|
|
@ -1829,20 +1830,20 @@ msgstr "Sisselogimine õnnestus"
|
||||||
#: src/components/forms/AuthenticationForm.tsx:81
|
#: src/components/forms/AuthenticationForm.tsx:81
|
||||||
#: src/components/forms/AuthenticationForm.tsx:89
|
#: src/components/forms/AuthenticationForm.tsx:89
|
||||||
#: src/functions/auth.tsx:133
|
#: src/functions/auth.tsx:133
|
||||||
#: src/functions/auth.tsx:142
|
#: src/functions/auth.tsx:144
|
||||||
msgid "Login failed"
|
msgid "Login failed"
|
||||||
msgstr "Sisselogimine ebaõnnestus"
|
msgstr "Sisselogimine ebaõnnestus"
|
||||||
|
|
||||||
#: src/components/forms/AuthenticationForm.tsx:82
|
#: src/components/forms/AuthenticationForm.tsx:82
|
||||||
#: src/components/forms/AuthenticationForm.tsx:90
|
#: src/components/forms/AuthenticationForm.tsx:90
|
||||||
#: src/components/forms/AuthenticationForm.tsx:106
|
#: src/components/forms/AuthenticationForm.tsx:106
|
||||||
#: src/functions/auth.tsx:134
|
#: src/functions/auth.tsx:136
|
||||||
#: src/functions/auth.tsx:354
|
#: src/functions/auth.tsx:356
|
||||||
msgid "Check your input and try again."
|
msgid "Check your input and try again."
|
||||||
msgstr "Kontrollige oma sisestust ja proovige uuesti."
|
msgstr "Kontrollige oma sisestust ja proovige uuesti."
|
||||||
|
|
||||||
#: src/components/forms/AuthenticationForm.tsx:100
|
#: src/components/forms/AuthenticationForm.tsx:100
|
||||||
#: src/functions/auth.tsx:345
|
#: src/functions/auth.tsx:347
|
||||||
msgid "Mail delivery successful"
|
msgid "Mail delivery successful"
|
||||||
msgstr "E-kirja kohaletoimetamine õnnestus"
|
msgstr "E-kirja kohaletoimetamine õnnestus"
|
||||||
|
|
||||||
|
|
@ -2128,6 +2129,7 @@ msgstr "Liigitamata"
|
||||||
|
|
||||||
#: src/components/forms/fields/IconField.tsx:211
|
#: src/components/forms/fields/IconField.tsx:211
|
||||||
#: src/components/nav/Layout.tsx:143
|
#: src/components/nav/Layout.tsx:143
|
||||||
|
#: src/components/nav/NavigationTree.tsx:378
|
||||||
#: src/tables/part/PartThumbTable.tsx:209
|
#: src/tables/part/PartThumbTable.tsx:209
|
||||||
msgid "Search..."
|
msgid "Search..."
|
||||||
msgstr "Otsing..."
|
msgstr "Otsing..."
|
||||||
|
|
@ -2153,6 +2155,7 @@ msgid "Loading"
|
||||||
msgstr "Laadimine"
|
msgstr "Laadimine"
|
||||||
|
|
||||||
#: src/components/forms/fields/RelatedModelField.tsx:540
|
#: src/components/forms/fields/RelatedModelField.tsx:540
|
||||||
|
#: src/components/nav/NavigationTree.tsx:403
|
||||||
msgid "No results found"
|
msgid "No results found"
|
||||||
msgstr "Tulemusi pole"
|
msgstr "Tulemusi pole"
|
||||||
|
|
||||||
|
|
@ -2247,7 +2250,7 @@ msgstr "Andmete töötlemine"
|
||||||
#: src/components/importer/ImporterColumnSelector.tsx:299
|
#: src/components/importer/ImporterColumnSelector.tsx:299
|
||||||
#: src/components/items/ErrorItem.tsx:12
|
#: src/components/items/ErrorItem.tsx:12
|
||||||
#: src/functions/api.tsx:60
|
#: src/functions/api.tsx:60
|
||||||
#: src/functions/auth.tsx:401
|
#: src/functions/auth.tsx:403
|
||||||
msgid "An error occurred"
|
msgid "An error occurred"
|
||||||
msgstr "Ilmnes viga"
|
msgstr "Ilmnes viga"
|
||||||
|
|
||||||
|
|
@ -2925,7 +2928,7 @@ msgstr "Logi välja"
|
||||||
#: src/pages/Index/Settings/SystemSettings.tsx:260
|
#: src/pages/Index/Settings/SystemSettings.tsx:260
|
||||||
#: src/pages/part/PartDetail.tsx:663
|
#: src/pages/part/PartDetail.tsx:663
|
||||||
#: src/pages/stock/LocationDetail.tsx:481
|
#: src/pages/stock/LocationDetail.tsx:481
|
||||||
#: src/pages/stock/LocationDetail.tsx:522
|
#: src/pages/stock/LocationDetail.tsx:523
|
||||||
#: src/pages/stock/StockDetail.tsx:689
|
#: src/pages/stock/StockDetail.tsx:689
|
||||||
#: src/pages/stock/TransferOrderDetail.tsx:536
|
#: src/pages/stock/TransferOrderDetail.tsx:536
|
||||||
#: src/tables/stock/StockItemTable.tsx:81
|
#: src/tables/stock/StockItemTable.tsx:81
|
||||||
|
|
@ -2971,7 +2974,11 @@ msgstr "Navigeerimine"
|
||||||
msgid "About"
|
msgid "About"
|
||||||
msgstr "Teave"
|
msgstr "Teave"
|
||||||
|
|
||||||
#: src/components/nav/NavigationTree.tsx:212
|
#: src/components/nav/NavigationTree.tsx:388
|
||||||
|
msgid "Clear search"
|
||||||
|
msgstr ""
|
||||||
|
|
||||||
|
#: src/components/nav/NavigationTree.tsx:399
|
||||||
msgid "Error loading navigation tree."
|
msgid "Error loading navigation tree."
|
||||||
msgstr ""
|
msgstr ""
|
||||||
|
|
||||||
|
|
@ -5539,7 +5546,7 @@ msgstr "Sisemise serveri viga"
|
||||||
#~ msgstr "You have been logged out"
|
#~ msgstr "You have been logged out"
|
||||||
|
|
||||||
#: src/functions/auth.tsx:124
|
#: src/functions/auth.tsx:124
|
||||||
#: src/functions/auth.tsx:220
|
#: src/functions/auth.tsx:222
|
||||||
msgid "Logged Out"
|
msgid "Logged Out"
|
||||||
msgstr ""
|
msgstr ""
|
||||||
|
|
||||||
|
|
@ -5551,97 +5558,97 @@ msgstr ""
|
||||||
#~ msgid "Found an existing login - using it to log you in."
|
#~ msgid "Found an existing login - using it to log you in."
|
||||||
#~ msgstr "Found an existing login - using it to log you in."
|
#~ msgstr "Found an existing login - using it to log you in."
|
||||||
|
|
||||||
#: src/functions/auth.tsx:143
|
|
||||||
msgid "No response from server."
|
|
||||||
msgstr ""
|
|
||||||
|
|
||||||
#: src/functions/auth.tsx:143
|
#: src/functions/auth.tsx:143
|
||||||
#~ msgid "Found an existing login - welcome back!"
|
#~ msgid "Found an existing login - welcome back!"
|
||||||
#~ msgstr "Found an existing login - welcome back!"
|
#~ msgstr "Found an existing login - welcome back!"
|
||||||
|
|
||||||
#: src/functions/auth.tsx:186
|
#: src/functions/auth.tsx:145
|
||||||
|
msgid "No response from server."
|
||||||
|
msgstr ""
|
||||||
|
|
||||||
|
#: src/functions/auth.tsx:188
|
||||||
msgid "MFA Login successful"
|
msgid "MFA Login successful"
|
||||||
msgstr ""
|
msgstr ""
|
||||||
|
|
||||||
#: src/functions/auth.tsx:187
|
#: src/functions/auth.tsx:189
|
||||||
msgid "MFA details were automatically provided in the browser"
|
msgid "MFA details were automatically provided in the browser"
|
||||||
msgstr ""
|
msgstr ""
|
||||||
|
|
||||||
#: src/functions/auth.tsx:221
|
#: src/functions/auth.tsx:223
|
||||||
msgid "Successfully logged out"
|
msgid "Successfully logged out"
|
||||||
msgstr "Edukalt välja logitud"
|
msgstr "Edukalt välja logitud"
|
||||||
|
|
||||||
#: src/functions/auth.tsx:288
|
#: src/functions/auth.tsx:290
|
||||||
msgid "Language changed"
|
msgid "Language changed"
|
||||||
msgstr "Keel on muudetud"
|
msgstr "Keel on muudetud"
|
||||||
|
|
||||||
#: src/functions/auth.tsx:289
|
#: src/functions/auth.tsx:291
|
||||||
msgid "Your active language has been changed to the one set in your profile"
|
msgid "Your active language has been changed to the one set in your profile"
|
||||||
msgstr ""
|
msgstr ""
|
||||||
|
|
||||||
#: src/functions/auth.tsx:310
|
#: src/functions/auth.tsx:312
|
||||||
msgid "Theme changed"
|
msgid "Theme changed"
|
||||||
msgstr "Teema on muudetud"
|
msgstr "Teema on muudetud"
|
||||||
|
|
||||||
#: src/functions/auth.tsx:311
|
#: src/functions/auth.tsx:313
|
||||||
msgid "Your active theme has been changed to the one set in your profile"
|
msgid "Your active theme has been changed to the one set in your profile"
|
||||||
msgstr ""
|
msgstr ""
|
||||||
|
|
||||||
#: src/functions/auth.tsx:346
|
#: src/functions/auth.tsx:348
|
||||||
msgid "Check your inbox for a reset link. This only works if you have an account. Check in spam too."
|
msgid "Check your inbox for a reset link. This only works if you have an account. Check in spam too."
|
||||||
msgstr "Kontrollige oma postkasti lähtestamise lingi jaoks. See toimib ainult siis, kui teil on konto. Vaadake ka rämpsposti."
|
msgstr "Kontrollige oma postkasti lähtestamise lingi jaoks. See toimib ainult siis, kui teil on konto. Vaadake ka rämpsposti."
|
||||||
|
|
||||||
#: src/functions/auth.tsx:353
|
#: src/functions/auth.tsx:355
|
||||||
#: src/functions/auth.tsx:617
|
#: src/functions/auth.tsx:619
|
||||||
msgid "Reset failed"
|
msgid "Reset failed"
|
||||||
msgstr ""
|
msgstr ""
|
||||||
|
|
||||||
#: src/functions/auth.tsx:380
|
#: src/functions/auth.tsx:382
|
||||||
msgid "Already logged in"
|
msgid "Already logged in"
|
||||||
msgstr ""
|
msgstr ""
|
||||||
|
|
||||||
#: src/functions/auth.tsx:381
|
#: src/functions/auth.tsx:383
|
||||||
msgid "There is a conflicting session on the server for this browser. Please logout of that first."
|
msgid "There is a conflicting session on the server for this browser. Please logout of that first."
|
||||||
msgstr ""
|
msgstr ""
|
||||||
|
|
||||||
#: src/functions/auth.tsx:437
|
#: src/functions/auth.tsx:439
|
||||||
msgid "Logged In"
|
msgid "Logged In"
|
||||||
msgstr ""
|
msgstr ""
|
||||||
|
|
||||||
#: src/functions/auth.tsx:438
|
#: src/functions/auth.tsx:440
|
||||||
msgid "Successfully logged in"
|
msgid "Successfully logged in"
|
||||||
msgstr ""
|
msgstr ""
|
||||||
|
|
||||||
#: src/functions/auth.tsx:572
|
#: src/functions/auth.tsx:574
|
||||||
msgid "Failed to set up MFA"
|
msgid "Failed to set up MFA"
|
||||||
msgstr ""
|
msgstr ""
|
||||||
|
|
||||||
#: src/functions/auth.tsx:591
|
#: src/functions/auth.tsx:593
|
||||||
msgid "MFA Setup successful"
|
msgid "MFA Setup successful"
|
||||||
msgstr ""
|
msgstr ""
|
||||||
|
|
||||||
#: src/functions/auth.tsx:592
|
#: src/functions/auth.tsx:594
|
||||||
msgid "MFA via TOTP has been set up successfully; you will need to login again."
|
msgid "MFA via TOTP has been set up successfully; you will need to login again."
|
||||||
msgstr ""
|
msgstr ""
|
||||||
|
|
||||||
#: src/functions/auth.tsx:607
|
#: src/functions/auth.tsx:609
|
||||||
msgid "Password set"
|
msgid "Password set"
|
||||||
msgstr ""
|
msgstr ""
|
||||||
|
|
||||||
#: src/functions/auth.tsx:608
|
#: src/functions/auth.tsx:610
|
||||||
#: src/functions/auth.tsx:717
|
#: src/functions/auth.tsx:719
|
||||||
msgid "The password was set successfully. You can now login with your new password"
|
msgid "The password was set successfully. You can now login with your new password"
|
||||||
msgstr "Parool määrati edukalt. Nüüd saate sisse logida oma uue parooliga"
|
msgstr "Parool määrati edukalt. Nüüd saate sisse logida oma uue parooliga"
|
||||||
|
|
||||||
#: src/functions/auth.tsx:682
|
#: src/functions/auth.tsx:684
|
||||||
msgid "Password could not be changed"
|
msgid "Password could not be changed"
|
||||||
msgstr ""
|
msgstr ""
|
||||||
|
|
||||||
#: src/functions/auth.tsx:700
|
#: src/functions/auth.tsx:702
|
||||||
msgid "The two password fields didn’t match"
|
msgid "The two password fields didn’t match"
|
||||||
msgstr ""
|
msgstr ""
|
||||||
|
|
||||||
#: src/functions/auth.tsx:716
|
#: src/functions/auth.tsx:718
|
||||||
msgid "Password Changed"
|
msgid "Password Changed"
|
||||||
msgstr "Parool on muudetud"
|
msgstr "Parool on muudetud"
|
||||||
|
|
||||||
|
|
@ -8347,11 +8354,11 @@ msgstr "Otsi seerianumbri järgi"
|
||||||
msgid "Part Actions"
|
msgid "Part Actions"
|
||||||
msgstr "Osa toimingud"
|
msgstr "Osa toimingud"
|
||||||
|
|
||||||
#: src/pages/part/PartDetail.tsx:1182
|
#: src/pages/part/PartDetail.tsx:1183
|
||||||
msgid "Part locked"
|
msgid "Part locked"
|
||||||
msgstr ""
|
msgstr ""
|
||||||
|
|
||||||
#: src/pages/part/PartDetail.tsx:1182
|
#: src/pages/part/PartDetail.tsx:1183
|
||||||
msgid "Part unlocked"
|
msgid "Part unlocked"
|
||||||
msgstr ""
|
msgstr ""
|
||||||
|
|
||||||
|
|
|
||||||
Some files were not shown because too many files have changed in this diff Show More
Loading…
Reference in New Issue