Rebase auf Part-DB v2.1.2

This commit is contained in:
Marcel Diegelmann 2025-09-10 13:56:36 +02:00
parent 7abc37fc9a
commit 360fed1f5e
33 changed files with 1020 additions and 162 deletions

13
.env
View file

@ -35,9 +35,6 @@ DATABASE_EMULATE_NATURAL_SORT=0
# This must end with a slash!
DEFAULT_URI="https://partdb.changeme.invalid/"
# Use an %%ipn%% placeholder in the name of a assembly. Placeholder is replaced with the ipn input while saving.
CREATE_ASSEMBLY_USE_IPN_PLACEHOLDER_IN_NAME=0
###################################################################################
# Email settings
###################################################################################
@ -63,16 +60,6 @@ ERROR_PAGE_ADMIN_EMAIL=''
# If this is set to true, solutions to common problems are shown on error pages. Disable this, if you do not want your users to see them...
ERROR_PAGE_SHOW_HELP=1
##################################################################################
# Part table settings
##################################################################################
# Configure which columns will be visible by default in the specific table (and in which order).
# This is a comma separated list of column names. See documentation for available values.
TABLE_PARTS_DEFAULT_COLUMNS=name,description,category,footprint,manufacturer,storage_location,amount
TABLE_ASSEMBLIES_DEFAULT_COLUMNS=id,ipn,name,description,referencedAssemblies,edit
TABLE_ASSEMBLIES_BOM_DEFAULT_COLUMNS=quantity,id,ipn,name,description
###################################################################################
# SAML Single sign on-settings
###################################################################################

View file

@ -59,12 +59,6 @@ parameters:
######################################################################################################################
partdb.saml.enabled: '%env(bool:SAML_ENABLED)%' # If this is set to true, SAML authentication is enabled
######################################################################################################################
# Table settings
######################################################################################################################
partdb.table.assemblies.default_columns: '%env(trim:string:TABLE_ASSEMBLIES_DEFAULT_COLUMNS)%' # The default columns in assembly tables and their order
partdb.table.assemblies_bom.default_columns: '%env(trim:string:TABLE_ASSEMBLIES_BOM_DEFAULT_COLUMNS)%' # The default columns in assembly bom tables and their order
######################################################################################################################
# Miscellaneous
######################################################################################################################

View file

@ -164,10 +164,6 @@ services:
arguments:
$saml_enabled: '%partdb.saml.enabled%'
App\Form\AdminPages\AssemblyAdminForm:
arguments:
$useAssemblyIpnPlaceholder: '%partdb.create_assembly_use_ipn_placeholder_in_name%'
App\Validator\Constraints\AssemblySystem\AssemblyCycleValidator:
tags: [ 'validator.constraint_validator' ]
@ -177,12 +173,6 @@ services:
App\DataTables\Helpers\ColumnSortHelper:
shared: false # Service has a state so not share it between different tables
App\DataTables\AssemblyDataTable:
arguments:
$visible_columns: '%partdb.table.assemblies.default_columns%'
App\DataTables\AssemblyBomEntriesDataTable:
arguments:
$visible_columns: '%partdb.table.assemblies_bom.default_columns%'
####################################################################################################################
# Label system
@ -206,8 +196,6 @@ services:
####################################################################################################################
App\Services\Trees\TreeViewGenerator:
arguments:
$rootNodeExpandedByDefault: '%partdb.sidebar.root_expanded%'
$rootNodeEnabled: '%partdb.sidebar.root_node_enable%'
$dataSourceSynonyms: '%partdb.data_sources.synonyms%'
App\Services\Trees\ToolsTreeBuilder:
arguments:

View file

@ -18,42 +18,42 @@ final class Version20250304081039 extends AbstractMultiPlatformMigration
{
$this->addSql(<<<'SQL'
CREATE TABLE assemblies (
id INT AUTO_INCREMENT NOT NULL,
parent_id INT DEFAULT NULL,
id_preview_attachment INT DEFAULT NULL,
name VARCHAR(255) NOT NULL,
comment LONGTEXT NOT NULL,
not_selectable TINYINT(1) NOT NULL,
alternative_names LONGTEXT DEFAULT NULL,
order_quantity INT NOT NULL,
status VARCHAR(64) DEFAULT NULL,
order_only_missing_parts TINYINT(1) NOT NULL,
description LONGTEXT NOT NULL,
last_modified DATETIME DEFAULT CURRENT_TIMESTAMP NOT NULL,
datetime_added DATETIME DEFAULT CURRENT_TIMESTAMP NOT NULL,
INDEX IDX_5F3832C0727ACA70 (parent_id),
INDEX IDX_5F3832C0EA7100A1 (id_preview_attachment),
id INT AUTO_INCREMENT NOT NULL,
parent_id INT DEFAULT NULL,
id_preview_attachment INT DEFAULT NULL,
name VARCHAR(255) NOT NULL,
comment LONGTEXT NOT NULL,
not_selectable TINYINT(1) NOT NULL,
alternative_names LONGTEXT DEFAULT NULL,
order_quantity INT NOT NULL,
status VARCHAR(64) DEFAULT NULL,
order_only_missing_parts TINYINT(1) NOT NULL,
description LONGTEXT NOT NULL,
last_modified DATETIME DEFAULT CURRENT_TIMESTAMP NOT NULL,
datetime_added DATETIME DEFAULT CURRENT_TIMESTAMP NOT NULL,
INDEX IDX_5F3832C0727ACA70 (parent_id),
INDEX IDX_5F3832C0EA7100A1 (id_preview_attachment),
PRIMARY KEY(id)
) DEFAULT CHARACTER SET utf8mb4 COLLATE `utf8mb4_unicode_ci`
SQL);
$this->addSql(<<<'SQL'
CREATE TABLE assembly_bom_entries (
id INT AUTO_INCREMENT NOT NULL,
id_assembly INT DEFAULT NULL,
id_part INT DEFAULT NULL,
id_project INT DEFAULT NULL,
quantity DOUBLE PRECISION NOT NULL,
mountnames LONGTEXT NOT NULL,
name VARCHAR(255) DEFAULT NULL,
comment LONGTEXT NOT NULL,
price NUMERIC(11, 5) DEFAULT NULL,
price_currency_id INT DEFAULT NULL,
last_modified DATETIME DEFAULT CURRENT_TIMESTAMP NOT NULL,
datetime_added DATETIME DEFAULT CURRENT_TIMESTAMP NOT NULL,
INDEX IDX_8C74887E2F180363 (id_assembly),
INDEX IDX_8C74887EC22F6CC4 (id_part),
INDEX IDX_8C74887EF12E799E (id_project),
INDEX IDX_8C74887E3FFDCD60 (price_currency_id),
id INT AUTO_INCREMENT NOT NULL,
id_assembly INT DEFAULT NULL,
id_part INT DEFAULT NULL,
id_project INT DEFAULT NULL,
quantity DOUBLE PRECISION NOT NULL,
mountnames LONGTEXT NOT NULL,
name VARCHAR(255) DEFAULT NULL,
comment LONGTEXT NOT NULL,
price NUMERIC(11, 5) DEFAULT NULL,
price_currency_id INT DEFAULT NULL,
last_modified DATETIME DEFAULT CURRENT_TIMESTAMP NOT NULL,
datetime_added DATETIME DEFAULT CURRENT_TIMESTAMP NOT NULL,
INDEX IDX_8C74887E2F180363 (id_assembly),
INDEX IDX_8C74887EC22F6CC4 (id_part),
INDEX IDX_8C74887EF12E799E (id_project),
INDEX IDX_8C74887E3FFDCD60 (price_currency_id),
PRIMARY KEY(id)
) DEFAULT CHARACTER SET utf8mb4 COLLATE `utf8mb4_unicode_ci`
SQL);
@ -109,7 +109,7 @@ final class Version20250304081039 extends AbstractMultiPlatformMigration
{
$this->addSql(<<<'SQL'
CREATE TABLE assemblies (
id INTEGER PRIMARY KEY AUTOINCREMENT NOT NULL,
id INTEGER PRIMARY KEY AUTOINCREMENT NOT NULL,
parent_id INTEGER DEFAULT NULL,
id_preview_attachment INTEGER DEFAULT NULL,
order_quantity INTEGER NOT NULL,
@ -120,7 +120,7 @@ final class Version20250304081039 extends AbstractMultiPlatformMigration
last_modified DATETIME DEFAULT CURRENT_TIMESTAMP NOT NULL,
datetime_added DATETIME DEFAULT CURRENT_TIMESTAMP NOT NULL,
status VARCHAR(64) DEFAULT NULL,
ipn VARCHAR(100) DEFAULT NULL,
ipn VARCHAR(100) DEFAULT NULL,
description CLOB NOT NULL,
alternative_names CLOB DEFAULT NULL,
CONSTRAINT FK_5F3832C0727ACA70 FOREIGN KEY (parent_id) REFERENCES assemblies (id) NOT DEFERRABLE INITIALLY IMMEDIATE,
@ -145,7 +145,6 @@ final class Version20250304081039 extends AbstractMultiPlatformMigration
id INTEGER PRIMARY KEY AUTOINCREMENT NOT NULL,
id_assembly INTEGER DEFAULT NULL,
id_part INTEGER DEFAULT NULL,
id_project INTEGER DEFAULT NULL,
id_referenced_assembly INTEGER DEFAULT NULL,
price_currency_id INTEGER DEFAULT NULL,
quantity DOUBLE PRECISION NOT NULL,
@ -157,9 +156,8 @@ final class Version20250304081039 extends AbstractMultiPlatformMigration
datetime_added DATETIME DEFAULT CURRENT_TIMESTAMP NOT NULL,
CONSTRAINT FK_8C74887E4AD2039E FOREIGN KEY (id_assembly) REFERENCES assemblies (id) NOT DEFERRABLE INITIALLY IMMEDIATE,
CONSTRAINT FK_8C74887EC22F6CC4 FOREIGN KEY (id_part) REFERENCES "parts" (id) NOT DEFERRABLE INITIALLY IMMEDIATE,
CONSTRAINT FK_8C74887EF12E799E FOREIGN KEY (id_project) REFERENCES projects (id) NOT DEFERRABLE INITIALLY IMMEDIATE,
CONSTRAINT FK_8C74887E22522999 FOREIGN KEY (id_referenced_assembly) REFERENCES assemblies (id) ON UPDATE NO ACTION ON DELETE SET NULL NOT DEFERRABLE INITIALLY IMMEDIATE,
CONSTRAINT FK_8C74887E3FFDCD60 FOREIGN KEY (price_currency_id) REFERENCES currencies (id) NOT DEFERRABLE INITIALLY IMMEDIATE
CONSTRAINT FK_8C74887E22522999 FOREIGN KEY (id_referenced_assembly) REFERENCES assemblies (id) ON UPDATE NO ACTION ON DELETE SET NULL NOT DEFERRABLE INITIALLY IMMEDIATE,
CONSTRAINT FK_8C74887E3FFDCD60 FOREIGN KEY (price_currency_id) REFERENCES currencies (id) NOT DEFERRABLE INITIALLY IMMEDIATE
)
SQL);
$this->addSql(<<<'SQL'
@ -168,9 +166,6 @@ final class Version20250304081039 extends AbstractMultiPlatformMigration
$this->addSql(<<<'SQL'
CREATE INDEX IDX_8C74887EC22F6CC4 ON assembly_bom_entries (id_part)
SQL);
$this->addSql(<<<'SQL'
CREATE INDEX IDX_8C74887EF12E799E ON assembly_bom_entries (id_project)
SQL);
$this->addSql(<<<'SQL'
CREATE INDEX IDX_8C74887E22522999 ON assembly_bom_entries (id_referenced_assembly)
SQL);
@ -193,19 +188,19 @@ final class Version20250304081039 extends AbstractMultiPlatformMigration
{
$this->addSql(<<<'SQL'
CREATE TABLE assemblies (
id INT GENERATED BY DEFAULT AS IDENTITY NOT NULL,
name VARCHAR(255) NOT NULL,
last_modified TIMESTAMP(0) WITHOUT TIME ZONE DEFAULT CURRENT_TIMESTAMP NOT NULL,
datetime_added TIMESTAMP(0) WITHOUT TIME ZONE DEFAULT CURRENT_TIMESTAMP NOT NULL,
comment TEXT NOT NULL,
not_selectable BOOLEAN NOT NULL,
alternative_names TEXT DEFAULT NULL,
order_quantity INT NOT NULL,
status VARCHAR(64) DEFAULT NULL,
order_only_missing_parts BOOLEAN NOT NULL,
description TEXT NOT NULL,
parent_id INT DEFAULT NULL,
id_preview_attachment INT DEFAULT NULL,
id INT GENERATED BY DEFAULT AS IDENTITY NOT NULL,
name VARCHAR(255) NOT NULL,
last_modified TIMESTAMP(0) WITHOUT TIME ZONE DEFAULT CURRENT_TIMESTAMP NOT NULL,
datetime_added TIMESTAMP(0) WITHOUT TIME ZONE DEFAULT CURRENT_TIMESTAMP NOT NULL,
comment TEXT NOT NULL,
not_selectable BOOLEAN NOT NULL,
alternative_names TEXT DEFAULT NULL,
order_quantity INT NOT NULL,
status VARCHAR(64) DEFAULT NULL,
order_only_missing_parts BOOLEAN NOT NULL,
description TEXT NOT NULL,
parent_id INT DEFAULT NULL,
id_preview_attachment INT DEFAULT NULL,
PRIMARY KEY(id)
)
SQL);
@ -217,18 +212,17 @@ final class Version20250304081039 extends AbstractMultiPlatformMigration
SQL);
$this->addSql(<<<'SQL'
CREATE TABLE assembly_bom_entries (
id INT GENERATED BY DEFAULT AS IDENTITY NOT NULL,
id_assembly INT DEFAULT NULL,
id_part INT DEFAULT NULL,
id_project INT DEFAULT NULL,
quantity DOUBLE PRECISION NOT NULL,
mountnames TEXT NOT NULL,
name VARCHAR(255) DEFAULT NULL,
comment TEXT NOT NULL,
price NUMERIC(11, 5) DEFAULT NULL,
id INT GENERATED BY DEFAULT AS IDENTITY NOT NULL,
id_assembly INT DEFAULT NULL,
id_part INT DEFAULT NULL,
quantity DOUBLE PRECISION NOT NULL,
mountnames TEXT NOT NULL,
name VARCHAR(255) DEFAULT NULL,
comment TEXT NOT NULL,
price NUMERIC(11, 5) DEFAULT NULL,
price_currency_id INT DEFAULT NULL,
last_modified TIMESTAMP(0) WITHOUT TIME ZONE DEFAULT CURRENT_TIMESTAMP NOT NULL,
datetime_added TIMESTAMP(0) WITHOUT TIME ZONE DEFAULT CURRENT_TIMESTAMP NOT NULL,
last_modified TIMESTAMP(0) WITHOUT TIME ZONE DEFAULT CURRENT_TIMESTAMP NOT NULL,
datetime_added TIMESTAMP(0) WITHOUT TIME ZONE DEFAULT CURRENT_TIMESTAMP NOT NULL,
PRIMARY KEY(id)
)
SQL);
@ -238,9 +232,6 @@ final class Version20250304081039 extends AbstractMultiPlatformMigration
$this->addSql(<<<'SQL'
CREATE INDEX IDX_8C74887EC22F6CC4 ON assembly_bom_entries (id_part)
SQL);
$this->addSql(<<<'SQL'
CREATE INDEX IDX_8C74887EF12E799E ON assembly_bom_entries (id_project)
SQL);
$this->addSql(<<<'SQL'
CREATE INDEX IDX_8C74887E3FFDCD60 ON assembly_bom_entries (price_currency_id)
SQL);
@ -256,9 +247,6 @@ final class Version20250304081039 extends AbstractMultiPlatformMigration
$this->addSql(<<<'SQL'
ALTER TABLE assembly_bom_entries ADD CONSTRAINT FK_8C74887EC22F6CC4 FOREIGN KEY (id_part) REFERENCES "parts" (id) NOT DEFERRABLE INITIALLY IMMEDIATE
SQL);
$this->addSql(<<<'SQL'
ALTER TABLE assembly_bom_entries ADD CONSTRAINT FK_8C74887EF12E799E FOREIGN KEY (id_project) REFERENCES "projects" (id) NOT DEFERRABLE INITIALLY IMMEDIATE
SQL);
$this->addSql(<<<'SQL'
ALTER TABLE assembly_bom_entries ADD CONSTRAINT FK_8C74887E3FFDCD60 FOREIGN KEY (price_currency_id) REFERENCES currencies (id) NOT DEFERRABLE INITIALLY IMMEDIATE
SQL);

View file

@ -17,7 +17,7 @@ final class Version20250627130848 extends AbstractMultiPlatformMigration
public function mySQLUp(Schema $schema): void
{
$this->addSql(<<<'SQL'
ALTER TABLE assembly_bom_entries ADD id_referenced_assembly INT DEFAULT NULL AFTER id_project
ALTER TABLE assembly_bom_entries ADD id_referenced_assembly INT DEFAULT NULL AFTER id_part
SQL);
$this->addSql(<<<'SQL'
ALTER TABLE assembly_bom_entries ADD CONSTRAINT FK_8C74887E22522999 FOREIGN KEY (id_referenced_assembly) REFERENCES assemblies (id) ON DELETE SET NULL

View file

@ -0,0 +1,51 @@
<?php
declare(strict_types=1);
namespace DoctrineMigrations;
use App\Migration\AbstractMultiPlatformMigration;
use Doctrine\DBAL\Schema\Schema;
use Doctrine\Migrations\AbstractMigration;
final class Version20250910113423 extends AbstractMultiPlatformMigration
{
public function getDescription(): string
{
return 'Remove project_id from assembly_bom_entries because it is not needed.';
}
public function mySQLUp(Schema $schema): void
{
$this->addSql('ALTER TABLE assembly_bom_entries DROP FOREIGN KEY `FK_8C74887EF12E799E`');
$this->addSql('DROP INDEX IDX_8C74887EF12E799E ON assembly_bom_entries');
$this->addSql('ALTER TABLE assembly_bom_entries DROP id_project');
}
public function mySQLDown(Schema $schema): void
{
$this->addSql('ALTER TABLE assembly_bom_entries ADD id_project INT DEFAULT NULL');
$this->addSql('ALTER TABLE assembly_bom_entries ADD CONSTRAINT `FK_8C74887EF12E799E` FOREIGN KEY (id_project) REFERENCES projects (id)');
$this->addSql('CREATE INDEX IDX_8C74887EF12E799E ON assembly_bom_entries (id_project)');
}
public function sqLiteUp(Schema $schema): void
{
//nothing to do. Already removed from AssemblyBOMEntry and Version20250304081039
}
public function sqLiteDown(Schema $schema): void
{
//nothing to do.
}
public function postgreSQLUp(Schema $schema): void
{
//nothing to do. Already removed from AssemblyBOMEntry and Version20250304081039
}
public function postgreSQLDown(Schema $schema): void
{
//nothing to do.
}
}

View file

@ -216,6 +216,7 @@ class AssemblyController extends AbstractController
'assembly.bom_import.type.json' => 'json',
'assembly.bom_import.type.csv' => 'csv',
'assembly.bom_import.type.kicad_pcbnew' => 'kicad_pcbnew',
'assembly.bom_import.type.kicad_schematic' => 'kicad_schematic',
]
]);
$builder->add('clear_existing_bom', CheckboxType::class, [

View file

@ -193,10 +193,6 @@ class ProjectController extends AbstractController
}
// For PCB imports, proceed directly
$entries = $BOMImporter->importFileIntoProject($form->get('file')->getData(), $project, [
'type' => $import_type,
]);
$importerResult = $BOMImporter->importFileIntoProject($form->get('file')->getData(), $project, [
'type' => $import_type,
]);
@ -425,7 +421,7 @@ class ProjectController extends AbstractController
}
// Import with field mapping and priorities (validation already passed)
$entries = $BOMImporter->stringToBOMEntries($file_content, [
$entries = $BOMImporter->stringToBOMEntries($project, $file_content, [
'type' => 'kicad_schematic',
'field_mapping' => $field_mapping,
'field_priorities' => $field_priorities,

View file

@ -34,8 +34,8 @@ use App\Entity\Attachments\Attachment;
use App\Entity\Parts\Part;
use App\Entity\AssemblySystem\AssemblyBOMEntry;
use App\Entity\ProjectSystem\Project;
use App\Services\EntityURLGenerator;
use App\Services\Formatters\AmountFormatter;
use App\Settings\BehaviorSettings\TableSettings;
use Doctrine\ORM\QueryBuilder;
use Omines\DataTablesBundle\Adapter\Doctrine\ORM\SearchCriteriaProvider;
use Omines\DataTablesBundle\Adapter\Doctrine\ORMAdapter;
@ -47,15 +47,14 @@ use Symfony\Contracts\Translation\TranslatorInterface;
class AssemblyBomEntriesDataTable implements DataTableTypeInterface
{
public function __construct(
protected TranslatorInterface $translator,
protected PartDataTableHelper $partDataTableHelper,
protected ProjectDataTableHelper $projectDataTableHelper,
protected AssemblyDataTableHelper $assemblyDataTableHelper,
protected EntityURLGenerator $entityURLGenerator,
protected AmountFormatter $amountFormatter,
private string $visible_columns,
private ColumnSortHelper $csh
){
private readonly TranslatorInterface $translator,
private readonly PartDataTableHelper $partDataTableHelper,
private readonly ProjectDataTableHelper $projectDataTableHelper,
private readonly AssemblyDataTableHelper $assemblyDataTableHelper,
private readonly AmountFormatter $amountFormatter,
private readonly ColumnSortHelper $csh,
private readonly TableSettings $tableSettings,
) {
}
public function configure(DataTable $dataTable, array $options): void
@ -200,11 +199,11 @@ class AssemblyBomEntriesDataTable implements DataTableTypeInterface
])
->add('lastModified', LocaleDateTimeColumn::class, [
'label' => $this->translator->trans('part.table.lastModified'),
])
;
]);
//Apply the user configured order and visibility and add the columns to the table
$this->csh->applyVisibilityAndConfigureColumns($dataTable, $this->visible_columns,"TABLE_ASSEMBLIES_BOM_DEFAULT_COLUMNS");
$this->csh->applyVisibilityAndConfigureColumns($dataTable, $this->tableSettings->assembliesBomDefaultColumns,
"TABLE_ASSEMBLIES_BOM_DEFAULT_COLUMNS");
$dataTable->addOrderBy('name');

View file

@ -34,6 +34,7 @@ use App\DataTables\Helpers\ColumnSortHelper;
use App\Doctrine\Helpers\FieldHelper;
use App\Entity\AssemblySystem\Assembly;
use App\Services\EntityURLGenerator;
use App\Settings\BehaviorSettings\TableSettings;
use Doctrine\ORM\AbstractQuery;
use Doctrine\ORM\QueryBuilder;
use Omines\DataTablesBundle\Adapter\Doctrine\ORM\SearchCriteriaProvider;
@ -53,8 +54,8 @@ final class AssemblyDataTable implements DataTableTypeInterface
private readonly TranslatorInterface $translator,
private readonly AssemblyDataTableHelper $assemblyDataTableHelper,
private readonly Security $security,
private readonly string $visible_columns,
private readonly ColumnSortHelper $csh,
private readonly TableSettings $tableSettings,
) {
}
@ -139,7 +140,8 @@ final class AssemblyDataTable implements DataTableTypeInterface
]);
//Apply the user configured order and visibility and add the columns to the table
$this->csh->applyVisibilityAndConfigureColumns($dataTable, $this->visible_columns, "TABLE_ASSEMBLIES_DEFAULT_COLUMNS");
$this->csh->applyVisibilityAndConfigureColumns($dataTable, $this->tableSettings->assembliesDefaultColumns,
"TABLE_ASSEMBLIES_DEFAULT_COLUMNS");
$dataTable->addOrderBy('name')
->createAdapter(TwoStepORMAdapter::class, [

View file

@ -149,18 +149,6 @@ class AssemblyBOMEntry extends AbstractDBElement implements UniqueValidatableInt
#[Groups(['bom_entry:read', 'bom_entry:write'])]
protected ?Assembly $referencedAssembly = null;
/**
* @var Project|null The associated project
*/
#[Assert\Expression(
'(this.getPart() === null or this.getProject() === null) and (this.getName() === null or (this.getName() != null and this.getName() != ""))',
message: 'validator.project.bom_entry.only_part_or_assembly_allowed'
)]
#[ORM\ManyToOne(targetEntity: Project::class)]
#[ORM\JoinColumn(name: 'id_project', nullable: true)]
#[Groups(['bom_entry:read', 'bom_entry:write'])]
protected ?Project $project = null;
/**
* @var BigDecimal|null The price of this non-part BOM entry
*/

View file

@ -26,6 +26,7 @@ use App\Entity\Base\AbstractNamedDBElement;
use App\Form\AssemblySystem\AssemblyBOMEntryCollectionType;
use App\Form\Type\RichTextEditorType;
use App\Services\LogSystem\EventCommentNeededHelper;
use App\Settings\MiscSettings\AssemblySettings;
use Symfony\Bundle\SecurityBundle\Security;
use Symfony\Component\Form\Extension\Core\Type\ChoiceType;
use Symfony\Component\Form\Extension\Core\Type\TextType;
@ -36,9 +37,9 @@ class AssemblyAdminForm extends BaseEntityAdminForm
public function __construct(
protected Security $security,
protected EventCommentNeededHelper $eventCommentNeededHelper,
protected bool $useAssemblyIpnPlaceholder = false
protected AssemblySettings $assemblySettings,
) {
parent::__construct($security, $eventCommentNeededHelper, $useAssemblyIpnPlaceholder);
parent::__construct($security, $eventCommentNeededHelper, $assemblySettings);
}
protected function additionalFormElements(FormBuilderInterface $builder, array $options, AbstractNamedDBElement $entity): void

View file

@ -27,6 +27,7 @@ use App\Entity\PriceInformations\Currency;
use App\Entity\ProjectSystem\Project;
use App\Entity\UserSystem\Group;
use App\Services\LogSystem\EventCommentType;
use App\Settings\MiscSettings\AssemblySettings;
use Symfony\Bundle\SecurityBundle\Security;
use App\Entity\Base\AbstractNamedDBElement;
use App\Entity\Base\AbstractStructuralDBElement;
@ -51,7 +52,7 @@ class BaseEntityAdminForm extends AbstractType
public function __construct(
protected Security $security,
protected EventCommentNeededHelper $eventCommentNeededHelper,
protected bool $useAssemblyIpnPlaceholder = false
protected AssemblySettings $assemblySettings,
) {
}
@ -73,7 +74,7 @@ class BaseEntityAdminForm extends AbstractType
->add('name', TextType::class, [
'empty_data' => '',
'label' => 'name.label',
'data' => $is_new && $entity instanceof Assembly && $this->useAssemblyIpnPlaceholder ? '%%ipn%%' : $entity->getName(),
'data' => $is_new && $entity instanceof Assembly && $this->assemblySettings->useIpnPlaceholderInName ? '%%ipn%%' : $entity->getName(),
'attr' => [
'placeholder' => 'part.name.placeholder',
],

View file

@ -63,19 +63,29 @@ class BOMImporter
5 => 'Supplier and ref',
];
private readonly PartRepository $partRepository;
private readonly ManufacturerRepository $manufacturerRepository;
private readonly CategoryRepository $categoryRepository;
private readonly DBElementRepository $projectBomEntryRepository;
private readonly DBElementRepository $assemblyBomEntryRepository;
private string $jsonRoot = '';
public function __construct(
private readonly EntityManagerInterface $entityManager,
private readonly LoggerInterface $logger,
private readonly BOMValidationService $validationService,
private readonly PartRepository $partRepository,
private readonly ManufacturerRepository $manufacturerRepository,
private readonly CategoryRepository $categoryRepository,
private readonly DBElementRepository $projectBOMEntryRepository,
private readonly DBElementRepository $assemblyBOMEntryRepositor,
private readonly TranslatorInterface $translator
) {
$this->partRepository = $this->entityManager->getRepository(Part::class);
$this->manufacturerRepository = $this->entityManager->getRepository(Manufacturer::class);
$this->categoryRepository = $this->entityManager->getRepository(Category::class);
$this->projectBomEntryRepository = $this->entityManager->getRepository(ProjectBOMEntry::class);
$this->assemblyBomEntryRepository = $this->entityManager->getRepository(AssemblyBOMEntry::class);
}
protected function configureOptions(OptionsResolver $resolver): OptionsResolver
@ -244,7 +254,7 @@ class BOMImporter
$options = $resolver->resolve($options);
return match ($options['type']) {
self::IMPORT_TYPE_KICAD_PCB => $this->parseKiCADPCB($data, $objectType)->getBomEntries(),
self::IMPORT_TYPE_KICAD_PCB => $this->parseKiCADPCB($data, $importObject)->getBomEntries(),
self::IMPORT_TYPE_KICAD_SCHEMATIC => $this->parseKiCADSchematic($data, $options),
default => throw new InvalidArgumentException($this->translator->trans('validator.bom_importer.invalid_import_type', [], 'validators')),
};
@ -272,7 +282,7 @@ class BOMImporter
));
return match ($options['type']) {
self::IMPORT_TYPE_KICAD_PCB => $this->parseKiCADPCB($importObject, $data, $options),
self::IMPORT_TYPE_KICAD_PCB => $this->parseKiCADPCB($data, $importObject),
self::IMPORT_TYPE_JSON => $this->parseJson($importObject, $data),
self::IMPORT_TYPE_CSV => $this->parseCsv($importObject, $data),
default => $defaultImporterResult,
@ -286,14 +296,13 @@ class BOMImporter
* validates the required fields, and creates BOM entries for each record in the data.
* The BOM entries are added to the provided Project or Assembly, depending on the context.
*
* @param string $data The semicolon- or comma-delimited CSV data to be parsed.
* @param Project|Assembly $importObject The object determining the context of the BOM entry (either a Project or Assembly).
* @param string $data The semicolon- or comma-delimited CSV data to be parsed.
*
* @return ImporterResult The result of the import process, containing the created BOM entries.
*
* @throws UnexpectedValueException If required fields are missing in the provided data.
*/
private function parseKiCADPCB(Project|Assembly $importObject, string $data): ImporterResult
private function parseKiCADPCB(string $data, Project|Assembly $importObject): ImporterResult
{
$result = new ImporterResult();
@ -818,11 +827,11 @@ class BOMImporter
}
if ($importObject instanceof Assembly) {
$bomEntry = $this->assemblyBOMEntryRepository->findOneBy(['assembly' => $importObject, 'part' => $part]);
$bomEntry = $this->assemblyBomEntryRepository->findOneBy(['assembly' => $importObject, 'part' => $part]);
if ($bomEntry === null) {
if (isset($entry['name']) && $entry['name'] !== '') {
$bomEntry = $this->assemblyBOMEntryRepository->findOneBy(['assembly' => $importObject, 'name' => $entry['name']]);
$bomEntry = $this->assemblyBomEntryRepository->findOneBy(['assembly' => $importObject, 'name' => $entry['name']]);
}
if ($bomEntry === null) {
@ -830,11 +839,11 @@ class BOMImporter
}
}
} else {
$bomEntry = $this->projectBOMEntryRepository->findOneBy(['project' => $importObject, 'part' => $part]);
$bomEntry = $this->projectBomEntryRepository->findOneBy(['project' => $importObject, 'part' => $part]);
if ($bomEntry === null) {
if (isset($entry['name']) && $entry['name'] !== '') {
$bomEntry = $this->projectBOMEntryRepository->findOneBy(['project' => $importObject, 'name' => $entry['name']]);
$bomEntry = $this->projectBomEntryRepository->findOneBy(['project' => $importObject, 'name' => $entry['name']]);
}
if ($bomEntry === null) {

View file

@ -0,0 +1,46 @@
<?php
/*
* This file is part of Part-DB (https://github.com/Part-DB/Part-DB-symfony).
*
* Copyright (C) 2019 - 2024 Jan Böhmer (https://github.com/jbtronics)
*
* This program is free software: you can redistribute it and/or modify
* it under the terms of the GNU Affero General Public License as published
* by the Free Software Foundation, either version 3 of the License, or
* (at your option) any later version.
*
* This program is distributed in the hope that it will be useful,
* but WITHOUT ANY WARRANTY; without even the implied warranty of
* MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the
* GNU Affero General Public License for more details.
*
* You should have received a copy of the GNU Affero General Public License
* along with this program. If not, see <https://www.gnu.org/licenses/>.
*/
declare(strict_types=1);
namespace App\Settings\BehaviorSettings;
use Symfony\Contracts\Translation\TranslatableInterface;
use Symfony\Contracts\Translation\TranslatorInterface;
enum AssemblyBomTableColumns : string implements TranslatableInterface
{
case NAME = "name";
case ID = "id";
case QUANTITY = "quantity";
case IPN = "ipn";
case DESCRIPTION = "description";
public function trans(TranslatorInterface $translator, ?string $locale = null): string
{
$key = match($this) {
default => 'assembly.bom.table.' . $this->value,
};
return $translator->trans($key, locale: $locale);
}
}

View file

@ -0,0 +1,49 @@
<?php
/*
* This file is part of Part-DB (https://github.com/Part-DB/Part-DB-symfony).
*
* Copyright (C) 2019 - 2024 Jan Böhmer (https://github.com/jbtronics)
*
* This program is free software: you can redistribute it and/or modify
* it under the terms of the GNU Affero General Public License as published
* by the Free Software Foundation, either version 3 of the License, or
* (at your option) any later version.
*
* This program is distributed in the hope that it will be useful,
* but WITHOUT ANY WARRANTY; without even the implied warranty of
* MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the
* GNU Affero General Public License for more details.
*
* You should have received a copy of the GNU Affero General Public License
* along with this program. If not, see <https://www.gnu.org/licenses/>.
*/
declare(strict_types=1);
namespace App\Settings\BehaviorSettings;
use Symfony\Contracts\Translation\TranslatableInterface;
use Symfony\Contracts\Translation\TranslatorInterface;
enum AssemblyTableColumns : string implements TranslatableInterface
{
case NAME = "name";
case ID = "id";
case IPN = "ipn";
case DESCRIPTION = "description";
case REFERENCED_ASSEMBLIES = "referencedAssemblies";
case ADDED_DATE = "addedDate";
case LAST_MODIFIED = "lastModified";
case EDIT = "edit";
public function trans(TranslatorInterface $translator, ?string $locale = null): string
{
$key = match($this) {
default => 'assembly.table.' . $this->value,
};
return $translator->trans($key, locale: $locale);
}
}

View file

@ -53,7 +53,6 @@ class TableSettings
)]
public int $fullDefaultPageSize = 50;
/** @var PartTableColumns[] */
#[SettingsParameter(ArrayType::class,
label: new TM("settings.behavior.table.parts_default_columns"),
@ -70,6 +69,37 @@ class TableSettings
PartTableColumns::CATEGORY, PartTableColumns::FOOTPRINT, PartTableColumns::MANUFACTURER,
PartTableColumns::LOCATION, PartTableColumns::AMOUNT];
/** @var AssemblyTableColumns[] */
#[SettingsParameter(ArrayType::class,
label: new TM("settings.behavior.table.assemblies_default_columns"),
description: new TM("settings.behavior.table.assemblies_default_columns.help"),
options: ['type' => EnumType::class, 'options' => ['class' => AssemblyTableColumns::class]],
formType: \Symfony\Component\Form\Extension\Core\Type\EnumType::class,
formOptions: ['class' => AssemblyTableColumns::class, 'multiple' => true, 'ordered' => true],
envVar: "TABLE_ASSEMBLIES_DEFAULT_COLUMNS", envVarMode: EnvVarMode::OVERWRITE, envVarMapper: [self::class, 'mapAssembliesDefaultColumnsEnv']
)]
#[Assert\NotBlank()]
#[Assert\Unique()]
#[Assert\All([new Assert\Type(AssemblyTableColumns::class)])]
public array $assembliesDefaultColumns = [AssemblyTableColumns::ID, AssemblyTableColumns::IPN, AssemblyTableColumns::NAME,
AssemblyTableColumns::DESCRIPTION, AssemblyTableColumns::REFERENCED_ASSEMBLIES, AssemblyTableColumns::EDIT];
/** @var AssemblyBomTableColumns[] */
#[SettingsParameter(ArrayType::class,
label: new TM("settings.behavior.table.assemblies_bom_default_columns"),
description: new TM("settings.behavior.table.assemblies_bom_default_columns.help"),
options: ['type' => EnumType::class, 'options' => ['class' => AssemblyBomTableColumns::class]],
formType: \Symfony\Component\Form\Extension\Core\Type\EnumType::class,
formOptions: ['class' => AssemblyBomTableColumns::class, 'multiple' => true, 'ordered' => true],
envVar: "TABLE_ASSEMBLIES_BOM_DEFAULT_COLUMNS", envVarMode: EnvVarMode::OVERWRITE, envVarMapper: [self::class, 'mapAssemblyBomsDefaultColumnsEnv']
)]
#[Assert\NotBlank()]
#[Assert\Unique()]
#[Assert\All([new Assert\Type(AssemblyBomTableColumns::class)])]
public array $assembliesBomDefaultColumns = [AssemblyBomTableColumns::QUANTITY, AssemblyTableColumns::ID, AssemblyTableColumns::IPN,
AssemblyTableColumns::NAME, AssemblyTableColumns::DESCRIPTION];
#[SettingsParameter(label: new TM("settings.behavior.table.preview_image_min_width"),
formOptions: ['attr' => ['min' => 1, 'max' => 100]],
envVar: "int:TABLE_IMAGE_PREVIEW_MIN_SIZE", envVarMode: EnvVarMode::OVERWRITE
@ -101,4 +131,36 @@ class TableSettings
return $ret;
}
public static function mapAssembliesDefaultColumnsEnv(string $columns): array
{
$exploded = explode(',', $columns);
$ret = [];
foreach ($exploded as $column) {
$enum = AssemblyTableColumns::tryFrom($column);
if (!$enum) {
throw new \InvalidArgumentException("Invalid column '$column' in TABLE_ASSEMBLIES_DEFAULT_COLUMNS");
}
$ret[] = $enum;
}
return $ret;
}
public static function mapAssemblyBomsDefaultColumnsEnv(string $columns): array
{
$exploded = explode(',', $columns);
$ret = [];
foreach ($exploded as $column) {
$enum = AssemblyBomTableColumns::tryFrom($column);
if (!$enum) {
throw new \InvalidArgumentException("Invalid column '$column' in TABLE_ASSEMBLIES_BOM_DEFAULT_COLUMNS");
}
$ret[] = $enum;
}
return $ret;
}
}

View file

@ -0,0 +1,45 @@
<?php
/*
* This file is part of Part-DB (https://github.com/Part-DB/Part-DB-symfony).
*
* Copyright (C) 2019 - 2024 Jan Böhmer (https://github.com/jbtronics)
*
* This program is free software: you can redistribute it and/or modify
* it under the terms of the GNU Affero General Public License as published
* by the Free Software Foundation, either version 3 of the License, or
* (at your option) any later version.
*
* This program is distributed in the hope that it will be useful,
* but WITHOUT ANY WARRANTY; without even the implied warranty of
* MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the
* GNU Affero General Public License for more details.
*
* You should have received a copy of the GNU Affero General Public License
* along with this program. If not, see <https://www.gnu.org/licenses/>.
*/
declare(strict_types=1);
namespace App\Settings\MiscSettings;
use App\Settings\SettingsIcon;
use Jbtronics\SettingsBundle\Metadata\EnvVarMode;
use Jbtronics\SettingsBundle\Settings\Settings;
use Jbtronics\SettingsBundle\Settings\SettingsParameter;
use Jbtronics\SettingsBundle\Settings\SettingsTrait;
use Symfony\Component\Translation\TranslatableMessage as TM;
#[Settings(label: new TM("settings.misc.assembly"))]
#[SettingsIcon("fa-list")]
class AssemblySettings
{
use SettingsTrait;
#[SettingsParameter(
label: new TM("settings.misc.assembly.useIpnPlaceholderInName"),
envVar: "bool:CREATE_ASSEMBLY_USE_IPN_PLACEHOLDER_IN_NAME", envVarMode: EnvVarMode::OVERWRITE,
)]
public bool $useIpnPlaceholderInName = true;
}

View file

@ -34,4 +34,7 @@ class MiscSettings
#[EmbeddedSettings]
public ?ExchangeRateSettings $exchangeRate = null;
}
#[EmbeddedSettings]
public ?AssemblySettings $assembly = null;
}

View file

@ -13138,6 +13138,30 @@ Vezměte prosím na vědomí, že se nemůžete vydávat za uživatele se zakáz
<target>Sloupce, které se mají ve výchozím nastavení zobrazovat v částečných tabulkách. Pořadí položek lze změnit pomocí funkce drag &amp; drop.</target>
</segment>
</unit>
<unit id="u7bki9T" name="settings.behavior.table.assemblies_default_columns">
<segment state="translated">
<source>settings.behavior.table.assemblies_default_columns</source>
<target>Výchozí sloupce pro tabulky sestav</target>
</segment>
</unit>
<unit id="t4jhp3R" name="settings.behavior.table.assemblies_default_columns.help">
<segment state="translated">
<source>settings.behavior.table.assemblies_default_columns.help</source>
<target>Sloupce, které by měly být zobrazeny ve výchozím nastavení v tabulkách sestav. Pořadí prvků lze změnit přetažením.</target>
</segment>
</unit>
<unit id="Uj8ie5E" name="settings.behavior.table.assemblies_bom_default_columns">
<segment state="translated">
<source>settings.behavior.table.assemblies_bom_default_columns</source>
<target>Výchozí sloupce pro kusovníky sestav</target>
</segment>
</unit>
<unit id="uhb3diP" name="settings.behavior.table.assemblies_bom_default_columns.help">
<segment state="translated">
<source>settings.behavior.table.assemblies_bom_default_columns.help</source>
<target>Sloupce, které by měly být zobrazeny ve výchozím nastavení v kusovnících sestav. Pořadí prvků lze změnit přetažením.</target>
</segment>
</unit>
<unit id="hazr_g5" name="settings.ips.oemsecrets">
<segment state="translated">
<source>settings.ips.oemsecrets</source>
@ -13348,6 +13372,18 @@ Vezměte prosím na vědomí, že se nemůžete vydávat za uživatele se zakáz
<target>Pokud potřebujete směnné kurzy mezi měnami mimo eurozónu, můžete zde zadat API klíč z fixer.io.</target>
</segment>
</unit>
<unit id="akjcu4G" name="settings.misc.assembly">
<segment state="translated">
<source>settings.misc.assembly</source>
<target>Sestavy</target>
</segment>
</unit>
<unit id="Jiwgf9K" name="settings.misc.assembly.useIpnPlaceholderInName">
<segment state="translated">
<source>settings.misc.assembly.useIpnPlaceholderInName</source>
<target>Použít zástupný symbol %%ipn%% v názvu sestavy. Zástupný symbol bude při ukládání nahrazen vstupem IPN.</target>
</segment>
</unit>
<unit id="Ffr5xYM" name="settings.behavior.part_info">
<segment state="translated">
<source>settings.behavior.part_info</source>
@ -13792,6 +13828,12 @@ Vezměte prosím na vědomí, že se nemůžete vydávat za uživatele se zakáz
<target>CSV (KiCAD Pcbnew BOM)</target>
</segment>
</unit>
<unit id="oiuejI1" name="assembly.bom_import.type.kicad_schematic">
<segment state="translated">
<source>assembly.bom_import.type.kicad_schematic</source>
<target>KiCAD Schématický editor BOM (CSV soubor)</target>
</segment>
</unit>
<unit id="0IekETE" name="assembly.bom_import.clear_existing_bom">
<segment state="translated">
<source>assembly.bom_import.clear_existing_bom</source>
@ -14757,6 +14799,12 @@ Vezměte prosím na vědomí, že se nemůžete vydávat za uživatele se zakáz
<target>Popis</target>
</segment>
</unit>
<unit id="ahzol5T" name="assembly.table.referencedAssemblies">
<segment state="translated">
<source>assembly.table.referencedAssemblies</source>
<target>Referenceované sestavy</target>
</segment>
</unit>
<unit id="igaT4kQ" name="assembly.table.addedDate">
<segment state="translated">
<source>assembly.table.addedDate</source>
@ -14787,6 +14835,36 @@ Vezměte prosím na vědomí, že se nemůžete vydávat za uživatele se zakáz
<target>Neplatný regulární výraz (regex)</target>
</segment>
</unit>
<unit id="8uh6vTx" name="assembly.bom.table.id">
<segment state="translated">
<source>assembly.bom.table.id</source>
<target>ID</target>
</segment>
</unit>
<unit id="ijncxl3" name="assembly.bom.table.name">
<segment state="translated">
<source>assembly.bom.table.name</source>
<target>Název</target>
</segment>
</unit>
<unit id="Pe5Bkw1" name="assembly.bom.table.quantity">
<segment state="translated">
<source>assembly.bom.table.quantity</source>
<target>Množství</target>
</segment>
</unit>
<unit id="7hdpoc2" name="assembly.bom.table.ipn">
<segment state="translated">
<source>assembly.bom.table.ipn</source>
<target>IPN</target>
</segment>
</unit>
<unit id="1nbwdk5" name="assembly.bom.table.description">
<segment state="translated">
<source>assembly.bom.table.description</source>
<target>Popis</target>
</segment>
</unit>
<unit id="a7uOieC" name="datasource.synonym">
<segment state="translated">
<source>datasource.synonym</source>

View file

@ -12953,6 +12953,12 @@ Bemærk venligst, at du ikke kan kopiere fra deaktiveret bruger. Hvis du prøver
<target>CSV (KiCAD Pcbnew BOM)</target>
</segment>
</unit>
<unit id="oiuejI1" name="assembly.bom_import.type.kicad_schematic">
<segment state="translated">
<source>assembly.bom_import.type.kicad_schematic</source>
<target>KiCAD Skematisk editor BOM (CSV-fil)</target>
</segment>
</unit>
<unit id="0IekETE" name="assembly.bom_import.clear_existing_bom">
<segment state="translated">
<source>assembly.bom_import.clear_existing_bom</source>
@ -13438,6 +13444,12 @@ Bemærk venligst, at du ikke kan kopiere fra deaktiveret bruger. Hvis du prøver
<target>Beskrivelse</target>
</segment>
</unit>
<unit id="ahzol5T" name="assembly.table.referencedAssemblies">
<segment state="translated">
<source>assembly.table.referencedAssemblies</source>
<target>Referencerede forsamlinger</target>
</segment>
</unit>
<unit id="igaT4kQ" name="assembly.table.addedDate">
<segment state="translated">
<source>assembly.table.addedDate</source>
@ -13468,6 +13480,36 @@ Bemærk venligst, at du ikke kan kopiere fra deaktiveret bruger. Hvis du prøver
<target>Ugyldigt regulært udtryk (regex)</target>
</segment>
</unit>
<unit id="8uh6vTx" name="assembly.bom.table.id">
<segment state="translated">
<source>assembly.bom.table.id</source>
<target>ID</target>
</segment>
</unit>
<unit id="ijncxl3" name="assembly.bom.table.name">
<segment state="translated">
<source>assembly.bom.table.name</source>
<target>Navn</target>
</segment>
</unit>
<unit id="Pe5Bkw1" name="assembly.bom.table.quantity">
<segment state="translated">
<source>assembly.bom.table.quantity</source>
<target>Mængde</target>
</segment>
</unit>
<unit id="7hdpoc2" name="assembly.bom.table.ipn">
<segment state="translated">
<source>assembly.bom.table.ipn</source>
<target>IPN</target>
</segment>
</unit>
<unit id="1nbwdk5" name="assembly.bom.table.description">
<segment state="translated">
<source>assembly.bom.table.description</source>
<target>Beskrivelse</target>
</segment>
</unit>
<unit id="a7uOieC" name="datasource.synonym">
<segment state="translated">
<source>datasource.synonym</source>

View file

@ -13236,6 +13236,30 @@ Bitte beachten Sie, dass Sie sich nicht als deaktivierter Benutzer ausgeben kön
<target>Die Spalten, die standardmäßig in Bauteiltabellen angezeigt werden sollen. Die Reihenfolge der Elemente kann per Drag &amp; Drop geändert werden.</target>
</segment>
</unit>
<unit id="u7bki9T" name="settings.behavior.table.assemblies_default_columns">
<segment state="translated">
<source>settings.behavior.table.assemblies_default_columns</source>
<target>Standardmäßige Spalten für Baugruppentabellen</target>
</segment>
</unit>
<unit id="t4jhp3R" name="settings.behavior.table.assemblies_default_columns.help">
<segment state="translated">
<source>settings.behavior.table.assemblies_default_columns.help</source>
<target>Die Spalten, die standardmäßig in Baugruppentabellen angezeigt werden sollen. Die Reihenfolge der Elemente kann per Drag &amp; Drop geändert werden.</target>
</segment>
</unit>
<unit id="Uj8ie5E" name="settings.behavior.table.assemblies_bom_default_columns">
<segment state="translated">
<source>settings.behavior.table.assemblies_bom_default_columns</source>
<target>Standardmäßige Spalten für Baugruppen-Stücklisten</target>
</segment>
</unit>
<unit id="uhb3diP" name="settings.behavior.table.assemblies_bom_default_columns.help">
<segment state="translated">
<source>settings.behavior.table.assemblies_bom_default_columns.help</source>
<target>Die Spalten, die standardmäßig in Baugruppen-Stücklisten angezeigt werden sollen. Die Reihenfolge der Elemente kann per Drag &amp; Drop geändert werden.</target>
</segment>
</unit>
<unit id="hazr_g5" name="settings.ips.oemsecrets">
<segment state="translated">
<source>settings.ips.oemsecrets</source>
@ -13686,6 +13710,12 @@ Bitte beachten Sie, dass Sie sich nicht als deaktivierter Benutzer ausgeben kön
<target>CSV (KiCAD Pcbnew BOM)</target>
</segment>
</unit>
<unit id="oiuejI1" name="assembly.bom_import.type.kicad_schematic">
<segment state="translated">
<source>assembly.bom_import.type.kicad_schematic</source>
<target>KiCAD Schaltplaneditor BOM (CSV Datei)</target>
</segment>
</unit>
<unit id="0IekETE" name="assembly.bom_import.clear_existing_bom">
<segment state="translated">
<source>assembly.bom_import.clear_existing_bom</source>
@ -14201,6 +14231,18 @@ Bitte beachten Sie, dass Sie sich nicht als deaktivierter Benutzer ausgeben kön
<target>Wenn Sie Wechselkurse zwischen Nicht-Euro-Währungen benötigen, können Sie hier einen API-Schlüssel von fixer.io eingeben.</target>
</segment>
</unit>
<unit id="akjcu4G" name="settings.misc.assembly">
<segment state="translated">
<source>settings.misc.assembly</source>
<target>Baugruppen</target>
</segment>
</unit>
<unit id="Jiwgf9K" name="settings.misc.assembly.useIpnPlaceholderInName">
<segment state="translated">
<source>settings.misc.assembly.useIpnPlaceholderInName</source>
<target>Verwenden Sie einen %%ipn%%-Platzhalter im Namen einer Baugruppe. Der Platzhalter wird beim Speichern durch die eingegebene IPN ersetzt.</target>
</segment>
</unit>
<unit id="Ffr5xYM" name="settings.behavior.part_info">
<segment state="translated">
<source>settings.behavior.part_info</source>
@ -15431,6 +15473,12 @@ Bitte beachten Sie, dass Sie sich nicht als deaktivierter Benutzer ausgeben kön
<target>Beschreibung</target>
</segment>
</unit>
<unit id="ahzol5T" name="assembly.table.referencedAssemblies">
<segment state="translated">
<source>assembly.table.referencedAssemblies</source>
<target>Referenzierte Baugruppen</target>
</segment>
</unit>
<unit id="igaT4kQ" name="assembly.table.addedDate">
<segment state="translated">
<source>assembly.table.addedDate</source>
@ -15461,6 +15509,36 @@ Bitte beachten Sie, dass Sie sich nicht als deaktivierter Benutzer ausgeben kön
<target>Ungültiger regulärer Ausdruck (regex)</target>
</segment>
</unit>
<unit id="8uh6vTx" name="assembly.bom.table.id">
<segment state="translated">
<source>assembly.bom.table.id</source>
<target>ID</target>
</segment>
</unit>
<unit id="ijncxl3" name="assembly.bom.table.name">
<segment state="translated">
<source>assembly.bom.table.name</source>
<target>Name</target>
</segment>
</unit>
<unit id="Pe5Bkw1" name="assembly.bom.table.quantity">
<segment state="translated">
<source>assembly.bom.table.quantity</source>
<target>Stückzahl</target>
</segment>
</unit>
<unit id="7hdpoc2" name="assembly.bom.table.ipn">
<segment state="translated">
<source>assembly.bom.table.ipn</source>
<target>IPN</target>
</segment>
</unit>
<unit id="1nbwdk5" name="assembly.bom.table.description">
<segment state="translated">
<source>assembly.bom.table.description</source>
<target>Beschreibung</target>
</segment>
</unit>
<unit id="a7uOieC" name="datasource.synonym">
<segment state="translated">
<source>datasource.synonym</source>

View file

@ -1961,6 +1961,12 @@
<target>CSV (KiCAD Pcbnew BOM)</target>
</segment>
</unit>
<unit id="oiuejI1" name="assembly.bom_import.type.kicad_schematic">
<segment state="translated">
<source>assembly.bom_import.type.kicad_schematic</source>
<target>KiCAD Σχηματικό BOM (CSV αρχείο)</target>
</segment>
</unit>
<unit id="0IekETE" name="assembly.bom_import.clear_existing_bom">
<segment state="translated">
<source>assembly.bom_import.clear_existing_bom</source>
@ -2446,6 +2452,12 @@
<target>Περιγραφή</target>
</segment>
</unit>
<unit id="ahzol5T" name="assembly.table.referencedAssemblies">
<segment state="translated">
<source>assembly.table.referencedAssemblies</source>
<target>Αναφερόμενες συναρμολογήσεις</target>
</segment>
</unit>
<unit id="igaT4kQ" name="assembly.table.addedDate">
<segment state="translated">
<source>assembly.table.addedDate</source>
@ -2476,6 +2488,36 @@
<target>Μη έγκυρη κανονική έκφραση (regex)</target>
</segment>
</unit>
<unit id="8uh6vTx" name="assembly.bom.table.id">
<segment state="translated">
<source>assembly.bom.table.id</source>
<target>ID</target>
</segment>
</unit>
<unit id="ijncxl3" name="assembly.bom.table.name">
<segment state="translated">
<source>assembly.bom.table.name</source>
<target>Όνομα</target>
</segment>
</unit>
<unit id="Pe5Bkw1" name="assembly.bom.table.quantity">
<segment state="translated">
<source>assembly.bom.table.quantity</source>
<target>Ποσότητα</target>
</segment>
</unit>
<unit id="7hdpoc2" name="assembly.bom.table.ipn">
<segment state="translated">
<source>assembly.bom.table.ipn</source>
<target>IPN</target>
</segment>
</unit>
<unit id="1nbwdk5" name="assembly.bom.table.description">
<segment state="translated">
<source>assembly.bom.table.description</source>
<target>Περιγραφή</target>
</segment>
</unit>
<unit id="a7uOieC" name="datasource.synonym">
<segment state="translated">
<source>datasource.synonym</source>

View file

@ -13237,6 +13237,30 @@ Please note, that you can not impersonate a disabled user. If you try you will g
<target>The columns to show by default in part tables. Order of items can be changed via drag &amp; drop.</target>
</segment>
</unit>
<unit id="u7bki9T" name="settings.behavior.table.assemblies_default_columns">
<segment state="translated">
<source>settings.behavior.table.assemblies_default_columns</source>
<target>Default columns for assembly tables</target>
</segment>
</unit>
<unit id="t4jhp3R" name="settings.behavior.table.assemblies_default_columns.help">
<segment state="translated">
<source>settings.behavior.table.assemblies_default_columns.help</source>
<target>The columns to show by default in assembly tables. Order of items can be changed via drag &amp; drop.</target>
</segment>
</unit>
<unit id="Uj8ie5E" name="settings.behavior.table.assemblies_bom_default_columns">
<segment state="translated">
<source>settings.behavior.table.assemblies_bom_default_columns</source>
<target>Default columns for assembly BOM tables</target>
</segment>
</unit>
<unit id="uhb3diP" name="settings.behavior.table.assemblies_bom_default_columns.help">
<segment state="translated">
<source>settings.behavior.table.assemblies_bom_default_columns.help</source>
<target>The columns to show by default in assembly BOM tables. Order of items can be changed via drag &amp; drop.</target>
</segment>
</unit>
<unit id="hazr_g5" name="settings.ips.oemsecrets">
<segment state="translated">
<source>settings.ips.oemsecrets</source>
@ -13687,6 +13711,12 @@ Please note, that you can not impersonate a disabled user. If you try you will g
<target>CSV (KiCAD Pcbnew BOM)</target>
</segment>
</unit>
<unit id="oiuejI1" name="assembly.bom_import.type.kicad_schematic">
<segment state="translated">
<source>assembly.bom_import.type.kicad_schematic</source>
<target>KiCAD Schematic BOM (CSV file)</target>
</segment>
</unit>
<unit id="0IekETE" name="assembly.bom_import.clear_existing_bom">
<segment state="translated">
<source>assembly.bom_import.clear_existing_bom</source>
@ -14202,6 +14232,18 @@ Please note, that you can not impersonate a disabled user. If you try you will g
<target>If you need exchange rates between non-euro currencies, you can input an API key from fixer.io here.</target>
</segment>
</unit>
<unit id="akjcu4G" name="settings.misc.assembly">
<segment state="translated">
<source>settings.misc.assembly</source>
<target>Assemblies</target>
</segment>
</unit>
<unit id="Jiwgf9K" name="settings.misc.assembly.useIpnPlaceholderInName">
<segment state="translated">
<source>settings.misc.assembly.useIpnPlaceholderInName</source>
<target>Use an %%ipn%% placeholder in the name of an assembly. Placeholder is replaced with the ipn input while saving.</target>
</segment>
</unit>
<unit id="Ffr5xYM" name="settings.behavior.part_info">
<segment state="translated">
<source>settings.behavior.part_info</source>
@ -15432,6 +15474,12 @@ Please note, that you can not impersonate a disabled user. If you try you will g
<target>Description</target>
</segment>
</unit>
<unit id="ahzol5T" name="assembly.table.referencedAssemblies">
<segment state="translated">
<source>assembly.table.referencedAssemblies</source>
<target>Referenced assemblies</target>
</segment>
</unit>
<unit id="igaT4kQ" name="assembly.table.addedDate">
<segment state="translated">
<source>assembly.table.addedDate</source>
@ -15462,6 +15510,36 @@ Please note, that you can not impersonate a disabled user. If you try you will g
<target>Invalid regular expression (regex)</target>
</segment>
</unit>
<unit id="8uh6vTx" name="assembly.bom.table.id">
<segment state="translated">
<source>assembly.bom.table.id</source>
<target>ID</target>
</segment>
</unit>
<unit id="ijncxl3" name="assembly.bom.table.name">
<segment state="translated">
<source>assembly.bom.table.name</source>
<target>Name</target>
</segment>
</unit>
<unit id="Pe5Bkw1" name="assembly.bom.table.quantity">
<segment state="translated">
<source>assembly.bom.table.quantity</source>
<target>Quantity</target>
</segment>
</unit>
<unit id="7hdpoc2" name="assembly.bom.table.ipn">
<segment state="translated">
<source>assembly.bom.table.ipn</source>
<target>IPN</target>
</segment>
</unit>
<unit id="1nbwdk5" name="assembly.bom.table.description">
<segment state="translated">
<source>assembly.bom.table.description</source>
<target>Description</target>
</segment>
</unit>
<unit id="a7uOieC" name="datasource.synonym">
<segment state="translated">
<source>datasource.synonym</source>

View file

@ -13101,6 +13101,12 @@ Por favor ten en cuenta que no puedes personificar a un usuario deshabilitado. S
<target>CSV (KiCAD Pcbnew BOM)</target>
</segment>
</unit>
<unit id="oiuejI1" name="assembly.bom_import.type.kicad_schematic">
<segment state="translated">
<source>assembly.bom_import.type.kicad_schematic</source>
<target>KiCAD Editor Esquemático BOM (archivo CSV)</target>
</segment>
</unit>
<unit id="0IekETE" name="assembly.bom_import.clear_existing_bom">
<segment state="translated">
<source>assembly.bom_import.clear_existing_bom</source>
@ -13610,6 +13616,12 @@ Por favor ten en cuenta que no puedes personificar a un usuario deshabilitado. S
<target>Descripción</target>
</segment>
</unit>
<unit id="ahzol5T" name="assembly.table.referencedAssemblies">
<segment state="translated">
<source>assembly.table.referencedAssemblies</source>
<target>Ensambles referenciados</target>
</segment>
</unit>
<unit id="igaT4kQ" name="assembly.table.addedDate">
<segment state="translated">
<source>assembly.table.addedDate</source>
@ -13640,6 +13652,36 @@ Por favor ten en cuenta que no puedes personificar a un usuario deshabilitado. S
<target>Expresión regular no válida (regex)</target>
</segment>
</unit>
<unit id="8uh6vTx" name="assembly.bom.table.id">
<segment state="translated">
<source>assembly.bom.table.id</source>
<target>ID</target>
</segment>
</unit>
<unit id="ijncxl3" name="assembly.bom.table.name">
<segment state="translated">
<source>assembly.bom.table.name</source>
<target>Nombre</target>
</segment>
</unit>
<unit id="Pe5Bkw1" name="assembly.bom.table.quantity">
<segment state="translated">
<source>assembly.bom.table.quantity</source>
<target>Cantidad</target>
</segment>
</unit>
<unit id="7hdpoc2" name="assembly.bom.table.ipn">
<segment state="translated">
<source>assembly.bom.table.ipn</source>
<target>IPN</target>
</segment>
</unit>
<unit id="1nbwdk5" name="assembly.bom.table.description">
<segment state="translated">
<source>assembly.bom.table.description</source>
<target>Descripción</target>
</segment>
</unit>
<unit id="a7uOieC" name="datasource.synonym">
<segment state="translated">
<source>datasource.synonym</source>

View file

@ -9535,6 +9535,12 @@ exemple de ville</target>
<target>CSV (KiCAD Pcbnew BOM)</target>
</segment>
</unit>
<unit id="oiuejI1" name="assembly.bom_import.type.kicad_schematic">
<segment state="translated">
<source>assembly.bom_import.type.kicad_schematic</source>
<target>KiCAD Éditeur Schématique BOM (fichier CSV)</target>
</segment>
</unit>
<unit id="0IekETE" name="assembly.bom_import.clear_existing_bom">
<segment state="translated">
<source>assembly.bom_import.clear_existing_bom</source>
@ -10020,6 +10026,12 @@ exemple de ville</target>
<target>Description</target>
</segment>
</unit>
<unit id="ahzol5T" name="assembly.table.referencedAssemblies">
<segment state="translated">
<source>assembly.table.referencedAssemblies</source>
<target>Ensembles référencés</target>
</segment>
</unit>
<unit id="igaT4kQ" name="assembly.table.addedDate">
<segment state="translated">
<source>assembly.table.addedDate</source>
@ -10050,6 +10062,36 @@ exemple de ville</target>
<target>Expression régulière invalide (regex)</target>
</segment>
</unit>
<unit id="8uh6vTx" name="assembly.bom.table.id">
<segment state="translated">
<source>assembly.bom.table.id</source>
<target>ID</target>
</segment>
</unit>
<unit id="ijncxl3" name="assembly.bom.table.name">
<segment state="translated">
<source>assembly.bom.table.name</source>
<target>Nom</target>
</segment>
</unit>
<unit id="Pe5Bkw1" name="assembly.bom.table.quantity">
<segment state="translated">
<source>assembly.bom.table.quantity</source>
<target>Quantité</target>
</segment>
</unit>
<unit id="7hdpoc2" name="assembly.bom.table.ipn">
<segment state="translated">
<source>assembly.bom.table.ipn</source>
<target>IPN</target>
</segment>
</unit>
<unit id="1nbwdk5" name="assembly.bom.table.description">
<segment state="translated">
<source>assembly.bom.table.description</source>
<target>Description</target>
</segment>
</unit>
<unit id="a7uOieC" name="datasource.synonym">
<segment state="translated">
<source>datasource.synonym</source>

View file

@ -13103,6 +13103,12 @@ Notare che non è possibile impersonare un utente disattivato. Quando si prova a
<target>CSV (KiCAD Pcbnew)</target>
</segment>
</unit>
<unit id="oiuejI1" name="assembly.bom_import.type.kicad_schematic">
<segment state="translated">
<source>assembly.bom_import.type.kicad_schematic</source>
<target>KiCAD Editor Schematico BOM (file CSV)</target>
</segment>
</unit>
<unit id="0IekETE" name="assembly.bom_import.clear_existing_bom">
<segment state="translated">
<source>assembly.bom_import.clear_existing_bom</source>
@ -13612,6 +13618,12 @@ Notare che non è possibile impersonare un utente disattivato. Quando si prova a
<target>Descrizione</target>
</segment>
</unit>
<unit id="ahzol5T" name="assembly.table.referencedAssemblies">
<segment state="translated">
<source>assembly.table.referencedAssemblies</source>
<target>Assiemi referenziati</target>
</segment>
</unit>
<unit id="igaT4kQ" name="assembly.table.addedDate">
<segment state="translated">
<source>assembly.table.addedDate</source>
@ -13642,6 +13654,36 @@ Notare che non è possibile impersonare un utente disattivato. Quando si prova a
<target>Espressione regolare non valida (regex)</target>
</segment>
</unit>
<unit id="8uh6vTx" name="assembly.bom.table.id">
<segment state="translated">
<source>assembly.bom.table.id</source>
<target>ID</target>
</segment>
</unit>
<unit id="ijncxl3" name="assembly.bom.table.name">
<segment state="translated">
<source>assembly.bom.table.name</source>
<target>Nome</target>
</segment>
</unit>
<unit id="Pe5Bkw1" name="assembly.bom.table.quantity">
<segment state="translated">
<source>assembly.bom.table.quantity</source>
<target>Quantità</target>
</segment>
</unit>
<unit id="7hdpoc2" name="assembly.bom.table.ipn">
<segment state="translated">
<source>assembly.bom.table.ipn</source>
<target>IPN</target>
</segment>
</unit>
<unit id="1nbwdk5" name="assembly.bom.table.description">
<segment state="translated">
<source>assembly.bom.table.description</source>
<target>Descrizione</target>
</segment>
</unit>
<unit id="a7uOieC" name="datasource.synonym">
<segment state="translated">
<source>datasource.synonym</source>

View file

@ -9248,6 +9248,12 @@ Exampletown</target>
<target>CSV (KiCAD Pcbnew)</target>
</segment>
</unit>
<unit id="oiuejI1" name="assembly.bom_import.type.kicad_schematic">
<segment state="translated">
<source>assembly.bom_import.type.kicad_schematic</source>
<target>KiCAD 回路図エディタ BOM (CSV ファイル)</target>
</segment>
</unit>
<unit id="0IekETE" name="assembly.bom_import.clear_existing_bom">
<segment state="translated">
<source>assembly.bom_import.clear_existing_bom</source>
@ -9733,6 +9739,12 @@ Exampletown</target>
<target>説明</target>
</segment>
</unit>
<unit id="ahzol5T" name="assembly.table.referencedAssemblies">
<segment state="translated">
<source>assembly.table.referencedAssemblies</source>
<target>参照されているアセンブリ</target>
</segment>
</unit>
<unit id="igaT4kQ" name="assembly.table.addedDate">
<segment state="translated">
<source>assembly.table.addedDate</source>
@ -9763,6 +9775,36 @@ Exampletown</target>
<target>無効な正規表現regex</target>
</segment>
</unit>
<unit id="8uh6vTx" name="assembly.bom.table.id">
<segment state="translated">
<source>assembly.bom.table.id</source>
<target>ID</target>
</segment>
</unit>
<unit id="ijncxl3" name="assembly.bom.table.name">
<segment state="translated">
<source>assembly.bom.table.name</source>
<target>名前</target>
</segment>
</unit>
<unit id="Pe5Bkw1" name="assembly.bom.table.quantity">
<segment state="translated">
<source>assembly.bom.table.quantity</source>
<target>数量</target>
</segment>
</unit>
<unit id="7hdpoc2" name="assembly.bom.table.ipn">
<segment state="translated">
<source>assembly.bom.table.ipn</source>
<target>IPN</target>
</segment>
</unit>
<unit id="1nbwdk5" name="assembly.bom.table.description">
<segment state="translated">
<source>assembly.bom.table.description</source>
<target>説明</target>
</segment>
</unit>
<unit id="a7uOieC" name="datasource.synonym">
<segment state="translated">
<source>datasource.synonym</source>

View file

@ -1186,6 +1186,12 @@
<target>CSV (KiCAD Pcbnew)</target>
</segment>
</unit>
<unit id="oiuejI1" name="assembly.bom_import.type.kicad_schematic">
<segment state="translated">
<source>assembly.bom_import.type.kicad_schematic</source>
<target>KiCAD Schematische editor BOM (CSV-bestand)</target>
</segment>
</unit>
<unit id="0IekETE" name="assembly.bom_import.clear_existing_bom">
<segment state="translated">
<source>assembly.bom_import.clear_existing_bom</source>
@ -1671,6 +1677,12 @@
<target>Beschrijving</target>
</segment>
</unit>
<unit id="ahzol5T" name="assembly.table.referencedAssemblies">
<segment state="translated">
<source>assembly.table.referencedAssemblies</source>
<target>Gerefereerde assemblages</target>
</segment>
</unit>
<unit id="igaT4kQ" name="assembly.table.addedDate">
<segment state="translated">
<source>assembly.table.addedDate</source>
@ -1701,6 +1713,36 @@
<target>Ongeldige reguliere expressie (regex)</target>
</segment>
</unit>
<unit id="8uh6vTx" name="assembly.bom.table.id">
<segment state="translated">
<source>assembly.bom.table.id</source>
<target>ID</target>
</segment>
</unit>
<unit id="ijncxl3" name="assembly.bom.table.name">
<segment state="translated">
<source>assembly.bom.table.name</source>
<target>Naam</target>
</segment>
</unit>
<unit id="Pe5Bkw1" name="assembly.bom.table.quantity">
<segment state="translated">
<source>assembly.bom.table.quantity</source>
<target>Hoeveelheid</target>
</segment>
</unit>
<unit id="7hdpoc2" name="assembly.bom.table.ipn">
<segment state="translated">
<source>assembly.bom.table.ipn</source>
<target>IPN</target>
</segment>
</unit>
<unit id="1nbwdk5" name="assembly.bom.table.description">
<segment state="translated">
<source>assembly.bom.table.description</source>
<target>Beschrijving</target>
</segment>
</unit>
<unit id="a7uOieC" name="datasource.synonym">
<segment state="translated">
<source>datasource.synonym</source>

View file

@ -12980,6 +12980,12 @@ Należy pamiętać, że nie możesz udawać nieaktywnych użytkowników. Jeśli
<target>CSV (KiCAD Pcbnew)</target>
</segment>
</unit>
<unit id="oiuejI1" name="assembly.bom_import.type.kicad_schematic">
<segment state="translated">
<source>assembly.bom_import.type.kicad_schematic</source>
<target>KiCAD Schematyczny edytor BOM (plik CSV)</target>
</segment>
</unit>
<unit id="0IekETE" name="assembly.bom_import.clear_existing_bom">
<segment state="translated">
<source>assembly.bom_import.clear_existing_bom</source>
@ -13465,6 +13471,12 @@ Należy pamiętać, że nie możesz udawać nieaktywnych użytkowników. Jeśli
<target>Opis</target>
</segment>
</unit>
<unit id="ahzol5T" name="assembly.table.referencedAssemblies">
<segment state="translated">
<source>assembly.table.referencedAssemblies</source>
<target>Zestawy referencyjne</target>
</segment>
</unit>
<unit id="igaT4kQ" name="assembly.table.addedDate">
<segment state="translated">
<source>assembly.table.addedDate</source>
@ -13495,6 +13507,36 @@ Należy pamiętać, że nie możesz udawać nieaktywnych użytkowników. Jeśli
<target>Nieprawidłowe wyrażenie regularne (regex)</target>
</segment>
</unit>
<unit id="8uh6vTx" name="assembly.bom.table.id">
<segment state="translated">
<source>assembly.bom.table.id</source>
<target>ID</target>
</segment>
</unit>
<unit id="ijncxl3" name="assembly.bom.table.name">
<segment state="translated">
<source>assembly.bom.table.name</source>
<target>Nazwa</target>
</segment>
</unit>
<unit id="Pe5Bkw1" name="assembly.bom.table.quantity">
<segment state="translated">
<source>assembly.bom.table.quantity</source>
<target>Ilość</target>
</segment>
</unit>
<unit id="7hdpoc2" name="assembly.bom.table.ipn">
<segment state="translated">
<source>assembly.bom.table.ipn</source>
<target>IPN</target>
</segment>
</unit>
<unit id="1nbwdk5" name="assembly.bom.table.description">
<segment state="translated">
<source>assembly.bom.table.description</source>
<target>Opis</target>
</segment>
</unit>
<unit id="a7uOieC" name="datasource.synonym">
<segment state="translated">
<source>datasource.synonym</source>

View file

@ -737,7 +737,7 @@
</notes>
<segment state="translated">
<source>user.edit.tfa.disable_tfa_message</source>
<target>Это выключит &lt;b&gt;все активные двухфакторной способы аутентификации пользователя&lt;/b&gt;и удалит &lt;b&gt;резервные коды&lt;/b&gt;!
<target>Это выключит &lt;b&gt;все активные двухфакторной способы аутентификации пользователя&lt;/b&gt;и удалит &lt;b&gt;резервные коды&lt;/b&gt;!
&lt;br&gt;
Пользователь должен будет снова настроить все методы двухфакторной аутентификации и распечатать новые резервные коды! &lt;br&gt;&lt;br&gt;
&lt;b&gt;Делайте это только в том случае, если вы абсолютно уверены в личности пользователя (обращающегося за помощью), в противном случае учетная запись может быть взломана злоумышленником!&lt;/b&gt;</target>
@ -3746,7 +3746,7 @@
</notes>
<segment state="translated">
<source>tfa_backup.reset_codes.confirm_message</source>
<target>Это удалит все предыдущие коды и создаст набор новых. Это не может быть отменено.
<target>Это удалит все предыдущие коды и создаст набор новых. Это не может быть отменено.
Не забудьте распечатать новы кода и хранить их в безопасном месте!</target>
</segment>
</unit>
@ -13080,6 +13080,12 @@
<target>CSV (KiCAD Pcbnew)</target>
</segment>
</unit>
<unit id="oiuejI1" name="assembly.bom_import.type.kicad_schematic">
<segment state="translated">
<source>assembly.bom_import.type.kicad_schematic</source>
<target>KiCAD Схематический редактор BOM (CSV файл)</target>
</segment>
</unit>
<unit id="0IekETE" name="assembly.bom_import.clear_existing_bom">
<segment state="translated">
<source>assembly.bom_import.clear_existing_bom</source>
@ -13565,6 +13571,12 @@
<target>Описание</target>
</segment>
</unit>
<unit id="ahzol5T" name="assembly.table.referencedAssemblies">
<segment state="translated">
<source>assembly.table.referencedAssemblies</source>
<target>Ссылочные сборки</target>
</segment>
</unit>
<unit id="igaT4kQ" name="assembly.table.addedDate">
<segment state="translated">
<source>assembly.table.addedDate</source>
@ -13595,6 +13607,36 @@
<target>Неверное регулярное выражение (regex)</target>
</segment>
</unit>
<unit id="8uh6vTx" name="assembly.bom.table.id">
<segment state="translated">
<source>assembly.bom.table.id</source>
<target>ID</target>
</segment>
</unit>
<unit id="ijncxl3" name="assembly.bom.table.name">
<segment state="translated">
<source>assembly.bom.table.name</source>
<target>Название</target>
</segment>
</unit>
<unit id="Pe5Bkw1" name="assembly.bom.table.quantity">
<segment state="translated">
<source>assembly.bom.table.quantity</source>
<target>Количество</target>
</segment>
</unit>
<unit id="7hdpoc2" name="assembly.bom.table.ipn">
<segment state="translated">
<source>assembly.bom.table.ipn</source>
<target>IPN</target>
</segment>
</unit>
<unit id="1nbwdk5" name="assembly.bom.table.description">
<segment state="translated">
<source>assembly.bom.table.description</source>
<target>Описание</target>
</segment>
</unit>
<unit id="a7uOieC" name="datasource.synonym">
<segment state="translated">
<source>datasource.synonym</source>

View file

@ -12965,6 +12965,12 @@ Element 3</target>
<target>CSV 文件KiCAD Pcbnew</target>
</segment>
</unit>
<unit id="oiuejI1" name="assembly.bom_import.type.kicad_schematic">
<segment state="translated">
<source>assembly.bom_import.type.kicad_schematic</source>
<target>KiCAD 原理图编辑器 BOMCSV 文件)</target>
</segment>
</unit>
<unit id="0IekETE" name="assembly.bom_import.clear_existing_bom">
<segment state="translated">
<source>assembly.bom_import.clear_existing_bom</source>
@ -13450,6 +13456,12 @@ Element 3</target>
<target>描述</target>
</segment>
</unit>
<unit id="ahzol5T" name="assembly.table.referencedAssemblies">
<segment state="translated">
<source>assembly.table.referencedAssemblies</source>
<target>引用的组件</target>
</segment>
</unit>
<unit id="igaT4kQ" name="assembly.table.addedDate">
<segment state="translated">
<source>assembly.table.addedDate</source>
@ -13480,6 +13492,36 @@ Element 3</target>
<target>无效的正则表达式regex</target>
</segment>
</unit>
<unit id="8uh6vTx" name="assembly.bom.table.id">
<segment state="translated">
<source>assembly.bom.table.id</source>
<target>ID</target>
</segment>
</unit>
<unit id="ijncxl3" name="assembly.bom.table.name">
<segment state="translated">
<source>assembly.bom.table.name</source>
<target>名称</target>
</segment>
</unit>
<unit id="Pe5Bkw1" name="assembly.bom.table.quantity">
<segment state="translated">
<source>assembly.bom.table.quantity</source>
<target>数量</target>
</segment>
</unit>
<unit id="7hdpoc2" name="assembly.bom.table.ipn">
<segment state="translated">
<source>assembly.bom.table.ipn</source>
<target>IPN</target>
</segment>
</unit>
<unit id="1nbwdk5" name="assembly.bom.table.description">
<segment state="translated">
<source>assembly.bom.table.description</source>
<target>描述</target>
</segment>
</unit>
<unit id="a7uOieC" name="datasource.synonym">
<segment state="translated">
<source>datasource.synonym</source>

View file

@ -251,12 +251,6 @@
<target>Musíte vybrat díl pro položku BOM dílu nebo nastavit název pro položku BOM bez dílu.</target>
</segment>
</unit>
<unit id="Q42Zh.e" name="validator.project.bom_entry.only_part_or_assembly_allowed">
<segment state="translated">
<source>validator.project.bom_entry.only_part_or_assembly_allowed</source>
<target>Je povoleno vybrat pouze jednu součástku nebo sestavu. Upravit prosím svůj výběr!</target>
</segment>
</unit>
<unit id="WF_v4ih" name="project.bom_entry.name_already_in_bom">
<segment state="translated">
<source>project.bom_entry.name_already_in_bom</source>