Compare commits

..

3 Commits

Author SHA1 Message Date
copilot-swe-agent[bot]
3d33b2c725 Fix element types list in synonym documentation
Co-authored-by: jbtronics <5410681+jbtronics@users.noreply.github.com>
2025-12-06 22:45:35 +00:00
copilot-swe-agent[bot]
9629e849b9 Add comprehensive documentation for IPN generation and synonym system
Co-authored-by: jbtronics <5410681+jbtronics@users.noreply.github.com>
2025-12-06 22:43:09 +00:00
copilot-swe-agent[bot]
ca246c5e80 Initial plan 2025-12-06 22:34:25 +00:00
30 changed files with 1915 additions and 1568 deletions

View File

@@ -26,28 +26,6 @@ if [ "$1" = 'frankenphp' ] || [ "$1" = 'php' ] || [ "$1" = 'bin/console' ]; then
composer install --prefer-dist --no-progress --no-interaction
fi
# Install additional composer packages if COMPOSER_EXTRA_PACKAGES is set
if [ -n "$COMPOSER_EXTRA_PACKAGES" ]; then
echo "Installing additional composer packages: $COMPOSER_EXTRA_PACKAGES"
# Note: COMPOSER_EXTRA_PACKAGES is intentionally not quoted to allow word splitting
# This enables passing multiple package names separated by spaces
# shellcheck disable=SC2086
composer require $COMPOSER_EXTRA_PACKAGES --no-install --no-interaction --no-progress
if [ $? -eq 0 ]; then
echo "Running composer install to install packages without dev dependencies..."
composer install --no-dev --no-interaction --no-progress --optimize-autoloader
if [ $? -eq 0 ]; then
echo "Successfully installed additional composer packages"
else
echo "Failed to install composer dependencies"
exit 1
fi
else
echo "Failed to add additional composer packages to composer.json"
exit 1
fi
fi
if grep -q ^DATABASE_URL= .env; then
echo "Waiting for database to be ready..."
ATTEMPTS_LEFT_TO_REACH_DATABASE=60

View File

@@ -39,28 +39,6 @@ if [ -d /var/www/html/var/db ]; then
fi
fi
# Install additional composer packages if COMPOSER_EXTRA_PACKAGES is set
if [ -n "$COMPOSER_EXTRA_PACKAGES" ]; then
echo "Installing additional composer packages: $COMPOSER_EXTRA_PACKAGES"
# Note: COMPOSER_EXTRA_PACKAGES is intentionally not quoted to allow word splitting
# This enables passing multiple package names separated by spaces
# shellcheck disable=SC2086
sudo -E -u www-data composer require $COMPOSER_EXTRA_PACKAGES --no-install --no-interaction --no-progress
if [ $? -eq 0 ]; then
echo "Running composer install to install packages without dev dependencies..."
sudo -E -u www-data composer install --no-dev --no-interaction --no-progress --optimize-autoloader
if [ $? -eq 0 ]; then
echo "Successfully installed additional composer packages"
else
echo "Failed to install composer dependencies"
exit 1
fi
else
echo "Failed to add additional composer packages to composer.json"
exit 1
fi
fi
# Start PHP-FPM (the PHP_VERSION is replaced by the configured version in the Dockerfile)
php-fpmPHP_VERSION -F &

612
composer.lock generated

File diff suppressed because it is too large Load Diff

View File

@@ -474,7 +474,7 @@ namespace Symfony\Component\DependencyInjection\Loader\Configurator;
* max_host_connections?: int, // The maximum number of connections to a single host.
* default_options?: array{
* headers?: array<string, mixed>,
* vars?: array<string, mixed>,
* vars?: list<mixed>,
* max_redirects?: int, // The maximum number of redirects to follow.
* http_version?: scalar|null, // The default HTTP version, typically 1.1 or 2.0, leave to null for the best version.
* resolve?: array<string, scalar|null>,
@@ -497,7 +497,7 @@ namespace Symfony\Component\DependencyInjection\Loader\Configurator;
* md5?: mixed,
* },
* crypto_method?: scalar|null, // The minimum version of TLS to accept; must be one of STREAM_CRYPTO_METHOD_TLSv*_CLIENT constants.
* extra?: array<string, mixed>,
* extra?: list<mixed>,
* rate_limiter?: scalar|null, // Rate limiter name to use for throttling requests. // Default: null
* caching?: bool|array{ // Caching configuration.
* enabled?: bool, // Default: false
@@ -550,7 +550,7 @@ namespace Symfony\Component\DependencyInjection\Loader\Configurator;
* md5?: mixed,
* },
* crypto_method?: scalar|null, // The minimum version of TLS to accept; must be one of STREAM_CRYPTO_METHOD_TLSv*_CLIENT constants.
* extra?: array<string, mixed>,
* extra?: list<mixed>,
* rate_limiter?: scalar|null, // Rate limiter name to use for throttling requests. // Default: null
* caching?: bool|array{ // Caching configuration.
* enabled?: bool, // Default: false
@@ -1677,12 +1677,6 @@ namespace Symfony\Component\DependencyInjection\Loader\Configurator;
* post_processors?: array<string, array<string, mixed>>,
* },
* }
* @psalm-type DamaDoctrineTestConfig = array{
* enable_static_connection?: mixed, // Default: true
* enable_static_meta_data_cache?: bool, // Default: true
* enable_static_query_cache?: bool, // Default: true
* connection_keys?: list<mixed>,
* }
* @psalm-type TwigExtraConfig = array{
* cache?: bool|array{
* enabled?: bool, // Default: false
@@ -2250,9 +2244,9 @@ namespace Symfony\Component\DependencyInjection\Loader\Configurator;
* destinationStrictlyMatches?: bool,
* allowRepeatAttributeName?: bool,
* rejectUnsolicitedResponsesWithInResponseTo?: bool,
* signatureAlgorithm?: "http://www.w3.org/2000/09/xmldsig#rsa-sha1"|"http://www.w3.org/2000/09/xmldsig#dsa-sha1"|"http://www.w3.org/2001/04/xmldsig-more#rsa-sha256"|"http://www.w3.org/2001/04/xmldsig-more#rsa-sha384"|"http://www.w3.org/2001/04/xmldsig-more#rsa-sha512",
* digestAlgorithm?: "http://www.w3.org/2000/09/xmldsig#sha1"|"http://www.w3.org/2001/04/xmlenc#sha256"|"http://www.w3.org/2001/04/xmldsig-more#sha384"|"http://www.w3.org/2001/04/xmlenc#sha512",
* encryption_algorithm?: "http://www.w3.org/2001/04/xmlenc#tripledes-cbc"|"http://www.w3.org/2001/04/xmlenc#aes128-cbc"|"http://www.w3.org/2001/04/xmlenc#aes192-cbc"|"http://www.w3.org/2001/04/xmlenc#aes256-cbc"|"http://www.w3.org/2009/xmlenc11#aes128-gcm"|"http://www.w3.org/2009/xmlenc11#aes192-gcm"|"http://www.w3.org/2009/xmlenc11#aes256-gcm",
* signatureAlgorithm?: "http:\/\/www.w3.org\/2000\/09\/xmldsig#rsa-sha1"|"http:\/\/www.w3.org\/2000\/09\/xmldsig#dsa-sha1"|"http:\/\/www.w3.org\/2001\/04\/xmldsig-more#rsa-sha256"|"http:\/\/www.w3.org\/2001\/04\/xmldsig-more#rsa-sha384"|"http:\/\/www.w3.org\/2001\/04\/xmldsig-more#rsa-sha512",
* digestAlgorithm?: "http:\/\/www.w3.org\/2000\/09\/xmldsig#sha1"|"http:\/\/www.w3.org\/2001\/04\/xmlenc#sha256"|"http:\/\/www.w3.org\/2001\/04\/xmldsig-more#sha384"|"http:\/\/www.w3.org\/2001\/04\/xmlenc#sha512",
* encryption_algorithm?: "http:\/\/www.w3.org\/2001\/04\/xmlenc#tripledes-cbc"|"http:\/\/www.w3.org\/2001\/04\/xmlenc#aes128-cbc"|"http:\/\/www.w3.org\/2001\/04\/xmlenc#aes192-cbc"|"http:\/\/www.w3.org\/2001\/04\/xmlenc#aes256-cbc"|"http:\/\/www.w3.org\/2009\/xmlenc11#aes128-gcm"|"http:\/\/www.w3.org\/2009\/xmlenc11#aes192-gcm"|"http:\/\/www.w3.org\/2009\/xmlenc11#aes256-gcm",
* lowercaseUrlencoding?: bool,
* },
* contactPerson?: array{
@@ -2640,6 +2634,12 @@ namespace Symfony\Component\DependencyInjection\Loader\Configurator;
* ...<mixed>
* },
* }
* @psalm-type DamaDoctrineTestConfig = array{
* enable_static_connection?: mixed, // Default: true
* enable_static_meta_data_cache?: bool, // Default: true
* enable_static_query_cache?: bool, // Default: true
* connection_keys?: list<mixed>,
* }
* @psalm-type ConfigType = array{
* imports?: ImportsConfig,
* parameters?: ParametersConfig,

View File

@@ -33,8 +33,8 @@ services:
App\:
resource: '../src/'
exclude:
- '../src/Entity/'
- '../src/Helpers/'
- '../src/DataFixtures/'
- '../src/Doctrine/Purger/'
# controllers are imported separately to make sure services can be injected
# as action arguments even if you don't extend any base controller class
@@ -274,12 +274,21 @@ services:
tags:
- { name: monolog.processor }
App\Doctrine\Purger\ResetAutoIncrementPurgerFactory:
tags:
- { name: 'doctrine.fixtures.purger_factory', alias: 'reset_autoincrement_purger' }
when@test: &test
services:
App\DataFixtures\:
resource: '../src/DataFixtures/'
autoconfigure: true
autowire: true
App\Doctrine\Purger\:
resource: '../src/Doctrine/Purger/'
App\Doctrine\Purger\ResetAutoIncrementPurgerFactory:
tags:
- { name: 'doctrine.fixtures.purger_factory', alias: 'reset_autoincrement_purger' }
# Decorate the doctrine fixtures load command to use our custom purger by default
doctrine.fixtures_load_command.custom:
decorates: doctrine.fixtures_load_command
@@ -288,3 +297,6 @@ when@test: &test
- '@doctrine.fixtures.loader'
- '@doctrine'
- { default: '@App\Doctrine\Purger\DoNotUsePurgerFactory' }
when@dev:
*test

View File

@@ -50,7 +50,10 @@ A part entity has many fields, which can be used to describe it better. Most of
* **Mass**: The mass of a single piece of this part (so of a single transistor). Given in grams.
* **Internal Part Number** (IPN): Each part is automatically assigned a numerical ID that identifies a part in the
database. This ID depends on when a part was created and cannot be changed. If you want to assign your own unique
identifiers, or sync parts identifiers with the identifiers of another database, you can use this field.
identifiers, or sync parts identifiers with the identifiers of another database, you can use this field. Part-DB
can automatically suggest IPNs based on category prefixes and sequential numbering. See the
[IPN Generation documentation]({% link usage/ipn_generation.md %}) for detailed information on how to set up and use
this feature.
### Stock / Part lot

View File

@@ -27,6 +27,8 @@ It is installed on a web server and so can be accessed with any browser without
* Inventory management of your electronic parts. Each part can be assigned to a category, footprint, manufacturer,
and multiple store locations and price information. Parts can be grouped using tags. You can associate various files
like datasheets or pictures with the parts.
* Automatic Internal Part Number (IPN) generation with customizable prefixes and numbering schemes (see [IPN documentation]({% link usage/ipn_generation.md %}))
* Synonym system to customize terminology throughout the application (see [Synonyms documentation]({% link usage/synonyms.md %}))
* Multi-language support (currently German, English, Russian, Japanese, French, Czech, Danish, and Chinese)
* Barcodes/Labels generator for parts and storage locations, scan barcodes via webcam using the built-in barcode scanner
* User system with groups and detailed (fine-grained) permissions.

View File

@@ -15,75 +15,13 @@ To make emails work you have to properly configure a mail provider in Part-DB.
## Configuration
Part-DB uses [Symfony Mailer](https://symfony.com/doc/current/mailer.html) to send emails, which supports multiple
mail providers (like Mailgun, SendGrid, or Brevo). If you want to use one of these providers, check the Symfony
automatic mail providers (like MailChimp or SendGrid). If you want to use one of these providers, check the Symfony
Mailer documentation for more information.
We will only cover the configuration of an SMTP provider here, which is sufficient for most use-cases.
You will need an email account, which you can use to send emails from via password-based SMTP authentication, this account
should be dedicated to Part-DB.
### Using specialized mail providers (Mailgun, SendGrid, etc.)
If you want to use a specialized mail provider like Mailgun, SendGrid, Brevo (formerly Sendinblue), Amazon SES, or
Postmark instead of SMTP, you need to install the corresponding Symfony mailer package first.
#### Docker installation
If you are using Part-DB in Docker, you can install additional mailer packages by setting the `COMPOSER_EXTRA_PACKAGES`
environment variable in your `docker-compose.yaml`:
```yaml
environment:
- COMPOSER_EXTRA_PACKAGES=symfony/mailgun-mailer
- MAILER_DSN=mailgun+api://API_KEY:DOMAIN@default
- EMAIL_SENDER_EMAIL=noreply@yourdomain.com
- EMAIL_SENDER_NAME=Part-DB
- ALLOW_EMAIL_PW_RESET=1
```
You can install multiple packages by separating them with spaces:
```yaml
environment:
- COMPOSER_EXTRA_PACKAGES=symfony/mailgun-mailer symfony/sendgrid-mailer
```
The packages will be installed automatically when the container starts.
Common mailer packages:
- `symfony/mailgun-mailer` - For [Mailgun](https://www.mailgun.com/)
- `symfony/sendgrid-mailer` - For [SendGrid](https://sendgrid.com/)
- `symfony/brevo-mailer` - For [Brevo](https://www.brevo.com/) (formerly Sendinblue)
- `symfony/amazon-mailer` - For [Amazon SES](https://aws.amazon.com/ses/)
- `symfony/postmark-mailer` - For [Postmark](https://postmarkapp.com/)
#### Direct installation (non-Docker)
If you have installed Part-DB directly on your server (not in Docker), you need to manually install the required
mailer package using composer.
Navigate to your Part-DB installation directory and run:
```bash
# Install the package as the web server user
sudo -u www-data composer require symfony/mailgun-mailer
# Clear the cache
sudo -u www-data php bin/console cache:clear
```
Replace `symfony/mailgun-mailer` with the package you need. You can install multiple packages at once:
```bash
sudo -u www-data composer require symfony/mailgun-mailer symfony/sendgrid-mailer
```
After installing the package, configure the `MAILER_DSN` in your `.env.local` file according to the provider's
documentation (see [Symfony Mailer documentation](https://symfony.com/doc/current/mailer.html) for DSN format for
each provider).
## SMTP Configuration
To configure the SMTP provider, you have to set the following environment variables:
`MAILER_DSN`: You have to provide the SMTP server address and the credentials for the email account here. The format is

View File

@@ -80,11 +80,7 @@ services:
#- BANNER=This is a test banner<br>with a line break
# If you use a reverse proxy in front of Part-DB, you must configure the trusted proxies IP addresses here (see reverse proxy documentation for more information):
# - TRUSTED_PROXIES=127.0.0.0/8,::1,10.0.0.0/8,172.16.0.0/12,192.168.0.0/16
# If you need to install additional composer packages (e.g., for specific mailer transports), you can specify them here:
# The packages will be installed automatically when the container starts
# - COMPOSER_EXTRA_PACKAGES=symfony/mailgun-mailer symfony/sendgrid-mailer
# - TRUSTED_PROXIES=127.0.0.0/8,::1,10.0.0.0/8,172.16.0.0/12,192.168.0.0/16
```
4. Customize the settings by changing the environment variables (or adding new ones). See [Configuration]({% link
@@ -153,9 +149,6 @@ services:
# Override value if you want to show a given text on homepage.
# When this is commented out the webUI can be used to configure the banner
#- BANNER=This is a test banner<br>with a line break
# If you need to install additional composer packages (e.g., for specific mailer transports), you can specify them here:
# - COMPOSER_EXTRA_PACKAGES=symfony/mailgun-mailer symfony/sendgrid-mailer
database:
container_name: partdb_database
@@ -176,38 +169,6 @@ services:
```
### Installing additional composer packages
If you need to use specific mailer transports or other functionality that requires additional composer packages, you can
install them automatically at container startup using the `COMPOSER_EXTRA_PACKAGES` environment variable.
For example, if you want to use Mailgun as your email provider, you need to install the `symfony/mailgun-mailer` package.
Add the following to your docker-compose.yaml environment section:
```yaml
environment:
- COMPOSER_EXTRA_PACKAGES=symfony/mailgun-mailer
- MAILER_DSN=mailgun+api://API_KEY:DOMAIN@default
```
You can specify multiple packages by separating them with spaces:
```yaml
environment:
- COMPOSER_EXTRA_PACKAGES=symfony/mailgun-mailer symfony/sendgrid-mailer
```
{: .info }
> The packages will be installed when the container starts. This may increase the container startup time on the first run.
> The installed packages will persist in the container until it is recreated.
Common mailer packages you might need:
- `symfony/mailgun-mailer` - For Mailgun email service
- `symfony/sendgrid-mailer` - For SendGrid email service
- `symfony/brevo-mailer` - For Brevo (formerly Sendinblue) email service
- `symfony/amazon-mailer` - For Amazon SES email service
- `symfony/postmark-mailer` - For Postmark email service
### Update Part-DB
You can update Part-DB by pulling the latest image and restarting the container.

View File

@@ -50,21 +50,6 @@ docker-compose logs -f
Please include the error logs in your issue on GitHub, if you open an issue.
## KiCad Integration Issues
### "API responded with error code: 0: Unknown"
If you get this error when trying to connect KiCad to Part-DB, it is most likely caused by KiCad not trusting your SSL/TLS certificate.
**Cause:** KiCad does not trust self-signed SSL/TLS certificates.
**Solutions:**
- Use HTTP instead of HTTPS for the `root_url` in your KiCad library configuration (only recommended for local networks)
- Use a certificate from a trusted Certificate Authority (CA) like [Let's Encrypt](https://letsencrypt.org/)
- Add your self-signed certificate to the system's trusted certificate store on the computer running KiCad (the exact steps depend on your operating system)
For more information about KiCad integration, see the [EDA / KiCad integration](../usage/eda_integration.md) documentation.
## Report Issue
If an error occurs, or you found a bug, please [open an issue on GitHub](https://github.com/Part-DB/Part-DB-server).

View File

@@ -22,16 +22,6 @@ This also allows to configure available and usable parts and their properties in
Part-DB should be accessible from the PCs with KiCad. The URL should be stable (so no dynamically changing IP).
You require a user account in Part-DB, which has permission to access the Part-DB API and create API tokens. Every user can have their own account, or you set up a shared read-only account.
{: .warning }
> **HTTPS with Self-Signed Certificates**
>
> KiCad does not trust self-signed SSL/TLS certificates. If your Part-DB instance uses HTTPS with a self-signed certificate, KiCad will fail to connect and show an error like: `API responded with error code: 0: Unknown`.
>
> To resolve this issue, you have the following options:
> - Use HTTP instead of HTTPS for the `root_url` (only recommended for local networks)
> - Use a certificate from a trusted Certificate Authority (CA) like [Let's Encrypt](https://letsencrypt.org/)
> - Add your self-signed certificate to the system's trusted certificate store on the computer running KiCad (the exact steps depend on your operating system)
To connect KiCad with Part-DB do the following steps:
1. Create an API token on the user settings page for the KiCad application and copy/save it when it is shown. Currently, KiCad can only read the Part-DB database, so a token with a read-only scope is enough.

View File

@@ -0,0 +1,306 @@
---
title: Internal Part Number (IPN) Generation
layout: default
parent: Usage
nav_order: 12
---
# Internal Part Number (IPN) Generation
Part-DB supports automatic generation and management of Internal Part Numbers (IPNs) for your parts. IPNs are unique identifiers that help you organize and track your inventory in a structured way.
1. TOC
{:toc}
## What is an IPN?
An Internal Part Number (IPN) is a unique identifier assigned to each part in your inventory. Unlike manufacturer part numbers (MPNs), IPNs are defined and controlled by you, following your own naming conventions and organizational structure.
IPNs are useful for:
- Creating a consistent numbering scheme across your entire inventory
- Organizing parts hierarchically based on categories
- Quickly identifying and locating parts
- Generating barcodes for parts
- Integrating with external systems (like EDA tools)
## Basic Concepts
### IPN Structure
An IPN typically consists of several components:
- **Prefix**: Identifies the category or type of part (e.g., "RES" for resistors, "CAP" for capacitors)
- **Separator**: Divides different parts of the IPN (default is `-`)
- **Number**: A sequential number that makes the IPN unique
Example: `RES-0001`, `CAP-IC-0042`, `MCU-ARM-1234`
### Category-Based IPN Prefixes
Categories in Part-DB can have their own IPN prefix. When creating a new part in a category, Part-DB can automatically suggest IPNs based on the category's prefix.
To set an IPN prefix for a category:
1. Navigate to the category edit page
2. Find the "Part IPN Prefix" field
3. Enter your desired prefix (e.g., "RES", "CAP", "IC")
### Hierarchical Prefixes
Part-DB supports hierarchical IPN generation based on parent categories. For example:
- Parent category "IC" with prefix "IC"
- Child category "Microcontrollers" with prefix "MCU"
- Generated IPN could be: `IC-MCU-0001`
This allows you to create deeply nested categorization schemes while maintaining clear IPNs.
## Configuring IPN Generation
You can configure IPN generation in the system settings under `Tools -> System -> Settings -> Miscellaneous -> IPN Suggest Settings`.
### Available Settings
#### Regex Pattern
Define a regular expression pattern that valid IPNs must match. This helps enforce consistency across your inventory.
Example: `^[A-Za-z0-9]{3,4}(?:-[A-Za-z0-9]{3,4})*-\d{4}$`
This pattern requires:
- 3-4 alphanumeric characters for prefixes
- Optional additional prefix groups separated by `-`
- Ending with a 4-digit number
#### Regex Help Text
Provide custom help text that explains your IPN format to users. This text is shown when users are creating or editing parts.
#### Auto-Append Suffix
When enabled, Part-DB automatically appends a suffix (`_1`, `_2`, etc.) to IPNs that would otherwise be duplicates. This prevents IPN collisions when multiple parts might generate the same IPN.
**Example:**
- First part: `RES-0001`
- Duplicate attempt: automatically becomes `RES-0001_1`
- Next duplicate: automatically becomes `RES-0001_2`
#### Suggest Part Digits
Defines how many digits should be used for the sequential part number (default: 4).
- 4 digits: `0001` to `9999`
- 6 digits: `000001` to `999999`
#### Use Duplicate Description
When enabled, Part-DB will suggest the same IPN for parts with identical descriptions. This is useful when you want to track variants of the same component with the same IPN scheme.
#### Fallback Prefix
The prefix to use when a category has no IPN prefix defined (default: `N.A.`). This ensures all parts can get an IPN suggestion even without category-specific prefixes.
#### Number Separator
The character that separates the prefix from the number (default: `-`).
Example: With separator `-`, you get `RES-0001`. With separator `.`, you get `RES.0001`.
#### Category Separator
The character that separates hierarchical category prefixes (default: `-`).
Example: With separator `-`, you get `IC-MCU-0001`. With separator `.`, you get `IC.MCU.0001`.
#### Global Prefix
An optional prefix that is prepended to all IPNs in your system. Useful if you want to distinguish your inventory from other systems.
Example: With global prefix `ACME`, IPNs become `ACME-RES-0001`, `ACME-CAP-0042`, etc.
## Using IPN Suggestions
### When Creating a New Part
When you create a new part, Part-DB provides IPN suggestions based on:
1. **Global Prefix** (if configured): Suggestions using your global prefix
2. **Description Matching** (if enabled): If another part has the same description, its IPN is suggested
3. **Direct Category Prefix**: The IPN prefix of the part's assigned category
4. **Hierarchical Prefixes**: IPNs combining parent category prefixes with the current category
Each suggestion includes:
- The suggested IPN
- A description of how it was generated
- An auto-incremented version (ending with the next available number)
### IPN Suggestion Types
#### Common Prefixes
These show just the prefix part without a number. Use these as a starting point to manually add your own number.
Example: `RES-` (you then type `RES-1234`)
#### Prefixes with Part Increment
These show complete IPNs with automatically incremented numbers. The system finds the highest existing number with that prefix and suggests the next one.
Example: If `RES-0001` through `RES-0005` exist, the system suggests `RES-0006`.
### Manual IPN Entry
You can always manually enter any IPN you want. If you've configured a regex pattern, Part-DB will validate your IPN against it and show an error if it doesn't match.
## IPN Uniqueness
IPNs must be unique across your entire Part-DB instance. Part-DB enforces this constraint:
- When manually entering an IPN, you'll see an error if it already exists
- When auto-append suffix is enabled, duplicate IPNs are automatically made unique
- Existing parts retain their IPNs even if you change their category
## IPNs in Labels and Barcodes
IPNs can be used in label templates through placeholders:
- `[[IPN]]` - The IPN as text
- `[[IPN_BARCODE_C39]]` - IPN as Code 39 barcode
- `[[IPN_BARCODE_C128]]` - IPN as Code 128 barcode
- `[[IPN_BARCODE_QR]]` - IPN as QR code
See the [Labels documentation]({% link usage/labels.md %}) for more information.
## IPNs in Barcode Scanning
Part-DB can scan barcodes containing IPNs to quickly find parts. When a barcode is scanned, Part-DB:
1. Attempts to parse it as an IPN
2. Searches for the part with that IPN
3. Displays the part information
This enables quick inventory operations using barcode scanners.
## IPNs in EDA Integration
When using Part-DB with EDA tools like KiCad, the IPN is automatically added to the component fields as "Part-DB IPN". This creates a direct link between your schematic components and your Part-DB inventory.
See the [EDA Integration documentation]({% link usage/eda_integration.md %}) for more information.
## Best Practices
### Choosing Prefixes
- **Keep them short**: 2-4 characters work well (e.g., "RES", "CAP", "IC")
- **Make them memorable**: Use abbreviations that are obvious (avoid "XYZ" or "ABC")
- **Be consistent**: Use the same style across all categories (all caps or all lowercase)
- **Avoid ambiguity**: Don't use similar prefixes like "IC" and "1C"
### Numbering Schemes
- **Pad with zeros**: Use leading zeros for cleaner sorting (0001, 0042 instead of 1, 42)
- **Leave room for growth**: If you have 50 parts now, use 4 digits (up to 9999) instead of 2
- **Don't encode information**: Let the prefix and category do the work, not the number
- **Sequential is fine**: You don't need gaps - 0001, 0002, 0003 is perfectly valid
### Hierarchical Categories
- **Limit depth**: 2-3 levels is usually sufficient (IC-MCU vs IC-MCU-ARM-STM32)
- **Balance specificity**: More levels = longer IPNs but more precise categorization
- **Consider searching**: Very specific categories are harder to search across
### Changing Your Scheme
- **Plan ahead**: Changing IPN schemes later is difficult
- **Document your convention**: Add your IPN format to your regex help text
- **Existing parts**: Don't feel obligated to renumber existing parts if you change schemes
- **Migration**: Use import/export to batch-update IPNs if needed
## Common Issues and Solutions
### "IPN already exists"
**Problem**: You're trying to use an IPN that's already assigned to another part.
**Solutions**:
- Choose a different number
- Enable "Auto-Append Suffix" to automatically handle duplicates
- Search for the existing part to see if it's a duplicate you should merge
### "IPN doesn't match regex pattern"
**Problem**: Your IPN doesn't follow the configured format.
**Solutions**:
- Check the regex help text to understand the expected format
- Contact your administrator if the regex is too restrictive
- Use the suggested IPNs which are guaranteed to match
### Suggestions not showing
**Problem**: IPN suggestions are empty or not appearing.
**Solutions**:
- Ensure the part has a category assigned
- Check that the category has an IPN prefix defined
- Verify that a fallback prefix is configured in settings
- Save the part first before getting suggestions (for new parts)
### Wrong prefix being suggested
**Problem**: Part-DB suggests an IPN with the wrong prefix.
**Solutions**:
- Check the part's category - suggestions are based on the assigned category
- Verify parent categories and their prefixes if using hierarchical structure
- Set the correct IPN prefix in the category settings
- Use manual entry with your desired prefix
## Example Scenarios
### Simple Electronic Components Inventory
**Setup**:
- Categories: Resistors, Capacitors, ICs, etc.
- Prefixes: RES, CAP, IC
- 4-digit numbering
**Results**:
- `RES-0001` - 10kΩ resistor
- `CAP-0001` - 100nF capacitor
- `IC-0001` - ATmega328
### Professional Lab with Detailed Categories
**Setup**:
- Hierarchical categories: Components > Passive > Resistors > Surface Mount
- Prefixes: COMP, PAS, RES, SMD
- Global prefix: LAB
- 6-digit numbering
**Results**:
- `LAB-COMP-PAS-RES-SMD-000001` - 0805 10kΩ resistor
- `LAB-COMP-PAS-CAP-SMD-000001` - 0805 100nF capacitor
### Makerspace with Mixed Inventory
**Setup**:
- Categories for electronics, mechanical parts, tools
- Simple prefixes: ELEC, MECH, TOOL
- Fallback prefix for miscellaneous: MISC
- 4-digit numbering
**Results**:
- `ELEC-0001` - Arduino Uno
- `MECH-0001` - M3 screw set
- `TOOL-0001` - Soldering iron
- `MISC-0001` - Cable ties
## Environment Variables
IPN settings can be configured via environment variables (useful for Docker deployments):
- `IPN_SUGGEST_REGEX` - Override the regex pattern
- `IPN_SUGGEST_REGEX_HELP` - Override the regex help text
- `IPN_AUTO_APPEND_SUFFIX` - Enable/disable auto-append suffix (boolean)
- `IPN_SUGGEST_PART_DIGITS` - Number of digits for part numbers (integer)
- `IPN_USE_DUPLICATE_DESCRIPTION` - Enable/disable duplicate description matching (boolean)
Example in docker-compose.yaml:
```yaml
environment:
IPN_SUGGEST_REGEX: "^[A-Z]{3}-\d{4}$"
IPN_AUTO_APPEND_SUFFIX: "true"
IPN_SUGGEST_PART_DIGITS: "4"
```
## Related Documentation
- [Getting Started]({% link usage/getting_started.md %}) - Initial setup guide
- [Concepts]({% link concepts.md %}) - Understanding Part-DB concepts
- [Labels]({% link usage/labels.md %}) - Using IPNs in labels
- [EDA Integration]({% link usage/eda_integration.md %}) - IPNs in electronic design tools

346
docs/usage/synonyms.md Normal file
View File

@@ -0,0 +1,346 @@
---
title: Synonym System
layout: default
parent: Usage
nav_order: 13
---
# Synonym System
Part-DB includes a powerful synonym system that allows you to customize the terminology used throughout the application. This is especially useful when using Part-DB in contexts other than electronics, or when you want to adapt the interface to your organization's specific vocabulary.
1. TOC
{:toc}
## What is the Synonym System?
The synonym system allows you to replace Part-DB's standard terminology with your own preferred terms. For example:
- Change "Part" to "Product", "Component", or "Item"
- Change "Category" to "Group", "Type", or "Class"
- Change "Manufacturer" to "Supplier", "Vendor", or "Brand"
These custom terms (synonyms) are applied throughout the user interface, making Part-DB feel more natural for your specific use case.
## Important Notes
{: .warning-title }
> Experimental Feature
>
> The synonym system is currently **experimental**. While it works in most places throughout Part-DB, there may be some locations where the default terms still appear. The synonym system is being continuously improved.
## Configuring Synonyms
To configure synonyms, you need administrator permissions:
1. Navigate to `Tools -> System -> Settings`
2. Find and click on "Synonyms" in the settings menu
3. You'll see the synonym configuration interface
### Adding a Synonym
To add a new synonym:
1. Click the "Add Entry" button in the synonym settings
2. Select the **Type** (element type) you want to create a synonym for
3. Select the **Language** for which the synonym applies
4. Enter the **Singular** form of your synonym
5. Enter the **Plural** form of your synonym
6. Click "Save" to apply the changes
### Available Element Types
You can create synonyms for the following element types:
| Element Type | Default Term (EN) | Example Use Cases |
|--------------------|-----------------------|-----------------------------------------------|
| **attachment** | Attachment | Document, File, Asset |
| **attachment_type**| Attachment Type | Document Type, File Category |
| **category** | Category | Group, Class, Type, Collection |
| **currency** | Currency | Monetary Unit, Money Type |
| **footprint** | Footprint | Package, Form Factor, Physical Type |
| **group** | Group | Team, Department, Role |
| **label_profile** | Label Profile | Label Template, Print Template |
| **manufacturer** | Manufacturer | Brand, Vendor, Supplier, Maker |
| **measurement_unit**| Measurement Unit | Unit of Measure, Unit, Measurement |
| **parameter** | Parameter | Specification, Property, Attribute |
| **part** | Part | Component, Item, Product, Article, SKU |
| **part_lot** | Part Lot | Stock Item, Inventory Item, Batch |
| **project** | Project | Assembly, Build, Work Order |
| **storage_location**| Storage Location | Warehouse, Bin, Location, Place |
| **supplier** | Supplier | Vendor, Distributor, Reseller |
| **user** | User | Member, Account, Person |
## How Synonyms Work
### Translation Mechanism
The synonym system works by integrating with Part-DB's translation system. When you define a synonym:
1. Part-DB creates translation placeholders for the element type
2. These placeholders are available in both capitalized and lowercase forms
3. The placeholders are used throughout the application where these terms appear
### Placeholder Format
Synonyms use special placeholders in translations:
- `[elementtype]` - Singular, lowercase (e.g., "part" → "item")
- `[Elementtype]` - Singular, capitalized (e.g., "Part" → "Item")
- `[[elementtype]]` - Plural, lowercase (e.g., "parts" → "items")
- `[[Elementtype]]` - Plural, capitalized (e.g., "Parts" → "Items")
### Language-Specific Synonyms
Synonyms are language-specific, meaning you can define different terms for different languages:
- English users see: "Component" and "Components"
- German users see: "Bauteil" and "Bauteile"
- French users see: "Composant" and "Composants"
This allows Part-DB to maintain proper multilingual support even with custom terminology.
## Use Cases and Examples
### Non-Electronics Inventory
**Scenario**: Using Part-DB for a library
**Synonyms**:
- Part → Book
- Category → Genre
- Manufacturer → Publisher
- Supplier → Distributor
- Storage Location → Shelf
**Result**: The interface now speaks library language: "Add a new Book", "Select a Genre", etc.
### Manufacturing Environment
**Scenario**: Managing production inventory
**Synonyms**:
- Part → Material
- Category → Material Type
- Part Lot → Batch
- Storage Location → Warehouse Zone
- Project → Assembly
**Result**: The interface uses manufacturing terminology: "Materials", "Batches", "Warehouse Zones", "Assemblies"
### Small Business Retail
**Scenario**: Managing store inventory
**Synonyms**:
- Part → Product
- Category → Department
- Manufacturer → Brand
- Supplier → Vendor
- Part Lot → Stock Item
- Storage Location → Store Location
**Result**: The interface matches retail terminology: "Products", "Departments", "Brands"
### Laboratory Setting
**Scenario**: Managing lab supplies and chemicals
**Synonyms**:
- Part → Reagent
- Category → Substance Type
- Manufacturer → Chemical Supplier
- Storage Location → Cabinet
- Part Lot → Bottle
**Result**: Lab-appropriate language: "Reagents", "Substance Types", "Cabinets"
### Educational Makerspace
**Scenario**: Managing shared tools and components
**Synonyms**:
- Part → Resource
- Category → Resource Type
- Storage Location → Area
- Project → Activity
- Part Lot → Available Unit
**Result**: Educational context: "Resources", "Resource Types", "Areas", "Activities"
## Managing Synonyms
### Editing Synonyms
To edit an existing synonym:
1. Find the synonym entry in the list
2. Modify the singular or plural form as needed
3. Click "Save" to apply changes
### Removing Synonyms
To remove a synonym:
1. Find the synonym entry in the list
2. Click the "Remove Entry" button (usually a trash icon)
3. Click "Save" to apply changes
After removal, Part-DB will revert to using the default term for that element type and language.
### Bulk Configuration
If you need to set up many synonyms at once (e.g., for a complete custom terminology set):
1. Define all your synonyms in the settings page
2. Each element type can have synonyms in multiple languages
3. Save once when all entries are configured
### Duplicate Prevention
The system prevents duplicate entries:
- You cannot have multiple synonyms for the same element type and language combination
- If you try to add a duplicate, you'll see a validation error
- Edit the existing entry instead of creating a new one
## Best Practices
### Consistency
- **Use consistent terminology**: If you change "Part" to "Product", consider changing "Part Lot" to "Product Item" or similar
- **Think holistically**: Consider how terms relate to each other in your domain
- **Test thoroughly**: Check various pages to ensure your terms make sense in context
### Singular and Plural Forms
- **Provide both forms**: Always define both singular and plural forms
- **Use proper grammar**: Ensure plurals are grammatically correct
- **Consider irregular plurals**: Some terms have non-standard plurals (e.g., "Box" → "Boxes", not "Boxs")
### Language Considerations
- **Match user expectations**: Use terms your users are familiar with in their language
- **Be culturally appropriate**: Some terms may have different connotations in different languages
- **Maintain professionalism**: Choose terms appropriate for your organizational context
### Planning Your Terminology
Before implementing synonyms:
1. **List all terms**: Identify which Part-DB terms don't fit your context
2. **Define replacements**: Decide on appropriate alternatives
3. **Check relationships**: Ensure related terms work together logically
4. **Get feedback**: Consult with users about proposed terminology
5. **Document decisions**: Keep a record of your synonym choices for future reference
## Limitations
### Not All Locations Covered
As an experimental feature, synonyms may not appear in:
- Some error messages
- Technical logs
- Email templates (depending on configuration)
- API responses
- Some administrative interfaces
The development team is working to expand synonym coverage.
### No Automatic Propagation
Synonyms only affect the user interface:
- Database values remain unchanged
- Export files use original terms
- API endpoints keep original names
- URLs and routes remain the same
### Performance Considerations
The synonym system:
- Caches translations for performance
- Minimal performance impact in normal usage
- Cache is automatically updated when synonyms change
## Technical Details
### Cache Management
Synonyms are cached for performance:
- Cache is automatically cleared when synonyms are saved
- No manual cache clearing needed
- Changes appear immediately after saving
### Translation Priority
When displaying text, Part-DB checks in this order:
1. Synonym (if defined for current language and element type)
2. Standard translation (from translation files)
3. Fallback to English default
### Environment Variables
Currently, synonyms can only be configured through the web interface. Future versions may support environment variable configuration.
## Troubleshooting
### Synonyms Not Appearing
**Problem**: You've configured synonyms but still see original terms.
**Solutions**:
- Clear your browser cache and reload the page
- Check that you've configured the synonym for the correct language
- Verify that you saved the settings after adding the synonym
- Remember this is an experimental feature - some locations may not be covered yet
### Inconsistent Terminology
**Problem**: Some pages show your synonym, others show the original term.
**Solutions**:
- This is expected behavior for the experimental feature
- Check if you've defined both singular and plural forms
- Report inconsistencies to help improve the system
### Wrong Language Displaying
**Problem**: Seeing synonyms from the wrong language.
**Solutions**:
- Check your user language preference in user settings
- Verify you've configured synonyms for the correct language code
- Ensure the language code matches exactly (e.g., "en" not "en_US")
### Synonyms Lost After Update
**Problem**: Synonyms disappeared after updating Part-DB.
**Solutions**:
- Check the settings page - they should still be there
- Database migrations preserve synonym settings
- If truly lost, restore from backup or reconfigure
## Future Enhancements
The synonym system is under active development. Planned improvements include:
- Coverage of more interface elements
- Synonym suggestions based on common use cases
- Import/export of synonym configurations
- Synonym templates for different industries
- More granular control over term usage
## Related Documentation
- [Getting Started]({% link usage/getting_started.md %}) - Initial Part-DB setup
- [Configuration]({% link configuration.md %}) - System configuration options
- [Concepts]({% link concepts.md %}) - Understanding Part-DB terminology
## Feedback
Since the synonym system is experimental, feedback is valuable:
- Report locations where synonyms don't appear
- Suggest new element types that should support synonyms
- Share your use cases to help improve the system
- Report bugs or unexpected behavior
You can provide feedback through:
- GitHub issues on the Part-DB repository
- Community forums and discussions
- Direct contact with the development team

View File

@@ -50,9 +50,9 @@ readonly class RegisterSynonymsAsTranslationParametersListener
$this->translator = $translator;
}
public function getSynonymPlaceholders(string $locale): array
public function getSynonymPlaceholders(): array
{
return $this->cache->get('partdb_synonym_placeholders' . '_' . $locale, function (ItemInterface $item) use ($locale) {
return $this->cache->get('partdb_synonym_placeholders', function (ItemInterface $item) {
$item->tag('synonyms');
@@ -62,12 +62,12 @@ readonly class RegisterSynonymsAsTranslationParametersListener
foreach (ElementTypes::cases() as $elementType) {
//Versions with capitalized first letter
$capitalized = ucfirst($elementType->value); //We have only ASCII element type values, so this is sufficient
$placeholders['[' . $capitalized . ']'] = $this->typeNameGenerator->typeLabel($elementType, $locale);
$placeholders['[[' . $capitalized . ']]'] = $this->typeNameGenerator->typeLabelPlural($elementType, $locale);
$placeholders['[' . $capitalized . ']'] = $this->typeNameGenerator->typeLabel($elementType);
$placeholders['[[' . $capitalized . ']]'] = $this->typeNameGenerator->typeLabelPlural($elementType);
//And we have lowercase versions for both
$placeholders['[' . $elementType->value . ']'] = mb_strtolower($this->typeNameGenerator->typeLabel($elementType, $locale));
$placeholders['[[' . $elementType->value . ']]'] = mb_strtolower($this->typeNameGenerator->typeLabelPlural($elementType, $locale));
$placeholders['[' . $elementType->value . ']'] = mb_strtolower($this->typeNameGenerator->typeLabel($elementType));
$placeholders['[[' . $elementType->value . ']]'] = mb_strtolower($this->typeNameGenerator->typeLabelPlural($elementType));
}
return $placeholders;
@@ -82,7 +82,7 @@ readonly class RegisterSynonymsAsTranslationParametersListener
}
//Register all placeholders for synonyms
$placeholders = $this->getSynonymPlaceholders($event->getRequest()->getLocale());
$placeholders = $this->getSynonymPlaceholders();
foreach ($placeholders as $key => $value) {
$this->translator->addGlobalParameter($key, $value);
}

View File

@@ -37,7 +37,7 @@ class RegisterSynonymsAsTranslationParametersTest extends KernelTestCase
public function testGetSynonymPlaceholders(): void
{
$placeholders = $this->listener->getSynonymPlaceholders('en');
$placeholders = $this->listener->getSynonymPlaceholders();
$this->assertIsArray($placeholders);
// Curly braces for lowercase versions

View File

@@ -13495,14 +13495,5 @@ Vezměte prosím na vědomí, že se nemůžete vydávat za uživatele se zakáz
<target>Uživatelé</target>
</segment>
</unit>
<unit id="MxKRRx_" name="datatable.datatable.lengthMenu">
<notes>
<note priority="1">Do not remove! Used for datatables rendering.</note>
</notes>
<segment state="translated">
<source>datatable.datatable.lengthMenu</source>
<target>_MENU_</target>
</segment>
</unit>
</file>
</xliff>
</xliff>

View File

@@ -12164,14 +12164,5 @@ Bemærk venligst, at du ikke kan kopiere fra deaktiveret bruger. Hvis du prøver
<target>Brugere</target>
</segment>
</unit>
<unit id="MxKRRx_" name="datatable.datatable.lengthMenu">
<notes>
<note priority="1">Do not remove! Used for datatables rendering.</note>
</notes>
<segment state="translated">
<source>datatable.datatable.lengthMenu</source>
<target>_MENU_</target>
</segment>
</unit>
</file>
</xliff>
</xliff>

View File

@@ -19,7 +19,7 @@
</notes>
<segment state="translated">
<source>attachment_type.edit</source>
<target>Bearbeite [Attachment_type]</target>
<target>Bearbeite Dateityp</target>
</segment>
</unit>
<unit id="wyou6GD" name="attachment_type.new">
@@ -29,7 +29,7 @@
</notes>
<segment state="translated">
<source>attachment_type.new</source>
<target>Neuer [Attachment_type]</target>
<target>Neuer Dateityp</target>
</segment>
</unit>
<unit id="JHaxw0a" name="category.labelp">
@@ -84,7 +84,7 @@
</notes>
<segment state="translated">
<source>category.edit</source>
<target>Bearbeite [Category]</target>
<target>Bearbeite Kategorie</target>
</segment>
</unit>
<unit id="6.rAXsX" name="category.new">
@@ -94,7 +94,7 @@
</notes>
<segment state="translated">
<source>category.new</source>
<target>Neue [Category]</target>
<target>Neue Kategorie</target>
</segment>
</unit>
<unit id="z1GMBc_" name="currency.caption">
@@ -134,7 +134,7 @@
</notes>
<segment state="translated">
<source>currency.edit</source>
<target>Bearbeite [Currency]</target>
<target>Bearbeite Währung</target>
</segment>
</unit>
<unit id="aTtTsUc" name="currency.new">
@@ -144,7 +144,7 @@
</notes>
<segment state="translated">
<source>currency.new</source>
<target>Neue [Currency]</target>
<target>Neue Währung</target>
</segment>
</unit>
<unit id="pe43jlV" name="project.edit">
@@ -154,7 +154,7 @@
</notes>
<segment state="translated">
<source>project.edit</source>
<target>Bearbeite [Project]</target>
<target>Bearbeite Projekt</target>
</segment>
</unit>
<unit id="sYgrSg9" name="project.new">
@@ -164,7 +164,7 @@
</notes>
<segment state="translated">
<source>project.new</source>
<target>Neues [Project]</target>
<target>Neues Projekt</target>
</segment>
</unit>
<unit id="eLrezdb" name="search.placeholder">
@@ -394,7 +394,7 @@
</notes>
<segment state="translated">
<source>footprint.edit</source>
<target>Bearbeite [Footprint]</target>
<target>Bearbeite Footprint</target>
</segment>
</unit>
<unit id="9RgpRoK" name="footprint.new">
@@ -404,7 +404,7 @@
</notes>
<segment state="translated">
<source>footprint.new</source>
<target>Neuer [Footprint]</target>
<target>Neuer Footprint</target>
</segment>
</unit>
<unit id="tvm4F9e" name="group.edit.caption">
@@ -436,7 +436,7 @@
</notes>
<segment state="translated">
<source>group.edit</source>
<target>Bearbeite [Group]</target>
<target>Bearbeite Gruppe</target>
</segment>
</unit>
<unit id="_RN3Wph" name="group.new">
@@ -446,7 +446,7 @@
</notes>
<segment state="translated">
<source>group.new</source>
<target>Neue [Group]</target>
<target>Neue Gruppe</target>
</segment>
</unit>
<unit id="jXqdnm_" name="label_profile.caption">
@@ -483,7 +483,7 @@
</notes>
<segment state="translated">
<source>label_profile.edit</source>
<target>Bearbeite [Label_profile]</target>
<target>Bearbeite Labelprofil</target>
</segment>
</unit>
<unit id="WkNFJjx" name="label_profile.new">
@@ -493,7 +493,7 @@
</notes>
<segment state="translated">
<source>label_profile.new</source>
<target>Neues [Label_profile]</target>
<target>Neues Labelprofil</target>
</segment>
</unit>
<unit id="r3pQ31P" name="manufacturer.caption">
@@ -514,7 +514,7 @@
</notes>
<segment state="translated">
<source>manufacturer.edit</source>
<target>Bearbeite [Manufacturer]</target>
<target>Bearbeite Hersteller</target>
</segment>
</unit>
<unit id="dRX_cvD" name="manufacturer.new">
@@ -524,7 +524,7 @@
</notes>
<segment state="translated">
<source>manufacturer.new</source>
<target>Neuer [Manufacturer]</target>
<target>Neuer Hersteller</target>
</segment>
</unit>
<unit id="3ra2AyY" name="measurement_unit.caption">
@@ -565,7 +565,7 @@
</notes>
<segment state="translated">
<source>storelocation.edit</source>
<target>Bearbeite [Storage_location]</target>
<target>Bearbeite Lagerort</target>
</segment>
</unit>
<unit id="am0iTCO" name="storelocation.new">
@@ -575,7 +575,7 @@
</notes>
<segment state="translated">
<source>storelocation.new</source>
<target>Neuer [Storage_location]</target>
<target>Neuer Lagerort</target>
</segment>
</unit>
<unit id="ozZU_B5" name="supplier.edit">
@@ -585,7 +585,7 @@
</notes>
<segment state="translated">
<source>supplier.edit</source>
<target>Bearbeite [Supplier]</target>
<target>Bearbeite Lieferant</target>
</segment>
</unit>
<unit id="b8jlkMd" name="supplier.new">
@@ -595,7 +595,7 @@
</notes>
<segment state="translated">
<source>supplier.new</source>
<target>Neuer [Supplier]</target>
<target>Neuer Lieferant</target>
</segment>
</unit>
<unit id="vX.dhjK" name="user.edit.caption">
@@ -737,7 +737,7 @@ Der Benutzer wird alle Zwei-Faktor-Authentifizierungmethoden neu einrichten müs
</notes>
<segment state="translated">
<source>user.edit</source>
<target>Bearbeite [User]</target>
<target>Bearbeite Benutzer</target>
</segment>
</unit>
<unit id="esEoaa_" name="user.new">
@@ -747,7 +747,7 @@ Der Benutzer wird alle Zwei-Faktor-Authentifizierungmethoden neu einrichten müs
</notes>
<segment state="translated">
<source>user.new</source>
<target>Neuer [User]</target>
<target>Neuer Benutzer</target>
</segment>
</unit>
<unit id="KqHffuc" name="attachment.delete">
@@ -1781,7 +1781,7 @@ Subelemente werden beim Löschen nach oben verschoben.</target>
</notes>
<segment state="translated">
<source>part.edit.title</source>
<target>Bearbeite [Part] %name%</target>
<target>Bearbeite Bauteil %name%</target>
</segment>
</unit>
<unit id="yFxHuAp" name="part.edit.card_title">
@@ -1942,7 +1942,7 @@ Subelemente werden beim Löschen nach oben verschoben.</target>
</notes>
<segment state="translated">
<source>part.new.card_title</source>
<target>Neues [Part] erstellen</target>
<target>Neues Bauteil erstellen</target>
</segment>
</unit>
<unit id="5TCcXwk" name="part_lot.delete">
@@ -3124,7 +3124,7 @@ Subelemente werden beim Löschen nach oben verschoben.</target>
</notes>
<segment state="translated">
<source>statistics.distinct_parts_count</source>
<target>Anzahl verschiedener [[Part]]</target>
<target>Anzahl verschiedener Bauteile</target>
</segment>
</unit>
<unit id="sIGqnJ0" name="statistics.parts_instock_sum">
@@ -3135,7 +3135,7 @@ Subelemente werden beim Löschen nach oben verschoben.</target>
</notes>
<segment state="translated">
<source>statistics.parts_instock_sum</source>
<target>Summe aller vorhandenen Bestände an [[Part]]</target>
<target>Summe aller vorhanden Bauteilebestände</target>
</segment>
</unit>
<unit id="uHmvfnI" name="statistics.parts_with_price">
@@ -3146,7 +3146,7 @@ Subelemente werden beim Löschen nach oben verschoben.</target>
</notes>
<segment state="translated">
<source>statistics.parts_with_price</source>
<target>[[Part]] mit Preisinformationen</target>
<target>Bauteile mit Preisinformationen</target>
</segment>
</unit>
<unit id="7x89_xL" name="statistics.categories_count">
@@ -3157,7 +3157,7 @@ Subelemente werden beim Löschen nach oben verschoben.</target>
</notes>
<segment state="translated">
<source>statistics.categories_count</source>
<target>Anzahl [[Category]]</target>
<target>Anzahl Kategorien</target>
</segment>
</unit>
<unit id="s0nLRjN" name="statistics.footprints_count">
@@ -3168,7 +3168,7 @@ Subelemente werden beim Löschen nach oben verschoben.</target>
</notes>
<segment state="translated">
<source>statistics.footprints_count</source>
<target>Anzahl [[Footprint]]</target>
<target>Anzahl Footprints</target>
</segment>
</unit>
<unit id="f0gHZzl" name="statistics.manufacturers_count">
@@ -3179,7 +3179,7 @@ Subelemente werden beim Löschen nach oben verschoben.</target>
</notes>
<segment state="translated">
<source>statistics.manufacturers_count</source>
<target>Anzahl [[Manufacturer]]</target>
<target>Anzahl Hersteller</target>
</segment>
</unit>
<unit id="_4rvCd3" name="statistics.storelocations_count">
@@ -3190,7 +3190,7 @@ Subelemente werden beim Löschen nach oben verschoben.</target>
</notes>
<segment state="translated">
<source>statistics.storelocations_count</source>
<target>Anzahl [[Storage_location]]</target>
<target>Anzahl Lagerorte</target>
</segment>
</unit>
<unit id="tzzUvrm" name="statistics.suppliers_count">
@@ -3201,7 +3201,7 @@ Subelemente werden beim Löschen nach oben verschoben.</target>
</notes>
<segment state="translated">
<source>statistics.suppliers_count</source>
<target>Anzahl [[Supplier]]</target>
<target>Anzahl Lieferanten</target>
</segment>
</unit>
<unit id="QEk.sHE" name="statistics.currencies_count">
@@ -3212,7 +3212,7 @@ Subelemente werden beim Löschen nach oben verschoben.</target>
</notes>
<segment state="translated">
<source>statistics.currencies_count</source>
<target>Anzahl [[Currency]]</target>
<target>Anzahl Währungen</target>
</segment>
</unit>
<unit id="MTCnGlN" name="statistics.measurement_units_count">
@@ -3223,7 +3223,7 @@ Subelemente werden beim Löschen nach oben verschoben.</target>
</notes>
<segment state="translated">
<source>statistics.measurement_units_count</source>
<target>Anzahl [[Measurement_unit]]</target>
<target>Anzahl Maßeinheiten</target>
</segment>
</unit>
<unit id="7sRXll2" name="statistics.devices_count">
@@ -3234,7 +3234,7 @@ Subelemente werden beim Löschen nach oben verschoben.</target>
</notes>
<segment state="translated">
<source>statistics.devices_count</source>
<target>Anzahl [[Project]]</target>
<target>Anzahl Baugruppen</target>
</segment>
</unit>
<unit id="2u7zTMF" name="statistics.attachment_types_count">
@@ -3245,7 +3245,7 @@ Subelemente werden beim Löschen nach oben verschoben.</target>
</notes>
<segment state="translated">
<source>statistics.attachment_types_count</source>
<target>Anzahl [[Attachment_type]]</target>
<target>Anzahl Anhangstypen</target>
</segment>
</unit>
<unit id="C0XsLQc" name="statistics.all_attachments_count">
@@ -6138,7 +6138,7 @@ Wenn Sie dies fehlerhafterweise gemacht haben oder ein Computer nicht mehr vertr
</notes>
<segment state="translated">
<source>tree.tools.edit.attachment_types</source>
<target>[[Attachment_type]]</target>
<target>Dateitypen</target>
</segment>
</unit>
<unit id="u8jQbAc" name="tree.tools.edit.categories">
@@ -6149,7 +6149,7 @@ Wenn Sie dies fehlerhafterweise gemacht haben oder ein Computer nicht mehr vertr
</notes>
<segment state="translated">
<source>tree.tools.edit.categories</source>
<target>[[Category]]</target>
<target>Kategorien</target>
</segment>
</unit>
<unit id="3n2K_az" name="tree.tools.edit.projects">
@@ -6160,7 +6160,7 @@ Wenn Sie dies fehlerhafterweise gemacht haben oder ein Computer nicht mehr vertr
</notes>
<segment state="translated">
<source>tree.tools.edit.projects</source>
<target>[[Project]]</target>
<target>Projekte</target>
</segment>
</unit>
<unit id="raK7qaK" name="tree.tools.edit.suppliers">
@@ -6171,7 +6171,7 @@ Wenn Sie dies fehlerhafterweise gemacht haben oder ein Computer nicht mehr vertr
</notes>
<segment state="translated">
<source>tree.tools.edit.suppliers</source>
<target>[[Supplier]]</target>
<target>Lieferanten</target>
</segment>
</unit>
<unit id="1IJ48Y0" name="tree.tools.edit.manufacturer">
@@ -6182,7 +6182,7 @@ Wenn Sie dies fehlerhafterweise gemacht haben oder ein Computer nicht mehr vertr
</notes>
<segment state="translated">
<source>tree.tools.edit.manufacturer</source>
<target>[[Manufacturer]]</target>
<target>Hersteller</target>
</segment>
</unit>
<unit id="GNbWH_O" name="tree.tools.edit.storelocation">
@@ -6192,7 +6192,7 @@ Wenn Sie dies fehlerhafterweise gemacht haben oder ein Computer nicht mehr vertr
</notes>
<segment state="translated">
<source>tree.tools.edit.storelocation</source>
<target>[[Storage_location]]</target>
<target>Lagerorte</target>
</segment>
</unit>
<unit id="7ZOhkd." name="tree.tools.edit.footprint">
@@ -6202,7 +6202,7 @@ Wenn Sie dies fehlerhafterweise gemacht haben oder ein Computer nicht mehr vertr
</notes>
<segment state="translated">
<source>tree.tools.edit.footprint</source>
<target>[[Footprint]]</target>
<target>Footprints</target>
</segment>
</unit>
<unit id="U1zYjzD" name="tree.tools.edit.currency">
@@ -6212,7 +6212,7 @@ Wenn Sie dies fehlerhafterweise gemacht haben oder ein Computer nicht mehr vertr
</notes>
<segment state="translated">
<source>tree.tools.edit.currency</source>
<target>[[Currency]]</target>
<target>Währungen</target>
</segment>
</unit>
<unit id="NnzEujm" name="tree.tools.edit.measurement_unit">
@@ -6222,13 +6222,13 @@ Wenn Sie dies fehlerhafterweise gemacht haben oder ein Computer nicht mehr vertr
</notes>
<segment state="translated">
<source>tree.tools.edit.measurement_unit</source>
<target>[[Measurement_unit]]</target>
<target>Maßeinheiten</target>
</segment>
</unit>
<unit id="5adacKb" name="tree.tools.edit.part_custom_state">
<segment state="translated">
<source>tree.tools.edit.part_custom_state</source>
<target>[[Part_custom_state]]</target>
<target>Benutzerdefinierter Bauteilstatus</target>
</segment>
</unit>
<unit id=".Ux4R3T" name="tree.tools.edit.label_profile">
@@ -6237,7 +6237,7 @@ Wenn Sie dies fehlerhafterweise gemacht haben oder ein Computer nicht mehr vertr
</notes>
<segment state="translated">
<source>tree.tools.edit.label_profile</source>
<target>[[Label_profile]]</target>
<target>Labelprofil</target>
</segment>
</unit>
<unit id="eyvi0Zt" name="tree.tools.edit.part">
@@ -6247,7 +6247,7 @@ Wenn Sie dies fehlerhafterweise gemacht haben oder ein Computer nicht mehr vertr
</notes>
<segment state="translated">
<source>tree.tools.edit.part</source>
<target>Neues [Part]</target>
<target>Neues Bauteil</target>
</segment>
</unit>
<unit id="nIHj_yk" name="tree.tools.show.all_parts">
@@ -6289,7 +6289,7 @@ Wenn Sie dies fehlerhafterweise gemacht haben oder ein Computer nicht mehr vertr
</notes>
<segment state="translated">
<source>tree.tools.system.users</source>
<target>[[User]]</target>
<target>Benutzer</target>
</segment>
</unit>
<unit id="dTEQQ3T" name="tree.tools.system.groups">
@@ -6299,7 +6299,7 @@ Wenn Sie dies fehlerhafterweise gemacht haben oder ein Computer nicht mehr vertr
</notes>
<segment state="translated">
<source>tree.tools.system.groups</source>
<target>[[Group]]</target>
<target>Gruppen</target>
</segment>
</unit>
<unit id="NWWki1R" name="tree.tools.system.event_log">
@@ -11013,25 +11013,25 @@ Element 1 -&gt; Element 1.2</target>
<unit id="r5F3f_G" name="measurement_unit.new">
<segment state="translated">
<source>measurement_unit.new</source>
<target>Neue [Measurement_unit]</target>
<target>Neue Maßeinheit</target>
</segment>
</unit>
<unit id="W.vDRLw" name="measurement_unit.edit">
<segment state="translated">
<source>measurement_unit.edit</source>
<target>Bearbeite [Measurement_unit]</target>
<target>Bearbeite Maßeinheit</target>
</segment>
</unit>
<unit id="ba52d.g" name="part_custom_state.new">
<segment state="translated">
<source>part_custom_state.new</source>
<target>Neuer [Part_custom_state]</target>
<target>Neuer benutzerdefinierter Bauteilstatus</target>
</segment>
</unit>
<unit id="c1.gb2d" name="part_custom_state.edit">
<segment state="translated">
<source>part_custom_state.edit</source>
<target>Bearbeite [Part_custom_state]</target>
<target>Bearbeite benutzerdefinierten Bauteilstatus</target>
</segment>
</unit>
<unit id="uW2WHHC" name="user.aboutMe.label">
@@ -14429,14 +14429,5 @@ Bitte beachten Sie, dass dieses System derzeit experimentell ist und die hier de
<target>Wenn aktiviert, wird eine Option zur Generierung einer IPN mit diesem globalen Präfix angeboten, das für Bauteile in allen Kategorien gilt.</target>
</segment>
</unit>
<unit id="MxKRRx_" name="datatable.datatable.lengthMenu">
<notes>
<note priority="1">Do not remove! Used for datatables rendering.</note>
</notes>
<segment state="translated">
<source>datatable.datatable.lengthMenu</source>
<target>_MENU_</target>
</segment>
</unit>
</file>
</xliff>
</xliff>

View File

@@ -1638,14 +1638,5 @@
<target>Κατασκευαστές</target>
</segment>
</unit>
<unit id="MxKRRx_" name="datatable.datatable.lengthMenu">
<notes>
<note priority="1">Do not remove! Used for datatables rendering.</note>
</notes>
<segment state="translated">
<source>datatable.datatable.lengthMenu</source>
<target>_MENU_</target>
</segment>
</unit>
</file>
</xliff>
</xliff>

View File

@@ -19,7 +19,7 @@
</notes>
<segment state="translated">
<source>attachment_type.edit</source>
<target>Edit [attachment_type]</target>
<target>Edit file type</target>
</segment>
</unit>
<unit id="wyou6GD" name="attachment_type.new">
@@ -29,7 +29,7 @@
</notes>
<segment state="translated">
<source>attachment_type.new</source>
<target>New [attachment_type]</target>
<target>New file type</target>
</segment>
</unit>
<unit id="JHaxw0a" name="category.labelp">
@@ -84,7 +84,7 @@
</notes>
<segment state="translated">
<source>category.edit</source>
<target>Edit [category]</target>
<target>Edit category</target>
</segment>
</unit>
<unit id="6.rAXsX" name="category.new">
@@ -94,7 +94,7 @@
</notes>
<segment state="translated">
<source>category.new</source>
<target>New [category]</target>
<target>New category</target>
</segment>
</unit>
<unit id="KSFhj_3" name="currency.iso_code.caption">
@@ -124,7 +124,7 @@
</notes>
<segment state="translated">
<source>currency.edit</source>
<target>Edit [currency]</target>
<target>Edit currency</target>
</segment>
</unit>
<unit id="aTtTsUc" name="currency.new">
@@ -134,7 +134,7 @@
</notes>
<segment state="translated">
<source>currency.new</source>
<target>New [currency]</target>
<target>New currency</target>
</segment>
</unit>
<unit id="pe43jlV" name="project.edit">
@@ -144,7 +144,7 @@
</notes>
<segment state="translated">
<source>project.edit</source>
<target>Edit [project]</target>
<target>Edit project</target>
</segment>
</unit>
<unit id="sYgrSg9" name="project.new">
@@ -154,7 +154,7 @@
</notes>
<segment state="translated">
<source>project.new</source>
<target>New [project]</target>
<target>New project</target>
</segment>
</unit>
<unit id="eLrezdb" name="search.placeholder">
@@ -384,7 +384,7 @@
</notes>
<segment state="translated">
<source>footprint.edit</source>
<target>Edit [footprint]</target>
<target>Edit footprint</target>
</segment>
</unit>
<unit id="9RgpRoK" name="footprint.new">
@@ -394,7 +394,7 @@
</notes>
<segment state="translated">
<source>footprint.new</source>
<target>New [footprint]</target>
<target>New footprint</target>
</segment>
</unit>
<unit id="m27aWeR" name="user.edit.permissions">
@@ -416,7 +416,7 @@
</notes>
<segment state="translated">
<source>group.edit</source>
<target>Edit [group]</target>
<target>Edit group</target>
</segment>
</unit>
<unit id="_RN3Wph" name="group.new">
@@ -426,7 +426,7 @@
</notes>
<segment state="translated">
<source>group.new</source>
<target>New [group]</target>
<target>New group</target>
</segment>
</unit>
<unit id="GgwITAf" name="label_profile.advanced">
@@ -454,7 +454,7 @@
</notes>
<segment state="translated">
<source>label_profile.edit</source>
<target>Edit [label_profile]</target>
<target>Edit label profile</target>
</segment>
</unit>
<unit id="WkNFJjx" name="label_profile.new">
@@ -464,7 +464,7 @@
</notes>
<segment state="translated">
<source>label_profile.new</source>
<target>New [label_profile]</target>
<target>New label profile</target>
</segment>
</unit>
<unit id="AVQBOWW" name="manufacturer.edit">
@@ -474,7 +474,7 @@
</notes>
<segment state="translated">
<source>manufacturer.edit</source>
<target>Edit [manufacturer]</target>
<target>Edit manufacturer</target>
</segment>
</unit>
<unit id="dRX_cvD" name="manufacturer.new">
@@ -484,7 +484,7 @@
</notes>
<segment state="translated">
<source>manufacturer.new</source>
<target>New [manufacturer]</target>
<target>New manufacturer</target>
</segment>
</unit>
<unit id="crdkzlg" name="storelocation.labelp">
@@ -509,7 +509,7 @@
</notes>
<segment state="translated">
<source>storelocation.edit</source>
<target>Edit [storage_location]</target>
<target>Edit storage location</target>
</segment>
</unit>
<unit id="am0iTCO" name="storelocation.new">
@@ -519,7 +519,7 @@
</notes>
<segment state="translated">
<source>storelocation.new</source>
<target>New [storage_location]</target>
<target>New storage location</target>
</segment>
</unit>
<unit id="ozZU_B5" name="supplier.edit">
@@ -529,7 +529,7 @@
</notes>
<segment state="translated">
<source>supplier.edit</source>
<target>Edit [supplier]</target>
<target>Edit supplier</target>
</segment>
</unit>
<unit id="b8jlkMd" name="supplier.new">
@@ -539,7 +539,7 @@
</notes>
<segment state="translated">
<source>supplier.new</source>
<target>New [supplier]</target>
<target>New supplier</target>
</segment>
</unit>
<unit id="Ux8wVuF" name="user.edit.configuration">
@@ -672,7 +672,7 @@ The user will have to set up all two-factor authentication methods again and pri
</notes>
<segment state="translated">
<source>user.edit</source>
<target>Edit [user]</target>
<target>Edit user</target>
</segment>
</unit>
<unit id="esEoaa_" name="user.new">
@@ -682,7 +682,7 @@ The user will have to set up all two-factor authentication methods again and pri
</notes>
<segment state="translated">
<source>user.new</source>
<target>New [user]</target>
<target>New user</target>
</segment>
</unit>
<unit id="KqHffuc" name="attachment.delete">
@@ -1002,7 +1002,7 @@ Sub elements will be moved upwards.</target>
</notes>
<segment state="translated">
<source>entity.info.parts_count</source>
<target>Number of [[part]] with this element</target>
<target>Number of parts with this element</target>
</segment>
</unit>
<unit id="o0XIi58" name="specifications.property">
@@ -1716,7 +1716,7 @@ Sub elements will be moved upwards.</target>
</notes>
<segment state="translated">
<source>part.edit.title</source>
<target>Edit [part]</target>
<target>Edit part</target>
</segment>
</unit>
<unit id="yFxHuAp" name="part.edit.card_title">
@@ -1727,7 +1727,7 @@ Sub elements will be moved upwards.</target>
</notes>
<segment state="translated">
<source>part.edit.card_title</source>
<target>Edit [part]</target>
<target>Edit part</target>
</segment>
</unit>
<unit id="EwY218_" name="part.edit.tab.common">
@@ -1877,7 +1877,7 @@ Sub elements will be moved upwards.</target>
</notes>
<segment state="translated">
<source>part.new.card_title</source>
<target>Create new [part]</target>
<target>Create new part</target>
</segment>
</unit>
<unit id="5TCcXwk" name="part_lot.delete">
@@ -1941,7 +1941,7 @@ Sub elements will be moved upwards.</target>
</notes>
<segment state="translated">
<source>part.info.title</source>
<target>Detail info for [part]</target>
<target>Detail info for part</target>
</segment>
</unit>
<unit id="c9.fQPj" name="part.part_lots.label">
@@ -2107,7 +2107,7 @@ Sub elements will be moved upwards.</target>
</notes>
<segment state="final">
<source>user.creating_user</source>
<target>User who created this [part]</target>
<target>User who created this part</target>
</segment>
</unit>
<unit id="KEhkI6s" name="Unknown">
@@ -2145,7 +2145,7 @@ Sub elements will be moved upwards.</target>
</notes>
<segment state="final">
<source>user.last_editing_user</source>
<target>User who edited this [part] last</target>
<target>User who edited this part last</target>
</segment>
</unit>
<unit id="R8D9PGv" name="part.isFavorite">
@@ -2509,7 +2509,7 @@ Sub elements will be moved upwards.</target>
</notes>
<segment state="translated">
<source>part.edit.btn</source>
<target>Edit [part]</target>
<target>Edit part</target>
</segment>
</unit>
<unit id="TNzs45Y" name="part.clone.btn">
@@ -2520,7 +2520,7 @@ Sub elements will be moved upwards.</target>
</notes>
<segment state="translated">
<source>part.clone.btn</source>
<target>Clone [part]</target>
<target>Clone part</target>
</segment>
</unit>
<unit id="RG1RD20" name="part.create.btn">
@@ -2531,7 +2531,7 @@ Sub elements will be moved upwards.</target>
</notes>
<segment state="translated">
<source>part.create.btn</source>
<target>Create new [part]</target>
<target>Create new part</target>
</segment>
</unit>
<unit id="kxAbZAe" name="part.delete.confirm_title">
@@ -2541,7 +2541,7 @@ Sub elements will be moved upwards.</target>
</notes>
<segment state="translated">
<source>part.delete.confirm_title</source>
<target>Do you really want to delete this [part]?</target>
<target>Do you really want to delete this part?</target>
</segment>
</unit>
<unit id="owQRbkU" name="part.delete.message">
@@ -2551,7 +2551,7 @@ Sub elements will be moved upwards.</target>
</notes>
<segment state="translated">
<source>part.delete.message</source>
<target>This [part] and any associated information (like attachments, price information, etc.) will be deleted. This can not be undone!</target>
<target>This part and any associated information (like attachments, price information, etc.) will be deleted. This can not be undone!</target>
</segment>
</unit>
<unit id="oH8.Zx6" name="part.delete">
@@ -2561,7 +2561,7 @@ Sub elements will be moved upwards.</target>
</notes>
<segment state="translated">
<source>part.delete</source>
<target>Delete [part]</target>
<target>Delete part</target>
</segment>
</unit>
<unit id="P7nc8TK" name="parts_list.all.title">
@@ -2571,7 +2571,7 @@ Sub elements will be moved upwards.</target>
</notes>
<segment state="translated">
<source>parts_list.all.title</source>
<target>All [[part]]</target>
<target>All parts</target>
</segment>
</unit>
<unit id="aSDZrnb" name="parts_list.category.title">
@@ -2581,7 +2581,7 @@ Sub elements will be moved upwards.</target>
</notes>
<segment state="translated">
<source>parts_list.category.title</source>
<target>[[Part]] with [category]</target>
<target>Parts with category</target>
</segment>
</unit>
<unit id="qZfLMs5" name="parts_list.footprint.title">
@@ -2591,7 +2591,7 @@ Sub elements will be moved upwards.</target>
</notes>
<segment state="translated">
<source>parts_list.footprint.title</source>
<target>[[Part]] with [footprint]</target>
<target>Parts with footprint</target>
</segment>
</unit>
<unit id="wzH1LnU" name="parts_list.manufacturer.title">
@@ -2601,7 +2601,7 @@ Sub elements will be moved upwards.</target>
</notes>
<segment state="translated">
<source>parts_list.manufacturer.title</source>
<target>[[Part]] with [manufacturer]</target>
<target>Parts with manufacturer</target>
</segment>
</unit>
<unit id="z0tqm9_" name="parts_list.search.title">
@@ -2611,7 +2611,7 @@ Sub elements will be moved upwards.</target>
</notes>
<segment state="translated">
<source>parts_list.search.title</source>
<target>Search [[part]]</target>
<target>Search Parts</target>
</segment>
</unit>
<unit id=".nsfK4V" name="parts_list.storelocation.title">
@@ -2621,7 +2621,7 @@ Sub elements will be moved upwards.</target>
</notes>
<segment state="translated">
<source>parts_list.storelocation.title</source>
<target>[[Part]] with [[storage_location]]</target>
<target>Parts with storage locations</target>
</segment>
</unit>
<unit id="dqIl9gT" name="parts_list.supplier.title">
@@ -2631,7 +2631,7 @@ Sub elements will be moved upwards.</target>
</notes>
<segment state="translated">
<source>parts_list.supplier.title</source>
<target>[[Part]] with [supplier]</target>
<target>Parts with supplier</target>
</segment>
</unit>
<unit id="BJygaSh" name="parts_list.tags.title">
@@ -3059,7 +3059,7 @@ Sub elements will be moved upwards.</target>
</notes>
<segment state="translated">
<source>statistics.distinct_parts_count</source>
<target>Number of distinct [[part]]</target>
<target>Number of distinct parts</target>
</segment>
</unit>
<unit id="sIGqnJ0" name="statistics.parts_instock_sum">
@@ -3070,7 +3070,7 @@ Sub elements will be moved upwards.</target>
</notes>
<segment state="translated">
<source>statistics.parts_instock_sum</source>
<target>Sum of all [[part]] stocks</target>
<target>Sum of all parts stocks</target>
</segment>
</unit>
<unit id="uHmvfnI" name="statistics.parts_with_price">
@@ -3081,7 +3081,7 @@ Sub elements will be moved upwards.</target>
</notes>
<segment state="translated">
<source>statistics.parts_with_price</source>
<target>Number of [[part]] with price information</target>
<target>Number of parts with price information</target>
</segment>
</unit>
<unit id="7x89_xL" name="statistics.categories_count">
@@ -3092,7 +3092,7 @@ Sub elements will be moved upwards.</target>
</notes>
<segment state="translated">
<source>statistics.categories_count</source>
<target>Number of [[category]]</target>
<target>Number of categories</target>
</segment>
</unit>
<unit id="s0nLRjN" name="statistics.footprints_count">
@@ -3103,7 +3103,7 @@ Sub elements will be moved upwards.</target>
</notes>
<segment state="translated">
<source>statistics.footprints_count</source>
<target>Number of [[footprint]]</target>
<target>Number of footprints</target>
</segment>
</unit>
<unit id="f0gHZzl" name="statistics.manufacturers_count">
@@ -3114,7 +3114,7 @@ Sub elements will be moved upwards.</target>
</notes>
<segment state="translated">
<source>statistics.manufacturers_count</source>
<target>Number of [[manufacturer]]</target>
<target>Number of manufacturers</target>
</segment>
</unit>
<unit id="_4rvCd3" name="statistics.storelocations_count">
@@ -3125,7 +3125,7 @@ Sub elements will be moved upwards.</target>
</notes>
<segment state="translated">
<source>statistics.storelocations_count</source>
<target>Number of [[storage_location]]</target>
<target>Number of storage locations</target>
</segment>
</unit>
<unit id="tzzUvrm" name="statistics.suppliers_count">
@@ -3136,7 +3136,7 @@ Sub elements will be moved upwards.</target>
</notes>
<segment state="translated">
<source>statistics.suppliers_count</source>
<target>Number of [[supplier]]</target>
<target>Number of suppliers</target>
</segment>
</unit>
<unit id="QEk.sHE" name="statistics.currencies_count">
@@ -3147,7 +3147,7 @@ Sub elements will be moved upwards.</target>
</notes>
<segment state="translated">
<source>statistics.currencies_count</source>
<target>Number of [[currency]]</target>
<target>Number of currencies</target>
</segment>
</unit>
<unit id="MTCnGlN" name="statistics.measurement_units_count">
@@ -3158,7 +3158,7 @@ Sub elements will be moved upwards.</target>
</notes>
<segment state="translated">
<source>statistics.measurement_units_count</source>
<target>Number of [[measurement_unit]]</target>
<target>Number of measurement units</target>
</segment>
</unit>
<unit id="7sRXll2" name="statistics.devices_count">
@@ -3169,7 +3169,7 @@ Sub elements will be moved upwards.</target>
</notes>
<segment state="translated">
<source>statistics.devices_count</source>
<target>Number of [[project]]</target>
<target>Number of projects</target>
</segment>
</unit>
<unit id="2u7zTMF" name="statistics.attachment_types_count">
@@ -3180,7 +3180,7 @@ Sub elements will be moved upwards.</target>
</notes>
<segment state="translated">
<source>statistics.attachment_types_count</source>
<target>Number of [[attachment_type]]</target>
<target>Number of attachment types</target>
</segment>
</unit>
<unit id="C0XsLQc" name="statistics.all_attachments_count">
@@ -6073,7 +6073,7 @@ If you have done this incorrectly or if a computer is no longer trusted, you can
</notes>
<segment state="translated">
<source>tree.tools.edit.attachment_types</source>
<target>[[Attachment_type]]</target>
<target>Attachment types</target>
</segment>
</unit>
<unit id="u8jQbAc" name="tree.tools.edit.categories">
@@ -6084,7 +6084,7 @@ If you have done this incorrectly or if a computer is no longer trusted, you can
</notes>
<segment state="translated">
<source>tree.tools.edit.categories</source>
<target>[[Category]]</target>
<target>Categories</target>
</segment>
</unit>
<unit id="3n2K_az" name="tree.tools.edit.projects">
@@ -6095,7 +6095,7 @@ If you have done this incorrectly or if a computer is no longer trusted, you can
</notes>
<segment state="translated">
<source>tree.tools.edit.projects</source>
<target>[[Project]]</target>
<target>Projects</target>
</segment>
</unit>
<unit id="raK7qaK" name="tree.tools.edit.suppliers">
@@ -6106,7 +6106,7 @@ If you have done this incorrectly or if a computer is no longer trusted, you can
</notes>
<segment state="translated">
<source>tree.tools.edit.suppliers</source>
<target>[[Supplier]]</target>
<target>Suppliers</target>
</segment>
</unit>
<unit id="1IJ48Y0" name="tree.tools.edit.manufacturer">
@@ -6117,7 +6117,7 @@ If you have done this incorrectly or if a computer is no longer trusted, you can
</notes>
<segment state="translated">
<source>tree.tools.edit.manufacturer</source>
<target>[[Manufacturer]]</target>
<target>Manufacturers</target>
</segment>
</unit>
<unit id="GNbWH_O" name="tree.tools.edit.storelocation">
@@ -6127,7 +6127,7 @@ If you have done this incorrectly or if a computer is no longer trusted, you can
</notes>
<segment state="translated">
<source>tree.tools.edit.storelocation</source>
<target>[[Storage_location]]</target>
<target>Storage locations</target>
</segment>
</unit>
<unit id="7ZOhkd." name="tree.tools.edit.footprint">
@@ -6137,7 +6137,7 @@ If you have done this incorrectly or if a computer is no longer trusted, you can
</notes>
<segment state="translated">
<source>tree.tools.edit.footprint</source>
<target>[[Footprint]]</target>
<target>Footprints</target>
</segment>
</unit>
<unit id="U1zYjzD" name="tree.tools.edit.currency">
@@ -6147,7 +6147,7 @@ If you have done this incorrectly or if a computer is no longer trusted, you can
</notes>
<segment state="translated">
<source>tree.tools.edit.currency</source>
<target>[[Currency]]</target>
<target>Currencies</target>
</segment>
</unit>
<unit id="NnzEujm" name="tree.tools.edit.measurement_unit">
@@ -6157,13 +6157,13 @@ If you have done this incorrectly or if a computer is no longer trusted, you can
</notes>
<segment state="translated">
<source>tree.tools.edit.measurement_unit</source>
<target>[[Measurement_unit]]</target>
<target>Measurement Unit</target>
</segment>
</unit>
<unit id="oYLWbbv" name="tree.tools.edit.part_custom_state">
<segment state="translated">
<source>tree.tools.edit.part_custom_state</source>
<target>[[Part_custom_state]]</target>
<target>Custom part states</target>
</segment>
</unit>
<unit id=".Ux4R3T" name="tree.tools.edit.label_profile">
@@ -6172,7 +6172,7 @@ If you have done this incorrectly or if a computer is no longer trusted, you can
</notes>
<segment state="translated">
<source>tree.tools.edit.label_profile</source>
<target>[[Label_profile]]</target>
<target>Label profiles</target>
</segment>
</unit>
<unit id="eyvi0Zt" name="tree.tools.edit.part">
@@ -6182,7 +6182,7 @@ If you have done this incorrectly or if a computer is no longer trusted, you can
</notes>
<segment state="translated">
<source>tree.tools.edit.part</source>
<target>New [part]</target>
<target>New part</target>
</segment>
</unit>
<unit id="nIHj_yk" name="tree.tools.show.all_parts">
@@ -6193,7 +6193,7 @@ If you have done this incorrectly or if a computer is no longer trusted, you can
</notes>
<segment state="translated">
<source>tree.tools.show.all_parts</source>
<target>Show all [[part]]</target>
<target>Show all parts</target>
</segment>
</unit>
<unit id="JxVmFbM" name="tree.tools.show.all_attachments">
@@ -6224,7 +6224,7 @@ If you have done this incorrectly or if a computer is no longer trusted, you can
</notes>
<segment state="translated">
<source>tree.tools.system.users</source>
<target>[[User]]</target>
<target>Users</target>
</segment>
</unit>
<unit id="dTEQQ3T" name="tree.tools.system.groups">
@@ -6234,7 +6234,7 @@ If you have done this incorrectly or if a computer is no longer trusted, you can
</notes>
<segment state="translated">
<source>tree.tools.system.groups</source>
<target>[[Group]]</target>
<target>Groups</target>
</segment>
</unit>
<unit id="NWWki1R" name="tree.tools.system.event_log">
@@ -6536,7 +6536,7 @@ If you have done this incorrectly or if a computer is no longer trusted, you can
</notes>
<segment state="translated">
<source>validator.part_lot.location_full</source>
<target>The [storage_location] was marked as full, so you can not add a new [part] to it.</target>
<target>The storage location was marked as full, so you can not add a new part to it.</target>
</segment>
</unit>
<unit id="h6qELde" name="validator.part_lot.only_existing">
@@ -6546,7 +6546,7 @@ If you have done this incorrectly or if a computer is no longer trusted, you can
</notes>
<segment state="translated">
<source>validator.part_lot.only_existing</source>
<target>The [storage_location] was marked as "only existing", so you can not add new [part] to it.</target>
<target>The storage location was marked as "only existing", so you can not add new part to it.</target>
</segment>
</unit>
<unit id="2yWi8eP" name="validator.part_lot.single_part">
@@ -6556,7 +6556,7 @@ If you have done this incorrectly or if a computer is no longer trusted, you can
</notes>
<segment state="translated">
<source>validator.part_lot.single_part</source>
<target>The [storage_location] was marked as "single [part]", so you can not add a new [part] to it.</target>
<target>The storage location was marked as "single part", so you can not add a new part to it.</target>
</segment>
</unit>
<unit id="aBSsuxp" name="m_status.active.help">
@@ -6737,7 +6737,7 @@ If you have done this incorrectly or if a computer is no longer trusted, you can
</notes>
<segment state="translated">
<source>entity.edit.not_selectable.help</source>
<target>If this option is activated, this element can not be assigned to a [part] property. Useful if this element is just used for grouping.</target>
<target>If this option is activated, this element can not be assigned to a part property. Useful if this element is just used for grouping.</target>
</segment>
</unit>
<unit id="poCwov." name="bbcode.hint">
@@ -6777,7 +6777,7 @@ If you have done this incorrectly or if a computer is no longer trusted, you can
</notes>
<segment state="translated">
<source>category.edit.disable_footprints</source>
<target>Disable [[footprint]]</target>
<target>Disable footprints</target>
</segment>
</unit>
<unit id="MLbac5k" name="category.edit.disable_footprints.help">
@@ -6787,7 +6787,7 @@ If you have done this incorrectly or if a computer is no longer trusted, you can
</notes>
<segment state="translated">
<source>category.edit.disable_footprints.help</source>
<target>If this option is activated, the [footprint] property is disabled for all [[part]] with this [category].</target>
<target>If this option is activated, the footprint property is disabled for all parts with this category.</target>
</segment>
</unit>
<unit id="JWHe4Hi" name="category.edit.disable_manufacturers">
@@ -6797,7 +6797,7 @@ If you have done this incorrectly or if a computer is no longer trusted, you can
</notes>
<segment state="translated">
<source>category.edit.disable_manufacturers</source>
<target>Disable [[manufacturer]]</target>
<target>Disable manufacturers</target>
</segment>
</unit>
<unit id=".ItLezq" name="category.edit.disable_manufacturers.help">
@@ -6807,7 +6807,7 @@ If you have done this incorrectly or if a computer is no longer trusted, you can
</notes>
<segment state="translated">
<source>category.edit.disable_manufacturers.help</source>
<target>If this option is activated, the [manufacturer] property is disabled for all [[part]] with this [category].</target>
<target>If this option is activated, the manufacturer property is disabled for all parts with this category.</target>
</segment>
</unit>
<unit id="g_gRbhu" name="category.edit.disable_autodatasheets">
@@ -6827,7 +6827,7 @@ If you have done this incorrectly or if a computer is no longer trusted, you can
</notes>
<segment state="translated">
<source>category.edit.disable_autodatasheets.help</source>
<target>If this option is activated, no automatic links to datasheets are created for [[part]] with this [category].</target>
<target>If this option is activated, no automatic links to datasheets are created for parts with this category.</target>
</segment>
</unit>
<unit id="QzSkLse" name="category.edit.disable_properties">
@@ -6847,7 +6847,7 @@ If you have done this incorrectly or if a computer is no longer trusted, you can
</notes>
<segment state="translated">
<source>category.edit.disable_properties.help</source>
<target>If this option is activated, the [part] properties are disabled for [[part]] with this [category].</target>
<target>If this option is activated, the part properties are disabled for parts with this category.</target>
</segment>
</unit>
<unit id="ILoRXgM" name="category.edit.partname_hint">
@@ -7182,7 +7182,7 @@ Element 1 -&gt; Element 1.2</target>
</notes>
<segment state="translated">
<source>storelocation.edit.is_full.help</source>
<target>If this option is selected, it is neither possible to add new [[part]] to this storelocation or to increase the amount of existing [[part]].</target>
<target>If this option is selected, it is neither possible to add new parts to this storelocation or to increase the amount of existing parts.</target>
</segment>
</unit>
<unit id="V1su4ac" name="storelocation.limit_to_existing.label">
@@ -7192,7 +7192,7 @@ Element 1 -&gt; Element 1.2</target>
</notes>
<segment state="translated">
<source>storelocation.limit_to_existing.label</source>
<target>Limit to existing [[part]]</target>
<target>Limit to existing parts</target>
</segment>
</unit>
<unit id="6D.6huj" name="storelocation.limit_to_existing.help">
@@ -7202,7 +7202,7 @@ Element 1 -&gt; Element 1.2</target>
</notes>
<segment state="translated">
<source>storelocation.limit_to_existing.help</source>
<target>If this option is activated, it is not possible to add new [[part]] to this storelocation, but the amount of existing [[part]] can be increased.</target>
<target>If this option is activated, it is not possible to add new parts to this storelocation, but the amount of existing parts can be increased.</target>
</segment>
</unit>
<unit id="tGVVeof" name="storelocation.only_single_part.label">
@@ -7212,7 +7212,7 @@ Element 1 -&gt; Element 1.2</target>
</notes>
<segment state="translated">
<source>storelocation.only_single_part.label</source>
<target>Only single [part]</target>
<target>Only single part</target>
</segment>
</unit>
<unit id="Hyh5pvY" name="storelocation.only_single_part.help">
@@ -7222,7 +7222,7 @@ Element 1 -&gt; Element 1.2</target>
</notes>
<segment state="translated">
<source>storelocation.only_single_part.help</source>
<target>If this option is activated, only a single [part] (with every amount) can be assigned to this [storage_location]. Useful for small SMD boxes or feeders.</target>
<target>If this option is activated, only a single part (with every amount) can be assigned to this storage location. Useful for small SMD boxes or feeders.</target>
</segment>
</unit>
<unit id="sty2ele" name="storelocation.storage_type.label">
@@ -7242,7 +7242,7 @@ Element 1 -&gt; Element 1.2</target>
</notes>
<segment state="translated">
<source>storelocation.storage_type.help</source>
<target>You can select a [measurement_unit] here, which a [part] must have to be able to be assigned to this [storage_location]</target>
<target>You can select a measurement unit here, which a part must have to be able to be assigned to this storage location</target>
</segment>
</unit>
<unit id="ilC3c6u" name="supplier.edit.default_currency">
@@ -7504,7 +7504,7 @@ Element 1 -&gt; Element 1.2</target>
</notes>
<segment state="translated">
<source>perm.part.all_parts</source>
<target>List all [[part]]</target>
<target>List all parts</target>
</segment>
</unit>
<unit id="xGpxdp3" name="perm.part.no_price_parts">
@@ -7514,7 +7514,7 @@ Element 1 -&gt; Element 1.2</target>
</notes>
<segment state="translated">
<source>perm.part.no_price_parts</source>
<target>List [[part]] without price info</target>
<target>List parts without price info</target>
</segment>
</unit>
<unit id="gVBtadZ" name="perm.part.obsolete_parts">
@@ -7524,7 +7524,7 @@ Element 1 -&gt; Element 1.2</target>
</notes>
<segment state="translated">
<source>perm.part.obsolete_parts</source>
<target>List obsolete [[part]]</target>
<target>List obsolete parts</target>
</segment>
</unit>
<unit id="rh5syrd" name="perm.part.unknown_instock_parts">
@@ -8636,7 +8636,7 @@ Element 1 -&gt; Element 1.2</target>
<unit id="DachcxN" name="part.table.edit.title">
<segment state="translated">
<source>part.table.edit.title</source>
<target>Edit [part]</target>
<target>Edit part</target>
</segment>
</unit>
<unit id="keLmdcq" name="part_list.action.scrollable_hint">
@@ -9362,7 +9362,7 @@ Element 1 -&gt; Element 1.2</target>
<unit id="e97FPsh" name="entity.info.parts_count_recursive">
<segment state="translated">
<source>entity.info.parts_count_recursive</source>
<target>Number of [[part]] with this element or its sub elements</target>
<target>Number of parts with this element or its sub elements</target>
</segment>
</unit>
<unit id="st92iWF" name="tools.server_infos.title">
@@ -9596,13 +9596,13 @@ Element 1 -&gt; Element 1.2</target>
<unit id="hpPkHYF" name="project.add_parts_to_project">
<segment state="translated">
<source>project.add_parts_to_project</source>
<target>Add [[part]] to [project] BOM</target>
<target>Add parts to project BOM</target>
</segment>
</unit>
<unit id="mauieYX" name="part.info.add_part_to_project">
<segment state="translated">
<source>part.info.add_part_to_project</source>
<target>Add this [part] to a [project]</target>
<target>Add this part to a project</target>
</segment>
</unit>
<unit id="5r.n1zf" name="project_bom_entry.label">
@@ -9650,43 +9650,43 @@ Element 1 -&gt; Element 1.2</target>
<unit id="9GtmqC1" name="part.new_build_part.error.build_part_already_exists">
<segment state="translated">
<source>part.new_build_part.error.build_part_already_exists</source>
<target>The [project] already has a build [part]!</target>
<target>The project already has a build part!</target>
</segment>
</unit>
<unit id="9soO_kf" name="project.edit.associated_build_part">
<segment state="translated">
<source>project.edit.associated_build_part</source>
<target>Associated builds [part]</target>
<target>Associated builds part</target>
</segment>
</unit>
<unit id="8Mu.T78" name="project.edit.associated_build_part.add">
<segment state="translated">
<source>project.edit.associated_build_part.add</source>
<target>Add builds [part]</target>
<target>Add builds part</target>
</segment>
</unit>
<unit id="sPdCBUl" name="project.edit.associated_build.hint">
<segment state="translated">
<source>project.edit.associated_build.hint</source>
<target>This [part] represents the builds of this [project], which are stored somewhere.</target>
<target>This part represents the builds of this project, which are stored somewhere.</target>
</segment>
</unit>
<unit id="Cke2p4U" name="part.info.projectBuildPart.hint">
<segment state="translated">
<source>part.info.projectBuildPart.hint</source>
<target>This [part] represents the builds of the following [project] and is associated with it</target>
<target>This part represents the builds of the following project and is associated with it</target>
</segment>
</unit>
<unit id="yCR6rBb" name="part.is_build_part">
<segment state="translated">
<source>part.is_build_part</source>
<target>Is [project] builds [part]</target>
<target>Is project builds part</target>
</segment>
</unit>
<unit id="dV.E0zI" name="project.info.title">
<segment state="translated">
<source>project.info.title</source>
<target>[Project] info</target>
<target>Project info</target>
</segment>
</unit>
<unit id="LYURecm" name="project.info.bom_entries_count">
@@ -9884,13 +9884,13 @@ Element 1 -&gt; Element 1.2</target>
<unit id="TRh.K81" name="part_list.action.projects.generate_label">
<segment state="translated">
<source>part_list.action.projects.generate_label</source>
<target>Generate labels (for [[part]])</target>
<target>Generate labels (for parts)</target>
</segment>
</unit>
<unit id="CEr_90G" name="part_list.action.projects.generate_label_lot">
<segment state="translated">
<source>part_list.action.projects.generate_label_lot</source>
<target>Generate labels (for [[part_lot]])</target>
<target>Generate labels (for part lots)</target>
</segment>
</unit>
<unit id="QjZuQlv" name="part_list.action.generate_label.empty">
@@ -9914,7 +9914,7 @@ Element 1 -&gt; Element 1.2</target>
<unit id=".I7zcoK" name="project.builds.following_bom_entries_miss_instock">
<segment state="translated">
<source>project.builds.following_bom_entries_miss_instock</source>
<target>The following [[part]] have not enough stock to build this [project] at least once:</target>
<target>The following parts have not enough stock to build this project at least once:</target>
</segment>
</unit>
<unit id="fGT0qfb" name="project.builds.stocked">
@@ -9938,19 +9938,19 @@ Element 1 -&gt; Element 1.2</target>
<unit id="NdZ1t7a" name="project.builds.number_of_builds_possible">
<segment state="translated">
<source>project.builds.number_of_builds_possible</source>
<target><![CDATA[You have enough stocked to build <b>%max_builds%</b> builds of this [project].]]></target>
<target>You have enough stocked to build &lt;b&gt;%max_builds%&lt;/b&gt; builds of this project.</target>
</segment>
</unit>
<unit id="iuSpPbg" name="project.builds.check_project_status">
<segment state="translated">
<source>project.builds.check_project_status</source>
<target><![CDATA[The current [project] status is <b>"%project_status%"</b>. You should check if you really want to build the [project] with this status!]]></target>
<target>The current project status is &lt;b&gt;"%project_status%"&lt;/b&gt;. You should check if you really want to build the project with this status!</target>
</segment>
</unit>
<unit id="Y7vSSxi" name="project.builds.following_bom_entries_miss_instock_n">
<segment state="translated">
<source>project.builds.following_bom_entries_miss_instock_n</source>
<target>You do not have enough [[part]] stocked to build this [project] %number_of_builds% times. The following [[part]] have missing instock:</target>
<target>You do not have enough parts stocked to build this project %number_of_builds% times. The following parts have missing instock:</target>
</segment>
</unit>
<unit id="1BGl3Dv" name="project.build.flash.invalid_input">
@@ -9974,7 +9974,7 @@ Element 1 -&gt; Element 1.2</target>
<unit id="zgLSR.X" name="project.build.help">
<segment state="translated">
<source>project.build.help</source>
<target>Choose from which [[part_lot]] the stock to build this [project] should be taken (and in which amount). Check the checkbox for each BOM Entry, when you are finished withdrawing the [[part]], or use the top checkbox to check all boxes at once.</target>
<target>Choose from which part lots the stock to build this project should be taken (and in which amount). Check the checkbox for each BOM Entry, when you are finished withdrawing the parts, or use the top checkbox to check all boxes at once.</target>
</segment>
</unit>
<unit id="srYaI3Z" name="project.build.buildsPartLot.new_lot">
@@ -10244,13 +10244,13 @@ Element 1 -&gt; Element 1.2</target>
<unit id="1swuUz4" name="log.element_edited.changed_fields.disable_footprints">
<segment state="translated">
<source>log.element_edited.changed_fields.disable_footprints</source>
<target>Disable [[footprint]]</target>
<target>Disable footprints</target>
</segment>
</unit>
<unit id="sZ3vQaH" name="log.element_edited.changed_fields.disable_manufacturers">
<segment state="translated">
<source>log.element_edited.changed_fields.disable_manufacturers</source>
<target>Disable [[manufacturer]]</target>
<target>Disable manufacturers</target>
</segment>
</unit>
<unit id="lLXp.Sn" name="log.element_edited.changed_fields.disable_autodatasheets">
@@ -10862,25 +10862,25 @@ Element 1 -&gt; Element 1.2</target>
<unit id="r5F3f_G" name="measurement_unit.new">
<segment state="translated">
<source>measurement_unit.new</source>
<target>New [measurement_unit]</target>
<target>New Measurement Unit</target>
</segment>
</unit>
<unit id="W.vDRLw" name="measurement_unit.edit">
<segment state="translated">
<source>measurement_unit.edit</source>
<target>Edit [measurement_unit]</target>
<target>Edit Measurement Unit</target>
</segment>
</unit>
<unit id="Ae0GMtY" name="part_custom_state.new">
<segment state="translated">
<source>part_custom_state.new</source>
<target>New [part_custom_state]</target>
<target>New custom part state</target>
</segment>
</unit>
<unit id="5uZ23wR" name="part_custom_state.edit">
<segment state="translated">
<source>part_custom_state.edit</source>
<target>Edit [part_custom_state]</target>
<target>Edit custom part state</target>
</segment>
</unit>
<unit id="uW2WHHC" name="user.aboutMe.label">
@@ -10898,7 +10898,7 @@ Element 1 -&gt; Element 1.2</target>
<unit id="lYlHhtl" name="storelocation.part_owner_must_match.label">
<segment state="translated">
<source>storelocation.part_owner_must_match.label</source>
<target>[Part_lot] owner must match [storage_location] owner</target>
<target>Part Lot owner must match storage location owner</target>
</segment>
</unit>
<unit id="eMHXpbV" name="part_lot.owner">
@@ -10934,7 +10934,7 @@ Element 1 -&gt; Element 1.2</target>
<unit id="9zWwSvC" name="part.withdraw.access_denied">
<segment state="translated">
<source>part.withdraw.access_denied</source>
<target>Not allowed to do the desired action. Please check your permissions and the owner of the [[part_lot]].</target>
<target>Not allowed to do the desired action. Please check your permissions and the owner of the part lots.</target>
</segment>
</unit>
<unit id="4ynARET" name="part.info.amount.less_than_desired">
@@ -10952,7 +10952,7 @@ Element 1 -&gt; Element 1.2</target>
<unit id="krpFlYH" name="log.element_edited.changed_fields.part_owner_must_match">
<segment state="translated">
<source>log.element_edited.changed_fields.part_owner_must_match</source>
<target>[Part] owner must match [storage_location] owner</target>
<target>Part owner must match storage location owner</target>
</segment>
</unit>
<unit id="o5u.Nnz" name="part.filter.lessThanDesired">
@@ -11524,7 +11524,7 @@ Please note, that you can not impersonate a disabled user. If you try you will g
<unit id="bkPXoxM" name="project.build.dont_check_quantity.help">
<segment state="translated">
<source>project.build.dont_check_quantity.help</source>
<target>If this option is selected, the given withdraw quantities are used as given, no matter if more or less [[part]] are actually required to build this [project].</target>
<target>If this option is selected, the given withdraw quantities are used as given, no matter if more or less parts are actually required to build this project.</target>
</segment>
</unit>
<unit id="XsE9cmC" name="part_list.action.invert_selection">
@@ -14278,14 +14278,5 @@ Please note that this system is currently experimental, and the synonyms defined
<target>If enabled, an option for to generate IPN with this global prefix, shared across parts in all categories.</target>
</segment>
</unit>
<unit id="MxKRRx_" name="datatable.datatable.lengthMenu">
<notes>
<note priority="1">Do not remove! Used for datatables rendering.</note>
</notes>
<segment state="translated">
<source>datatable.datatable.lengthMenu</source>
<target>_MENU_</target>
</segment>
</unit>
</file>
</xliff>
</xliff>

View File

@@ -12336,14 +12336,5 @@ Por favor ten en cuenta que no puedes personificar a un usuario deshabilitado. S
<target>Usuarios</target>
</segment>
</unit>
<unit id="MxKRRx_" name="datatable.datatable.lengthMenu">
<notes>
<note priority="1">Do not remove! Used for datatables rendering.</note>
</notes>
<segment state="translated">
<source>datatable.datatable.lengthMenu</source>
<target>_MENU_</target>
</segment>
</unit>
</file>
</xliff>
</xliff>

View File

@@ -9076,14 +9076,5 @@ exemple de ville</target>
<target>Utilisateurs</target>
</segment>
</unit>
<unit id="MxKRRx_" name="datatable.datatable.lengthMenu">
<notes>
<note priority="1">Do not remove! Used for datatables rendering.</note>
</notes>
<segment state="translated">
<source>datatable.datatable.lengthMenu</source>
<target>_MENU_</target>
</segment>
</unit>
</file>
</xliff>
</xliff>

View File

@@ -14049,14 +14049,5 @@
<target>Tömeges importálási feladat alkatrészek</target>
</segment>
</unit>
<unit id="MxKRRx_" name="datatable.datatable.lengthMenu">
<notes>
<note priority="1">Do not remove! Used for datatables rendering.</note>
</notes>
<segment state="translated">
<source>datatable.datatable.lengthMenu</source>
<target>_MENU_</target>
</segment>
</unit>
</file>
</xliff>
</xliff>

View File

@@ -12338,14 +12338,5 @@ Notare che non è possibile impersonare un utente disattivato. Quando si prova a
<target>Utenti</target>
</segment>
</unit>
<unit id="MxKRRx_" name="datatable.datatable.lengthMenu">
<notes>
<note priority="1">Do not remove! Used for datatables rendering.</note>
</notes>
<segment state="translated">
<source>datatable.datatable.lengthMenu</source>
<target>_MENU_</target>
</segment>
</unit>
</file>
</xliff>
</xliff>

View File

@@ -8813,14 +8813,5 @@ Exampletown</target>
<target>ユーザー</target>
</segment>
</unit>
<unit id="MxKRRx_" name="datatable.datatable.lengthMenu">
<notes>
<note priority="1">Do not remove! Used for datatables rendering.</note>
</notes>
<segment state="translated">
<source>datatable.datatable.lengthMenu</source>
<target>_MENU_</target>
</segment>
</unit>
</file>
</xliff>
</xliff>

View File

@@ -840,14 +840,5 @@
<target>Aangepaste staten van onderdelen</target>
</segment>
</unit>
<unit id="MxKRRx_" name="datatable.datatable.lengthMenu">
<notes>
<note priority="1">Do not remove! Used for datatables rendering.</note>
</notes>
<segment state="translated">
<source>datatable.datatable.lengthMenu</source>
<target>_MENU_</target>
</segment>
</unit>
</file>
</xliff>
</xliff>

View File

@@ -12191,14 +12191,5 @@ Należy pamiętać, że nie możesz udawać nieaktywnych użytkowników. Jeśli
<target>Użytkownicy</target>
</segment>
</unit>
<unit id="MxKRRx_" name="datatable.datatable.lengthMenu">
<notes>
<note priority="1">Do not remove! Used for datatables rendering.</note>
</notes>
<segment state="translated">
<source>datatable.datatable.lengthMenu</source>
<target>_MENU_</target>
</segment>
</unit>
</file>
</xliff>
</xliff>

View File

@@ -12291,14 +12291,5 @@
<target>Пользователи</target>
</segment>
</unit>
<unit id="MxKRRx_" name="datatable.datatable.lengthMenu">
<notes>
<note priority="1">Do not remove! Used for datatables rendering.</note>
</notes>
<segment state="translated">
<source>datatable.datatable.lengthMenu</source>
<target>_MENU_</target>
</segment>
</unit>
</file>
</xliff>
</xliff>

View File

@@ -12176,14 +12176,5 @@ Element 3</target>
<target>用户</target>
</segment>
</unit>
<unit id="MxKRRx_" name="datatable.datatable.lengthMenu">
<notes>
<note priority="1">Do not remove! Used for datatables rendering.</note>
</notes>
<segment state="translated">
<source>datatable.datatable.lengthMenu</source>
<target>_MENU_</target>
</segment>
</unit>
</file>
</xliff>
</xliff>

1480
yarn.lock

File diff suppressed because it is too large Load Diff